wxFD_PREVIEW implementation for wxGTK (slightly modified patch 1520690)

git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@40292 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
2006-07-24 23:48:06 +00:00
parent 3d3f3e3749
commit 9f057af5ef
5 changed files with 139 additions and 95 deletions

View File

@@ -244,6 +244,7 @@ wxGTK:
- Support underlined fonts in wxTextCtrl. - Support underlined fonts in wxTextCtrl.
- Support all border styles; wxListBox honours the borders now. - Support all border styles; wxListBox honours the borders now.
- wxWindow and wxScrolledWindow now generate line, page and thumb-release scroll events. - wxWindow and wxScrolledWindow now generate line, page and thumb-release scroll events.
- Added file preview support in file dialogs.
wxMac: wxMac:

View File

@@ -23,6 +23,7 @@ This class represents the file chooser dialog.
\twocolitem{{\windowstyle wxFD\_FILE\_MUST\_EXIST}}{For open dialog only: the user may only select files that actually exist.} \twocolitem{{\windowstyle wxFD\_FILE\_MUST\_EXIST}}{For open dialog only: the user may only select files that actually exist.}
\twocolitem{{\windowstyle wxFD\_MULTIPLE}}{For open dialog only: allows selecting multiple files.} \twocolitem{{\windowstyle wxFD\_MULTIPLE}}{For open dialog only: allows selecting multiple files.}
\twocolitem{{\windowstyle wxFD\_CHANGE\_DIR}}{Change the current working directory to the directory where the file(s) chosen by the user are.} \twocolitem{{\windowstyle wxFD\_CHANGE\_DIR}}{Change the current working directory to the directory where the file(s) chosen by the user are.}
\twocolitem{{\windowstyle wxFD\_PREVIEW}}{Show the preview of the selected files (currently only supported by wxGTK using GTK+ 2.4 or later).}
\end{twocollist} \end{twocollist}
{\bf NB:} Previous versions of wxWidgets used {\tt wxFD\_CHANGE\_DIR} by default {\bf NB:} Previous versions of wxWidgets used {\tt wxFD\_CHANGE\_DIR} by default

View File

@@ -30,7 +30,8 @@ enum
wxFD_OVERWRITE_PROMPT = 0x0004, wxFD_OVERWRITE_PROMPT = 0x0004,
wxFD_FILE_MUST_EXIST = 0x0010, wxFD_FILE_MUST_EXIST = 0x0010,
wxFD_MULTIPLE = 0x0020, wxFD_MULTIPLE = 0x0020,
wxFD_CHANGE_DIR = 0x0040 wxFD_CHANGE_DIR = 0x0040,
wxFD_PREVIEW = 0x0080
}; };
#if WXWIN_COMPATIBILITY_2_6 #if WXWIN_COMPATIBILITY_2_6

View File

@@ -729,7 +729,7 @@ void MyFrame::FileOpen2(wxCommandEvent& WXUNUSED(event) )
wxFileSelectorDefaultWildcardStr, wxFileSelectorDefaultWildcardStr,
wxFileSelectorDefaultWildcardStr wxFileSelectorDefaultWildcardStr
), ),
wxFD_OPEN|wxFD_CHANGE_DIR, wxFD_OPEN|wxFD_CHANGE_DIR|wxFD_PREVIEW,
this this
); );

View File

