diff options
Diffstat (limited to 'src/gui/panels/bookmarks.c')
-rw-r--r-- | src/gui/panels/bookmarks.c | 156 |
1 files changed, 58 insertions, 98 deletions
diff --git a/src/gui/panels/bookmarks.c b/src/gui/panels/bookmarks.c index 071ae75..91301bc 100644 --- a/src/gui/panels/bookmarks.c +++ b/src/gui/panels/bookmarks.c @@ -59,7 +59,6 @@ struct _GBookmarksPanel { GPanelItem parent; /* A laisser en premier */ - GtkTreeView *treeview; /* Composant d'affichage */ const regex_t *filter; /* Filtre appliqué ou NULL */ GtkMenu *menu; /* Menu contextuel pour param. */ @@ -129,7 +128,7 @@ static void on_bookmarks_selection_change(GtkTreeSelection *, gpointer); static void on_config_param_modified(GCfgParam *, GBookmarksPanel *); /* Actualise la valeur affichée d'un paramètre de configuration. */ -static void update_config_param_value(GtkTreeStore *, GtkTreeIter *); +static void update_config_param_value(GtkListStore *, GtkTreeIter *); /* Etablit une comparaison entre deux lignes de paramètres. */ static gint compare_bookmarks_list_columns(GtkTreeModel *, GtkTreeIter *, GtkTreeIter *, gpointer); @@ -248,13 +247,8 @@ static void g_bookmarks_panel_init(GBookmarksPanel *panel) { GEditorItem *base; /* Version basique d'instance */ GPanelItem *pitem; /* Version parente du panneau */ - GObject *ref; /* Espace de référencement */ - GtkTreeStore *store; /* Modèle de gestion */ - GtkWidget *treeview; /* Affichage de la liste */ - GtkCellRenderer *renderer; /* Moteur de rendu de colonne */ - GtkTreeViewColumn *column; /* Colonne de la liste */ + GtkBuilder *builder; /* Constructeur utilisé */ GtkTreeSortable *sortable; /* Autre vision de la liste */ - GtkTreeSelection *select; /* Sélection dans la liste */ /* Eléments de base */ @@ -271,67 +265,11 @@ static void g_bookmarks_panel_init(GBookmarksPanel *panel) /* Représentation graphique */ - base->widget = gtk_scrolled_window_new(NULL, NULL); - gtk_widget_show(base->widget); - - gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(base->widget), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); - gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(base->widget), GTK_SHADOW_IN); - - ref = G_OBJECT(base->widget); - g_object_set_data(ref, "panel", panel); - - /* Partie signets */ - - store = gtk_tree_store_new(BMC_COUNT, G_TYPE_OBJECT, - CAIRO_GOBJECT_TYPE_SURFACE, G_TYPE_STRING, G_TYPE_STRING, G_TYPE_STRING); - - treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(store)); - panel->treeview = GTK_TREE_VIEW(treeview); - - g_signal_connect(G_OBJECT(treeview), "button-press-event", - G_CALLBACK(on_button_press_over_bookmarks), panel); - g_signal_connect(G_OBJECT(treeview), "key-press-event", - G_CALLBACK(on_key_pressed_over_params), panel); - - gtk_widget_show(treeview); - gtk_container_add(GTK_CONTAINER(base->widget), treeview); - - g_object_unref(G_OBJECT(store)); - - /* Cellules d'affichage */ - - renderer = gtk_cell_renderer_pixbuf_new(); - column = gtk_tree_view_column_new_with_attributes("", renderer, - "surface", BMC_PICTURE, - NULL); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes(_("Physical address"), renderer, - "text", BMC_PHYSICAL, - NULL); - gtk_tree_view_column_set_sort_column_id(column, BMC_PHYSICAL); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - - renderer = gtk_cell_renderer_text_new(); - column = gtk_tree_view_column_new_with_attributes(_("Virtual address"), renderer, - "text", BMC_VIRTUAL, - NULL); - gtk_tree_view_column_set_sort_column_id(column, BMC_VIRTUAL); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); - - renderer = gtk_cell_renderer_text_new(); - g_object_set(G_OBJECT(renderer), "editable", TRUE, NULL); - ///g_signal_connect(renderer, "edited", G_CALLBACK(on_param_value_edited), store); - column = gtk_tree_view_column_new_with_attributes(_("Comment"), renderer, - "text", BMC_COMMENT, - NULL); - gtk_tree_view_column_set_sort_column_id(column, BMC_COMMENT); - gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + builder = g_panel_item_build(pitem, "bookmarks"); /* Tri de la liste */ - sortable = GTK_TREE_SORTABLE(store); + sortable = GTK_TREE_SORTABLE(gtk_builder_get_object(builder, "store")); gtk_tree_sortable_set_sort_func(sortable, BMC_PHYSICAL, compare_bookmarks_list_columns, GINT_TO_POINTER(BMC_PHYSICAL), NULL); @@ -344,16 +282,20 @@ static void g_bookmarks_panel_init(GBookmarksPanel *panel) gtk_tree_sortable_set_sort_column_id(sortable, BMC_COMMENT, GTK_SORT_ASCENDING); - /* Prise en compte de la sélection */ - - select = gtk_tree_view_get_selection(GTK_TREE_VIEW(treeview)); - gtk_tree_selection_set_mode(select, GTK_SELECTION_SINGLE); - g_signal_connect(G_OBJECT(select), "changed", G_CALLBACK(on_bookmarks_selection_change), NULL); - /* Préparation du menu contextuel */ panel->menu = build_bookmarks_panel_menu(panel); + /* Connexion des signaux */ + + gtk_builder_add_callback_symbols(builder, + "on_button_press_over_bookmarks", G_CALLBACK(on_button_press_over_bookmarks), + "on_key_pressed_over_params", G_CALLBACK(on_key_pressed_over_params), + "on_bookmarks_selection_change", G_CALLBACK(on_bookmarks_selection_change), + NULL); + + gtk_builder_connect_signals(builder, panel); + } @@ -371,8 +313,7 @@ static void g_bookmarks_panel_init(GBookmarksPanel *panel) static void g_bookmarks_panel_dispose(GBookmarksPanel *panel) { - if (panel->binary != NULL) - g_object_unref(G_OBJECT(panel->binary)); + g_clear_object(&panel->binary); G_OBJECT_CLASS(g_bookmarks_panel_parent_class)->dispose(G_OBJECT(panel)); @@ -479,7 +420,8 @@ static void change_bookmarks_panel_current_content(GBookmarksPanel *panel, GLoad static void reload_bookmarks_into_treeview(GBookmarksPanel *panel, GLoadedBinary *binary) { GDbCollection *collec; /* Collection à lister ici */ - GtkTreeStore *store; /* Modèle de gestion */ + GtkBuilder *builder; /* Constructeur utilisé */ + GtkListStore *store; /* Modèle de gestion */ GArchProcessor *proc; /* Architecture du binaire */ MemoryDataSize msize; /* Taille par défaut */ GList *items; /* Liste des éléments groupés */ @@ -514,8 +456,11 @@ static void reload_bookmarks_into_treeview(GBookmarksPanel *panel, GLoadedBinary } - store = GTK_TREE_STORE(gtk_tree_view_get_model(panel->treeview)); - gtk_tree_store_clear(store); + builder = G_PANEL_ITEM(panel)->builder; + + store = GTK_LIST_STORE(gtk_builder_get_object(builder, "store")); + + gtk_list_store_clear(store); /* Si le panneau actif ne représente pas un binaire... */ @@ -546,8 +491,8 @@ static void reload_bookmarks_into_treeview(GBookmarksPanel *panel, GLoadedBinary if (is_bookmark_filtered(panel, phys, virt, comment)) continue; - gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, BMC_BOOKMARK, bookmark, BMC_PICTURE, G_BOOKMARKS_PANEL_GET_CLASS(panel)->bookmark_img, BMC_PHYSICAL, phys, @@ -579,8 +524,8 @@ static void reload_bookmarks_into_treeview(GBookmarksPanel *panel, GLoadedBinary static void on_collection_content_changed(GDbCollection *collec, DBAction action, GDbBookmark *bookmark, GBookmarksPanel *panel) { - - GtkTreeStore *store; /* Modèle de gestion */ + GtkBuilder *builder; /* Constructeur utilisé */ + GtkListStore *store; /* Modèle de gestion */ GArchProcessor *proc; /* Architecture du binaire */ @@ -595,10 +540,12 @@ static void on_collection_content_changed(GDbCollection *collec, DBAction action GDbBookmark *displayed; /* Elément de collection */ + builder = G_PANEL_ITEM(panel)->builder; + + store = GTK_LIST_STORE(gtk_builder_get_object(builder, "store")); + if (action == DBA_ADD_ITEM || (action == DBA_CHANGE_STATE && g_db_item_is_active(G_DB_ITEM(bookmark)))) { - store = GTK_TREE_STORE(gtk_tree_view_get_model(panel->treeview)); - proc = g_loaded_binary_get_processor(panel->binary); msize = g_arch_processor_get_memory_size(proc); g_object_unref(G_OBJECT(proc)); @@ -608,8 +555,8 @@ static void on_collection_content_changed(GDbCollection *collec, DBAction action vmpa2_phys_to_string(addr, msize, phys, NULL); vmpa2_virt_to_string(addr, msize, virt, NULL); - gtk_tree_store_append(store, &iter, NULL); - gtk_tree_store_set(store, &iter, + gtk_list_store_append(store, &iter); + gtk_list_store_set(store, &iter, BMC_BOOKMARK, bookmark, BMC_PICTURE, G_BOOKMARKS_PANEL_GET_CLASS(panel)->bookmark_img, BMC_PHYSICAL, phys, @@ -624,8 +571,6 @@ static void on_collection_content_changed(GDbCollection *collec, DBAction action else /*if (action == DBA_CHANGE_STATE && g_db_item_is_active(G_DB_ITEM(bookmark)))*/ { - - store = GTK_TREE_STORE(gtk_tree_view_get_model(panel->treeview)); model = GTK_TREE_MODEL(store); @@ -636,7 +581,7 @@ static void on_collection_content_changed(GDbCollection *collec, DBAction action if (bookmark == displayed) { - gtk_tree_store_remove(store, &iter); + gtk_list_store_remove(store, &iter); break; } @@ -709,14 +654,17 @@ static void on_bookmarks_selection_change(GtkTreeSelection *selection, gpointer static void on_config_param_modified(GCfgParam *param, GBookmarksPanel *panel) { + GtkBuilder *builder; /* Constructeur utilisé */ GtkTreeModel *model; /* Gestionnaire de données */ GtkTreeIter iter; /* Point de recherche */ gboolean looping; /* Autorisation de bouclage */ GCfgParam *item; /* Elément de la liste */ - model = gtk_tree_view_get_model(panel->treeview); + builder = G_PANEL_ITEM(panel)->builder; + + model = GTK_TREE_MODEL(gtk_builder_get_object(builder, "store")); - for (looping = gtk_tree_model_get_iter_first (model, &iter); + for (looping = gtk_tree_model_get_iter_first(model, &iter); looping; looping = gtk_tree_model_iter_next(model, &iter)) { @@ -724,7 +672,7 @@ static void on_config_param_modified(GCfgParam *param, GBookmarksPanel *panel) if (item == param) { - update_config_param_value(GTK_TREE_STORE(model), &iter); + update_config_param_value(GTK_LIST_STORE(model), &iter); break; } @@ -747,7 +695,7 @@ static void on_config_param_modified(GCfgParam *param, GBookmarksPanel *panel) * * ******************************************************************************/ -static void update_config_param_value(GtkTreeStore *store, GtkTreeIter *iter) +static void update_config_param_value(GtkListStore *store, GtkTreeIter *iter) { GCfgParam *param; /* Paramètre à consulter */ ConfigParamState state; /* Etat du paramètre */ @@ -800,7 +748,7 @@ static void update_config_param_value(GtkTreeStore *store, GtkTreeIter *iter) } /* - gtk_tree_store_set(store, iter, + gtk_list_store_set(store, iter, CPC_BOLD, state & CPS_DEFAULT ? 400 : 800, CPC_STATUS, state_desc, CPC_VALUE, desc, -1); @@ -1182,19 +1130,25 @@ static GDbBookmark *get_selected_panel_bookmark(GtkTreeView *treeview, GtkTreeIt static void mcb_bookmarks_panel_edit(GtkMenuItem *menuitem, GBookmarksPanel *panel) { + GtkBuilder *builder; /* Constructeur utilisé */ + GtkTreeView *treeview; /* Arborescence manipulée */ GtkTreeIter iter; /* Point de la sélection */ GDbBookmark *mark; /* Signet sélectionné */ GtkTreeModel *model; /* Gestionnaire de données */ GtkTreePath *path; /* Chemin d'accès à ce point */ - mark = get_selected_panel_bookmark(panel->treeview, &iter); + builder = G_PANEL_ITEM(panel)->builder; + + treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview")); + + mark = get_selected_panel_bookmark(treeview, &iter); if (mark == NULL) return; - model = gtk_tree_view_get_model(panel->treeview); + model = gtk_tree_view_get_model(treeview); path = gtk_tree_model_get_path(model, &iter); - gtk_tree_view_set_cursor(panel->treeview, path, - gtk_tree_view_get_column(panel->treeview, BMC_COMMENT - BMC_PHYSICAL), + gtk_tree_view_set_cursor(treeview, path, + gtk_tree_view_get_column(treeview, BMC_COMMENT - BMC_PHYSICAL), TRUE); gtk_tree_path_free(path); @@ -1219,9 +1173,15 @@ static void mcb_bookmarks_panel_edit(GtkMenuItem *menuitem, GBookmarksPanel *pan static void mcb_bookmarks_panel_delete(GtkMenuItem *menuitem, GBookmarksPanel *panel) { + GtkBuilder *builder; /* Constructeur utilisé */ + GtkTreeView *treeview; /* Affichage de la liste */ GDbBookmark *mark; /* Signet sélectionné */ - mark = get_selected_panel_bookmark(panel->treeview, NULL); + builder = G_PANEL_ITEM(panel)->builder; + + treeview = GTK_TREE_VIEW(gtk_builder_get_object(builder, "treeview")); + + mark = get_selected_panel_bookmark(treeview, NULL); if (mark == NULL) return; g_loaded_binary_remove_from_collection(panel->binary, DBF_BOOKMARKS, G_DB_ITEM(mark)); |