X-Git-Url: http://git.xonotic.org/?a=blobdiff_plain;f=libs%2Fuilib%2Fuilib.cpp;h=1b19229146ead12332f04c0f374cac2fa1434528;hb=0203ac024e9396ebc180d9721da40b90b7c33dc6;hp=82127e9f47cba0ad53796a92fdee84c75baa4595;hpb=e6ffa8c04f8bd4e501210652daf88b52a366a338;p=xonotic%2Fnetradiant.git diff --git a/libs/uilib/uilib.cpp b/libs/uilib/uilib.cpp index 82127e9f..1b192291 100644 --- a/libs/uilib/uilib.cpp +++ b/libs/uilib/uilib.cpp @@ -39,22 +39,31 @@ namespace ui { Widget root{ui::null}; #define IMPL(T, F) template<> _IMPL(T, F) -#define _IMPL(T, F) struct verify { using self = T; static self test(self it) { return self(F(it)); } } +#define _IMPL(T, F) struct verify { using self = T; static self test(self it) { return self::from(F(it)); } } template struct verify; template _IMPL(T,); -#define this (verify::test(*static_cast(this))) + template + using pointer_remove_const = std::add_pointer< + typename std::remove_const< + typename std::remove_pointer::type + >::type + >; + +#define this (verify::test(*static_cast(const_cast::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(+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