Ticket #962: clickthrough.diff

File clickthrough.diff, 11.6 KB (added by tryagain, 8 years ago)

First public release of clickthrough feature.

  • 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;
     
    30123013        item = map_rect_get_item_byid(mr, wm->item.id_hi, wm->item.id_lo);
    30133014        dbg(0,"item=%p\n", item);
    30143015        if (item) {
     3016                text=g_strdup_printf("%s:%s", _("Item type"), item_to_name(item->type));
     3017                gui_internal_widget_append(w,
     3018                wb=gui_internal_button_new(this, text,
     3019                        NULL, gravity_left_center|orientation_horizontal|flags_fill));
     3020                wb->name=g_strdup(text);
     3021                wb->item=wm->item;
     3022                g_free(text);
    30153023                while(item_attr_get(item, attr_any, &attr)) {
    30163024                        text=g_strdup_printf("%s:%s", attr_to_name(attr.type), attr_to_text(&attr, wm->item.map, 1));
    30173025                        gui_internal_widget_append(w,
     
    30613069        }
    30623070}
    30633071
    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
     3072/* meaning of the bits in "flags":
     3073 * 1: "Streets"
     3074 * 2: "House numbers"
     3075 * 4: "View in Browser", "View Attributes"
     3076 * 8: "Set as dest."
     3077 * 16: "Set as pos."
     3078 * 32: "Add as bookm."
     3079 * 64: "POIs"
     3080 * 128: "View on Map"
     3081 * 256: POIs around this point
     3082 * 512: "Cut/Copy... bookmark"
     3083 * 1024: "Visible items around this point"
     3084 * 2048: "Jump to attributes of top item within this->radius of this point"
     3085 * TODO define constants for these values
     3086 */
    30763087static void
    30773088gui_internal_cmd_position_do(struct gui_priv *this, struct pcoord *pc_in, struct coord_geo *g_in, struct widget *wm, char *name, int flags)
    30783089{
    3079         struct widget *wb,*w,*wc,*wbc;
     3090        struct widget *wb,*w,*wc,*wbc,*pois_widget=NULL;
     3091        struct widget *wclosest=NULL;
    30803092        struct coord_geo g;
    30813093        struct pcoord pc;
    30823094        struct coord c;
     
    31773189                                image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill,
    31783190                                gui_internal_cmd_pois, NULL));
    31793191                wbc->c=pc;
     3192                pois_widget=wbc;
    31803193        }
    31813194#endif /* _MSC_VER */
    31823195#if 0
     
    32763289                                image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill,
    32773290                                gui_internal_cmd_delete_bookmark, NULL));
    32783291                wbc->text=g_strdup(wm->text);
     3292        } else if (flags & 1024 || flags & 2048) {
     3293                struct displaylist_handle *dlh;
     3294                struct displaylist *display;
     3295                struct displayitem *di;
     3296                struct attr attr;
     3297                struct item closest_item;
     3298                struct point p;
     3299                struct transformation *trans;
     3300                struct street_data *data;
     3301                char *text, *label;
     3302                enum projection pro;
     3303                int max_z_order=0,z_order;     
     3304                struct map_selection *sel;
     3305               
     3306
     3307                c.x=pc.x;
     3308                c.y=pc.y;
     3309
     3310                trans=navit_get_trans(this->nav);
     3311                transform(trans,pc.pro,&c,&p,1,0,0,0);
     3312                display=navit_get_displaylist(this->nav);
     3313                dlh=graphics_displaylist_open(display);
     3314                sel=displaylist_get_selection(display);
     3315
     3316                while ((di=graphics_displaylist_next(dlh))) {
     3317                        struct item *item=graphics_displayitem_get_item(di);
     3318                       
     3319                        if ((z_order=graphics_displayitem_get_z_order(di))>0 &&
     3320                                graphics_displayitem_within_dist(display, di, &p,this->radius)) {
     3321
     3322                                struct map_rect *mr=map_rect_new(item->map, sel);
     3323                                struct item *itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo);
     3324                               
     3325                                data=street_get_data(itemo);
     3326
     3327                                if (item_attr_get(itemo, attr_label, &attr)) {
     3328                                        label=map_convert_string(itemo->map, attr.u.str);
     3329                                        text=g_strdup_printf("%s %s", item_to_name(item->type), label);
     3330                                        map_convert_free(label);
     3331                                } else
     3332                                        text=g_strdup_printf("%s", item_to_name(item->type));
     3333                                gui_internal_widget_append(w,
     3334                                        wc=gui_internal_button_new_with_callback(this, text,
     3335                                        image_new_xs(this, "gui_active"), gravity_left_center|orientation_horizontal|flags_fill,
     3336                                        gui_internal_cmd_position, (void *)2));
     3337                                wc->c.x=data->c[0].x;
     3338                                wc->c.y=data->c[0].y;
     3339                                wc->c.pro=map_projection(itemo->map);
     3340                                wc->name=g_strdup(text);
     3341                                wc->item=*itemo;
     3342                                g_free(text);
     3343                                street_data_free(data);
     3344                                if(z_order>max_z_order) {
     3345                                        max_z_order=z_order;
     3346                                        wclosest=wc;
     3347                                }
     3348
     3349                        }
     3350
     3351                }
     3352       
     3353                map_selection_destroy(sel);
     3354                graphics_displaylist_close(dlh);
    32793355        }
    32803356        gui_internal_menu_render(this);
     3357
     3358        if(flags & 2048 && wclosest) {
     3359                        wclosest->func(this,wclosest,wclosest->data);
     3360                        gui_internal_cmd_view_attributes(this,wclosest,wclosest->data);
     3361        }
     3362
    32813363}
    32823364
    32833365
     
    33613443        gui_internal_cmd_position_do(this, NULL, in[0]->u.coord_geo, NULL, name, flags);
    33623444}
    33633445
     3446static void
     3447gui_internal_cmd2_pois(struct gui_priv *this, char *function, struct attr **in, struct attr ***out, int *valid)
     3448{
     3449        struct widget *w;
     3450        struct poi_param *param;
     3451        struct attr pro;
     3452        struct coord c;
     3453
     3454        dbg(1,"enter\n");
     3455        if (!in || !in[0])
     3456                return;
     3457        if (!ATTR_IS_COORD_GEO(in[0]->type))
     3458                return;
     3459        if (!navit_get_attr(this->nav, attr_projection, &pro, NULL))
     3460                return;
     3461        w=g_new0(struct widget,1);
     3462        param=g_new0(struct poi_param,1);
     3463        if (in[1] && ATTR_IS_STRING(in[1]->type)) {
     3464                param->filterstr=removecase(in[1]->u.str);
     3465                if (in[2] && ATTR_IS_INT(in[2]->type))
     3466                        param->isAddressFilter=in[2]->u.num;
     3467        }
     3468       
     3469        transform_from_geo(pro.u.projection,in[0]->u.coord_geo,&c);
     3470        w->c.x=c.x;
     3471        w->c.y=c.y;
     3472        w->c.pro=pro.u.projection;
     3473        gui_internal_cmd_pois(this, w, param);
     3474        g_free(w);
     3475        gui_internal_poi_param_free(param);
     3476}
     3477
     3478
    33643479/**
    33653480  * The "Bookmarks" section of the OSD
    33663481  *
     
    56535768        case attr_pitch:
    56545769                attr->u.num=this->pitch;
    56555770                break;
     5771        case attr_button:
     5772                attr->u.num=this->mouse_button_clicked_on_map;
     5773                break;
    56565774        default:
    56575775                return 0;
    56585776        }
     
    57165834                        map_rect_destroy(mr);
    57175835                }
    57185836        }
    5719         graphics_displaylist_close(dlh);
    5720         if (attr_list && navit_get_attr(this->nav, attr_callback_list, &cb, NULL))
     5837        graphics_displaylist_close(dlh);
     5838        if (attr_list && navit_get_attr(this->nav, attr_callback_list, &cb, NULL))
    57215839                callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid);
    57225840        attr_list_free(attr_list);
    57235841}
    57245842
    57255843
     5844
    57265845//##############################################################################################################
    57275846//# Description: Function to handle mouse clicks and scroll wheel movement
    57285847//# Comment:
     
    57485867                if (button != 1)
    57495868                        return;
    57505869                if (this->menu_on_map_click) {
     5870                        this->mouse_button_clicked_on_map=1;
    57515871                        gui_internal_cmd_menu(this, p, 0, NULL);
     5872                        this->mouse_button_clicked_on_map=0;
    57525873                        return;
    57535874                }
    57545875                if (this->signal_on_map_click) {
     
    72647385        {"log",command_cast(gui_internal_cmd_log)},
    72657386        {"menu",command_cast(gui_internal_cmd_menu2)},
    72667387        {"position",command_cast(gui_internal_cmd2_position)},
     7388        {"pois",command_cast(gui_internal_cmd2_pois)},
    72677389        {"route_description",command_cast(gui_internal_cmd2_route_description)},
    72687390        {"route_height_profile",command_cast(gui_internal_cmd2_route_height_profile)},
    72697391        {"set",command_cast(gui_internal_cmd2_set)},
     
    72747396        {"town",command_cast(gui_internal_cmd2_town)},
    72757397        {"quit",command_cast(gui_internal_cmd2_quit)},
    72767398        {"write",command_cast(gui_internal_cmd_write)},
    7277         {"about",command_cast(gui_internal_cmd2_about)},
    72787399
     7400        {"about",command_cast(gui_internal_cmd2_about)}
    72797401};
    72807402
    72817403
  • 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 * @param displaylist
     2007 * @returns Pointer to selection structure
     2008 */
     2009struct map_selection *displaylist_get_selection(struct displaylist *displaylist)
     2010{
     2011        return transform_get_selection(displaylist->dc.trans, displaylist->dc.pro, displaylist->order);
     2012}
    19952013
     2014
    19962015static void
    19972016do_draw(struct displaylist *displaylist, int cancel, int flags)
    19982017{
     
    20242043                        if (route_selection)
    20252044                                displaylist->sel=route_selection;
    20262045                        else
    2027                                 displaylist->sel=transform_get_selection(displaylist->dc.trans, displaylist->dc.pro, displaylist->order);
     2046                                displaylist->sel=displaylist_get_selection(displaylist);//transform_get_selection(displaylist->dc.trans, displaylist->dc.pro, displaylist->order);
    20282047                        displaylist->mr=map_rect_new(displaylist->m, displaylist->sel);
    20292048                }
    20302049                if (displaylist->mr) {
     
    22762295}
    22772296
    22782297/**
    2279  * FIXME
    2280  * @param <>
    2281  * @returns <>
     2298 * Get them map item which given displayitem is based on.
     2299 * NOTE: returned structure doesn't contain any attributes or coordinates. type, map, idhi and idlow seem to be the only useable members.
     2300 * @param di pointer to displayitem structure
     2301 * @returns Pointer to struct item
    22822302 * @author Martin Schaller (04/2008)
    22832303*/
    22842304struct item * graphics_displayitem_get_item(struct displayitem *di)
     
    22862306        return &di->item;
    22872307}
    22882308
     2309/**
     2310 * Get the number of this item as it was last displayed on the screen, dependent of current layout. Items with lower numbers 
     2311 * could be shaded by items with higher ones. Zero means item was not displayed at all.
     2312 * @param di pointer to displayitem structure
     2313 * @returns z-order of current item.
     2314*/
     2315int graphics_displayitem_get_z_order(struct displayitem *di)
     2316{
     2317        return di->z_order;
     2318}
     2319
     2320
    22892321int
    22902322graphics_displayitem_get_coord_count(struct displayitem *di)
    22912323{
  • 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);
    187188struct item *graphics_displayitem_get_item(struct displayitem *di);
    188189int graphics_displayitem_get_coord_count(struct displayitem *di);
    189190char *graphics_displayitem_get_label(struct displayitem *di);
    190191int graphics_displayitem_get_displayed(struct displayitem *di);
     192int graphics_displayitem_get_z_order(struct displayitem *di);
    191193int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p, int dist);
    192194void graphics_add_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl);
    193195void graphics_remove_selection(struct graphics *gra, struct item *item, enum item_type type, struct displaylist *dl);