diff --git a/3d-viewer/3d_cache/3d_cache.cpp b/3d-viewer/3d_cache/3d_cache.cpp index 768f6c20c3..f8247ad004 100644 --- a/3d-viewer/3d_cache/3d_cache.cpp +++ b/3d-viewer/3d_cache/3d_cache.cpp @@ -57,6 +57,7 @@ #include <filename_resolver.h> #include <pgm_base.h> #include <project.h> +#include <settings/common_settings.h> #include <settings/settings_manager.h> @@ -195,8 +196,18 @@ S3D_CACHE::S3D_CACHE() S3D_CACHE::~S3D_CACHE() { + COMMON_SETTINGS* commonSettings = Pgm().GetCommonSettings(); + FlushCache(); + // We'll delete ".3dc" cache files older than this many days + int clearCacheInterval = commonSettings->m_System.clear_3d_cache_interval; + + // An interval of zero means the user doesn't want to ever clear the cache + + if( clearCacheInterval > 0 ) + CleanCacheDir( clearCacheInterval ); + delete m_FNResolver; delete m_Plugins; } @@ -677,6 +688,46 @@ S3DMODEL* S3D_CACHE::GetModel( const wxString& aModelFileName ) return mp; } +void S3D_CACHE::CleanCacheDir( int aNumDaysOld ) +{ + wxDir dir; + wxString fileSpec = wxT( "*.3dc" ); + wxArrayString fileList; // Holds list of ".3dc" files found in cache directory + size_t numFilesFound = 0; + + wxFileName thisFile; + wxDateTime lastAccess, thresholdDate; + wxDateSpan durationInDays; + + // Calc the threshold date above which we delete cache files + durationInDays.SetDays( aNumDaysOld ); + thresholdDate = wxDateTime::Now() - durationInDays; + + // If the cache directory can be found and opened, then we'll try and clean it up + if( dir.Open( m_CacheDir ) ) + { + thisFile.SetPath( m_CacheDir ); // Set the base path to the cache folder + + // Get a list of all the ".3dc" files in the cache directory + numFilesFound = dir.GetAllFiles( m_CacheDir, &fileList, fileSpec ); + + for( unsigned int i = 0; i < numFilesFound; i++ ) + { + // Completes path to specific file so we can get its "last access" date + thisFile.SetFullName( fileList[i] ); + + // Only get "last access" time to compare against. Don't need the other 2 timestamps. + if( thisFile.GetTimes( &lastAccess, nullptr, nullptr ) ) + { + if( lastAccess.IsEarlierThan( thresholdDate ) ) + { + // This file is older than the threshold so delete it + wxRemoveFile( thisFile.GetFullPath() ); + } + } + } + } +} S3D_CACHE* PROJECT::Get3DCacheManager( bool aUpdateProjDir ) { diff --git a/3d-viewer/3d_cache/3d_cache.h b/3d-viewer/3d_cache/3d_cache.h index d59f3964e1..926a33f562 100644 --- a/3d-viewer/3d_cache/3d_cache.h +++ b/3d-viewer/3d_cache/3d_cache.h @@ -183,6 +183,16 @@ public: * @return is a pointer to the render data or NULL if not available */ S3DMODEL* GetModel( const wxString& aModelFileName ); + + /** + * Function Delete up old cache files in cache directory + * + * Deletes ".3dc" files in the cache directory that are older than + * "aNumDaysOld". + * + * @param aNumDaysOld is age threshold to delete ".3dc" cache files + */ + void CleanCacheDir( int aNumDaysOld ); }; #endif // CACHE_3D_H diff --git a/common/dialogs/panel_common_settings.cpp b/common/dialogs/panel_common_settings.cpp index d69a2590ac..b9db7dbfe7 100644 --- a/common/dialogs/panel_common_settings.cpp +++ b/common/dialogs/panel_common_settings.cpp @@ -101,6 +101,7 @@ bool PANEL_COMMON_SETTINGS::TransferDataFromWindow() commonSettings->m_System.autosave_interval = m_SaveTime->GetValue() * 60; commonSettings->m_System.file_history_size = m_fileHistorySize->GetValue(); + commonSettings->m_System.clear_3d_cache_interval = m_Clear3DCacheFilesOlder->GetValue(); commonSettings->m_Graphics.opengl_aa_mode = m_antialiasing->GetSelection(); commonSettings->m_Graphics.cairo_aa_mode = m_antialiasingFallback->GetSelection(); @@ -167,6 +168,8 @@ void PANEL_COMMON_SETTINGS::applySettingsToPanel( COMMON_SETTINGS& aSettings ) m_antialiasing->SetSelection( aSettings.m_Graphics.opengl_aa_mode ); m_antialiasingFallback->SetSelection( aSettings.m_Graphics.cairo_aa_mode ); + m_Clear3DCacheFilesOlder->SetValue( aSettings.m_System.clear_3d_cache_interval ); + int icon_scale_fourths = aSettings.m_Appearance.icon_scale; if( icon_scale_fourths <= 0 ) diff --git a/common/dialogs/panel_common_settings_base.cpp b/common/dialogs/panel_common_settings_base.cpp index a9899db7b8..986a205c46 100644 --- a/common/dialogs/panel_common_settings_base.cpp +++ b/common/dialogs/panel_common_settings_base.cpp @@ -50,27 +50,46 @@ PANEL_COMMON_SETTINGS_BASE::PANEL_COMMON_SETTINGS_BASE( wxWindow* parent, wxWind m_fileHistorySize = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 1, 100, 0 ); gbSizer1->Add( m_fileHistorySize, wxGBPosition( 1, 1 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + wxBoxSizer* bSizer5; + bSizer5 = new wxBoxSizer( wxHORIZONTAL ); + + m_Clear3DCacheFilesOlder = new wxSpinCtrl( this, wxID_ANY, wxEmptyString, wxDefaultPosition, wxDefaultSize, wxSP_ARROW_KEYS, 0, 120, 30 ); + m_Clear3DCacheFilesOlder->SetToolTip( _("3D cache files older than this are deleted.\nIf set to 0, cache clearing is disabled") ); + + bSizer5->Add( m_Clear3DCacheFilesOlder, 0, wxALIGN_CENTER_VERTICAL, 5 ); + + m_staticTextDays = new wxStaticText( this, wxID_ANY, _("Days"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextDays->Wrap( -1 ); + bSizer5->Add( m_staticTextDays, 0, wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT, 5 ); + + + gbSizer1->Add( bSizer5, wxGBPosition( 2, 1 ), wxGBSpan( 1, 1 ), wxEXPAND, 5 ); + wxStaticText* antialiasingLabel; antialiasingLabel = new wxStaticText( this, wxID_ANY, _("Accelerated graphics:"), wxDefaultPosition, wxDefaultSize, 0 ); antialiasingLabel->Wrap( -1 ); - gbSizer1->Add( antialiasingLabel, wxGBPosition( 3, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + gbSizer1->Add( antialiasingLabel, wxGBPosition( 4, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); wxString m_antialiasingChoices[] = { _("No Antialiasing"), _("Subpixel Antialiasing (High Quality)"), _("Subpixel Antialiasing (Ultra Quality)"), _("Supersampling (2x)"), _("Supersampling (4x)") }; int m_antialiasingNChoices = sizeof( m_antialiasingChoices ) / sizeof( wxString ); m_antialiasing = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_antialiasingNChoices, m_antialiasingChoices, 0 ); m_antialiasing->SetSelection( 0 ); - gbSizer1->Add( m_antialiasing, wxGBPosition( 3, 1 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + gbSizer1->Add( m_antialiasing, wxGBPosition( 4, 1 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); wxStaticText* antialiasingLabel1; antialiasingLabel1 = new wxStaticText( this, wxID_ANY, _("Fallback graphics:"), wxDefaultPosition, wxDefaultSize, 0 ); antialiasingLabel1->Wrap( -1 ); - gbSizer1->Add( antialiasingLabel1, wxGBPosition( 4, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); + gbSizer1->Add( antialiasingLabel1, wxGBPosition( 6, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL, 5 ); wxString m_antialiasingFallbackChoices[] = { _("No Antialiasing"), _("Fast Antialiasing"), _("Balanced Antialiasing"), _("High Quality Antialiasing") }; int m_antialiasingFallbackNChoices = sizeof( m_antialiasingFallbackChoices ) / sizeof( wxString ); m_antialiasingFallback = new wxChoice( this, wxID_ANY, wxDefaultPosition, wxDefaultSize, m_antialiasingFallbackNChoices, m_antialiasingFallbackChoices, 0 ); m_antialiasingFallback->SetSelection( 0 ); - gbSizer1->Add( m_antialiasingFallback, wxGBPosition( 4, 1 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + gbSizer1->Add( m_antialiasingFallback, wxGBPosition( 6, 1 ), wxGBSpan( 1, 2 ), wxALIGN_CENTER_VERTICAL|wxEXPAND, 5 ); + + m_staticTextClear3DCache = new wxStaticText( this, wxID_ANY, _("3D cache file duration:"), wxDefaultPosition, wxDefaultSize, 0 ); + m_staticTextClear3DCache->Wrap( -1 ); + gbSizer1->Add( m_staticTextClear3DCache, wxGBPosition( 2, 0 ), wxGBSpan( 1, 1 ), wxALIGN_CENTER_VERTICAL|wxTOP, 5 ); gbSizer1->AddGrowableCol( 1 ); @@ -265,7 +284,6 @@ PANEL_COMMON_SETTINGS_BASE::PANEL_COMMON_SETTINGS_BASE( wxWindow* parent, wxWind this->SetSizer( bPanelSizer ); this->Layout(); - bPanelSizer->Fit( this ); // Connect Events m_textEditorBtn->Connect( wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler( PANEL_COMMON_SETTINGS_BASE::OnTextEditorClick ), NULL, this ); diff --git a/common/dialogs/panel_common_settings_base.fbp b/common/dialogs/panel_common_settings_base.fbp index e70287a1be..71093ecd6d 100644 --- a/common/dialogs/panel_common_settings_base.fbp +++ b/common/dialogs/panel_common_settings_base.fbp @@ -43,7 +43,7 @@ <property name="minimum_size"></property> <property name="name">PANEL_COMMON_SETTINGS_BASE</property> <property name="pos"></property> - <property name="size">-1,-1</property> + <property name="size">838,485</property> <property name="subclass">RESETTABLE_PANEL; widgets/resettable_panel.h; Not forward_declare</property> <property name="tooltip"></property> <property name="window_extra_style"></property> @@ -408,12 +408,149 @@ <property name="window_style"></property> </object> </object> + <object class="gbsizeritem" expanded="1"> + <property name="border">5</property> + <property name="colspan">1</property> + <property name="column">1</property> + <property name="flag">wxEXPAND</property> + <property name="row">2</property> + <property name="rowspan">1</property> + <object class="wxBoxSizer" expanded="1"> + <property name="minimum_size"></property> + <property name="name">bSizer5</property> + <property name="orient">wxHORIZONTAL</property> + <property name="permission">none</property> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL</property> + <property name="proportion">0</property> + <object class="wxSpinCtrl" expanded="1"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="initial">30</property> + <property name="max">120</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min">0</property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_Clear3DCacheFilesOlder</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style">wxSP_ARROW_KEYS</property> + <property name="subclass">; ; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip">3D cache files older than this are deleted.
If set to 0, cache clearing is disabled</property> + <property name="value"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + </object> + </object> + <object class="sizeritem" expanded="1"> + <property name="border">5</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxLEFT|wxRIGHT</property> + <property name="proportion">0</property> + <object class="wxStaticText" expanded="1"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">Days</property> + <property name="markup">0</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_staticTextDays</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">; ; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</property> + </object> + </object> + </object> + </object> <object class="gbsizeritem" expanded="1"> <property name="border">5</property> <property name="colspan">1</property> <property name="column">0</property> <property name="flag">wxALIGN_CENTER_VERTICAL</property> - <property name="row">3</property> + <property name="row">4</property> <property name="rowspan">1</property> <object class="wxStaticText" expanded="1"> <property name="BottomDockable">1</property> @@ -477,7 +614,7 @@ <property name="colspan">2</property> <property name="column">1</property> <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND</property> - <property name="row">3</property> + <property name="row">4</property> <property name="rowspan">1</property> <object class="wxChoice" expanded="1"> <property name="BottomDockable">1</property> @@ -544,7 +681,7 @@ <property name="colspan">1</property> <property name="column">0</property> <property name="flag">wxALIGN_CENTER_VERTICAL</property> - <property name="row">4</property> + <property name="row">6</property> <property name="rowspan">1</property> <object class="wxStaticText" expanded="1"> <property name="BottomDockable">1</property> @@ -608,7 +745,7 @@ <property name="colspan">2</property> <property name="column">1</property> <property name="flag">wxALIGN_CENTER_VERTICAL|wxEXPAND</property> - <property name="row">4</property> + <property name="row">6</property> <property name="rowspan">1</property> <object class="wxChoice" expanded="1"> <property name="BottomDockable">1</property> @@ -670,6 +807,70 @@ <property name="window_style"></property> </object> </object> + <object class="gbsizeritem" expanded="1"> + <property name="border">5</property> + <property name="colspan">1</property> + <property name="column">0</property> + <property name="flag">wxALIGN_CENTER_VERTICAL|wxTOP</property> + <property name="row">2</property> + <property name="rowspan">1</property> + <object class="wxStaticText" expanded="1"> + <property name="BottomDockable">1</property> + <property name="LeftDockable">1</property> + <property name="RightDockable">1</property> + <property name="TopDockable">1</property> + <property name="aui_layer"></property> + <property name="aui_name"></property> + <property name="aui_position"></property> + <property name="aui_row"></property> + <property name="best_size"></property> + <property name="bg"></property> + <property name="caption"></property> + <property name="caption_visible">1</property> + <property name="center_pane">0</property> + <property name="close_button">1</property> + <property name="context_help"></property> + <property name="context_menu">1</property> + <property name="default_pane">0</property> + <property name="dock">Dock</property> + <property name="dock_fixed">0</property> + <property name="docking">Left</property> + <property name="enabled">1</property> + <property name="fg"></property> + <property name="floatable">1</property> + <property name="font"></property> + <property name="gripper">0</property> + <property name="hidden">0</property> + <property name="id">wxID_ANY</property> + <property name="label">3D cache file duration:</property> + <property name="markup">0</property> + <property name="max_size"></property> + <property name="maximize_button">0</property> + <property name="maximum_size"></property> + <property name="min_size"></property> + <property name="minimize_button">0</property> + <property name="minimum_size"></property> + <property name="moveable">1</property> + <property name="name">m_staticTextClear3DCache</property> + <property name="pane_border">1</property> + <property name="pane_position"></property> + <property name="pane_size"></property> + <property name="permission">protected</property> + <property name="pin_button">1</property> + <property name="pos"></property> + <property name="resize">Resizable</property> + <property name="show">1</property> + <property name="size"></property> + <property name="style"></property> + <property name="subclass">; ; forward_declare</property> + <property name="toolbar_pane">0</property> + <property name="tooltip"></property> + <property name="window_extra_style"></property> + <property name="window_name"></property> + <property name="window_style"></property> + <property name="wrap">-1</property> + </object> + </object> </object> </object> <object class="sizeritem" expanded="1"> diff --git a/common/dialogs/panel_common_settings_base.h b/common/dialogs/panel_common_settings_base.h index aa8ee0a5ae..023129b6b9 100644 --- a/common/dialogs/panel_common_settings_base.h +++ b/common/dialogs/panel_common_settings_base.h @@ -48,8 +48,11 @@ class PANEL_COMMON_SETTINGS_BASE : public RESETTABLE_PANEL wxSpinCtrl* m_SaveTime; wxStaticText* m_staticTextFileHistorySize; wxSpinCtrl* m_fileHistorySize; + wxSpinCtrl* m_Clear3DCacheFilesOlder; + wxStaticText* m_staticTextDays; wxChoice* m_antialiasing; wxChoice* m_antialiasingFallback; + wxStaticText* m_staticTextClear3DCache; wxTextCtrl* m_textEditorPath; wxBitmapButton* m_textEditorBtn; wxRadioButton* m_defaultPDFViewer; @@ -90,7 +93,7 @@ class PANEL_COMMON_SETTINGS_BASE : public RESETTABLE_PANEL public: - PANEL_COMMON_SETTINGS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( -1,-1 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString ); + PANEL_COMMON_SETTINGS_BASE( wxWindow* parent, wxWindowID id = wxID_ANY, const wxPoint& pos = wxDefaultPosition, const wxSize& size = wxSize( 838,485 ), long style = wxTAB_TRAVERSAL, const wxString& name = wxEmptyString ); ~PANEL_COMMON_SETTINGS_BASE(); }; diff --git a/common/settings/common_settings.cpp b/common/settings/common_settings.cpp index b793c23e82..a6ca18dabc 100644 --- a/common/settings/common_settings.cpp +++ b/common/settings/common_settings.cpp @@ -172,6 +172,10 @@ COMMON_SETTINGS::COMMON_SETTINGS() : m_params.emplace_back( new PARAM<wxString>( "system.working_dir", &m_System.working_dir, "" ) ); + + m_params.emplace_back( new PARAM<int>( "system.clear_3d_cache_interval", + &m_System.clear_3d_cache_interval, 30 ) ); + } diff --git a/include/settings/common_settings.h b/include/settings/common_settings.h index 729fd286ad..5bcbb746c0 100644 --- a/include/settings/common_settings.h +++ b/include/settings/common_settings.h @@ -89,6 +89,7 @@ public: wxString pdf_viewer_name; bool use_system_pdf_viewer; wxString working_dir; + int clear_3d_cache_interval; }; COMMON_SETTINGS();