/home/jonas/tidevel/adt/Advanced Dialogs/source/Interactive.c

00001 /*
00002         Advanved Dialogs v1.05
00003         Copyright (C) 2005-2007 Jonas Gehring
00004 
00005         Advanced Dialogs is free software; you can redistribute it and/or modify
00006         it under the terms of the GNU Lesser General Public License as published by
00007         the Free Software Foundation; either version 2 of the License, or
00008         (at your option) any later version.
00009 
00010         Advanced Dialogs is distributed in the hope that it will be useful,
00011         but WITHOUT ANY WARRANTY; without even the implied warranty of
00012         MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
00013         GNU Lesser General Public License for more details.
00014 
00015         You should have received a copy of the GNU Lesser General Public License
00016         along with this program.  If not, see <http://www.gnu.org/licenses/>.
00017 */
00018 
00019 
00020 // C Source File
00021 // Created 24.11.2005; 03:23:31
00022 
00023 
00024 #include <extgraph.h>                                                   // ExtGraph by TI-Chess Team
00025 
00026 #include "AdvDialogs.h"                                                 // This should be obvious ;)
00027 #include "Internal.h"                                                   // This header should not be included in programs using Advanced Dialogs
00028 
00029 
00030 
00031 // Activates a CheckBox
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         // Mark field
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                 // Change value
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                 // Next element
00071                 else if (key == KEY_DOWN)
00072                 {
00073                         ClearKbdQueue();
00074 
00075                         // Find next interactive element
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                 // Previous element
00086                 else if (key == KEY_UP)
00087                 {
00088                         ClearKbdQueue();
00089 
00090                         // Find previous interactive element
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                 // Close Dialog (accept)
00101                 if (key == KEY_ENTER)
00102                 {
00103                         ClearKbdQueue();
00104 
00105                         returnvalue = dialog->tabs[tab].numelements;
00106                         break;
00107                 }
00108                 // Close Dialog (decline)       
00109                 else if (key == KEY_ESC)
00110                 {
00111                         ClearKbdQueue();
00112 
00113                         returnvalue = -1;
00114                         break;
00115                 }
00116                 
00117                 // Next Tab
00118                 else if (key == KEY_APPS && drawastab)
00119                 {
00120                         ClearKbdQueue();
00121                         
00122                         returnvalue = NEXTTAB;
00123                         break;
00124                 }
00125                 
00126         } while (TRUE);
00127 
00128         // Unmark field
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         // Delete "arrows"
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 // Activates an InputBox
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         // Input loop (adapted from ExciteBike 68k by Travis Fischer
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                 // Scroll input if neccessary
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                 // Allow number if waiting for number
00185                 // Allow text and numbers if waiting for text
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                 // Delete single char
00192                 if (key == KEY_BACKSPACE && pos)
00193                 {
00194                         pos--;
00195                 }
00196                 
00197                 // Delete whole string
00198                 else if (key == KEY_CLEAR)
00199                 {
00200                         pos = 0;
00201                 }
00202                 
00203                 // Next element
00204                 else if (key == KEY_DOWN)
00205                 {
00206                         // Find next interactive element
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                 // Previous element
00217                 else if (key == KEY_UP)
00218                 {
00219                         // Find previous interactive element
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                 // Close Dialog (accept)
00230                 else if (key == KEY_ENTER)
00231                 {
00232                         returnvalue = dialog->tabs[tab].numelements;
00233                         break;
00234                 }
00235                 // Close Dialog (dialog)        
00236                 else if (key == KEY_ESC)
00237                 {
00238                         returnvalue = -1;
00239                         break;
00240                 }
00241                 
00242                 // Next tab
00243                 else if (key == KEY_APPS)
00244                 {
00245                         returnvalue = NEXTTAB;
00246                         break;
00247                 }
00248                 
00249                 // End the string at the current position (saves space)
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 // Activates a DropDown-menu
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         // Save screen contents if neccessary
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         // Find widest element
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         // Pop-Up the menu
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                 // Select next item
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                 // Select previous item
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                 // Next element
00348                 if (key == KEY_DOWN)
00349                 {
00350                         // Find next interactive element
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                 // Previous element
00361                 else if (key == KEY_UP)
00362                 {
00363                         // Find previous interactive element
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                 // Close Dialog (accept)
00374                 if (key == KEY_ENTER)
00375                 {
00376                         ClearKbdQueue();
00377 
00378                         returnvalue = dialog->tabs[tab].numelements;
00379                         break;
00380                 }
00381                 // Close Dialog (decline)       
00382                 else if (key == KEY_ESC)
00383                 {
00384                         ClearKbdQueue();
00385 
00386                         returnvalue = -1;
00387                         break;
00388                 }
00389                 
00390                 // Next Tab
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                 // Restore components
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 

Generated on Thu Oct 4 19:42:03 2007 for Advanced Dialogs by  doxygen 1.5.1