Browse code

Support sticky drop-down menus

Dario Rodriguez authored on 13/02/2025 20:48:37
Showing 1 changed files
... ...
@@ -6,6 +6,7 @@
6 6
  * History:
7 7
  *      20250119 Creation. Menu bar.
8 8
  *      20250123 Load font.
9
+ *      20250213 Support sticky drop-down menus.
9 10
  *
10 11
  * Author: Dario Rodriguez dario@darionomono.com
11 12
  * (c) Dario Rodriguez 2025
... ...
@@ -114,7 +115,7 @@ main(int argc, char *argv[])
114 115
                         int insidetitle,currentoption;
115 116
                         insidetitle=is_imutil_insidexywh(mousepos,&(im->menudata[i]->xywh));
116 117
                         currentoption=menudata_pos2option(im->menudata[i],mousepos);
117
-                        flag_outsideall=(currentoption!=-1)?0:flag_outsideall;
118
+                        flag_outsideall=(currentoption!=-1 || insidetitle)?0:flag_outsideall;
118 119
                         if(lmbreleased && insidetitle) {
119 120
                                 for(j=0;j<im->sizemenudata;j++) {
120 121
                                         im->menudata[j]->flag_stickyopen=(j==i)?1:0;
... ...
@@ -127,12 +128,27 @@ main(int argc, char *argv[])
127 128
                                         im->menudata[j]->flag_stickyopen=0;
128 129
                                         im->menudata[j]->currentoption=-1;
129 130
                                 }
130
-                        } else if(lmbdown && currentoption!=-1) {
131
+                        } else if((lmbdown || im->menudata[i]->flag_stickyopen) && currentoption!=-1) {
131 132
                                 for(j=0;j<im->sizemenudata;j++) {
132
-                                        im->menudata[j]->flag_open=(j==i)?im->menudata[i]->flag_open:0;
133
-                                        im->menudata[j]->flag_stickyopen=(j==i)?im->menudata[i]->flag_stickyopen:0;
134
-                                        im->menudata[j]->currentoption=(j==i)?currentoption:-1;
133
+                                        if(lmbreleased==0 || j!=i || im->menudata[i]->flag_stickyopen==0) {
134
+                                                im->menudata[j]->flag_open=(j==i)?im->menudata[i]->flag_open:0;
135
+                                                im->menudata[j]->flag_stickyopen=(j==i)?im->menudata[i]->flag_stickyopen:0;
136
+                                                im->menudata[j]->currentoption=(j==i)?currentoption:-1;
137
+                                        } else {
138
+                                                im->menudata[j]->flag_open=0;
139
+                                                im->menudata[j]->flag_stickyopen=0;
140
+                                                im->menudata[j]->currentoption=-1;
141
+#if 1
142
+fprintf(stderr,"SELECTED: \"%s\"->\"%s\"\n",im->menudata[i]->title,im->menudata[i]->options[currentoption]);
143
+#endif
144
+                                        }
135 145
                                 }
146
+                        } else if(im->menudata[i]->flag_stickyopen && currentoption==-1) {
147
+                                if(lmbreleased) {
148
+                                        im->menudata[i]->flag_open=0;
149
+                                        im->menudata[i]->flag_stickyopen=0;
150
+                                }
151
+                                im->menudata[i]->currentoption=-1;
136 152
                         } else if(lmbreleased && currentoption!=-1) {
137 153
                                 for(j=0;j<im->sizemenudata;j++) {
138 154
                                         im->menudata[j]->flag_open=0;
... ...
@@ -145,7 +161,7 @@ fprintf(stderr,"SELECTED: \"%s\"->\"%s\"\n",im->menudata[i]->title,im->menudata[
145 161
                         } else if(lmbdown==0) {
146 162
                                 im->menudata[i]->flag_open=0;
147 163
                                 im->menudata[i]->flag_stickyopen=0;
148
-                                im->menudata[i]->flag_open=0;
164
+                                im->menudata[i]->currentoption=-1;
149 165
                         }
150 166
                 }
151 167
                 if(flag_outsideall) {