summaryrefslogtreecommitdiff
path: root/apps/plugins/rockpaint.c
diff options
context:
space:
mode:
Diffstat (limited to 'apps/plugins/rockpaint.c')
-rw-r--r--apps/plugins/rockpaint.c139
1 files changed, 18 insertions, 121 deletions
diff --git a/apps/plugins/rockpaint.c b/apps/plugins/rockpaint.c
index fc4621a805..0acbe41aaf 100644
--- a/apps/plugins/rockpaint.c
+++ b/apps/plugins/rockpaint.c
@@ -684,136 +684,33 @@ static bool check_extention(const char *filename, const char *ext)
684 return ( p != NULL && !rb->strcasecmp( p, ext ) ); 684 return ( p != NULL && !rb->strcasecmp( p, ext ) );
685} 685}
686 686
687static const char* browse_get_name_cb(int selected_item, void *data, 687/* only displayes directories and .bmp files */
688 char *buffer, size_t buffer_len) 688static bool callback_show_item(char *name, int attr, struct tree_context *tc)
689{ 689{
690 int *indexes = (int *) data; 690 (void) tc;
691 struct entry* dc = tree->dircache; 691 if( ( attr & ATTR_DIRECTORY ) ||
692 struct entry* e = &dc[indexes[selected_item]]; 692 ( !(attr & ATTR_DIRECTORY) && check_extention( name, ".bmp" ) ) )
693 (void) buffer; 693 {
694 (void) buffer_len; 694 return true;
695 695 }
696 return e->name; 696 return false;
697} 697}
698 698
699static bool browse( char *dst, int dst_size, const char *start ) 699static bool browse( char *dst, int dst_size, const char *start )
700{ 700{
701 struct gui_synclist browse_list; 701 struct browse_context browse;
702 int item_count = 0, selected, button;
703 struct tree_context backup;
704 struct entry *dc, *e;
705 bool reload = true;
706 int dirfilter = SHOW_ALL;
707 int *indexes = (int *) buffer;
708 size_t bbuf_len, len;
709
710 char *a;
711
712 rb->strcpy( bbuf, start );
713 bbuf_len = rb->strlen(bbuf);
714 if( bbuf[bbuf_len-1] != '/' )
715 {
716 bbuf[bbuf_len++] = '/';
717 bbuf[bbuf_len] = '\0';
718 }
719 bbuf_s[0] = '\0';
720
721 rb->gui_synclist_init(&browse_list, browse_get_name_cb,
722 (void*) indexes, false, 1, NULL);
723 702
724 tree = rb->tree_get_context(); 703 rb->browse_context_init(&browse, SHOW_ALL,
725 backup = *tree; 704 BROWSE_SELECTONLY|BROWSE_NO_CONTEXT_MENU,
726 dc = tree->dircache; 705 NULL, NOICON, start, NULL);
727 a = backup.currdir+rb->strlen(backup.currdir)-1;
728 if( *a != '/' )
729 {
730 *++a = '/';
731 }
732 rb->strcpy( a+1, dc[tree->selected_item].name );
733 tree->dirfilter = &dirfilter;
734 tree->browse = NULL;
735 while( 1 )
736 {
737 if( reload )
738 {
739 int i;
740 rb->set_current_file(bbuf);
741 item_count = 0;
742 selected = 0;
743 for( i = 0; i < tree->filesindir ; i++)
744 {
745 e = &dc[i];
746 /* only displayes directories and .bmp files */
747 if( ( e->attr & ATTR_DIRECTORY ) ||
748 ( !(e->attr & ATTR_DIRECTORY) &&
749 check_extention( e->name, ".bmp" ) ) )
750 {
751 if( bbuf_s[0] && !rb->strcmp( e->name, bbuf_s ) )
752 selected = item_count;
753 indexes[item_count++] = i;
754 }
755 }
756 706
757 rb->gui_synclist_set_nb_items(&browse_list,item_count); 707 browse.callback_show_item = callback_show_item;
758 rb->gui_synclist_select_item(&browse_list, selected); 708 browse.buf = dst;
759 rb->gui_synclist_set_title(&browse_list, bbuf, NOICON); 709 browse.bufsize = dst_size;
760 rb->gui_synclist_draw(&browse_list);
761 reload = false;
762 }
763 button = rb->get_action(CONTEXT_LIST,TIMEOUT_BLOCK);
764 if (rb->gui_synclist_do_button(&browse_list,&button,LIST_WRAP_UNLESS_HELD))
765 continue;
766 switch( button )
767 {
768 case ACTION_STD_CANCEL:
769 if( !rb->strcmp( bbuf, "/" ) )
770 {
771 *tree = backup;
772 rb->set_current_file( backup.currdir );
773 return false;
774 }
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 710
787 case ACTION_STD_OK: 711 rb->rockbox_browse(&browse);
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 ) )
793 {
794 rb->snprintf( dst, dst_size, "%s%s", bbuf, e->name );
795 *tree = backup;
796 rb->set_current_file( backup.currdir );
797 return true;
798 }
799 len = rb->strlen(e->name);
800 if( bbuf_len + len + 2 < (int)sizeof(bbuf) )
801 {
802 bbuf_s[0] = '\0';
803 rb->strcpy( bbuf+bbuf_len, e->name );
804 bbuf_len += len;
805 bbuf[bbuf_len++] = '/';
806 bbuf[bbuf_len] = '\0';
807 reload = true;
808 }
809 break;
810 712
811 case ACTION_STD_MENU: 713 return (browse.flags & BROWSE_SELECTED);
812 *tree = backup;
813 rb->set_current_file( backup.currdir );
814 return false;
815 }
816 }
817} 714}
818 715
819/*********************************************************************** 716/***********************************************************************