diff options
author | Teruaki Kawashima <teru@rockbox.org> | 2010-11-17 14:50:43 +0000 |
---|---|---|
committer | Teruaki Kawashima <teru@rockbox.org> | 2010-11-17 14:50:43 +0000 |
commit | 62b8efe6741b61ef10d3c7b98dd0d3416b7fce11 (patch) | |
tree | da65384f9bbcd968e2726e3343c106ac22e42f0b /apps | |
parent | bd2011bc6ac08ffac15fd08cd3b5b5989b0ddfbf (diff) | |
download | rockbox-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
Diffstat (limited to 'apps')
-rw-r--r-- | apps/plugins/rockpaint.c | 242 |
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 | ***********************************************************************/ |
828 | static bool browse_fonts( char *dst, int dst_size ) | 826 | static 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 |