Add:gui_internal:Possibility to emit a signal when POI is clicked
authormartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Tue, 1 Dec 2009 13:56:49 +0000 (13:56 +0000)
committermartin-s <martin-s@ffa7fe5e-494d-0410-b361-a75ebd5db220>
Tue, 1 Dec 2009 13:56:49 +0000 (13:56 +0000)
git-svn-id: https://navit.svn.sourceforge.net/svnroot/navit/trunk@2815 ffa7fe5e-494d-0410-b361-a75ebd5db220

navit/navit/attr_def.h
navit/navit/graphics.c
navit/navit/graphics.h
navit/navit/gui/internal/gui_internal.c
navit/navit/item.h

index 7512213..c8a6c11 100644 (file)
@@ -179,6 +179,7 @@ ATTR(position_valid)
 ATTR(frame)
 ATTR(tell_street_name)
 ATTR(bluetooth)
+ATTR(signal_on_map_click)
 ATTR2(0x0002ffff,type_int_end)
 ATTR2(0x00030000,type_string_begin)
 ATTR(type)
index 5335955..3d26fd7 100644 (file)
@@ -1995,6 +1995,12 @@ char * graphics_displayitem_get_label(struct displayitem *di)
        return di->label;
 }
 
+int
+graphics_displayitem_get_displayed(struct displayitem *di)
+{
+       return di->displayed;
+}
+
 /**
  * FIXME
  * @param <>
index f0b8160..a0ef3a0 100644 (file)
@@ -170,7 +170,7 @@ int graphics_draw_drag(struct graphics *this_, struct point *p);
 void graphics_background_gc(struct graphics *this_, struct graphics_gc *gc);
 char *graphics_icon_path(char *icon);
 void graphics_draw_itemgra(struct graphics *gra, struct itemgra *itm, struct transformation *t);
-void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int callback);
+void graphics_displaylist_draw(struct graphics *gra, struct displaylist *displaylist, struct transformation *trans, struct layout *l, int flags);
 void graphics_draw(struct graphics *gra, struct displaylist *displaylist, struct mapset *mapset, struct transformation *trans, struct layout *l, int async, struct callback *cb, int flags);
 int graphics_draw_cancel(struct graphics *gra, struct displaylist *displaylist);
 struct displaylist_handle *graphics_displaylist_open(struct displaylist *displaylist);
@@ -179,6 +179,7 @@ void graphics_displaylist_close(struct displaylist_handle *dlh);
 struct displaylist *graphics_displaylist_new(void);
 struct item *graphics_displayitem_get_item(struct displayitem *di);
 char *graphics_displayitem_get_label(struct displayitem *di);
+int graphics_displayitem_get_displayed(struct displayitem *di);
 int graphics_displayitem_within_dist(struct displaylist *displaylist, struct displayitem *di, struct point *p, int dist);
 void graphics_add_selection(struct graphics *gra, struct item *item, struct displaylist *dl);
 void graphics_remove_selection(struct graphics *gra, struct item *item, struct displaylist *dl);
index 7fde3a5..0683f68 100644 (file)
@@ -239,6 +239,7 @@ struct gui_priv {
        struct search_list *sl;
        int ignore_button;
        int menu_on_map_click;
+       int signal_on_map_click;
        char *country_iso2;
        int speech;
        int keyboard;
@@ -3923,6 +3924,36 @@ gui_internal_set_attr(struct gui_priv *this, struct attr *attr)
        }
 }
 
+static void gui_internal_dbus_signal(struct gui_priv *this, struct point *p)
+{
+       struct displaylist_handle *dlh;
+       struct displaylist *display;
+       struct displayitem *di;
+
+       display=navit_get_displaylist(this->nav);
+       dlh=graphics_displaylist_open(display);
+       while ((di=graphics_displaylist_next(dlh))) {
+               struct item *item=graphics_displayitem_get_item(di);
+               if (item_is_point(*item) && graphics_displayitem_get_displayed(di) &&
+                       graphics_displayitem_within_dist(display, di, p, 10)) {
+                       struct map_rect *mr=map_rect_new(item->map, NULL);
+                       struct item *itemo=map_rect_get_item_byid(mr, item->id_hi, item->id_lo);
+                       struct attr attr;
+                       if (item_attr_get(itemo, attr_data, &attr)) {
+                               struct attr cb,*attr_list[2];
+                               int valid=0;
+                               attr.type=attr_data;
+                               attr_list[0]=&attr;
+                               attr_list[1]=NULL;
+                                       if (navit_get_attr(this->nav, attr_callback_list, &cb, NULL)) 
+                                               callback_list_call_attr_4(cb.u.callback_list, attr_command, "dbus_send_signal", attr_list, NULL, &valid);
+                       }
+                       map_rect_destroy(mr);
+               }
+       }
+               graphics_displaylist_close(dlh);
+}
+
 
 //##############################################################################################################
 //# Description: Function to handle mouse clicks and scroll wheel movement
@@ -3938,6 +3969,7 @@ static void gui_internal_button(void *data, int pressed, int button, struct poin
        // if still on the map (not in the menu, yet):
        dbg(1,"children=%p ignore_button=%d\n",this->root.children,this->ignore_button);
        if (!this->root.children || this->ignore_button) {
+
                this->ignore_button=0;
                // check whether the position of the mouse changed during press/release OR if it is the scrollwheel
                if (!navit_handle_button(this->nav, pressed, button, p, NULL)) {
@@ -3945,8 +3977,16 @@ static void gui_internal_button(void *data, int pressed, int button, struct poin
                        return;
                }
                dbg(1,"menu_on_map_click=%d\n",this->menu_on_map_click);
-               if (this->menu_on_map_click && button == 1) 
+               if (button != 1)
+                       return;
+               if (this->menu_on_map_click) {
                        gui_internal_cmd_menu(this, p, 0);
+                       return;
+               }
+               if (this->signal_on_map_click) {
+                       gui_internal_dbus_signal(this, p);
+                       return;
+               }
                return;
        }
 
@@ -5334,6 +5374,9 @@ static struct gui_priv * gui_internal_new(struct navit *nav, struct gui_methods
                this->menu_on_map_click=attr->u.num;
        else
                this->menu_on_map_click=1;
+       if ((attr=attr_search(attrs, NULL, attr_signal_on_map_click)))
+               this->signal_on_map_click=attr->u.num;
+
        if ((attr=attr_search(attrs, NULL, attr_callback_list))) {
                command_add_table(attr->u.callback_list, commands, sizeof(commands)/sizeof(struct command_table), this);
        }
index c9a145d..61652cd 100644 (file)
@@ -50,6 +50,7 @@ extern int default_flags[];
 #define item_is_town(item) ((item).type >= type_town_label && (item).type <= type_district_label_1e7)
 #define item_is_district(item) ((item).type >= type_district_label && (item).type <= type_district_label_1e7)
 #define item_is_poly_place(item) ((item).type >= type_poly_place1 && (item).type <= type_poly_place6)
+#define item_is_point(item) ((item).type < type_line) 
 
 #define item_is_equal_id(a,b) ((a).id_hi == (b).id_hi && (a).id_lo == (b).id_lo)
 #define item_is_equal(a,b) (item_is_equal_id(a,b) && (a).map == (b).map)