Introduce Property<T> to simplify preferences system
[xonotic/netradiant.git] / libs / gtkutil / widget.cpp
1 #include "widget.h"
2 #include <gtk/gtk.h>
3
4 void widget_queue_draw(ui::Widget &widget)
5 {
6     gtk_widget_queue_draw(widget);
7 }
8
9 void widget_make_default(ui::Widget widget)
10 {
11     gtk_widget_set_can_default(widget, true);
12     gtk_widget_grab_default(widget);
13 }
14
15 gboolean ToggleShown::notify_visible(ui::Widget widget, gpointer dummy, ToggleShown *self)
16 {
17     self->update();
18     return FALSE;
19 }
20
21 gboolean ToggleShown::destroy(ui::Widget widget, ToggleShown *self)
22 {
23     self->m_shownDeferred = gtk_widget_get_visible(self->m_widget) != FALSE;
24     self->m_widget = ui::Widget(ui::null);
25     return FALSE;
26 }
27
28 void ToggleShown::update()
29 {
30     m_item.update();
31 }
32
33 bool ToggleShown::active() const
34 {
35     if (!m_widget) {
36         return m_shownDeferred;
37     } else {
38         return gtk_widget_get_visible(m_widget) != FALSE;
39     }
40 }
41
42 void ToggleShown::exportActive(const Callback<void(bool)> &importCallback)
43 {
44     importCallback(active());
45 }
46
47 void ToggleShown::set(bool shown)
48 {
49     if (!m_widget) {
50         m_shownDeferred = shown;
51     } else {
52         m_widget.visible(shown);
53     }
54 }
55
56 void ToggleShown::toggle()
57 {
58     m_widget.visible(!m_widget.visible());
59 }
60
61 void ToggleShown::connect(ui::Widget widget)
62 {
63     m_widget = widget;
64     m_widget.visible(m_shownDeferred);
65     m_widget.connect("notify::visible", G_CALLBACK(notify_visible), this);
66     m_widget.connect("destroy", G_CALLBACK(destroy), this);
67     update();
68 }
69
70 gboolean WidgetFocusPrinter::focus_in(ui::Widget widget, GdkEventFocus *event, WidgetFocusPrinter *self)
71 {
72     globalOutputStream() << self->m_name << " takes focus\n";
73     return FALSE;
74 }
75
76 gboolean WidgetFocusPrinter::focus_out(ui::Widget widget, GdkEventFocus *event, WidgetFocusPrinter *self)
77 {
78     globalOutputStream() << self->m_name << " loses focus\n";
79     return FALSE;
80 }
81
82 void WidgetFocusPrinter::connect(ui::Widget widget)
83 {
84     widget.connect("focus_in_event", G_CALLBACK(focus_in), this);
85     widget.connect("focus_out_event", G_CALLBACK(focus_out), this);
86 }