diff options
author | tinloaf <tinloaf@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2008-10-19 19:47:36 +0000 |
---|---|---|
committer | tinloaf <tinloaf@ffa7fe5e-494d-0410-b361-a75ebd5db220> | 2008-10-19 19:47:36 +0000 |
commit | b82354f7ae5b2355e99cabd9362a864859e91146 (patch) | |
tree | 9bf4b14ed4fc6fb380438757974d4b628b5c0113 /navit/gui | |
parent | 046e8d2f42fa69187222d4cf23d01d0ff791e226 (diff) | |
download | navit-b82354f7ae5b2355e99cabd9362a864859e91146.tar.gz |
Fixing the way recent destinations and bookmarks are handled.
git-svn-id: http://svn.code.sf.net/p/navit/code/trunk/navit@1514 ffa7fe5e-494d-0410-b361-a75ebd5db220
Diffstat (limited to 'navit/gui')
-rw-r--r-- | navit/gui/gtk/gui_gtk.h | 2 | ||||
-rw-r--r-- | navit/gui/gtk/gui_gtk_window.c | 77 |
2 files changed, 73 insertions, 6 deletions
diff --git a/navit/gui/gtk/gui_gtk.h b/navit/gui/gtk/gui_gtk.h index 02416065d..45d144e50 100644 --- a/navit/gui/gtk/gui_gtk.h +++ b/navit/gui/gtk/gui_gtk.h @@ -40,6 +40,8 @@ struct gui_priv { GSList *layout_group; GSList *projection_group; GSList *vehicle_group; + GList *dest_menuitems; + GList *bookmarks_menuitems; GtkUIManager *menu_manager; // old struct statusbar_priv *statusbar; int menubar_enable; diff --git a/navit/gui/gtk/gui_gtk_window.c b/navit/gui/gtk/gui_gtk_window.c index fc2ce1293..d45ebe339 100644 --- a/navit/gui/gtk/gui_gtk_window.c +++ b/navit/gui/gtk/gui_gtk_window.c @@ -250,18 +250,36 @@ gui_gtk_action_activate(GtkAction *action, struct action_cb_data *data) g_free(label); } } + +struct gui_menu_info { + guint merge_id; + GtkAction *action; +}; + static void +gui_gtk_del_menu(struct gui_priv *this, struct gui_menu_info *meninfo) +{ + gtk_action_group_remove_action(this->dyn_group, meninfo->action); + gtk_ui_manager_remove_ui(this->ui_manager, meninfo->merge_id); +} + +static struct gui_menu_info gui_gtk_add_menu(struct gui_priv *this, char *name, char *label, char *path, int submenu, struct action_cb_data *data) { + struct gui_menu_info meninfo; GtkAction *action; guint merge_id; action=gtk_action_new(name, label, NULL, NULL); + meninfo.action = action; if (data) g_signal_connect(action, "activate", G_CALLBACK(gui_gtk_action_activate), data); gtk_action_group_add_action(this->dyn_group, action); - merge_id=gtk_ui_manager_new_merge_id(this->ui_manager); + merge_id =gtk_ui_manager_new_merge_id(this->ui_manager); + meninfo.merge_id = merge_id; gtk_ui_manager_add_ui(this->ui_manager, merge_id, path, name, name, submenu ? GTK_UI_MANAGER_MENU : GTK_UI_MANAGER_MENUITEM, FALSE); + + return meninfo; } static void @@ -406,16 +424,29 @@ gui_gtk_maps_init(struct gui_priv *this) } static void -gui_gtk_destinations_init(struct gui_priv *this) +gui_gtk_destinations_update(struct gui_priv *this) { + GList *curr; struct attr attr; struct action_cb_data *data; struct map_rect *mr=NULL; struct item *item; + struct gui_menu_info *meninfo; struct coord c; int count=0; char *name, *label; + curr = g_list_first(this->dest_menuitems); + + while (curr) { + gui_gtk_del_menu(this, (struct gui_menu_info *)curr->data); + g_free((struct gui_menu_info *)curr->data); + curr = g_list_next(curr); + }; + + g_list_free(this->dest_menuitems); + this->dest_menuitems = NULL; + if(navit_get_attr(this->nav, attr_former_destination_map, &attr, NULL) && attr.u.map && (mr=map_rect_new(attr.u.map, NULL))) { while ((item=map_rect_get_item(mr))) { if (item->type != type_former_destination) continue; @@ -430,7 +461,10 @@ gui_gtk_destinations_init(struct gui_priv *this) data->attr.u.pcoord->pro=projection_mg; data->attr.u.pcoord->x=c.x; data->attr.u.pcoord->y=c.y; - gui_gtk_add_menu(this, name, label, "/ui/MenuBar/Route/FormerDestinations/FormerDestinationMenuAdditions",0,data); + + meninfo = g_new(struct gui_menu_info, 1); + *meninfo = gui_gtk_add_menu(this, name, label, "/ui/MenuBar/Route/FormerDestinations/FormerDestinationMenuAdditions",0,data); + this->dest_menuitems = g_list_prepend(this->dest_menuitems, meninfo); g_free(name); } map_rect_destroy(mr); @@ -438,17 +472,37 @@ gui_gtk_destinations_init(struct gui_priv *this) } static void -gui_gtk_bookmarks_init(struct gui_priv *this) +gui_gtk_destinations_init(struct gui_priv *this) { + navit_add_callback(this->nav, callback_new_attr_1(gui_gtk_destinations_update, attr_destination, this)); + gui_gtk_destinations_update(this); +} + +static void +gui_gtk_bookmarks_update(struct gui_priv *this) +{ + GList *curr; struct attr attr; struct action_cb_data *data; struct map_rect *mr=NULL; + struct gui_menu_info *meninfo; struct item *item; struct coord c; int count=0; char *parent, *name, *label, *label_full, *menu_label, *tmp_parent, *s; GHashTable *hash; + curr = g_list_first(this->bookmarks_menuitems); + + while (curr) { + gui_gtk_del_menu(this, (struct gui_menu_info *)curr->data); + g_free((struct gui_menu_info *)curr->data); + curr = g_list_next(curr); + }; + + g_list_free(this->bookmarks_menuitems); + this->bookmarks_menuitems = NULL; + if(navit_get_attr(this->nav, attr_bookmark_map, &attr, NULL) && attr.u.map && (mr=map_rect_new(attr.u.map, NULL))) { hash=g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free); while ((item=map_rect_get_item(mr))) { @@ -466,7 +520,9 @@ gui_gtk_bookmarks_init(struct gui_priv *this) tmp_parent=g_strdup(tmp_parent); } else { name=g_strdup_printf("Bookmark %d", count++); - gui_gtk_add_menu(this, name, menu_label+(label-label_full),parent,1,NULL); + meninfo = g_new(struct gui_menu_info, 1); + *meninfo = gui_gtk_add_menu(this, name, menu_label+(label-label_full),parent,1,NULL); + this->bookmarks_menuitems = g_list_prepend(this->bookmarks_menuitems, meninfo); tmp_parent=g_strdup_printf("%s/%s", parent, name); g_hash_table_insert(hash, g_strdup(menu_label), g_strdup(tmp_parent)); g_free(name); @@ -484,7 +540,9 @@ gui_gtk_bookmarks_init(struct gui_priv *this) data->attr.u.pcoord->x=c.x; data->attr.u.pcoord->y=c.y; name=g_strdup_printf("Bookmark %d", count++); - gui_gtk_add_menu(this, name, label, parent,0,data); + meninfo = g_new(struct gui_menu_info, 1); + *meninfo = gui_gtk_add_menu(this, name, label, parent,0,data); + this->bookmarks_menuitems = g_list_prepend(this->bookmarks_menuitems, meninfo); g_free(name); g_free(parent); } @@ -493,6 +551,13 @@ gui_gtk_bookmarks_init(struct gui_priv *this) } static void +gui_gtk_bookmarks_init(struct gui_priv *this) +{ + navit_add_callback(this->nav, callback_new_attr_1(gui_gtk_bookmarks_update, attr_bookmark_map, this)); + gui_gtk_bookmarks_update(this); +} + +static void gui_gtk_init(struct gui_priv *this, struct navit *nav) { |