Ticket #962: clickthrough-111215.diff

File clickthrough-111215.diff, 14.8 KB (added by tryagain, 8 years ago)

Some cleanup done, moved parts to graphics.c to make code reuseable for other gui types.

  • navit/gui/internal/gui_internal.c

     
    299299        int pitch;
    300300        int flags_town,flags_street,flags_house_number;
    301301        int radius;
     302        int mouse_button_clicked_on_map;
    302303/* html */
    303304        char *html_text;
    304305        int html_depth;
     
    461462static void gui_internal_html_load_href(struct gui_priv *this, char *href, int replace);
    462463static void gui_internal_destroy(struct gui_priv *this);
    463464
     465
    464466/*
    465467 * * Display image scaled to specific size
    466468 * * searches for scaleable and pre-scaled image
     
    23732375        return r;
    23742376};
    23752377
     2378/**
     2379 * @brief Set POIs filter data in poi_param structure.
     2380 * @param param poi_param structure with unset filter data.
     2381 * @param text filter text.
     2382 */
     2383static void
     2384gui_internal_poi_param_set_filter(struct poi_param *param, char *text)
     2385{
     2386        char *s1, *s2;
     2387       
     2388        param->filterstr=removecase(text);
     2389        s1=param->filterstr;
     2390        do {
     2391                s2=g_utf8_strchr(s1,-1,' ');
     2392                if(s2)
     2393                        *s2++=0;
     2394                param->filter=g_list_append(param->filter,s1);
     2395                if(s2) {
     2396                        while(*s2==' ')
     2397                                s2++;
     2398                }
     2399                s1=s2;
     2400        } while(s2 && *s2);
     2401}
    23762402
     2403
    23772404static void gui_internal_cmd_pois(struct gui_priv *this, struct widget *wm, void *data);
    23782405static void gui_internal_cmd_pois_filter(struct gui_priv *this, struct widget *wm, void *data);
    23792406
     
    24492476        return wl;
    24502477}
    24512478
    2452 static gint
    2453 gui_internal_cmd_pois_sort_num(gconstpointer a, gconstpointer b, gpointer user_data)
    2454 {
    2455         const struct widget *wa=a;
    2456         const struct widget *wb=b;
    2457         struct widget *wac=wa->children->data;
    2458         struct widget *wbc=wb->children->data;
    2459 #if 0
    2460         int ia,ib;
    2461         ia=atoi(wac->text);
    2462         ib=atoi(wbc->text);
    2463 
    2464         return ia-ib;
    2465 #else
    2466         return wac->datai-wbc->datai;
    2467 #endif
    2468 }
    2469 
    24702479/**
    24712480 * @brief Get string representation of item address suitable for doing search and for display in POI list.
    24722481 *
     
    25732582        free(w);
    25742583}
    25752584
     2585
    25762586/**
    2577  * @brief apply POIs text filter.
     2587 * @brief Event to apply POIs text filter.
    25782588 *
    25792589 * @param this The graphics context.
    25802590 * @param wm called widget.
     
    25852595{
    25862596        struct widget *w=data;
    25872597        struct poi_param *param;
    2588         char *s1, *s2;
    25892598       
    25902599        if(!w->text)
    25912600                return;
     
    25962605        } else {
    25972606                param=g_new0(struct poi_param,1);
    25982607        }
    2599         param->filterstr=removecase(w->text);
    26002608        param->isAddressFilter=strcmp(wm->name,"AddressFilter")==0;
    2601         s1=param->filterstr;
    2602         do {
    2603                 s2=g_utf8_strchr(s1,-1,' ');
    2604                 if(s2)
    2605                         *s2++=0;
    2606                 param->filter=g_list_append(param->filter,s1);
    2607                 if(s2) {
    2608                         while(*s2==' ')
    2609                                 s2++;
    2610                 }
    2611                 s1=s2;
    2612         } while(s2 && *s2);
    26132609
     2610        gui_internal_poi_param_set_filter(param, w->text);
     2611
    26142612        gui_internal_cmd_pois(this,w,param);
    26152613        gui_internal_poi_param_free(param);
    26162614}
     
    30123010        item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo);
    30133011        dbg(0,"item=%p\n", item);
    30143012        if (item) {
     3013                text=g_strdup_printf("%s:%s", _("Item type"), item_to_name(item->type));
     3014                gui_internal_widget_append(w,
     3015                wb=gui_internal_button_new(this, text,
     3016                        NULL, gravity_left_center|orientation_horizontal|flags_fill));
     3017                wb->name=g_strdup(text);
     3018                wb->item=wm->item;
     3019                g_free(text);
    30153020                while(item_attr_get(item, attr_any, &attr)) {
    30163021                        text=g_strdup_printf("%s:%s", attr_to_name(attr.type), attr_to_text(&attr, wm->item.map, 1));
    30173022                        gui_internal_widget_append(w,
     
    30613066        }
    30623067}
    30633068
    3064 // meaning of the bits in "flags":
    3065 // 1: "Streets"
    3066 // 2: "House numbers"
    3067 // 4: "View in Browser", "View Attributes"
    3068 // 8: "Set as dest."
    3069 // 16: "Set as pos."
    3070 // 32: "Add as bookm."
    3071 // 64: "POIs"
    3072 // 128: "View on Map"
    3073 // 256: POIs around this point
    3074 // 512: "Cut/Copy... bookmark"
    3075 // TODO define constants for these values
     3069/* meaning of the bits in "flags":
     3070 * 1: "Streets"
     3071 * 2: "House numbers"
     3072 * 4: "View in Browser", "View Attributes"
     3073 * 8: "Set as dest."
     3074 * 16: "Set as pos."
     3075 * 32: "Add as bookm."
     3076 * 64: "POIs"
     3077 * 128: "View on Map"
     3078 * 256: POIs around this point
     3079 * 512: "Cut/Copy... bookmark"
     3080 * 1024: "Visible items around this point"
     3081 * 2048: "Jump to attributes of top item within this->radius of this point"
     3082 * TODO define constants for these values
     3083 */
    30763084static void
    30773085gui_internal_cmd_position_do(struct gui_priv *this, struct pcoord *pc_in, struct coord_geo *g_in, struct widget *wm, char *name, int flags)
    30783086{
    3079         struct widget *wb,*w,*wc,*wbc;
     3087        struct widget *wb,*w,*wc,*wbc,*pois_widget=NULL;
     3088        struct widget *wclosest=NULL;
    30803089        struct coord_geo g;
    30813090        struct pcoord pc;
    30823091        struct coord c;
     
    31773186                                image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill,
    31783187                                gui_internal_cmd_pois, NULL));
    31793188                wbc->c=pc;
     3189                pois_widget=wbc;
    31803190        }
    31813191#endif /* _MSC_VER */
    31823192#if 0
     
    32763286                                image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill,
    32773287                                gui_internal_cmd_delete_bookmark, NULL));
    32783288                wbc->text=g_strdup(wm->text);
     3289        } else if (flags & 1024 || flags & 2048) {
     3290                struct displaylist_handle *dlh;
     3291                struct displaylist *display;
     3292                struct attr attr;
     3293                struct point p;
     3294                struct transformation *trans;
     3295               
     3296                char *text, *label;
     3297                struct map_selection *sel;
     3298                GList *l, *ll;
     3299               
     3300
     3301                c.x=pc.x;
     3302                c.y=pc.y;
     3303
     3304                trans=navit_get_trans(this->nav);
     3305                transform(trans,pc.pro,&c,&p,1,0,0,0);
     3306                display=navit_get_displaylist(this->nav);
     3307                dlh=graphics_displaylist_open(display);
     3308                sel=displaylist_get_selection(display);
     3309                l=displaylist_get_clicked_list(display, &p, this->radius);
     3310                for(ll=l;ll;ll=g_list_next(ll)) {
     3311                        struct displayitem *di;
     3312                        struct item *item;
     3313                        struct map_rect *mr;
     3314                        struct item *itemo;
     3315
     3316                        di=(struct displayitem*)ll->data;
     3317                        item=graphics_displayitem_get_item(di);
     3318                       
     3319                        mr=map_rect_new(item->map, sel);
     3320                        itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo);
     3321                               
     3322                        if (item_attr_get(itemo, attr_label, &attr)) {
     3323                                label=map_convert_string(itemo->map, attr.u.str);
     3324                                text=g_strdup_printf("%s %s", item_to_name(item->type), label);
     3325                                map_convert_free(label);
     3326                        } else
     3327                                text=g_strdup_printf("%s", item_to_name(item->type));
     3328                        gui_internal_widget_append(w,
     3329                                wc=gui_internal_button_new_with_callback(this, text,
     3330                                image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill,
     3331                                gui_internal_cmd_position, (void *)2));
     3332                        wc->c=pc;
     3333                        wc->name=g_strdup(text);
     3334                        wc->item=*itemo;
     3335                        g_free(text);
     3336                        map_rect_destroy(mr);
     3337                        if(!wclosest)
     3338                                wclosest=wc;
     3339
     3340                }
     3341                g_list_free(l);
     3342                map_selection_destroy(sel);
     3343                graphics_displaylist_close(dlh);
     3344                if(wclosest) {
     3345                        g_free(wb->name);
     3346                        wb->name=g_strdup(wclosest->text);
     3347                }
    32793348        }
    32803349        gui_internal_menu_render(this);
     3350
     3351        if((flags & 2048) && wclosest)
     3352                        gui_internal_cmd_view_attributes(this,wclosest,wclosest->data);
    32813353}
    32823354
    32833355
     
    33613433        gui_internal_cmd_position_do(this, NULL, in[0]->u.coord_geo, NULL, name, flags);
    33623434}
    33633435
     3436static void
     3437gui_internal_cmd2_pois(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid)
     3438{
     3439        struct widget *w;
     3440        struct poi_param *param;
     3441        struct attr pro;
     3442        struct coord c;
     3443
     3444        dbg(1,"enter\n");
     3445        if (!in || !in[0])
     3446                return;
     3447        if (!ATTR_IS_COORD_GEO(in[0]->type))
     3448                return;
     3449        if (!navit_get_attr(this->nav, attr_projection, &pro, NULL))
     3450                return;
     3451        w=g_new0(struct widget,1);
     3452        param=g_new0(struct poi_param,1);
     3453        if (in[1] && ATTR_IS_STRING(in[1]->type)) {
     3454                gui_internal_poi_param_set_filter(param, in[1]->u.str);
     3455                if (in[2] && ATTR_IS_INT(in[2]->type))
     3456                        param->isAddressFilter=in[2]->u.num;
     3457        }
     3458       
     3459        transform_from_geo(pro.u.projection,in[0]->u.coord_geo,&c);
     3460        w->c.x=c.x;
     3461        w->c.y=c.y;
     3462        w->c.pro=pro.u.projection;
     3463        gui_internal_cmd_pois(this, w, param);
     3464        g_free(w);
     3465        gui_internal_poi_param_free(param);
     3466}
     3467
     3468
    33643469/**
    33653470  * The "Bookmarks" section of the OSD
    33663471  *
     
    56535758        case attr_pitch:
    56545759                attr->u.num=this->pitch;
    56555760                break;
     5761        case attr_button:
     5762                attr->u.num=this->mouse_button_clicked_on_map;
     5763                break;
    56565764        default:
    56575765                return 0;
    56585766        }
     
    57165824                        map_rect_destroy(mr);
    57175825                }
    57185826        }
    5719         graphics_displaylist_close(dlh);
    5720         if (attr_list && navit_get_attr(this->nav, attr_callback_list, &cb, NULL))
     5827        graphics_displaylist_close(dlh);
     5828        if (attr_list && navit_get_attr(this->nav, attr_callback_list, &cb, NULL))
    57215829                callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid);
    57225830        attr_list_free(attr_list);
    57235831}
    57245832
    57255833
     5834
    57265835//##############################################################################################################
    57275836//# Description: Function to handle mouse clicks and scroll wheel movement
    57285837//# Comment:
     
    57485857                if (button != 1)
    57495858                        return;
    57505859                if (this->menu_on_map_click) {
     5860                        this->mouse_button_clicked_on_map=1;
    57515861                        gui_internal_cmd_menu(this, p, 0, NULL);
     5862                        this->mouse_button_clicked_on_map=0;
    57525863                        return;
    57535864                }
    57545865                if (this->signal_on_map_click) {
     
    72647375        {"log",command_cast(gui_internal_cmd_log)},
    72657376        {"menu",command_cast(gui_internal_cmd_menu2)},
    72667377        {"position",command_cast(gui_internal_cmd2_position)},
     7378        {"pois",command_cast(gui_internal_cmd2_pois)},
    72677379        {"route_description",command_cast(gui_internal_cmd2_route_description)},
    72687380        {"route_height_profile",command_cast(gui_internal_cmd2_route_height_profile)},
    72697381        {"set",command_cast(gui_internal_cmd2_set)},
  • navit/graphics.c

     
    7474        int font_size;
    7575        GList *selection;
    7676        int disabled;
     77        /*
     78         * Counter for z_order of displayitems;
     79        */
     80        int current_z_order;
    7781};
    7882
    7983struct display_context
     
    838842}
    839843#endif
    840844
     845
    841846/**
    842847 * FIXME
    843848 * @param <>
     
    848853        struct displayitem *next;
    849854        struct item item;
    850855        char *label;
     856        int z_order;
    851857        int count;
    852858        struct coord c[0];
    853859};
     
    898904        di=(struct displayitem *)p;
    899905        p+=sizeof(*di)+count*sizeof(*c);
    900906        di->item=*item;
     907        di->z_order=0;
    901908        if (label && label_count) {
    902909                di->label=p;
    903910                for (i = 0 ; i < label_count ; i++) {
     
    17171724        while (di) {
    17181725        int i,count=di->count,mindist=dc->mindist;
    17191726
     1727        di->z_order=++(gra->current_z_order);
     1728       
    17201729        if (! gc) {
    17211730                gc=graphics_gc_new(gra);
    17221731                graphics_gc_set_foreground(gc, &e->color);
     
    18771886        di->item.id_hi=0;
    18781887        di->item.id_lo=0;
    18791888        di->item.map=NULL;
     1889        di->z_order=0;
    18801890        di->label=label;
    18811891        dc.gra=gra;
    18821892        dc.gc=NULL;
     
    19301940}
    19311941
    19321942
    1933 
    1934 
    19351943/**
    19361944 * FIXME
    19371945 * @param <>
     
    19431951        GList *lays;
    19441952        struct layer *lay;
    19451953
     1954        gra->current_z_order=0;
    19461955        lays=l->layers;
    19471956        while (lays) {
    19481957                lay=lays->data;
     
    19922001}
    19932002
    19942003
     2004/**
     2005 * @brief Returns selection structure based on displaylist transform, projection and order.
     2006 * Use this function to get map selection if you are going to fetch complete item data from the map based on displayitem reference.
     2007 * @param displaylist
     2008 * @returns Pointer to selection structure
     2009 */
     2010struct map_selection *displaylist_get_selection(struct displaylist *displaylist)
     2011{
     2012        return transform_get_selection(displaylist->dc.trans, displaylist->dc.pro, displaylist->order);
     2013}
    19952014
     2015/**
     2016 * @brief Compare displayitems based on their zorder values.
     2017 * Use with g_list_insert_sorted to sort less shaded items to be before more shaded ones in the result list.
     2018 */
     2019static int displaylist_cmp_zorder(const struct displayitem *a, const struct displayitem *b)
     2020{
     2021        if(a->z_order>b->z_order)
     2022                return -1;
     2023        if(a->z_order<b->z_order)
     2024                return 1;
     2025        return 0;
     2026}
     2027
     2028/**
     2029 * @brief Returns list of displayitems clicked at given coordinates. The deeper item is in current layout, the deeper it will be in the list.
     2030 * @param displaylist
     2031 * @param p clicked point
     2032 * @param radius radius of clicked area
     2033 * @returns GList of displayitems
     2034 */
     2035GList *displaylist_get_clicked_list(struct displaylist *displaylist, struct point *p, int radius)
     2036{
     2037        GList *l=NULL;
     2038        struct displayitem *di;
     2039        struct displaylist_handle *dlh=graphics_displaylist_open(displaylist);
     2040
     2041        while ((di=graphics_displaylist_next(dlh))) {
     2042                if (di->z_order>0 && graphics_displayitem_within_dist(displaylist, di, p,radius))
     2043                        l=g_list_insert_sorted(l,(gpointer) di, (GCompareFunc) displaylist_cmp_zorder);
     2044        }
     2045
     2046        return l;
     2047}
     2048
     2049
     2050
    19962051static void
    19972052do_draw(struct displaylist *displaylist, int cancel, int flags)
    19982053{
     
    20242079                        if (route_selection)
    20252080                                displaylist->sel=route_selection;
    20262081                        else
    2027                                 displaylist->sel=transform_get_selection(displaylist->dc.trans, displaylist->dc.pro, displaylist->order);
     2082                                displaylist->sel=displaylist_get_selection(displaylist);
    20282083                        displaylist->mr=map_rect_new(displaylist->m, displaylist->sel);
    20292084                }
    20302085                if (displaylist->mr) {
     
    22762331}
    22772332
    22782333/**
    2279  * FIXME
    2280  * @param <>
    2281  * @returns <>
     2334 * Get the map item which given displayitem is based on.
     2335 * NOTE: returned structure doesn't contain any attributes or coordinates. type, map, idhi and idlow seem to be the only useable members.
     2336 * @param di pointer to displayitem structure
     2337 * @returns Pointer to struct item
    22822338 * @author Martin Schaller (04/2008)
    22832339*/
    22842340struct item * graphics_displayitem_get_item(struct displayitem *di)
     
    22862342        return &di->item;
    22872343}
    22882344
     2345/**
     2346 * Get the number of this item as it was last displayed on the screen, dependent of current layout. Items with lower numbers 
     2347 * are shaded by items with higher ones when they overlap. Zero means item was not displayed at all. If the item is displayed twice, its topmost
     2348 * occurence is used.
     2349 * @param di pointer to displayitem structure
     2350 * @returns z-order of current item.
     2351*/
     2352int graphics_displayitem_get_z_order(struct displayitem *di)
     2353{
     2354        return di->z_order;
     2355}
     2356
     2357
    22892358int
    22902359graphics_displayitem_get_coord_count(struct displayitem *di)
    22912360{
  • navit/graphics.h

     
    184184struct displayitem *graphics_displaylist_next(struct displaylist_handle *dlh);
    185185void graphics_displaylist_close(struct displaylist_handle *dlh);
    186186struct displaylist *graphics_displaylist_new(void);
     187struct map_selection *displaylist_get_selection(struct displaylist *displaylist);
     188GList *displaylist_get_clicked_list(struct displaylist *displaylist, struct point *p, int radius);
    187189struct item *graphics_displayitem_get_item(struct displayitem *di);
    188190int graphics_displayitem_get_coord_count(struct displayitem *di);
    189191char *graphics_displayitem_get_label(struct displayitem *di);
    190192int graphics_displayitem_get_displayed(struct displayitem *di);
     193int graphics_displayitem_get_z_order(struct displayitem *di);
    191194int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p, int dist);
    192195void graphics_add_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl);
    193196void graphics_remove_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl);