Remove <gtk/gtk.h> from gtkutil/container.h
authorTimePath <andrew.hardaker1995@gmail.com>
Sat, 22 Jul 2017 05:53:10 +0000 (15:53 +1000)
committerTimePath <andrew.hardaker1995@gmail.com>
Mon, 31 Jul 2017 12:35:47 +0000 (22:35 +1000)
libs/gtkutil/container.h
libs/gtkutil/menu.cpp
libs/uilib/uilib.cpp
libs/uilib/uilib.h
radiant/console.cpp
radiant/xywindow.cpp

index 8e70e35..12d0ca9 100644 (file)
 #if !defined( INCLUDED_GTKUTIL_CONTAINER_H )
 #define INCLUDED_GTKUTIL_CONTAINER_H
 
-#include <gtk/gtk.h>
-
-inline ui::Widget container_add_widget( ui::Container container, ui::Widget widget ){
-       container.add(widget);
-       return widget;
-}
-
-inline void container_remove( ui::Widget item, gpointer data ){
-       auto container = ui::Container(GTK_CONTAINER( data ));
-       container.add(item);
-}
-
-inline void container_remove_all( ui::Container container ){
-       gtk_container_foreach(container, (GtkCallback) container_remove, container );
+inline void container_remove_all(ui::Container container)
+{
+    container.foreach([=](ui::Widget it) mutable {
+        container.remove(it);
+    });
 }
 
 #endif
index 007d7a4..51e156e 100644 (file)
@@ -39,7 +39,7 @@ void menu_add_item( ui::Menu menu, ui::MenuItem item ){
 
 ui::MenuItem menu_separator( ui::Menu menu ){
        auto menu_item = ui::MenuItem(GTK_MENU_ITEM( gtk_menu_item_new() ));
-       container_add_widget( menu, menu_item );
+       menu.add(menu_item);
        gtk_widget_set_sensitive( GTK_WIDGET( menu_item ), FALSE );
        menu_item.show();
        return menu_item;
@@ -47,7 +47,7 @@ ui::MenuItem menu_separator( ui::Menu menu ){
 
 ui::TearoffMenuItem menu_tearoff( ui::Menu menu ){
        auto menu_item = ui::TearoffMenuItem(GTK_TEAROFF_MENU_ITEM( gtk_tearoff_menu_item_new() ));
-       container_add_widget( menu, menu_item );
+       menu.add(menu_item);
 // gtk_widget_set_sensitive(GTK_WIDGET(menu_item), FALSE); -- controls whether menu is detachable
        menu_item.show();
        return menu_item;
@@ -65,7 +65,7 @@ ui::MenuItem new_sub_menu_item_with_mnemonic( const char* mnemonic ){
 
 ui::Menu create_sub_menu_with_mnemonic( ui::MenuShell parent, const char* mnemonic ){
        auto item = new_sub_menu_item_with_mnemonic( mnemonic );
-       container_add_widget( parent, item );
+       parent.add(item);
        return ui::Menu(GTK_MENU( gtk_menu_item_get_submenu( item ) ));
 }
 
@@ -108,7 +108,7 @@ ui::MenuItem new_menu_item_with_mnemonic( const char *mnemonic, const Callback&
 
 ui::MenuItem create_menu_item_with_mnemonic( ui::Menu menu, const char *mnemonic, const Callback& callback ){
        auto item = new_menu_item_with_mnemonic( mnemonic, callback );
-       container_add_widget( menu, item );
+       menu.add(item);
        return item;
 }
 
@@ -121,7 +121,7 @@ ui::CheckMenuItem new_check_menu_item_with_mnemonic( const char* mnemonic, const
 
 ui::CheckMenuItem create_check_menu_item_with_mnemonic( ui::Menu menu, const char* mnemonic, const Callback& callback ){
        auto item = new_check_menu_item_with_mnemonic( mnemonic, callback );
-       container_add_widget( menu, item );
+       menu.add(item);
        return item;
 }
 
@@ -138,7 +138,7 @@ ui::RadioMenuItem new_radio_menu_item_with_mnemonic( GSList** group, const char*
 
 ui::RadioMenuItem create_radio_menu_item_with_mnemonic( ui::Menu menu, GSList** group, const char* mnemonic, const Callback& callback ){
        auto item = new_radio_menu_item_with_mnemonic( group, mnemonic, callback );
-       container_add_widget( menu, item );
+       menu.add(item);
        return item;
 }
 
index b064da6..69a46b6 100644 (file)
@@ -39,7 +39,7 @@ namespace ui {
 
     template<class T> _IMPL(T,);
 
-#define this verify<self>::test(*static_cast<self>(this))
+#define this (verify<self>::test(*static_cast<self>(this)))
 
     IMPL(Editable, GTK_EDITABLE);
 
@@ -97,6 +97,11 @@ namespace ui {
         gtk_container_add(this, widget);
     }
 
+    void IContainer::remove(Widget widget)
+    {
+        gtk_container_remove(this, widget);
+    }
+
     IMPL(Bin, GTK_BIN);
 
     IMPL(Window, GTK_WINDOW);
index 945f762..6ebb642 100644 (file)
@@ -223,6 +223,11 @@ namespace ui {
     WRAP(Container, Widget, _GtkContainer, (),
     ,
          void add(Widget widget);
+
+         void remove(Widget widget);
+
+         template<class Lambda>
+         void foreach(Lambda &&lambda);
     );
 
     WRAP(Bin, Container, _GtkBin, (),
@@ -497,6 +502,30 @@ namespace ui {
 
 #undef WRAP
 
+    // callbacks
+
+    namespace {
+        using GtkCallback = void (*)(_GtkWidget *, void *);
+        extern "C" {
+        void gtk_container_foreach(_GtkContainer *, GtkCallback, void *);
+        }
+    }
+
+#define this (*static_cast<self>(this))
+
+    template<class Lambda>
+    void IContainer::foreach(Lambda &&lambda)
+    {
+        GtkCallback cb = [](_GtkWidget *widget, void *data) -> void {
+            using Function = typename std::decay<Lambda>::type;
+            Function *f = static_cast<Function *>(data);
+            (*f)(Widget(widget));
+        };
+        gtk_container_foreach(this, cb, &lambda);
+    }
+
+#undef this
+
 }
 
 #endif
index b685552..f7bdc92 100644 (file)
@@ -93,7 +93,7 @@ void console_populate_popup( GtkTextView* textview, ui::Menu menu, gpointer user
        ui::Widget item(ui::MenuItem( "Clear" ));
        g_signal_connect( G_OBJECT( item ), "activate", G_CALLBACK( console_clear ), 0 );
        item.show();
-       container_add_widget( menu, item );
+       menu.add(item);
 }
 
 gboolean destroy_set_null( ui::Window widget, ui::Widget* p ){
index 23910a3..ff19806 100644 (file)
@@ -1107,7 +1107,7 @@ void visit( EntityClass* e ){
 void pushMenu( const CopiedString& name ){
        auto item = ui::MenuItem( name.c_str() );
        item.show();
-       container_add_widget( m_stack.back().first, item );
+       m_stack.back().first.add(item);
 
        auto submenu = ui::Menu();
        gtk_menu_item_set_submenu( item, GTK_WIDGET( submenu ) );