1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
// *****************************************************************************
// * This file is part of the FreeFileSync project. It is distributed under *
// * GNU General Public License: https://www.gnu.org/licenses/gpl-3.0 *
// * Copyright (C) Zenju (zenju AT freefilesync DOT org) - All Rights Reserved *
// *****************************************************************************
#ifndef FOLDER_SELECTOR_H_24857842375234523463425
#define FOLDER_SELECTOR_H_24857842375234523463425
#include <zen/zstring.h>
#include <wx/stattext.h>
#include <wx/button.h>
#include <wx+/file_drop.h>
#include "folder_history_box.h"
#include "../afs/abstract.h"
namespace fff
{
/* handle drag and drop, tooltip, label and manual input, coordinating a wxWindow, wxButton, and wxComboBox/wxTextCtrl
Reasons NOT to use wxDirPickerCtrl, but wxButton instead:
- Crash on GTK 2: https://favapps.wordpress.com/2012/06/11/freefilesync-crash-in-linux-when-syncing-solved/
- still uses outdated ::SHBrowseForFolder() (even on Windows 7)
- selection dialog remembers size, but NOT position => if user enlarges window, the next time he opens the dialog it may leap out of visible screen
- hard-codes "Browse" button label */
wxDECLARE_EVENT(EVENT_ON_FOLDER_SELECTED, wxCommandEvent); //directory is changed by the user, including manual type-in
//example: wnd.Bind(EVENT_ON_FOLDER_SELECTED, [this](wxCommandEvent& event) { onDirSelected(event); });
class FolderSelector: public wxEvtHandler
{
public:
FolderSelector(wxWindow* parent,
wxWindow& dropWindow,
wxButton& selectFolderButton,
wxButton& selectAltFolderButton,
FolderHistoryBox& folderComboBox,
Zstring& folderLastSelected, Zstring& sftpKeyFileLastSelected,
wxStaticText* staticText, //optional
wxWindow* dropWindow2, //
const std::function<bool (const std::vector<Zstring>& shellItemPaths)>& droppedPathsFilter, //optional
const std::function<size_t(const Zstring& folderPathPhrase)>& getDeviceParallelOps, //mandatory
const std::function<void (const Zstring& folderPathPhrase, size_t parallelOps)>& setDeviceParallelOps); //optional
~FolderSelector();
void setSiblingSelector(FolderSelector* selector) { siblingSelector_ = selector; }
void setPath(const Zstring& folderPathPhrase);
Zstring getPath() const;
private:
void onMouseWheel (wxMouseEvent& event);
void onItemPathDropped(zen::FileDropEvent& event);
void onEditFolderPath (wxCommandEvent& event);
void onSelectFolder (wxCommandEvent& event);
void onSelectAltFolder(wxCommandEvent& event);
const std::function<bool(const std::vector<Zstring>& shellItemPaths)> droppedPathsFilter_;
const std::function<size_t(const Zstring& folderPathPhrase)> getDeviceParallelOps_;
const std::function<void (const Zstring& folderPathPhrase, size_t parallelOps)> setDeviceParallelOps_;
wxWindow* parent_;
wxWindow& dropWindow_;
wxWindow* dropWindow2_ = nullptr; //
wxButton& selectFolderButton_;
wxButton& selectAltFolderButton_;
FolderHistoryBox& folderComboBox_;
Zstring& folderLastSelected_;
Zstring& sftpKeyFileLastSelected_;
wxStaticText* staticText_ = nullptr; //optional
FolderSelector* siblingSelector_ = nullptr; //
};
//abstract version of openWithDefaultApp()
void openFolderInFileBrowser(const AbstractPath& folderPath); //throw FileError
}
#endif //FOLDER_SELECTOR_H_24857842375234523463425
|