mirror of
https://github.com/Gnucash/gnucash.git
synced 2025-02-25 18:55:30 -06:00
Provide an alternative for the option menu based business
utility functions. GtkOptionMenu is deprecated. The original functions remain available for now as they are still in use. git-svn-id: svn+ssh://svn.gnucash.org/repo/gnucash/trunk@21491 57a11ea4-9604-0410-9ed3-97b8803252fd
This commit is contained in:
parent
8230904345
commit
541ec1e497
@ -654,3 +654,185 @@ gnc_ui_taxincluded_optionmenu (GtkWidget *omenu, GncTaxIncluded *choice)
|
|||||||
gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), current);
|
gtk_option_menu_set_history (GTK_OPTION_MENU (omenu), current);
|
||||||
gtk_widget_show (menu);
|
gtk_widget_show (menu);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/***********************************************************************
|
||||||
|
* gnc_simple_combo implementation functions
|
||||||
|
*/
|
||||||
|
|
||||||
|
typedef struct
|
||||||
|
{
|
||||||
|
gint component_id;
|
||||||
|
GtkComboBox *cbox;
|
||||||
|
QofBook *book;
|
||||||
|
gboolean none_ok;
|
||||||
|
const char * (*get_name)(gpointer);
|
||||||
|
GList * (*get_list)(QofBook*);
|
||||||
|
|
||||||
|
} ListStoreData;
|
||||||
|
|
||||||
|
static void
|
||||||
|
gnc_simple_combo_add_item (GtkListStore *liststore, const char *label, gpointer this_item)
|
||||||
|
{
|
||||||
|
GtkTreeIter iter;
|
||||||
|
|
||||||
|
gtk_list_store_append (liststore, &iter);
|
||||||
|
gtk_list_store_set (liststore, &iter, 0, label, 1, this_item, -1);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gnc_simple_combo_generate_liststore (ListStoreData *lsd)
|
||||||
|
{
|
||||||
|
GList *items;
|
||||||
|
GtkListStore *liststore;
|
||||||
|
|
||||||
|
if (!(lsd->get_list))
|
||||||
|
return;
|
||||||
|
if (!(lsd->get_name))
|
||||||
|
return;
|
||||||
|
|
||||||
|
/* Get the list of items */
|
||||||
|
items = (lsd->get_list)(lsd->book);
|
||||||
|
|
||||||
|
/* Reset the combobox' liststore */
|
||||||
|
liststore = GTK_LIST_STORE (gtk_combo_box_get_model (lsd->cbox));
|
||||||
|
gtk_list_store_clear (liststore);
|
||||||
|
|
||||||
|
if (lsd->none_ok || !items)
|
||||||
|
gnc_simple_combo_add_item (liststore, _("None"), NULL);
|
||||||
|
|
||||||
|
for ( ; items; items = items->next)
|
||||||
|
gnc_simple_combo_add_item (liststore, (lsd->get_name)(items->data), items->data);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gnc_simple_combo_refresh_handler (GHashTable *changes, gpointer user_data)
|
||||||
|
{
|
||||||
|
ListStoreData *lsd = user_data;
|
||||||
|
gnc_simple_combo_generate_liststore (lsd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
gnc_simple_combo_destroy_cb (GtkWidget *widget, gpointer data)
|
||||||
|
{
|
||||||
|
ListStoreData *lsd = data;
|
||||||
|
|
||||||
|
gnc_unregister_gui_component (lsd->component_id);
|
||||||
|
g_free (lsd);
|
||||||
|
}
|
||||||
|
|
||||||
|
static ListStoreData *
|
||||||
|
gnc_simple_combo_make (GtkComboBox *cbox, QofBook *book,
|
||||||
|
gboolean none_ok, QofIdType type_name,
|
||||||
|
GList * (*get_list)(QofBook*),
|
||||||
|
GenericLookup_t get_name,
|
||||||
|
gpointer initial_choice)
|
||||||
|
{
|
||||||
|
ListStoreData *lsd;
|
||||||
|
|
||||||
|
lsd = g_object_get_data (G_OBJECT (cbox), "liststore-data");
|
||||||
|
|
||||||
|
/* If this is the first time we've been called, then build the
|
||||||
|
* Option Menu Data object, register with the component manager, and
|
||||||
|
* watch for changed items. Then register for deletion, so we can
|
||||||
|
* unregister and free the data when this menu is destroyed.
|
||||||
|
*/
|
||||||
|
if (!lsd)
|
||||||
|
{
|
||||||
|
|
||||||
|
lsd = g_new0 (ListStoreData, 1);
|
||||||
|
lsd->cbox = cbox;
|
||||||
|
lsd->book = book;
|
||||||
|
lsd->none_ok = none_ok;
|
||||||
|
lsd->get_name = get_name;
|
||||||
|
lsd->get_list = get_list;
|
||||||
|
g_object_set_data (G_OBJECT (cbox), "liststore-data", lsd);
|
||||||
|
|
||||||
|
lsd->component_id =
|
||||||
|
gnc_register_gui_component ("gnc-simple-combo-refresh-hook",
|
||||||
|
gnc_simple_combo_refresh_handler,
|
||||||
|
NULL, lsd);
|
||||||
|
|
||||||
|
if (type_name)
|
||||||
|
gnc_gui_component_watch_entity_type (lsd->component_id,
|
||||||
|
type_name,
|
||||||
|
QOF_EVENT_MODIFY | QOF_EVENT_DESTROY);
|
||||||
|
|
||||||
|
g_signal_connect (G_OBJECT (cbox), "destroy",
|
||||||
|
G_CALLBACK (gnc_simple_combo_destroy_cb), lsd);
|
||||||
|
}
|
||||||
|
|
||||||
|
gnc_simple_combo_generate_liststore (lsd);
|
||||||
|
gnc_simple_combo_set_value (cbox, initial_choice);
|
||||||
|
|
||||||
|
return lsd;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***********************************************************
|
||||||
|
* Specific invocations of the gnc_simple_combo widget
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* Use a list available billing terms to fill the model of
|
||||||
|
* the combobox passed in. If none_ok is true, then add "none" as a
|
||||||
|
* choice (with data set to NULL).. If inital_choice is non-NULL,
|
||||||
|
* then that will be the default option setting when the menu is
|
||||||
|
* created.
|
||||||
|
*/
|
||||||
|
void
|
||||||
|
gnc_billterms_combo (GtkComboBox *cbox, QofBook *book,
|
||||||
|
gboolean none_ok, GncBillTerm *initial_choice)
|
||||||
|
{
|
||||||
|
if (!cbox || !book) return;
|
||||||
|
|
||||||
|
gnc_simple_combo_make (cbox, book, none_ok, GNC_BILLTERM_MODULE_NAME,
|
||||||
|
gncBillTermGetTerms,
|
||||||
|
(GenericLookup_t)gncBillTermGetName,
|
||||||
|
(gpointer)initial_choice);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Convenience functions for the above simple combo box types. */
|
||||||
|
|
||||||
|
/** Get the value of the item that is currently selected in the combo box */
|
||||||
|
gpointer
|
||||||
|
gnc_simple_combo_get_value (GtkComboBox *cbox)
|
||||||
|
{
|
||||||
|
GtkTreeIter iter;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
GValue value = { 0 };
|
||||||
|
|
||||||
|
if (!cbox) return NULL;
|
||||||
|
|
||||||
|
model = gtk_combo_box_get_model (cbox);
|
||||||
|
if (!gtk_combo_box_get_active_iter (cbox, &iter))
|
||||||
|
return NULL;
|
||||||
|
gtk_tree_model_get_value (model, &iter, 1, &value);
|
||||||
|
return g_value_get_pointer (&value);
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Find the item in the combo box whose value is "data"
|
||||||
|
* and make it the active item. */
|
||||||
|
void
|
||||||
|
gnc_simple_combo_set_value (GtkComboBox *cbox, gpointer data)
|
||||||
|
{
|
||||||
|
GtkTreeIter iter;
|
||||||
|
GtkTreeModel *model;
|
||||||
|
gboolean valid_iter;
|
||||||
|
|
||||||
|
if (!cbox) return;
|
||||||
|
|
||||||
|
model = gtk_combo_box_get_model (cbox);
|
||||||
|
valid_iter = gtk_tree_model_get_iter_first (model, &iter);
|
||||||
|
|
||||||
|
while (valid_iter)
|
||||||
|
{
|
||||||
|
GValue value = { 0 };
|
||||||
|
|
||||||
|
gtk_tree_model_get_value (model, &iter, 1, &value);
|
||||||
|
if (g_value_get_pointer(&value) == data)
|
||||||
|
{
|
||||||
|
gtk_combo_box_set_active_iter (cbox, &iter);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
valid_iter = gtk_tree_model_iter_next (model, &iter);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -95,5 +95,41 @@ void gnc_ui_optionmenu_set_changed_callback (GtkWidget *omenu,
|
|||||||
gpointer gnc_ui_optionmenu_get_value (GtkWidget *omenu);
|
gpointer gnc_ui_optionmenu_get_value (GtkWidget *omenu);
|
||||||
void gnc_ui_optionmenu_set_value (GtkWidget *omenu, gpointer data);
|
void gnc_ui_optionmenu_set_value (GtkWidget *omenu, gpointer data);
|
||||||
|
|
||||||
|
/* Create a combo box of available billing terms based on
|
||||||
|
* the combo box If none_ok is true, then add "none" as a
|
||||||
|
* choice (with data set to NULL). If inital_choice is non-NULL,
|
||||||
|
* then that will be the default option setting when the menu is
|
||||||
|
* created.
|
||||||
|
*
|
||||||
|
* Note: if you are interested in the currently active combo box
|
||||||
|
* item, you can use the function gnc_simple_combo_get_value below.
|
||||||
|
* This can be used for example in a callback function that triggers
|
||||||
|
* on the combo box' "changed" signal"
|
||||||
|
*/
|
||||||
|
void gnc_billterms_combo (GtkComboBox *cbox, QofBook *book,
|
||||||
|
gboolean none_ok, GncBillTerm *initial_choice);
|
||||||
|
|
||||||
|
/* Same thing except for the tax tables */
|
||||||
|
//void
|
||||||
|
//gnc_ui_taxtables_optionmenu (GtkComboBox *cbox, QofBook *book,
|
||||||
|
// gboolean none_ok, GncTaxTable **choice);
|
||||||
|
|
||||||
|
/* Build an option menu for choosing a GncTaxIncluded */
|
||||||
|
//void gnc_ui_taxincluded_optionmenu (GtkComboBox *cbox, GncTaxIncluded *choice);
|
||||||
|
|
||||||
|
|
||||||
|
/* Here are some "simple combo box" utilities that can be used with
|
||||||
|
* ANY of the above combo box types. In particular the following
|
||||||
|
* functions are useful for hooking the above combo boxes into the
|
||||||
|
* GNC Option infrastructure.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/** Get the value of the item that is currently selected in the combo box */
|
||||||
|
gpointer gnc_simple_combo_get_value (GtkComboBox *cbox);
|
||||||
|
|
||||||
|
/** Find the item in the combo box whose value is "data"
|
||||||
|
* and make it the active item. */
|
||||||
|
void gnc_simple_combo_set_value (GtkComboBox *cbox, gpointer data);
|
||||||
|
|
||||||
|
|
||||||
#endif /* GNC_BUSINESS_GNOME_UTILS_H_ */
|
#endif /* GNC_BUSINESS_GNOME_UTILS_H_ */
|
||||||
|
Loading…
Reference in New Issue
Block a user