]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/entityinspector.cpp
Merge commit '6592d65469e5386216a692ba3b5d6e7cc590c617' into garux-merge
[xonotic/netradiant.git] / radiant / entityinspector.cpp
index 852b763929d5ec57929a4739c92ec6a5d425c569..1864e7c8d72231052d3e2fba71a156b11b31911b 100644 (file)
@@ -660,7 +660,7 @@ const ListAttributeType& m_type;
 public:
 ListAttribute( const char* key, const ListAttributeType& type ) :
        m_key( key ),
-       m_combo( 0 ),
+       m_combo( ui::null ),
        m_nonModal( ApplyCaller( *this ) ),
        m_type( type ){
        auto combo = ui::ComboBoxText(ui::New);
@@ -703,8 +703,10 @@ typedef MemberCaller<ListAttribute, void(), &ListAttribute::update> UpdateCaller
 
 namespace
 {
+GtkWidget* g_entity_split0 = 0;
 ui::Widget g_entity_split1{ui::null};
 ui::Widget g_entity_split2{ui::null};
+int g_entitysplit0_position;
 int g_entitysplit1_position;
 int g_entitysplit2_position;
 
@@ -858,12 +860,12 @@ void SurfaceFlags_setEntityClass( EntityClass* eclass ){
        {
                for ( int i = 0; i < g_spawnflag_count; ++i )
                {
-                       auto widget = ui::CheckButton(g_entitySpawnflagsCheck[i]);
-                       auto label = ui::Label(GTK_LABEL(gtk_bin_get_child(GTK_BIN(widget))));
+                       auto widget = ui::CheckButton::from(g_entitySpawnflagsCheck[i]);
+                       auto label = ui::Label::from(gtk_bin_get_child(GTK_BIN(widget)));
                        label.text(" ");
                        widget.hide();
                        widget.ref();
-                       ui::Container(GTK_CONTAINER(g_spawnflagsTable)).remove(widget);
+                       g_spawnflagsTable.remove(widget);
                }
        }
 
@@ -872,7 +874,7 @@ void SurfaceFlags_setEntityClass( EntityClass* eclass ){
        {
                for (unsigned int i = 0; (int) i < g_spawnflag_count; ++i)
                {
-                       auto widget = ui::CheckButton(g_entitySpawnflagsCheck[i] );
+                       auto widget = ui::CheckButton::from(g_entitySpawnflagsCheck[i] );
                        widget.show();
 
                        StringOutputStream str( 16 );
@@ -881,7 +883,7 @@ void SurfaceFlags_setEntityClass( EntityClass* eclass ){
                        g_spawnflagsTable.attach(widget, {i % 4, i % 4 + 1, i / 4, i / 4 + 1}, {GTK_FILL, GTK_FILL});
                        widget.unref();
 
-                       auto label = ui::Label(GTK_LABEL(gtk_bin_get_child(GTK_BIN(widget)) ));
+                       auto label = ui::Label::from(gtk_bin_get_child(GTK_BIN(widget)) );
                        label.text(str.c_str());
                }
        }
@@ -987,14 +989,14 @@ void EntityInspector_updateSpawnflags(){
                {
                        int v = !!( f & ( 1 << spawn_table[i] ) );
 
-                       toggle_button_set_active_no_signal( ui::ToggleButton(GTK_TOGGLE_BUTTON( g_entitySpawnflagsCheck[i] )), v );
+                       toggle_button_set_active_no_signal( ui::ToggleButton::from( g_entitySpawnflagsCheck[i] ), v );
                }
        }
        {
                // take care of the remaining ones
                for ( int i = g_spawnflag_count; i < MAX_FLAGS; ++i )
                {
-                       toggle_button_set_active_no_signal( ui::ToggleButton(GTK_TOGGLE_BUTTON( g_entitySpawnflagsCheck[i] )), FALSE );
+                       toggle_button_set_active_no_signal( ui::ToggleButton::from( g_entitySpawnflagsCheck[i] ), FALSE );
                }
        }
 }
@@ -1063,7 +1065,7 @@ class EntityInspectorDraw
 {
 IdleDraw m_idleDraw;
 public:
-EntityInspectorDraw() : m_idleDraw( FreeCaller<void(), EntityInspector_updateKeyValues>( ) ){
+EntityInspectorDraw() : m_idleDraw( makeCallbackF(EntityInspector_updateKeyValues) ){
 }
 void queueDraw(){
        m_idleDraw.queueDraw();
@@ -1089,7 +1091,7 @@ void EntityClassList_createEntity(){
        GtkTreeModel* model;
        GtkTreeIter iter;
        if ( gtk_tree_selection_get_selected( gtk_tree_view_get_selection( g_entityClassList ), &model, &iter ) == FALSE ) {
-               view.window().alert( "You must have a selected class to create an entity", "info" );
+               ui::alert( view.window(), "You must have a selected class to create an entity", "info" );
                return;
        }
 
@@ -1117,14 +1119,14 @@ void EntityInspector_applyKeyValue(){
 
        // TTimo: if you change the classname to worldspawn you won't merge back in the structural brushes but create a parasite entity
        if ( !strcmp( key.c_str(), "classname" ) && !strcmp( value.c_str(), "worldspawn" ) ) {
-               g_entityKeyEntry.window().alert( "Cannot change \"classname\" key back to worldspawn.", 0, ui::alert_type::OK );
+               ui::alert( g_entityKeyEntry.window(), "Cannot change \"classname\" key back to worldspawn.", 0, ui::alert_type::OK );
                return;
        }
 
 
        // RR2DO2: we don't want spaces in entity keys
        if ( strstr( key.c_str(), " " ) ) {
-               g_entityKeyEntry.window().alert( "No spaces are allowed in entity keys.", 0, ui::alert_type::OK );
+               ui::alert( g_entityKeyEntry.window(), "No spaces are allowed in entity keys.", 0, ui::alert_type::OK );
                return;
        }
 
@@ -1153,6 +1155,23 @@ void EntityInspector_clearKeyValue(){
        }
 }
 
+static gint EntityInspector_clearKeyValueKB( GtkEntry* widget, GdkEventKey* event, gpointer data ){
+       if ( event->keyval == GDK_Delete ) {
+               // Get current selection text
+               StringOutputStream key( 64 );
+               key << gtk_entry_get_text( g_entityKeyEntry );
+
+               if ( strcmp( key.c_str(), "classname" ) != 0 ) {
+                       StringOutputStream command;
+                       command << "entityDeleteKey -key " << key.c_str();
+                       UndoableCommand undo( command.c_str() );
+                       Scene_EntitySetKeyValue_Selected( key.c_str(), "" );
+               }
+               return TRUE;
+       }
+       return FALSE;
+}
+
 void EntityInspector_clearAllKeyValues(){
        UndoableCommand undo( "entityClear" );
 
@@ -1268,8 +1287,18 @@ static gint EntityEntry_keypress( ui::Entry widget, GdkEventKey* event, gpointer
                }
                return TRUE;
        }
-       if ( event->keyval == GDK_KEY_Escape ) {
-               gtk_window_set_focus( widget.window(), NULL );
+       if ( event->keyval == GDK_Tab ) {
+               if ( widget._handle == g_entityKeyEntry._handle ) {
+                       gtk_window_set_focus( widget.window(), g_entityValueEntry );
+               }
+               else
+               {
+                       gtk_window_set_focus( widget.window(), g_entityKeyEntry );
+               }
+               return TRUE;
+       }
+       if ( event->keyval == GDK_Escape ) {
+               // gtk_window_set_focus( widget.window(), NULL );
                return TRUE;
        }
 
@@ -1277,18 +1306,33 @@ static gint EntityEntry_keypress( ui::Entry widget, GdkEventKey* event, gpointer
 }
 
 void EntityInspector_destroyWindow( ui::Widget widget, gpointer data ){
+       g_entitysplit0_position = gtk_paned_get_position( GTK_PANED( g_entity_split0 ) );
        g_entitysplit1_position = gtk_paned_get_position( GTK_PANED( g_entity_split1 ) );
        g_entitysplit2_position = gtk_paned_get_position( GTK_PANED( g_entity_split2 ) );
-
        g_entityInspector_windowConstructed = false;
        GlobalEntityAttributes_clear();
 }
 
+static gint EntityInspector_hideWindowKB( GtkWidget* widget, GdkEventKey* event, gpointer data ){
+       //if ( event->keyval == GDK_Escape && GTK_WIDGET_VISIBLE( GTK_WIDGET( widget ) ) ) {
+       if ( event->keyval == GDK_Escape  ) {
+               //GroupDialog_showPage( g_page_entity );
+               gtk_widget_hide( GTK_WIDGET( GroupDialog_getWindow() ) );
+               return TRUE;
+       }
+       if ( event->keyval == GDK_Tab  ) {
+               gtk_window_set_focus( GTK_WINDOW( gtk_widget_get_toplevel( GTK_WIDGET( widget ) ) ), GTK_WIDGET( g_entityKeyEntry ) );
+               return TRUE;
+       }
+       return FALSE;
+}
+
 ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
     auto vbox = ui::VBox( FALSE, 2 );
        vbox.show();
        gtk_container_set_border_width( GTK_CONTAINER( vbox ), 2 );
 
+       g_signal_connect( G_OBJECT( toplevel ), "key_press_event", G_CALLBACK( EntityInspector_hideWindowKB ), 0 );
        vbox.connect( "destroy", G_CALLBACK( EntityInspector_destroyWindow ), 0 );
 
        {
@@ -1300,7 +1344,8 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
 
                {
                        ui::Widget split2 = ui::VPaned(ui::New);
-                       gtk_paned_add1( GTK_PANED( split1 ), split2 );
+                       //gtk_paned_add1( GTK_PANED( split1 ), split2 );
+                       gtk_paned_pack1( GTK_PANED( split1 ), split2, FALSE, FALSE );
                        split2.show();
 
                        g_entity_split2 = split2;
@@ -1309,14 +1354,15 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
                                // class list
                                auto scr = ui::ScrolledWindow(ui::New);
                                scr.show();
-                               gtk_paned_add1( GTK_PANED( split2 ), scr );
+                               //gtk_paned_add1( GTK_PANED( split2 ), scr );
+                               gtk_paned_pack1( GTK_PANED( split2 ), scr, FALSE, FALSE );
                                gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scr ), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS );
                                gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
 
                                {
-                                       ui::ListStore store = ui::ListStore(gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_POINTER ));
+                                       ui::ListStore store = ui::ListStore::from(gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_POINTER ));
 
-                                       auto view = ui::TreeView( ui::TreeModel(store ));
+                                       auto view = ui::TreeView( ui::TreeModel::from( store._handle ));
                                        gtk_tree_view_set_enable_search(view, FALSE );
                                        gtk_tree_view_set_headers_visible( view, FALSE );
                                        view.connect( "button_press_event", G_CALLBACK( EntityClassList_button_press ), 0 );
@@ -1329,7 +1375,7 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
                                        }
 
                                        {
-                                               auto selection = ui::TreeSelection(gtk_tree_view_get_selection( view ));
+                                               auto selection = ui::TreeSelection::from(gtk_tree_view_get_selection( view ));
                                                selection.connect( "changed", G_CALLBACK( EntityClassList_selection_changed ), 0 );
                                        }
 
@@ -1346,7 +1392,8 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
                        {
                                auto scr = ui::ScrolledWindow(ui::New);
                                scr.show();
-                               gtk_paned_add2( GTK_PANED( split2 ), scr );
+                               //gtk_paned_add2( GTK_PANED( split2 ), scr );
+                               gtk_paned_pack2( GTK_PANED( split2 ), scr, FALSE, FALSE );
                                gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scr ), GTK_POLICY_NEVER, GTK_POLICY_ALWAYS );
                                gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
 
@@ -1363,14 +1410,16 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
                }
 
                {
-                       ui::Widget split2 = ui::VPaned(ui::New);
-                       gtk_paned_add2( GTK_PANED( split1 ), split2 );
-                       split2.show();
+                       ui::Widget split0 = ui::VPaned(ui::New);
+                       //gtk_paned_add2( GTK_PANED( split1 ), split0 );
+                       gtk_paned_pack2( GTK_PANED( split1 ), split0, FALSE, FALSE );
+                       split0.show();
+                       g_entity_split0 = split0;
 
                        {
                 auto vbox2 = ui::VBox( FALSE, 2 );
                                vbox2.show();
-                               gtk_paned_pack1( GTK_PANED( split2 ), vbox2, FALSE, FALSE );
+                               gtk_paned_pack1( GTK_PANED( split0 ), vbox2, FALSE, FALSE );
 
                                {
                                        // Spawnflags (4 colums wide max, or window gets too wide.)
@@ -1398,11 +1447,12 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
                                        gtk_scrolled_window_set_shadow_type( GTK_SCROLLED_WINDOW( scr ), GTK_SHADOW_IN );
 
                                        {
-                                               ui::ListStore store = ui::ListStore(gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_STRING ));
+                                               ui::ListStore store = ui::ListStore::from(gtk_list_store_new( 2, G_TYPE_STRING, G_TYPE_STRING ));
 
-                                               auto view = ui::TreeView(ui::TreeModel(store ));
+                                               auto view = ui::TreeView(ui::TreeModel::from(store._handle));
                                                gtk_tree_view_set_enable_search(view, FALSE );
                                                gtk_tree_view_set_headers_visible(view, FALSE );
+                                               g_signal_connect( G_OBJECT( view ), "key_press_event", G_CALLBACK( EntityInspector_clearKeyValueKB ), 0 );
 
                                                {
                                                        auto renderer = ui::CellRendererText(ui::New);
@@ -1417,7 +1467,7 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
                                                }
 
                                                {
-                                                       auto selection = ui::TreeSelection(gtk_tree_view_get_selection(view ));
+                                                       auto selection = ui::TreeSelection::from(gtk_tree_view_get_selection(view));
                                                        selection.connect( "changed", G_CALLBACK( EntityProperties_selection_changed ), 0 );
                                                }
 
@@ -1497,7 +1547,7 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
                                scr.show();
                                gtk_scrolled_window_set_policy( GTK_SCROLLED_WINDOW( scr ), GTK_POLICY_NEVER, GTK_POLICY_AUTOMATIC );
 
-                               auto viewport = ui::Container(GTK_CONTAINER(gtk_viewport_new( 0, 0 )));
+                               auto viewport = ui::Container::from(gtk_viewport_new( 0, 0 ));
                                viewport.show();
                                gtk_viewport_set_shadow_type( GTK_VIEWPORT( viewport ), GTK_SHADOW_NONE );
 
@@ -1506,27 +1556,23 @@ ui::Widget EntityInspector_constructWindow( ui::Window toplevel ){
 
                                viewport.add(g_attributeBox);
                                scr.add(viewport);
-                               gtk_paned_pack2( GTK_PANED( split2 ), scr, FALSE, FALSE );
+                               gtk_paned_pack2( GTK_PANED( split0 ), scr, FALSE, FALSE );
                        }
                }
        }
 
 
        {
-               // show the sliders in any case
-               if ( g_entitysplit2_position > 22 ) {
-                       gtk_paned_set_position( GTK_PANED( g_entity_split2 ), g_entitysplit2_position );
-               }
-               else {
+               // show the sliders in any case //no need, gtk can care
+               /*if ( g_entitysplit2_position < 22 ) {
                        g_entitysplit2_position = 22;
-                       gtk_paned_set_position( GTK_PANED( g_entity_split2 ), 22 );
-               }
-               if ( ( g_entitysplit1_position - g_entitysplit2_position ) > 27 ) {
-                       gtk_paned_set_position( GTK_PANED( g_entity_split1 ), g_entitysplit1_position );
-               }
-               else {
-                       gtk_paned_set_position( GTK_PANED( g_entity_split1 ), g_entitysplit2_position + 27 );
-               }
+               }*/
+               gtk_paned_set_position( GTK_PANED( g_entity_split2 ), g_entitysplit2_position );
+               /*if ( ( g_entitysplit1_position - g_entitysplit2_position ) < 27 ) {
+                       g_entitysplit1_position = g_entitysplit2_position + 27;
+               }*/
+               gtk_paned_set_position( GTK_PANED( g_entity_split1 ), g_entitysplit1_position );
+               gtk_paned_set_position( GTK_PANED( g_entity_split0 ), g_entitysplit0_position );
        }
 
        g_entityInspector_windowConstructed = true;
@@ -1574,8 +1620,9 @@ EntityInspector g_EntityInspector;
 void EntityInspector_construct(){
        GlobalEntityClassManager().attach( g_EntityInspector );
 
-       GlobalPreferenceSystem().registerPreference( "EntitySplit1", IntImportStringCaller( g_entitysplit1_position ), IntExportStringCaller( g_entitysplit1_position ) );
-       GlobalPreferenceSystem().registerPreference( "EntitySplit2", IntImportStringCaller( g_entitysplit2_position ), IntExportStringCaller( g_entitysplit2_position ) );
+       GlobalPreferenceSystem().registerPreference( "EntitySplit0", IntImportStringCaller( g_entitysplit0_position ), IntExportStringCaller( g_entitysplit0_position ) );
+       GlobalPreferenceSystem().registerPreference( "EntitySplit1", make_property_string( g_entitysplit1_position ) );
+       GlobalPreferenceSystem().registerPreference( "EntitySplit2", make_property_string( g_entitysplit2_position ) );
 
 }