diff options
Diffstat (limited to 'ui/batch_config.cpp')
-rw-r--r-- | ui/batch_config.cpp | 746 |
1 files changed, 40 insertions, 706 deletions
diff --git a/ui/batch_config.cpp b/ui/batch_config.cpp index 0463bd80..6b9092c9 100644 --- a/ui/batch_config.cpp +++ b/ui/batch_config.cpp @@ -5,62 +5,40 @@ // ************************************************************************** #include "batch_config.h" -#include <iterator> -#include <wx/filedlg.h> -#include <wx/msgdlg.h> #include <wx/wupdlock.h> -#include <wx+/button.h> -#include <wx+/choice_enum.h> #include <wx+/mouse_move_dlg.h> -#include <wx+/context_menu.h> -#include <zen/file_handling.h> +#include "gui_generated.h" +#include "dir_name.h" #include "../ui/exec_finished_box.h" #include "../lib/help_provider.h" -#include "folder_pair.h" -#include "msg_popup.h" -#include "gui_generated.h" +#include "../lib/resources.h" using namespace zen; using namespace xmlAccess; -class DirectoryPairBatchFirst; -class DirectoryPairBatch; - -class BatchDialog: public BatchDlgGenerated +namespace +{ +enum ButtonPressed { - template <class GuiPanel> - friend class FolderPairCallback; - friend class DirectoryPairBatchFirst; + BUTTON_CANCEL, + BUTTON_SAVE_AS +}; + +class BatchDialog : public BatchDlgGenerated +{ public: BatchDialog(wxWindow* parent, - const wxString& referenceFile, - const XmlBatchConfig& batchCfg, - const std::shared_ptr<FolderHistory>& folderHistLeft, - const std::shared_ptr<FolderHistory>& folderHistRight, + XmlBatchConfig& batchCfg, //in/out std::vector<std::wstring>& onCompletionHistory, size_t onCompletionHistoryMax); private: - virtual void OnCmpSettings (wxCommandEvent& event); - virtual void OnSyncSettings (wxCommandEvent& event); - virtual void OnConfigureFilter(wxCommandEvent& event); - virtual void OnHelp (wxCommandEvent& event) { displayHelpEntry(L"html/Schedule a Batch Job.html"); } - - virtual void OnCompSettingsContext(wxCommandEvent& event); - virtual void OnSyncSettingsContext(wxCommandEvent& event); - virtual void OnGlobalFilterContext(wxCommandEvent& event); - virtual void OnCheckSaveLog (wxCommandEvent& event); - virtual void OnClose (wxCloseEvent& event) { EndModal(0); } - virtual void OnCancel (wxCommandEvent& event) { EndModal(0); } - virtual void OnSaveBatchJob (wxCommandEvent& event); - virtual void OnLoadBatchJob (wxCommandEvent& event); - virtual void OnAddFolderPair (wxCommandEvent& event); - virtual void OnRemoveFolderPair (wxCommandEvent& event); - virtual void OnRemoveTopFolderPair (wxCommandEvent& event); - void OnFilesDropped(FileDropEvent& event); - + virtual void OnHelp (wxCommandEvent& event) { displayHelpEntry(L"html/Schedule a Batch Job.html"); } + virtual void OnClose (wxCloseEvent& event) { EndModal(BUTTON_CANCEL); } + virtual void OnCancel (wxCommandEvent& event) { EndModal(BUTTON_CANCEL); } + virtual void OnSaveBatchJob(wxCommandEvent& event); virtual void OnErrorPopup (wxCommandEvent& event) { localBatchCfg.handleError = ON_ERROR_POPUP; updateGui(); } virtual void OnErrorIgnore(wxCommandEvent& event) { localBatchCfg.handleError = ON_ERROR_IGNORE; updateGui(); } virtual void OnErrorExit (wxCommandEvent& event) { localBatchCfg.handleError = ON_ERROR_EXIT; updateGui(); } @@ -68,166 +46,26 @@ private: virtual void OnToggleGenerateLogfile(wxCommandEvent& event) { updateGui(); } virtual void OnToggleLogfilesLimit (wxCommandEvent& event) { updateGui(); } - void addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, bool addFront = false); - void removeAddFolderPair(int pos); - void clearAddFolderPairs(); - - void updateGuiForFolderPair(); - void updateGui(); //re-evaluate gui after config changes - bool saveBatchFile(const wxString& filename); - void loadBatchFile(const wxString& filename); - void loadBatchFile(const std::vector<wxString>& filenames); - void setConfig(const XmlBatchConfig& batchCfg); XmlBatchConfig getConfig() const; - std::unique_ptr<DirectoryPairBatchFirst> firstFolderPair; //always bound!!! - std::vector<DirectoryPairBatch*> additionalFolderPairs; - - //used when saving batch file - wxString proposedBatchFileName; - + XmlBatchConfig& batchCfgOutRef; //output only! XmlBatchConfig localBatchCfg; //a mixture of settings some of which have OWNERSHIP WITHIN GUI CONTROLS! use getConfig() to resolve std::unique_ptr<DirectoryName<FolderHistoryBox>> logfileDir; //always bound, solve circular compile-time dependency - - const std::shared_ptr<FolderHistory> folderHistLeft_; - const std::shared_ptr<FolderHistory> folderHistRight_; -}; - -//################################################################################################################################### - -//------------------------------------------------------------------ -/* class hierarchy: - - template<> - FolderPairPanelBasic - /|\ - | - template<> - FolderPairCallback BatchFolderPairGenerated - /|\ /|\ - _________|______________ ________| - | | | - DirectoryPairBatchFirst DirectoryPairBatch -*/ - -template <class GuiPanel> -class FolderPairCallback : public FolderPairPanelBasic<GuiPanel> //implements callback functionality to BatchDialog as imposed by FolderPairPanelBasic -{ -public: - FolderPairCallback(GuiPanel& basicPanel, BatchDialog& batchDialog) : - FolderPairPanelBasic<GuiPanel>(basicPanel), //pass FolderPairGenerated part... - batchDlg(batchDialog) {} - -private: - virtual wxWindow* getParentWindow() { return &batchDlg; } - - virtual MainConfiguration getMainConfig() const { return batchDlg.getConfig().mainCfg; } - - virtual void OnAltCompCfgChange() { batchDlg.updateGui(); } - - virtual void OnAltSyncCfgChange() { batchDlg.updateGui(); } - - virtual void removeAltCompCfg() - { - FolderPairPanelBasic<GuiPanel>::removeAltCompCfg(); - batchDlg.updateGui(); - } - - virtual void removeAltSyncCfg() - { - FolderPairPanelBasic<GuiPanel>::removeAltSyncCfg(); - batchDlg.updateGui(); - } - - virtual void OnLocalFilterCfgChange() {} - - BatchDialog& batchDlg; }; - -class DirectoryPairBatch: - public BatchFolderPairGenerated, //DirectoryPairBatch "owns" BatchFolderPairGenerated! - public FolderPairCallback<BatchFolderPairGenerated> -{ -public: - DirectoryPairBatch(wxWindow* parent, BatchDialog& batchDialog) : - BatchFolderPairGenerated(parent), - FolderPairCallback<BatchFolderPairGenerated>(static_cast<BatchFolderPairGenerated&>(*this), batchDialog), //pass BatchFolderPairGenerated part... - dirNameLeft (*m_panelLeft, *m_buttonSelectDirLeft, *m_directoryLeft), - dirNameRight(*m_panelRight, *m_buttonSelectDirRight, *m_directoryRight) {} - - void setValues(const wxString& leftDir, - const wxString& rightDir, - AltCompCfgPtr cmpCfg, - AltSyncCfgPtr syncCfg, - const FilterConfig& filter) - { - setConfig(cmpCfg, syncCfg, filter); - dirNameLeft.setName(leftDir); - dirNameRight.setName(rightDir); - } - wxString getLeftDir () const { return dirNameLeft .getName(); } - wxString getRightDir() const { return dirNameRight.getName(); } - -private: - //support for drag and drop - DirectoryName<FolderHistoryBox> dirNameLeft; - DirectoryName<FolderHistoryBox> dirNameRight; -}; - - -class DirectoryPairBatchFirst : public FolderPairCallback<BatchDlgGenerated> -{ -public: - DirectoryPairBatchFirst(BatchDialog& batchDialog) : - FolderPairCallback<BatchDlgGenerated>(batchDialog, batchDialog), - - //prepare drag & drop - dirNameLeft(*batchDialog.m_panelLeft, - *batchDialog.m_buttonSelectDirLeft, - *batchDialog.m_directoryLeft), - dirNameRight(*batchDialog.m_panelRight, - *batchDialog.m_buttonSelectDirRight, - *batchDialog.m_directoryRight) {} - - void setValues(const wxString& leftDir, - const wxString& rightDir, - AltCompCfgPtr cmpCfg, - AltSyncCfgPtr syncCfg, - const FilterConfig& filter) - { - setConfig(cmpCfg, syncCfg, filter); - dirNameLeft.setName(leftDir); - dirNameRight.setName(rightDir); - } - wxString getLeftDir () const { return dirNameLeft .getName(); } - wxString getRightDir() const { return dirNameRight.getName(); } - -private: - //support for drag and drop - DirectoryName<FolderHistoryBox> dirNameLeft; - DirectoryName<FolderHistoryBox> dirNameRight; -}; //################################################################################################################################### - BatchDialog::BatchDialog(wxWindow* parent, - const wxString& referenceFile, - const XmlBatchConfig& batchCfg, - const std::shared_ptr<FolderHistory>& folderHistLeft, - const std::shared_ptr<FolderHistory>& folderHistRight, + XmlBatchConfig& batchCfg, std::vector<std::wstring>& onCompletionHistory, size_t onCompletionHistoryMax) : BatchDlgGenerated(parent), - folderHistLeft_(folderHistLeft), - folderHistRight_(folderHistRight) + batchCfgOutRef(batchCfg) { - m_directoryLeft ->init(folderHistLeft_); - m_directoryRight->init(folderHistRight_); m_comboBoxExecFinished->initHistory(onCompletionHistory, onCompletionHistoryMax); #ifdef FFS_WIN @@ -235,105 +73,31 @@ BatchDialog::BatchDialog(wxWindow* parent, #endif wxWindowUpdateLocker dummy(this); //avoid display distortion - m_bpButtonCmpConfig ->SetBitmapLabel(GlobalResources::getImage(L"cmpConfig")); - m_bpButtonSyncConfig->SetBitmapLabel(GlobalResources::getImage(L"syncConfig")); - m_bpButtonHelp ->SetBitmapLabel(GlobalResources::getImage(L"help")); - - //init handling of first folder pair - firstFolderPair.reset(new DirectoryPairBatchFirst(*this)); - - m_bpButtonCmpConfig ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(BatchDialog::OnCompSettingsContext), nullptr, this); - m_bpButtonSyncConfig->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(BatchDialog::OnSyncSettingsContext), nullptr, this); - m_bpButtonFilter ->Connect(wxEVT_RIGHT_DOWN, wxCommandEventHandler(BatchDialog::OnGlobalFilterContext), nullptr, this); + m_bpButtonHelp ->SetBitmapLabel(GlobalResources::getImage(L"help")); + m_bitmapBatchJob->SetBitmap (GlobalResources::getImage(L"batch")); - //prepare drag & drop for loading of *.ffs_batch files - setupFileDrop(*this); - Connect(EVENT_DROP_FILE, FileDropEventHandler(BatchDialog::OnFilesDropped), nullptr, this); - - logfileDir.reset(new DirectoryName<FolderHistoryBox>(*m_panelBatchSettings, *m_buttonSelectLogfileDir, *m_comboBoxLogfileDir)); - - //set icons for this dialog - m_bpButtonAddPair->SetBitmapLabel(GlobalResources::getImage(L"item_add")); - m_bitmap27->SetBitmap(GlobalResources::getImage(L"batch")); - - m_buttonSave->SetFocus(); - - if (!referenceFile.empty()) - { - SetTitle(referenceFile); - proposedBatchFileName = referenceFile; //may be used on next save - } + logfileDir = make_unique<DirectoryName<FolderHistoryBox>>(*this, *m_buttonSelectLogfileDir, *m_comboBoxLogfileDir); setConfig(batchCfg); -} - -//------------------- error handling -------------------------- - -void BatchDialog::OnCmpSettings(wxCommandEvent& event) -{ - //show window right next to the compare-config button - //wxPoint windowPos = m_bpButtonCmpConfig->GetScreenPosition(); - //windowPos.x += m_bpButtonCmpConfig->GetSize().GetWidth() + 5; - - if (zen::showCompareCfgDialog(this, localBatchCfg.mainCfg.cmpConfig) == ReturnSmallDlg::BUTTON_OKAY) - updateGui(); -} + Fit(); //child-element widths have changed: image was set + m_panelHeader->Layout(); -void BatchDialog::OnSyncSettings(wxCommandEvent& event) -{ - //ExecWhenFinishedCfg ewfCfg = { &localBatchCfg.mainCfg.onCompletion, - // &onCompletionHistory_, - // onCompletionHistoryMax_ - // }; - - if (showSyncConfigDlg(this, - localBatchCfg.mainCfg.cmpConfig.compareVar, - localBatchCfg.mainCfg.syncCfg, - nullptr, - nullptr) == ReturnSyncConfig::BUTTON_OKAY) //optional input parameter - updateGui(); -} - - -void BatchDialog::OnConfigureFilter(wxCommandEvent& event) -{ - if (showFilterDialog(this, - true, //is main filter dialog - localBatchCfg.mainCfg.globalFilter) == ReturnSmallDlg::BUTTON_OKAY) - updateGui(); + m_buttonSave->SetFocus(); } void BatchDialog::updateGui() //re-evaluate gui after config changes { - XmlBatchConfig cfg = getConfig(); + XmlBatchConfig cfg = getConfig(); //resolve parameter ownership: some on GUI controls, others member variables - m_panelLogfile ->Enable(m_checkBoxGenerateLogfile->GetValue()); + m_panelLogfile ->Enable(m_checkBoxGenerateLogfile->GetValue()); //enabled status is *not* directly dependent from resolved config! (but transitively) m_spinCtrlLogfileLimit->Enable(m_checkBoxGenerateLogfile->GetValue() && m_checkBoxLogfilesLimit->GetValue()); - //update compare variant name - m_staticTextCmpVariant->SetLabel(cfg.mainCfg.getCompVariantName()); - - //update sync variant name - m_staticTextSyncVariant->SetLabel(cfg.mainCfg.getSyncVariantName()); - - //set filter icon - if (!isNullFilter(cfg.mainCfg.globalFilter)) - { - setImage(*m_bpButtonFilter, GlobalResources::getImage(L"filter")); - m_bpButtonFilter->SetToolTip(_("Filter is active")); - } - else - { - setImage(*m_bpButtonFilter, greyScale(GlobalResources::getImage(L"filter"))); - m_bpButtonFilter->SetToolTip(_("No filter selected")); - } - m_toggleBtnErrorIgnore->SetValue(false); m_toggleBtnErrorPopup ->SetValue(false); m_toggleBtnErrorExit ->SetValue(false); - switch (cfg.handleError) + switch (cfg.handleError) //*not* owned by GUI controls { case ON_ERROR_IGNORE: m_toggleBtnErrorIgnore->SetValue(true); @@ -345,238 +109,6 @@ void BatchDialog::updateGui() //re-evaluate gui after config changes m_toggleBtnErrorExit->SetValue(true); break; } - - m_panelOverview->Layout (); //adjust stuff inside scrolled window - m_panelOverview->Refresh(); //refresh filter button (if nothing else) -} - - -void BatchDialog::OnCompSettingsContext(wxCommandEvent& event) -{ - ContextMenu menu; - - auto setVariant = [&](CompareVariant var) - { - localBatchCfg.mainCfg.cmpConfig.compareVar = var; - updateGui(); - }; - - auto currentVar = localBatchCfg.mainCfg.cmpConfig.compareVar; - - menu.addRadio(_("File time and size"), [&] { setVariant(CMP_BY_TIME_SIZE); }, currentVar == CMP_BY_TIME_SIZE); - menu.addRadio(_("File content" ), [&] { setVariant(CMP_BY_CONTENT); }, currentVar == CMP_BY_CONTENT); - - menu.popup(*this); -} - - -void BatchDialog::OnSyncSettingsContext(wxCommandEvent& event) -{ - - ContextMenu menu; - - auto setVariant = [&](DirectionConfig::Variant var) - { - localBatchCfg.mainCfg.syncCfg.directionCfg.var = var; - updateGui(); - }; - - const auto currentVar = localBatchCfg.mainCfg.syncCfg.directionCfg.var; - - menu.addRadio(_("<Automatic>"), [&] { setVariant(DirectionConfig::AUTOMATIC); }, currentVar == DirectionConfig::AUTOMATIC); - menu.addRadio(_("Mirror ->>") , [&] { setVariant(DirectionConfig::MIRROR); }, currentVar == DirectionConfig::MIRROR); - menu.addRadio(_("Update ->") , [&] { setVariant(DirectionConfig::UPDATE); }, currentVar == DirectionConfig::UPDATE); - menu.addRadio(_("Custom") , [&] { setVariant(DirectionConfig::CUSTOM); }, currentVar == DirectionConfig::CUSTOM); - - menu.popup(*this); -} - - -void BatchDialog::OnGlobalFilterContext(wxCommandEvent& event) -{ - ContextMenu menu; - - auto clearFilter = [&] - { - localBatchCfg.mainCfg.globalFilter = FilterConfig(); - updateGui(); - }; - menu.addItem( _("Clear filter settings"), clearFilter, nullptr, !isNullFilter(localBatchCfg.mainCfg.globalFilter)); - - menu.popup(*this); -} - - -void BatchDialog::OnCheckSaveLog(wxCommandEvent& event) -{ - updateGui(); - - //reset error handling depending on "m_checkBoxSilent" - //setSelectionHandleError(getEnumVal(enumDescrMap, *m_choiceHandleError)); -} - - -void BatchDialog::OnFilesDropped(FileDropEvent& event) -{ - loadBatchFile(event.getFiles()); -} - - -/* -void BatchDialog::showNotebookpage(wxWindow* page, const wxString& pageName, bool show) -{ - int windowPosition = -1; - for (size_t i = 0; i < m_notebookSettings->GetPageCount(); ++i) - if (m_notebookSettings->GetPage(i) == page) - { - windowPosition = static_cast<int>(i); - break; - } - - if (show) - { - if (windowPosition == -1) - m_notebookSettings->AddPage(page, pageName, false); - } - else - { - if (windowPosition != -1) - { - //do not delete currently selected tab!! - if (m_notebookSettings->GetCurrentPage() == m_notebookSettings->GetPage(windowPosition)) - m_notebookSettings->ChangeSelection(0); - - m_notebookSettings->RemovePage(windowPosition); - } - } -} -*/ - -void BatchDialog::OnSaveBatchJob(wxCommandEvent& event) -{ - //get a filename - wxString defaultFileName = proposedBatchFileName.empty() ? wxT("SyncJob.ffs_batch") : proposedBatchFileName; - - //attention: proposedBatchFileName may be an imported *.ffs_gui file! We don't want to overwrite it with a BATCH config! - if (endsWith(defaultFileName, L".ffs_gui")) - replace(defaultFileName, L".ffs_gui", L".ffs_batch"); - - wxFileDialog filePicker(this, - wxEmptyString, - wxEmptyString, - defaultFileName, - _("FreeFileSync batch") + L" (*.ffs_batch)|*.ffs_batch" + L"|" +_("All files") + L" (*.*)|*", - wxFD_SAVE | wxFD_OVERWRITE_PROMPT); //creating this on freestore leads to memleak! - if (filePicker.ShowModal() == wxID_OK) - { - const wxString newFileName = filePicker.GetPath(); - - saveBatchFile(newFileName); - //if () - // EndModal(ReturnBatchConfig::BATCH_FILE_SAVED); - } -} - - -void BatchDialog::OnLoadBatchJob(wxCommandEvent& event) -{ - wxFileDialog filePicker(this, - wxEmptyString, - beforeLast(proposedBatchFileName, utfCvrtTo<wxString>(FILE_NAME_SEPARATOR)), //set default dir: empty string if "currentConfigFileName" is empty or has no path separator - wxEmptyString, - _("FreeFileSync batch") + L" (*.ffs_batch;*.ffs_gui)|*.ffs_batch;*.ffs_gui" + L"|" +_("All files") + L" (*.*)|*", - wxFD_OPEN | wxFD_MULTIPLE); //creating this on freestore leads to memleak! - if (filePicker.ShowModal() == wxID_OK) - { - wxArrayString tmp; - filePicker.GetPaths(tmp); - std::vector<wxString> fileNames(tmp.begin(), tmp.end()); - - loadBatchFile(fileNames); - } -} - - - -inline -FolderPairEnh getPairCfg(const DirectoryPairBatch& panel) -{ - return FolderPairEnh(toZ(panel.getLeftDir()), - toZ(panel.getRightDir()), - panel.getAltCompConfig(), - panel.getAltSyncConfig(), - panel.getAltFilterConfig()); -} - - -bool BatchDialog::saveBatchFile(const wxString& filename) -{ - const XmlBatchConfig batchCfg = getConfig(); - - //a good place to commit current "on completion" history item - m_comboBoxExecFinished->addItemHistory(); - - //write config to XML - try - { - writeConfig(batchCfg, toZ(filename)); - } - catch (const FfsXmlError& error) - { - wxMessageBox(error.toString().c_str(), _("Error"), wxOK | wxICON_ERROR, this); - return false; - } - - SetTitle(filename); - proposedBatchFileName = filename; //may be used on next save - - return true; -} - - -void BatchDialog::loadBatchFile(const wxString& filename) -{ - std::vector<wxString> filenames; - filenames.push_back(filename); - loadBatchFile(filenames); -} - - -void BatchDialog::loadBatchFile(const std::vector<wxString>& filenames) -{ - if (filenames.empty()) - return; - - //load XML settings - XmlBatchConfig batchCfg; //structure to receive gui settings - try - { - //open a *.ffs_gui or *.ffs_batch file! - mergeConfigs(toZ(filenames), batchCfg); //throw FfsXmlError - - //readConfig(filename, batchCfg); - } - catch (const FfsXmlError& error) - { - if (error.getSeverity() == FfsXmlError::WARNING) - wxMessageBox(error.toString(), _("Warning"), wxOK | wxICON_WARNING, this); - else - { - wxMessageBox(error.toString(), _("Error"), wxOK | wxICON_ERROR, this); - return; - } - } - - const wxString activeFile = filenames.size() == 1 ? filenames[0] : wxString(); - - if (activeFile.empty()) - SetTitle(_("Save as batch job")); - else - SetTitle(activeFile); - - proposedBatchFileName = activeFile; //may be used on next save - - setConfig(batchCfg); } @@ -587,7 +119,6 @@ void BatchDialog::setConfig(const XmlBatchConfig& batchCfg) localBatchCfg = batchCfg; //contains some parameters not owned by GUI controls //transfer parameter ownership to GUI - m_checkBoxShowProgress->SetValue(batchCfg.showProgress); logfileDir->setName(utfCvrtTo<wxString>(batchCfg.logFileDirectory)); m_comboBoxExecFinished->setValue(batchCfg.mainCfg.onCompletion); @@ -598,22 +129,7 @@ void BatchDialog::setConfig(const XmlBatchConfig& batchCfg) m_spinCtrlLogfileLimit ->SetValue(batchCfg.logfilesCountLimit >= 0 ? batchCfg.logfilesCountLimit : 100 /*XmlBatchConfig().logfilesCountLimit*/); //attention: emits a "change value" event!! => updateGui() called implicitly! - //set first folder pair - firstFolderPair->setValues(toWx(batchCfg.mainCfg.firstPair.leftDirectory), - toWx(batchCfg.mainCfg.firstPair.rightDirectory), - batchCfg.mainCfg.firstPair.altCmpConfig, - batchCfg.mainCfg.firstPair.altSyncConfig, - batchCfg.mainCfg.firstPair.localFilter); - - //set additional pairs - clearAddFolderPairs(); - addFolderPair(batchCfg.mainCfg.additionalPairs); - updateGui(); //re-evaluate gui after config changes - - Fit(); //needed - Refresh(); //needed - Centre(); } @@ -621,18 +137,7 @@ XmlBatchConfig BatchDialog::getConfig() const { XmlBatchConfig batchCfg = localBatchCfg; - //load parameter with ownership within wxWidgets controls... - - //first folder pair - batchCfg.mainCfg.firstPair = FolderPairEnh(toZ(firstFolderPair->getLeftDir()), - toZ(firstFolderPair->getRightDir()), - firstFolderPair->getAltCompConfig(), - firstFolderPair->getAltSyncConfig(), - firstFolderPair->getAltFilterConfig()); - //add additional pairs - batchCfg.mainCfg.additionalPairs.clear(); - std::transform(additionalFolderPairs.begin(), additionalFolderPairs.end(), - std::back_inserter(batchCfg.mainCfg.additionalPairs), [](const DirectoryPairBatch* dp) { return getPairCfg(*dp); }); + //load parameters with ownership within GIU controls... //load structure with batch settings "batchCfg" batchCfg.showProgress = m_checkBoxShowProgress->GetValue(); @@ -645,191 +150,20 @@ XmlBatchConfig BatchDialog::getConfig() const } -void BatchDialog::OnAddFolderPair(wxCommandEvent& event) -{ - wxWindowUpdateLocker dummy(this); //avoid display distortion - - std::vector<FolderPairEnh> newPairs; - newPairs.push_back(getConfig().mainCfg.firstPair); - - //clear first pair - const FolderPairEnh cfgEmpty; - firstFolderPair->setValues(toWx(cfgEmpty.leftDirectory), - toWx(cfgEmpty.rightDirectory), - cfgEmpty.altCmpConfig, - cfgEmpty.altSyncConfig, - cfgEmpty.localFilter); - - //keep sequence to update GUI as last step - addFolderPair(newPairs, true); //add pair in front of additonal pairs -} - - -void BatchDialog::OnRemoveFolderPair(wxCommandEvent& event) -{ - //find folder pair originating the event - const wxObject* const eventObj = event.GetEventObject(); - for (std::vector<DirectoryPairBatch*>::const_iterator i = additionalFolderPairs.begin(); i != additionalFolderPairs.end(); ++i) - { - if (eventObj == static_cast<wxObject*>((*i)->m_bpButtonRemovePair)) - { - removeAddFolderPair(i - additionalFolderPairs.begin()); - return; - } - } -} - - -void BatchDialog::OnRemoveTopFolderPair(wxCommandEvent& event) -{ - if (!additionalFolderPairs.empty()) - { - //get settings from second folder pair - const FolderPairEnh cfgSecond = getPairCfg(*additionalFolderPairs[0]); - - //reset first pair - firstFolderPair->setValues(toWx(cfgSecond.leftDirectory), - toWx(cfgSecond.rightDirectory), - cfgSecond.altCmpConfig, - cfgSecond.altSyncConfig, - cfgSecond.localFilter); - - removeAddFolderPair(0); //remove second folder pair (first of additional folder pairs) - } -} - - -void BatchDialog::updateGuiForFolderPair() -{ - //adapt delete top folder pair button - if (additionalFolderPairs.empty()) - m_bpButtonRemovePair->Hide(); - else - m_bpButtonRemovePair->Show(); - - //adapt local filter and sync cfg for first folder pair - const bool showLocalCfgFirstPair = !additionalFolderPairs.empty() || - firstFolderPair->getAltCompConfig().get() != nullptr || - firstFolderPair->getAltSyncConfig().get() != nullptr || - !isNullFilter(firstFolderPair->getAltFilterConfig()); - - m_bpButtonAltCompCfg ->Show(showLocalCfgFirstPair); - m_bpButtonAltSyncCfg ->Show(showLocalCfgFirstPair); - m_bpButtonLocalFilter->Show(showLocalCfgFirstPair); - - //update controls - const int maxAddFolderPairsVisible = 2; - - int pairHeight = sbSizerMainPair->GetSize().GetHeight(); //respect height of main pair - if (!additionalFolderPairs.empty()) - pairHeight += std::min<double>(maxAddFolderPairsVisible + 0.5, additionalFolderPairs.size()) * //have 0.5 * height indicate that more folders are there - additionalFolderPairs[0]->GetSize().GetHeight(); - - m_scrolledWindow6->SetMinSize(wxSize( -1, pairHeight)); - - - m_scrolledWindow6->Fit(); //adjust scrolled window size - m_scrolledWindow6->Layout(); //adjust scrolled window size - - //bSizerAddFolderPairs->FitInside(m_scrolledWindow6); //adjust scrolled window size - - m_panelOverview->Layout(); //adjust stuff inside scrolled window - //m_panelOverview->InvalidateBestSize(); //needed for Fit() to work correctly! - - if (m_scrolledWindow6->GetSize().GetHeight() < pairHeight) - Fit(); //adapt dialog size -} - - -void BatchDialog::addFolderPair(const std::vector<zen::FolderPairEnh>& newPairs, bool addFront) -{ - wxWindowUpdateLocker dummy(m_panelOverview); //avoid display distortion - - if (!newPairs.empty()) - { - //add folder pairs - for (std::vector<zen::FolderPairEnh>::const_iterator i = newPairs.begin(); i != newPairs.end(); ++i) - { - DirectoryPairBatch* newPair = new DirectoryPairBatch(m_scrolledWindow6, *this); //owned by m_scrolledWindow6! - - //init dropdown history - newPair->m_directoryLeft ->init(folderHistLeft_); - newPair->m_directoryRight->init(folderHistRight_); - - if (addFront) - { - bSizerAddFolderPairs->Insert(0, newPair, 0, wxEXPAND, 5); - additionalFolderPairs.insert(additionalFolderPairs.begin(), newPair); - } - else - { - bSizerAddFolderPairs->Add(newPair, 0, wxEXPAND, 5); - additionalFolderPairs.push_back(newPair); - } - - //register events - newPair->m_bpButtonRemovePair->Connect(wxEVT_COMMAND_BUTTON_CLICKED, wxCommandEventHandler(BatchDialog::OnRemoveFolderPair), nullptr, this ); - - //set alternate configuration - newPair->setValues(toWx(i->leftDirectory), - toWx(i->rightDirectory), - i->altCmpConfig, - i->altSyncConfig, - i->localFilter); - } - - //after changing folder pairs window focus is lost: results in scrolled window scrolling to top each time window is shown: we don't want this - m_bpButtonAddPair->SetFocus(); - } - - updateGuiForFolderPair(); - - updateGui(); //mainly to update sync dir description text -} - - -void BatchDialog::removeAddFolderPair(int pos) +void BatchDialog::OnSaveBatchJob(wxCommandEvent& event) { - wxWindowUpdateLocker dummy(m_panelOverview); //avoid display distortion - - if (0 <= pos && pos < static_cast<int>(additionalFolderPairs.size())) - { - //remove folder pairs from window - DirectoryPairBatch* pairToDelete = additionalFolderPairs[pos]; - - bSizerAddFolderPairs->Detach(pairToDelete); //Remove() does not work on Window*, so do it manually - pairToDelete->Destroy(); // - additionalFolderPairs.erase(additionalFolderPairs.begin() + pos); //remove last element in vector - - //after changing folder pairs window focus is lost: results in scrolled window scrolling to top each time window is shown: we don't want this - m_bpButtonRemovePair->SetFocus(); - } - - updateGuiForFolderPair(); - - updateGui(); //mainly to update sync dir description text + batchCfgOutRef = getConfig(); + m_comboBoxExecFinished->addItemHistory(); //a good place to commit current "on completion" history item + EndModal(BUTTON_SAVE_AS); } - - -void BatchDialog::clearAddFolderPairs() -{ - wxWindowUpdateLocker dummy(m_panelOverview); //avoid display distortion - - additionalFolderPairs.clear(); - bSizerAddFolderPairs->Clear(true); - - updateGuiForFolderPair(); } -void zen::showSyncBatchDlg(wxWindow* parent, - const wxString& referenceFile, - const XmlBatchConfig& batchCfg, - const std::shared_ptr<FolderHistory>& folderHistLeft, - const std::shared_ptr<FolderHistory>& folderHistRight, - std::vector<std::wstring>& execFinishedhistory, - size_t execFinishedhistoryMax) +bool zen::customizeBatchConfig(wxWindow* parent, + xmlAccess::XmlBatchConfig& batchCfg, //in/out + std::vector<std::wstring>& execFinishedhistory, + size_t execFinishedhistoryMax) { - BatchDialog batchDlg(parent, referenceFile, batchCfg, folderHistLeft, folderHistRight, execFinishedhistory, execFinishedhistoryMax); - batchDlg.ShowModal(); + BatchDialog batchDlg(parent, batchCfg, execFinishedhistory, execFinishedhistoryMax); + return static_cast<ButtonPressed>(batchDlg.ShowModal()) == BUTTON_SAVE_AS; } |