Mercurial > octave
changeset 24307:ae7948b6c017 stable
do not change selection when (un)commenting lines in the editor ()
* file-editor-tab.cc (do_comment_selected_tex): restore previous selection
after (un)commenting lines in the editor
author | Torsten <mttl@mailbox.org> |
---|---|
date | Fri, 24 Nov 2017 18:14:37 +0100 |
parents | 5b7f99dfdab3 |
children | 678912855789 |
files | libgui/src/m-editor/file-editor-tab.cc |
diffstat | 1 files changed, 37 insertions(+), 6 deletions(-) [+] |
line wrap: on
line diff
--- a/libgui/src/m-editor/file-editor-tab.cc Tue Nov 21 21:35:32 2017 +0100 +++ b/libgui/src/m-editor/file-editor-tab.cc Fri Nov 24 18:14:37 2017 +0100 @@ -1375,13 +1375,18 @@ { QString comment_str = comment_string (_edit_area->lexer ()->lexer ()); QRegExp rxc = QRegExp ("^([ \\t]*)" + comment_str); - int len, lenc = comment_str.length (); + int len = 0; + int lenc = comment_str.length (); _edit_area->beginUndoAction (); if (_edit_area->hasSelectedText ()) { int lineFrom, lineTo, colFrom, colTo; + int change_col_from = 1; + int change_col_to = 1; + bool removed; + _edit_area->getSelection (&lineFrom, &colFrom, &lineTo, &colTo); if (colTo == 0) // the beginning of last line is not selected @@ -1390,21 +1395,47 @@ for (int i = lineFrom; i <= lineTo; i++) { if (comment) - _edit_area->insertAt (comment_str, i, 0); + { + _edit_area->insertAt (comment_str, i, 0); + + } else { QString line (_edit_area->text (i)); - if (line.contains (rxc)) + if ((removed = line.contains (rxc))) { len = rxc.matchedLength (); _edit_area->setSelection (i, len-lenc, i, len); _edit_area->removeSelectedText (); } + + // handle case, where the selection remains unchanged + if (i == lineFrom && (colFrom < len-lenc || ! removed)) + change_col_from = 0; // do not change start of selection + if (i == lineTo && (colTo < len-lenc || ! removed)) + change_col_to = 0; // do not change end of selection } } - //set selection on (un)commented section - _edit_area->setSelection (lineFrom, 0, lineTo, - _edit_area->text (lineTo).length ()-1); + + // update the selection area + if (comment) + { + colFrom = colFrom + lenc; // shift start position by comment length + if (colTo > 0) + colTo = colTo + lenc; // shift end position by comment length + else + lineTo++; // colTo == 0 , fully select previous line + } + else + { + if (colTo == 0) + lineTo++; // colTo == 0 , fully select previous line + colFrom = colFrom - change_col_from*lenc; + colTo = colTo - change_col_to*lenc; + } + + // set updated selection area + _edit_area->setSelection (lineFrom, colFrom, lineTo, colTo); } else {