00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024 #include <extgraph.h>
00025
00026 #include "AdvDialogs.h"
00027 #include "Internal.h"
00028
00029
00030
00031
00032 short AdvDlgCheckBox(ADVDIALOG *dialog, uchar tab, uchar line)
00033 {
00034 void *kbq = kbd_queue();
00035 short key;
00036 short returnvalue = line;
00037 BOOL drawastab = FALSE;
00038
00039 if (dialog->numtabs)
00040 {
00041 drawastab = TRUE;
00042 }
00043
00044
00045 GrayDrawRect(dialog->right_x-12-(drawastab*3), dialog->top_y+7+2+(drawastab*10)+(line*8), dialog->right_x-4-(drawastab*3), dialog->top_y+15+2+(drawastab*10)+(line*8), COLOR_BLACK, RECT_EMPTY);
00046
00047 EXT_SETPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-14-(drawastab*3), dialog->top_y+12+(drawastab*10)+(line*8));
00048 EXT_SETPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-15-(drawastab*3), dialog->top_y+13+(drawastab*10)+(line*8));
00049 EXT_SETPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-14-(drawastab*3), dialog->top_y+14+(drawastab*10)+(line*8));
00050
00051 EXT_SETPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-2-(drawastab*3), dialog->top_y+12+(drawastab*10)+(line*8));
00052 EXT_SETPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-1-(drawastab*3), dialog->top_y+13+(drawastab*10)+(line*8));
00053 EXT_SETPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-2-(drawastab*3), dialog->top_y+14+(drawastab*10)+(line*8));
00054
00055 do
00056 {
00057 GetKey(kbq, &key);
00058 ClearKbdQueue();
00059
00060
00061 if (key == KEY_LEFT || key == KEY_RIGHT)
00062 {
00063 dialog->tabs[tab].elements[line].flag = !dialog->tabs[tab].elements[line].flag;
00064
00065 GrayFastDrawLine(dialog->right_x-11-(drawastab*3), dialog->top_y+11+2+(drawastab*10)+(line*8), dialog->right_x-9-(drawastab*3), dialog->top_y+14+2+(drawastab*10)+(line*8), dialog->tabs[tab].elements[line].flag*3);
00066 GrayFastDrawLine(dialog->right_x-9-(drawastab*3), dialog->top_y+14+2+(drawastab*10)+(line*8), dialog->right_x-5-(drawastab*3), dialog->top_y+8+2+(drawastab*10)+(line*8), dialog->tabs[tab].elements[line].flag*3);
00067 }
00068
00069
00070 else if (key == KEY_DOWN)
00071 {
00072
00073 do
00074 {
00075 returnvalue = (returnvalue+1) % dialog->tabs[tab].numelements;
00076
00077 } while (dialog->tabs[tab].elements[returnvalue].element <= AD_TEXT);
00078
00079 break;
00080 }
00081
00082
00083 else if (key == KEY_UP)
00084 {
00085
00086 do
00087 {
00088 returnvalue = returnvalue ? returnvalue-1 : dialog->tabs[tab].numelements-1;
00089
00090 } while (dialog->tabs[tab].elements[returnvalue].element <= AD_TEXT);
00091
00092 break;
00093 }
00094
00095
00096 if (key == KEY_ENTER)
00097 {
00098 returnvalue = dialog->tabs[tab].numelements;
00099 break;
00100 }
00101
00102 else if (key == KEY_ESC)
00103 {
00104 returnvalue = -1;
00105 break;
00106 }
00107
00108
00109 else if (key == KEY_APPS && drawastab)
00110 {
00111 returnvalue = NEXTTAB;
00112 break;
00113 }
00114
00115 } while (TRUE);
00116
00117
00118 GrayDrawRect(dialog->right_x-12-(drawastab*3), dialog->top_y+7+2+(drawastab*10)+(line*8), dialog->right_x-4-(drawastab*3), dialog->top_y+15+2+(drawastab*10)+(line*8), COLOR_LIGHTGRAY, RECT_EMPTY);
00119
00120
00121 EXT_CLRPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-14-(drawastab*3), dialog->top_y+12+(drawastab*10)+(line*8));
00122 EXT_CLRPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-15-(drawastab*3), dialog->top_y+13+(drawastab*10)+(line*8));
00123 EXT_CLRPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-14-(drawastab*3), dialog->top_y+14+(drawastab*10)+(line*8));
00124
00125 EXT_CLRPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-2-(drawastab*3), dialog->top_y+12+(drawastab*10)+(line*8));
00126 EXT_CLRPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-1-(drawastab*3), dialog->top_y+13+(drawastab*10)+(line*8));
00127 EXT_CLRPIX(GrayGetPlane(DARK_PLANE), dialog->right_x-2-(drawastab*3), dialog->top_y+14+(drawastab*10)+(line*8));
00128
00129 return returnvalue;
00130 }
00131
00132
00133
00134 short AdvDlgInputBox(ADVDIALOG *dialog, uchar tab, uchar line)
00135 {
00136 void *kbq = kbd_queue();
00137 short returnvalue = line;
00138 short key, pos = 0, show = 0, width, strwidth = DrawStrWidth(dialog->tabs[tab].elements[line].text, F_4x6);
00139 BOOL drawastab = FALSE;
00140 short drawastab10, drawastab3;
00141 short line8 = line*8;
00142
00143 if (dialog->numtabs)
00144 {
00145 drawastab = TRUE;
00146 }
00147
00148 pos = strlen(dialog->tabs[tab].elements[line].inputbuffer);
00149
00150 drawastab10 = drawastab*10;
00151 drawastab3 = drawastab*3;
00152 width = dialog->right_x-10-(drawastab3) - 4 -(dialog->left_x+5+strwidth);
00153
00154
00155 do
00156 {
00157 GrayDrawRect(dialog->left_x+2+(drawastab3)+strwidth + 4, dialog->top_y+8+(line8)+2+(drawastab10), dialog->right_x-5-(drawastab3), dialog->top_y+14+(line8)+2+(drawastab10), COLOR_WHITE, RECT_FILLED);
00158 GrayDrawRect(dialog->left_x+2+(drawastab3)+strwidth + 3, dialog->top_y+7+(line8)+2+(drawastab10), dialog->right_x-4-(drawastab3), dialog->top_y+15+(line8)+2+(drawastab10), COLOR_BLACK, RECT_EMPTY);
00159
00160
00161 show = 0;
00162 while (DrawStrWidth(&dialog->tabs[tab].elements[line].inputbuffer[show], F_4x6) > width)
00163 {
00164 show++;
00165 }
00166
00167 GrayDrawStrExt(dialog->left_x+2+(drawastab3)+strwidth + 4, dialog->top_y+9+(line8)+2+(drawastab10), &dialog->tabs[tab].elements[line].inputbuffer[show], A_NORMAL, F_4x6);
00168
00169 GrayDrawStrExt(dialog->left_x+2+(drawastab3)+strwidth + 4 + DrawStrWidth(&dialog->tabs[tab].elements[line].inputbuffer[show], F_4x6), dialog->top_y+9+(line8)+2+(drawastab10), "_", A_NORMAL, F_4x6);
00170
00171 GetKey(kbq, &key);
00172
00173
00174
00175 if (pos < dialog->tabs[tab].elements[line].inputsize && pos >= 0 && (isdigit(key) || (!dialog->tabs[tab].elements[line].flag && ((toupper(key) >= 'A' && toupper(key) <= 'Z') || key == ' ' || key == 92))))
00176 {
00177 dialog->tabs[tab].elements[line].inputbuffer[pos++] = key;
00178 }
00179
00180
00181 if (key == KEY_BACKSPACE && pos)
00182 {
00183 pos--;
00184 }
00185
00186
00187 else if (key == KEY_CLEAR)
00188 {
00189 pos = 0;
00190 }
00191
00192
00193 else if (key == KEY_DOWN)
00194 {
00195
00196 do
00197 {
00198 returnvalue = (returnvalue+1) % dialog->tabs[tab].numelements;
00199 }
00200 while (dialog->tabs[tab].elements[returnvalue].element <= AD_TEXT);
00201
00202 break;
00203 }
00204
00205
00206 else if (key == KEY_UP)
00207 {
00208
00209 do
00210 {
00211 returnvalue = returnvalue ? returnvalue-1 : dialog->tabs[tab].numelements-1;
00212 }
00213 while (dialog->tabs[tab].elements[returnvalue].element <= AD_TEXT);
00214
00215 break;
00216 }
00217
00218
00219 else if (key == KEY_ENTER)
00220 {
00221 returnvalue = dialog->tabs[tab].numelements;
00222 break;
00223 }
00224
00225 else if (key == KEY_ESC)
00226 {
00227 returnvalue = -1;
00228 break;
00229 }
00230
00231
00232 else if (key == KEY_APPS)
00233 {
00234 returnvalue = NEXTTAB;
00235 break;
00236 }
00237
00238
00239 dialog->tabs[tab].elements[line].inputbuffer[pos]='\0';
00240
00241 } while (!pos);
00242
00243 GrayDrawRect(dialog->left_x+2+(drawastab3)+DrawStrWidth(dialog->tabs[tab].elements[line].text, F_4x6) + 3, dialog->top_y+7+(line8)+2+(drawastab10), dialog->right_x-(drawastab3)-4, dialog->top_y+15+(line8)+2+(drawastab10), COLOR_LIGHTGRAY, RECT_EMPTY);
00244 GrayDrawRect(dialog->left_x+2+(drawastab3)+DrawStrWidth(dialog->tabs[tab].elements[line].text, F_4x6) + 4, dialog->top_y+8+(line8)+2+(drawastab10), dialog->right_x-5-(drawastab3), dialog->top_y+14+(line8)+2+(drawastab10), COLOR_WHITE, RECT_FILLED);
00245 GrayDrawStrExt(dialog->left_x+2+(drawastab3)+DrawStrWidth(dialog->tabs[tab].elements[line].text, F_4x6) + 4, dialog->top_y+9+(line8)+2+(drawastab10), &dialog->tabs[tab].elements[line].inputbuffer[show], A_NORMAL, F_4x6);
00246
00247 return returnvalue;
00248 }
00249
00250
00251
00252 short AdvDlgDropDown(ADVDIALOG *dialog, uchar tab, uchar line)
00253 {
00254 void *kbq = kbd_queue();
00255 short returnvalue = line;
00256 short key, selected, i, width, strwidth = DrawStrWidth(dialog->tabs[tab].elements[line].text, F_4x6);
00257 BOOL drawastab = FALSE;
00258 uchar drawastab10, drawastab3;
00259 short line8 = line*8;
00260
00261 if (dialog->numtabs)
00262 {
00263 drawastab = TRUE;
00264 }
00265
00266
00267 if (!dialog->savescreen)
00268 {
00269 SaveScreen();
00270 }
00271
00272 selected = *dialog->tabs[tab].elements[line].selected;
00273
00274 drawastab10 = drawastab*10;
00275 drawastab3 = drawastab*3;
00276 width = (dialog->left_x+10+(drawastab3)+strwidth)- (dialog->right_x-5-(drawastab3));
00277
00278
00279 for (i = dialog->tabs[tab].elements[line].flag; i--; )
00280 {
00281 if (DrawStrWidth(dialog->tabs[tab].elements[line].itemlist[i], F_4x6) + 1 > width)
00282 {
00283 width = DrawStrWidth(dialog->tabs[tab].elements[line].itemlist[i], F_4x6) + 1;
00284 }
00285 }
00286
00287
00288 GrayDrawRect(dialog->left_x+10+(drawastab3)+strwidth, dialog->top_y+8+2+(drawastab10)+(line8), dialog->left_x+10+(drawastab3)+strwidth+width, dialog->top_y+8+2+(drawastab*10)+(line8)+((dialog->tabs[tab].elements[line].flag)*6), COLOR_WHITE, RECT_FILLED);
00289 GrayDrawRect(dialog->left_x+9+(drawastab3)+strwidth, dialog->top_y+7+2+(drawastab10)+(line8), dialog->left_x+11+(drawastab3)+strwidth+width, dialog->top_y+9+2+(drawastab*10)+(line8)+((dialog->tabs[tab].elements[line].flag)*6), COLOR_BLACK, RECT_EMPTY);
00290
00291 for (i = dialog->tabs[tab].elements[line].flag; i--; )
00292 {
00293 GrayDrawStrExt(dialog->left_x+10+(drawastab3)+strwidth, dialog->top_y+9+2+(drawastab10)+(line8)+(i*6), dialog->tabs[tab].elements[line].itemlist[i], A_NORMAL, F_4x6);
00294 }
00295
00296 GrayInvertRect(dialog->left_x+10+(drawastab*3)+strwidth,
00297 dialog->top_y+10+(drawastab10)+(line8)+(selected*6),
00298 dialog->left_x+10+(drawastab3)+strwidth+width,
00299 dialog->top_y+10+(drawastab10)+(line8)+(selected*6)+6);
00300
00301 do
00302 {
00303 GetKey(kbq, &key);
00304
00305
00306 if (key == KEY_RIGHT)
00307 {
00308 GrayInvertRect(dialog->left_x+10+(drawastab3)+strwidth,
00309 dialog->top_y+10+(drawastab10)+(line8)+(selected*6),
00310 dialog->left_x+10+(drawastab3)+strwidth+width,
00311 dialog->top_y+10+(drawastab10)+(line8)+(selected*6)+6);
00312
00313 selected = (selected+1) % dialog->tabs[tab].elements[line].flag;
00314
00315 GrayInvertRect(dialog->left_x+10+(drawastab3)+strwidth,
00316 dialog->top_y+10+(drawastab10)+(line8)+(selected*6),
00317 dialog->left_x+10+(drawastab3)+strwidth+width,
00318 dialog->top_y+10+(drawastab10)+(line8)+(selected*6)+6);
00319
00320 }
00321
00322
00323 if (key == KEY_LEFT)
00324 {
00325 GrayInvertRect(dialog->left_x+10+(drawastab3)+strwidth,
00326 dialog->top_y+10+(drawastab10)+(line8)+(selected*6),
00327 dialog->left_x+10+(drawastab3)+strwidth+width,
00328 dialog->top_y+10+(drawastab10)+(line8)+(selected*6)+6);
00329
00330 selected = selected ? selected-1 : dialog->tabs[tab].elements[line].flag-1;
00331
00332 GrayInvertRect(dialog->left_x+10+(drawastab3)+strwidth,
00333 dialog->top_y+10+(drawastab10)+(line8)+(selected*6),
00334 dialog->left_x+10+(drawastab3)+strwidth+width,
00335 dialog->top_y+10+(drawastab10)+(line8)+(selected*6)+6);
00336 }
00337
00338
00339 if (key == KEY_DOWN)
00340 {
00341
00342 do
00343 {
00344 returnvalue = (returnvalue+1) % dialog->tabs[tab].numelements;
00345
00346 } while (dialog->tabs[tab].elements[returnvalue].element <= AD_TEXT);
00347
00348 break;
00349 }
00350
00351
00352 else if (key == KEY_UP)
00353 {
00354
00355 do
00356 {
00357 returnvalue = returnvalue ? returnvalue-1 : dialog->tabs[tab].numelements-1;
00358
00359 } while (dialog->tabs[tab].elements[returnvalue].element <= AD_TEXT);
00360
00361 break;
00362 }
00363
00364
00365 if (key == KEY_ENTER)
00366 {
00367 ClearKbdQueue();
00368
00369 returnvalue = dialog->tabs[tab].numelements;
00370 break;
00371 }
00372
00373 else if (key == KEY_ESC)
00374 {
00375 ClearKbdQueue();
00376
00377 returnvalue = -1;
00378 break;
00379 }
00380
00381
00382 else if (key == KEY_APPS && drawastab)
00383 {
00384 ClearKbdQueue();
00385
00386 returnvalue = NEXTTAB;
00387 break;
00388 }
00389
00390 } while (TRUE);
00391
00392 *dialog->tabs[tab].elements[line].selected = selected;
00393
00394 if (returnvalue != NEXTTAB && returnvalue != -1 && returnvalue != dialog->tabs[tab].numelements)
00395 {
00396
00397 FastCopyScreen_R(tscr, GrayGetPlane(LIGHT_PLANE));
00398 FastCopyScreen_R(tscr+sizeof(LCD_BUFFER), GrayGetPlane(DARK_PLANE));
00399 AdvDlgDrawTab(dialog, tabcounter);
00400 }
00401
00402 return returnvalue;
00403 }
00404