Commit e14b006bccd24b1a16506ba94536dc87dcf8b5c9
1 parent
3ecda06b
Exists in
master
and in
4 other branches
Implemening action list view.
Showing
4 changed files
with
79 additions
and
16 deletions
Show diff stats
src/include/pw3270/actions.h
@@ -264,6 +264,11 @@ | @@ -264,6 +264,11 @@ | ||
264 | 264 | ||
265 | Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view); | 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 | G_END_DECLS | 272 | G_END_DECLS |
268 | 273 | ||
269 | #endif // PW3270_ACTIONS_H_INCLUDED | 274 | #endif // PW3270_ACTIONS_H_INCLUDED |
src/objects/actions/abstract.c
@@ -492,3 +492,58 @@ | @@ -492,3 +492,58 @@ | ||
492 | GAction * pw3270_action_new() { | 492 | GAction * pw3270_action_new() { |
493 | return G_ACTION(g_object_new(PW3270_TYPE_ACTION, NULL)); | 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,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 | GAction * pw3270_action_new_pfkey(void) { | 105 | GAction * pw3270_action_new_pfkey(void) { |
src/objects/actions/view.c
@@ -45,7 +45,7 @@ | @@ -45,7 +45,7 @@ | ||
45 | 45 | ||
46 | struct ListElement { | 46 | struct ListElement { |
47 | GAction * action; | 47 | GAction * action; |
48 | - GtkImage * image; | 48 | + GdkPixbuf * pixbuf; |
49 | gchar name[1]; | 49 | gchar name[1]; |
50 | }; | 50 | }; |
51 | 51 | ||
@@ -88,6 +88,7 @@ | @@ -88,6 +88,7 @@ | ||
88 | Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view) { | 88 | Pw3270ActionList * pw3270_action_list_move_action(Pw3270ActionList *action_list, const gchar *action_name, GtkWidget *view) { |
89 | 89 | ||
90 | GSList * item = (GSList *) action_list; | 90 | GSList * item = (GSList *) action_list; |
91 | + GtkListStore * store = GTK_LIST_STORE(gtk_tree_view_get_model(GTK_TREE_VIEW(view))); | ||
91 | 92 | ||
92 | while(item) { | 93 | while(item) { |
93 | 94 | ||
@@ -118,6 +119,15 @@ | @@ -118,6 +119,15 @@ | ||
118 | 119 | ||
119 | debug("label=\"%s\"",g_value_get_string(&properties[0].value)); | 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 | for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) { | 132 | for(ix = 0; ix < G_N_ELEMENTS(properties); ix++) { |
123 | g_value_unset(&properties[ix].value); | 133 | g_value_unset(&properties[ix].value); |
@@ -162,16 +172,9 @@ | @@ -162,16 +172,9 @@ | ||
162 | return list; | 172 | return list; |
163 | 173 | ||
164 | const gchar *name = g_action_get_name(action); | 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 | return list; | 178 | return list; |
176 | 179 | ||
177 | struct ListElement * element = (struct ListElement *) g_malloc0(sizeof(struct ListElement) + strlen(type) + strlen(name)); | 180 | struct ListElement * element = (struct ListElement *) g_malloc0(sizeof(struct ListElement) + strlen(type) + strlen(name)); |
@@ -181,8 +184,8 @@ | @@ -181,8 +184,8 @@ | ||
181 | 184 | ||
182 | element->action = action; | 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 | return g_slist_prepend(list,element); | 190 | return g_slist_prepend(list,element); |
188 | 191 | ||
@@ -222,9 +225,9 @@ | @@ -222,9 +225,9 @@ | ||
222 | 225 | ||
223 | void list_element_free(struct ListElement *element) { | 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 | g_free(element); | 233 | g_free(element); |