diff --git a/src/gui/EditableWidget.cxx b/src/gui/EditableWidget.cxx index b6120c8ac..706e6e243 100644 --- a/src/gui/EditableWidget.cxx +++ b/src/gui/EditableWidget.cxx @@ -257,6 +257,7 @@ bool EditableWidget::handleShiftKeys(StellaKey key) // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool EditableWidget::handleNormalKeys(StellaKey key) { + bool selectMode = false; bool handled = true; switch(key) @@ -264,7 +265,7 @@ bool EditableWidget::handleNormalKeys(StellaKey key) case KBDK_LSHIFT: case KBDK_RSHIFT: // stay in select mode - handled = false; + selectMode = _selectSize; break; case KBDK_RETURN: @@ -291,12 +292,16 @@ bool EditableWidget::handleNormalKeys(StellaKey key) break; case KBDK_LEFT: - if(_caretPos > 0) + if (_selectSize) + handled = setCaretPos(selectStartPos()); + else if(_caretPos > 0) handled = setCaretPos(_caretPos - 1); break; case KBDK_RIGHT: - if(_caretPos < int(_editString.size())) + if(_selectSize) + handled = setCaretPos(selectEndPos()); + else if(_caretPos < int(_editString.size())) handled = setCaretPos(_caretPos + 1); break; @@ -309,14 +314,14 @@ bool EditableWidget::handleNormalKeys(StellaKey key) break; default: + killSelectedText(); handled = false; } if(handled) - { setDirty(); + if(!selectMode) _selectSize = 0; - } return handled; } @@ -370,7 +375,7 @@ void EditableWidget::drawSelection() int w = editRect.w(); int h = editRect.h(); int wt = int(text.length()) * _font.getMaxCharWidth() + 1; - int dx = selectPos() * _font.getMaxCharWidth() - _editScrollOffset; + int dx = selectStartPos() * _font.getMaxCharWidth() - _editScrollOffset; if(dx < 0) { @@ -611,7 +616,7 @@ const string EditableWidget::selectString() const } // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -int EditableWidget::selectPos() +int EditableWidget::selectStartPos() { if(_selectSize < 0) return _caretPos + _selectSize; @@ -619,6 +624,16 @@ int EditableWidget::selectPos() return _caretPos; } +// - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +int EditableWidget::selectEndPos() +{ + if(_selectSize > 0) + return _caretPos + _selectSize; + else + return _caretPos; +} + + // - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - bool EditableWidget::killSelectedText() { diff --git a/src/gui/EditableWidget.hxx b/src/gui/EditableWidget.hxx index 9dd047327..46cfb1855 100644 --- a/src/gui/EditableWidget.hxx +++ b/src/gui/EditableWidget.hxx @@ -96,7 +96,8 @@ class EditableWidget : public Widget, public CommandSender bool moveWord(int direction, bool select); bool killSelectedText(); - int selectPos(); + int selectStartPos(); + int selectEndPos(); // Clipboard void cutSelectedText(); void copySelectedText();