1 #ifndef INCLUDED_UILIB_H
2 #define INCLUDED_UILIB_H
6 using ui_alignment = struct _GtkAlignment;
7 using ui_button = struct _GtkButton;
8 using ui_evkey = struct _GdkEventKey;
9 using ui_label = struct _GtkLabel;
10 using ui_menuitem = struct _GtkMenuItem;
11 using ui_modal = struct ModalDialog;
12 using ui_treemodel = struct _GtkTreeModel;
13 using ui_treeview = struct _GtkTreeView;
14 using ui_typeinst = struct _GTypeInstance;
15 using ui_vbox = struct _GtkVBox;
16 using ui_widget = struct _GtkWidget;
17 using ui_window = struct _GtkWindow;
21 void init(int argc, char *argv[]);
25 enum class alert_type {
33 enum class alert_icon {
41 enum class alert_response {
48 template<class Self, class T>
52 { return (T *) static_cast<const Self *>(this)->_handle; }
62 Base(void *h) : _handle(h)
65 explicit operator bool() const
66 { return _handle != nullptr; }
68 explicit operator ui_typeinst *() const
69 { return (ui_typeinst *) _handle; }
71 explicit operator void *() const
75 static_assert(sizeof(Base) == sizeof(ui_widget *), "object slicing");
77 class Widget : public Base, public Convertible<Widget, ui_widget> {
79 explicit Widget(ui_widget *h = nullptr) : Base((void *) h)
82 alert_response alert(std::string text, std::string title = "NetRadiant",
83 alert_type type = alert_type::OK, alert_icon icon = alert_icon::DEFAULT);
85 const char *file_dialog(bool open, const char *title, const char *path = nullptr,
86 const char *pattern = nullptr, bool want_load = false, bool want_import = false,
87 bool want_save = false);
90 static_assert(sizeof(Widget) == sizeof(Base), "object slicing");
94 #define WRAP(name, impl, methods) \
95 class name : public Widget, public Convertible<name, impl> { \
97 explicit name(impl *h = nullptr) : Widget(reinterpret_cast<ui_widget *>(h)) {} \
100 static_assert(sizeof(name) == sizeof(Widget), "object slicing")
102 WRAP(Window, ui_window,
103 Window create_dialog_window(const char *title, void func(), void *data, int default_w = -1,
106 Window create_modal_dialog_window(const char *title, ui_modal &dialog, int default_w = -1,
109 Window create_floating_window(const char *title);
111 std::uint64_t on_key_press(bool (*f)(Widget widget, ui_evkey *event, void *extra),
112 void *extra = nullptr);
115 WRAP(Button, ui_button,
116 Button(const char *label);
119 WRAP(CheckButton, ui_widget,);
121 WRAP(SpinButton, ui_widget,);
123 WRAP(MenuItem, ui_menuitem,);
125 WRAP(Label, ui_label,
126 Label(const char *label);
129 WRAP(Alignment, ui_alignment,
130 Alignment(float xalign, float yalign, float xscale, float yscale);
133 WRAP(TreeModel, ui_treemodel, );
135 WRAP(TreeView, ui_treeview,
136 TreeView(TreeModel model);
140 VBox(bool homogenous, int spacing);