From fee0eaf0c6b36ab7493b96bd9b948bcc2963c410 Mon Sep 17 00:00:00 2001 From: Perry Werneck Date: Fri, 20 Dec 2019 11:28:31 -0300 Subject: [PATCH] Implementing action viewer widget. --- src/include/pw3270/actions.h | 2 ++ src/objects/actions/view.c | 61 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++--- src/objects/toolbar/settings.c | 23 +++++++++++++++++++++-- 3 files changed, 81 insertions(+), 5 deletions(-) diff --git a/src/include/pw3270/actions.h b/src/include/pw3270/actions.h index b30b061..dc60b9a 100644 --- a/src/include/pw3270/actions.h +++ b/src/include/pw3270/actions.h @@ -262,6 +262,8 @@ Pw3270ActionList * pw3270_action_list_new(GtkApplication *application); void pw3270_action_list_free(Pw3270ActionList *action_list); + Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view); + G_END_DECLS #endif // PW3270_ACTIONS_H_INCLUDED diff --git a/src/objects/actions/view.c b/src/objects/actions/view.c index d9c5aaa..822779a 100644 --- a/src/objects/actions/view.c +++ b/src/objects/actions/view.c @@ -43,6 +43,9 @@ gchar name[1]; }; + static void list_element_free(struct ListElement *element); + + GtkWidget * pw3270_action_view_new() { GtkWidget * view = GTK_WIDGET(gtk_tree_view_new_with_model(GTK_TREE_MODEL(gtk_list_store_new(1,G_TYPE_OBJECT)))); @@ -66,6 +69,56 @@ return view; } + Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view) { + + GSList * item = (GSList *) action_list; + + while(item) { + + struct ListElement * element = (struct ListElement *) item->data; + + if(!g_ascii_strcasecmp(action_name,element->name)) { + + size_t ix; + + struct Properties { + const gchar * name; + GType g_type; + GValue value; + } properties[] = { + { + .name = "label", + .g_type = G_TYPE_STRING, + .value = G_VALUE_INIT + } + }; + + for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) { + + g_value_init(&properties[ix].value, properties[ix].g_type); + g_object_get_property(G_OBJECT(element->action), properties[ix].name, &properties[ix].value); + + } + + debug("label=\"%s\"",g_value_get_string(&properties[0].value)); + + + for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) { + g_value_unset(&properties[ix].value); + } + + list_element_free(element); + return (Pw3270ActionList *) g_slist_remove_link(action_list,item); + } + + item = g_slist_next(item); + + } + + return action_list; + + } + /* void pw3270_action_view_append_application_action(GtkWidget *widget, GAction *action) { @@ -85,8 +138,10 @@ if(!action) return list; - GParamSpec *spec = g_object_class_find_property(G_OBJECT_GET_CLASS(action),"toolbar-icon"); + if(!g_object_class_find_property(G_OBJECT_GET_CLASS(action),"label")) + return list; + GParamSpec *spec = g_object_class_find_property(G_OBJECT_GET_CLASS(action),"toolbar-icon"); if(!spec) return list; @@ -149,7 +204,7 @@ return (Pw3270ActionList *) list; } - static void free_element(struct ListElement *element) { + void list_element_free(struct ListElement *element) { if(element->image) { g_object_unref(element->image); @@ -161,6 +216,6 @@ } void pw3270_action_list_free(Pw3270ActionList *action_list) { - g_slist_free_full((GSList *) action_list, (GDestroyNotify) free_element); + g_slist_free_full((GSList *) action_list, (GDestroyNotify) list_element_free); } diff --git a/src/objects/toolbar/settings.c b/src/objects/toolbar/settings.c index 3f02040..c2f5230 100644 --- a/src/objects/toolbar/settings.c +++ b/src/objects/toolbar/settings.c @@ -39,14 +39,33 @@ } ToolbarSettingsPage; static void load(Pw3270SettingsPage *pg, GtkApplication *application, GSettings *settings) { + + size_t ix; + debug("%s",__FUNCTION__); // Populate views - Pw3270ActionList * actions = pw3270_action_list_new(application); + Pw3270ActionList * action_list = pw3270_action_list_new(application); + + // Load current values. + g_autofree gchar * action_names = g_settings_get_string(settings,"toolbar-action-names"); + + gchar ** actions = g_strsplit(action_names,",",-1); + + for(ix = 0; actions[ix]; ix++) { + if(g_ascii_strcasecmp(actions[ix],"separator")) { + // It's an action + action_list = pw3270_action_list_move_action(action_list,actions[ix],((ToolbarSettingsPage *) pg)->views[0]); + + } + + + } - pw3270_action_list_free(actions); + g_strfreev(actions); + pw3270_action_list_free(action_list); } -- libgit2 0.21.2