diff --git a/src/debugger/gui/DataGridWidget.cxx b/src/debugger/gui/DataGridWidget.cxx index 719eebef2..ad918f65f 100644 --- a/src/debugger/gui/DataGridWidget.cxx +++ b/src/debugger/gui/DataGridWidget.cxx @@ -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; diff --git a/src/gui/EditableWidget.cxx b/src/gui/EditableWidget.cxx index 77bcd58a8..edfa99f44 100644 --- a/src/gui/EditableWidget.cxx +++ b/src/gui/EditableWidget.cxx @@ -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) { diff --git a/src/gui/EditableWidget.hxx b/src/gui/EditableWidget.hxx index 748f6074f..f2e4595fb 100644 --- a/src/gui/EditableWidget.hxx +++ b/src/gui/EditableWidget.hxx @@ -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: