Revision: 15372
          
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=15372
Author:   quorn
Date:     2008-06-27 21:55:08 +0200 (Fri, 27 Jun 2008)

Log Message:
-----------
Mouse selection (LMB) and confirmation (MMB) added to suggestions UI. Also 
fixed the problem of offset text (horizontally scrolled).

Modified Paths:
--------------
    branches/soc-2008-quorn/source/blender/src/drawtext.c

Modified: branches/soc-2008-quorn/source/blender/src/drawtext.c
===================================================================
--- branches/soc-2008-quorn/source/blender/src/drawtext.c       2008-06-27 
18:56:25 UTC (rev 15371)
+++ branches/soc-2008-quorn/source/blender/src/drawtext.c       2008-06-27 
19:55:08 UTC (rev 15372)
@@ -88,6 +88,9 @@
 
 #define TEXTXLOC       38
 
+#define SUGG_LIST_SIZE 7
+#define SUGG_LIST_WIDTH 20
+
 /* forward declarations */
 
 void drawtextspace(ScrArea *sa, void *spacedata);
@@ -1007,9 +1010,63 @@
                txt_undo_add_toop(st->text, UNDO_STO, sell, selc, linep2, 
charp2);
 }
 
-#define SUGG_LIST_SIZE 7
-#define SUGG_LIST_WIDTH 20
+static int do_suggest_select(SpaceText *st)
+{
+       SuggItem *item, *first, *last, *sel;
+       short mval[2];
+       TextLine *tmp;
+       int l, x, y, w, h, i;
+       int seli, tgti;
+       
+       if (!st || !st->text) return 0;
+       if (!suggest_is_active(st->text)) return 0;
 
+       first = suggest_first();
+       last = suggest_last();
+       sel = suggest_get_selected();
+
+       if (!sel || !last || !first)
+               return 0;
+
+       /* Count the visible lines to the cursor */
+       for (tmp=st->text->curl, l=-st->top; tmp; tmp=tmp->prev, l++);
+       if (l<0) return 0;
+       
+       if(st->showlinenrs) {
+               x = spacetext_get_fontwidth(st)*(st->text->curc-st->left) + 
TXT_OFFSET + TEXTXLOC - 4;
+       } else {
+               x = spacetext_get_fontwidth(st)*(st->text->curc-st->left) + 
TXT_OFFSET - 4;
+       }
+       y = curarea->winy - st->lheight*l - 2;
+
+       w = SUGG_LIST_WIDTH*spacetext_get_fontwidth(st) + 20;
+       h = SUGG_LIST_SIZE*st->lheight + 8;
+
+       getmouseco_areawin(mval);
+
+       if (mval[0]<x || x+w<mval[0] || mval[1]<y-h || y<mval[1])
+               return 0;
+
+       /* Work out which of the visible SUGG_LIST_SIZE items is selected */
+       for (seli=0, item=sel; seli<3 && item && item!=first; seli++, 
item=item->prev);
+
+       /* Work out the target item index in the visible list */
+       tgti = (y-mval[1]-4) / st->lheight;
+       if (tgti<0 || tgti>SUGG_LIST_SIZE)
+               return 1;
+
+       if (seli<tgti) {
+               for (i=seli; i<tgti && sel && sel!=last; i++, sel=sel->next);
+               if (sel)
+                       suggest_set_selected(sel);
+       } else {
+               for (i=seli; i>tgti && sel && sel!=first; i--, sel=sel->prev);
+               if (sel)
+                       suggest_set_selected(sel);
+       }
+       return 1;
+}
+
 void draw_suggestion_list(SpaceText *st) {
        SuggItem *item, *first, *last, *sel;
        TextLine *tmp;
@@ -1022,13 +1079,20 @@
        first = suggest_first();
        last = suggest_last();
        sel = suggest_get_selected();
-       //if (!first || !last || !sel) return;
 
+       /* Count the visible lines to the cursor */
        for (tmp=st->text->curl, l=-st->top; tmp; tmp=tmp->prev, l++);
+       if (l<0) return;
+       
+       if(st->showlinenrs) {
+               x = spacetext_get_fontwidth(st)*(st->text->curc-st->left) + 
TXT_OFFSET + TEXTXLOC - 4;
+       } else {
+               x = spacetext_get_fontwidth(st)*(st->text->curc-st->left) + 
TXT_OFFSET - 4;
+       }
+       y = curarea->winy - st->lheight*l - 2;
+
        boxw = SUGG_LIST_WIDTH*spacetext_get_fontwidth(st) + 20;
        boxh = SUGG_LIST_SIZE*st->lheight + 8;
-       x = spacetext_get_fontwidth(st)*st->text->curc + 50; // TODO: Replace + 
50
-       y = curarea->winy - st->lheight*l - 2;
        
        BIF_ThemeColor(TH_SHADE1);
        glRecti(x-1, y+1, x+boxw+1, y-boxh-1);
@@ -1698,6 +1762,10 @@
                        
                        if (mval[0]>2 && mval[0]<20 && mval[1]>2 && 
mval[1]<curarea->winy-2) {
                                do_textscroll(st, 2);
+                               do_suggest= -1;
+                       } else if (do_suggest_select(st)) {
+                               do_draw= 1;
+                               do_suggest= 0;
                        } else {
                                do_selection(st, G.qual&LR_SHIFTKEY);
                                if (txt_has_sel(text)) {
@@ -1706,19 +1774,20 @@
                                        MEM_freeN(buffer);
                                }
                                do_draw= 1;
+                               do_suggest= -1;
                        }
-                       do_suggest= -1;
                }
        } else if (event==MIDDLEMOUSE) {
                if (val) {
-                       if (U.uiflag & USER_MMB_PASTE)
-                       {
+                       if (do_suggest_select(st)) {
+                               confirm_suggestion(text);
+                               do_draw= 1;
+                               do_suggest= 0;
+                       } else if (U.uiflag & USER_MMB_PASTE) {
                                do_selection(st, G.qual&LR_SHIFTKEY);
                                get_selection_buffer(text);
                                do_draw= 1;
-                       }
-                       else
-                       {
+                       } else {
                                do_textscroll(st, 1);
                        }
                        do_suggest= -1;


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to