diff --git a/src/gui/value/text.cpp b/src/gui/value/text.cpp index 4e50d587..76e568ec 100644 --- a/src/gui/value/text.cpp +++ b/src/gui/value/text.cpp @@ -354,6 +354,7 @@ bool TextValueEditor::hasFormat(int type) const { } void TextValueEditor::doFormat(int type) { + size_t ss = selection_start, se = selection_end; switch (type) { case ID_FORMAT_BOLD: { getSet().actions.add(toggle_format_action(valueP(), _("b"), selection_start_i, selection_end_i, _("Bold"))); @@ -368,6 +369,9 @@ void TextValueEditor::doFormat(int type) { break; } } + selection_start = ss; + selection_end = se; + fixSelection(); } // ----------------------------------------------------------------------------- : Selection @@ -534,8 +538,8 @@ void TextValueEditor::fixSelection(IndexType t, Movement dir) { selection_end = index_to_cursor(value().value(), selection_end_i, dir); } // make sure the selection is at a valid position inside the text - selection_start_i = cursor_to_index(val, selection_start); - selection_end_i = cursor_to_index(val, selection_end); + selection_start_i = cursor_to_index(val, selection_start, selection_start == selection_end ? MOVE_MID : MOVE_RIGHT); + selection_end_i = cursor_to_index(val, selection_end, selection_start == selection_end ? MOVE_MID : MOVE_LEFT); // start and end must be on the same side of separators size_t seppos = val.find(_(" seppos) { // not on same side, move selection end before sep selection_end = index_to_cursor(val, seppos, dir); - selection_end_i = cursor_to_index(val, selection_end); + selection_end_i = cursor_to_index(val, selection_end, selection_start == selection_end ? MOVE_MID : MOVE_LEFT); } else if (selection_start_i >= sepend && selection_end_i < sepend) { // not on same side, move selection end after sep selection_end = index_to_cursor(val, sepend, dir); - selection_end_i = cursor_to_index(val, selection_end); + selection_end_i = cursor_to_index(val, selection_end, selection_start == selection_end ? MOVE_MID : MOVE_LEFT); } // find next separator seppos = val.find(_(" - - return a position inside the tags // This allows formating to be enabled without a selection - return start; + return dir == MOVE_RIGHT ? end - 1 : start; } @@ -373,12 +373,12 @@ String simplify_tagged_overlap(const String& str) { add_or_cancel_tag(tag, open_tags); if (open_tags.find(anti_tag(tag)) != String::npos) { // still not canceled out - i += tag.size() + 2; + i += tag.size() + 1; continue; } } else { // skip this tag, doubling it has no effect - i += tag.size() + 2; + i += tag.size() + 1; add_or_cancel_tag(tag, open_tags); continue; } diff --git a/src/util/tagged_string.hpp b/src/util/tagged_string.hpp index 47c2cafb..13bf5aee 100644 --- a/src/util/tagged_string.hpp +++ b/src/util/tagged_string.hpp @@ -101,7 +101,7 @@ size_t index_to_cursor(const String& str, size_t index, Movement dir = MOVE_MID) void cursor_to_index_range(const String& str, size_t cursor, size_t& begin, size_t& end); /// Find the character index corresponding to the given cursor position -size_t cursor_to_index(const String& str, size_t cursor); +size_t cursor_to_index(const String& str, size_t cursor, Movement dir = MOVE_MID); // ----------------------------------------------------------------------------- : Global operations