]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - radiant/select.cpp
Merge commit 'c845c5cd8f427d39665d6a8b1f6eeff401370d80' into garux-merge
[xonotic/netradiant.git] / radiant / select.cpp
index 1e4a4170ef3fe6cce056b3bc0b975e6f96d5691c..22d0a963fc21269e6b09e988bfb3ac6f6eac6bb1 100644 (file)
@@ -321,6 +321,57 @@ void Select_Invert(){
        Scene_Invert_Selection( GlobalSceneGraph() );
 }
 
+//interesting printings
+class ExpandSelectionToEntitiesWalker_dbg : public scene::Graph::Walker
+{
+mutable std::size_t m_depth;
+NodeSmartReference worldspawn;
+public:
+ExpandSelectionToEntitiesWalker_dbg() : m_depth( 0 ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
+}
+bool pre( const scene::Path& path, scene::Instance& instance ) const {
+       ++m_depth;
+       globalOutputStream() << "pre depth_" << m_depth;
+       globalOutputStream() << " path.size()_" << path.size();
+       if ( path.top().get() == worldspawn )
+               globalOutputStream() << " worldspawn";
+       if( path.top().get().isRoot() )
+               globalOutputStream() << " path.top().get().isRoot()";
+       Entity* entity = Node_getEntity( path.top() );
+       if ( entity != 0 ){
+               globalOutputStream() << " entity!=0";
+               if( entity->isContainer() ){
+                       globalOutputStream() << " entity->isContainer()";
+               }
+               globalOutputStream() << " classname_" << entity->getKeyValue( "classname" );
+       }
+       globalOutputStream() << "\n";
+//     globalOutputStream() << "" <<  ;
+//     globalOutputStream() << "" <<  ;
+//     globalOutputStream() << "" <<  ;
+//     globalOutputStream() << "" <<  ;
+       return true;
+}
+void post( const scene::Path& path, scene::Instance& instance ) const {
+       globalOutputStream() << "post depth_" << m_depth;
+       globalOutputStream() << " path.size()_" << path.size();
+       if ( path.top().get() == worldspawn )
+               globalOutputStream() << " worldspawn";
+       if( path.top().get().isRoot() )
+               globalOutputStream() << " path.top().get().isRoot()";
+       Entity* entity = Node_getEntity( path.top() );
+       if ( entity != 0 ){
+               globalOutputStream() << " entity!=0";
+               if( entity->isContainer() ){
+                       globalOutputStream() << " entity->isContainer()";
+               }
+               globalOutputStream() << " classname_" << entity->getKeyValue( "classname" );
+       }
+       globalOutputStream() << "\n";
+       --m_depth;
+}
+};
+
 class ExpandSelectionToEntitiesWalker : public scene::Graph::Walker
 {
 mutable std::size_t m_depth;
@@ -332,17 +383,21 @@ bool pre( const scene::Path& path, scene::Instance& instance ) const {
        ++m_depth;
 
        // ignore worldspawn
-       NodeSmartReference me( path.top().get() );
-       if ( me == worldspawn ) {
-               return false;
-       }
+//     NodeSmartReference me( path.top().get() );
+//     if ( me == worldspawn ) {
+//             return false;
+//     }
 
        if ( m_depth == 2 ) { // entity depth
                // traverse and select children if any one is selected
+               bool beselected = false;
                if ( instance.childSelected() ) {
-                       Instance_setSelected( instance, true );
+                       beselected = true;
+                       if( path.top().get() != worldspawn ){
+                               Instance_setSelected( instance, true );
+                       }
                }
-               return Node_getEntity( path.top() )->isContainer() && instance.isSelected();
+               return Node_getEntity( path.top() )->isContainer() && beselected;
        }
        else if ( m_depth == 3 ) { // primitive depth
                Instance_setSelected( instance, true );
@@ -524,20 +579,20 @@ inline Quaternion quaternion_for_axis90( axis_t axis, sign_t sign ){
 
 void Select_RotateAxis( int axis, float deg ){
        if ( fabs( deg ) == 90.f ) {
-               GlobalSelectionSystem().rotateSelected( quaternion_for_axis90( (axis_t)axis, ( deg > 0 ) ? eSignPositive : eSignNegative ) );
+               GlobalSelectionSystem().rotateSelected( quaternion_for_axis90( (axis_t)axis, ( deg > 0 ) ? eSignPositive : eSignNegative ), true );
        }
        else
        {
                switch ( axis )
                {
                case 0:
-                       GlobalSelectionSystem().rotateSelected( quaternion_for_matrix4_rotation( matrix4_rotation_for_x_degrees( deg ) ) );
+                       GlobalSelectionSystem().rotateSelected( quaternion_for_matrix4_rotation( matrix4_rotation_for_x_degrees( deg ) ), false );
                        break;
                case 1:
-                       GlobalSelectionSystem().rotateSelected( quaternion_for_matrix4_rotation( matrix4_rotation_for_y_degrees( deg ) ) );
+                       GlobalSelectionSystem().rotateSelected( quaternion_for_matrix4_rotation( matrix4_rotation_for_y_degrees( deg ) ), false );
                        break;
                case 2:
-                       GlobalSelectionSystem().rotateSelected( quaternion_for_matrix4_rotation( matrix4_rotation_for_z_degrees( deg ) ) );
+                       GlobalSelectionSystem().rotateSelected( quaternion_for_matrix4_rotation( matrix4_rotation_for_z_degrees( deg ) ), false );
                        break;
                }
        }
@@ -615,18 +670,32 @@ class EntityFindByPropertyValueWalker : public scene::Graph::Walker
 {
 const PropertyValues& m_propertyvalues;
 const char *m_prop;
+const NodeSmartReference worldspawn;
 public:
 EntityFindByPropertyValueWalker( const char *prop, const PropertyValues& propertyvalues )
-       : m_propertyvalues( propertyvalues ), m_prop( prop ){
+       : m_propertyvalues( propertyvalues ), m_prop( prop ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
 }
 bool pre( const scene::Path& path, scene::Instance& instance ) const {
        if( !path.top().get().visible() ){
                return false;
        }
+       // ignore worldspawn
+       if ( path.top().get() == worldspawn ) {
+               return false;
+       }
+
        Entity* entity = Node_getEntity( path.top() );
-       if ( entity != 0
-                && propertyvalues_contain( m_propertyvalues, entity->getKeyValue( m_prop ) ) ) {
-               Instance_getSelectable( instance )->setSelected( true );
+       if ( entity != 0 ){
+               if( propertyvalues_contain( m_propertyvalues, entity->getKeyValue( m_prop ) ) ) {
+                       Instance_getSelectable( instance )->setSelected( true );
+                       return true;
+               }
+               return false;
+       }
+       else if( path.size() > 2 && !path.top().get().isRoot() ){
+               Selectable* selectable = Instance_getSelectable( instance );
+               if( selectable != 0 )
+                       selectable->setSelected( true );
        }
        return true;
 }
@@ -640,9 +709,37 @@ class EntityGetSelectedPropertyValuesWalker : public scene::Graph::Walker
 {
 PropertyValues& m_propertyvalues;
 const char *m_prop;
+const NodeSmartReference worldspawn;
 public:
 EntityGetSelectedPropertyValuesWalker( const char *prop, PropertyValues& propertyvalues )
-       : m_propertyvalues( propertyvalues ), m_prop( prop ){
+       : m_propertyvalues( propertyvalues ), m_prop( prop ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
+}
+bool pre( const scene::Path& path, scene::Instance& instance ) const {
+       Entity* entity = Node_getEntity( path.top() );
+       if ( entity != 0 ){
+               if( path.top().get() != worldspawn ){
+                       Selectable* selectable = Instance_getSelectable( instance );
+                       if ( ( selectable != 0 && selectable->isSelected() ) || instance.childSelected() ) {
+                               if ( !propertyvalues_contain( m_propertyvalues, entity->getKeyValue( m_prop ) ) ) {
+                                       m_propertyvalues.push_back( entity->getKeyValue( m_prop ) );
+                               }
+                       }
+               }
+               return false;
+       }
+       return true;
+}
+};
+/*
+class EntityGetSelectedPropertyValuesWalker : public scene::Graph::Walker
+{
+PropertyValues& m_propertyvalues;
+const char *m_prop;
+mutable bool m_selected_children;
+const NodeSmartReference worldspawn;
+public:
+EntityGetSelectedPropertyValuesWalker( const char *prop, PropertyValues& propertyvalues )
+       : m_propertyvalues( propertyvalues ), m_prop( prop ), m_selected_children( false ), worldspawn( Map_FindOrInsertWorldspawn( g_map ) ){
 }
 bool pre( const scene::Path& path, scene::Instance& instance ) const {
        Selectable* selectable = Instance_getSelectable( instance );
@@ -653,12 +750,27 @@ bool pre( const scene::Path& path, scene::Instance& instance ) const {
                        if ( !propertyvalues_contain( m_propertyvalues, entity->getKeyValue( m_prop ) ) ) {
                                m_propertyvalues.push_back( entity->getKeyValue( m_prop ) );
                        }
+                       return false;
+               }
+               else{
+                       m_selected_children = true;
                }
        }
        return true;
 }
+void post( const scene::Path& path, scene::Instance& instance ) const {
+       Entity* entity = Node_getEntity( path.top() );
+       if( entity != 0 && m_selected_children ){
+               m_selected_children = false;
+               if( path.top().get() == worldspawn )
+                       return;
+               if ( !propertyvalues_contain( m_propertyvalues, entity->getKeyValue( m_prop ) ) ) {
+                       m_propertyvalues.push_back( entity->getKeyValue( m_prop ) );
+               }
+       }
+}
 };
-
+*/
 void Scene_EntityGetPropertyValues( scene::Graph& graph, const char *prop, PropertyValues& propertyvalues ){
        graph.traverse( EntityGetSelectedPropertyValuesWalker( prop, propertyvalues ) );
 }
@@ -993,7 +1105,7 @@ static gboolean rotatedlg_apply( ui::Widget widget, RotateDialog* rotateDialog )
        command << "rotateSelectedEulerXYZ -x " << eulerXYZ[0] << " -y " << eulerXYZ[1] << " -z " << eulerXYZ[2];
        UndoableCommand undo( command.c_str() );
 
-       GlobalSelectionSystem().rotateSelected( quaternion_for_euler_xyz_degrees( eulerXYZ ) );
+       GlobalSelectionSystem().rotateSelected( quaternion_for_euler_xyz_degrees( eulerXYZ ), false );
        return TRUE;
 }