From: skeezix Date: Tue, 20 Apr 2010 14:55:23 +0000 (-0400) Subject: Cleaned up some of the category management; its still obviously a menu written in... X-Git-Tag: Release-2010-05/1~8 X-Git-Url: http://git.openpandora.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=d703366bcfec338f1dd9b95d2f643bc6a48f5de1;p=pandora-libraries.git Cleaned up some of the category management; its still obviously a menu written in 5 days, but works well :) --- diff --git a/minimenu/mmcat.c b/minimenu/mmcat.c index 9ca3683..9d1b1a0 100644 --- a/minimenu/mmcat.c +++ b/minimenu/mmcat.c @@ -46,7 +46,7 @@ unsigned char category_push ( char *catname, pnd_disco_t *app, pnd_conf_handle o // category was found.. } else { // category wasn't found.. - pnd_log ( PND_LOG_DEFAULT, "New category '%s'\n", catname ); + //pnd_log ( PND_LOG_DEFAULT, "New category '%s'\n", catname ); g_categories [ g_categorycount ].catname = strdup ( catname ); g_categories [ g_categorycount ].refs = NULL; c = &(g_categories [ g_categorycount ]); @@ -192,13 +192,13 @@ void category_dump ( void ) { return; } -void category_freeall ( void ) { +static void _category_freeall ( mm_category_t *p, unsigned int c ) { unsigned int i; mm_appref_t *iter, *next; - for ( i = 0; i < g_categorycount; i++ ) { + for ( i = 0; i < c; i++ ) { - iter = g_categories [ i ].refs; + iter = p [ i ].refs; while ( iter ) { next = iter -> next; @@ -206,11 +206,30 @@ void category_freeall ( void ) { iter = next; } - g_categories [ i ].refs = NULL; + p [ i ].refs = NULL; + + if ( p [ i ].catname ) { + free ( p [ i ].catname ); + p [ i ].catname = NULL; + } + + if ( p [ i ].fspath ) { + free ( p [ i ].fspath ); + p [ i ].fspath = NULL; + } } // for + return; +} + +void category_freeall ( void ) { + + _category_freeall ( g_categories, g_categorycount ); + _category_freeall ( _categories_invis, _categories_inviscount ); + g_categorycount = 0; + _categories_inviscount = 0; return; } @@ -264,9 +283,10 @@ mm_category_t *category_map_query ( char *cat ) { return ( NULL ); } -unsigned char category_meta_push ( char *catname, pnd_disco_t *app, pnd_conf_handle ovrh, unsigned char visiblep ) { +unsigned char category_meta_push ( char *catname, char *parentcatname, pnd_disco_t *app, pnd_conf_handle ovrh, unsigned char visiblep ) { mm_category_t *cat; unsigned char catcount = g_categorycount; + char catnamebuffer [ 512 ] = ""; if ( ! catname ) { return ( 1 ); // fine, just nada @@ -279,6 +299,12 @@ unsigned char category_meta_push ( char *catname, pnd_disco_t *app, pnd_conf_han g_categories = _categories_invis; g_categorycount = _categories_inviscount; + // if invisible, and a parent category name is known, prepend it for ease of use + if ( parentcatname ) { + snprintf ( catnamebuffer, 500, "%s.%s", parentcatname, catname ); + catname = catnamebuffer; + } + } // do we honour cat mapping at all? @@ -418,3 +444,18 @@ unsigned char category_fs_restock ( mm_category_t *cat ) { return ( 1 ); } + +static int catname_cmp ( const void *p1, const void *p2 ) { + mm_category_t *c1 = (mm_category_t*) p1; + mm_category_t *c2 = (mm_category_t*) p2; + return ( strcasecmp ( c1 -> catname, c2 -> catname ) ); +} + +void category_sort ( void ) { + // we probably don't want to sort tab categories, since the user may have specified an ordering + // But we can sort invisi-cats, to make them easier to find, and ordered by parent category + + qsort ( _categories_invis, _categories_inviscount, sizeof(mm_category_t), catname_cmp ); + + return; +} diff --git a/minimenu/mmcat.h b/minimenu/mmcat.h index 3157f4e..1f84e70 100644 --- a/minimenu/mmcat.h +++ b/minimenu/mmcat.h @@ -29,6 +29,7 @@ mm_category_t *category_query ( char *catname ); void category_dump ( void ); // sort the apprefs void category_freeall ( void ); int cat_sort_score ( mm_appref_t *s1, mm_appref_t *s2 ); // like strcmp, but used to sort apps by title +void category_sort ( void ); // for sorting categories // category mapping hack typedef struct { @@ -38,7 +39,7 @@ typedef struct { unsigned char category_map_setup ( void ); // set up the mappings mm_category_t *category_map_query ( char *cat ); -unsigned char category_meta_push ( char *catname, pnd_disco_t *app, pnd_conf_handle ovrh, unsigned char visiblep ); +unsigned char category_meta_push ( char *catname, char *parentcatname, pnd_disco_t *app, pnd_conf_handle ovrh, unsigned char visiblep ); // filesystem browser unsigned char category_fs_restock ( mm_category_t *cat ); diff --git a/minimenu/mmenu.c b/minimenu/mmenu.c index fe56bbd..01a7341 100644 --- a/minimenu/mmenu.c +++ b/minimenu/mmenu.c @@ -537,13 +537,13 @@ void applications_scan ( void ) { } // all? // main categories - category_meta_push ( iter -> main_category, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_maincat", 1 ) ); - category_meta_push ( iter -> main_category1, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_maincat1", 0 ) ); - category_meta_push ( iter -> main_category2, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_maincat2", 0 ) ); + category_meta_push ( iter -> main_category, NULL /* no parent cat */, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_maincat", 1 ) ); + category_meta_push ( iter -> main_category1, iter -> main_category, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_maincat1", 0 ) ); + category_meta_push ( iter -> main_category2, iter -> main_category, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_maincat2", 0 ) ); // alt categories - category_meta_push ( iter -> alt_category, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_altcat", 0 ) ); - category_meta_push ( iter -> alt_category1, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_altcat1", 0 ) ); - category_meta_push ( iter -> alt_category2, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_altcat2", 0 ) ); + category_meta_push ( iter -> alt_category, NULL /* no parent cat */, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_altcat", 0 ) ); + category_meta_push ( iter -> alt_category1, iter -> alt_category, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_altcat1", 0 ) ); + category_meta_push ( iter -> alt_category2, iter -> alt_category, iter, ovrh, pnd_conf_get_as_int_d ( g_conf, "tabs.top_altcat2", 0 ) ); } // register with categories or filter out @@ -552,6 +552,9 @@ void applications_scan ( void ) { itercount++; } // while + // sort (some) categories + category_sort(); + // set up filesystem browser tabs if ( pnd_conf_get_as_int_d ( g_conf, "filesystem.do_browser", 0 ) ) { char *searchpath = pnd_conf_get_as_char ( g_conf, "filesystem.tab_searchpaths" ); diff --git a/minimenu/mmui.c b/minimenu/mmui.c index aeafcd6..b1e57c6 100644 --- a/minimenu/mmui.c +++ b/minimenu/mmui.c @@ -2700,6 +2700,10 @@ void ui_revealscreen ( void ) { unsigned int labelmax = 0; unsigned int i; + if ( ! _categories_inviscount ) { + return; // nothing to do + } + for ( i = 0; i < _categories_inviscount; i++ ) { labels [ labelmax++ ] = _categories_invis [ i ].catname; } @@ -2714,18 +2718,31 @@ void ui_revealscreen ( void ) { return; } + // fix up category name, if its been hacked + if ( strchr ( _categories_invis [ sel ].catname, '.' ) ) { + char *t = _categories_invis [ sel ].catname; + _categories_invis [ sel ].catname = strdup ( strchr ( _categories_invis [ sel ].catname, '.' ) + 1 ); + free ( t ); + } + // copy invisi-cat into live-cat memmove ( &(g_categories [ g_categorycount ]), &(_categories_invis [ sel ]), sizeof(mm_category_t) ); g_categorycount++; + // move subsequent invisi-cats up, so the selected invisi-cat is nolonger existing in invisi-list at + // all (avoid double-free() later) + memmove ( &(_categories_invis [ sel ]), &(_categories_invis [ sel + 1 ]), sizeof(mm_category_t) * ( _categories_inviscount - sel - 1 ) ); + _categories_inviscount--; + // switch to the new category ui_category = g_categorycount - 1; + // ensure visibility unsigned int screen_width = pnd_conf_get_as_int_d ( g_conf, "display.screen_width", 800 ); unsigned int tab_width = pnd_conf_get_as_int ( g_conf, "tabs.tab_width" ); if ( ui_category > ui_catshift + ( screen_width / tab_width ) - 1 ) { - //ui_catshift++; ui_catshift = ui_category - ( screen_width / tab_width ) + 1; } + // redraw tabs render_mask |= CHANGED_CATEGORY; }