diff options
author | Ian Thompson <quornian@googlemail.com> | 2008-08-24 17:30:35 +0400 |
---|---|---|
committer | Ian Thompson <quornian@googlemail.com> | 2008-08-24 17:30:35 +0400 |
commit | bf0803c0c24a3db25b60b1114b30a08ee45d9d1f (patch) | |
tree | 236ab5bb04a3396037c87bf3715415bc12a77ca2 /source/blender/blenkernel/intern | |
parent | d6a9f7f4850defeb13c994caecc6776adb782f08 (diff) |
Added better grouping for text markers with a separate group field (instead of using flags). The lower two bytes of the group are used for python scripts while the upper two (or more) are reserved for internal grouping. Plenty either way.
Diffstat (limited to 'source/blender/blenkernel/intern')
-rw-r--r-- | source/blender/blenkernel/intern/text.c | 101 |
1 files changed, 41 insertions, 60 deletions
diff --git a/source/blender/blenkernel/intern/text.c b/source/blender/blenkernel/intern/text.c index 35422353b0d..611adbd5535 100644 --- a/source/blender/blenkernel/intern/text.c +++ b/source/blender/blenkernel/intern/text.c @@ -987,16 +987,16 @@ static void txt_delete_sel (Text *text) buf= MEM_mallocN(text->curc+(text->sell->len - text->selc)+1, "textline_string"); if (text->curl != text->sell) { - txt_clear_marker_region(text, text->curl, text->curc, text->curl->len, 0); + txt_clear_marker_region(text, text->curl, text->curc, text->curl->len, 0, 0); move= txt_get_span(text->curl, text->sell); } else { - mrk= txt_find_marker_region(text, text->curl, text->curc, text->selc, 0); + mrk= txt_find_marker_region(text, text->curl, text->curc, text->selc, 0, 0); if (mrk && (mrk->start > text->curc || mrk->end < text->selc)) - txt_clear_marker_region(text, text->curl, text->curc, text->selc, 0); + txt_clear_marker_region(text, text->curl, text->curc, text->selc, 0, 0); move= 0; } - mrk= txt_find_marker_region(text, text->sell, text->selc-1, text->sell->len, 0); + mrk= txt_find_marker_region(text, text->sell, text->selc-1, text->sell->len, 0, 0); if (mrk) { lineno= mrk->lineno; do { @@ -2190,7 +2190,7 @@ static void txt_combine_lines (Text *text, TextLine *linea, TextLine *lineb) if(!linea || !lineb) return; - mrk= txt_find_marker_region(text, lineb, 0, lineb->len, 0); + mrk= txt_find_marker_region(text, lineb, 0, lineb->len, 0, 0); if (mrk) { lineno= mrk->lineno; do { @@ -2236,12 +2236,12 @@ void txt_delete_char (Text *text) } else { /* Just deleting a char */ int i= text->curc; - TextMarker *mrk= txt_find_marker_region(text, text->curl, i-1, text->curl->len, 0); + TextMarker *mrk= txt_find_marker_region(text, text->curl, i-1, text->curl->len, 0, 0); if (mrk) { int lineno= mrk->lineno; if (mrk->end==i) { if ((mrk->flags & TMARK_TEMP) && !(mrk->flags & TMARK_EDITALL)) { - txt_clear_markers(text, mrk->flags); + txt_clear_markers(text, mrk->group, TMARK_TEMP); } else { TextMarker *nxt= mrk->next; BLI_freelinkN(&text->markers, mrk); @@ -2301,12 +2301,12 @@ void txt_backspace_char (Text *text) else { /* Just backspacing a char */ int i= text->curc-1; - TextMarker *mrk= txt_find_marker_region(text, text->curl, i, text->curl->len, 0); + TextMarker *mrk= txt_find_marker_region(text, text->curl, i, text->curl->len, 0, 0); if (mrk) { int lineno= mrk->lineno; if (mrk->start==i+1) { if ((mrk->flags & TMARK_TEMP) && !(mrk->flags & TMARK_EDITALL)) { - txt_clear_markers(text, mrk->flags); + txt_clear_markers(text, mrk->group, TMARK_TEMP); } else { TextMarker *nxt= mrk->next; BLI_freelinkN(&text->markers, mrk); @@ -2359,7 +2359,7 @@ int txt_add_char (Text *text, char add) txt_delete_sel(text); - mrk= txt_find_marker_region(text, text->curl, text->curc-1, text->curl->len, 0); + mrk= txt_find_marker_region(text, text->curl, text->curc-1, text->curl->len, 0, 0); if (mrk) { lineno= mrk->lineno; do { @@ -2401,7 +2401,7 @@ int txt_replace_char (Text *text, char add) if (text->curc==text->curl->len || txt_has_sel(text) || add=='\n') { TextMarker *mrk; int i= txt_add_char(text, add); - mrk= txt_find_marker(text, text->curl, text->curc, 0); + mrk= txt_find_marker(text, text->curl, text->curc, 0, 0); if (mrk && mrk->end==text->curc) mrk->end--; return i; } @@ -2689,7 +2689,7 @@ static int color_match(TextMarker *a, TextMarker *b) { } /* Creates and adds a marker to the list maintaining sorted order */ -void txt_add_marker(Text *text, TextLine *line, int start, int end, char clr[4], int flags) { +void txt_add_marker(Text *text, TextLine *line, int start, int end, char clr[4], int group, int flags) { TextMarker *tmp, *marker; marker= MEM_mallocN(sizeof(TextMarker), "text_marker"); @@ -2697,6 +2697,7 @@ void txt_add_marker(Text *text, TextLine *line, int start, int end, char clr[4], marker->lineno= txt_get_span(text->lines.first, line); marker->start= MIN2(start, end); marker->end= MAX2(start, end); + marker->group= group; marker->flags= flags; marker->clr[0]= clr[0]; @@ -2712,17 +2713,18 @@ void txt_add_marker(Text *text, TextLine *line, int start, int end, char clr[4], else BLI_addhead(&text->markers, marker); } -/* Returns the first matching marker on the specified line between two points, - with at least the specified flags set. If flags is zero, all markers will be - searched */ -TextMarker *txt_find_marker_region(Text *text, TextLine *line, int start, int end, int flags) { +/* Returns the first matching marker on the specified line between two points. + If the group or flags fields are non-zero the returned flag must be in the + specified group and have at least the specified flags set. */ +TextMarker *txt_find_marker_region(Text *text, TextLine *line, int start, int end, int group, int flags) { TextMarker *marker, *next; int lineno= txt_get_span(text->lines.first, line); for (marker=text->markers.first; marker; marker=next) { next= marker->next; - if ((marker->flags & flags) != flags) continue; + if (group && marker->group != group) continue; + else if ((marker->flags & flags) != flags) continue; else if (marker->lineno < lineno) continue; else if (marker->lineno > lineno) break; @@ -2733,9 +2735,10 @@ TextMarker *txt_find_marker_region(Text *text, TextLine *line, int start, int en return NULL; } -/* Clears all markers on the specified line between two points with at least - the specified flags set. If flags is zero, all markers will be cleared */ -short txt_clear_marker_region(Text *text, TextLine *line, int start, int end, int flags) { +/* Clears all markers on the specified line between two points. If the group or + flags fields are non-zero the returned flag must be in the specified group + and have at least the specified flags set. */ +short txt_clear_marker_region(Text *text, TextLine *line, int start, int end, int group, int flags) { TextMarker *marker, *next; int lineno= txt_get_span(text->lines.first, line); short cleared= 0; @@ -2743,7 +2746,8 @@ short txt_clear_marker_region(Text *text, TextLine *line, int start, int end, in for (marker=text->markers.first; marker; marker=next) { next= marker->next; - if ((marker->flags & flags) != flags) continue; + if (group && marker->group != group) continue; + else if ((marker->flags & flags) != flags) continue; else if (marker->lineno < lineno) continue; else if (marker->lineno > lineno) break; @@ -2756,16 +2760,18 @@ short txt_clear_marker_region(Text *text, TextLine *line, int start, int end, in return cleared; } -/* Clears all markers with at least the specified flags set (useful for - clearing temporary markers) */ -short txt_clear_markers(Text *text, int flags) { +/* Clears all markers in the specified group (if given) with at least the + specified flags set. Useful for clearing temporary markers (group=0, + flags=TMARK_TEMP) */ +short txt_clear_markers(Text *text, int group, int flags) { TextMarker *marker, *next; short cleared= 0; for (marker=text->markers.first; marker; marker=next) { next= marker->next; - if ((marker->flags & flags) == flags) { + if ((!group || marker->group==group) && + (marker->flags & flags) == flags) { BLI_freelinkN(&text->markers, marker); cleared= 1; } @@ -2774,13 +2780,14 @@ short txt_clear_markers(Text *text, int flags) { } /* Finds the marker at the specified line and cursor position with at least the - specified flags set. If flags is zero, all markers will be searched */ -TextMarker *txt_find_marker(Text *text, TextLine *line, int curs, int flags) { + specified flags set in the given group (if non-zero). */ +TextMarker *txt_find_marker(Text *text, TextLine *line, int curs, int group, int flags) { TextMarker *marker; int lineno= txt_get_span(text->lines.first, line); for (marker=text->markers.first; marker; marker=marker->next) { - if ((marker->flags & flags) != flags) continue; + if (group && marker->group != group) continue; + else if ((marker->flags & flags) != flags) continue; else if (marker->lineno < lineno) continue; else if (marker->lineno > lineno) break; @@ -2790,53 +2797,27 @@ TextMarker *txt_find_marker(Text *text, TextLine *line, int curs, int flags) { return NULL; } -/* Finds the previous marker with matching flags. If no other marker is found, - the same one will be returned */ +/* Finds the previous marker in the same group. If no other is found, the same + marker will be returned */ TextMarker *txt_prev_marker(Text *text, TextMarker *marker) { TextMarker *tmp= marker; while (tmp) { if (tmp->prev) tmp= tmp->prev; else tmp= text->markers.last; - if (tmp->flags == marker->flags) + if (tmp->group == marker->group) return tmp; } return NULL; /* Only if marker==NULL */ } -/* Finds the next marker with matching flags. If no other marker is found, the - same one will be returned */ +/* Finds the next marker in the same group. If no other is found, the same + marker will be returned */ TextMarker *txt_next_marker(Text *text, TextMarker *marker) { TextMarker *tmp= marker; while (tmp) { if (tmp->next) tmp= tmp->next; else tmp= text->markers.first; - if (tmp->flags == marker->flags) - return tmp; - } - return NULL; /* Only if marker==NULL */ -} - -/* Finds the previous marker with matching colour. If no other marker is found, - the same one will be returned */ -TextMarker *txt_prev_marker_color(Text *text, TextMarker *marker) { - TextMarker *tmp= marker; - while (tmp) { - if (tmp->prev) tmp= tmp->prev; - else tmp= text->markers.last; - if (color_match(tmp, marker)) - return tmp; - } - return NULL; /* Only if marker==NULL */ -} - -/* Finds the next marker with matching colour. If no other marker is found, the - same one will be returned */ -TextMarker *txt_next_marker_color(Text *text, TextMarker *marker) { - TextMarker *tmp= marker; - while (tmp) { - if (tmp->next) tmp= tmp->next; - else tmp= text->markers.first; - if (color_match(tmp, marker)) + if (tmp->group == marker->group) return tmp; } return NULL; /* Only if marker==NULL */ |