Commit fee0eaf0c6b36ab7493b96bd9b948bcc2963c410

Authored by Perry Werneck
1 parent c2cca166

Implementing action viewer widget.

src/include/pw3270/actions.h
... ... @@ -262,6 +262,8 @@
262 262 Pw3270ActionList * pw3270_action_list_new(GtkApplication *application);
263 263 void pw3270_action_list_free(Pw3270ActionList *action_list);
264 264  
  265 + Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view);
  266 +
265 267 G_END_DECLS
266 268  
267 269 #endif // PW3270_ACTIONS_H_INCLUDED
... ...
src/objects/actions/view.c
... ... @@ -43,6 +43,9 @@
43 43 gchar name[1];
44 44 };
45 45  
  46 + static void list_element_free(struct ListElement *element);
  47 +
  48 +
46 49 GtkWidget * pw3270_action_view_new() {
47 50  
48 51 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 @@
66 69 return view;
67 70 }
68 71  
  72 + Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view) {
  73 +
  74 + GSList * item = (GSList *) action_list;
  75 +
  76 + while(item) {
  77 +
  78 + struct ListElement * element = (struct ListElement *) item->data;
  79 +
  80 + if(!g_ascii_strcasecmp(action_name,element->name)) {
  81 +
  82 + size_t ix;
  83 +
  84 + struct Properties {
  85 + const gchar * name;
  86 + GType g_type;
  87 + GValue value;
  88 + } properties[] = {
  89 + {
  90 + .name = "label",
  91 + .g_type = G_TYPE_STRING,
  92 + .value = G_VALUE_INIT
  93 + }
  94 + };
  95 +
  96 + for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) {
  97 +
  98 + g_value_init(&properties[ix].value, properties[ix].g_type);
  99 + g_object_get_property(G_OBJECT(element->action), properties[ix].name, &properties[ix].value);
  100 +
  101 + }
  102 +
  103 + debug("label=\"%s\"",g_value_get_string(&properties[0].value));
  104 +
  105 +
  106 + for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) {
  107 + g_value_unset(&properties[ix].value);
  108 + }
  109 +
  110 + list_element_free(element);
  111 + return (Pw3270ActionList *) g_slist_remove_link(action_list,item);
  112 + }
  113 +
  114 + item = g_slist_next(item);
  115 +
  116 + }
  117 +
  118 + return action_list;
  119 +
  120 + }
  121 +
69 122 /*
70 123 void pw3270_action_view_append_application_action(GtkWidget *widget, GAction *action) {
71 124  
... ... @@ -85,8 +138,10 @@
85 138 if(!action)
86 139 return list;
87 140  
88   - GParamSpec *spec = g_object_class_find_property(G_OBJECT_GET_CLASS(action),"toolbar-icon");
  141 + if(!g_object_class_find_property(G_OBJECT_GET_CLASS(action),"label"))
  142 + return list;
89 143  
  144 + GParamSpec *spec = g_object_class_find_property(G_OBJECT_GET_CLASS(action),"toolbar-icon");
90 145 if(!spec)
91 146 return list;
92 147  
... ... @@ -149,7 +204,7 @@
149 204 return (Pw3270ActionList *) list;
150 205 }
151 206  
152   - static void free_element(struct ListElement *element) {
  207 + void list_element_free(struct ListElement *element) {
153 208  
154 209 if(element->image) {
155 210 g_object_unref(element->image);
... ... @@ -161,6 +216,6 @@
161 216 }
162 217  
163 218 void pw3270_action_list_free(Pw3270ActionList *action_list) {
164   - g_slist_free_full((GSList *) action_list, (GDestroyNotify) free_element);
  219 + g_slist_free_full((GSList *) action_list, (GDestroyNotify) list_element_free);
165 220 }
166 221  
... ...
src/objects/toolbar/settings.c
... ... @@ -39,14 +39,33 @@
39 39 } ToolbarSettingsPage;
40 40  
41 41 static void load(Pw3270SettingsPage *pg, GtkApplication *application, GSettings *settings) {
  42 +
  43 + size_t ix;
  44 +
42 45 debug("%s",__FUNCTION__);
43 46  
44 47 // Populate views
45   - Pw3270ActionList * actions = pw3270_action_list_new(application);
  48 + Pw3270ActionList * action_list = pw3270_action_list_new(application);
  49 +
  50 + // Load current values.
  51 + g_autofree gchar * action_names = g_settings_get_string(settings,"toolbar-action-names");
  52 +
  53 + gchar ** actions = g_strsplit(action_names,",",-1);
  54 +
  55 + for(ix = 0; actions[ix]; ix++) {
46 56  
  57 + if(g_ascii_strcasecmp(actions[ix],"separator")) {
47 58  
  59 + // It's an action
  60 + action_list = pw3270_action_list_move_action(action_list,actions[ix],((ToolbarSettingsPage *) pg)->views[0]);
  61 +
  62 + }
  63 +
  64 +
  65 + }
48 66  
49   - pw3270_action_list_free(actions);
  67 + g_strfreev(actions);
  68 + pw3270_action_list_free(action_list);
50 69  
51 70  
52 71 }
... ...