1 /* HomeBank -- Free, easy, personal accounting for everyone.
2 * Copyright (C) 1995-2018 Maxime DOYEN
4 * This file is part of HomeBank.
6 * HomeBank is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
11 * HomeBank is distributed in the hope that it will be useful,
12 * but WITHOUT ANY WARRANTY; without even the implied warranty of
13 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 * GNU General Public License for more details.
16 * You should have received a copy of the GNU General Public License
17 * along with this program. If not, see <http://www.gnu.org/licenses/>.
23 #include "gtk-chart.h"
24 #include "ui-widgets.h"
26 /****************************************************************************/
28 /****************************************************************************/
37 /* our global datas */
38 extern struct HomeBank
*GLOBALS
;
41 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
44 extern gchar
*CYA_FLT_RANGE
[];
49 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
54 gimp_label_set_attributes (GtkLabel
*label
,
57 PangoAttribute
*attr
= NULL
;
61 g_return_if_fail (GTK_IS_LABEL (label
));
63 attrs
= pango_attr_list_new ();
65 va_start (args
, label
);
69 PangoAttrType attr_type
= va_arg (args
, PangoAttrType
);
72 attr_type
= PANGO_ATTR_INVALID
;
76 case PANGO_ATTR_LANGUAGE
:
77 attr
= pango_attr_language_new (va_arg (args
, PangoLanguage
*));
80 case PANGO_ATTR_FAMILY
:
81 attr
= pango_attr_family_new (va_arg (args
, const gchar
*));
84 case PANGO_ATTR_STYLE
:
85 attr
= pango_attr_style_new (va_arg (args
, PangoStyle
));
88 case PANGO_ATTR_WEIGHT
:
89 attr
= pango_attr_weight_new (va_arg (args
, PangoWeight
));
92 case PANGO_ATTR_VARIANT
:
93 attr
= pango_attr_variant_new (va_arg (args
, PangoVariant
));
96 case PANGO_ATTR_STRETCH
:
97 attr
= pango_attr_stretch_new (va_arg (args
, PangoStretch
));
100 case PANGO_ATTR_SIZE
:
101 attr
= pango_attr_size_new (va_arg (args
, gint
));
104 case PANGO_ATTR_FONT_DESC
:
105 attr
= pango_attr_font_desc_new (va_arg (args
,
106 const PangoFontDescription
*));
109 case PANGO_ATTR_FOREGROUND
:
111 const PangoColor
*color
= va_arg (args
, const PangoColor
*);
113 attr
= pango_attr_foreground_new (color
->red
,
119 case PANGO_ATTR_BACKGROUND
:
121 const PangoColor
*color
= va_arg (args
, const PangoColor
*);
123 attr
= pango_attr_background_new (color
->red
,
129 case PANGO_ATTR_UNDERLINE
:
130 attr
= pango_attr_underline_new (va_arg (args
, PangoUnderline
));
133 case PANGO_ATTR_STRIKETHROUGH
:
134 attr
= pango_attr_strikethrough_new (va_arg (args
, gboolean
));
137 case PANGO_ATTR_RISE
:
138 attr
= pango_attr_rise_new (va_arg (args
, gint
));
141 case PANGO_ATTR_SCALE
:
142 attr
= pango_attr_scale_new (va_arg (args
, gdouble
));
146 //g_warning ("%s: invalid PangoAttribute type %d", G_STRFUNC, attr_type);
147 case PANGO_ATTR_INVALID
:
154 attr
->start_index
= 0;
155 attr
->end_index
= -1;
156 pango_attr_list_insert (attrs
, attr
);
163 gtk_label_set_attributes (label
, attrs
);
164 pango_attr_list_unref (attrs
);
168 void hb_widget_visible(GtkWidget
*widget
, gboolean visible
)
170 if(!GTK_IS_WIDGET(widget
))
175 gtk_widget_show(widget
);
179 gtk_widget_hide(widget
);
184 void ui_label_set_integer(GtkLabel
*label
, gint value
)
188 g_snprintf(buf
, 16, "%d", value
);
189 gtk_label_set_text (label
, buf
);
193 void ui_gtk_entry_set_text(GtkWidget
*widget
, gchar
*text
)
195 DB( g_print(" set text to '%s'\n", text
) );
198 gtk_entry_set_text(GTK_ENTRY(widget
), text
);
200 gtk_entry_set_text(GTK_ENTRY(widget
), "");
203 void ui_gtk_entry_replace_text(GtkWidget
*widget
, gchar
**storage
)
207 DB( g_print(" storage is '%p' at '%p'\n", *storage
, storage
) );
209 /* free any previous string */
210 if( *storage
!= NULL
)
216 text
= gtk_entry_get_text(GTK_ENTRY(widget
));
217 *storage
= g_strdup(text
);
221 GtkWidget
*make_clicklabel(gchar
*id
, gchar
*str
)
226 g_snprintf(buffer
, 254, "<a href=\"%s\">%s</a>", id
, str
);
227 label
= gtk_label_new(buffer
);
228 gtk_label_set_use_markup (GTK_LABEL (label
), TRUE
);
229 gtk_label_set_track_visited_links(GTK_LABEL(label
), FALSE
);
230 gtk_widget_set_halign(label
, GTK_ALIGN_START
);
232 return GTK_WIDGET(label
);
236 GtkWidget
*make_label_group(gchar
*str
)
238 GtkWidget
*label
= gtk_label_new (str
);
240 gtk_widget_set_valign (label
, GTK_ALIGN_CENTER
);
241 gtk_widget_set_halign (label
, GTK_ALIGN_START
);
242 gimp_label_set_attributes(GTK_LABEL(label
), PANGO_ATTR_WEIGHT
, PANGO_WEIGHT_BOLD
, -1);
247 GtkWidget
*make_label_widget(char *str
)
249 GtkWidget
*label
= gtk_label_new_with_mnemonic (str
);
251 gtk_widget_set_valign (label
, GTK_ALIGN_CENTER
);
252 gtk_widget_set_halign (label
, GTK_ALIGN_END
);
257 GtkWidget
*make_label(char *str
, gfloat xalign
, gfloat yalign
)
259 GtkWidget
*label
= gtk_label_new_with_mnemonic (str
);
261 //todo: deprecated in 3.14
262 gtk_misc_set_alignment (GTK_MISC (label
), xalign
, yalign
);
263 //gtk_label_set_xalign(GTK_LABEL(label), xalign);
264 //gtk_label_set_yalign(GTK_LABEL(label), yalign);
272 GtkWidget
*make_text(gfloat xalign
)
276 entry
= gtk_entry_new ();
277 gtk_editable_set_editable (GTK_EDITABLE(entry
), FALSE
);
278 g_object_set(entry
, "xalign", xalign
, NULL
);
283 GtkWidget
*make_search(GtkWidget
*label
)
287 search
= gtk_search_entry_new();
288 gtk_entry_set_placeholder_text(GTK_ENTRY(search
), _("Search...") );
291 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), search
);
301 GtkWidget
*make_string(GtkWidget
*label
)
305 entry
= gtk_entry_new ();
308 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), entry
);
314 GtkWidget
*make_image_button(gchar
*icon_name
, gchar
*tooltip_text
)
316 GtkWidget
*button
, *image
;
318 //todo 3.10 use gtk_button_new_from_icon_name
320 button
= gtk_button_new();
321 image
= gtk_image_new_from_icon_name (icon_name
, GTK_ICON_SIZE_MENU
);
322 g_object_set (button
, "image", image
, NULL
);
323 if(tooltip_text
!= NULL
)
324 gtk_widget_set_tooltip_text(button
, tooltip_text
);
334 GtkWidget
*make_memo_entry(GtkWidget
*label
)
338 GtkEntryCompletion
*completion
;
341 store
= gtk_list_store_new (1, G_TYPE_STRING
);
343 completion
= gtk_entry_completion_new ();
344 gtk_entry_completion_set_model (completion
, GTK_TREE_MODEL(store
));
345 gtk_entry_completion_set_text_column (completion
, 0);
347 entry
= gtk_entry_new ();
348 gtk_entry_set_completion (GTK_ENTRY (entry
), completion
);
350 g_object_unref(store
);
353 //gtk_list_store_clear (GTK_LIST_STORE(store));
355 lmem
= list
= g_hash_table_get_keys(GLOBALS
->h_memo
);
360 //gtk_list_store_append (GTK_LIST_STORE(store), &iter);
361 //gtk_list_store_set (GTK_LIST_STORE(store), &iter, 0, list->data, -1);
362 gtk_list_store_insert_with_values(GTK_LIST_STORE(store
), &iter
, -1,
366 list
= g_list_next(list
);
372 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), entry
);
381 GtkWidget
*make_string_maxlength(GtkWidget
*label
, guint max_length
)
385 entry
= make_string(label
);
386 gtk_entry_set_width_chars(GTK_ENTRY(entry
), max_length
+2);
387 gtk_entry_set_max_length(GTK_ENTRY(entry
), max_length
);
394 static void hb_amount_insert_text_handler (GtkEntry
*entry
, const gchar
*text
, gint length
, gint
*position
, gpointer data
)
396 GtkEditable
*editable
= GTK_EDITABLE(entry
);
397 int i
, count
=0, dcpos
=-1;
398 gchar
*result
= g_new0 (gchar
, length
+1);
400 const gchar
*numtext
;
402 //g_message("insert_text-handler: text:%s - pos:%d - length:%d", text, *position, length);
404 digits
= gtk_spin_button_get_digits(GTK_SPIN_BUTTON(entry
));
405 numtext
= gtk_entry_get_text(entry
);
406 for (i
=0 ; numtext
[i
]!='\0' ; i
++)
408 if(numtext
[i
]==',' || numtext
[i
]=='.')
412 //g_message("previous text='%s' dcpos:'%d'", numtext, dcpos);
413 for (i
=0 ; i
< length
; i
++)
415 if( isdigit(text
[i
]) && ( (*position
<= dcpos
+ digits
) || dcpos
< 0) )
418 if( text
[i
]=='-' && *position
==0 ) /* minus sign only at position 0 */
421 if( dcpos
< 0 && (text
[i
]=='.' || text
[i
]==',') ) /* decimal separator if not in previous string */
422 result
[count
++] = '.';
427 result
[count
++] = text
[i
];
431 g_signal_handlers_block_by_func (G_OBJECT (editable
), G_CALLBACK (hb_amount_insert_text_handler
), data
);
432 gtk_editable_insert_text (editable
, result
, count
, position
);
433 g_signal_handlers_unblock_by_func (G_OBJECT (editable
), G_CALLBACK (hb_amount_insert_text_handler
), data
);
435 g_signal_stop_emission_by_name (G_OBJECT (editable
), "insert-text");
443 GtkWidget
*make_amount(GtkWidget
*label
)
448 //adj = (GtkAdjustment *) gtk_adjustment_new (0.0, -G_MAXDOUBLE, G_MAXDOUBLE, 0.01, 1.0, 0.0);
449 adj
= (GtkAdjustment
*) gtk_adjustment_new (0.0, -8589934588, 8589934588, 0.01, 1.0, 0.0);
450 spinner
= gtk_spin_button_new (adj
, 1.0, 2);
451 g_object_set(spinner
, "xalign", 1.0, NULL
);
454 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), spinner
);
456 g_signal_connect(G_OBJECT(spinner
), "insert-text",
457 G_CALLBACK(hb_amount_insert_text_handler
),
464 GtkWidget
*make_exchange_rate(GtkWidget
*label
)
469 adj
= (GtkAdjustment
*) gtk_adjustment_new (0.0, 0.0, 99999, 0.01, 1.0, 0.0);
470 spinner
= gtk_spin_button_new (adj
, 1.0, 6);
471 //gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
472 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner
), TRUE
);
473 g_object_set(spinner
, "xalign", 1.0, NULL
);
476 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), spinner
);
484 GtkWidget
*make_numeric(GtkWidget
*label
, gdouble min
, gdouble max
)
489 adj
= (GtkAdjustment
*) gtk_adjustment_new (0.0, min
, max
, 1.0, 10.0, 0.0);
490 spinner
= gtk_spin_button_new (adj
, 0, 0);
491 //gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner), TRUE);
492 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner
), TRUE
);
493 g_object_set(spinner
, "xalign", 1.0, NULL
);
496 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), spinner
);
504 GtkWidget
*make_scale(GtkWidget
*label
)
508 scale
= gtk_scale_new_with_range(GTK_ORIENTATION_HORIZONTAL
, GTK_CHART_MINBARW
, GTK_CHART_SPANBARW
, 1.0);
509 gtk_scale_set_draw_value(GTK_SCALE(scale
), FALSE
);
510 gtk_range_set_value(GTK_RANGE(scale
), GTK_CHART_BARW
);
513 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), scale
);
521 GtkWidget
*make_long(GtkWidget
*label
)
525 spinner
= make_numeric(label
, 0.0, G_MAXINT
);
530 GtkWidget
*make_year(GtkWidget
*label
)
535 adj
= (GtkAdjustment
*) gtk_adjustment_new (0.0, 1900, 2200, 1.0, 10.0, 0.0);
536 spinner
= gtk_spin_button_new (adj
, 0, 0);
537 gtk_spin_button_set_wrap (GTK_SPIN_BUTTON (spinner
), TRUE
);
538 gtk_spin_button_set_numeric (GTK_SPIN_BUTTON (spinner
), TRUE
);
539 g_object_set(spinner
, "xalign", 1.0, NULL
);
542 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), spinner
);
549 is_separator (GtkTreeModel
*model
,
557 gtk_tree_model_get (model
, iter
, 0, &txt
, -1);
559 retval
= *txt
== 0 ? TRUE
: FALSE
;
560 //path = gtk_tree_model_get_path (model, iter);
561 //result = gtk_tree_path_get_indices (path)[0] == 4;
562 //gtk_tree_path_free (path);
572 set_sensitive (GtkCellLayout
*cell_layout
,
573 GtkCellRenderer
*cell
,
574 GtkTreeModel
*tree_model
,
582 path
= gtk_tree_model_get_path (tree_model
, iter
);
583 indices
= gtk_tree_path_get_indices (path
);
584 sensitive
= indices
[0] != FLT_RANGE_OTHER
;
585 gtk_tree_path_free (path
);
587 g_object_set (cell
, "sensitive", sensitive
, NULL
);
591 GtkWidget
*make_cycle(GtkWidget
*label
, gchar
**items
)
596 combobox
= gtk_combo_box_text_new ();
598 for (i
= 0; items
[i
] != NULL
; i
++)
601 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox
), _(items
[i
]));
603 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox
), "");
605 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
606 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox
), is_separator
, NULL
, NULL
);
609 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), combobox
);
615 GtkWidget
*make_daterange(GtkWidget
*label
, gboolean custom
)
618 GList
*renderers
, *list
;
619 GtkCellRenderer
*renderer
;
620 gchar
**items
= CYA_FLT_RANGE
;
623 combobox
= gtk_combo_box_text_new ();
625 for (i
= 0; items
[i
] != NULL
; i
++)
628 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox
), _(items
[i
]));
630 gtk_combo_box_text_append_text (GTK_COMBO_BOX_TEXT(combobox
), "");
632 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
635 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), combobox
);
638 renderers
= gtk_cell_layout_get_cells (GTK_CELL_LAYOUT(combobox
));
639 if(g_list_length(renderers
) == 1 && custom
== FALSE
)
641 list
= g_list_first(renderers
);
642 renderer
= list
->data
;
645 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox
),
650 g_list_free(renderers
);
652 gtk_combo_box_set_row_separator_func (GTK_COMBO_BOX (combobox
), is_separator
, NULL
, NULL
);
657 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
662 GtkWidget
*make_radio(gchar
**items
, gboolean buttonstyle
, GtkOrientation orientation
)
664 GtkWidget
*box
, *button
;
667 box
= gtk_box_new (orientation
, 0);
669 button
= gtk_radio_button_new_with_label (NULL
, _(items
[0]));
670 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button
), !buttonstyle
);
671 gtk_box_pack_start (GTK_BOX (box
), button
, FALSE
, FALSE
, 0);
672 for (i
= 1; items
[i
] != NULL
; i
++)
674 button
= gtk_radio_button_new_with_label_from_widget (GTK_RADIO_BUTTON (button
), _(items
[i
]));
675 gtk_toggle_button_set_mode (GTK_TOGGLE_BUTTON (button
), !buttonstyle
);
676 gtk_box_pack_start (GTK_BOX (box
), button
, FALSE
, FALSE
, 0);
681 gtk_style_context_add_class (gtk_widget_get_style_context (box
), GTK_STYLE_CLASS_LINKED
);
682 gtk_style_context_add_class (gtk_widget_get_style_context (box
), GTK_STYLE_CLASS_RAISED
);
689 gint
radio_get_active (GtkContainer
*container
)
691 GList
*lchild
, *list
;
695 if(!GTK_IS_CONTAINER(container
))
698 lchild
= list
= gtk_container_get_children (container
);
699 for(i
=0;list
!= NULL
;i
++)
702 if(GTK_IS_TOGGLE_BUTTON(radio
))
704 if( gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(radio
)) == TRUE
)
710 list
= g_list_next(list
);
717 GtkWidget
*radio_get_nth_widget (GtkContainer
*container
, gint nth
)
719 GList
*lchild
, *list
;
722 if(!GTK_IS_CONTAINER(container
))
725 lchild
= list
= gtk_container_get_children (container
);
726 radio
= g_list_nth_data (list
, nth
);
728 return radio
; //may return NULL
733 void radio_set_active (GtkContainer
*container
, gint active
)
735 GList
*lchild
, *list
;
738 if(!GTK_IS_CONTAINER(container
))
741 lchild
= list
= gtk_container_get_children (container
);
742 radio
= g_list_nth_data (list
, active
);
743 if(radio
!= NULL
&& GTK_IS_TOGGLE_BUTTON(radio
))
745 gtk_toggle_button_set_active (GTK_TOGGLE_BUTTON(radio
), TRUE
);
751 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
754 id ofx english french
755 ---------------------------------------------------------------------
756 0 -------- (none) (aucun)
757 1 -------- credit card carte de crédit
758 2 OFX_CHECK Check cheque
759 3 OFX_CASH Cash withdrawal retrait espece
760 4 OFX_XFER Transfer virement
761 5 -------- internal transfer virement compte
762 6 -------- (debit card) (carte de paiement
763 7 OFX_REPEATPMT Repeating payment/standing order Paiement recurrent/Virement auto.
765 8 OFX_PAYMENT Electronic payment télépaiement
766 9 OFX_DEP Deposit dépôt
767 10 OFX_FEE FI fee frais bancaires
770 OFX_DIRECTDEBIT Merchant initiated debit prelevement
771 OFX_OTHER Somer other type of transaction autre
775 OFX_CREDIT Generic credit
776 OFX_DEBIT Generic debit
777 OFX_INT Interest earned or paid (Note: Depends on signage of amount)
779 OFX_SRVCHG Service charge
781 OFX_ATM ATM debit or credit (Note: Depends on signage of amount)
782 OFX_POS Point of sale debit or credit (Note: Depends on signage of amount)
785 -OFX_PAYMENT Electronic payment
786 -OFX_CASH Cash withdrawal
787 OFX_DIRECTDEP Direct deposit
788 OFX_DIRECTDEBIT Merchant initiated debit
789 -OFX_REPEATPMT Repeating payment/standing order
790 OFX_OTHER Somer other type of transaction
795 LST_PAYMODE_ICONNAME
,
800 char *paymode_iconnames
[NUM_PAYMODE_MAX
] =
816 char *paymode_label_names
[NUM_PAYMODE_MAX
] =
823 N_("Internal transfer"),
825 N_("Standing order"),
826 N_("Electronic payment"),
828 //TRANSLATORS: Financial institution fee
833 /* nota: used in ui-filter */
834 gchar
*get_paymode_icon_name(gint index
)
836 if(index
>= NUM_PAYMODE_MAX
)
839 return paymode_iconnames
[index
];
844 ** Make a paymode combobox widget
848 paymode_set_sensitive (GtkCellLayout
*cell_layout
,
849 GtkCellRenderer
*cell
,
850 GtkTreeModel
*tree_model
,
858 path
= gtk_tree_model_get_path (tree_model
, iter
);
859 indices
= gtk_tree_path_get_indices (path
);
860 sensitive
= (indices
[0] == PAYMODE_INTXFER
) ? FALSE
: TRUE
;
861 gtk_tree_path_free (path
);
864 g_object_set (cell
, "sensitive", sensitive
, NULL
);
869 static GtkWidget
*make_paymode_internal(GtkWidget
*label
, gboolean intxfer
)
874 GtkCellRenderer
*renderer
, *r1
, *r2
;
877 store
= gtk_list_store_new (
883 combobox
= gtk_combo_box_new_with_model(GTK_TREE_MODEL(store
));
885 renderer
= r1
= gtk_cell_renderer_pixbuf_new();
886 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox
), renderer
, FALSE
);
887 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox
), renderer
, "icon-name", LST_PAYMODE_ICONNAME
);
889 renderer
= r2
= gtk_cell_renderer_text_new();
890 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox
), renderer
, FALSE
);
891 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox
), renderer
, "text", LST_PAYMODE_LABEL
);
894 if( intxfer
== FALSE
)
896 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox
),
898 paymode_set_sensitive
,
900 gtk_cell_layout_set_cell_data_func (GTK_CELL_LAYOUT (combobox
),
902 paymode_set_sensitive
,
906 //populate our combobox model
907 for(i
=0;i
<NUM_PAYMODE_MAX
;i
++)
909 gtk_list_store_append(store
, &iter
);
910 gtk_list_store_set(store
, &iter
,
911 LST_PAYMODE_ICONNAME
, paymode_iconnames
[i
],
912 LST_PAYMODE_LABEL
, _(paymode_label_names
[i
]),
916 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
919 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), combobox
);
926 GtkWidget
*make_paymode(GtkWidget
*label
)
928 return make_paymode_internal(label
, TRUE
);
931 GtkWidget
*make_paymode_nointxfer(GtkWidget
*label
)
933 return make_paymode_internal(label
, FALSE
);
937 /* = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = = */
939 #define NUM_NAINEX_MAX 3
948 char *nainex_iconnames
[NUM_NAINEX_MAX
] =
955 char *nainex_label_names
[NUM_NAINEX_MAX
] =
964 ** Make a nainex combobox widget
966 GtkWidget
*make_nainex(GtkWidget
*label
)
971 GtkCellRenderer
*renderer
;
975 store
= gtk_list_store_new (
982 combobox
= gtk_combo_box_new_with_model(GTK_TREE_MODEL(store
));
985 renderer
= gtk_cell_renderer_pixbuf_new();
986 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox
), renderer
, FALSE
);
987 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox
), renderer
, "icon-name", LST_NAINEX_ICONNAME
);
989 renderer
= gtk_cell_renderer_text_new();
990 gtk_cell_layout_pack_start(GTK_CELL_LAYOUT(combobox
), renderer
, FALSE
);
991 gtk_cell_layout_add_attribute (GTK_CELL_LAYOUT(combobox
), renderer
, "text", LST_NAINEX_LABEL
);
993 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
995 //populate our combobox model
996 for(i
=0;i
<NUM_NAINEX_MAX
;i
++)
998 gtk_list_store_append(store
, &iter
);
999 gtk_list_store_set(store
, &iter
,
1000 LST_NAINEX_ICONNAME
, nainex_iconnames
[i
],
1001 LST_NAINEX_LABEL
, _(nainex_label_names
[i
]),
1004 gtk_combo_box_set_active(GTK_COMBO_BOX(combobox
), 0);
1007 gtk_label_set_mnemonic_widget (GTK_LABEL(label
), combobox
);