Some refactoring of EditableWidget

This commit is contained in:
thrust26 2020-11-03 16:52:01 +01:00
parent 270d29000e
commit e8464fb0bf
3 changed files with 127 additions and 120 deletions

View File

@ -46,10 +46,6 @@ DataGridWidget::DataGridWidget(GuiObject* boss, const GUI::Font& font,
{ {
_flags = Widget::FLAG_ENABLED | Widget::FLAG_RETAIN_FOCUS | Widget::FLAG_WANTS_RAWDATA; _flags = Widget::FLAG_ENABLED | Widget::FLAG_RETAIN_FOCUS | Widget::FLAG_WANTS_RAWDATA;
// The item is selected, thus _bgcolor is used to draw the caret and
// _textcolorhi to erase it
_caretInverse = true;
// Make sure all lists contain some default values // Make sure all lists contain some default values
_hiliteList.clear(); _hiliteList.clear();
int size = _rows * _cols; int size = _rows * _cols;

View File

@ -112,8 +112,19 @@ bool EditableWidget::handleKeyDown(StellaKey key, StellaMod mod)
if(StellaModTest::isAlt(mod)) if(StellaModTest::isAlt(mod))
return true; return true;
if(StellaModTest::isShift(mod) && handleShiftKeys(key))
return true;
if(StellaModTest::isControl(mod) && handleControlKeys(key))
return true;
return handleNormalKeys(key);
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool EditableWidget::handleNormalKeys(StellaKey key)
{
bool handled = true; bool handled = true;
bool dirty = false;
switch(key) switch(key)
{ {
@ -122,79 +133,146 @@ bool EditableWidget::handleKeyDown(StellaKey key, StellaMod mod)
// confirm edit and exit editmode // confirm edit and exit editmode
endEditMode(); endEditMode();
sendCommand(EditableWidget::kAcceptCmd, 0, _id); sendCommand(EditableWidget::kAcceptCmd, 0, _id);
dirty = true;
break; break;
case KBDK_ESCAPE: case KBDK_ESCAPE:
abortEditMode(); abortEditMode();
sendCommand(EditableWidget::kCancelCmd, 0, _id); sendCommand(EditableWidget::kCancelCmd, 0, _id);
dirty = true;
break; break;
case KBDK_BACKSPACE: case KBDK_BACKSPACE:
dirty = killChar(-1); handled = killChar(-1);
if(dirty) sendCommand(EditableWidget::kChangedCmd, key, _id); if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
break; break;
case KBDK_DELETE: case KBDK_DELETE:
case KBDK_KP_PERIOD: case KBDK_KP_PERIOD:
if(StellaModTest::isShift(mod)) handled = killChar(+1);
{ if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
cutSelectedText();
dirty = true;
}
else
dirty = killChar(+1);
if(dirty) sendCommand(EditableWidget::kChangedCmd, key, _id);
break; break;
case KBDK_LEFT: case KBDK_LEFT:
if(StellaModTest::isControl(mod)) if(_caretPos > 0)
dirty = specialKeys(key); handled = setCaretPos(_caretPos - 1);
else if(_caretPos > 0)
dirty = setCaretPos(_caretPos - 1);
break; break;
case KBDK_RIGHT: case KBDK_RIGHT:
if(StellaModTest::isControl(mod)) if(_caretPos < int(_editString.size()))
dirty = specialKeys(key); handled = setCaretPos(_caretPos + 1);
else if(_caretPos < int(_editString.size()))
dirty = setCaretPos(_caretPos + 1);
break; break;
case KBDK_HOME: case KBDK_HOME:
dirty = setCaretPos(0); handled = setCaretPos(0);
break; break;
case KBDK_END: case KBDK_END:
dirty = setCaretPos(int(_editString.size())); handled = setCaretPos(int(_editString.size()));
break;
case KBDK_INSERT:
if(StellaModTest::isControl(mod))
{
copySelectedText();
dirty = true;
}
else if(StellaModTest::isShift(mod))
{
pasteSelectedText();
dirty = true;
}
else
handled = false;
break; break;
default: default:
if (StellaModTest::isControl(mod)) handled = false;
{
dirty = specialKeys(key);
}
else
handled = false;
} }
if (dirty) if(handled)
setDirty();
return handled;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool EditableWidget::handleShiftKeys(StellaKey key)
{
bool handled = true;
switch(key)
{
case KBDK_DELETE:
case KBDK_KP_PERIOD:
cutSelectedText();
sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_INSERT:
pasteSelectedText();
sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
default:
handled = false;
}
if(handled)
setDirty();
return handled;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool EditableWidget::handleControlKeys(StellaKey key)
{
bool handled = true;
switch(key)
{
case KBDK_A:
setCaretPos(0);
break;
case KBDK_C:
copySelectedText();
break;
case KBDK_E:
setCaretPos(int(_editString.size()));
break;
case KBDK_D:
handled = killChar(+1);
if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_K:
handled = killLine(+1);
if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_U:
handled = killLine(-1);
if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_V:
pasteSelectedText();
sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_W:
handled = killLastWord();
if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_X:
cutSelectedText();
sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_LEFT:
handled = moveWord(-1);
break;
case KBDK_RIGHT:
handled = moveWord(+1);
break;
case KBDK_INSERT:
copySelectedText();
break;
default:
handled = false;
}
if(handled)
setDirty(); setDirty();
return handled; return handled;
@ -278,70 +356,6 @@ bool EditableWidget::adjustOffset()
return true; return true;
} }
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool EditableWidget::specialKeys(StellaKey key)
{
bool handled = true;
switch(key)
{
case KBDK_A:
setCaretPos(0);
break;
case KBDK_C:
copySelectedText();
break;
case KBDK_E:
setCaretPos(int(_editString.size()));
break;
case KBDK_D:
handled = killChar(+1);
if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_K:
handled = killLine(+1);
if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_U:
handled = killLine(-1);
if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_V:
pasteSelectedText();
sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_W:
handled = killLastWord();
if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_X:
cutSelectedText();
sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_LEFT:
handled = moveWord(-1);
break;
case KBDK_RIGHT:
handled = moveWord(+1);
break;
default:
handled = false;
}
return handled;
}
// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
bool EditableWidget::killChar(int direction) bool EditableWidget::killChar(int direction)
{ {

View File

@ -80,7 +80,9 @@ class EditableWidget : public Widget, public CommandSender
private: private:
// Line editing // Line editing
bool specialKeys(StellaKey key); bool handleControlKeys(StellaKey key);
bool handleShiftKeys(StellaKey key);
bool handleNormalKeys(StellaKey key);
bool killChar(int direction); bool killChar(int direction);
bool killLine(int direction); bool killLine(int direction);
bool killLastWord(); bool killLastWord();
@ -98,14 +100,9 @@ class EditableWidget : public Widget, public CommandSender
private: private:
bool _editable{true}; bool _editable{true};
string _editString; string _editString;
int _caretPos{0};
// bool _caretVisible{false};
// int _caretTime{0};
int _caretPos{0};
protected: protected:
bool _caretInverse{false};
int _editScrollOffset{0}; int _editScrollOffset{0};
private: private: