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;
// 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
_hiliteList.clear();
int size = _rows * _cols;

View File

@ -112,8 +112,19 @@ bool EditableWidget::handleKeyDown(StellaKey key, StellaMod mod)
if(StellaModTest::isAlt(mod))
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 dirty = false;
switch(key)
{
@ -122,79 +133,146 @@ bool EditableWidget::handleKeyDown(StellaKey key, StellaMod mod)
// confirm edit and exit editmode
endEditMode();
sendCommand(EditableWidget::kAcceptCmd, 0, _id);
dirty = true;
break;
case KBDK_ESCAPE:
abortEditMode();
sendCommand(EditableWidget::kCancelCmd, 0, _id);
dirty = true;
break;
case KBDK_BACKSPACE:
dirty = killChar(-1);
if(dirty) sendCommand(EditableWidget::kChangedCmd, key, _id);
handled = killChar(-1);
if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_DELETE:
case KBDK_KP_PERIOD:
if(StellaModTest::isShift(mod))
{
cutSelectedText();
dirty = true;
}
else
dirty = killChar(+1);
if(dirty) sendCommand(EditableWidget::kChangedCmd, key, _id);
handled = killChar(+1);
if(handled) sendCommand(EditableWidget::kChangedCmd, key, _id);
break;
case KBDK_LEFT:
if(StellaModTest::isControl(mod))
dirty = specialKeys(key);
else if(_caretPos > 0)
dirty = setCaretPos(_caretPos - 1);
if(_caretPos > 0)
handled = setCaretPos(_caretPos - 1);
break;
case KBDK_RIGHT:
if(StellaModTest::isControl(mod))
dirty = specialKeys(key);
else if(_caretPos < int(_editString.size()))
dirty = setCaretPos(_caretPos + 1);
if(_caretPos < int(_editString.size()))
handled = setCaretPos(_caretPos + 1);
break;
case KBDK_HOME:
dirty = setCaretPos(0);
handled = setCaretPos(0);
break;
case KBDK_END:
dirty = 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;
handled = setCaretPos(int(_editString.size()));
break;
default:
if (StellaModTest::isControl(mod))
{
dirty = specialKeys(key);
}
else
handled = false;
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();
return handled;
@ -278,70 +356,6 @@ bool EditableWidget::adjustOffset()
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)
{

View File

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