Text Editor: remove text marker functionality. Patch [#33251]
This commit is contained in:
parent
c25cfd3044
commit
c407c951a0
@ -137,9 +137,6 @@ class TEXT_PT_find(Panel):
|
||||
row.operator("text.replace_set_selected", text="", icon='TEXT')
|
||||
col.operator("text.replace")
|
||||
|
||||
# mark
|
||||
layout.operator("text.mark_all")
|
||||
|
||||
# settings
|
||||
layout.prop(st, "use_match_case")
|
||||
row = layout.row()
|
||||
@ -216,17 +213,6 @@ class TEXT_MT_edit_select(Menu):
|
||||
layout.operator("text.select_line")
|
||||
|
||||
|
||||
class TEXT_MT_edit_markers(Menu):
|
||||
bl_label = "Markers"
|
||||
|
||||
def draw(self, context):
|
||||
layout = self.layout
|
||||
|
||||
layout.operator("text.markers_clear")
|
||||
layout.operator("text.next_marker")
|
||||
layout.operator("text.previous_marker")
|
||||
|
||||
|
||||
class TEXT_MT_format(Menu):
|
||||
bl_label = "Format"
|
||||
|
||||
@ -290,7 +276,6 @@ class TEXT_MT_edit(Menu):
|
||||
layout.separator()
|
||||
|
||||
layout.menu("TEXT_MT_edit_select")
|
||||
layout.menu("TEXT_MT_edit_markers")
|
||||
|
||||
layout.separator()
|
||||
|
||||
|
@ -100,14 +100,6 @@ void txt_move_lines (struct Text *text, const int direction);
|
||||
void txt_duplicate_line (struct Text *text);
|
||||
int setcurr_tab_spaces (struct Text *text, int space);
|
||||
|
||||
void txt_add_marker (struct Text *text, struct TextLine *line, int start, int end, const unsigned char color[4], int group, int flags);
|
||||
short txt_clear_marker_region (struct Text *text, struct TextLine *line, int start, int end, int group, int flags);
|
||||
short txt_clear_markers (struct Text *text, int group, int flags);
|
||||
struct TextMarker *txt_find_marker (struct Text *text, struct TextLine *line, int curs, int group, int flags);
|
||||
struct TextMarker *txt_find_marker_region (struct Text *text, struct TextLine *line, int start, int end, int group, int flags);
|
||||
struct TextMarker *txt_prev_marker (struct Text *text, struct TextMarker *marker);
|
||||
struct TextMarker *txt_next_marker (struct Text *text, struct TextMarker *marker);
|
||||
|
||||
/* utility functions, could be moved somewhere more generic but are python/text related */
|
||||
int text_check_bracket(const char ch);
|
||||
int text_check_delim(const char ch);
|
||||
@ -161,10 +153,6 @@ enum {
|
||||
|
||||
#define UNDO_DUPLICATE 040
|
||||
|
||||
/* Marker flags */
|
||||
#define TMARK_TEMP 0x01 /* Remove on non-editing events, don't save */
|
||||
#define TMARK_EDITALL 0x02 /* Edit all markers of the same group as one */
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
@ -96,17 +96,6 @@
|
||||
* If the user moves the cursor the st containing that cursor should
|
||||
* be popped ... other st's retain their own top location.
|
||||
*
|
||||
* Markers
|
||||
* --
|
||||
* The mrk->flags define the behavior and relationships between markers. The
|
||||
* upper two bytes are used to hold a group ID, the lower two are normal flags. If
|
||||
* TMARK_EDITALL is set the group ID defines which other markers should be edited.
|
||||
*
|
||||
* The mrk->clr field is used to visually group markers where the flags may not
|
||||
* match. A template system, for example, may allow editing of repeating tokens
|
||||
* (in one group) but include other marked positions (in another group) all in the
|
||||
* same template with the same color.
|
||||
*
|
||||
* Undo
|
||||
* --
|
||||
* Undo/Redo works by storing
|
||||
@ -174,7 +163,6 @@ void BKE_text_free(Text *text)
|
||||
}
|
||||
|
||||
BLI_freelistN(&text->lines);
|
||||
BLI_freelistN(&text->markers);
|
||||
|
||||
if (text->name) MEM_freeN(text->name);
|
||||
MEM_freeN(text->undo_buf);
|
||||
@ -202,7 +190,6 @@ Text *BKE_text_add(const char *name)
|
||||
ta->flags |= TXT_TABSTOSPACES;
|
||||
|
||||
ta->lines.first = ta->lines.last = NULL;
|
||||
ta->markers.first = ta->markers.last = NULL;
|
||||
|
||||
tmp = (TextLine *) MEM_mallocN(sizeof(TextLine), "textline");
|
||||
tmp->line = (char *) MEM_mallocN(1, "textline_string");
|
||||
@ -398,7 +385,6 @@ Text *BKE_text_load(const char *file, const char *relpath)
|
||||
ta->id.us = 1;
|
||||
|
||||
ta->lines.first = ta->lines.last = NULL;
|
||||
ta->markers.first = ta->markers.last = NULL;
|
||||
ta->curl = ta->sell = NULL;
|
||||
|
||||
if ((U.flag & USER_TXT_TABSTOSPACES_DISABLE) == 0)
|
||||
@ -495,7 +481,6 @@ Text *BKE_text_copy(Text *ta)
|
||||
tan->flags = ta->flags | TXT_ISDIRTY;
|
||||
|
||||
tan->lines.first = tan->lines.last = NULL;
|
||||
tan->markers.first = tan->markers.last = NULL;
|
||||
tan->curl = tan->sell = NULL;
|
||||
|
||||
tan->nlines = ta->nlines;
|
||||
@ -1150,9 +1135,7 @@ int txt_has_sel(Text *text)
|
||||
static void txt_delete_sel(Text *text)
|
||||
{
|
||||
TextLine *tmpl;
|
||||
TextMarker *mrk;
|
||||
char *buf;
|
||||
int move, lineno;
|
||||
|
||||
if (!text) return;
|
||||
if (!text->curl) return;
|
||||
@ -1169,28 +1152,6 @@ 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, 0);
|
||||
move = txt_get_span(text->curl, text->sell);
|
||||
}
|
||||
else {
|
||||
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, 0);
|
||||
move = 0;
|
||||
}
|
||||
|
||||
mrk = txt_find_marker_region(text, text->sell, text->selc - 1, text->sell->len, 0, 0);
|
||||
if (mrk) {
|
||||
lineno = mrk->lineno;
|
||||
do {
|
||||
mrk->lineno -= move;
|
||||
if (mrk->start > text->curc) mrk->start -= text->selc - text->curc;
|
||||
mrk->end -= text->selc - text->curc;
|
||||
mrk = mrk->next;
|
||||
} while (mrk && mrk->lineno == lineno);
|
||||
}
|
||||
|
||||
strncpy(buf, text->curl->line, text->curc);
|
||||
strcpy(buf + text->curc, text->sell->line + text->selc);
|
||||
@ -1419,19 +1380,9 @@ char *txt_sel_to_buf(Text *text)
|
||||
return buf;
|
||||
}
|
||||
|
||||
static void txt_shift_markers(Text *text, int lineno, int count)
|
||||
{
|
||||
TextMarker *marker;
|
||||
|
||||
for (marker = text->markers.first; marker; marker = marker->next)
|
||||
if (marker->lineno >= lineno) {
|
||||
marker->lineno += count;
|
||||
}
|
||||
}
|
||||
|
||||
void txt_insert_buf(Text *text, const char *in_buffer)
|
||||
{
|
||||
int l = 0, u, len, lineno = -1, count = 0;
|
||||
int l = 0, u, len;
|
||||
size_t i = 0, j;
|
||||
TextLine *add;
|
||||
char *buffer;
|
||||
@ -1458,9 +1409,6 @@ void txt_insert_buf(Text *text, const char *in_buffer)
|
||||
else { undoing = u; MEM_freeN(buffer); return; }
|
||||
i++;
|
||||
|
||||
/* Read as many full lines as we can */
|
||||
lineno = txt_get_span(text->lines.first, text->curl);
|
||||
|
||||
while (i < len) {
|
||||
l = 0;
|
||||
|
||||
@ -1472,14 +1420,8 @@ void txt_insert_buf(Text *text, const char *in_buffer)
|
||||
add = txt_new_linen(buffer + (i - l), l);
|
||||
BLI_insertlinkbefore(&text->lines, text->curl, add);
|
||||
i++;
|
||||
count++;
|
||||
}
|
||||
else {
|
||||
if (count) {
|
||||
txt_shift_markers(text, lineno, count);
|
||||
count = 0;
|
||||
}
|
||||
|
||||
for (j = i - l; j < i && j < len; )
|
||||
txt_add_raw_char(text, BLI_str_utf8_as_unicode_step(buffer, &j));
|
||||
break;
|
||||
@ -1488,10 +1430,6 @@ void txt_insert_buf(Text *text, const char *in_buffer)
|
||||
|
||||
MEM_freeN(buffer);
|
||||
|
||||
if (count) {
|
||||
txt_shift_markers(text, lineno, count);
|
||||
}
|
||||
|
||||
undoing = u;
|
||||
}
|
||||
|
||||
@ -2324,31 +2262,13 @@ void txt_do_redo(Text *text)
|
||||
void txt_split_curline(Text *text)
|
||||
{
|
||||
TextLine *ins;
|
||||
TextMarker *mrk;
|
||||
char *left, *right;
|
||||
int lineno = -1;
|
||||
|
||||
if (!text) return;
|
||||
if (!text->curl) return;
|
||||
|
||||
txt_delete_sel(text);
|
||||
|
||||
/* Move markers */
|
||||
|
||||
lineno = txt_get_span(text->lines.first, text->curl);
|
||||
mrk = text->markers.first;
|
||||
while (mrk) {
|
||||
if (mrk->lineno == lineno && mrk->start > text->curc) {
|
||||
mrk->lineno++;
|
||||
mrk->start -= text->curc;
|
||||
mrk->end -= text->curc;
|
||||
}
|
||||
else if (mrk->lineno > lineno) {
|
||||
mrk->lineno++;
|
||||
}
|
||||
mrk = mrk->next;
|
||||
}
|
||||
|
||||
/* Make the two half strings */
|
||||
|
||||
left = MEM_mallocN(text->curc + 1, "textline_string");
|
||||
@ -2385,25 +2305,9 @@ void txt_split_curline(Text *text)
|
||||
|
||||
static void txt_delete_line(Text *text, TextLine *line)
|
||||
{
|
||||
TextMarker *mrk = NULL, *nxt;
|
||||
|
||||
if (!text) return;
|
||||
if (!text->curl) return;
|
||||
|
||||
/* warning, this can be _slow_ when deleting many lines! */
|
||||
if ((mrk = text->markers.first)) {
|
||||
int lineno = txt_get_span(text->lines.first, line);
|
||||
mrk = text->markers.first;
|
||||
while (mrk) {
|
||||
nxt = mrk->next;
|
||||
if (mrk->lineno == lineno)
|
||||
BLI_freelinkN(&text->markers, mrk);
|
||||
else if (mrk->lineno > lineno)
|
||||
mrk->lineno--;
|
||||
mrk = nxt;
|
||||
}
|
||||
}
|
||||
|
||||
BLI_remlink(&text->lines, line);
|
||||
|
||||
if (line->line) MEM_freeN(line->line);
|
||||
@ -2418,27 +2322,11 @@ static void txt_delete_line(Text *text, TextLine *line)
|
||||
static void txt_combine_lines(Text *text, TextLine *linea, TextLine *lineb)
|
||||
{
|
||||
char *tmp;
|
||||
TextMarker *mrk = NULL;
|
||||
|
||||
if (!text) return;
|
||||
|
||||
if (!linea || !lineb) return;
|
||||
|
||||
mrk = txt_find_marker_region(text, lineb, 0, lineb->len, 0, 0);
|
||||
if (mrk) {
|
||||
int lineno;
|
||||
lineno = mrk->lineno;
|
||||
do {
|
||||
mrk->lineno--;
|
||||
mrk->start += linea->len;
|
||||
mrk->end += linea->len;
|
||||
mrk = mrk->next;
|
||||
} while (mrk && mrk->lineno == lineno);
|
||||
}
|
||||
#if 0 /* UNUSED */
|
||||
if (lineno == -1)
|
||||
lineno = txt_get_span(text->lines.first, lineb);
|
||||
#endif
|
||||
|
||||
tmp = MEM_mallocN(linea->len + lineb->len + 1, "textline_string");
|
||||
|
||||
@ -2492,27 +2380,7 @@ void txt_delete_char(Text *text)
|
||||
}
|
||||
else { /* Just deleting a char */
|
||||
size_t c_len = 0;
|
||||
TextMarker *mrk;
|
||||
c = BLI_str_utf8_as_unicode_and_size(text->curl->line + text->curc, &c_len);
|
||||
|
||||
mrk = txt_find_marker_region(text, text->curl, text->curc - c_len, text->curl->len, 0, 0);
|
||||
if (mrk) {
|
||||
int lineno = mrk->lineno;
|
||||
if (mrk->end == text->curc) {
|
||||
if ((mrk->flags & TMARK_TEMP) && !(mrk->flags & TMARK_EDITALL)) {
|
||||
txt_clear_markers(text, mrk->group, TMARK_TEMP);
|
||||
}
|
||||
else {
|
||||
BLI_freelinkN(&text->markers, mrk);
|
||||
}
|
||||
return;
|
||||
}
|
||||
do {
|
||||
if (mrk->start > text->curc) mrk->start -= c_len;
|
||||
mrk->end -= c_len;
|
||||
mrk = mrk->next;
|
||||
} while (mrk && mrk->lineno == lineno);
|
||||
}
|
||||
|
||||
memmove(text->curl->line + text->curc, text->curl->line + text->curc + c_len, text->curl->len - text->curc - c_len + 1);
|
||||
|
||||
@ -2556,28 +2424,8 @@ void txt_backspace_char(Text *text)
|
||||
}
|
||||
else { /* Just backspacing a char */
|
||||
size_t c_len = 0;
|
||||
TextMarker *mrk;
|
||||
char *prev = BLI_str_prev_char_utf8(text->curl->line + text->curc);
|
||||
c = BLI_str_utf8_as_unicode_and_size(prev, &c_len);
|
||||
|
||||
mrk = txt_find_marker_region(text, text->curl, text->curc - c_len, text->curl->len, 0, 0);
|
||||
if (mrk) {
|
||||
int lineno = mrk->lineno;
|
||||
if (mrk->start == text->curc) {
|
||||
if ((mrk->flags & TMARK_TEMP) && !(mrk->flags & TMARK_EDITALL)) {
|
||||
txt_clear_markers(text, mrk->group, TMARK_TEMP);
|
||||
}
|
||||
else {
|
||||
BLI_freelinkN(&text->markers, mrk);
|
||||
}
|
||||
return;
|
||||
}
|
||||
do {
|
||||
if (mrk->start > text->curc - c_len) mrk->start -= c_len;
|
||||
mrk->end -= c_len;
|
||||
mrk = mrk->next;
|
||||
} while (mrk && mrk->lineno == lineno);
|
||||
}
|
||||
|
||||
/* source and destination overlap, don't use memcpy() */
|
||||
memmove(text->curl->line + text->curc - c_len,
|
||||
@ -2619,9 +2467,7 @@ static void txt_convert_tab_to_spaces(Text *text)
|
||||
|
||||
static int txt_add_char_intern(Text *text, unsigned int add, int replace_tabs)
|
||||
{
|
||||
int lineno;
|
||||
char *tmp, ch[BLI_UTF8_MAX];
|
||||
TextMarker *mrk;
|
||||
size_t add_len;
|
||||
|
||||
if (!text) return 0;
|
||||
@ -2643,15 +2489,6 @@ static int txt_add_char_intern(Text *text, unsigned int add, int replace_tabs)
|
||||
if (!undoing) txt_undo_add_charop(text, UNDO_INSERT_1, add);
|
||||
|
||||
add_len = BLI_str_utf8_from_unicode(add, ch);
|
||||
mrk = txt_find_marker_region(text, text->curl, text->curc - 1, text->curl->len, 0, 0);
|
||||
if (mrk) {
|
||||
lineno = mrk->lineno;
|
||||
do {
|
||||
if (mrk->start > text->curc) mrk->start += add_len;
|
||||
mrk->end += add_len;
|
||||
mrk = mrk->next;
|
||||
} while (mrk && mrk->lineno == lineno);
|
||||
}
|
||||
|
||||
tmp = MEM_mallocN(text->curl->len + add_len + 1, "textline_string");
|
||||
|
||||
@ -2698,10 +2535,7 @@ int txt_replace_char(Text *text, unsigned int add)
|
||||
|
||||
/* If text is selected or we're at the end of the line just use txt_add_char */
|
||||
if (text->curc == text->curl->len || txt_has_sel(text) || add == '\n') {
|
||||
int i = txt_add_char(text, add);
|
||||
TextMarker *mrk = txt_find_marker(text, text->curl, text->curc, 0, 0);
|
||||
if (mrk) BLI_freelinkN(&text->markers, mrk);
|
||||
return i;
|
||||
return txt_add_char(text, add);
|
||||
}
|
||||
|
||||
del = BLI_str_utf8_as_unicode_and_size(text->curl->line + text->curc, &del_size);
|
||||
@ -3039,157 +2873,6 @@ int setcurr_tab_spaces(Text *text, int space)
|
||||
return i;
|
||||
}
|
||||
|
||||
/*********************************/
|
||||
/* Text marker utility functions */
|
||||
/*********************************/
|
||||
|
||||
/* Creates and adds a marker to the list maintaining sorted order */
|
||||
void txt_add_marker(Text *text, TextLine *line, int start, int end, const unsigned char color[4], int group, int flags)
|
||||
{
|
||||
TextMarker *tmp, *marker;
|
||||
|
||||
marker = MEM_mallocN(sizeof(TextMarker), "text_marker");
|
||||
|
||||
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->color[0] = color[0];
|
||||
marker->color[1] = color[1];
|
||||
marker->color[2] = color[2];
|
||||
marker->color[3] = color[3];
|
||||
|
||||
for (tmp = text->markers.last; tmp; tmp = tmp->prev)
|
||||
if (tmp->lineno < marker->lineno || (tmp->lineno == marker->lineno && tmp->start < marker->start))
|
||||
break;
|
||||
|
||||
if (tmp) BLI_insertlinkafter(&text->markers, tmp, marker);
|
||||
else BLI_addhead(&text->markers, marker);
|
||||
}
|
||||
|
||||
/* 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 (group && marker->group != group) continue;
|
||||
else if ((marker->flags & flags) != flags) continue;
|
||||
else if (marker->lineno < lineno) continue;
|
||||
else if (marker->lineno > lineno) break;
|
||||
|
||||
if ((marker->start == marker->end && start <= marker->start && marker->start <= end) ||
|
||||
(marker->start < end && marker->end > start))
|
||||
{
|
||||
return marker;
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* 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;
|
||||
|
||||
for (marker = text->markers.first; marker; marker = next) {
|
||||
next = marker->next;
|
||||
|
||||
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;
|
||||
|
||||
if ((marker->start == marker->end && start <= marker->start && marker->start <= end) ||
|
||||
(marker->start < end && marker->end > start))
|
||||
{
|
||||
BLI_freelinkN(&text->markers, marker);
|
||||
cleared = 1;
|
||||
}
|
||||
}
|
||||
return cleared;
|
||||
}
|
||||
|
||||
/* 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 ((!group || marker->group == group) &&
|
||||
(marker->flags & flags) == flags)
|
||||
{
|
||||
BLI_freelinkN(&text->markers, marker);
|
||||
cleared = 1;
|
||||
}
|
||||
}
|
||||
return cleared;
|
||||
}
|
||||
|
||||
/* Finds the marker at the specified line and cursor position with at least the
|
||||
* 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 (group && marker->group != group) continue;
|
||||
else if ((marker->flags & flags) != flags) continue;
|
||||
else if (marker->lineno < lineno) continue;
|
||||
else if (marker->lineno > lineno) break;
|
||||
|
||||
if (marker->start <= curs && curs <= marker->end)
|
||||
return marker;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/* 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->group == marker->group)
|
||||
return tmp;
|
||||
}
|
||||
return NULL; /* Only if (marker == NULL) */
|
||||
}
|
||||
|
||||
/* 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->group == marker->group)
|
||||
return tmp;
|
||||
}
|
||||
return NULL; /* Only if (marker == NULL) */
|
||||
}
|
||||
|
||||
|
||||
/*******************************/
|
||||
/* Character utility functions */
|
||||
/*******************************/
|
||||
|
@ -2983,7 +2983,6 @@ static void direct_link_text(FileData *fd, Text *text)
|
||||
#endif
|
||||
|
||||
link_list(fd, &text->lines);
|
||||
link_list(fd, &text->markers);
|
||||
|
||||
text->curl = newdataadr(fd, text->curl);
|
||||
text->sell = newdataadr(fd, text->sell);
|
||||
|
@ -2607,7 +2607,6 @@ static void write_texts(WriteData *wd, ListBase *idbase)
|
||||
{
|
||||
Text *text;
|
||||
TextLine *tmp;
|
||||
TextMarker *mrk;
|
||||
|
||||
text= idbase->first;
|
||||
while (text) {
|
||||
@ -2631,13 +2630,6 @@ static void write_texts(WriteData *wd, ListBase *idbase)
|
||||
writedata(wd, DATA, tmp->len+1, tmp->line);
|
||||
tmp= tmp->next;
|
||||
}
|
||||
|
||||
/* write markers */
|
||||
mrk= text->markers.first;
|
||||
while (mrk) {
|
||||
writestruct(wd, DATA, "TextMarker", 1, mrk);
|
||||
mrk= mrk->next;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -196,10 +196,6 @@ static void text_operatortypes(void)
|
||||
WM_operatortype_append(TEXT_OT_unindent);
|
||||
WM_operatortype_append(TEXT_OT_indent);
|
||||
|
||||
WM_operatortype_append(TEXT_OT_markers_clear);
|
||||
WM_operatortype_append(TEXT_OT_next_marker);
|
||||
WM_operatortype_append(TEXT_OT_previous_marker);
|
||||
|
||||
WM_operatortype_append(TEXT_OT_select_line);
|
||||
WM_operatortype_append(TEXT_OT_select_all);
|
||||
WM_operatortype_append(TEXT_OT_select_word);
|
||||
@ -227,7 +223,6 @@ static void text_operatortypes(void)
|
||||
WM_operatortype_append(TEXT_OT_find_set_selected);
|
||||
WM_operatortype_append(TEXT_OT_replace);
|
||||
WM_operatortype_append(TEXT_OT_replace_set_selected);
|
||||
WM_operatortype_append(TEXT_OT_mark_all);
|
||||
|
||||
WM_operatortype_append(TEXT_OT_to_3d_object);
|
||||
|
||||
|
@ -1070,40 +1070,6 @@ int text_get_total_lines(SpaceText *st, ARegion *ar)
|
||||
return drawcache->total_lines;
|
||||
}
|
||||
|
||||
/* Move pointer to first visible line (top) */
|
||||
static TextLine *first_visible_line(SpaceText *st, ARegion *ar, int *wrap_top)
|
||||
{
|
||||
Text *text = st->text;
|
||||
TextLine *pline = text->lines.first;
|
||||
int i = st->top, lineno = 0;
|
||||
|
||||
text_update_drawcache(st, ar);
|
||||
|
||||
if (wrap_top) *wrap_top = 0;
|
||||
|
||||
if (st->wordwrap) {
|
||||
while (i > 0 && pline) {
|
||||
int lines = text_get_visible_lines_no(st, lineno);
|
||||
|
||||
if (i - lines < 0) {
|
||||
if (wrap_top) *wrap_top = i;
|
||||
break;
|
||||
}
|
||||
else {
|
||||
pline = pline->next;
|
||||
i -= lines;
|
||||
lineno++;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
for (i = st->top; pline->next && i > 0; i--)
|
||||
pline = pline->next;
|
||||
}
|
||||
|
||||
return pline;
|
||||
}
|
||||
|
||||
/************************ draw scrollbar *****************************/
|
||||
|
||||
static void calc_text_rcts(SpaceText *st, ARegion *ar, rcti *scroll, rcti *back)
|
||||
@ -1241,90 +1207,6 @@ static void draw_textscroll(SpaceText *st, rcti *scroll, rcti *back)
|
||||
glDisable(GL_BLEND);
|
||||
}
|
||||
|
||||
/************************** draw markers **************************/
|
||||
|
||||
static void draw_markers(SpaceText *st, ARegion *ar)
|
||||
{
|
||||
Text *text = st->text;
|
||||
TextMarker *marker, *next;
|
||||
TextLine *top, *line;
|
||||
int offl, offc, i, x1, x2, y1, y2, x, y;
|
||||
int topi, topy;
|
||||
|
||||
/* Move pointer to first visible line (top) */
|
||||
top = first_visible_line(st, ar, NULL);
|
||||
topi = BLI_findindex(&text->lines, top);
|
||||
|
||||
topy = txt_get_span(text->lines.first, top);
|
||||
|
||||
for (marker = text->markers.first; marker; marker = next) {
|
||||
next = marker->next;
|
||||
|
||||
/* invisible line (before top) */
|
||||
if (marker->lineno < topi) continue;
|
||||
|
||||
line = BLI_findlink(&text->lines, marker->lineno);
|
||||
|
||||
/* Remove broken markers */
|
||||
if (marker->end > line->len || marker->start > marker->end) {
|
||||
BLI_freelinkN(&text->markers, marker);
|
||||
continue;
|
||||
}
|
||||
|
||||
wrap_offset(st, ar, line, marker->start, &offl, &offc);
|
||||
y1 = txt_get_span(top, line) - st->top + offl + topy;
|
||||
x1 = text_get_char_pos(st, line->line, marker->start) - st->left + offc;
|
||||
|
||||
wrap_offset(st, ar, line, marker->end, &offl, &offc);
|
||||
y2 = txt_get_span(top, line) - st->top + offl + topy;
|
||||
x2 = text_get_char_pos(st, line->line, marker->end) - st->left + offc;
|
||||
|
||||
/* invisible part of line (before top, after last visible line) */
|
||||
if (y2 < 0 || y1 > st->top + st->viewlines) continue;
|
||||
|
||||
glColor3ubv(marker->color);
|
||||
x = st->showlinenrs ? TXT_OFFSET + TEXTXLOC : TXT_OFFSET;
|
||||
y = ar->winy - 3;
|
||||
|
||||
if (y1 == y2) {
|
||||
y -= y1 * st->lheight;
|
||||
glBegin(GL_LINE_LOOP);
|
||||
glVertex2i(x + x2 * st->cwidth + 1, y);
|
||||
glVertex2i(x + x1 * st->cwidth - 2, y);
|
||||
glVertex2i(x + x1 * st->cwidth - 2, y - st->lheight);
|
||||
glVertex2i(x + x2 * st->cwidth + 1, y - st->lheight);
|
||||
glEnd();
|
||||
}
|
||||
else {
|
||||
y -= y1 * st->lheight;
|
||||
glBegin(GL_LINE_STRIP);
|
||||
glVertex2i(ar->winx, y);
|
||||
glVertex2i(x + x1 * st->cwidth - 2, y);
|
||||
glVertex2i(x + x1 * st->cwidth - 2, y - st->lheight);
|
||||
glVertex2i(ar->winx, y - st->lheight);
|
||||
glEnd();
|
||||
y -= st->lheight;
|
||||
|
||||
for (i = y1 + 1; i < y2; i++) {
|
||||
glBegin(GL_LINES);
|
||||
glVertex2i(x, y);
|
||||
glVertex2i(ar->winx, y);
|
||||
glVertex2i(x, y - st->lheight);
|
||||
glVertex2i(ar->winx, y - st->lheight);
|
||||
glEnd();
|
||||
y -= st->lheight;
|
||||
}
|
||||
|
||||
glBegin(GL_LINE_STRIP);
|
||||
glVertex2i(x, y);
|
||||
glVertex2i(x + x2 * st->cwidth + 1, y);
|
||||
glVertex2i(x + x2 * st->cwidth + 1, y - st->lheight);
|
||||
glVertex2i(x, y - st->lheight);
|
||||
glEnd();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/*********************** draw documentation *******************************/
|
||||
|
||||
static void draw_documentation(SpaceText *st, ARegion *ar)
|
||||
@ -1860,7 +1742,6 @@ void draw_text_main(SpaceText *st, ARegion *ar)
|
||||
|
||||
/* draw other stuff */
|
||||
draw_brackets(st, ar);
|
||||
draw_markers(st, ar);
|
||||
glTranslatef(GLA_PIXEL_OFS, GLA_PIXEL_OFS, 0.0f); /* XXX scroll requires exact pixel space */
|
||||
draw_textscroll(st, &scroll, &back);
|
||||
draw_documentation(st, ar);
|
||||
|
@ -69,9 +69,6 @@ void text_update_cursor_moved(struct bContext *C);
|
||||
#define TOOL_SUGG_LIST 0x01
|
||||
#define TOOL_DOCUMENT 0x02
|
||||
|
||||
#define TMARK_GRP_CUSTOM 0x00010000 /* Lower 2 bytes used for Python groups */
|
||||
#define TMARK_GRP_FINDALL 0x00020000
|
||||
|
||||
typedef struct FlattenString {
|
||||
char fixedbuf[256];
|
||||
int fixedaccum[256];
|
||||
@ -130,10 +127,6 @@ void TEXT_OT_indent(struct wmOperatorType *ot);
|
||||
void TEXT_OT_line_break(struct wmOperatorType *ot);
|
||||
void TEXT_OT_insert(struct wmOperatorType *ot);
|
||||
|
||||
void TEXT_OT_markers_clear(struct wmOperatorType *ot);
|
||||
void TEXT_OT_next_marker(struct wmOperatorType *ot);
|
||||
void TEXT_OT_previous_marker(struct wmOperatorType *ot);
|
||||
|
||||
void TEXT_OT_select_line(struct wmOperatorType *ot);
|
||||
void TEXT_OT_select_all(struct wmOperatorType *ot);
|
||||
void TEXT_OT_select_word(struct wmOperatorType *ot);
|
||||
@ -158,7 +151,6 @@ void TEXT_OT_find(struct wmOperatorType *ot);
|
||||
void TEXT_OT_find_set_selected(struct wmOperatorType *ot);
|
||||
void TEXT_OT_replace(struct wmOperatorType *ot);
|
||||
void TEXT_OT_replace_set_selected(struct wmOperatorType *ot);
|
||||
void TEXT_OT_mark_all(struct wmOperatorType *ot);
|
||||
|
||||
void TEXT_OT_to_3d_object(struct wmOperatorType *ot);
|
||||
|
||||
|
@ -1377,104 +1377,6 @@ void TEXT_OT_move_lines(wmOperatorType *ot)
|
||||
RNA_def_enum(ot->srna, "direction", direction_items, 1, "Direction", "");
|
||||
}
|
||||
|
||||
/******************* previous marker operator *********************/
|
||||
|
||||
static int text_previous_marker_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
Text *text = CTX_data_edit_text(C);
|
||||
TextMarker *mrk;
|
||||
int lineno;
|
||||
|
||||
lineno = txt_get_span(text->lines.first, text->curl);
|
||||
mrk = text->markers.last;
|
||||
while (mrk && (mrk->lineno > lineno || (mrk->lineno == lineno && mrk->end > text->curc)))
|
||||
mrk = mrk->prev;
|
||||
if (!mrk) mrk = text->markers.last;
|
||||
if (mrk) {
|
||||
txt_move_to(text, mrk->lineno, mrk->start, 0);
|
||||
txt_move_to(text, mrk->lineno, mrk->end, 1);
|
||||
}
|
||||
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | NA_EDITED, text);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void TEXT_OT_previous_marker(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
ot->name = "Previous Marker";
|
||||
ot->idname = "TEXT_OT_previous_marker";
|
||||
ot->description = "Move to previous marker";
|
||||
|
||||
/* api callbacks */
|
||||
ot->exec = text_previous_marker_exec;
|
||||
ot->poll = text_edit_poll;
|
||||
}
|
||||
|
||||
/******************* next marker operator *********************/
|
||||
|
||||
static int text_next_marker_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
Text *text = CTX_data_edit_text(C);
|
||||
TextMarker *mrk;
|
||||
int lineno;
|
||||
|
||||
lineno = txt_get_span(text->lines.first, text->curl);
|
||||
mrk = text->markers.first;
|
||||
while (mrk && (mrk->lineno < lineno || (mrk->lineno == lineno && mrk->start <= text->curc)))
|
||||
mrk = mrk->next;
|
||||
if (!mrk) mrk = text->markers.first;
|
||||
if (mrk) {
|
||||
txt_move_to(text, mrk->lineno, mrk->start, 0);
|
||||
txt_move_to(text, mrk->lineno, mrk->end, 1);
|
||||
}
|
||||
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | NA_EDITED, text);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void TEXT_OT_next_marker(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
ot->name = "Next Marker";
|
||||
ot->idname = "TEXT_OT_next_marker";
|
||||
ot->description = "Move to next marker";
|
||||
|
||||
/* api callbacks */
|
||||
ot->exec = text_next_marker_exec;
|
||||
ot->poll = text_edit_poll;
|
||||
}
|
||||
|
||||
/******************* clear all markers operator *********************/
|
||||
|
||||
static int text_clear_all_markers_exec(bContext *C, wmOperator *UNUSED(op))
|
||||
{
|
||||
Text *text = CTX_data_edit_text(C);
|
||||
|
||||
txt_clear_markers(text, 0, 0);
|
||||
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | NA_EDITED, text);
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
|
||||
void TEXT_OT_markers_clear(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
ot->name = "Clear All Markers";
|
||||
ot->idname = "TEXT_OT_markers_clear";
|
||||
ot->description = "Clear all markers";
|
||||
|
||||
/* api callbacks */
|
||||
ot->exec = text_clear_all_markers_exec;
|
||||
ot->poll = text_edit_poll;
|
||||
}
|
||||
|
||||
/************************ move operator ************************/
|
||||
|
||||
static EnumPropertyItem move_type_items[] = {
|
||||
@ -2956,14 +2858,13 @@ void TEXT_OT_insert(wmOperatorType *ot)
|
||||
/* mode */
|
||||
#define TEXT_FIND 0
|
||||
#define TEXT_REPLACE 1
|
||||
#define TEXT_MARK_ALL 2
|
||||
|
||||
static int text_find_and_replace(bContext *C, wmOperator *op, short mode)
|
||||
{
|
||||
Main *bmain = CTX_data_main(C);
|
||||
SpaceText *st = CTX_wm_space_text(C);
|
||||
Text *start = NULL, *text = st->text;
|
||||
int flags, first = 1;
|
||||
Text *text = st->text;
|
||||
int flags;
|
||||
int found = 0;
|
||||
char *tmp;
|
||||
|
||||
@ -2972,79 +2873,48 @@ static int text_find_and_replace(bContext *C, wmOperator *op, short mode)
|
||||
|
||||
flags = st->flags;
|
||||
if (flags & ST_FIND_ALL)
|
||||
flags ^= ST_FIND_WRAP;
|
||||
flags &= ~ST_FIND_WRAP;
|
||||
|
||||
do {
|
||||
int proceed = 0;
|
||||
/* Replace current */
|
||||
if (mode != TEXT_FIND && txt_has_sel(text)) {
|
||||
tmp = txt_sel_to_buf(text);
|
||||
|
||||
if (first) {
|
||||
if (text->markers.first)
|
||||
if (flags & ST_MATCH_CASE) found = strcmp(st->findstr, tmp) == 0;
|
||||
else found = BLI_strcasecmp(st->findstr, tmp) == 0;
|
||||
|
||||
if (found) {
|
||||
if (mode == TEXT_REPLACE) {
|
||||
txt_insert_buf(text, st->replacestr);
|
||||
if (text->curl && text->curl->format) {
|
||||
MEM_freeN(text->curl->format);
|
||||
text->curl->format = NULL;
|
||||
}
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | NA_EDITED, text);
|
||||
|
||||
txt_clear_markers(text, TMARK_GRP_FINDALL, 0);
|
||||
}
|
||||
|
||||
first = 0;
|
||||
|
||||
/* Replace current */
|
||||
if (mode != TEXT_FIND && txt_has_sel(text)) {
|
||||
tmp = txt_sel_to_buf(text);
|
||||
|
||||
if (flags & ST_MATCH_CASE) proceed = strcmp(st->findstr, tmp) == 0;
|
||||
else proceed = BLI_strcasecmp(st->findstr, tmp) == 0;
|
||||
|
||||
if (proceed) {
|
||||
if (mode == TEXT_REPLACE) {
|
||||
txt_insert_buf(text, st->replacestr);
|
||||
if (text->curl && text->curl->format) {
|
||||
MEM_freeN(text->curl->format);
|
||||
text->curl->format = NULL;
|
||||
}
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | NA_EDITED, text);
|
||||
text_drawcache_tag_update(CTX_wm_space_text(C), 1);
|
||||
}
|
||||
else if (mode == TEXT_MARK_ALL) {
|
||||
unsigned char color[4];
|
||||
UI_GetThemeColor4ubv(TH_SHADE2, color);
|
||||
|
||||
if (txt_find_marker(text, text->curl, text->selc, TMARK_GRP_FINDALL, 0)) {
|
||||
if (tmp) MEM_freeN(tmp), tmp = NULL;
|
||||
break;
|
||||
}
|
||||
|
||||
txt_add_marker(text, text->curl, text->curc, text->selc, color, TMARK_GRP_FINDALL, TMARK_EDITALL);
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | NA_EDITED, text);
|
||||
}
|
||||
text_drawcache_tag_update(CTX_wm_space_text(C), 1);
|
||||
}
|
||||
MEM_freeN(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
MEM_freeN(tmp);
|
||||
tmp = NULL;
|
||||
}
|
||||
|
||||
/* Find next */
|
||||
if (txt_find_string(text, st->findstr, flags & ST_FIND_WRAP, flags & ST_MATCH_CASE)) {
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | ND_CURSOR, text);
|
||||
}
|
||||
else if (flags & ST_FIND_ALL) {
|
||||
if (text == start) break;
|
||||
if (!start) start = text;
|
||||
if (text->id.next)
|
||||
text = st->text = text->id.next;
|
||||
else
|
||||
text = st->text = bmain->text.first;
|
||||
txt_move_toline(text, 0, 0);
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | ND_CURSOR, text);
|
||||
first = 1;
|
||||
}
|
||||
else {
|
||||
if (!found && !proceed) BKE_reportf(op->reports, RPT_ERROR, "Text not found: %s", st->findstr);
|
||||
break;
|
||||
}
|
||||
found = 1;
|
||||
} while (mode == TEXT_MARK_ALL);
|
||||
/* Find next */
|
||||
if (txt_find_string(text, st->findstr, flags & ST_FIND_WRAP, flags & ST_MATCH_CASE)) {
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | ND_CURSOR, text);
|
||||
}
|
||||
else if (flags & ST_FIND_ALL) {
|
||||
if (text->id.next)
|
||||
text = st->text = text->id.next;
|
||||
else
|
||||
text = st->text = bmain->text.first;
|
||||
txt_move_toline(text, 0, 0);
|
||||
text_update_cursor_moved(C);
|
||||
WM_event_add_notifier(C, NC_TEXT | ND_CURSOR, text);
|
||||
}
|
||||
else {
|
||||
if (!found) BKE_reportf(op->reports, RPT_ERROR, "Text not found: %s", st->findstr);
|
||||
}
|
||||
|
||||
return OPERATOR_FINISHED;
|
||||
}
|
||||
@ -3085,25 +2955,6 @@ void TEXT_OT_replace(wmOperatorType *ot)
|
||||
ot->poll = text_space_edit_poll;
|
||||
}
|
||||
|
||||
/******************* mark all operator *********************/
|
||||
|
||||
static int text_mark_all_exec(bContext *C, wmOperator *op)
|
||||
{
|
||||
return text_find_and_replace(C, op, TEXT_MARK_ALL);
|
||||
}
|
||||
|
||||
void TEXT_OT_mark_all(wmOperatorType *ot)
|
||||
{
|
||||
/* identifiers */
|
||||
ot->name = "Mark All";
|
||||
ot->idname = "TEXT_OT_mark_all";
|
||||
ot->description = "Mark all specified text";
|
||||
|
||||
/* api callbacks */
|
||||
ot->exec = text_mark_all_exec;
|
||||
ot->poll = text_space_edit_poll;
|
||||
}
|
||||
|
||||
/******************* find set selected *********************/
|
||||
|
||||
static int text_find_set_selected_exec(bContext *C, wmOperator *op)
|
||||
|
@ -359,177 +359,3 @@ static short UNUSED_FUNCTION(do_texttools) (SpaceText * st, char ascii, unsigned
|
||||
|
||||
return swallow;
|
||||
}
|
||||
|
||||
static short UNUSED_FUNCTION(do_textmarkers) (SpaceText * st, char ascii, unsigned short evnt, short val)
|
||||
{
|
||||
Text *text;
|
||||
TextMarker *marker, *mrk, *nxt;
|
||||
int c, s, draw = 0, swallow = 0;
|
||||
int qual = 0; // XXX
|
||||
|
||||
text = st->text;
|
||||
if (!text || text->id.lib || text->curl != text->sell) return 0;
|
||||
|
||||
marker = txt_find_marker(text, text->sell, text->selc, 0, 0);
|
||||
if (marker && (marker->start > text->curc || marker->end < text->curc))
|
||||
marker = NULL;
|
||||
|
||||
if (!marker) {
|
||||
/* Find the next temporary marker */
|
||||
if (evnt == TABKEY) {
|
||||
int lineno = txt_get_span(text->lines.first, text->curl);
|
||||
mrk = text->markers.first;
|
||||
while (mrk) {
|
||||
if (!marker && (mrk->flags & TMARK_TEMP)) marker = mrk;
|
||||
if ((mrk->flags & TMARK_TEMP) && (mrk->lineno > lineno || (mrk->lineno == lineno && mrk->end > text->curc))) {
|
||||
marker = mrk;
|
||||
break;
|
||||
}
|
||||
mrk = mrk->next;
|
||||
}
|
||||
if (marker) {
|
||||
txt_move_to(text, marker->lineno, marker->start, 0);
|
||||
txt_move_to(text, marker->lineno, marker->end, 1);
|
||||
// XXX text_update_cursor_moved(C);
|
||||
// XXX WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, text);
|
||||
evnt = ascii = val = 0;
|
||||
draw = 1;
|
||||
swallow = 1;
|
||||
}
|
||||
}
|
||||
else if (evnt == ESCKEY) {
|
||||
if (txt_clear_markers(text, 0, TMARK_TEMP)) swallow = 1;
|
||||
else if (txt_clear_markers(text, 0, 0)) swallow = 1;
|
||||
else return 0;
|
||||
evnt = ascii = val = 0;
|
||||
draw = 1;
|
||||
}
|
||||
if (!swallow) return 0;
|
||||
}
|
||||
|
||||
if (ascii) {
|
||||
if (marker->flags & TMARK_EDITALL) {
|
||||
c = text->curc - marker->start;
|
||||
s = text->selc - marker->start;
|
||||
if (s < 0 || s > marker->end - marker->start) return 0;
|
||||
|
||||
mrk = txt_next_marker(text, marker);
|
||||
while (mrk) {
|
||||
nxt = txt_next_marker(text, mrk); /* mrk may become invalid */
|
||||
txt_move_to(text, mrk->lineno, mrk->start + c, 0);
|
||||
if (s != c) txt_move_to(text, mrk->lineno, mrk->start + s, 1);
|
||||
if (st->overwrite) {
|
||||
if (txt_replace_char(text, ascii))
|
||||
text_update_line_edited(st->text->curl);
|
||||
}
|
||||
else {
|
||||
if (txt_add_char(text, ascii)) {
|
||||
text_update_line_edited(st->text->curl);
|
||||
}
|
||||
}
|
||||
|
||||
if (mrk == marker || mrk == nxt) break;
|
||||
mrk = nxt;
|
||||
}
|
||||
swallow = 1;
|
||||
draw = 1;
|
||||
}
|
||||
}
|
||||
else if (val) {
|
||||
switch (evnt) {
|
||||
case BACKSPACEKEY:
|
||||
if (marker->flags & TMARK_EDITALL) {
|
||||
c = text->curc - marker->start;
|
||||
s = text->selc - marker->start;
|
||||
if (s < 0 || s > marker->end - marker->start) return 0;
|
||||
|
||||
mrk = txt_next_marker(text, marker);
|
||||
while (mrk) {
|
||||
nxt = txt_next_marker(text, mrk); /* mrk may become invalid */
|
||||
txt_move_to(text, mrk->lineno, mrk->start + c, 0);
|
||||
if (s != c) txt_move_to(text, mrk->lineno, mrk->start + s, 1);
|
||||
txt_backspace_char(text);
|
||||
text_update_line_edited(st->text->curl);
|
||||
if (mrk == marker || mrk == nxt) break;
|
||||
mrk = nxt;
|
||||
}
|
||||
swallow = 1;
|
||||
draw = 1;
|
||||
}
|
||||
break;
|
||||
case DELKEY:
|
||||
if (marker->flags & TMARK_EDITALL) {
|
||||
c = text->curc - marker->start;
|
||||
s = text->selc - marker->start;
|
||||
if (s < 0 || s > marker->end - marker->start) return 0;
|
||||
|
||||
mrk = txt_next_marker(text, marker);
|
||||
while (mrk) {
|
||||
nxt = txt_next_marker(text, mrk); /* mrk may become invalid */
|
||||
txt_move_to(text, mrk->lineno, mrk->start + c, 0);
|
||||
if (s != c) txt_move_to(text, mrk->lineno, mrk->start + s, 1);
|
||||
txt_delete_char(text);
|
||||
text_update_line_edited(st->text->curl);
|
||||
if (mrk == marker || mrk == nxt) break;
|
||||
mrk = nxt;
|
||||
}
|
||||
swallow = 1;
|
||||
draw = 1;
|
||||
}
|
||||
break;
|
||||
case TABKEY:
|
||||
if (qual & LR_SHIFTKEY) {
|
||||
nxt = marker->prev;
|
||||
if (!nxt) nxt = text->markers.last;
|
||||
}
|
||||
else {
|
||||
nxt = marker->next;
|
||||
if (!nxt) nxt = text->markers.first;
|
||||
}
|
||||
if (marker->flags & TMARK_TEMP) {
|
||||
if (nxt == marker) nxt = NULL;
|
||||
BLI_freelinkN(&text->markers, marker);
|
||||
}
|
||||
mrk = nxt;
|
||||
if (mrk) {
|
||||
txt_move_to(text, mrk->lineno, mrk->start, 0);
|
||||
txt_move_to(text, mrk->lineno, mrk->end, 1);
|
||||
// XXX text_update_cursor_moved(C);
|
||||
// XXX WM_event_add_notifier(C, NC_TEXT|ND_CURSOR, text);
|
||||
}
|
||||
swallow = 1;
|
||||
draw = 1;
|
||||
break;
|
||||
|
||||
/* Events that should clear markers */
|
||||
case UKEY: if (!(qual & LR_ALTKEY)) break;
|
||||
case ZKEY: if (evnt == ZKEY && !(qual & LR_CTRLKEY)) break;
|
||||
case RETKEY:
|
||||
case ESCKEY:
|
||||
if (marker->flags & (TMARK_EDITALL | TMARK_TEMP))
|
||||
txt_clear_markers(text, marker->group, 0);
|
||||
else
|
||||
BLI_freelinkN(&text->markers, marker);
|
||||
swallow = 1;
|
||||
draw = 1;
|
||||
break;
|
||||
case RIGHTMOUSE: /* Marker context menu? */
|
||||
case LEFTMOUSE:
|
||||
break;
|
||||
case FKEY: /* Allow find */
|
||||
if (qual & LR_SHIFTKEY) swallow = 1;
|
||||
break;
|
||||
|
||||
default:
|
||||
if (qual != 0 && qual != LR_SHIFTKEY)
|
||||
swallow = 1; /* Swallow all other shortcut events */
|
||||
}
|
||||
}
|
||||
|
||||
if (draw) {
|
||||
// XXX redraw_alltext();
|
||||
}
|
||||
|
||||
return swallow;
|
||||
}
|
||||
|
||||
|
@ -44,15 +44,6 @@ typedef struct TextLine {
|
||||
int len, blen; /* blen unused */
|
||||
} TextLine;
|
||||
|
||||
typedef struct TextMarker {
|
||||
struct TextMarker *next, *prev;
|
||||
|
||||
int lineno, start, end, pad1; /* line number and start/end character indices */
|
||||
|
||||
int group, flags; /* see BKE_text.h for flag defines */
|
||||
unsigned char color[4], pad[4]; /* draw color of the marker */
|
||||
} TextMarker;
|
||||
|
||||
typedef struct Text {
|
||||
ID id;
|
||||
|
||||
@ -63,7 +54,6 @@ typedef struct Text {
|
||||
ListBase lines;
|
||||
TextLine *curl, *sell;
|
||||
int curc, selc;
|
||||
ListBase markers;
|
||||
|
||||
char *undo_buf;
|
||||
int undo_pos, undo_len;
|
||||
|
@ -526,7 +526,6 @@ extern StructRNA RNA_TextBox;
|
||||
extern StructRNA RNA_TextCharacterFormat;
|
||||
extern StructRNA RNA_TextCurve;
|
||||
extern StructRNA RNA_TextLine;
|
||||
extern StructRNA RNA_TextMarker;
|
||||
extern StructRNA RNA_Texture;
|
||||
extern StructRNA RNA_TextureNode;
|
||||
extern StructRNA RNA_TextureNodeBricks;
|
||||
|
@ -129,49 +129,6 @@ static void rna_def_text_line(BlenderRNA *brna)
|
||||
RNA_def_property_update(prop, NC_TEXT | NA_EDITED, NULL);
|
||||
}
|
||||
|
||||
static void rna_def_text_marker(BlenderRNA *brna)
|
||||
{
|
||||
StructRNA *srna;
|
||||
PropertyRNA *prop;
|
||||
|
||||
srna = RNA_def_struct(brna, "TextMarker", NULL);
|
||||
RNA_def_struct_ui_text(srna, "Text Marker", "Marker highlighting a portion of text in a Text datablock");
|
||||
|
||||
prop = RNA_def_property(srna, "line", PROP_INT, PROP_UNSIGNED);
|
||||
RNA_def_property_int_sdna(prop, NULL, "lineno");
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "Line", "Line in which the marker is located");
|
||||
|
||||
prop = RNA_def_property(srna, "character_index_start", PROP_INT, PROP_UNSIGNED);
|
||||
RNA_def_property_int_sdna(prop, NULL, "start");
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "Start", "Start position of the marker in the line");
|
||||
|
||||
prop = RNA_def_property(srna, "character_index_end", PROP_INT, PROP_UNSIGNED);
|
||||
RNA_def_property_int_sdna(prop, NULL, "end");
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "End", "Start position of the marker in the line");
|
||||
|
||||
prop = RNA_def_property(srna, "group", PROP_INT, PROP_UNSIGNED);
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_range(prop, 0, (int)0xFFFF);
|
||||
RNA_def_property_ui_text(prop, "Group", "");
|
||||
|
||||
prop = RNA_def_property(srna, "is_temporary", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flags", TMARK_TEMP);
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "Temporary", "Marker is temporary");
|
||||
|
||||
prop = RNA_def_property(srna, "use_edit_all", PROP_BOOLEAN, PROP_NONE);
|
||||
RNA_def_property_boolean_sdna(prop, NULL, "flags", TMARK_EDITALL);
|
||||
RNA_def_property_clear_flag(prop, PROP_EDITABLE);
|
||||
RNA_def_property_ui_text(prop, "Edit All", "Edit all markers of the same group as one");
|
||||
|
||||
prop = RNA_def_property(srna, "color", PROP_FLOAT, PROP_COLOR_GAMMA);
|
||||
RNA_def_property_range(prop, 0.0f, 1.0f);
|
||||
RNA_def_property_ui_text(prop, "Color", "Color to display the marker with");
|
||||
}
|
||||
|
||||
static void rna_def_text(BlenderRNA *brna)
|
||||
{
|
||||
StructRNA *srna;
|
||||
@ -241,17 +198,12 @@ static void rna_def_text(BlenderRNA *brna)
|
||||
RNA_def_property_ui_text(prop, "Selection End Character",
|
||||
"Index of character after end of selection in the selection end line");
|
||||
|
||||
prop = RNA_def_property(srna, "markers", PROP_COLLECTION, PROP_NONE);
|
||||
RNA_def_property_struct_type(prop, "TextMarker");
|
||||
RNA_def_property_ui_text(prop, "Markers", "Text markers highlighting part of the text");
|
||||
|
||||
RNA_api_text(srna);
|
||||
}
|
||||
|
||||
void RNA_def_text(BlenderRNA *brna)
|
||||
{
|
||||
rna_def_text_line(brna);
|
||||
rna_def_text_marker(brna);
|
||||
rna_def_text(brna);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user