Commit e14b006bccd24b1a16506ba94536dc87dcf8b5c9

Authored by Perry Werneck
1 parent 3ecda06b

Implemening action list view.

src/include/pw3270/actions.h
... ... @@ -264,6 +264,11 @@
264 264  
265 265 Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view);
266 266  
  267 + //
  268 + // Tools
  269 + //
  270 + GdkPixbuf * g_action_get_pixbuf(GAction *action, GtkIconSize icon_size);
  271 +
267 272 G_END_DECLS
268 273  
269 274 #endif // PW3270_ACTIONS_H_INCLUDED
... ...
src/objects/actions/abstract.c
... ... @@ -492,3 +492,58 @@
492 492 GAction * pw3270_action_new() {
493 493 return G_ACTION(g_object_new(PW3270_TYPE_ACTION, NULL));
494 494 }
  495 +
  496 + static GdkPixbuf * pixbuf_from_icon_name(GValue *value, GtkIconSize icon_size) {
  497 +
  498 + const gchar * icon_name = g_value_get_string(value);
  499 +
  500 + if(!icon_name)
  501 + return NULL;
  502 +
  503 + return gtk_icon_theme_load_icon(
  504 + gtk_icon_theme_get_default(),
  505 + icon_name,
  506 + icon_size,
  507 + GTK_ICON_LOOKUP_GENERIC_FALLBACK,
  508 + NULL
  509 + );
  510 +
  511 + }
  512 +
  513 + GdkPixbuf * g_action_get_pixbuf(GAction *action, GtkIconSize icon_size) {
  514 +
  515 + struct Properties {
  516 + const gchar * name;
  517 + GType value_type;
  518 + GdkPixbuf * (*translate)(GValue *value, GtkIconSize icon_size);
  519 + } properties[] = {
  520 + {
  521 + .name = "icon-name",
  522 + .value_type = G_TYPE_STRING,
  523 + .translate = pixbuf_from_icon_name
  524 + }
  525 + };
  526 +
  527 + size_t ix;
  528 + GdkPixbuf * pixbuf = NULL;
  529 +
  530 + for(ix = 0; ix < G_N_ELEMENTS(properties) && !pixbuf; ix++) {
  531 +
  532 + GParamSpec *spec = g_object_class_find_property(G_OBJECT_GET_CLASS(action),properties[ix].name);
  533 + if(spec && spec->value_type == properties[ix].value_type && (spec->flags & G_PARAM_READABLE) != 0) {
  534 +
  535 + GValue value = G_VALUE_INIT;
  536 + g_value_init(&value, properties[ix].value_type);
  537 +
  538 + g_object_get_property(G_OBJECT(action),properties[ix].name,&value);
  539 +
  540 + pixbuf = properties[ix].translate(&value,icon_size);
  541 +
  542 + g_value_unset(&value);
  543 +
  544 + }
  545 +
  546 + }
  547 +
  548 + return pixbuf;
  549 + }
... ...
src/objects/actions/lib3270/pfkey.c
... ... @@ -99,7 +99,7 @@
99 99  
100 100 }
101 101  
102   - void Lib3270PfAction_init(Lib3270PfAction *action) {
  102 + void Lib3270PfAction_init(Lib3270PfAction G_GNUC_UNUSED(*action)) {
103 103 }
104 104  
105 105 GAction * pw3270_action_new_pfkey(void) {
... ...
src/objects/actions/view.c
... ... @@ -45,7 +45,7 @@
45 45  
46 46 struct ListElement {
47 47 GAction * action;
48   - GtkImage * image;
  48 + GdkPixbuf * pixbuf;
49 49 gchar name[1];
50 50 };
51 51  
... ... @@ -88,6 +88,7 @@
88 88 Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view) {
89 89  
90 90 GSList * item = (GSList *) action_list;
  91 + GtkListStore * store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(view)));
91 92  
92 93 while(item) {
93 94  
... ... @@ -118,6 +119,15 @@
118 119  
119 120 debug("label=\"%s\"",g_value_get_string(&properties[0].value));
120 121  
  122 + GtkTreeIter iter;
  123 + gtk_list_store_append(store, &iter);
  124 + gtk_list_store_set(
  125 + store,
  126 + &iter,
  127 + COLUMN_PIXBUF, element->pixbuf,
  128 + COLUMN_LABEL, g_value_get_string(&properties[0].value),
  129 + -1
  130 + );
121 131  
122 132 for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) {
123 133 g_value_unset(&properties[ix].value);
... ... @@ -162,16 +172,9 @@
162 172 return list;
163 173  
164 174 const gchar *name = g_action_get_name(action);
165   -// debug("%s=%p",name,action);
166 175  
167   - GValue value = G_VALUE_INIT;
168   - g_value_init(&value, GTK_TYPE_IMAGE);
169   -
170   - g_object_get_property(G_OBJECT(action),"toolbar-icon",&value);
171   - GObject * image = g_value_get_object(&value);
172   - g_value_unset (&value);
173   -
174   - if(!image)
  176 + GdkPixbuf * pixbuf = g_action_get_pixbuf(action, GTK_ICON_SIZE_MENU);
  177 + if(!pixbuf)
175 178 return list;
176 179  
177 180 struct ListElement * element = (struct ListElement *) g_malloc0(sizeof(struct ListElement) + strlen(type) + strlen(name));
... ... @@ -181,8 +184,8 @@
181 184  
182 185 element->action = action;
183 186  
184   - element->image = GTK_IMAGE(image);
185   - g_object_ref_sink(G_OBJECT(element->image));
  187 + element->pixbuf = pixbuf;
  188 + g_object_ref_sink(G_OBJECT(element->pixbuf));
186 189  
187 190 return g_slist_prepend(list,element);
188 191  
... ... @@ -222,9 +225,9 @@
222 225  
223 226 void list_element_free(struct ListElement *element) {
224 227  
225   - if(element->image) {
226   - g_object_unref(element->image);
227   - element->image = NULL;
  228 + if(element->pixbuf) {
  229 + g_object_unref(element->pixbuf);
  230 + element->pixbuf = NULL;
228 231 }
229 232  
230 233 g_free(element);
... ...