summaryrefslogtreecommitdiff
path: root/navit/gui
diff options
context:
space:
mode:
authortinloaf <tinloaf@ffa7fe5e-494d-0410-b361-a75ebd5db220>2008-10-19 19:47:36 +0000
committertinloaf <tinloaf@ffa7fe5e-494d-0410-b361-a75ebd5db220>2008-10-19 19:47:36 +0000
commitb82354f7ae5b2355e99cabd9362a864859e91146 (patch)
tree9bf4b14ed4fc6fb380438757974d4b628b5c0113 /navit/gui
parent046e8d2f42fa69187222d4cf23d01d0ff791e226 (diff)
downloadnavit-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.h2
-rw-r--r--navit/gui/gtk/gui_gtk_window.c77
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)
{