@@ -86,16 +86,16 @@ static void gtk_filedialog_ok_callback(GtkWidget *widget, wxFileDialog *dialog)
// "clicked" for Cancel-button // "clicked" for Cancel-button
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
extern "C" { extern "C"
{
static void gtk_filedialog_cancel_callback(GtkWidget *w, wxFileDialog *dialog) static void gtk_filedialog_cancel_callback(GtkWidget *w, wxFileDialog *dialog)
{ {
wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL); wxCommandEvent event(wxEVT_COMMAND_BUTTON_CLICKED, wxID_CANCEL);
event.SetEventObject(dialog); event.SetEventObject(dialog);
dialog->GetEventHandler()->ProcessEvent(event); dialog->GetEventHandler()->ProcessEvent(event);
} }
}
extern "C" {
static void gtk_filedialog_response_callback(GtkWidget *w, static void gtk_filedialog_response_callback(GtkWidget *w,
gint response, gint response,
wxFileDialog *dialog) wxFileDialog *dialog)
@@ -107,8 +107,32 @@ static void gtk_filedialog_response_callback(GtkWidget *w,
else // GTK_RESPONSE_CANCEL or GTK_RESPONSE_NONE else // GTK_RESPONSE_CANCEL or GTK_RESPONSE_NONE
gtk_filedialog_cancel_callback(w, dialog); gtk_filedialog_cancel_callback(w, dialog);
} }
static void gtk_filedialog_update_preview_callback(GtkFileChooser *chooser,
gpointer user_data)
{
#if GTK_CHECK_VERSION(2,4,0)
GtkWidget *preview = GTK_WIDGET(user_data);
wxGtkString filename(gtk_file_chooser_get_preview_filename(chooser));
if ( !filename )
return;
GdkPixbuf *pixbuf = gdk_pixbuf_new_from_file_at_size(filename, 128, 128, NULL);
gboolean have_preview = pixbuf != NULL;
gtk_image_set_from_pixbuf(GTK_IMAGE(preview), pixbuf);
if ( pixbuf )
g_object_unref (pixbuf);
gtk_file_chooser_set_preview_widget_active(chooser, have_preview);
#else
wxUnusedVar(chooser);
wxUnusedVar(user_data);
#endif // GTK+ 2.4+
} }
} // extern "C"
//----------------------------------------------------------------------------- //-----------------------------------------------------------------------------
// wxFileDialog // wxFileDialog
@@ -130,8 +154,13 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
: wxGenericFileDialog(parent, message, defaultDir, defaultFileName, : wxGenericFileDialog(parent, message, defaultDir, defaultFileName,
wildCard, style, pos, sz, name, true ) wildCard, style, pos, sz, name, true )
{ {
if (!gtk_check_version(2,4,0)) if (gtk_check_version(2,4,0))
{ {
wxGenericFileDialog::Create( parent, message, defaultDir,
defaultFileName, wildCard, style, pos );
return;
}
m_needParent = false; m_needParent = false;
if (!PreCreation(parent, pos, wxDefaultSize) || if (!PreCreation(parent, pos, wxDefaultSize) ||
@@ -206,7 +235,7 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(m_widget), TRUE); gtk_file_chooser_set_do_overwrite_confirmation(GTK_FILE_CHOOSER(m_widget), TRUE);
#endif #endif
} }
else else // wxFD_OPEN
{ {
if ( !defaultFileName.empty() ) if ( !defaultFileName.empty() )
{ {
@@ -221,12 +250,24 @@ wxFileDialog::wxFileDialog(wxWindow *parent, const wxString& message,
wxConvFileName->cWX2MB( wxFileName(dir, defaultFileName).GetFullPath() ) ); wxConvFileName->cWX2MB( wxFileName(dir, defaultFileName).GetFullPath() ) );
} }
else if ( !defaultDir.empty() ) else if ( !defaultDir.empty() )
{
gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(m_widget), gtk_file_chooser_set_current_folder( GTK_FILE_CHOOSER(m_widget),
wxConvFileName->cWX2MB(defaultDir) ); wxConvFileName->cWX2MB(defaultDir) );
} }
} }
else
wxGenericFileDialog::Create( parent, message, defaultDir, defaultFileName, wildCard, style, pos ); #if GTK_CHECK_VERSION(2,4,0)
if ( style & wxFD_PREVIEW )
{
GtkWidget *previewImage = gtk_image_new();
gtk_file_chooser_set_preview_widget(GTK_FILE_CHOOSER(m_widget),
previewImage);
g_signal_connect(m_widget, "update-preview",
G_CALLBACK(gtk_filedialog_update_preview_callback),
previewImage);
}
#endif // GTK+ 2.4+
} }
void wxFileDialog::OnFakeOk( wxCommandEvent &event ) void wxFileDialog::OnFakeOk( wxCommandEvent &event )