GnuCash c935c2f+
Loading...
Searching...
No Matches
gnc-option-gtk-ui.hpp
1/********************************************************************\
2 * gnc-option-gtk-ui.hpp -- Gtk Widgets for manipulating options *
3 * Copyright 2022 John Ralls <jralls@ceridwen.us> *
4 * *
5 * This program is free software; you can redistribute it and/or *
6 * modify it under the terms of the GNU General Public License as *
7 * published by the Free Software Foundation; either version 2 of *
8 * the License, or (at your option) any later version. *
9 * *
10 * This program is distributed in the hope that it will be useful, *
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
13 * GNU General Public License for more details. *
14 * *
15 * You should have received a copy of the GNU General Public License*
16 * along with this program; if not, contact: *
17 * *
18 * Free Software Foundation Voice: +1-617-542-5942 *
19 * 51 Franklin Street, Fifth Floor Fax: +1-617-542-2652 *
20 * Boston, MA 02110-1301, USA gnu@gnu.org *
21\********************************************************************/
22
23#ifndef GNC_OPTION_GTK_UI_HPP
24#define GNC_OPTION_GTK_UI_HPP
25
26#include <gtk/gtk.h>
27#include <glib/gi18n.h>
28#include <vector>
29#include <gnc-option.hpp>
30#include <gnc-option-uitype.hpp>
31#include <gnc-option-ui.hpp>
32#include <libguile.h>
33
45typedef void (*WidgetCreateFunc)(GncOption&, GtkGrid*, int);
46
52{
53public:
58 static void set_func(GncOptionUIType type, WidgetCreateFunc func);
65 static void create(GncOption& option, GtkGrid* page, int row);
66private:
67 static std::vector<WidgetCreateFunc> s_registry;
68 static bool s_initialized;
69};
70
75{
76public:
77 GncOptionGtkUIItem(GtkWidget* widget, GncOptionUIType type);
80 virtual ~GncOptionGtkUIItem() override;
82 virtual void set_selectable(bool) const noexcept override;
84 void clear_ui_item() override;
85 void set_widget(GtkWidget* widget);
86 virtual GtkWidget* get_widget() const { return m_widget; }
87 virtual SCM get_widget_scm_value(const GncOption&) const;
88private:
89 GtkWidget* m_widget;
90};
91
92void gnc_option_changed_widget_cb (GtkWidget *widget, GncOption *option);
93void gnc_option_changed_option_cb (GtkWidget *dummy, GncOption *option);
94
95template<GncOptionUIType type> void
96create_option_widget(GncOption& option, GtkGrid*, int row);
97
102template <typename Instance> inline const QofInstance*
103qof_instance_cast(Instance inst)
104{
105 static_assert(std::is_pointer_v<Instance>, "Pointers Only!");
106 return reinterpret_cast<const QofInstance*>(inst);
107}
108
109inline void
110align_label (GtkLabel *name_label)
111{
112 /* some option widgets have a large vertical footprint so align
113 the label name to the top and add a small top margin */
114 gtk_widget_set_valign (GTK_WIDGET(name_label), GTK_ALIGN_START);
115 gtk_widget_set_margin_top (GTK_WIDGET(name_label), 6);
116}
117
118inline void
119set_name_label(const GncOption& option, GtkGrid* page_box, int row, bool align)
120{
121 auto name{option.get_name().c_str()};
122 if (name && *name)
123 {
124 auto label{gtk_label_new(_(name))};
125 if (align)
126 align_label(GTK_LABEL(label));
127 gtk_widget_set_halign (GTK_WIDGET(label), GTK_ALIGN_END);
128 gtk_grid_attach(GTK_GRID(page_box), label, 0, row, 1, 1);
129 }
130}
131
132inline void
133set_tool_tip(const GncOption& option, GtkWidget* box)
134{
135 auto documentation{option.get_docstring().c_str()};
136 if (documentation && *documentation)
137 gtk_widget_set_tooltip_text(box, _(documentation));
138}
139
140inline void
141grid_attach_widget(GtkGrid* grid, GtkWidget* widget, int row)
142{
143 /* attach the option widget to the second column of the grid */
144 gtk_grid_attach (grid, widget, 1, row, 1, 1);
145
146}
147
148inline void
149wrap_widget (const GncOption& option, GtkWidget* widget, GtkGrid* page_box, int row)
150{
151 auto enclosing{gtk_box_new (GTK_ORIENTATION_HORIZONTAL, 5)};
152 gtk_box_set_homogeneous (GTK_BOX (enclosing), FALSE);
153 gtk_box_pack_start(GTK_BOX(enclosing), widget, FALSE, FALSE, 0);
154 set_name_label(option, page_box, row, false);
155 set_tool_tip(option, enclosing);
156 gtk_widget_show_all(enclosing);
157 grid_attach_widget(page_box, enclosing, row);
158}
159#endif //GNC_OPTION_GTK_UI_HPP
class GncOptionGtkUIItem Gtk-specific Interface class for Option Widget
virtual void set_selectable(bool) const noexcept override
Control wether the widget is sensitive.
void clear_ui_item() override
Clear the data from the widget.
Factory class that keeps track of which GncOptionValueType needs which WidgetCreateFunc and calls the...
static void set_func(GncOptionUIType type, WidgetCreateFunc func)
Register a WidgetCreateFunc.
static void create(GncOption &option, GtkGrid *page, int row)
Create a widget.
Holds a pointer to the UI item which will control the option and an enum representing the type of the...
Represents the public interface for an option.
OptionUITypes.
C++ Public interface for individual options.
GncOptionUIType
Used by GncOptionClassifier to indicate to dialog-options what control should be displayed for the op...