@startuml
skinparam backgroundColor #FFFFFF60
' https://www.plantuml.com/plantuml/uml/

hide empty members
left to right direction

class MenuItem {
    #const char* text
    +const char* getText()
    +void setText(const char* text)
    #virtual bool process(LcdMenu* menu, const unsigned char command)
    #const void draw(DisplayInterface* display)
    #virtual void draw(DisplayInterface* display, uint8_t row)
}

class ItemBack {
    #bool process(LcdMenu* menu, const unsigned char command) override
    ..
    #void changeScreen(LcdMenu* menu)
}

class ItemSubMenu {
    #bool process(LcdMenu* menu, const unsigned char command) override
    ..
    #void changeScreen(LcdMenu* menu)
}

class ItemToggle {
    #bool process(LcdMenu* menu, const unsigned char command) override
    ..
    #void toggle(DisplayInterface* display)
}

class ItemCommand {
    #bool process(LcdMenu* menu, const unsigned char command) override
    ..
    #void executeCommand()
}

class ItemInput {
    #bool process(LcdMenu* menu, const unsigned char command) override
    ..
    #void up(DisplayInterface* display)
    #void down(DisplayInterface* display)
    #void enter(DisplayInterface* display)
    #void back(DisplayInterface* display)
    #void left(DisplayInterface* display)
    #void right(DisplayInterface* display)
    #void backspace(DisplayInterface* display)
    #void typeChar(DisplayInterface* display, const unsigned char command)
    #void clear(DisplayInterface* display)
}

class ItemInputCharset {
    #bool process(LcdMenu* menu, const unsigned char command) override
    ..
    #void initCharEdit()
    #void abortCharEdit(DisplayInterface* display)
    #void commitCharEdit(DisplayInterface* display)
    #void showNextChar(DisplayInterface* display)
    #void showPreviousChar(DisplayInterface* display)
}

class ItemList {
    #bool process(LcdMenu* menu, const unsigned char command) override
    ..
    #void selectPrevious(DisplayInterface* display)
    #void selectNext(DisplayInterface* display)
}

class ItemProgress {
    #bool process(LcdMenu* menu, const unsigned char command) override
    ..
    +void increment()
    +void decrement()
}

class EditMode as "???" {
}

note bottom of EditMode : Someone who holds edit mode

ItemBack -u-|> MenuItem
ItemSubMenu -u-|> MenuItem
ItemToggle -u-|> MenuItem
ItemCommand -u-|> MenuItem
EditMode -u-|> MenuItem
ItemList -u-|> EditMode
ItemProgress -u-|> EditMode
ItemInput -u-|> EditMode
ItemInputCharset -u-|> ItemInput

@enduml
