Commit e5948158 authored by mae's avatar mae

two new actions: "select block up" and "select block down", current default is Ctrl+U

parent e9ad023d
......@@ -597,6 +597,8 @@ void BaseTextEditor::slotSelectionChanged()
viewport()->update();
if (!d->m_inBlockSelectionMode)
d->m_blockSelectionExtraX = 0;
if (!d->m_selectBlockAnchor.isNull() && !textCursor().hasSelection())
d->m_selectBlockAnchor = QTextCursor();
}
void BaseTextEditor::gotoBlockStart()
......@@ -627,6 +629,45 @@ void BaseTextEditor::gotoBlockEndWithSelection()
setTextCursor(cursor);
}
void BaseTextEditor::selectBlockUp()
{
QTextCursor cursor = textCursor();
if (!cursor.hasSelection())
d->m_selectBlockAnchor = cursor;
else
cursor.setPosition(cursor.selectionStart());
if (!TextBlockUserData::findPreviousOpenParenthesis(&cursor, false))
return;
if (!TextBlockUserData::findNextClosingParenthesis(&cursor, true))
return;
setTextCursor(cursor);
}
void BaseTextEditor::selectBlockDown()
{
QTextCursor tc = textCursor();
QTextCursor cursor = d->m_selectBlockAnchor;
if (!tc.hasSelection() || cursor.isNull())
return;
tc.setPosition(tc.selectionStart());
forever {
QTextCursor ahead = cursor;
if (!TextBlockUserData::findPreviousOpenParenthesis(&ahead, false))
break;
if (ahead.position() <= tc.position())
break;
cursor = ahead;
}
if ( cursor != d->m_selectBlockAnchor)
TextBlockUserData::findNextClosingParenthesis(&cursor, true);
setTextCursor(cursor);
}
void BaseTextEditor::keyPressEvent(QKeyEvent *e)
......
......@@ -326,6 +326,9 @@ public slots:
void gotoBlockStartWithSelection();
void gotoBlockEndWithSelection();
void selectBlockUp();
void selectBlockDown();
signals:
void changed();
......
......@@ -216,6 +216,7 @@ public:
void removeBlockSelection(const QString &text = QString());
QTextCursor m_findScope;
QTextCursor m_selectBlockAnchor;
void moveCursorVisible();
};
......
......@@ -69,6 +69,7 @@ TextEditorActionHandler::TextEditorActionHandler(Core::ICore *core,
= m_increaseFontSizeAction = m_decreaseFontSizeAction
= m_gotoBlockStartAction = m_gotoBlockStartWithSelectionAction
= m_gotoBlockEndAction = m_gotoBlockEndWithSelectionAction
= m_selectBlockUpAction = m_selectBlockDownAction
= 0;
m_contextId << m_core->uniqueIDManager()->uniqueIdentifier(context);
......@@ -163,13 +164,11 @@ void TextEditorActionHandler::createActions()
command = am->registerAction(m_collapseAction, Constants::COLLAPSE, m_contextId);
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+<")));
connect(m_collapseAction, SIGNAL(triggered()), this, SLOT(collapse()));
advancedMenu->addAction(command);
m_expandAction = new QAction(tr("Expand"), this);
command = am->registerAction(m_expandAction, Constants::EXPAND, m_contextId);
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+>")));
connect(m_expandAction, SIGNAL(triggered()), this, SLOT(expand()));
advancedMenu->addAction(command);
m_unCollapseAllAction = new QAction(tr("(Un)&Collapse All"), this);
command = am->registerAction(m_unCollapseAllAction, Constants::UN_COLLAPSE_ALL, m_contextId);
......@@ -208,6 +207,15 @@ void TextEditorActionHandler::createActions()
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+}")));
connect(m_gotoBlockEndWithSelectionAction, SIGNAL(triggered()), this, SLOT(gotoBlockEndWithSelection()));
m_selectBlockUpAction= new QAction(tr("Select Block Up"), this);
command = am->registerAction(m_selectBlockUpAction, Constants::SELECT_BLOCK_UP, m_contextId);
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+U")));
connect(m_selectBlockUpAction, SIGNAL(triggered()), this, SLOT(selectBlockUp()));
m_selectBlockDownAction= new QAction(tr("Select Block Down"), this);
command = am->registerAction(m_selectBlockDownAction, Constants::SELECT_BLOCK_DOWN, m_contextId);
command->setDefaultKeySequence(QKeySequence(tr("Ctrl+Shift+U")));
connect(m_selectBlockDownAction, SIGNAL(triggered()), this, SLOT(selectBlockDown()));
}
bool TextEditorActionHandler::supportsAction(const QString & /*id */) const
......@@ -252,35 +260,30 @@ void TextEditorActionHandler::updateActions()
void TextEditorActionHandler::updateActions(UpdateMode um)
{
if (m_pasteAction)
m_pasteAction->setEnabled(um != NoEditor);
if (m_selectAllAction)
m_selectAllAction->setEnabled(um != NoEditor);
if (m_gotoAction)
m_gotoAction->setEnabled(um != NoEditor);
if (m_selectEncodingAction)
m_selectEncodingAction->setEnabled(um != NoEditor);
if (m_printAction)
m_printAction->setEnabled(um != NoEditor);
if (m_formatAction)
m_formatAction->setEnabled((m_optionalActions & Format) && um != NoEditor);
if (m_unCommentSelectionAction)
m_unCommentSelectionAction->setEnabled((m_optionalActions & UnCommentSelection) && um != NoEditor);
if (m_collapseAction)
m_collapseAction->setEnabled(um != NoEditor);
if (m_expandAction)
m_expandAction->setEnabled(um != NoEditor);
if (m_unCollapseAllAction)
m_unCollapseAllAction->setEnabled((m_optionalActions & UnCollapseAll) && um != NoEditor);
if (m_decreaseFontSizeAction)
m_decreaseFontSizeAction->setEnabled(um != NoEditor);
if (m_increaseFontSizeAction)
m_increaseFontSizeAction->setEnabled(um != NoEditor);
if (m_visualizeWhitespaceAction) {
m_visualizeWhitespaceAction->setEnabled(um != NoEditor);
if (m_currentEditor)
m_visualizeWhitespaceAction->setChecked(m_currentEditor->displaySettings().m_visualizeWhitespace);
}
if (!m_initialized)
return;
m_pasteAction->setEnabled(um != NoEditor);
m_selectAllAction->setEnabled(um != NoEditor);
m_gotoAction->setEnabled(um != NoEditor);
m_selectEncodingAction->setEnabled(um != NoEditor);
m_printAction->setEnabled(um != NoEditor);
m_formatAction->setEnabled((m_optionalActions & Format) && um != NoEditor);
m_unCommentSelectionAction->setEnabled((m_optionalActions & UnCommentSelection) && um != NoEditor);
m_collapseAction->setEnabled(um != NoEditor);
m_expandAction->setEnabled(um != NoEditor);
m_unCollapseAllAction->setEnabled((m_optionalActions & UnCollapseAll) && um != NoEditor);
m_decreaseFontSizeAction->setEnabled(um != NoEditor);
m_increaseFontSizeAction->setEnabled(um != NoEditor);
m_gotoBlockStartAction->setEnabled(um != NoEditor);
m_gotoBlockStartWithSelectionAction->setEnabled(um != NoEditor);
m_gotoBlockEndAction->setEnabled(um != NoEditor);
m_gotoBlockEndWithSelectionAction->setEnabled(um != NoEditor);
m_selectBlockUpAction->setEnabled(um != NoEditor);
m_selectBlockDownAction->setEnabled(um != NoEditor);
m_visualizeWhitespaceAction->setEnabled(um != NoEditor);
if (m_currentEditor)
m_visualizeWhitespaceAction->setChecked(m_currentEditor->displaySettings().m_visualizeWhitespace);
if (m_textWrappingAction) {
m_textWrappingAction->setEnabled(um != NoEditor);
if (m_currentEditor)
......@@ -411,6 +414,8 @@ FUNCTION(gotoBlockStart)
FUNCTION(gotoBlockEnd)
FUNCTION(gotoBlockStartWithSelection)
FUNCTION(gotoBlockEndWithSelection)
FUNCTION(selectBlockUp)
FUNCTION(selectBlockDown)
void TextEditorActionHandler::updateCurrentEditor(Core::IContext *object)
{
......
......@@ -113,6 +113,8 @@ private slots:
void gotoBlockEnd();
void gotoBlockStartWithSelection();
void gotoBlockEndWithSelection();
void selectBlockUp();
void selectBlockDown();
void updateCurrentEditor(Core::IContext *object);
private:
......@@ -139,6 +141,8 @@ private:
QAction *m_gotoBlockEndAction;
QAction *m_gotoBlockStartWithSelectionAction;
QAction *m_gotoBlockEndWithSelectionAction;
QAction *m_selectBlockUpAction;
QAction *m_selectBlockDownAction;
uint m_optionalActions;
QPointer<BaseTextEditor> m_currentEditor;
......
......@@ -52,6 +52,8 @@ const char * const GOTO_BLOCK_START = "TextEditor.GotoBlockStart";
const char * const GOTO_BLOCK_START_WITH_SELECTION = "TextEditor.GotoBlockStartWithSelection";
const char * const GOTO_BLOCK_END = "TextEditor.GotoBlockEnd";
const char * const GOTO_BLOCK_END_WITH_SELECTION = "TextEditor.GotoBlockEndWithSelection";
const char * const SELECT_BLOCK_UP = "TextEditor.SelectBlockUp";
const char * const SELECT_BLOCK_DOWN = "TextEditor.SelectBlockDown";
const char * const DELETE_LINE = "TextEditor.DeleteLine";
const char * const DELETE_WORD = "TextEditor.DeleteWord";
const char * const SELECT_ENCODING = "TextEditor.SelectEncoding";
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment