Text Editor: implement space-as-tab navigation
authorDalai Felinto <dfelinto@gmail.com>
Mon, 14 Nov 2011 17:33:32 +0000 (17:33 +0000)
committerDalai Felinto <dfelinto@gmail.com>
Mon, 14 Nov 2011 17:33:32 +0000 (17:33 +0000)
When "use tab as space" is on we will jump the spaces as if they were one single tab when navigating (left/right).
Tabsize still is hardcoded to 4, but this is a separate design issue left for another patch.

* patch done in the airplane while expaining the Text Editor code for a potencial new coder @ Blender PRO 2011 *

source/blender/blenkernel/intern/text.c

index e8be0bb2608f069527960c43f3a1d7cf09edfe92..5735a95764bf6a5ca044cb2e80fe9234e066b6b6 100644 (file)
@@ -796,6 +796,7 @@ void txt_move_left(Text *text, short sel)
 {
        TextLine **linep;
        int *charp, oundoing= undoing;
+       int tabsize = 1, i=0;
        
        if (!text) return;
        if(sel) txt_curs_sel(text, &linep, &charp);
@@ -803,14 +804,34 @@ void txt_move_left(Text *text, short sel)
        if (!*linep) return;
 
        undoing= 1;
+
+       // do nice left only if there are only spaces
+       // TXT_TABSIZE hardcoded in DNA_text_types.h
+       if (text->flags & TXT_TABSTOSPACES) {
+               tabsize = TXT_TABSIZE;
+
+               if (*charp < tabsize)
+                       tabsize = *charp;
+               else {
+                       for (i=0;i<(*charp);i++)
+                               if ((*linep)->line[i] != ' ') {
+                                       tabsize = 1;
+                                       break;
+                               }
+                       // if in the middle of the space-tab
+                       if ((*charp) % tabsize != 0)
+                                       tabsize = ((*charp) % tabsize);
+               }
+       }
+
        if (*charp== 0) {
                if ((*linep)->prev) {
                        txt_move_up(text, sel);
                        *charp= (*linep)->len;
                }
-       } else {
-               (*charp)--;
        }
+       else (*charp)-= tabsize;
+
        undoing= oundoing;
        if(!undoing) txt_undo_add_op(text, sel?UNDO_SLEFT:UNDO_CLEFT);
        
@@ -821,6 +842,7 @@ void txt_move_right(Text *text, short sel)
 {
        TextLine **linep;
        int *charp, oundoing= undoing;
+       int tabsize=1, i=0;
        
        if (!text) return;
        if(sel) txt_curs_sel(text, &linep, &charp);
@@ -828,13 +850,32 @@ void txt_move_right(Text *text, short sel)
        if (!*linep) return;
 
        undoing= 1;
+
+       // do nice right only if there are only spaces
+       // spaces hardcoded in DNA_text_types.h
+       if (text->flags & TXT_TABSTOSPACES) {
+               tabsize = TXT_TABSIZE;
+
+               if ((*charp) + tabsize > (*linep)->len)
+                       tabsize = 1;
+               else {
+                       for (i=0;i<(*charp) + tabsize - ((*charp) % tabsize);i++)
+                               if ((*linep)->line[i] != ' ') {
+                                       tabsize = 1;
+                                       break;
+                               }
+                       // if in the middle of the space-tab
+                       tabsize -= (*charp) % tabsize;
+               }
+       }
+
        if (*charp== (*linep)->len) {
                if ((*linep)->next) {
                        txt_move_down(text, sel);
                        *charp= 0;
                }
        } else {
-               (*charp)++;
+               (*charp)+=tabsize;
        }
        undoing= oundoing;
        if(!undoing) txt_undo_add_op(text, sel?UNDO_SRIGHT:UNDO_CRIGHT);