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