]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - libs/uilib/uilib.cpp
Wrap more GTK
[xonotic/netradiant.git] / libs / uilib / uilib.cpp
index 82127e9f47cba0ad53796a92fdee84c75baa4595..1b19229146ead12332f04c0f374cac2fa1434528 100644 (file)
@@ -39,22 +39,31 @@ namespace ui {
     Widget root{ui::null};
 
 #define IMPL(T, F) template<> _IMPL(T, F)
-#define _IMPL(T, F) struct verify<T *> { using self = T; static self test(self it) { return self(F(it)); } }
+#define _IMPL(T, F) struct verify<T *> { using self = T; static self test(self it) { return self::from(F(it)); } }
 
     template<class T>
     struct verify;
 
     template<class T> _IMPL(T,);
 
-#define this (verify<self>::test(*static_cast<self>(this)))
+    template<class T>
+    using pointer_remove_const = std::add_pointer<
+            typename std::remove_const<
+                    typename std::remove_pointer<T>::type
+            >::type
+    >;
+
+#define this (verify<self>::test(*static_cast<self>(const_cast<pointer_remove_const<decltype(this)>::type>(this))))
 
     IMPL(Editable, GTK_EDITABLE);
 
     void IEditable::editable(bool value)
     {
-        gtk_editable_set_editable(GTK_EDITABLE(this), value);
+        gtk_editable_set_editable(this, value);
     }
 
+    IMPL(TreeModel, GTK_TREE_MODEL);
+
     IMPL(Widget, GTK_WIDGET);
 
     Widget::Widget(ui::New_t) : Widget(nullptr)
@@ -187,7 +196,7 @@ namespace ui {
             delete data;
         };
         auto func = [](_GtkWidget *widget, GdkEventKey *event, user_data *args) -> bool {
-            return args->f(Widget(widget), event, args->extra);
+            return args->f(Widget::from(widget), event, args->extra);
         };
         auto clos = g_cclosure_new(G_CALLBACK(+func), pass, reinterpret_cast<GClosureNotify>(+dtor));
         return g_signal_connect_closure(G_OBJECT(this), "key-press-event", clos, false);
@@ -219,9 +228,14 @@ namespace ui {
 
     IMPL(ToggleButton, GTK_TOGGLE_BUTTON);
 
-    bool IToggleButton::active()
+    bool IToggleButton::active() const
     {
-        return gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(this)) != 0;
+        return gtk_toggle_button_get_active(this) != 0;
+    }
+
+    void IToggleButton::active(bool value)
+    {
+        gtk_toggle_button_set_active(this, value);
     }
 
     IMPL(CheckButton, GTK_CHECK_BUTTON);
@@ -422,6 +436,8 @@ namespace ui {
         gtk_list_store_append(this, nullptr);
     }
 
+    IMPL(TreeStore, GTK_TREE_STORE);
+
     // IMPL(TreePath, GTK_TREE_PATH);
 
     TreePath::TreePath(ui::New_t) : TreePath(gtk_tree_path_new())
@@ -432,6 +448,16 @@ namespace ui {
 
     // Custom
 
+#if GTK_TARGET == 3
+
+    IMPL(GLArea, (void *));
+
+#elif GTK_TARGET == 2
+
+    IMPL(GLArea, GTK_DRAWING_AREA);
+
+#endif
+
     guint IGLArea::on_render(GCallback pFunction, void *data)
     {
 #if GTK_TARGET == 3