summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeruaki Kawashima <teru@rockbox.org>2010-11-17 14:50:43 +0000
committerTeruaki Kawashima <teru@rockbox.org>2010-11-17 14:50:43 +0000
commit62b8efe6741b61ef10d3c7b98dd0d3416b7fce11 (patch)
treeda65384f9bbcd968e2726e3343c106ac22e42f0b
parentbd2011bc6ac08ffac15fd08cd3b5b5989b0ddfbf (diff)
downloadrockbox-62b8efe6741b61ef10d3c7b98dd0d3416b7fce11.tar.gz
rockbox-62b8efe6741b61ef10d3c7b98dd0d3416b7fce11.zip
rockpaint: change browse_fonts to use dircache and use whole screen. add scrollbar.
git-svn-id: svn://svn.rockbox.org/rockbox/trunk@28612 a1c6a512-1295-4272-9138-f99709370657
-rw-r--r--apps/plugins/rockpaint.c242
1 files changed, 117 insertions, 125 deletions
diff --git a/apps/plugins/rockpaint.c b/apps/plugins/rockpaint.c
index ff708bc226..00ac286167 100644
--- a/apps/plugins/rockpaint.c
+++ b/apps/plugins/rockpaint.c
@@ -456,9 +456,8 @@ union buf
456 char text[MAX_TEXT]; 456 char text[MAX_TEXT];
457 char font[MAX_PATH]; 457 char font[MAX_PATH];
458 char old_font[MAX_PATH]; 458 char old_font[MAX_PATH];
459 int fh_buf[30]; 459 int fh_buf[80];
460 int fw_buf[30]; 460 int fw_buf[80];
461 char fontname_buf[30][MAX_PATH];
462 } text; 461 } text;
463}; 462};
464 463
@@ -703,19 +702,20 @@ static bool browse( char *dst, int dst_size, const char *start )
703 struct gui_synclist browse_list; 702 struct gui_synclist browse_list;
704 int item_count = 0, selected, button; 703 int item_count = 0, selected, button;
705 struct tree_context backup; 704 struct tree_context backup;
706 struct entry *dc; 705 struct entry *dc, *e;
707 bool reload = true; 706 bool reload = true;
708 int dirfilter = SHOW_ALL; 707 int dirfilter = SHOW_ALL;
709 int *indexes = (int *) buffer->clipboard; 708 int *indexes = (int *) buffer;
709 size_t bbuf_len, len;
710 710
711 char *a; 711 char *a;
712 712
713 rb->strcpy( bbuf, start ); 713 rb->strcpy( bbuf, start );
714 a = bbuf+rb->strlen(bbuf)-1; 714 bbuf_len = rb->strlen(bbuf);
715 if( *a != '/' ) 715 if( bbuf[bbuf_len-1] != '/' )
716 { 716 {
717 a[1] = '/'; 717 bbuf[bbuf_len++] = '/';
718 a[2] = '\0'; 718 bbuf[bbuf_len] = '\0';
719 } 719 }
720 bbuf_s[0] = '\0'; 720 bbuf_s[0] = '\0';
721 721
@@ -729,9 +729,8 @@ static bool browse( char *dst, int dst_size, const char *start )
729 if( *a != '/' ) 729 if( *a != '/' )
730 { 730 {
731 *++a = '/'; 731 *++a = '/';
732 *++a = '\0';
733 } 732 }
734 rb->strcpy( a, dc[tree->selected_item].name ); 733 rb->strcpy( a+1, dc[tree->selected_item].name );
735 tree->dirfilter = &dirfilter; 734 tree->dirfilter = &dirfilter;
736 while( 1 ) 735 while( 1 )
737 { 736 {
@@ -743,14 +742,13 @@ static bool browse( char *dst, int dst_size, const char *start )
743 selected = 0; 742 selected = 0;
744 for( i = 0; i < tree->filesindir ; i++) 743 for( i = 0; i < tree->filesindir ; i++)
745 { 744 {
745 e = &dc[i];
746 /* only displayes directories and .bmp files */ 746 /* only displayes directories and .bmp files */
747 if( ((dc[i].attr & ATTR_DIRECTORY ) && 747 if( ( e->attr & ATTR_DIRECTORY ) ||
748 rb->strcmp( dc[i].name, "." ) && 748 ( !(e->attr & ATTR_DIRECTORY) &&
749 rb->strcmp( dc[i].name, ".." )) || 749 check_extention( e->name, ".bmp" ) ) )
750 ( !(dc[i].attr & ATTR_DIRECTORY) &&
751 check_extention( dc[i].name, ".bmp" ) ) )
752 { 750 {
753 if( !rb->strcmp( dc[i].name, bbuf_s ) ) 751 if( bbuf_s[0] && !rb->strcmp( e->name, bbuf_s ) )
754 selected = item_count; 752 selected = item_count;
755 indexes[item_count++] = i; 753 indexes[item_count++] = i;
756 } 754 }
@@ -774,40 +772,40 @@ static bool browse( char *dst, int dst_size, const char *start )
774 rb->set_current_file( backup.currdir ); 772 rb->set_current_file( backup.currdir );
775 return false; 773 return false;
776 } 774 }
777 rb->strcpy( bbuf_s, ".." ); 775 a = bbuf + bbuf_len - 1;
776 if( a == bbuf ) break;
777 while( *a == '/' ) a--;
778 *(a+1) = '\0';
779 while( *a != '/' ) a--;
780 /* select parent directory */
781 rb->strcpy( bbuf_s, ++a );
782 *a = '\0';
783 bbuf_len = a - bbuf;
784 reload = true;
785 break;
786
778 case ACTION_STD_OK: 787 case ACTION_STD_OK:
779 if( button == ACTION_STD_OK ) 788 selected = rb->gui_synclist_get_sel_pos( &browse_list );
789 if( selected < 0 || selected >= item_count )
790 break;
791 e = &dc[indexes[selected]];
792 if( !( e->attr & ATTR_DIRECTORY ) )
780 { 793 {
781 selected = rb->gui_synclist_get_sel_pos( &browse_list ); 794 rb->snprintf( dst, dst_size, "%s%s", bbuf, e->name );
782 if( selected < 0 || selected >= item_count ) 795 *tree = backup;
783 break; 796 rb->set_current_file( backup.currdir );
784 struct entry* e = &dc[indexes[selected]]; 797 return true;
785 rb->strlcpy( bbuf_s, e->name, sizeof( bbuf_s ) );
786 if( !( e->attr & ATTR_DIRECTORY ) )
787 {
788 *tree = backup;
789 rb->set_current_file( backup.currdir );
790 rb->snprintf( dst, dst_size, "%s%s", bbuf, bbuf_s );
791 return true;
792 }
793 } 798 }
794 if( !rb->strcmp( bbuf_s, "." ) ) break; 799 len = rb->strlen(e->name);
795 a = bbuf+rb->strlen(bbuf); 800 if (bbuf_len + len + 2 < (int)sizeof(bbuf))
796 if( !rb->strcmp( bbuf_s, ".." ) )
797 { 801 {
798 a--; 802 bbuf_s[0] = '\0';
799 if( a == bbuf ) break; 803 rb->strcpy( bbuf+bbuf_len, e->name );
800 if( *a == '/' ) a--; 804 bbuf_len += len;
801 while( *a != '/' ) a--; 805 bbuf[bbuf_len++] = '/';
802 rb->strcpy( bbuf_s, ++a ); 806 bbuf[bbuf_len] = '\0';
803 /* select parent directory */
804 bbuf_s[rb->strlen(bbuf_s)-1] = '\0';
805 *a = '\0';
806 reload = true; 807 reload = true;
807 break;
808 } 808 }
809 rb->snprintf( a, bbuf+sizeof(bbuf)-a, "%s/", bbuf_s );
810 reload = true;
811 break; 809 break;
812 810
813 case ACTION_STD_MENU: 811 case ACTION_STD_MENU:
@@ -827,13 +825,16 @@ static bool browse( char *dst, int dst_size, const char *start )
827 ***********************************************************************/ 825 ***********************************************************************/
828static bool browse_fonts( char *dst, int dst_size ) 826static bool browse_fonts( char *dst, int dst_size )
829{ 827{
830#define WIDTH ( LCD_WIDTH - 20 )
831#define HEIGHT ( LCD_HEIGHT - 20 )
832#define LINE_SPACE 2 828#define LINE_SPACE 2
833 int top, top_inside = 0, left; 829#define fh_buf buffer->text.fh_buf
830#define fw_buf buffer->text.fw_buf
831
832 struct tree_context backup;
833 struct entry *dc, *e;
834 int dirfilter = SHOW_FONT;
835
836 int top = 0;
834 837
835 DIR *d;
836 struct dirent *de;
837 int fvi = 0; /* first visible item */ 838 int fvi = 0; /* first visible item */
838 int lvi = 0; /* last visible item */ 839 int lvi = 0; /* last visible item */
839 int si = 0; /* selected item */ 840 int si = 0; /* selected item */
@@ -844,30 +845,36 @@ static bool browse_fonts( char *dst, int dst_size )
844 int b_need_redraw = 1; /* Do we need to redraw ? */ 845 int b_need_redraw = 1; /* Do we need to redraw ? */
845 846
846 int cp = 0; /* current position */ 847 int cp = 0; /* current position */
847 int fh; /* font height */ 848 int sp = 0; /* selected position */
849 int fh, fw; /* font height, width */
848 850
849 #define fh_buf buffer->text.fh_buf /* 30 might not be enough ... */ 851 char *a;
850 #define fw_buf buffer->text.fw_buf
851 int fw;
852 #define fontname_buf buffer->text.fontname_buf
853 852
854 rb->snprintf( buffer->text.old_font, MAX_PATH, 853 rb->snprintf( buffer->text.old_font, MAX_PATH,
855 FONT_DIR "/%s.fnt", 854 FONT_DIR "/%s.fnt",
856 rb->global_settings->font_file ); 855 rb->global_settings->font_file );
857 856
857 tree = rb->tree_get_context();
858 backup = *tree;
859 dc = tree->dircache;
860 a = backup.currdir+rb->strlen(backup.currdir)-1;
861 if( *a != '/' )
862 {
863 *++a = '/';
864 }
865 rb->strcpy( a+1, dc[tree->selected_item].name );
866 tree->dirfilter = &dirfilter;
867 rb->strcpy( bbuf, FONT_DIR "/" );
868 rb->set_current_file( bbuf );
869
858 while( 1 ) 870 while( 1 )
859 { 871 {
860 if( !b_need_redraw ) 872 if( !b_need_redraw )
861 { 873 {
862 /* we don't need to redraw ... but we need to unselect 874 /* we don't need to redraw ... but we need to unselect
863 * the previously selected item */ 875 * the previously selected item */
864 cp = top_inside + LINE_SPACE;
865 for( i = 0; i+fvi < osi; i++ )
866 {
867 cp += fh_buf[i] + LINE_SPACE;
868 }
869 rb->lcd_set_drawmode(DRMODE_COMPLEMENT); 876 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
870 rb->lcd_fillrect( left+10, cp, fw_buf[i], fh_buf[i] ); 877 rb->lcd_fillrect( 10, sp, LCD_WIDTH-10, fh_buf[osi-fvi] );
871 rb->lcd_set_drawmode(DRMODE_SOLID); 878 rb->lcd_set_drawmode(DRMODE_SOLID);
872 } 879 }
873 880
@@ -875,91 +882,77 @@ static bool browse_fonts( char *dst, int dst_size )
875 { 882 {
876 b_need_redraw = 0; 883 b_need_redraw = 0;
877 884
878 d = rb->opendir( FONT_DIR "/" ); 885 rb->lcd_set_foreground(COLOR_BLACK);
879 if( !d ) 886 rb->lcd_set_background(COLOR_LIGHTGRAY);
887 rb->lcd_clear_display();
888
889 rb->font_getstringsize( "Fonts", NULL, &fh, FONT_UI );
890 rb->lcd_putsxy( 2, 2, "Fonts" );
891 top = fh + 4 + LINE_SPACE;
892
893 for( i = 0; fvi < lvi && nvih > 0; i++, fvi++ )
880 { 894 {
881 return false; 895 nvih -= fh_buf[i] + LINE_SPACE;
882 } 896 }
883 top_inside = draw_window( HEIGHT, WIDTH, &top, &left, "Fonts" ); 897 nvih = 0;
884 i = 0; 898 i = fvi;
885 li = -1; 899 li = -1;
886 while( i < fvi )
887 {
888 rb->readdir( d );
889 i++;
890 }
891 cp = top_inside+LINE_SPACE;
892 900
893 rb->lcd_set_foreground(COLOR_BLACK); 901 cp = top;
894 rb->lcd_set_background(COLOR_LIGHTGRAY); 902 while( cp < LCD_HEIGHT && i < tree->filesindir )
895
896 while( cp < top+HEIGHT )
897 { 903 {
898 de = rb->readdir( d ); 904 e = &dc[i];
899 if( !de ) 905 rb->snprintf( bbuf, MAX_PATH, FONT_DIR "/%s", e->name );
900 {
901 li = i-1;
902 break;
903 }
904 if( !check_extention( de->d_name, ".fnt" ) )
905 continue;
906 rb->snprintf( bbuf, MAX_PATH, FONT_DIR "/%s",
907 de->d_name );
908 rb->font_load(NULL, bbuf ); 906 rb->font_load(NULL, bbuf );
909 rb->font_getstringsize( de->d_name, &fw, &fh, FONT_UI ); 907 rb->font_getstringsize( e->name, &fw, &fh, FONT_UI );
910 if( nvih > 0 ) 908 if( cp + fh >= LCD_HEIGHT )
911 {
912 nvih -= fh;
913 fvi++;
914 if( nvih < 0 ) nvih = 0;
915 i++;
916 continue;
917 }
918 if( cp + fh >= top+HEIGHT )
919 { 909 {
920 nvih = fh; 910 nvih = fh;
921 break; 911 break;
922 } 912 }
923 rb->lcd_putsxy( left+10, cp, de->d_name ); 913 rb->lcd_putsxy( 10, cp, e->name );
924 fh_buf[i-fvi] = fh; 914 fh_buf[i-fvi] = fh;
925 fw_buf[i-fvi] = fw; 915 fw_buf[i-fvi] = fw;
926 cp += fh + LINE_SPACE; 916 cp += fh + LINE_SPACE;
927 rb->strcpy( fontname_buf[i-fvi], bbuf );
928 i++; 917 i++;
929 } 918 }
930 lvi = i-1; 919 lvi = i-1;
920 if( i >= tree->filesindir )
921 {
922 li = i-1;
923 }
931 if( li == -1 ) 924 if( li == -1 )
932 { 925 {
933 if( !(de = rb->readdir( d ) ) ) 926 if( !nvih )
934 {
935 li = lvi;
936 }
937 else if( !nvih && check_extention( de->d_name, ".fnt" ) )
938 { 927 {
939 rb->snprintf( bbuf, MAX_PATH, FONT_DIR "/%s", 928 e = &dc[i];
940 de->d_name ); 929 rb->snprintf( bbuf, MAX_PATH, FONT_DIR "/%s", e->name );
941 rb->font_load(NULL, bbuf ); 930 rb->font_load(NULL, bbuf );
942 rb->font_getstringsize( de->d_name, NULL, &fh, FONT_UI ); 931 rb->font_getstringsize( e->name, NULL, &fh, FONT_UI );
943 nvih = fh; 932 nvih = fh;
944 } 933 }
945 } 934 }
946 rb->font_load(NULL, buffer->text.old_font ); 935 rb->font_load(NULL, buffer->text.old_font );
947 rb->closedir( d ); 936 if( lvi-fvi < tree->filesindir-1 )
937 {
938 rb->gui_scrollbar_draw( rb->screens[SCREEN_MAIN], 0, top,
939 9, cp-LINE_SPACE-top,
940 tree->filesindir-1, fvi, lvi, VERTICAL);
941 }
948 } 942 }
949 943
950 rb->lcd_set_drawmode(DRMODE_COMPLEMENT); 944 rb->lcd_set_drawmode(DRMODE_COMPLEMENT);
951 cp = top_inside + LINE_SPACE; 945 sp = top;
952 for( i = 0; i+fvi < si; i++ ) 946 for( i = 0; i+fvi < si; i++ )
953 { 947 {
954 cp += fh_buf[i] + LINE_SPACE; 948 sp += fh_buf[i] + LINE_SPACE;
955 } 949 }
956 rb->lcd_fillrect( left+10, cp, fw_buf[i], fh_buf[i] ); 950 rb->lcd_fillrect( 10, sp, LCD_WIDTH-10, fh_buf[si-fvi] );
957 rb->lcd_set_drawmode(DRMODE_SOLID); 951 rb->lcd_set_drawmode(DRMODE_SOLID);
958 952
959 rb->lcd_update_rect( left, top, WIDTH, HEIGHT ); 953 rb->lcd_update();
960 954
961 osi = si; 955 osi = si;
962 i = fvi;
963 switch( rb->button_get(true) ) 956 switch( rb->button_get(true) )
964 { 957 {
965 case ROCKPAINT_UP: 958 case ROCKPAINT_UP:
@@ -967,9 +960,11 @@ static bool browse_fonts( char *dst, int dst_size )
967 if( si > 0 ) 960 if( si > 0 )
968 { 961 {
969 si--; 962 si--;
970 if( si<fvi ) 963 if( si < fvi )
971 { 964 {
972 fvi = si; 965 fvi = si;
966 nvih = 0;
967 b_need_redraw = 1;
973 } 968 }
974 } 969 }
975 break; 970 break;
@@ -979,32 +974,29 @@ static bool browse_fonts( char *dst, int dst_size )
979 if( li == -1 || si < li ) 974 if( li == -1 || si < li )
980 { 975 {
981 si++; 976 si++;
977 if( si > lvi )
978 {
979 b_need_redraw = 1;
980 }
982 } 981 }
983 break; 982 break;
984 983
985 case ROCKPAINT_LEFT: 984 case ROCKPAINT_LEFT:
986 case ROCKPAINT_QUIT: 985 case ROCKPAINT_QUIT:
986 *tree = backup;
987 rb->set_current_file( backup.currdir );
987 return false; 988 return false;
988 989
989 case ROCKPAINT_RIGHT: 990 case ROCKPAINT_RIGHT:
990 case ROCKPAINT_DRAW: 991 case ROCKPAINT_DRAW:
991 rb->snprintf( dst, dst_size, "%s", fontname_buf[si-fvi] ); 992 rb->snprintf( dst, dst_size, FONT_DIR "/%s", dc[si].name );
993 *tree = backup;
994 rb->set_current_file( backup.currdir );
992 return true; 995 return true;
993 } 996 }
994
995 if( i != fvi || si > lvi )
996 {
997 b_need_redraw = 1;
998 }
999
1000 if( si<=lvi )
1001 {
1002 nvih = 0;
1003 }
1004 } 997 }
1005#undef fh_buf 998#undef fh_buf
1006#undef fw_buf 999#undef fw_buf
1007#undef fontname_buf
1008#undef WIDTH 1000#undef WIDTH
1009#undef HEIGHT 1001#undef HEIGHT
1010#undef LINE_SPACE 1002#undef LINE_SPACE