Commit c24b5bd3 authored by twanvl's avatar twanvl

formating works, cursor position now prefers to be inside tags

parent 475d0faa
...@@ -354,6 +354,7 @@ bool TextValueEditor::hasFormat(int type) const { ...@@ -354,6 +354,7 @@ bool TextValueEditor::hasFormat(int type) const {
} }
void TextValueEditor::doFormat(int type) { void TextValueEditor::doFormat(int type) {
size_t ss = selection_start, se = selection_end;
switch (type) { switch (type) {
case ID_FORMAT_BOLD: { case ID_FORMAT_BOLD: {
getSet().actions.add(toggle_format_action(valueP(), _("b"), selection_start_i, selection_end_i, _("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) { ...@@ -368,6 +369,9 @@ void TextValueEditor::doFormat(int type) {
break; break;
} }
} }
selection_start = ss;
selection_end = se;
fixSelection();
} }
// ----------------------------------------------------------------------------- : Selection // ----------------------------------------------------------------------------- : Selection
...@@ -534,8 +538,8 @@ void TextValueEditor::fixSelection(IndexType t, Movement dir) { ...@@ -534,8 +538,8 @@ void TextValueEditor::fixSelection(IndexType t, Movement dir) {
selection_end = index_to_cursor(value().value(), selection_end_i, dir); selection_end = index_to_cursor(value().value(), selection_end_i, dir);
} }
// make sure the selection is at a valid position inside the text // make sure the selection is at a valid position inside the text
selection_start_i = cursor_to_index(val, selection_start); 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_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 // start and end must be on the same side of separators
size_t seppos = val.find(_("<sep")); size_t seppos = val.find(_("<sep"));
while (seppos != String::npos) { while (seppos != String::npos) {
...@@ -543,11 +547,11 @@ void TextValueEditor::fixSelection(IndexType t, Movement dir) { ...@@ -543,11 +547,11 @@ void TextValueEditor::fixSelection(IndexType t, Movement dir) {
if (selection_start_i <= seppos && selection_end_i > seppos) { if (selection_start_i <= seppos && selection_end_i > seppos) {
// not on same side, move selection end before sep // not on same side, move selection end before sep
selection_end = index_to_cursor(val, seppos, dir); 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) { } else if (selection_start_i >= sepend && selection_end_i < sepend) {
// not on same side, move selection end after sep // not on same side, move selection end after sep
selection_end = index_to_cursor(val, sepend, dir); 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 // find next separator
seppos = val.find(_("<sep"), seppos + 1); seppos = val.find(_("<sep"), seppos + 1);
......
...@@ -2526,9 +2526,6 @@ ...@@ -2526,9 +2526,6 @@
<File <File
RelativePath=".\render\text\font.cpp"> RelativePath=".\render\text\font.cpp">
</File> </File>
<File
RelativePath=".\render\text\line.cpp">
</File>
<File <File
RelativePath=".\render\text\symbol.cpp"> RelativePath=".\render\text\symbol.cpp">
<FileConfiguration <FileConfiguration
......
...@@ -229,12 +229,12 @@ void cursor_to_index_range(const String& str, size_t cursor, size_t& start, size ...@@ -229,12 +229,12 @@ void cursor_to_index_range(const String& str, size_t cursor, size_t& start, size
if (cur < cursor) start = end = str.size(); if (cur < cursor) start = end = str.size();
} }
size_t cursor_to_index(const String& str, size_t cursor) { size_t cursor_to_index(const String& str, size_t cursor, Movement dir) {
size_t start, end; size_t start, end;
cursor_to_index_range(str, cursor, start, end); cursor_to_index_range(str, cursor, start, end);
// TODO: If at i there is <tag></tag> return a position inside the tags // TODO: If at i there is <tag></tag> return a position inside the tags
// This allows formating to be enabled without a selection // 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) { ...@@ -373,12 +373,12 @@ String simplify_tagged_overlap(const String& str) {
add_or_cancel_tag(tag, open_tags); add_or_cancel_tag(tag, open_tags);
if (open_tags.find(anti_tag(tag)) != String::npos) { if (open_tags.find(anti_tag(tag)) != String::npos) {
// still not canceled out // still not canceled out
i += tag.size() + 2; i += tag.size() + 1;
continue; continue;
} }
} else { } else {
// skip this tag, doubling it has no effect // skip this tag, doubling it has no effect
i += tag.size() + 2; i += tag.size() + 1;
add_or_cancel_tag(tag, open_tags); add_or_cancel_tag(tag, open_tags);
continue; continue;
} }
......
...@@ -101,7 +101,7 @@ size_t index_to_cursor(const String& str, size_t index, Movement dir = MOVE_MID) ...@@ -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); 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 /// 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 // ----------------------------------------------------------------------------- : Global operations
......
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