mirror of https://github.com/stella-emu/stella.git
Some refactoring of EditableWidget
This commit is contained in:
parent
270d29000e
commit
e8464fb0bf
|
@ -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;
|
||||||
|
|
|
@ -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)
|
||||||
{
|
{
|
||||||
|
|
|
@ -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:
|
||||||
|
|
Loading…
Reference in New Issue