]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/build.cpp
GTK: wrap gtk_box_pack_start
[xonotic/netradiant.git] / radiant / build.cpp
index 073e0ddf12049b467afdb4b7b32a0cbec375e8b5..b76b5ec468669e94aeb8307d1c80f4b7ce84e43b 100644 (file)
@@ -22,6 +22,7 @@
 #include "build.h"
 #include "debugging/debugging.h"
 
+#include <gtk/gtk.h>
 #include <map>
 #include <list>
 #include "stream/stringstream.h"
@@ -55,6 +56,7 @@ const char* build_get_variable( const char* name ){
 class Evaluatable
 {
 public:
+virtual ~Evaluatable() = default;
 virtual void evaluate( StringBuffer& output ) = 0;
 virtual void exportXML( XMLImporter& importer ) = 0;
 };
@@ -171,6 +173,7 @@ void exportXML( XMLImporter& importer ){
 class XMLElementParser : public TextOutputStream
 {
 public:
+virtual ~XMLElementParser() = default;
 virtual XMLElementParser& pushElement( const XMLElement& element ) = 0;
 virtual void popElement( const char* name ) = 0;
 };
@@ -293,7 +296,7 @@ void popElement( const char* name ){
 };
 
 typedef std::pair<CopiedString, Build> BuildPair;
-#define SEPARATOR_STRING "-"
+const char *SEPARATOR_STRING = "-";
 static bool is_separator( const BuildPair &p ){
        if ( !string_equal( p.first.c_str(), SEPARATOR_STRING ) ) {
                return false;
@@ -633,44 +636,31 @@ void build_commands_write( const char* filename ){
 
 
 #include <gdk/gdkkeysyms.h>
-#include <gtk/gtkmain.h>
-#include <gtk/gtkbox.h>
-#include <gtk/gtktable.h>
-#include <gtk/gtktreeview.h>
-#include <gtk/gtkcellrenderertext.h>
-#include <gtk/gtktreeselection.h>
-#include <gtk/gtkliststore.h>
-#include <gtk/gtkscrolledwindow.h>
 
 #include "gtkutil/dialog.h"
 #include "gtkutil/closure.h"
 #include "gtkutil/window.h"
 #include "gtkdlgs.h"
 
-void Build_refreshMenu( GtkMenu* menu );
+void Build_refreshMenu( ui::Menu menu );
 
 
-void BSPCommandList_Construct( GtkListStore* store, Project& project ){
-       gtk_list_store_clear( store );
+void BSPCommandList_Construct( ui::ListStore store, Project& project ){
+       store.clear();
 
        for ( Project::iterator i = project.begin(); i != project.end(); ++i )
        {
-               const char* buildName = ( *i ).first.c_str();
-
-               GtkTreeIter buildIter;
-               gtk_list_store_append( store, &buildIter );
-               gtk_list_store_set( store, &buildIter, 0, const_cast<char*>( buildName ), -1 );
+               store.append(0, (*i).first.c_str());
        }
 
-       GtkTreeIter lastIter;
-       gtk_list_store_append( store, &lastIter );
+       store.append();
 }
 
 class ProjectList
 {
 public:
 Project& m_project;
-GtkListStore* m_store;
+ui::ListStore m_store{ui::null};
 bool m_changed;
 ProjectList( Project& project ) : m_project( project ), m_changed( false ){
 }
@@ -679,7 +669,7 @@ ProjectList( Project& project ) : m_project( project ), m_changed( false ){
 gboolean project_cell_edited( GtkCellRendererText* cell, gchar* path_string, gchar* new_text, ProjectList* projectList ){
        Project& project = projectList->m_project;
 
-       GtkTreePath* path = gtk_tree_path_new_from_string( path_string );
+       GtkTreePath* path = ui::TreePath( path_string );
 
        ASSERT_MESSAGE( gtk_tree_path_get_depth( path ) == 1, "invalid path length" );
 
@@ -704,8 +694,7 @@ gboolean project_cell_edited( GtkCellRendererText* cell, gchar* path_string, gch
                project.push_back( Project::value_type( new_text, Build() ) );
 
                gtk_list_store_set( projectList->m_store, &iter, 0, new_text, -1 );
-               GtkTreeIter lastIter;
-               gtk_list_store_append( projectList->m_store, &lastIter );
+               projectList->m_store.append();
        }
 
        gtk_tree_path_free( path );
@@ -715,10 +704,10 @@ gboolean project_cell_edited( GtkCellRendererText* cell, gchar* path_string, gch
        return FALSE;
 }
 
-gboolean project_key_press( GtkWidget* widget, GdkEventKey* event, ProjectList* projectList ){
+gboolean project_key_press( ui::Widget widget, GdkEventKey* event, ProjectList* projectList ){
        Project& project = projectList->m_project;
 
-       if ( event->keyval == GDK_Delete ) {
+       if ( event->keyval == GDK_KEY_Delete ) {
                GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( widget ) );
                GtkTreeIter iter;
                GtkTreeModel* model;
@@ -742,10 +731,10 @@ gboolean project_key_press( GtkWidget* widget, GdkEventKey* event, ProjectList*
 
 Build* g_current_build = 0;
 
-gboolean project_selection_changed( GtkTreeSelection* selection, GtkListStore* store ){
+gboolean project_selection_changed( GtkTreeSelection* selection, ui::ListStore store ){
        Project& project = g_build_project;
 
-       gtk_list_store_clear( store );
+       store.clear();
 
        GtkTreeIter iter;
        GtkTreeModel* model;
@@ -760,12 +749,9 @@ gboolean project_selection_changed( GtkTreeSelection* selection, GtkListStore* s
 
                        for ( Build::iterator i = build.begin(); i != build.end(); ++i )
                        {
-                               GtkTreeIter commandIter;
-                               gtk_list_store_append( store, &commandIter );
-                               gtk_list_store_set( store, &commandIter, 0, const_cast<char*>( ( *i ).c_str() ), -1 );
+                               store.append(0, (*i).c_str());
                        }
-                       GtkTreeIter lastIter;
-                       gtk_list_store_append( store, &lastIter );
+                       store.append();
                }
                else
                {
@@ -780,13 +766,13 @@ gboolean project_selection_changed( GtkTreeSelection* selection, GtkListStore* s
        return FALSE;
 }
 
-gboolean commands_cell_edited( GtkCellRendererText* cell, gchar* path_string, gchar* new_text, GtkListStore* store ){
+gboolean commands_cell_edited( GtkCellRendererText* cell, gchar* path_string, gchar* new_text, ui::ListStore store ){
        if ( g_current_build == 0 ) {
                return FALSE;
        }
        Build& build = *g_current_build;
 
-       GtkTreePath* path = gtk_tree_path_new_from_string( path_string );
+       GtkTreePath* path = ui::TreePath( path_string );
 
        ASSERT_MESSAGE( gtk_tree_path_get_depth( path ) == 1, "invalid path length" );
 
@@ -806,8 +792,7 @@ gboolean commands_cell_edited( GtkCellRendererText* cell, gchar* path_string, gc
 
                gtk_list_store_set( store, &iter, 0, new_text, -1 );
 
-               GtkTreeIter lastIter;
-               gtk_list_store_append( store, &lastIter );
+               store.append();
        }
 
        gtk_tree_path_free( path );
@@ -817,13 +802,13 @@ gboolean commands_cell_edited( GtkCellRendererText* cell, gchar* path_string, gc
        return FALSE;
 }
 
-gboolean commands_key_press( GtkWidget* widget, GdkEventKey* event, GtkListStore* store ){
+gboolean commands_key_press( ui::Widget widget, GdkEventKey* event, ui::ListStore store ){
        if ( g_current_build == 0 ) {
                return FALSE;
        }
        Build& build = *g_current_build;
 
-       if ( event->keyval == GDK_Delete ) {
+       if ( event->keyval == GDK_KEY_Delete ) {
                GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( widget ) );
                GtkTreeIter iter;
                GtkTreeModel* model;
@@ -844,99 +829,100 @@ gboolean commands_key_press( GtkWidget* widget, GdkEventKey* event, GtkListStore
 }
 
 
-GtkWindow* BuildMenuDialog_construct( ModalDialog& modal, ProjectList& projectList ){
-       GtkWindow* window = create_dialog_window( MainFrame_getWindow(), "Build Menu", G_CALLBACK( dialog_delete_callback ), &modal, -1, 400 );
+ui::Window BuildMenuDialog_construct( ModalDialog& modal, ProjectList& projectList ){
+       ui::Window window = MainFrame_getWindow().create_dialog_window("Build Menu", G_CALLBACK(dialog_delete_callback ), &modal, -1, 400 );
 
-       GtkWidget* buildView = 0;
+       ui::Widget buildView{ui::null};
 
        {
-               GtkTable* table1 = create_dialog_table( 2, 2, 4, 4, 4 );
-               gtk_container_add( GTK_CONTAINER( window ), GTK_WIDGET( table1 ) );
+               auto table1 = create_dialog_table( 2, 2, 4, 4, 4 );
+               window.add(table1);
                {
-                       GtkVBox* vbox = create_dialog_vbox( 4 );
+                       auto vbox = create_dialog_vbox( 4 );
                        gtk_table_attach( table1, GTK_WIDGET( vbox ), 1, 2, 0, 1,
                                                          (GtkAttachOptions) ( GTK_FILL ),
                                                          (GtkAttachOptions) ( GTK_FILL ), 0, 0 );
                        {
-                               GtkButton* button = create_dialog_button( "OK", G_CALLBACK( dialog_button_ok ), &modal );
-                               gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( button ), FALSE, FALSE, 0 );
+                               auto button = create_dialog_button( "OK", G_CALLBACK( dialog_button_ok ), &modal );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
                        }
                        {
-                               GtkButton* button = create_dialog_button( "Cancel", G_CALLBACK( dialog_button_cancel ), &modal );
-                               gtk_box_pack_start( GTK_BOX( vbox ), GTK_WIDGET( button ), FALSE, FALSE, 0 );
+                               auto button = create_dialog_button( "Cancel", G_CALLBACK( dialog_button_cancel ), &modal );
+                               vbox.pack_start( button, FALSE, FALSE, 0 );
                        }
                }
                {
-                       GtkFrame* frame = create_dialog_frame( "Build menu" );
+                       auto frame = create_dialog_frame( "Build menu" );
                        gtk_table_attach( table1, GTK_WIDGET( frame ), 0, 1, 0, 1,
                                                          (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
                                                          (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
                        {
-                               GtkScrolledWindow* scr = create_scrolled_window( GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC, 4 );
-                               gtk_container_add( GTK_CONTAINER( frame ), GTK_WIDGET( scr ) );
+                               auto scr = create_scrolled_window( ui::Policy::NEVER, ui::Policy::AUTOMATIC, 4 );
+                               frame.add(scr);
 
                                {
-                                       GtkListStore* store = gtk_list_store_new( 1, G_TYPE_STRING );
+                                       auto store = ui::ListStore(gtk_list_store_new( 1, G_TYPE_STRING ));
 
-                                       GtkWidget* view = gtk_tree_view_new_with_model( GTK_TREE_MODEL( store ) );
+                                       ui::Widget view = ui::TreeView( ui::TreeModel(GTK_TREE_MODEL( store ) ));
                                        gtk_tree_view_set_headers_visible( GTK_TREE_VIEW( view ), FALSE );
 
-                                       GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+                                       auto renderer = ui::CellRendererText(ui::New);
                                        object_set_boolean_property( G_OBJECT( renderer ), "editable", TRUE );
-                                       g_signal_connect( renderer, "edited", G_CALLBACK( project_cell_edited ), &projectList );
+                                       renderer.connect("edited", G_CALLBACK( project_cell_edited ), &projectList );
 
-                                       GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes( "", renderer, "text", 0, 0 );
+                                       GtkTreeViewColumn* column = ui::TreeViewColumn( "", renderer, {{"text", 0}} );
                                        gtk_tree_view_append_column( GTK_TREE_VIEW( view ), column );
 
                                        GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( view ) );
                                        gtk_tree_selection_set_mode( selection, GTK_SELECTION_BROWSE );
 
-                                       gtk_widget_show( view );
+                                       view.show();
 
                                        buildView = view;
                                        projectList.m_store = store;
-                                       gtk_container_add( GTK_CONTAINER( scr ), view );
+                                       scr.add(view);
 
-                                       g_signal_connect( G_OBJECT( view ), "key_press_event", G_CALLBACK( project_key_press ), &projectList );
+                                       view.connect( "key_press_event", G_CALLBACK( project_key_press ), &projectList );
 
-                                       g_object_unref( G_OBJECT( store ) );
+                                       store.unref();
                                }
                        }
                }
                {
-                       GtkFrame* frame = create_dialog_frame( "Commandline" );
+                       auto frame = create_dialog_frame( "Commandline" );
                        gtk_table_attach( table1, GTK_WIDGET( frame ), 0, 1, 1, 2,
                                                          (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ),
                                                          (GtkAttachOptions) ( GTK_EXPAND | GTK_FILL ), 0, 0 );
                        {
-                               GtkScrolledWindow* scr = create_scrolled_window( GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC, 4 );
-                               gtk_container_add( GTK_CONTAINER( frame ), GTK_WIDGET( scr ) );
+                               auto scr = create_scrolled_window( ui::Policy::NEVER, ui::Policy::AUTOMATIC, 4 );
+                               frame.add(scr);
 
                                {
-                                       GtkListStore* store = gtk_list_store_new( 1, G_TYPE_STRING );
+                                       ui::ListStore store = ui::ListStore(gtk_list_store_new( 1, G_TYPE_STRING ));
 
-                                       GtkWidget* view = gtk_tree_view_new_with_model( GTK_TREE_MODEL( store ) );
+                                       ui::Widget view = ui::TreeView(ui::TreeModel( GTK_TREE_MODEL( store ) ));
                                        gtk_tree_view_set_headers_visible( GTK_TREE_VIEW( view ), FALSE );
 
-                                       GtkCellRenderer* renderer = gtk_cell_renderer_text_new();
+                                       auto renderer = ui::CellRendererText(ui::New);
                                        object_set_boolean_property( G_OBJECT( renderer ), "editable", TRUE );
-                                       g_signal_connect( renderer, "edited", G_CALLBACK( commands_cell_edited ), store );
+                                       renderer.connect( "edited", G_CALLBACK( commands_cell_edited ), store );
 
-                                       GtkTreeViewColumn* column = gtk_tree_view_column_new_with_attributes( "", renderer, "text", 0, 0 );
+                                       GtkTreeViewColumn* column = ui::TreeViewColumn( "", renderer, {{"text", 0}} );
                                        gtk_tree_view_append_column( GTK_TREE_VIEW( view ), column );
 
                                        GtkTreeSelection* selection = gtk_tree_view_get_selection( GTK_TREE_VIEW( view ) );
                                        gtk_tree_selection_set_mode( selection, GTK_SELECTION_BROWSE );
 
-                                       gtk_widget_show( view );
+                                       view.show();
 
-                                       gtk_container_add( GTK_CONTAINER( scr ), view );
+                                       scr.add(view);
 
-                                       g_object_unref( G_OBJECT( store ) );
+                                       store.unref();
 
-                                       g_signal_connect( G_OBJECT( view ), "key_press_event", G_CALLBACK( commands_key_press ), store );
+                                       view.connect( "key_press_event", G_CALLBACK( commands_key_press ), store );
 
-                                       g_signal_connect( G_OBJECT( gtk_tree_view_get_selection( GTK_TREE_VIEW( buildView ) ) ), "changed", G_CALLBACK( project_selection_changed ), store );
+                                       auto sel = ui::TreeSelection(gtk_tree_view_get_selection( GTK_TREE_VIEW( buildView ) ));
+                                       sel.connect( "changed", G_CALLBACK( project_selection_changed ), store );
                                }
                        }
                }
@@ -959,7 +945,7 @@ void DoBuildMenu(){
 
        ProjectList projectList( g_build_project );
 
-       GtkWindow* window = BuildMenuDialog_construct( modal, projectList );
+       ui::Window window = BuildMenuDialog_construct( modal, projectList );
 
        if ( modal_dialog_show( window, modal ) == eIDCANCEL ) {
                build_commands_clear();
@@ -971,7 +957,7 @@ void DoBuildMenu(){
                g_build_changed = true;
        }
 
-       gtk_widget_destroy( GTK_WIDGET( window ) );
+       window.destroy();
 }
 
 
@@ -981,8 +967,6 @@ void DoBuildMenu(){
 #include "preferences.h"
 #include "qe3.h"
 
-typedef struct _GtkMenuItem GtkMenuItem;
-
 class BuildMenuItem
 {
 const char* m_name;
@@ -1001,9 +985,9 @@ typedef std::list<BuildMenuItem> BuildMenuItems;
 BuildMenuItems g_BuildMenuItems;
 
 
-GtkMenu* g_bsp_menu;
+ui::Menu g_bsp_menu{ui::null};
 
-void Build_constructMenu( GtkMenu* menu ){
+void Build_constructMenu( ui::Menu menu ){
        for ( Project::iterator i = g_build_project.begin(); i != g_build_project.end(); ++i )
        {
                g_BuildMenuItems.push_back( BuildMenuItem( ( *i ).first.c_str(), 0 ) );
@@ -1018,10 +1002,10 @@ void Build_constructMenu( GtkMenu* menu ){
 }
 
 
-void Build_refreshMenu( GtkMenu* menu ){
+void Build_refreshMenu( ui::Menu menu ){
        for ( BuildMenuItems::iterator i = g_BuildMenuItems.begin(); i != g_BuildMenuItems.end(); ++i )
        {
-               gtk_container_remove( GTK_CONTAINER( menu ), GTK_WIDGET( ( *i ).m_item ) );
+               menu.remove(ui::Widget(GTK_WIDGET((*i).m_item)));
        }
 
        g_BuildMenuItems.clear();