summaryrefslogtreecommitdiff
path: root/src/gui
diff options
context:
space:
mode:
authorCyrille Bagard <nocbos@gmail.com>2015-07-28 21:32:57 (GMT)
committerCyrille Bagard <nocbos@gmail.com>2015-07-28 21:32:57 (GMT)
commit41efd099244b53a0edb40d097b34bf28a05b6367 (patch)
tree90f2419db6584e672b9f190e7e61e589e0345459 /src/gui
parente56a0553f710235d829f36b1edbf3cea00148a98 (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')
-rw-r--r--src/gui/panels/bookmarks.c64
-rw-r--r--src/gui/panels/history.c335
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)
+{
+
+
+
+
}