diff options
author | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:29:28 +0200 |
---|---|---|
committer | Daniel Wilhelm <daniel@wili.li> | 2014-04-18 17:29:28 +0200 |
commit | 75c07011b7c4d06acd7b45dabdcd60ab9d80f385 (patch) | |
tree | 8853c3978dd152ef377e652239448b1352320206 /ui/sync_cfg.cpp | |
parent | 5.22 (diff) | |
download | FreeFileSync-75c07011b7c4d06acd7b45dabdcd60ab9d80f385.tar.gz FreeFileSync-75c07011b7c4d06acd7b45dabdcd60ab9d80f385.tar.bz2 FreeFileSync-75c07011b7c4d06acd7b45dabdcd60ab9d80f385.zip |
5.23
Diffstat (limited to 'ui/sync_cfg.cpp')
-rw-r--r-- | ui/sync_cfg.cpp | 640 |
1 files changed, 0 insertions, 640 deletions
diff --git a/ui/sync_cfg.cpp b/ui/sync_cfg.cpp deleted file mode 100644 index 38e583fc..00000000 --- a/ui/sync_cfg.cpp +++ /dev/null @@ -1,640 +0,0 @@ -// ************************************************************************** -// * This file is part of the FreeFileSync project. It is distributed under * -// * GNU General Public License: http://www.gnu.org/licenses/gpl.html * -// * Copyright (C) Zenju (zenju AT gmx DOT de) - All Rights Reserved * -// ************************************************************************** - -#include "sync_cfg.h" -#include <memory> -//#include <zen/format_unit.h> -#include <wx/wupdlock.h> -#include <wx+/mouse_move_dlg.h> -#include <wx+/rtl.h> -#include <wx+/no_flicker.h> -#include <wx+/choice_enum.h> -#include <wx+/image_tools.h> -#include <wx+/font_size.h> -#include <wx+/std_button_order.h> -#include <wx+/popup_dlg.h> -#include <wx+/image_resources.h> -#include "gui_generated.h" -#include "exec_finished_box.h" -#include "dir_name.h" -#include "../file_hierarchy.h" -#include "../lib/help_provider.h" - -using namespace zen; -using namespace xmlAccess; - - -class SyncCfgDialog : public SyncCfgDlgGenerated -{ -public: - SyncCfgDialog(wxWindow* parent, - CompareVariant compareVar, - SyncConfig& syncCfg, - const wxString& caption, - xmlAccess::OnGuiError* handleError, // - ExecWhenFinishedCfg* execWhenFinished); //optional input parameter - -private: - virtual void OnSyncTwoWay(wxCommandEvent& event) { directionCfg.var = DirectionConfig::TWOWAY; updateGui(); } - virtual void OnSyncMirror(wxCommandEvent& event) { directionCfg.var = DirectionConfig::MIRROR; updateGui(); } - virtual void OnSyncUpdate(wxCommandEvent& event) { directionCfg.var = DirectionConfig::UPDATE; updateGui(); } - virtual void OnSyncCustom(wxCommandEvent& event) { directionCfg.var = DirectionConfig::CUSTOM; updateGui(); } - - virtual void OnToggleDetectMovedFiles(wxCommandEvent& event) { directionCfg.detectMovedFiles = !directionCfg.detectMovedFiles; updateGui(); } - - virtual void OnSyncTwoWayDouble(wxMouseEvent& event); - virtual void OnSyncMirrorDouble(wxMouseEvent& event); - virtual void OnSyncUpdateDouble(wxMouseEvent& event); - virtual void OnSyncCustomDouble(wxMouseEvent& event); - - virtual void OnExLeftSideOnly (wxCommandEvent& event); - virtual void OnExRightSideOnly(wxCommandEvent& event); - virtual void OnLeftNewer (wxCommandEvent& event); - virtual void OnRightNewer (wxCommandEvent& event); - virtual void OnDifferent (wxCommandEvent& event); - virtual void OnConflict (wxCommandEvent& event); - - virtual void OnClose (wxCloseEvent& event) { EndModal(ReturnSyncConfig::BUTTON_CANCEL); } - virtual void OnCancel(wxCommandEvent& event) { EndModal(ReturnSyncConfig::BUTTON_CANCEL); } - virtual void OnOkay (wxCommandEvent& event); - - virtual void OnParameterChange(wxCommandEvent& event) { updateGui(); } - - virtual void OnDeletionPermanent (wxCommandEvent& event) { handleDeletion = DELETE_PERMANENTLY; updateGui(); } - virtual void OnDeletionRecycler (wxCommandEvent& event) { handleDeletion = DELETE_TO_RECYCLER; updateGui(); } - virtual void OnDeletionVersioning (wxCommandEvent& event) { handleDeletion = DELETE_TO_VERSIONING; updateGui(); } - - virtual void OnErrorPopup (wxCommandEvent& event) { onGuiError = ON_GUIERROR_POPUP; updateGui(); } - virtual void OnErrorIgnore(wxCommandEvent& event) { onGuiError = ON_GUIERROR_IGNORE; updateGui(); } - - virtual void OnHelpVersioning(wxHyperlinkEvent& event) { displayHelpEntry(L"html/Versioning.html", this); } - - struct Config - { - SyncConfig syncCfg; - xmlAccess::OnGuiError onGuiError; - std::wstring onCompletion; - }; - void setConfig(const Config& cfg); - Config getConfig() const; - - void updateGui(); - - //parameters with ownership NOT within GUI controls! - DirectionConfig directionCfg; - DeletionPolicy handleDeletion; //use Recycler, delete permanently or move to user-defined location - OnGuiError onGuiError; - - //output data - SyncConfig& outSyncCfg; - xmlAccess::OnGuiError* outOptOnGuiError; - ExecWhenFinishedCfg* outOptExecWhenFinished; - - CompareVariant compareVar_; - DirectoryName<FolderHistoryBox> versioningFolder; - - EnumDescrList<VersioningStyle> enumVersioningStyle; -}; - - -void updateConfigIcons(const DirectionConfig& directionCfg, - wxBitmapButton* buttonLeftOnly, - wxBitmapButton* buttonRightOnly, - wxBitmapButton* buttonLeftNewer, - wxBitmapButton* buttonRightNewer, - wxBitmapButton* buttonDifferent, - wxBitmapButton* buttonConflict) -{ - if (directionCfg.var != DirectionConfig::TWOWAY) //automatic mode needs no sync-directions - { - const DirectionSet dirCfg = extractDirections(directionCfg); - - switch (dirCfg.exLeftSideOnly) - { - case SyncDirection::RIGHT: - buttonLeftOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_create_right"))); - buttonLeftOnly->SetToolTip(getSyncOpDescription(SO_CREATE_NEW_RIGHT)); - break; - case SyncDirection::LEFT: - buttonLeftOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_delete_left"))); - buttonLeftOnly->SetToolTip(getSyncOpDescription(SO_DELETE_LEFT)); - break; - case SyncDirection::NONE: - buttonLeftOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_none"))); - buttonLeftOnly->SetToolTip(getSyncOpDescription(SO_DO_NOTHING)); - break; - } - - switch (dirCfg.exRightSideOnly) - { - case SyncDirection::RIGHT: - buttonRightOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_delete_right"))); - buttonRightOnly->SetToolTip(getSyncOpDescription(SO_DELETE_RIGHT)); - break; - case SyncDirection::LEFT: - buttonRightOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_create_left"))); - buttonRightOnly->SetToolTip(getSyncOpDescription(SO_CREATE_NEW_LEFT)); - break; - case SyncDirection::NONE: - buttonRightOnly->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_none"))); - buttonRightOnly->SetToolTip(getSyncOpDescription(SO_DO_NOTHING)); - break; - } - - switch (dirCfg.leftNewer) - { - case SyncDirection::RIGHT: - buttonLeftNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_right"))); - buttonLeftNewer->SetToolTip(getSyncOpDescription(SO_OVERWRITE_RIGHT)); - break; - case SyncDirection::LEFT: - buttonLeftNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_left"))); - buttonLeftNewer->SetToolTip(getSyncOpDescription(SO_OVERWRITE_LEFT)); - break; - case SyncDirection::NONE: - buttonLeftNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_none"))); - buttonLeftNewer->SetToolTip(getSyncOpDescription(SO_DO_NOTHING)); - break; - } - - switch (dirCfg.rightNewer) - { - case SyncDirection::RIGHT: - buttonRightNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_right"))); - buttonRightNewer->SetToolTip(getSyncOpDescription(SO_OVERWRITE_RIGHT)); - break; - case SyncDirection::LEFT: - buttonRightNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_left"))); - buttonRightNewer->SetToolTip(getSyncOpDescription(SO_OVERWRITE_LEFT)); - break; - case SyncDirection::NONE: - buttonRightNewer->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_none"))); - buttonRightNewer->SetToolTip(getSyncOpDescription(SO_DO_NOTHING)); - break; - } - - switch (dirCfg.different) - { - case SyncDirection::RIGHT: - buttonDifferent->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_right"))); - buttonDifferent->SetToolTip(getSyncOpDescription(SO_OVERWRITE_RIGHT)); - break; - case SyncDirection::LEFT: - buttonDifferent->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_left"))); - buttonDifferent->SetToolTip(getSyncOpDescription(SO_OVERWRITE_LEFT)); - break; - case SyncDirection::NONE: - buttonDifferent->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_none"))); - buttonDifferent->SetToolTip(getSyncOpDescription(SO_DO_NOTHING)); - break; - } - - switch (dirCfg.conflict) - { - case SyncDirection::RIGHT: - buttonConflict->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_right"))); - buttonConflict->SetToolTip(getSyncOpDescription(SO_OVERWRITE_RIGHT)); - break; - case SyncDirection::LEFT: - buttonConflict->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"so_update_left"))); - buttonConflict->SetToolTip(getSyncOpDescription(SO_OVERWRITE_LEFT)); - break; - case SyncDirection::NONE: - buttonConflict->SetBitmapLabel(mirrorIfRtl(getResourceImage(L"cat_conflict"))); //silent dependency to algorithm.cpp::Redetermine!!! - buttonConflict->SetToolTip(_("Leave as unresolved conflict")); - break; - } - } -} - - -SyncCfgDialog::SyncCfgDialog(wxWindow* parent, - CompareVariant compareVar, - SyncConfig& syncCfg, - const wxString& title, - xmlAccess::OnGuiError* handleError, - ExecWhenFinishedCfg* execWhenFinished) : - SyncCfgDlgGenerated(parent), - handleDeletion(DELETE_TO_RECYCLER), // - onGuiError(ON_GUIERROR_POPUP), //dummy init - outSyncCfg(syncCfg), - outOptOnGuiError(handleError), - outOptExecWhenFinished(execWhenFinished), - compareVar_(compareVar), - versioningFolder(*m_panelVersioning, *m_buttonSelectDirVersioning, *m_versioningFolder/*, m_staticTextResolvedPath*/) -{ -#ifdef ZEN_WIN - new zen::MouseMoveWindow(*this); //allow moving main dialog by clicking (nearly) anywhere...; ownership passed to "this" -#endif - setStandardButtonOrder(*bSizerStdButtons, StdButtons().setAffirmative(m_buttonOK).setCancel(m_buttonCancel)); - - SetTitle(title); - - //set icons for this dialog - m_bitmapLeftOnly ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_left_only" )))); - m_bitmapRightOnly ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_right_only" )))); - m_bitmapLeftNewer ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_left_newer" )))); - m_bitmapRightNewer->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_right_newer")))); - m_bitmapDifferent ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_different" )))); - m_bitmapConflict ->SetBitmap(mirrorIfRtl(greyScale(getResourceImage(L"cat_conflict" )))); - m_bitmapDatabase ->SetBitmap(getResourceImage(L"database")); - - m_toggleBtnTwoWay->SetLabel(L"<- " + _("Two way") + L" ->"); - m_toggleBtnMirror->SetLabel( _("Mirror") + L" ->>"); - m_toggleBtnUpdate->SetLabel( _("Update") + L" ->"); - - setRelativeFontSize(*m_toggleBtnTwoWay, 1.25); - setRelativeFontSize(*m_toggleBtnMirror, 1.25); - setRelativeFontSize(*m_toggleBtnUpdate, 1.25); - setRelativeFontSize(*m_toggleBtnCustom, 1.25); - - enumVersioningStyle. - add(VER_STYLE_REPLACE, _("Replace"), _("Move files and replace if existing")). - add(VER_STYLE_ADD_TIMESTAMP, _("Time stamp"), _("Append a timestamp to each file name")); - - //hide controls for optional parameters - if (!handleError && !execWhenFinished) //currently either both or neither are bound! - { - bSizerExtraConfig->Show(false); - Layout(); - } - - if (execWhenFinished) - m_comboBoxExecFinished->initHistory(*execWhenFinished->history, execWhenFinished->historyMax); - - Config newCfg = { syncCfg, - handleError ?* handleError : ON_GUIERROR_POPUP, - execWhenFinished ?* execWhenFinished->command : std::wstring() - }; - setConfig(newCfg); - - GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() - //=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!! - - m_buttonOK->SetFocus(); -} - -//################################################################################################################# - -void SyncCfgDialog::setConfig(const Config& cfg) -{ - directionCfg = cfg.syncCfg.directionCfg; //make working copy; ownership *not* on GUI - handleDeletion = cfg.syncCfg.handleDeletion; - - versioningFolder.setName(utfCvrtTo<wxString>(cfg.syncCfg.versioningDirectory)); - setEnumVal(enumVersioningStyle, *m_choiceVersioningStyle, cfg.syncCfg.versioningStyle); - - ////map single parameter "version limit" to both checkbox and spin ctrl: - //m_checkBoxVersionsLimit->SetValue(cfg.syncCfg.versionCountLimit >= 0); - //m_spinCtrlVersionsLimit->SetValue(cfg.syncCfg.versionCountLimit >= 0 ? cfg.syncCfg.versionCountLimit : 10 /*SyncConfig().versionCountLimit*/); - - onGuiError = cfg.onGuiError; - - m_comboBoxExecFinished->setValue(cfg.onCompletion); - - updateGui(); -} - - -SyncCfgDialog::Config SyncCfgDialog::getConfig() const -{ - Config output; - - //write configuration to main dialog - output.syncCfg.directionCfg = directionCfg; - output.syncCfg.handleDeletion = handleDeletion; - output.syncCfg.versioningDirectory = utfCvrtTo<Zstring>(versioningFolder.getName()); - output.syncCfg.versioningStyle = getEnumVal(enumVersioningStyle, *m_choiceVersioningStyle), - - //get single parameter "version limit" from both checkbox and spin ctrl: - // output.syncCfg.versionCountLimit = m_checkBoxVersionsLimit->GetValue() ? m_spinCtrlVersionsLimit->GetValue() : -1; - - output.onGuiError = onGuiError; - - output.onCompletion = m_comboBoxExecFinished->getValue(); - return output; -} - - -void SyncCfgDialog::updateGui() -{ -#ifdef ZEN_WIN - wxWindowUpdateLocker dummy(this); //leads to GUI corruption problems on Linux/OS X! - wxWindowUpdateLocker dummy2(m_panelVersioning); - wxWindowUpdateLocker dummy3(m_bpButtonLeftOnly); - wxWindowUpdateLocker dummy4(m_bpButtonRightOnly); - wxWindowUpdateLocker dummy5(m_bpButtonLeftNewer); - wxWindowUpdateLocker dummy6(m_bpButtonRightNewer); - wxWindowUpdateLocker dummy7(m_bpButtonDifferent); - wxWindowUpdateLocker dummy8(m_bpButtonConflict); -#endif - - const Config cfg = getConfig(); //resolve parameter ownership: some on GUI controls, others member variables - - updateConfigIcons(cfg.syncCfg.directionCfg, - m_bpButtonLeftOnly, - m_bpButtonRightOnly, - m_bpButtonLeftNewer, - m_bpButtonRightNewer, - m_bpButtonDifferent, - m_bpButtonConflict); - - //selecting "detect move files" does not always make sense: - m_checkBoxDetectMove->Enable(detectMovedFilesSelectable(directionCfg)); - m_checkBoxDetectMove->SetValue(detectMovedFilesEnabled(directionCfg)); //parameter NOT owned by checkbox! - - //display only relevant sync options - m_bitmapDatabase ->Show(cfg.syncCfg.directionCfg.var == DirectionConfig::TWOWAY); - sbSizerSyncDirections->Show(cfg.syncCfg.directionCfg.var != DirectionConfig::TWOWAY); - - switch (compareVar_) //sbSizerSyncDirections->Show resets child sizers! - { - case CMP_BY_TIME_SIZE: - bSizerDifferent ->Show(false); - break; - - case CMP_BY_CONTENT: - bSizerLeftNewer ->Show(false); - bSizerRightNewer->Show(false); - break; - } - bSizerConfig->Layout(); //[!] - - //update toggle buttons -> they have no parameter-ownership at all! - m_staticTextAutomatic->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); - m_staticTextMirror ->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); - m_staticTextUpdate ->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); - m_staticTextCustom ->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_GRAYTEXT)); - - m_toggleBtnTwoWay->SetValue(false); - m_toggleBtnMirror->SetValue(false); - m_toggleBtnUpdate->SetValue(false); - m_toggleBtnCustom->SetValue(false); - - switch (cfg.syncCfg.directionCfg.var) - { - case DirectionConfig::TWOWAY: - m_toggleBtnTwoWay->SetValue(true); - m_staticTextAutomatic->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); - break; - case DirectionConfig::MIRROR: - m_toggleBtnMirror->SetValue(true); - m_staticTextMirror->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); - break; - case DirectionConfig::UPDATE: - m_toggleBtnUpdate->SetValue(true); - m_staticTextUpdate->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); - break; - case DirectionConfig::CUSTOM: - m_toggleBtnCustom->SetValue(true); - m_staticTextCustom->SetForegroundColour(wxSystemSettings::GetColour(wxSYS_COLOUR_WINDOWTEXT)); - break; - } - - m_toggleBtnPermanent ->SetValue(false); - m_toggleBtnRecycler ->SetValue(false); - m_toggleBtnVersioning->SetValue(false); - switch (cfg.syncCfg.handleDeletion) - { - case DELETE_PERMANENTLY: - m_toggleBtnPermanent->SetValue(true); - break; - case DELETE_TO_RECYCLER: - m_toggleBtnRecycler->SetValue(true); - break; - case DELETE_TO_VERSIONING: - m_toggleBtnVersioning->SetValue(true); - break; - } - - const bool versioningSelected = cfg.syncCfg.handleDeletion == DELETE_TO_VERSIONING; - m_panelVersioning->Show(versioningSelected); - - if (versioningSelected) - { - updateTooltipEnumVal(enumVersioningStyle, *m_choiceVersioningStyle); - - const std::wstring pathSep = utfCvrtTo<std::wstring>(FILE_NAME_SEPARATOR); - switch (cfg.syncCfg.versioningStyle) - { - case VER_STYLE_REPLACE: - setText(*m_staticTextNamingCvtPart1, pathSep + _("Folder") + pathSep + _("File") + L".doc"); - setText(*m_staticTextNamingCvtPart2Bold, L""); - setText(*m_staticTextNamingCvtPart3, L""); - break; - - case VER_STYLE_ADD_TIMESTAMP: - setText(*m_staticTextNamingCvtPart1, pathSep + _("Folder") + pathSep + _("File") + L".doc "); - setText(*m_staticTextNamingCvtPart2Bold, _("YYYY-MM-DD hhmmss")); - setText(*m_staticTextNamingCvtPart3, L".doc"); - break; - } - } - - //m_spinCtrlVersionsLimit->Enable(m_checkBoxVersionsLimit->GetValue()); //enabled status is *not* directly dependent from resolved config! (but transitively) - - m_toggleBtnErrorIgnore->SetValue(false); - m_toggleBtnErrorPopup ->SetValue(false); - switch (cfg.onGuiError) - { - case ON_GUIERROR_IGNORE: - m_toggleBtnErrorIgnore->SetValue(true); - break; - case ON_GUIERROR_POPUP: - m_toggleBtnErrorPopup->SetValue(true); - break; - } - - Layout(); - Refresh(); //removes a few artifacts when toggling display of versioning folder - - GetSizer()->SetSizeHints(this); //~=Fit() + SetMinSize() - //=> works like a charm for GTK2 with window resizing problems and title bar corruption; e.g. Debian!!! -} - - -void SyncCfgDialog::OnOkay(wxCommandEvent& event) -{ - const Config cfg = getConfig(); - - //parameter validation: - - //check if user-defined directory for deletion was specified - if (cfg.syncCfg.handleDeletion == zen::DELETE_TO_VERSIONING) - { - Zstring versioningDir = cfg.syncCfg.versioningDirectory; - trim(versioningDir); - if (versioningDir.empty()) - { - showNotificationDialog(this, DialogInfoType::INFO, PopupDialogCfg().setMainInstructions(_("Please enter a target folder for versioning."))); - //don't show error icon to follow "Windows' encouraging tone" - m_panelVersioning->SetFocus(); - return; - } - } - - //apply config: - outSyncCfg = cfg.syncCfg; - - if (outOptOnGuiError) - *outOptOnGuiError = cfg.onGuiError; - - if (outOptExecWhenFinished) - { - *outOptExecWhenFinished->command = cfg.onCompletion; - //a good place to commit current "on completion" history item - m_comboBoxExecFinished->addItemHistory(); - } - - EndModal(ReturnSyncConfig::BUTTON_OKAY); -} - - -void SyncCfgDialog::OnSyncTwoWayDouble(wxMouseEvent& event) -{ - wxCommandEvent dummy; - OnSyncTwoWay(dummy); - OnOkay(dummy); -} - -void SyncCfgDialog::OnSyncMirrorDouble(wxMouseEvent& event) -{ - wxCommandEvent dummy; - OnSyncMirror(dummy); - OnOkay(dummy); -} - -void SyncCfgDialog::OnSyncUpdateDouble(wxMouseEvent& event) -{ - wxCommandEvent dummy; - OnSyncUpdate(dummy); - OnOkay(dummy); -} - -void SyncCfgDialog::OnSyncCustomDouble(wxMouseEvent& event) -{ - wxCommandEvent dummy; - OnSyncCustom(dummy); - OnOkay(dummy); -} - -namespace -{ -void toggleSyncDirection(SyncDirection& current) -{ - switch (current) - { - case SyncDirection::RIGHT: - current = SyncDirection::LEFT; - break; - case SyncDirection::LEFT: - current = SyncDirection::NONE; - break; - case SyncDirection::NONE: - current = SyncDirection::RIGHT; - break; - } -} - - -void pressCustomDir(DirectionConfig& directionCfg, SyncDirection& syncdir) -{ - switch (directionCfg.var) - { - case DirectionConfig::TWOWAY: - assert(false); - break; - case DirectionConfig::MIRROR: - case DirectionConfig::UPDATE: - directionCfg.custom = extractDirections(directionCfg); - directionCfg.var = DirectionConfig::CUSTOM; - toggleSyncDirection(syncdir); - break; - case DirectionConfig::CUSTOM: - toggleSyncDirection(syncdir); - - //some config optimization: if custom settings happen to match "mirror" or "update", just switch variant - const DirectionSet setMirror = [] - { - DirectionConfig mirrorCfg; - mirrorCfg.var = DirectionConfig::MIRROR; - return extractDirections(mirrorCfg); - }(); - - const DirectionSet setUpdate = [] - { - DirectionConfig updateCfg; - updateCfg.var = DirectionConfig::UPDATE; - return extractDirections(updateCfg); - }(); - - const DirectionSet currentSet = extractDirections(directionCfg); - if (currentSet == setMirror) - directionCfg.var = DirectionConfig::MIRROR; - else if (currentSet == setUpdate) - directionCfg.var = DirectionConfig::UPDATE; - break; - } -} -} - -void SyncCfgDialog::OnExLeftSideOnly(wxCommandEvent& event ) -{ - pressCustomDir(directionCfg, directionCfg.custom.exLeftSideOnly); - updateGui(); -} - - -void SyncCfgDialog::OnExRightSideOnly(wxCommandEvent& event ) -{ - pressCustomDir(directionCfg, directionCfg.custom.exRightSideOnly); - updateGui(); -} - - -void SyncCfgDialog::OnLeftNewer(wxCommandEvent& event ) -{ - pressCustomDir(directionCfg, directionCfg.custom.leftNewer); - updateGui(); -} - - -void SyncCfgDialog::OnRightNewer(wxCommandEvent& event ) -{ - pressCustomDir(directionCfg, directionCfg.custom.rightNewer); - updateGui(); -} - - -void SyncCfgDialog::OnDifferent(wxCommandEvent& event ) -{ - pressCustomDir(directionCfg, directionCfg.custom.different); - updateGui(); -} - - -void SyncCfgDialog::OnConflict(wxCommandEvent& event) -{ - pressCustomDir(directionCfg, directionCfg.custom.conflict); - updateGui(); -} - - -ReturnSyncConfig::ButtonPressed zen::showSyncConfigDlg(wxWindow* parent, - CompareVariant compareVar, - SyncConfig& syncCfg, - const wxString& title, - xmlAccess::OnGuiError* handleError, // - ExecWhenFinishedCfg* execWhenFinished) //optional input parameter -{ - SyncCfgDialog syncDlg(parent, - compareVar, - syncCfg, - title, - handleError, - execWhenFinished); - return static_cast<ReturnSyncConfig::ButtonPressed>(syncDlg.ShowModal()); -} |