summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNils Wallménius <nils@rockbox.org>2008-05-01 19:28:55 +0000
committerNils Wallménius <nils@rockbox.org>2008-05-01 19:28:55 +0000
commitddae6a242caa8e49f948ec97ff7a4e618e2f6e0d (patch)
tree79a2ffcc299dc13af8cef9ec86a1fceb171e5296
parent93b8a076ec61c92e4fc996fb04bab4e7aa22da10 (diff)
downloadrockbox-ddae6a242caa8e49f948ec97ff7a4e618e2f6e0d.tar.gz
rockbox-ddae6a242caa8e49f948ec97ff7a4e618e2f6e0d.zip
Adapt the calculator to larger displays and use the UI font if it fits. Use reversed colours instead of inverted colours for selection, fixes FS#8951
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@17299 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/calculator.c215
1 files changed, 103 insertions, 112 deletions
diff --git a/apps/plugins/calculator.c b/apps/plugins/calculator.c
index 38a97f0b46..92047023f7 100644
--- a/apps/plugins/calculator.c
+++ b/apps/plugins/calculator.c
@@ -78,10 +78,10 @@ F3: equal to "="
78 78
79PLUGIN_HEADER 79PLUGIN_HEADER
80 80
81#define REC_HEIGHT 10 /* blank height = 9 */ 81#define REC_HEIGHT (int)(LCD_HEIGHT / 6)
82#define REC_WIDTH 22 /* blank width = 21 */ 82#define REC_WIDTH (int)(LCD_WIDTH / 5)
83 83
84#define Y_6_POS (LCD_HEIGHT - 1) /* y6 = 63 */ 84#define Y_6_POS (LCD_HEIGHT) /* Leave room for the border */
85#define Y_5_POS (Y_6_POS - REC_HEIGHT) /* y5 = 53 */ 85#define Y_5_POS (Y_6_POS - REC_HEIGHT) /* y5 = 53 */
86#define Y_4_POS (Y_5_POS - REC_HEIGHT) /* y4 = 43 */ 86#define Y_4_POS (Y_5_POS - REC_HEIGHT) /* y4 = 43 */
87#define Y_3_POS (Y_4_POS - REC_HEIGHT) /* y3 = 33 */ 87#define Y_3_POS (Y_4_POS - REC_HEIGHT) /* y3 = 33 */
@@ -288,6 +288,7 @@ enum {
288 basicButtons, 288 basicButtons,
289 sciButtons 289 sciButtons
290} buttonGroup; 290} buttonGroup;
291
291unsigned char* buttonChar[2][5][5] = { 292unsigned char* buttonChar[2][5][5] = {
292 { { "MR" , "M+" , "2nd" , "CE" , "C" }, 293 { { "MR" , "M+" , "2nd" , "CE" , "C" },
293 { "7" , "8" , "9" , "/" , "sqr" }, 294 { "7" , "8" , "9" , "/" , "sqr" },
@@ -301,12 +302,14 @@ unsigned char* buttonChar[2][5][5] = {
301 { "1" , "2" , "3" , "ln" , "e^x" }, 302 { "1" , "2" , "3" , "ln" , "e^x" },
302 { "0" , "+/-", "." , "log" , "x^y" } } 303 { "0" , "+/-", "." , "log" , "x^y" } }
303}; 304};
305
304enum { btn_MR , btn_M , btn_bas , btn_CE , btn_C , 306enum { btn_MR , btn_M , btn_bas , btn_CE , btn_C ,
305 btn_7 , btn_8 , btn_9 , btn_div , btn_sqr , 307 btn_7 , btn_8 , btn_9 , btn_div , btn_sqr ,
306 btn_4 , btn_5 , btn_6 , btn_time , btn_square , 308 btn_4 , btn_5 , btn_6 , btn_time , btn_square ,
307 btn_1 , btn_2 , btn_3 , btn_minus , btn_rec , 309 btn_1 , btn_2 , btn_3 , btn_minus , btn_rec ,
308 btn_0 , btn_sign , btn_dot , btn_add , btn_equal 310 btn_0 , btn_sign , btn_dot , btn_add , btn_equal
309 }; 311 };
312
310enum { sci_fac, sci_pi , sci_sci , sci_sin , sci_asin , 313enum { sci_fac, sci_pi , sci_sci , sci_sin , sci_asin ,
311 sci_7 , sci_8 , sci_9 , sci_cos , sci_acos , 314 sci_7 , sci_8 , sci_9 , sci_cos , sci_acos ,
312 sci_4 , sci_5 , sci_6 , sci_tan , sci_atan , 315 sci_4 , sci_5 , sci_6 , sci_tan , sci_atan ,
@@ -439,6 +442,9 @@ void printResult(void);
439void formatResult(void); 442void formatResult(void);
440void oneOperand(void); 443void oneOperand(void);
441 444
445void drawLines(void);
446void drawButtons(int group);
447
442/* ----------------------------------------------------------------------- 448/* -----------------------------------------------------------------------
443Handy funtions 449Handy funtions
444----------------------------------------------------------------------- */ 450----------------------------------------------------------------------- */
@@ -469,6 +475,9 @@ void clearInput(void)
469 calStatus = cal_normal; 475 calStatus = cal_normal;
470 clearResult(); 476 clearResult();
471 cleartypingbuf(); 477 cleartypingbuf();
478 rb->lcd_clear_display();
479 drawButtons(buttonGroup);
480 drawLines();
472} 481}
473 482
474void clearOperand(void) 483void clearOperand(void)
@@ -508,22 +517,53 @@ void switchOperands(void)
508 power = tempp; 517 power = tempp;
509} 518}
510 519
520void drawLines(void)
521{
522 int i;
523 rb->lcd_hline(0, LCD_WIDTH, Y_1_POS-1);
524 for (i = 0; i < 5 ; i++)
525 rb->lcd_hline(0, LCD_WIDTH, Y_1_POS+i*REC_HEIGHT);
526 for (i = 0; i < 4 ; i++)
527 rb->lcd_vline(X_1_POS+i*REC_WIDTH, Y_1_POS, LCD_HEIGHT);
528}
529
530void drawButtons(int group)
531{
532 int i, j, w, h;
533 for (i = 0; i <= 4; i++){
534 for (j = 0; j <= 4; j++){
535 rb->lcd_getstringsize( buttonChar[group][i][j],&w,&h);
536 if (i == m && j == n) /* selected item */
537 rb->lcd_set_drawmode(DRMODE_SOLID);
538 else
539 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
540 rb->lcd_fillrect( X_0_POS + j*REC_WIDTH,
541 Y_1_POS + i*REC_HEIGHT,
542 REC_WIDTH, REC_HEIGHT+1);
543 if (i == m && j == n) /* selected item */
544 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
545 else
546 rb->lcd_set_drawmode(DRMODE_SOLID);
547 rb->lcd_putsxy( X_0_POS + j*REC_WIDTH + (REC_WIDTH - w)/2,
548 Y_1_POS + i*REC_HEIGHT + (REC_HEIGHT - h)/2 + 1,
549 buttonChar[group][i][j] );
550 }
551 }
552 rb->lcd_set_drawmode(DRMODE_SOLID);
553}
554
511/* ----------------------------------------------------------------------- 555/* -----------------------------------------------------------------------
512Initiate calculator 556Initiate calculator
513----------------------------------------------------------------------- */ 557----------------------------------------------------------------------- */
514void cal_initial (void) 558void cal_initial (void)
515{ 559{
516 int i,j,w,h; 560 int w,h;
517 rb->lcd_setfont(FONT_SYSFIXED);
518 rb->lcd_clear_display();
519 561
520 /* draw lines */ 562 rb->lcd_getstringsize("A",&w,&h);
521 rb->lcd_drawrect(X_0_POS, Y_0_POS, LCD_WIDTH-1, LCD_HEIGHT); 563 if (h >= REC_HEIGHT)
522 rb->lcd_hline(X_0_POS, X_5_POS, Y_1_POS-1); 564 rb->lcd_setfont(FONT_SYSFIXED);
523 for (i = 0; i < 5 ; i++) 565
524 rb->lcd_hline(X_0_POS, X_5_POS, Y_1_POS+i*REC_HEIGHT); 566 rb->lcd_clear_display();
525 for (i = 0; i < 4 ; i++)
526 rb->lcd_vline(X_1_POS+i*REC_WIDTH, Y_1_POS, Y_6_POS);
527 567
528#ifdef CALCULATOR_OPERATORS 568#ifdef CALCULATOR_OPERATORS
529 /* basic operators are available through separate button */ 569 /* basic operators are available through separate button */
@@ -531,26 +571,14 @@ void cal_initial (void)
531#else 571#else
532 buttonGroup = basicButtons; 572 buttonGroup = basicButtons;
533#endif 573#endif
534 /* draw buttons */
535 for (i = 0; i < 5; i++){
536 for (j = 0; j < 5; j++){
537 rb->lcd_getstringsize( buttonChar[buttonGroup][i][j],&w,&h);
538 rb->lcd_putsxy( X_0_POS + j*REC_WIDTH + (REC_WIDTH - w)/2,
539 TEXT_2_POS + i*REC_HEIGHT,
540 buttonChar[buttonGroup][i][j] );
541 }
542 }
543 574
544 /* initially, invert button "5" */ 575 /* initially, invert button "5" */
545 m = 2; 576 m = 2;
546 n = 1; 577 n = 1;
547 prev_m = m; 578 prev_m = m;
548 prev_n = n; 579 prev_n = n;
549 rb->lcd_set_drawmode(DRMODE_COMPLEMENT); 580 drawButtons(buttonGroup);
550 rb->lcd_fillrect( X_0_POS + n*REC_WIDTH + 1, 581 drawLines();
551 Y_1_POS + m*REC_HEIGHT + 1,
552 REC_WIDTH - 1, REC_HEIGHT - 1);
553 rb->lcd_set_drawmode(DRMODE_SOLID);
554 rb->lcd_update(); 582 rb->lcd_update();
555 583
556 /* initial mem and output display*/ 584 /* initial mem and output display*/
@@ -858,89 +886,49 @@ void moveButton(void){
858 break; 886 break;
859 } 887 }
860 888
861 rb->lcd_set_drawmode(DRMODE_COMPLEMENT); 889 drawButtons(buttonGroup);
862 rb->lcd_fillrect( X_0_POS + prev_n*REC_WIDTH + 1, 890 drawLines();
863 Y_1_POS + prev_m*REC_HEIGHT + 1,
864 REC_WIDTH - 1, REC_HEIGHT - 1);
865
866 rb->lcd_fillrect( X_0_POS + n*REC_WIDTH + 1,
867 Y_1_POS + m*REC_HEIGHT + 1,
868 REC_WIDTH - 1, REC_HEIGHT - 1);
869 rb->lcd_set_drawmode(DRMODE_SOLID);
870
871 rb->lcd_update_rect( X_0_POS + prev_n*REC_WIDTH + 1,
872 Y_1_POS + prev_m*REC_HEIGHT + 1,
873 REC_WIDTH - 1, REC_HEIGHT - 1);
874 891
875 rb->lcd_update_rect( X_0_POS + n*REC_WIDTH + 1, 892 rb->lcd_update();
876 Y_1_POS + m*REC_HEIGHT + 1,
877 REC_WIDTH - 1, REC_HEIGHT - 1);
878 893
879 prev_m = m; 894 prev_m = m;
880 prev_n = n; 895 prev_n = n;
881} 896}
897
882/* ----------------------------------------------------------------------- 898/* -----------------------------------------------------------------------
883Print buttons when switching 1st and 2nd 899Print buttons when switching 1st and 2nd
884int group = {basicButtons, sciButtons} 900int group = {basicButtons, sciButtons}
885----------------------------------------------------------------------- */ 901----------------------------------------------------------------------- */
886void printButtonGroups(int group) 902void printButtonGroups(int group)
887{ 903{
888 int i,j,w,h; 904 drawButtons(group);
889 for (i = 0; i < 5; i++){ 905 drawLines();
890 for (j = 3; j <= 4; j++){ 906 rb->lcd_update();
891 rb->lcd_getstringsize( buttonChar[group][i][j],&w,&h);
892 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
893 rb->lcd_fillrect( X_0_POS + j*REC_WIDTH + 1,
894 Y_1_POS + i*REC_HEIGHT + 1,
895 REC_WIDTH - 1, REC_HEIGHT - 1);
896 rb->lcd_set_drawmode(DRMODE_SOLID);
897 rb->lcd_putsxy( X_0_POS + j*REC_WIDTH + (REC_WIDTH - w)/2,
898 TEXT_2_POS + i*REC_HEIGHT,
899 buttonChar[group][i][j] );
900 }
901 }
902 for (i = 0; i <= 0; i++){
903 for (j = 0; j <= 2; j++){
904 rb->lcd_getstringsize( buttonChar[group][i][j],&w,&h);
905 rb->lcd_set_drawmode(DRMODE_SOLID|DRMODE_INVERSEVID);
906 rb->lcd_fillrect( X_0_POS + j*REC_WIDTH + 1,
907 Y_1_POS + i*REC_HEIGHT + 1,
908 REC_WIDTH - 1, REC_HEIGHT - 1);
909 rb->lcd_set_drawmode(DRMODE_SOLID);
910 rb->lcd_putsxy( X_0_POS + j*REC_WIDTH + (REC_WIDTH - w)/2,
911 TEXT_2_POS + i*REC_HEIGHT,
912 buttonChar[group][i][j] );
913 }
914 }
915 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
916 rb->lcd_fillrect( X_0_POS + 2*REC_WIDTH + 1,
917 Y_1_POS + 0*REC_HEIGHT + 1,
918 REC_WIDTH - 1, REC_HEIGHT - 1);
919 rb->lcd_set_drawmode(DRMODE_SOLID);
920 rb->lcd_update_rect( X_0_POS, Y_1_POS,
921 REC_WIDTH*5, REC_HEIGHT*5);
922} 907}
923/* ----------------------------------------------------------------------- 908/* -----------------------------------------------------------------------
924flash the button pressed 909flash the currently marked button
925----------------------------------------------------------------------- */ 910----------------------------------------------------------------------- */
926void flashButton(int b) 911void flashButton(void)
927{ 912{
928 int i = b/5; int j = b - i*5; 913 int k, w, h;
929 int k; 914 for (k=2;k>0;k--)
930 rb->lcd_set_drawmode(DRMODE_COMPLEMENT); 915 {
931 for (k=1*2;k>0;k--){ 916 rb->lcd_getstringsize( buttonChar[buttonGroup][m][n],&w,&h);
932 rb->lcd_fillrect( X_0_POS + j*REC_WIDTH + 1, 917 rb->lcd_set_drawmode(DRMODE_SOLID|(k==1) ? 0 : DRMODE_INVERSEVID);
933 Y_1_POS + i*REC_HEIGHT + 1, 918 rb->lcd_fillrect( X_0_POS + n*REC_WIDTH + 1,
919 Y_1_POS + m*REC_HEIGHT + 1,
934 REC_WIDTH - 1, REC_HEIGHT - 1); 920 REC_WIDTH - 1, REC_HEIGHT - 1);
935 rb->lcd_update_rect( X_0_POS + j*REC_WIDTH + 1, 921 rb->lcd_putsxy( X_0_POS + n*REC_WIDTH + (REC_WIDTH - w)/2,
936 Y_1_POS + i*REC_HEIGHT + 1, 922 Y_1_POS + m*REC_HEIGHT + (REC_HEIGHT - h)/2 +1,
923 buttonChar[buttonGroup][m][n] );
924 rb->lcd_update_rect( X_0_POS + n*REC_WIDTH + 1,
925 Y_1_POS + m*REC_HEIGHT + 1,
937 REC_WIDTH - 1, REC_HEIGHT - 1); 926 REC_WIDTH - 1, REC_HEIGHT - 1);
938 927
939 if (k!= 1) 928 if (k!= 1)
940 rb->sleep(HZ/22); 929 rb->sleep(HZ/22);
941 930
942 } 931 }
943 rb->lcd_set_drawmode(DRMODE_SOLID);
944} 932}
945 933
946/* ----------------------------------------------------------------------- 934/* -----------------------------------------------------------------------
@@ -1110,7 +1098,9 @@ printResult() generates LCD display.
1110----------------------------------------------------------------------- */ 1098----------------------------------------------------------------------- */
1111void printResult(void) 1099void printResult(void)
1112{ 1100{
1113 int k; 1101 int k, w, h;
1102
1103 char operbuf[3] = {0, 0, 0};
1114 1104
1115 switch_Status: 1105 switch_Status:
1116 switch(calStatus){ 1106 switch(calStatus){
@@ -1140,42 +1130,43 @@ void printResult(void)
1140 result2typingbuf(); 1130 result2typingbuf();
1141 clearbuf(); 1131 clearbuf();
1142 1132
1143 buf[0] = oper; 1133 operbuf[0] = oper;
1144 buf[1] = ( ABS(memTemp) > MINIMUM )?'M':' '; 1134 operbuf[1] = ( ABS(memTemp) > MINIMUM )?'M':' ';
1145 buf[2] = ' '; 1135 operbuf[2] = '\0';
1146 1136
1147 if(SCIENTIFIC_FORMAT){ 1137 if(SCIENTIFIC_FORMAT){
1148 /* output format: X.XXXX eXXX */ 1138 /* output format: X.XXXX eXXX */
1149 if(power > -98){ /* power-1 >= -99, eXXX or e-XX */ 1139 if(power > -98){ /* power-1 >= -99, eXXX or e-XX */
1150 rb->snprintf(buf+3, 12, "%11s",typingbuf); 1140 rb->snprintf(buf, 12, "%11s",typingbuf);
1151 for(k=14;k<=17;k++) buf[k] = ' '; 1141 for(k=11;k<=14;k++) buf[k] = ' ';
1152 cleartypingbuf(); 1142 cleartypingbuf();
1153 rb->snprintf(typingbuf, 5, "e%d",power-1); 1143 rb->snprintf(typingbuf, 5, "e%d",power-1);
1154 rb->snprintf(buf+14, 5, "%4s",typingbuf); 1144 rb->snprintf(buf+11, 5, "%4s",typingbuf);
1155 } 1145 }
1156 else{ /* power-1 <= -100, e-XXX */ 1146 else{ /* power-1 <= -100, e-XXX */
1157 rb->snprintf(buf+2, 12, "%11s",typingbuf); 1147 rb->snprintf(buf, 12, "%11s",typingbuf);
1158 rb->snprintf(buf+13, 6, "e%d",power-1); 1148 rb->snprintf(buf+11, 6, "e%d",power-1);
1159 } 1149 }
1160 } 1150 }
1161 else{ 1151 else{
1162 rb->snprintf(buf+7, 12, "%11s",typingbuf); 1152 rb->snprintf(buf, 12, "%11s",typingbuf);
1163 } /* if SCIENTIFIC_FORMAT */ 1153 } /* if SCIENTIFIC_FORMAT */
1164 break; 1154 break;
1165 case cal_typing: 1155 case cal_typing:
1166 case cal_dotted: 1156 case cal_dotted:
1167 clearbuf(); 1157 clearbuf();
1168 buf[0] = oper; 1158 operbuf[0] = oper;
1169 buf[1] = ( ABS(memTemp) > MINIMUM )?'M':' '; 1159 operbuf[1] = ( ABS(memTemp) > MINIMUM )?'M':' ';
1170 for(k=2;k<=6;k++) 1160 rb->snprintf(buf, 12, "%11s",typingbuf);
1171 buf[k] = ' ';
1172 rb->snprintf(buf+7, 12, "%11s",typingbuf);
1173 break; 1161 break;
1174 1162
1175 } 1163 }
1176 1164
1177 rb->lcd_putsxy(1, TEXT_1_POS,buf); 1165 rb->lcd_getstringsize(buf, &w, &h);
1178 rb->lcd_update_rect(1, TEXT_1_POS, 6*18, 8); 1166 rb->screen_clear_area(rb->screens[0], 0, 0, LCD_WIDTH, REC_HEIGHT-1);
1167 rb->lcd_putsxy(4, Y_1_POS - h -1, operbuf);
1168 rb->lcd_putsxy(LCD_WIDTH - w - 4, Y_1_POS - h -1, buf);
1169 rb->lcd_update_rect(0, 1, LCD_WIDTH, Y_1_POS);
1179} 1170}
1180 1171
1181/* ----------------------------------------------------------------------- 1172/* -----------------------------------------------------------------------
@@ -1302,7 +1293,7 @@ void basicButtonsProcess(void){
1302 switch (btn) { 1293 switch (btn) {
1303 case CALCULATOR_INPUT: 1294 case CALCULATOR_INPUT:
1304 if (calStatus == cal_error && (CAL_BUTTON != btn_C) ) break; 1295 if (calStatus == cal_error && (CAL_BUTTON != btn_C) ) break;
1305 flashButton(CAL_BUTTON); 1296 flashButton();
1306 switch( CAL_BUTTON ){ 1297 switch( CAL_BUTTON ){
1307 case btn_MR: 1298 case btn_MR:
1308 operInputted = false; 1299 operInputted = false;
@@ -1377,10 +1368,10 @@ void basicButtonsProcess(void){
1377 if (!operInputted) {twoOperands(); operInputted = true;} 1368 if (!operInputted) {twoOperands(); operInputted = true;}
1378 switch (oper){ 1369 switch (oper){
1379 case ' ': 1370 case ' ':
1380 case '/': oper = '+'; flashButton(btn_add); break; 1371 case '/': oper = '+'; flashButton(); break;
1381 case '+': oper = '-'; flashButton(btn_minus); break; 1372 case '+': oper = '-'; flashButton(); break;
1382 case '-': oper = '*'; flashButton(btn_time); break; 1373 case '-': oper = '*'; flashButton(); break;
1383 case '*': oper = '/'; flashButton(btn_div); break; 1374 case '*': oper = '/'; flashButton(); break;
1384 } 1375 }
1385 goto case_cycle_operators; 1376 goto case_cycle_operators;
1386 break; 1377 break;
@@ -1388,7 +1379,7 @@ void basicButtonsProcess(void){
1388 1379
1389 case CALCULATOR_CALC: 1380 case CALCULATOR_CALC:
1390 if (calStatus == cal_error) break; 1381 if (calStatus == cal_error) break;
1391 flashButton(btn_equal); 1382 flashButton();
1392 goto case_btn_equal; 1383 goto case_btn_equal;
1393 break; 1384 break;
1394 default: break; 1385 default: break;
@@ -1403,7 +1394,7 @@ void sciButtonsProcess(void){
1403 switch (btn) { 1394 switch (btn) {
1404 case CALCULATOR_INPUT: 1395 case CALCULATOR_INPUT:
1405 if (calStatus == cal_error && (CAL_BUTTON != sci_sci) ) break; 1396 if (calStatus == cal_error && (CAL_BUTTON != sci_sci) ) break;
1406 flashButton(CAL_BUTTON); 1397 flashButton();
1407 switch( CAL_BUTTON ){ 1398 switch( CAL_BUTTON ){
1408 1399
1409 case sci_pi: 1400 case sci_pi: