← Back to team overview

kicad-developers team mailing list archive

Re: Undo stack limit?

 

Fixed, patch attached.

On Wed, Aug 05, 2015 at 06:46:43PM +0200, jp charras wrote:
> Le 05/08/2015 16:29, Wayne Stambaugh a écrit :
> > Patch committed in product branch r6053.  Thanks.
> > 
> > On 8/4/2015 5:32 PM, Chris Pavlina wrote:
> >> In any case, here's the patch to make undo configurable. I can edit it 
> >> to change the default if you like.
> 
> Thanks, Chris.
> 
> I just tested this feature.
> It looks good but I noticed a minor and strange issue (only tested on
> Windows currently):
> 
> the undo level value seems not (or incorrectly) read from config for the
> schematic editor only.
> After closing the schematic editor and re-run it, the undo level
> selection is always 0 (regardless the previous setting) if it is run
> from kicad manager
> However, if Eeschema is run in stand alone mode, after closing Eeschema
> and re-run it, the undo level selection is good (is is the last saved value)
> I am thinking this is a read config issue when eeschema is run from
> kicad manager.
> (Because if I run eeschema from kicad manager and set the undo stack to
> 3 and close kicad, if I run eeschema in stand alone, the undo stack is 3
> (as expected), but if I run eeschema from kicad manager, the undo stack
> is 0)
> 
> No problem for other editors.
> 
> 
> 
> -- 
> Jean-Pierre CHARRAS
> 
> _______________________________________________
> Mailing list: https://launchpad.net/~kicad-developers
> Post to     : kicad-developers@xxxxxxxxxxxxxxxxxxx
> Unsubscribe : https://launchpad.net/~kicad-developers
> More help   : https://help.launchpad.net/ListHelp
commit d66ccb3a3e6846368696460e38991d716c70ce30
Author: Chris Pavlina <cpavlin1@xxxxxxxxxxxxxx>
Date:   Wed Aug 5 16:07:23 2015 -0400

    Fix loading of undo settings

diff --git a/common/draw_frame.cpp b/common/draw_frame.cpp
index fcffdc9..1b5d3ad 100644
--- a/common/draw_frame.cpp
+++ b/common/draw_frame.cpp
@@ -676,8 +676,8 @@ void EDA_DRAW_FRAME::LoadSettings( wxConfigBase* aCfg )
     if( m_LastGridSizeId < 0 )
         m_LastGridSizeId = 0;
 
-    GetScreen()->SetMaxUndoItems( aCfg->Read( baseCfgName + MaxUndoItemsEntry,
-                long( DEFAULT_MAX_UNDO_ITEMS ) ) );
+    m_UndoRedoCountMax = aCfg->Read( baseCfgName + MaxUndoItemsEntry,
+            long( DEFAULT_MAX_UNDO_ITEMS ) );
 }
 
 
diff --git a/eeschema/files-io.cpp b/eeschema/files-io.cpp
index b4135fd..c898c38 100644
--- a/eeschema/files-io.cpp
+++ b/eeschema/files-io.cpp
@@ -430,7 +430,9 @@ bool SCH_EDIT_FRAME::AppendOneEEProject()
                     sheet->SetName( tmp );
 
                 sheet->SetFileName( wxString::Format( wxT( "file%8.8lX.sch" ), (long) newtimestamp ) );
-                sheet->SetScreen( new SCH_SCREEN( &Kiway() ) );
+                SCH_SCREEN* screen = new SCH_SCREEN( &Kiway() );
+                screen->SetMaxUndoItems( m_UndoRedoCountMax );
+                sheet->SetScreen( screen );
                 sheet->GetScreen()->SetFileName( sheet->GetFileName() );
             }
             // clear annotation and init new time stamp for the new components
diff --git a/eeschema/libeditframe.cpp b/eeschema/libeditframe.cpp
index b428b30..0eb1d36 100644
--- a/eeschema/libeditframe.cpp
+++ b/eeschema/libeditframe.cpp
@@ -206,13 +206,14 @@ LIB_EDIT_FRAME::LIB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
     icon.CopyFromBitmap( KiBitmap( libedit_icon_xpm ) );
     SetIcon( icon );
 
+    LoadSettings( config() );
+
     SetScreen( new SCH_SCREEN( aKiway ) );
     GetScreen()->m_Center = true;
+    GetScreen()->SetMaxUndoItems( m_UndoRedoCountMax );
 
     SetCrossHairPosition( wxPoint( 0, 0 ) );
 
-    LoadSettings( config() );
-
     // Ensure m_LastGridSizeId is an offset inside the allowed schematic range
     if( m_LastGridSizeId < ID_POPUP_GRID_LEVEL_50 - ID_POPUP_GRID_LEVEL_1000 )
         m_LastGridSizeId = ID_POPUP_GRID_LEVEL_50 - ID_POPUP_GRID_LEVEL_1000;
diff --git a/eeschema/load_one_schematic_file.cpp b/eeschema/load_one_schematic_file.cpp
index 4afc8fd..5d4e345 100644
--- a/eeschema/load_one_schematic_file.cpp
+++ b/eeschema/load_one_schematic_file.cpp
@@ -66,6 +66,9 @@ bool SCH_EDIT_FRAME::LoadOneEEFile( SCH_SCREEN* aScreen, const wxString& aFullFi
     if( aFullFileName.IsEmpty() )
         return false;
 
+    // Place the undo limit into the screen
+    aScreen->SetMaxUndoItems( m_UndoRedoCountMax );
+
     // If path is relative, this expands it from the project directory.
     wxString fname = Prj().AbsolutePath( aFullFileName );
 
diff --git a/eeschema/sch_sheet.cpp b/eeschema/sch_sheet.cpp
index c9afde7..ddce303 100644
--- a/eeschema/sch_sheet.cpp
+++ b/eeschema/sch_sheet.cpp
@@ -755,9 +755,9 @@ bool SCH_SHEET::Load( SCH_EDIT_FRAME* aFrame )
 {
     bool success = true;
 
+    SCH_SCREEN* screen = NULL;
     if( !m_screen )
     {
-        SCH_SCREEN* screen = NULL;
         g_RootSheet->SearchHierarchy( m_fileName, &screen );
 
         if( screen )
diff --git a/eeschema/schframe.cpp b/eeschema/schframe.cpp
index 15ee725..d0aa2f4 100644
--- a/eeschema/schframe.cpp
+++ b/eeschema/schframe.cpp
@@ -348,8 +348,6 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ):
     SetSpiceAddReferencePrefix( false );
     SetSpiceUseNetcodeAsNetname( false );
 
-    CreateScreens();
-
     // Give an icon
     wxIcon icon;
     icon.CopyFromBitmap( KiBitmap( icon_eeschema_xpm ) );
@@ -361,6 +359,8 @@ SCH_EDIT_FRAME::SCH_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ):
 
     LoadSettings( config() );
 
+    CreateScreens();
+
     // Ensure m_LastGridSizeId is an offset inside the allowed schematic grid range
     if( !GetScreen()->GridExists( m_LastGridSizeId + ID_POPUP_GRID_LEVEL_1000 ) )
         m_LastGridSizeId = default_grid;
@@ -523,7 +523,9 @@ void SCH_EDIT_FRAME::CreateScreens()
 
     if( g_RootSheet->GetScreen() == NULL )
     {
-        g_RootSheet->SetScreen( new SCH_SCREEN( &Kiway() ) );
+        SCH_SCREEN* screen = new SCH_SCREEN( &Kiway() );
+        screen->SetMaxUndoItems( m_UndoRedoCountMax );
+        g_RootSheet->SetScreen( screen );
         SetScreen( g_RootSheet->GetScreen() );
     }
 
@@ -533,7 +535,11 @@ void SCH_EDIT_FRAME::CreateScreens()
     m_CurrentSheet->Push( g_RootSheet );
 
     if( GetScreen() == NULL )
-        SetScreen( new SCH_SCREEN( &Kiway() ) );
+    {
+        SCH_SCREEN* screen = new SCH_SCREEN( &Kiway() );
+        screen->SetMaxUndoItems( m_UndoRedoCountMax );
+        SetScreen( screen );
+    }
 
     GetScreen()->SetZoom( 32.0 );
 }
diff --git a/eeschema/sheet.cpp b/eeschema/sheet.cpp
index e532ec4..d4fb0f2 100644
--- a/eeschema/sheet.cpp
+++ b/eeschema/sheet.cpp
@@ -141,6 +141,7 @@ bool SCH_EDIT_FRAME::EditSheet( SCH_SHEET* aSheet, SCH_SHEET_PATH* aHierarchy )
         else                                                   // New file.
         {
             aSheet->SetScreen( new SCH_SCREEN( &Kiway() ) );
+            aSheet->GetScreen()->SetMaxUndoItems( m_UndoRedoCountMax );
             aSheet->GetScreen()->SetFileName( newFilename );
         }
     }
diff --git a/include/class_base_screen.h b/include/class_base_screen.h
index 82da9ff..fe77668 100644
--- a/include/class_base_screen.h
+++ b/include/class_base_screen.h
@@ -31,15 +31,12 @@
 #ifndef  CLASS_BASE_SCREEN_H_
 #define  CLASS_BASE_SCREEN_H_
 
+#include <draw_frame.h>
 #include <base_struct.h>
 #include <class_undoredo_container.h>
 #include <block_commande.h>
 #include <common.h>
 #include <id.h>
-#include <climits>
-
-#define DEFAULT_MAX_UNDO_ITEMS 0
-#define ABS_MAX_UNDO_ITEMS (INT_MAX / 2)
 
 /**
  * Class GRID_TYPE
diff --git a/include/draw_frame.h b/include/draw_frame.h
index d787a4f..d88ca5c 100644
--- a/include/draw_frame.h
+++ b/include/draw_frame.h
@@ -27,10 +27,14 @@
 
 #include <wxstruct.h>
 #include <kiway_player.h>
+#include <climits>
 
 class wxSingleInstanceChecker;
 class EDA_HOTKEY;
 
+#define DEFAULT_MAX_UNDO_ITEMS 0
+#define ABS_MAX_UNDO_ITEMS (INT_MAX / 2)
+
 /**
  * Class EDA_DRAW_FRAME
  * is the base class for create windows for drawing purpose.  The Eeschema, Pcbnew and
@@ -68,6 +72,8 @@ protected:
     double      m_zoomLevelCoeff;           ///< a suitable value to convert the internal zoom scaling factor
                                             // to a zoom level value which rougly gives 1.0 when the board/schematic
                                             // is at scale = 1
+    int         m_UndoRedoCountMax;         ///< default Undo/Redo command Max depth, to be handed
+                                            // to screens
 
     /// The area to draw on.
     EDA_DRAW_PANEL* m_canvas;
diff --git a/pcbnew/moduleframe.cpp b/pcbnew/moduleframe.cpp
index 4337a8d..79d68f9 100644
--- a/pcbnew/moduleframe.cpp
+++ b/pcbnew/moduleframe.cpp
@@ -246,10 +246,10 @@ FOOTPRINT_EDIT_FRAME::FOOTPRINT_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
     wxFont font = wxSystemSettings::GetFont( wxSYS_DEFAULT_GUI_FONT );
     m_Layers = new PCB_LAYER_WIDGET( this, GetCanvas(), font.GetPointSize(), true );
 
+    LoadSettings( config() );
     SetScreen( new PCB_SCREEN( GetPageSettings().GetSizeIU() ) );
-
+    GetScreen()->SetMaxUndoItems( m_UndoRedoCountMax );
     GetScreen()->SetCurItem( NULL );
-    LoadSettings( config() );
 
     GetScreen()->AddGrid( m_UserGridSize, m_UserGridUnit, ID_POPUP_GRID_USER );
     GetScreen()->SetGrid( ID_POPUP_GRID_LEVEL_1000 + m_LastGridSizeId );
diff --git a/pcbnew/pcbframe.cpp b/pcbnew/pcbframe.cpp
index 33faef8..9f84003 100644
--- a/pcbnew/pcbframe.cpp
+++ b/pcbnew/pcbframe.cpp
@@ -352,15 +352,16 @@ PCB_EDIT_FRAME::PCB_EDIT_FRAME( KIWAY* aKiway, wxWindow* aParent ) :
     icon.CopyFromBitmap( KiBitmap( icon_pcbnew_xpm ) );
     SetIcon( icon );
 
+    // LoadSettings() *after* creating m_LayersManager, because LoadSettings()
+    // initialize parameters in m_LayersManager
+    LoadSettings( config() );
+
     SetScreen( new PCB_SCREEN( GetPageSettings().GetSizeIU() ) );
+    GetScreen()->SetMaxUndoItems( m_UndoRedoCountMax );
 
     // PCB drawings start in the upper left corner.
     GetScreen()->m_Center = false;
 
-    // LoadSettings() *after* creating m_LayersManager, because LoadSettings()
-    // initialize parameters in m_LayersManager
-    LoadSettings( config() );
-
     SetSize( m_FramePos.x, m_FramePos.y, m_FrameSize.x, m_FrameSize.y );
 
     GetScreen()->AddGrid( m_UserGridSize, m_UserGridUnit, ID_POPUP_GRID_USER );

Follow ups

References