diff options
author | Cyrille Bagard <nocbos@gmail.com> | 2015-07-28 21:32:57 (GMT) |
---|---|---|
committer | Cyrille Bagard <nocbos@gmail.com> | 2015-07-28 21:32:57 (GMT) |
commit | 41efd099244b53a0edb40d097b34bf28a05b6367 (patch) | |
tree | 90f2419db6584e672b9f190e7e61e589e0345459 /src/gui/panels | |
parent | e56a0553f710235d829f36b1edbf3cea00148a98 (diff) |
Begun to manage collection items as active or inactive using timestamps.
git-svn-id: svn://svn.gna.org/svn/chrysalide/trunk@558 abbe820e-26c8-41b2-8c08-b7b2b41f8b0a
Diffstat (limited to 'src/gui/panels')
-rw-r--r-- | src/gui/panels/bookmarks.c | 64 | ||||
-rw-r--r-- | src/gui/panels/history.c | 335 |
2 files changed, 377 insertions, 22 deletions
diff --git a/src/gui/panels/bookmarks.c b/src/gui/panels/bookmarks.c index 60daf67..b3af70c 100644 --- a/src/gui/panels/bookmarks.c +++ b/src/gui/panels/bookmarks.c @@ -579,41 +579,71 @@ static void on_collection_content_changed(GDbCollection *collec, DBAction action VMPA_BUFFER(virt); /* Adresse virtuelle */ GtkTreeIter iter; /* Point d'insertion */ + GtkTreeModel *model; /* Modèle de gestion courant */ + GDbBookmark *displayed; /* Elément de collection */ + 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)); - printf(" Passage :: %d\n", action); + format = g_loaded_binary_get_format(panel->binary); - 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)); - format = g_loaded_binary_get_format(panel->binary); - proc = g_loaded_binary_get_processor(panel->binary); - msize = g_arch_processor_get_memory_size(proc); - g_object_unref(G_OBJECT(proc)); + addr = g_db_bookmark_get_address(bookmark); + 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, + BMC_BOOKMARK, bookmark, + BMC_PICTURE, G_BOOKMARKS_PANEL_GET_CLASS(panel)->bookmark_img, + BMC_PHYSICAL, phys, + BMC_VIRTUAL, virt, + BMC_COMMENT, g_db_bookmark_get_comment(bookmark), + -1); - addr = g_db_bookmark_get_address(bookmark); - 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, - BMC_BOOKMARK, bookmark, - BMC_PICTURE, G_BOOKMARKS_PANEL_GET_CLASS(panel)->bookmark_img, - BMC_PHYSICAL, phys, - BMC_VIRTUAL, virt, - BMC_COMMENT, g_db_bookmark_get_comment(bookmark), - -1); + } + + 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); + + + if (gtk_tree_model_get_iter_first(model, &iter)) + do + { + gtk_tree_model_get(model, &iter, BMC_BOOKMARK, &displayed, -1); + if (bookmark == displayed) + { + gtk_tree_store_remove(store, &iter); + break; + } + + g_object_unref(G_OBJECT(displayed)); + + } + while (gtk_tree_model_iter_next(model, &iter)); + + + + } } diff --git a/src/gui/panels/history.c b/src/gui/panels/history.c index a827961..25ee39f 100644 --- a/src/gui/panels/history.c +++ b/src/gui/panels/history.c @@ -32,6 +32,7 @@ #include "panel-int.h" +#include "../../analysis/db/collection.h" #include "../../gtkext/easygtk.h" @@ -62,6 +63,7 @@ typedef enum _HistoryColumn HTC_ITEM, /* Elément d'évolution */ HTC_PICTURE, /* Image de représentation */ + HTC_FOREGROUND, /* Couleur d'impression */ HTC_LABEL, /* Désignation humaine */ HTC_COUNT /* Nombre de colonnes */ @@ -84,6 +86,24 @@ static void g_history_panel_finalize(GHistoryPanel *); /* Réagit à un changement d'affichage principal de contenu. */ static void change_history_panel_current_binary(GHistoryPanel *, GLoadedBinary *); +/* Réagit à une modification au sein d'une collection donnée. */ +static void on_history_changed(GDbCollection *, DBAction, GDbItem *, GHistoryPanel *); + +/* Compare deux lignes entre elles pour le tri des évolutions. */ +static gint sort_history_lines(GtkTreeModel *, GtkTreeIter *, GtkTreeIter *, gpointer); + +/* Réagit à une validation d'une ligne affichée. */ +static void on_history_row_activated(GtkTreeView *, GtkTreePath *, GtkTreeViewColumn *, GHistoryPanel *); + +/* Annule l'élément d'évolution courant. */ +static void do_history_undo(GtkButton *, GHistoryPanel *); + +/* Restaure l'élément d'évolution suivant. */ +static void do_history_redo(GtkButton *, GHistoryPanel *); + +/* Effectue un nettoyage de l'historique. */ +static void do_history_clean(GtkButton *, GHistoryPanel *); + /* Indique le type définit pour un panneau d'aperçu de graphiques. */ @@ -137,6 +157,8 @@ static void g_history_panel_init(GHistoryPanel *panel) GObject *ref; /* Espace de référencement */ GtkWidget *scrollwnd; /* Support défilant */ GtkWidget *treeview; /* Affichage de la liste */ + GtkCellRenderer *renderer; /* Moteur de rendu de colonne */ + GtkTreeViewColumn *column; /* Colonne de la liste */ GtkWidget *box; /* Séparation horizontale */ GtkWidget *button; /* Bouton de cette même barre */ @@ -159,7 +181,8 @@ static void g_history_panel_init(GHistoryPanel *panel) gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrollwnd), GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC); gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(scrollwnd), GTK_SHADOW_IN); - panel->store = gtk_tree_store_new(HTC_COUNT, G_TYPE_OBJECT, CAIRO_GOBJECT_TYPE_SURFACE, G_TYPE_STRING); + panel->store = gtk_tree_store_new(HTC_COUNT, G_TYPE_OBJECT, CAIRO_GOBJECT_TYPE_SURFACE, + G_TYPE_STRING, G_TYPE_STRING); treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(panel->store)); gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(treeview), FALSE); @@ -167,11 +190,32 @@ static void g_history_panel_init(GHistoryPanel *panel) panel->treeview = GTK_TREE_VIEW(treeview); + gtk_tree_sortable_set_default_sort_func(GTK_TREE_SORTABLE(panel->store), sort_history_lines, NULL, NULL); + + g_signal_connect(treeview, "row-activated", G_CALLBACK(on_history_row_activated), panel); + gtk_widget_show(treeview); gtk_container_add(GTK_CONTAINER(scrollwnd), treeview); g_object_unref(G_OBJECT(panel->store)); + /* Cellules d'affichage */ + + renderer = gtk_cell_renderer_pixbuf_new(); + column = gtk_tree_view_column_new_with_attributes("", renderer, + "surface", HTC_PICTURE, + NULL); + gtk_tree_view_column_set_sort_column_id(column, GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + + renderer = gtk_cell_renderer_text_new(); + column = gtk_tree_view_column_new_with_attributes(_("Label"), renderer, + "foreground", HTC_FOREGROUND, + "text", HTC_LABEL, + NULL); + gtk_tree_view_column_set_sort_column_id(column, GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID); + gtk_tree_view_append_column(GTK_TREE_VIEW(treeview), column); + /* Eléments de contrôle inférieurs */ box = gtk_box_new(GTK_ORIENTATION_HORIZONTAL, 8); @@ -180,15 +224,15 @@ static void g_history_panel_init(GHistoryPanel *panel) gtk_box_pack_start(GTK_BOX(base->widget), box, FALSE, TRUE, 0); button = qck_create_button_with_css_img(NULL, NULL, "img-undo", _("Undo"), - G_CALLBACK(NULL), NULL); + G_CALLBACK(do_history_undo), panel); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); button = qck_create_button_with_css_img(NULL, NULL, "img-redo", _("Redo"), - G_CALLBACK(NULL), NULL); + G_CALLBACK(do_history_redo), panel); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); button = qck_create_button_with_css_img(NULL, NULL, "img-clean", _("Clean"), - G_CALLBACK(NULL), NULL); + G_CALLBACK(do_history_clean), panel); gtk_box_pack_start(GTK_BOX(box), button, FALSE, FALSE, 0); } @@ -303,6 +347,287 @@ GPanelItem *create_history_panel(GObject *ref) static void change_history_panel_current_binary(GHistoryPanel *panel, GLoadedBinary *binary) { - /* TODO */ + + GtkTreeStore *store; /* Modèle de gestion */ + GList *collections; /* Ensemble de collections */ + GList *c; /* Boucle de parcours #1 */ + GDbCollection *collec; /* Collection visée manipulée */ + GList *items; /* Liste des éléments groupés */ + GList *i; /* Boucle de parcours #2 */ + GDbItem *item; /* Elément à intégrer */ + GtkTreeIter iter; /* Point d'insertion */ + + + /* Basculement du binaire utilisé */ + + + + panel->binary = binary; + + + + + + store = GTK_TREE_STORE(gtk_tree_view_get_model(panel->treeview)); + gtk_tree_store_clear(store); + + /* Si le panneau actif ne représente pas un binaire... */ + + if (binary == NULL) return; + + /* Actualisation de l'affichage */ + + collections = g_loaded_binary_get_all_collections(binary); + + rlock_collections(collections); + + for (c = g_list_first(collections); c != NULL; c = g_list_next(c)) + { + collec = G_DB_COLLECTION(c->data); + items = g_db_collection_list_items(collec); + + for (i = g_list_first(items); i != NULL; i = g_list_next(i)) + { + item = G_DB_ITEM(i->data); + + gtk_tree_store_append(store, &iter, NULL); + gtk_tree_store_set(store, &iter, + HTC_ITEM, item, + //HTC_PICTURE, G_BOOKMARKS_PANEL_GET_CLASS(panel)->bookmark_img, + HTC_FOREGROUND, g_db_item_is_active(item) ? NULL : "grey", + HTC_LABEL, g_db_item_get_label(item), + -1); + + } + + g_signal_connect(collec, "content-changed", G_CALLBACK(on_history_changed), panel); + + } + + runlock_collections(collections); + +} + + +/****************************************************************************** +* * +* Paramètres : collec = collection dont le contenu a évolué. * +* action = type d'évolution rencontrée. * +* item = élément ajouté, modifié ou supprimé. * +* panel = panneau d'historique concerné par la procédure. * +* * +* Description : Réagit à une modification au sein d'une collection donnée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_history_changed(GDbCollection *collec, DBAction action, GDbItem *item, GHistoryPanel *panel) +{ + GtkTreeModel *model; /* Modèle de gestion courant */ + GtkTreeIter iter; /* Boucle de parcours */ + GDbItem *displayed; /* Elément de collection */ + + model = GTK_TREE_MODEL(panel->store); + + switch (action) + { + case DBA_CHANGE_STATE: + + if (gtk_tree_model_get_iter_first(model, &iter)) + do + { + gtk_tree_model_get(model, &iter, HTC_ITEM, &displayed, -1); + + if (item == displayed) + { + gtk_tree_store_set(panel->store, &iter, + HTC_FOREGROUND, g_db_item_is_active(item) ? NULL : "grey", + -1); + gtk_tree_sortable_set_sort_column_id(GTK_TREE_SORTABLE(panel->store), + GTK_TREE_SORTABLE_DEFAULT_SORT_COLUMN_ID, + GTK_SORT_ASCENDING); + break; + } + + g_object_unref(G_OBJECT(displayed)); + + } + while (gtk_tree_model_iter_next(model, &iter)); + + + break; + + + } + + + +} + + +/****************************************************************************** +* * +* Paramètres : model = gestionnaire de données pour la liste traitée. * +* a = premier point de comparaison. * +* b = second point de comparaison. * +* dummy = adresse non utilisée ici. * +* * +* Description : Compare deux lignes entre elles pour le tri des évolutions. * +* * +* Retour : -1, 0 ou 1 selon le résultat de la comparaison. * +* * +* Remarques : - * +* * +******************************************************************************/ + +static gint sort_history_lines(GtkTreeModel *model, GtkTreeIter *a, GtkTreeIter *b, gpointer dummy) +{ + gint result; /* Bilan à retourner */ + GDbItem *item_a; /* Elément de collection A */ + GDbItem *item_b; /* Elément de collection B */ + + gtk_tree_model_get(model, a, HTC_ITEM, &item_a, -1); + gtk_tree_model_get(model, b, HTC_ITEM, &item_b, -1); + + result = g_db_item_compare_with_timestamp(item_a, item_b); + + g_object_unref(G_OBJECT(item_a)); + g_object_unref(G_OBJECT(item_b)); + + return result; + +} + + +/****************************************************************************** +* * +* Paramètres : treeview = composant graphique manipulé par l'utilisateur. * +* path = chemin d'accès à la ligne activée. * +* column = colonne impactée par l'action. * +* panel = panneau d'historique concerné par la procédure. * +* * +* Description : Réagit à une validation d'une ligne affichée. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void on_history_row_activated(GtkTreeView *treeview, GtkTreePath *path, GtkTreeViewColumn *column, GHistoryPanel *panel) +{ + + + + + + +} + + + + + +/****************************************************************************** +* * +* Paramètres : button = bouton d'édition de l'historique d'évolution. * +* panel = panneau d'affichage de l'historique. * +* * +* Description : Annule l'élément d'évolution courant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void do_history_undo(GtkButton *button, GHistoryPanel *panel) +{ + GtkTreeSelection *selection; /* Sélection courante */ + GtkTreeModel *model; /* Modèle de gestion de données*/ + GtkTreeIter iter; /* Pointeur vers la ligne visée*/ + GDbItem *item; /* Elément de collection */ + GDbClient *client; /* Connexion vers la base */ + + selection = gtk_tree_view_get_selection(panel->treeview); + + if (gtk_tree_selection_get_selected(selection, &model, &iter)) + { + if (!gtk_tree_model_iter_previous(model, &iter)) + return; + + gtk_tree_model_get(model, &iter, HTC_ITEM, &item, -1); + + client = g_loaded_binary_get_db_client(panel->binary); + g_db_client_set_last_active(client, g_db_item_get_timestamp(item)); + g_object_unref(G_OBJECT(client)); + + g_object_unref(G_OBJECT(item)); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : button = bouton d'édition de l'historique d'évolution. * +* panel = panneau d'affichage de l'historique. * +* * +* Description : Restaure l'élément d'évolution suivant. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void do_history_redo(GtkButton *button, GHistoryPanel *panel) +{ + GtkTreeSelection *selection; /* Sélection courante */ + GtkTreeModel *model; /* Modèle de gestion de données*/ + GtkTreeIter iter; /* Pointeur vers la ligne visée*/ + GDbItem *item; /* Elément de collection */ + GDbClient *client; /* Connexion vers la base */ + + selection = gtk_tree_view_get_selection(panel->treeview); + + if (gtk_tree_selection_get_selected(selection, &model, &iter)) + { + gtk_tree_model_get(model, &iter, HTC_ITEM, &item, -1); + + client = g_loaded_binary_get_db_client(panel->binary); + g_db_client_set_last_active(client, g_db_item_get_timestamp(item)); + g_object_unref(G_OBJECT(client)); + + g_object_unref(G_OBJECT(item)); + + } + +} + + +/****************************************************************************** +* * +* Paramètres : button = bouton d'édition de l'historique d'évolution. * +* panel = panneau d'affichage de l'historique. * +* * +* Description : Effectue un nettoyage de l'historique. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +static void do_history_clean(GtkButton *button, GHistoryPanel *panel) +{ + + + + } |