Ticket #619: POI.diff

File POI.diff, 8.7 KB (added by nioui, 11 years ago)

Improvements to the POI menu entries

  • attr_def.h

     
    7272ATTR(icon_l)
    7373ATTR(icon_s)
    7474ATTR(spacing)
     75ATTR(nb_lines)
    7576ATTR(recent_dest)
    7677ATTR(destination_distance)
    7778ATTR(check_version)
  • gui/internal/gui_internal.c

     
    7171#include "util.h"
    7272#include "bookmarks.h"
    7373#include "debug.h"
     74#include "fib.h"
    7475
    7576
    7677extern char *version;
     
    192193   */
    193194  int spacing;
    194195
     196  int nb_lines;
    195197};
    196198
    197199/**
     
    209211 * [2] => Small profile (default)
    210212 */
    211213static struct gui_config_settings config_profiles[]={
    212       {545,32,48,96,10}
    213     , {300,32,48,64,3}
    214       ,{200,16,32,48,2}
     214        {545,32,48,96,10,10},
     215        {300,32,48,64,3,8},
     216        {200,16,32,48,2,5}
    215217};
    216218
    217219struct route_data {
     
    242244        int fullscreen;
    243245        struct graphics_font *fonts[3];
    244246        int icon_xs, icon_s, icon_l;
     247        int nb_lines;
    245248        int pressed;
    246249        struct widget *widgets;
    247250        int widgets_count;
     
    17481751  {
    17491752    this->icon_l = this->config.icon_l;
    17501753  }
     1754  if(this->config.nb_lines == -1 )
     1755  {
     1756      this->nb_lines = current_config->nb_lines;
     1757  }
     1758  else
     1759  {
     1760    this->nb_lines = this->config.nb_lines;
     1761  }
    17511762  if(this->config.spacing == -1 )
    17521763  {
    17531764    this->spacing = current_config->spacing;
     
    21982209                type_none}},
    21992210};
    22002211
     2212union poi_param {
     2213        guint i;
     2214        struct {
     2215                unsigned char sel, selnb, pagenb, dist;
     2216        } p;
     2217};
     2218
    22012219static void gui_internal_cmd_pois(struct gui_priv *this, struct widget *wm, void *data);
    22022220
    22032221static struct widget *
    2204 gui_internal_cmd_pois_selector(struct gui_priv *this, struct pcoord *c)
     2222gui_internal_cmd_pois_selector(struct gui_priv *this, struct pcoord *c, int pagenb)
    22052223{
    22062224        struct widget *wl,*wb;
    22072225        int i;
    22082226        wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill);
    22092227        for (i = 0 ; i < sizeof(selectors)/sizeof(struct selector) ; i++) {
    2210         gui_internal_widget_append(wl, wb=gui_internal_button_new_with_callback(this, NULL,
    2211                 image_new_xs(this, selectors[i].icon), gravity_left_center|orientation_vertical,
    2212                 gui_internal_cmd_pois, &selectors[i]));
     2228                union poi_param p;
     2229                p.p.sel = 1;
     2230                p.p.selnb = i;
     2231                p.p.pagenb = pagenb;
     2232                p.p.dist = 0;
     2233                gui_internal_widget_append(wl, wb=gui_internal_button_new_with_callback(this, NULL,
     2234                        image_new_xs(this, selectors[i].icon), gravity_left_center|orientation_vertical,
     2235                        gui_internal_cmd_pois, GUINT_TO_POINTER(p.i)));
    22132236                wb->c=*c;
    22142237                wb->bt=10;
    22152238        }
     
    22172240}
    22182241
    22192242static struct widget *
    2220 gui_internal_cmd_pois_item(struct gui_priv *this, struct coord *center, struct item *item, struct coord *c, int dist)
     2243gui_internal_cmd_pois_item(struct gui_priv *this, struct coord *center, struct item *item, struct coord *c, int dist, char* name)
    22212244{
    22222245        char distbuf[32];
    22232246        char dirbuf[32];
    22242247        char *type;
    2225         struct attr attr;
    22262248        struct widget *wl,*wt;
    22272249        char *text;
    22282250
    22292251        wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill);
    22302252
    2231         sprintf(distbuf,"%d", dist/1000);
     2253        if (dist > 10000)
     2254                sprintf(distbuf,"%d", dist/1000);
     2255        else
     2256                sprintf(distbuf,"%d.%d", dist/1000, (dist%1000)/100);
    22322257        get_direction(dirbuf, transform_get_angle_delta(center, c, 0), 1);
    22332258        type=item_to_name(item->type);
    2234         if (item_attr_get(item, attr_label, &attr)) {
    2235                 wl->name=g_strdup_printf("%s %s",type,attr.u.str);
     2259        if (name[0]) {
     2260                wl->name=g_strdup_printf("%s %s",type,name);
    22362261        } else {
    2237                 attr.u.str="";
    22382262                wl->name=g_strdup(type);
    22392263        }
    2240         text=g_strdup_printf("%s %s %s %s", distbuf, dirbuf, type, attr.u.str);
     2264        text=g_strdup_printf("%s %s %s %s", distbuf, dirbuf, type, name);
    22412265        wt=gui_internal_label_new(this, text);
     2266
    22422267        wt->datai=dist;
    22432268        gui_internal_widget_append(wl, wt);
    22442269        g_free(text);
     
    22842309
    22852310static void gui_internal_cmd_position(struct gui_priv *this, struct widget *wm, void *data);
    22862311
     2312struct item_data {
     2313        int dist;
     2314        char label[32];
     2315        struct item item;
     2316        struct coord c;
     2317};
     2318
    22872319static void
    22882320gui_internal_cmd_pois(struct gui_priv *this, struct widget *wm, void *data)
    22892321{
     
    22932325        struct map *m;
    22942326        struct map_rect *mr;
    22952327        struct item *item;
    2296         int idist,dist=20000;
    22972328        struct widget *wi,*w,*w2,*wb;
    22982329        enum projection pro=wm->c.pro;
    2299         struct selector *isel=wm->data;
     2330        union poi_param param = {.i = GPOINTER_TO_UINT(wm->data)};
     2331        int idist,dist=10000*(param.p.dist+1);
     2332        struct selector *isel = param.p.sel? &selectors[param.p.selnb]: NULL;
     2333        int pagenb = param.p.pagenb;
     2334        int pagesize = this->nb_lines;
     2335        int maxitem = pagesize*(pagenb+1), it = 0, i;
     2336        struct item_data *items= malloc(maxitem * sizeof(struct item_data));
     2337       
     2338        struct fibheap* fh = fh_makekeyheap();
     2339        int cnt = 0;
    23002340
     2341        dbg(2, "Params: sel = %i, selnb = %i, pagenb = %i, dist = %i\n",
     2342            param.p.sel, param.p.selnb, param.p.pagenb, param.p.dist);
     2343
    23012344        wb=gui_internal_menu(this, isel ? isel->name : _("POIs"));
    23022345        w=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill);
    23032346        gui_internal_widget_append(wb, w);
    2304         if (! isel)
    2305                 gui_internal_widget_append(w, gui_internal_cmd_pois_selector(this,&wm->c));
     2347        if (! param.i)
     2348                gui_internal_widget_append(w, gui_internal_cmd_pois_selector(this,&wm->c,pagenb));
    23062349        w2=gui_internal_box_new(this, gravity_top_center|orientation_vertical|flags_expand|flags_fill);
    23072350        gui_internal_widget_append(w, w2);
    23082351
     
    23202363                                    item_coord_get_pro(item, &c, 1, pro) &&
    23212364                                    coord_rect_contains(&sel->u.c_rect, &c) &&
    23222365                                    (idist=transform_distance(pro, &center, &c)) < dist) {
    2323                                         gui_internal_widget_append(w2, wi=gui_internal_cmd_pois_item(this, &center, item, &c, idist));
    2324                                         wi->func=gui_internal_cmd_position;
    2325                                         wi->data=(void *)2;
    2326                                         wi->item=*item;
    2327                                         wi->state |= STATE_SENSITIVE;
    2328                                         wi->c.x=c.x;
    2329                                         wi->c.y=c.y;
    2330                                         wi->c.pro=pro;
     2366                                        struct item_data *data;
     2367                                        struct attr attr;
     2368                                        if (it == maxitem) {
     2369                                                data = fh_extractmin(fh);
     2370                                        } else {
     2371                                                data = &items[it++];
     2372                                        }
     2373                                        data->item = *item;
     2374                                        data->c = c;
     2375                                        data->dist = idist;
     2376                                        if (item_attr_get(item, attr_label, &attr)) {
     2377                                                strncpy(data->label, attr.u.str, sizeof(data->label));
     2378                                        } else {
     2379                                                data->label[0] = 0;
     2380                                        }
     2381                                        fh_insertkey(fh, -((idist<<12) + cnt++), data);
     2382                                        if (it == maxitem)
     2383                                                dist = (-fh_minkey(fh))>>12;
    23312384                                }
    23322385                        }
    23332386                        map_rect_destroy(mr);
     
    23362389        }
    23372390        map_selection_destroy(sel);
    23382391        mapset_close(h);
    2339         w2->children=g_list_sort_with_data(w2->children,  gui_internal_cmd_pois_sort_num, (void *)1);
     2392
     2393        for (i = it; i > pagenb*pagesize; i--) {
     2394                int key = fh_minkey(fh);
     2395                struct item_data *data = fh_extractmin(fh);
     2396                if (data == NULL)
     2397                {
     2398                        dbg(2, "Empty heap: maxitem = %i, it = %i, dist = %i\n", maxitem, it, dist);
     2399                        break;
     2400                }
     2401                dbg(2, "dist1: %i, dist2: %i\n", data->dist, (-key)>>12);
     2402                gui_internal_widget_prepend(w2, wi=gui_internal_cmd_pois_item(this, &center, &data->item, &data->c, data->dist, data->label));
     2403                wi->func=gui_internal_cmd_position;
     2404                wi->data=(void *)2;
     2405                wi->item=data->item;
     2406                wi->state |= STATE_SENSITIVE;
     2407                wi->c.x=data->c.x;
     2408                wi->c.y=data->c.y;
     2409                wi->c.pro=pro;
     2410        }
     2411
     2412        fh_deleteheap(fh);
     2413        free(items);
     2414
     2415        {  // Add an entry for more POI
     2416                struct widget *wl,*wt;
     2417                char buffer[32];
     2418
     2419                wl=gui_internal_box_new(this, gravity_left_center|orientation_horizontal|flags_fill);
     2420                if (it == maxitem) {
     2421                        param.p.pagenb++;
     2422                        snprintf(buffer, sizeof(buffer), "Next page (%i)", param.p.pagenb+1);
     2423                } else {
     2424                        param.p.dist++;
     2425                        snprintf(buffer, sizeof(buffer), "More (%i km)", 10*(param.p.dist+1));
     2426                }
     2427                wt=gui_internal_label_new(this, buffer);
     2428                gui_internal_widget_append(wl, wt);
     2429                wl->func=gui_internal_cmd_pois;
     2430                wl->data=GUINT_TO_POINTER(param.i);
     2431                wl->state |= STATE_SENSITIVE;
     2432                wl->c = wm->c;
     2433                gui_internal_widget_append(w2, wl);
     2434        }
     2435
    23402436        gui_internal_menu_render(this);
    23412437}
    23422438
     
    62166312        {
    62176313          this->config.icon_s=-1;
    62186314        }
     6315        if( (attr=attr_search(attrs,NULL,attr_nb_lines)))
     6316        {
     6317          this->config.nb_lines=attr->u.num;
     6318        }
     6319        else
     6320        {
     6321          this->config.nb_lines=-1;
     6322        }
    62196323        if( (attr=attr_search(attrs,NULL,attr_spacing)))
    62206324        {
    62216325          this->config.spacing=attr->u.num;
  • gui/internal/Makefile.am

     
    11include $(top_srcdir)/Makefile.inc
    2 AM_CPPFLAGS = -I$(top_srcdir)/navit @NAVIT_CFLAGS@ -DMODULE=gui_internal
     2AM_CPPFLAGS = -I$(top_srcdir)/navit -I$(top_srcdir)/navit/fib-1.1 @NAVIT_CFLAGS@ -DMODULE=gui_internal
    33if PLUGINS
    44modulegui_LTLIBRARIES = libgui_internal.la
    55else