From 495c3f52faa6891f409c62e62c4fc6ea9aa82c41 Mon Sep 17 00:00:00 2001 From: hjk <qtc-committer@nokia.com> Date: Wed, 11 Aug 2010 13:41:54 +0200 Subject: [PATCH] fakevim: improve selection interaction with main text editor --- src/plugins/fakevim/fakevimactions.cpp | 7 ++++ src/plugins/fakevim/fakevimactions.h | 2 + src/plugins/fakevim/fakevimhandler.cpp | 53 ++++++++++++++++++++++---- src/plugins/fakevim/fakevimoptions.ui | 10 +++++ src/plugins/fakevim/fakevimplugin.cpp | 2 + 5 files changed, 67 insertions(+), 7 deletions(-) diff --git a/src/plugins/fakevim/fakevimactions.cpp b/src/plugins/fakevim/fakevimactions.cpp index a17fbe146c1..49db4d3b016 100644 --- a/src/plugins/fakevim/fakevimactions.cpp +++ b/src/plugins/fakevim/fakevimactions.cpp @@ -132,6 +132,13 @@ FakeVimSettings *theFakeVimSettings() item->setValue(false); instance->insertItem(ConfigReadVimRc, item); + item = new SavedAction(instance); + item->setValue(true); + item->setDefaultValue(true); + item->setSettingsKey(group, _("ExportSelection")); + item->setCheckable(true); + instance->insertItem(ConfigExportSelection, item); + item = new SavedAction(instance); item->setValue(true); item->setDefaultValue(true); diff --git a/src/plugins/fakevim/fakevimactions.h b/src/plugins/fakevim/fakevimactions.h index 5929376bc68..19284391ac5 100644 --- a/src/plugins/fakevim/fakevimactions.h +++ b/src/plugins/fakevim/fakevimactions.h @@ -43,6 +43,8 @@ enum FakeVimSettingsCode { ConfigUseFakeVim, ConfigReadVimRc, + ConfigExportSelection, + ConfigStartOfLine, ConfigHlSearch, ConfigTabStop, diff --git a/src/plugins/fakevim/fakevimhandler.cpp b/src/plugins/fakevim/fakevimhandler.cpp index ab8a1a23a93..f84cacd5351 100644 --- a/src/plugins/fakevim/fakevimhandler.cpp +++ b/src/plugins/fakevim/fakevimhandler.cpp @@ -733,6 +733,7 @@ public: void selectQuotedStringTextObject(bool inner, int type); Q_SLOT void importSelection(); + void exportSelection(); void insertInInsertMode(const QString &text); public: @@ -1050,20 +1051,20 @@ EventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev) // key = shift(key); //} - QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode - || !m_tc.atBlockEnd() || m_tc.block().length() <= 1, - qDebug() << "Cursor at EOL before key handler"); + //QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode + // || !m_tc.atBlockEnd() || m_tc.block().length() <= 1, + // qDebug() << "Cursor at EOL before key handler"); EventResult result = handleKey(Input(key, mods, ev->text())); - // the command might have destroyed the editor + // The command might have destroyed the editor. if (m_textedit || m_plaintextedit) { // We fake vi-style end-of-line behaviour m_fakeEnd = atEndOfLine() && m_mode == CommandMode && !isVisualBlockMode(); - QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode - || !m_tc.atBlockEnd() || m_tc.block().length() <= 1, - qDebug() << "Cursor at EOL after key handler"); + //QTC_ASSERT(m_mode == InsertMode || m_mode == ReplaceMode + // || !m_tc.atBlockEnd() || m_tc.block().length() <= 1, + // qDebug() << "Cursor at EOL after key handler"); if (m_fakeEnd) moveLeft(); @@ -1075,6 +1076,8 @@ EventResult FakeVimHandler::Private::handleEvent(QKeyEvent *ev) if (hasConfig(ConfigShowMarks)) updateSelection(); + exportSelection(); + return result; } @@ -1100,6 +1103,41 @@ void FakeVimHandler::Private::setupWidget() updateCursor(); } +void FakeVimHandler::Private::exportSelection() +{ + if (!hasConfig(ConfigExportSelection)) + return; + + // FIXME: That's hacky and does not work for block selections + // and the clipboard is not filled if the selections are updated + // using the keyboard. + QTextCursor tc = EDITOR(textCursor()); + int pos = position(); + int anc = anchor(); + if (m_visualMode == VisualBlockMode) { + //tc.setPosition(anc, MoveAnchor); + //tc.setPosition(pos, KeepAnchor); + //EDITOR(setTextCursor(tc)); + } else if (m_visualMode == VisualLineMode) { + int posLine = lineForPosition(pos); + int ancLine = lineForPosition(anc); + if (anc < pos) { + pos = lastPositionInLine(posLine); + anc = firstPositionInLine(ancLine); + } else { + pos = firstPositionInLine(posLine); + anc = lastPositionInLine(ancLine); + } + tc.setPosition(anc, MoveAnchor); + tc.setPosition(pos, KeepAnchor); + EDITOR(setTextCursor(tc)); + } else if (m_visualMode == VisualCharMode) { + tc.setPosition(anc, MoveAnchor); + tc.setPosition(pos, KeepAnchor); + EDITOR(setTextCursor(tc)); + } +} + void FakeVimHandler::Private::importSelection() { QTextCursor tc = EDITOR(textCursor()); @@ -1130,6 +1168,7 @@ void FakeVimHandler::Private::importSelection() tc.clearSelection(); EDITOR(setTextCursor(tc)); updateSelection(); + exportSelection(); } void FakeVimHandler::Private::updateEditor() diff --git a/src/plugins/fakevim/fakevimoptions.ui b/src/plugins/fakevim/fakevimoptions.ui index 450a8629065..51f19c49111 100644 --- a/src/plugins/fakevim/fakevimoptions.ui +++ b/src/plugins/fakevim/fakevimoptions.ui @@ -73,6 +73,16 @@ </property> </widget> </item> + <item row="3" column="2"> + <widget class="QCheckBox" name="checkBoxExportSelection"> + <property name="text"> + <string>Export selected text automatically</string> + </property> + <property name="toolTip"> + <string>This might slow down editing</string> + </property> + </widget> + </item> <item row="3" column="0" colspan="2"> <widget class="QCheckBox" name="checkBoxSmartTab"> <property name="text"> diff --git a/src/plugins/fakevim/fakevimplugin.cpp b/src/plugins/fakevim/fakevimplugin.cpp index 8883ada1fb8..82fab176087 100644 --- a/src/plugins/fakevim/fakevimplugin.cpp +++ b/src/plugins/fakevim/fakevimplugin.cpp @@ -169,6 +169,8 @@ QWidget *FakeVimOptionPage::createPage(QWidget *parent) m_ui.spinBoxShiftWidth); m_group.insert(theFakeVimSetting(ConfigShowMarks), m_ui.checkBoxShowMarks); + m_group.insert(theFakeVimSetting(ConfigExportSelection), + m_ui.checkBoxExportSelection); m_group.insert(theFakeVimSetting(ConfigSmartTab), m_ui.checkBoxSmartTab); -- GitLab