Made suggestions case-insensitive which also puts _ prefixed items at the bottom...
authorIan Thompson <quornian@googlemail.com>
Tue, 15 Jul 2008 17:03:59 +0000 (17:03 +0000)
committerIan Thompson <quornian@googlemail.com>
Tue, 15 Jul 2008 17:03:59 +0000 (17:03 +0000)
release/scripts/bpymodules/BPyTextPlugin.py
source/blender/blenkernel/intern/suggestions.c
source/blender/src/drawtext.c

index 2489c22f600056e4d826331107e51fcc5d390f1e..44038cfc3f649f269de1966452d95e893620ae05 100644 (file)
@@ -26,7 +26,7 @@ def suggest_cmp(x, y):
        """Use this method when sorting a list of suggestions.
        """
        
-       return cmp(x[0], y[0])
+       return cmp(x[0].upper(), y[0].upper())
 
 def cached_generate_tokens(txt, since=1):
        """A caching version of generate tokens for multiple parsing of the same
index ae0c7baa1467dcc20bdbf9c946e74a8cf55b4bed..dd5b770db933eeb73118947c099cb081a6dec421 100644 (file)
  *
  * The Original Code is: all of this file.
  *
- * Contributor(s): none yet.
+ * Contributor(s): Ian Thompson.
  *
  * ***** END GPL LICENSE BLOCK *****
  */
 
 #include <stdlib.h>
 #include <string.h>
+#include <ctype.h>
 
 #include "MEM_guardedalloc.h"
 #include "BLI_blenlib.h"
 #include "BKE_text.h"
 #include "BKE_suggestions.h"
 
-static SuggList suggestions= {NULL, NULL, NULL, NULL};
+static SuggList suggestions= {NULL, NULL, NULL, NULL, NULL};
 static Text *suggText = NULL;
+static SuggItem *lastInsert= NULL;
 
+static suggest_cmp(const char *first, const char *second, int len) {   
+       int cmp, i;
+       for (cmp=0, i=0; i<len; i++) {
+               if (cmp= toupper(first[i]) - toupper(second[i])) {
+                       break;
+               }
+       }
+       return cmp;
+}
 void free_suggestions() {
        SuggItem *item, *prev;
        for (item = suggestions.last; item; item=prev) {
@@ -66,17 +77,17 @@ void suggest_add(const char *name, char type) {
 
        if (!suggestions.first) {
                suggestions.first = suggestions.last = newitem;
-               suggestions.selected = newitem;
        } else {
                newitem->prev = suggestions.last;
                suggestions.last->next = newitem;
                suggestions.last = newitem;
        }
+       suggestions.selected = NULL;
 }
 
 void suggest_prefix(const char *prefix) {
        SuggItem *match, *first, *last;
-       int cmp, len = strlen(prefix);
+       int cmp, len = strlen(prefix), i;
 
        if (!suggestions.first) return;
        if (len==0) {
@@ -87,7 +98,7 @@ void suggest_prefix(const char *prefix) {
        
        first = last = NULL;
        for (match=suggestions.first; match; match=match->next) {
-               cmp = strncmp(prefix, match->name, len);
+               cmp = suggest_cmp(prefix, match->name, len);
                if (cmp==0) {
                        if (!first)
                                first = match;
@@ -103,7 +114,7 @@ void suggest_prefix(const char *prefix) {
                suggestions.selected = suggestions.firstmatch = first;
                suggestions.lastmatch = last;
        } else {
-               suggestions.selected = suggestions.firstmatch = suggestions.lastmatch = NULL;
+               suggestions.firstmatch = suggestions.lastmatch = NULL;
        }
 }
 
index b8cf99383a04cc574bdb4cbe46b0bf1e2e072b84..ae994b3e61dc828b6846a40d67782dda9cdef56a 100644 (file)
@@ -108,7 +108,7 @@ static int check_specialvars(char *string);
 static int check_identifier(char ch);
 
 static void get_suggest_prefix(Text *text);
-static void confirm_suggestion(Text *text);
+static void confirm_suggestion(Text *text, int skipleft);
 
 static void *last_txt_find_string= NULL;
 static double last_check_time= 0;
@@ -1026,7 +1026,7 @@ static int do_suggest_select(SpaceText *st)
        last = suggest_last();
        sel = suggest_get_selected();
 
-       if (!sel || !last || !first)
+       if (!last || !first)
                return 0;
 
        /* Count the visible lines to the cursor */
@@ -1100,7 +1100,10 @@ void draw_suggestion_list(SpaceText *st) {
        BIF_ThemeColor(TH_BACK);
        glRecti(x, y, x+boxw, y-boxh);
 
+       /* Set the top 'item' of the visible list */
        for (i=0, item=sel; i<3 && item && item!=first; i++, item=item->prev);
+       if (!item)
+               item = first;
 
        for (i=0; i<SUGG_LIST_SIZE && item; i++, item=item->next) {
 
@@ -1653,15 +1656,15 @@ static void get_suggest_prefix(Text *text) {
        len= text->curc-i;
        if (len > 255) {
                printf("Suggestion prefix too long\n");
-               return;
+               len = 255;
        }
        strncpy(tmp, line+i, len);
        tmp[len]= '\0';
        suggest_prefix(tmp);
 }
 
-static void confirm_suggestion(Text *text) {
-       int i, len;
+static void confirm_suggestion(Text *text, int skipleft) {
+       int i, over=0;
        char *line;
        SuggItem *sel;
 
@@ -1672,12 +1675,25 @@ static void confirm_suggestion(Text *text) {
        if (!sel) return;
 
        line= text->curl->line;
-       for (i=text->curc-1; i>=0; i--)
+       i=text->curc-skipleft-1;
+       while (i>=0) {
                if (!check_identifier(line[i]))
                        break;
-       i++;
-       len= text->curc-i;
-       txt_insert_buf(text, sel->name+len);
+               over++;
+               i--;
+       }
+
+       for (i=0; i<skipleft; i++)
+               txt_move_left(text, 0);
+       for (i=0; i<over; i++)
+               txt_move_left(text, 1);
+
+       txt_insert_buf(text, sel->name);
+       
+       for (i=0; i<skipleft; i++)
+               txt_move_right(text, 0);
+
+       suggest_clear_text();
 }
 
 void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
@@ -1752,7 +1768,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                return;
        }
 
-       suggesting = suggest_is_active(text);
+       suggesting = st->showsyntax && suggest_is_active(text);
        
        if (event==LEFTMOUSE) {
                if (val) {
@@ -1781,7 +1797,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
        } else if (event==MIDDLEMOUSE) {
                if (val) {
                        if (do_suggest_select(st)) {
-                               confirm_suggestion(text);
+                               confirm_suggestion(text, 0);
                                do_draw= 1;
                                do_suggest= 0;
                        } else if (U.uiflag & USER_MMB_PASTE) {
@@ -1834,12 +1850,14 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                        if (st->showsyntax) get_format_string(st);
                        pop_space_text(st);
                        do_draw= 1;
-                       if (suggesting && ispunct(ascii)) {
-                               confirm_suggestion(text);
-                               if (st->showsyntax) get_format_string(st);
-                               do_suggest= 0;
-                       } else {
-                               do_suggest= 1;
+                       if (suggesting) {
+                               if (ispunct(ascii) || check_whitespace(ascii)) {
+                                       confirm_suggestion(text, 1);
+                                       if (st->showsyntax) get_format_string(st);
+                                       do_suggest= 0;
+                               } else {
+                                       do_suggest= 1;
+                               }
                        }
                }
        } else if (val) {
@@ -2110,12 +2128,6 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                case ESCKEY:
                        do_suggest= -1;
                        break;
-               case SPACEKEY:
-                       if (suggesting) {
-                               confirm_suggestion(text);
-                               if (st->showsyntax) get_format_string(st);
-                       }
-                       break;
                case TABKEY:
                        if (text && text->id.lib) {
                                error_libdata();
@@ -2146,7 +2158,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                                break;
                        }
                        if (suggesting) {
-                               confirm_suggestion(text);
+                               confirm_suggestion(text, 0);
                                if (st->showsyntax) get_format_string(st);
                                break;
                        }
@@ -2174,14 +2186,24 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                        }
                        if (G.qual & (LR_ALTKEY | LR_CTRLKEY)) {
                                txt_backspace_word(text);
+                               do_suggest= -1;
                        } else {
+                               /* Work out which char we are about to delete */
+                               if (text && text->curl && text->curc > 0) {
+                                       char ch= text->curl->line[text->curc-1];
+                                       if (ispunct(ch) || check_whitespace(ch))
+                                               do_suggest= -1;
+                                       else
+                                               do_suggest= 1;
+                               } else {
+                                       do_suggest= -1;
+                               }
                                txt_backspace_char(text);
                        }
                        set_tabs(text);
                        if (st->showsyntax) get_format_string(st);
                        do_draw= 1;
                        pop_space_text(st);
-                       do_suggest= 1;
                        break;
                case DELKEY:
                        if (text && text->id.lib) {
@@ -2206,8 +2228,11 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                case DOWNARROWKEY:
                        if (suggesting) {
                                SuggItem *sel = suggest_get_selected();
-                               if (sel && sel!=suggest_last() && sel->next)
+                               if (!sel) {
+                                       suggest_set_selected(suggest_first());
+                               } else if (sel!=suggest_last() && sel->next) {
                                        suggest_set_selected(sel->next);
+                               }
                                do_suggest= 0;
                                break;
                        }
@@ -2255,6 +2280,8 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                        if (suggesting) {
                                int i;
                                SuggItem *sel = suggest_get_selected();
+                               if (!sel)
+                                       sel = suggest_first();
                                for (i=0; i<SUGG_LIST_SIZE-1 && sel && sel!=suggest_last() && sel->next; i++, sel=sel->next)
                                        suggest_set_selected(sel->next);
                                do_suggest= 0;
@@ -2301,8 +2328,11 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                case WHEELDOWNMOUSE:
                        if (suggesting) {
                                SuggItem *sel = suggest_get_selected();
-                               if (sel && sel!=suggest_last() && sel->next)
+                               if (!sel) {
+                                       suggest_set_selected(suggest_first());
+                               } else if (sel && sel!=suggest_last() && sel->next) {
                                        suggest_set_selected(sel->next);
+                               }
                                do_suggest= 0;
                        } else {
                                screen_skip(st, U.wheellinescroll);
@@ -2310,6 +2340,7 @@ void winqreadtextspace(ScrArea *sa, void *spacedata, BWinEvent *evt)
                        do_draw= 1;
                        break;
                default:
+                       /* We don't want all sorts of events closing the suggestions box */
                        do_suggest= 0;
                }
        }
@@ -2581,6 +2612,12 @@ static int check_identifier(char ch) {
        return 0;
 }
 
+static int check_whitespace(char ch) {
+       if (ch == ' ' || ch == '\t' || ch == '\r' || ch == '\n')
+               return 1;
+       return 0;
+}
+
 void convert_tabs (struct SpaceText *st, int tab)
 {
        Text *text = st->text;