Add wxDD_MULTIPLE wxDirDialog style and implement it for GTK
Add wxDirDialog::GetPaths() similar to the existing member of wxFileDialog with the same name and also taking, for consistency, wxArrayString as the output parameter.
This commit is contained in:
committed by
Vadim Zeitlin
parent
fa6680be4d
commit
f9e9b19c92
@@ -25,8 +25,21 @@ extern WXDLLIMPEXP_DATA_CORE(const char) wxDirDialogNameStr[];
|
|||||||
extern WXDLLIMPEXP_DATA_CORE(const char) wxDirDialogDefaultFolderStr[];
|
extern WXDLLIMPEXP_DATA_CORE(const char) wxDirDialogDefaultFolderStr[];
|
||||||
extern WXDLLIMPEXP_DATA_CORE(const char) wxDirSelectorPromptStr[];
|
extern WXDLLIMPEXP_DATA_CORE(const char) wxDirSelectorPromptStr[];
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
The flags below must coexist with the following flags in m_windowStyle
|
||||||
|
#define wxCAPTION 0x20000000
|
||||||
|
#define wxMAXIMIZE 0x00002000
|
||||||
|
#define wxCLOSE_BOX 0x00001000
|
||||||
|
#define wxSYSTEM_MENU 0x00000800
|
||||||
|
wxBORDER_NONE = 0x00200000
|
||||||
|
#define wxRESIZE_BORDER 0x00000040
|
||||||
|
#define wxDIALOG_NO_PARENT 0x00000020
|
||||||
|
*/
|
||||||
|
|
||||||
#define wxDD_CHANGE_DIR 0x0100
|
#define wxDD_CHANGE_DIR 0x0100
|
||||||
#define wxDD_DIR_MUST_EXIST 0x0200
|
#define wxDD_DIR_MUST_EXIST 0x0200
|
||||||
|
#define wxDD_MULTIPLE 0x0400
|
||||||
|
|
||||||
// deprecated, on by default now, use wxDD_DIR_MUST_EXIST to disable it
|
// deprecated, on by default now, use wxDD_DIR_MUST_EXIST to disable it
|
||||||
#define wxDD_NEW_DIR_BUTTON 0
|
#define wxDD_NEW_DIR_BUTTON 0
|
||||||
@@ -75,6 +88,7 @@ public:
|
|||||||
|
|
||||||
virtual wxString GetMessage() const { return m_message; }
|
virtual wxString GetMessage() const { return m_message; }
|
||||||
virtual wxString GetPath() const { return m_path; }
|
virtual wxString GetPath() const { return m_path; }
|
||||||
|
virtual void GetPaths(wxArrayString& paths) const { paths.Empty(); paths.Add(m_path); }
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
wxString m_message;
|
wxString m_message;
|
||||||
|
@@ -39,6 +39,7 @@ public: // overrides from wxGenericDirDialog
|
|||||||
|
|
||||||
wxString GetPath() const wxOVERRIDE;
|
wxString GetPath() const wxOVERRIDE;
|
||||||
void SetPath(const wxString& path) wxOVERRIDE;
|
void SetPath(const wxString& path) wxOVERRIDE;
|
||||||
|
void GetPaths(wxArrayString& paths) const wxOVERRIDE;
|
||||||
|
|
||||||
|
|
||||||
// Implementation only.
|
// Implementation only.
|
||||||
@@ -55,7 +56,7 @@ protected:
|
|||||||
|
|
||||||
|
|
||||||
private:
|
private:
|
||||||
wxString m_selectedDirectory;
|
wxArrayString m_paths;
|
||||||
|
|
||||||
wxDECLARE_DYNAMIC_CLASS(wxDirDialog);
|
wxDECLARE_DYNAMIC_CLASS(wxDirDialog);
|
||||||
};
|
};
|
||||||
|
@@ -7,6 +7,8 @@
|
|||||||
|
|
||||||
#define wxDD_CHANGE_DIR 0x0100
|
#define wxDD_CHANGE_DIR 0x0100
|
||||||
#define wxDD_DIR_MUST_EXIST 0x0200
|
#define wxDD_DIR_MUST_EXIST 0x0200
|
||||||
|
#define wxDD_MULTIPLE 0x0400
|
||||||
|
|
||||||
#define wxDD_NEW_DIR_BUTTON 0 // deprecated, on by default now,
|
#define wxDD_NEW_DIR_BUTTON 0 // deprecated, on by default now,
|
||||||
|
|
||||||
#define wxDD_DEFAULT_STYLE (wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
|
#define wxDD_DEFAULT_STYLE (wxDEFAULT_DIALOG_STYLE|wxRESIZE_BORDER)
|
||||||
@@ -43,6 +45,11 @@ const char wxDirDialogNameStr[] = "wxDirCtrl";
|
|||||||
@style{wxDD_CHANGE_DIR}
|
@style{wxDD_CHANGE_DIR}
|
||||||
Change the current working directory to the directory chosen by the
|
Change the current working directory to the directory chosen by the
|
||||||
user.
|
user.
|
||||||
|
@note This flag cannot be used with the @c wxDD_MULTIPLE style.
|
||||||
|
@style{wxDD_MULTIPLE}
|
||||||
|
Allow the user to select multiple directories.
|
||||||
|
This flag is only available since wxWidgets 3.1.4
|
||||||
|
|
||||||
@endStyleTable
|
@endStyleTable
|
||||||
|
|
||||||
Notice that @c wxRESIZE_BORDER has special side effect under Windows
|
Notice that @c wxRESIZE_BORDER has special side effect under Windows
|
||||||
@@ -109,6 +116,16 @@ public:
|
|||||||
*/
|
*/
|
||||||
virtual wxString GetPath() const;
|
virtual wxString GetPath() const;
|
||||||
|
|
||||||
|
/**
|
||||||
|
Fills the array @a paths with the full paths of the chosen directories.
|
||||||
|
|
||||||
|
@note This function should only be used with the dialogs which have @c wxDD_MULTIPLE style,
|
||||||
|
use GetPath() for the others.
|
||||||
|
|
||||||
|
@since 3.1.4
|
||||||
|
*/
|
||||||
|
virtual void GetPaths(wxArrayString& paths) const;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
Sets the message that will be displayed on the dialog.
|
Sets the message that will be displayed on the dialog.
|
||||||
*/
|
*/
|
||||||
|
@@ -71,6 +71,9 @@ bool wxDirDialog::Create(wxWindow* parent,
|
|||||||
{
|
{
|
||||||
m_message = title;
|
m_message = title;
|
||||||
|
|
||||||
|
wxASSERT_MSG( !( (style & wxDD_MULTIPLE) && (style & wxDD_CHANGE_DIR) ),
|
||||||
|
"wxDD_CHANGE_DIR can't be used together with wxDD_MULTIPLE" );
|
||||||
|
|
||||||
parent = GetParentForModalDialog(parent, style);
|
parent = GetParentForModalDialog(parent, style);
|
||||||
|
|
||||||
if (!PreCreation(parent, pos, wxDefaultSize) ||
|
if (!PreCreation(parent, pos, wxDefaultSize) ||
|
||||||
@@ -110,10 +113,15 @@ bool wxDirDialog::Create(wxWindow* parent,
|
|||||||
if (wx_is_at_least_gtk2(18))
|
if (wx_is_at_least_gtk2(18))
|
||||||
{
|
{
|
||||||
gtk_file_chooser_set_create_folders(
|
gtk_file_chooser_set_create_folders(
|
||||||
GTK_FILE_CHOOSER(m_widget), (style & wxDD_DIR_MUST_EXIST) == 0);
|
GTK_FILE_CHOOSER(m_widget), !HasFlag(wxDD_DIR_MUST_EXIST) );
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// Enable multiple selection if desired
|
||||||
|
gtk_file_chooser_set_select_multiple(
|
||||||
|
GTK_FILE_CHOOSER(m_widget), HasFlag(wxDD_MULTIPLE) );
|
||||||
|
|
||||||
|
|
||||||
// local-only property could be set to false to allow non-local files to be loaded.
|
// local-only property could be set to false to allow non-local files to be loaded.
|
||||||
// In that case get/set_uri(s) should be used instead of get/set_filename(s) everywhere
|
// In that case get/set_uri(s) should be used instead of get/set_filename(s) everywhere
|
||||||
// and the GtkFileChooserDialog should probably also be created with a backend,
|
// and the GtkFileChooserDialog should probably also be created with a backend,
|
||||||
@@ -132,13 +140,24 @@ bool wxDirDialog::Create(wxWindow* parent,
|
|||||||
|
|
||||||
void wxDirDialog::GTKOnAccept()
|
void wxDirDialog::GTKOnAccept()
|
||||||
{
|
{
|
||||||
wxGtkString str(gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(m_widget)));
|
GSList *fnamesi = gtk_file_chooser_get_filenames(GTK_FILE_CHOOSER(m_widget));
|
||||||
m_selectedDirectory = wxString::FromUTF8(str);
|
GSList *fnames = fnamesi;
|
||||||
|
|
||||||
|
while ( fnamesi )
|
||||||
|
{
|
||||||
|
wxString dir(wxString::FromUTF8(static_cast<gchar *>(fnamesi->data)));
|
||||||
|
m_paths.Add(dir);
|
||||||
|
|
||||||
|
g_free(fnamesi->data);
|
||||||
|
fnamesi = fnamesi->next;
|
||||||
|
}
|
||||||
|
|
||||||
|
g_slist_free(fnames);
|
||||||
|
|
||||||
// change to the directory where the user went if asked
|
// change to the directory where the user went if asked
|
||||||
if (HasFlag(wxDD_CHANGE_DIR))
|
if (HasFlag(wxDD_CHANGE_DIR))
|
||||||
{
|
{
|
||||||
wxSetWorkingDirectory(m_selectedDirectory);
|
wxSetWorkingDirectory(m_paths.Last());
|
||||||
}
|
}
|
||||||
|
|
||||||
EndDialog(wxID_OK);
|
EndDialog(wxID_OK);
|
||||||
@@ -168,7 +187,13 @@ void wxDirDialog::SetPath(const wxString& dir)
|
|||||||
|
|
||||||
wxString wxDirDialog::GetPath() const
|
wxString wxDirDialog::GetPath() const
|
||||||
{
|
{
|
||||||
return m_selectedDirectory;
|
return m_paths.Last();
|
||||||
|
}
|
||||||
|
|
||||||
|
void wxDirDialog::GetPaths(wxArrayString& paths) const
|
||||||
|
{
|
||||||
|
paths.Empty();
|
||||||
|
paths = m_paths;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif // wxUSE_DIRDLG
|
#endif // wxUSE_DIRDLG
|
||||||
|
Reference in New Issue
Block a user