From c2cff39bc5a82c20d4fecf233a405e671e0901ec Mon Sep 17 00:00:00 2001 From: Cheng Zhao Date: Thu, 13 Mar 2014 12:58:27 +0800 Subject: [PATCH] gtk: Initial implementation of save dialog. --- browser/ui/file_dialog_gtk.cc | 66 ++++++++++++++++++++++++++++++++++- 1 file changed, 65 insertions(+), 1 deletion(-) diff --git a/browser/ui/file_dialog_gtk.cc b/browser/ui/file_dialog_gtk.cc index 1b47e0e440..5ffe2d6504 100644 --- a/browser/ui/file_dialog_gtk.cc +++ b/browser/ui/file_dialog_gtk.cc @@ -5,9 +5,71 @@ #include "browser/ui/file_dialog.h" #include "base/callback.h" +#include "browser/native_window.h" +#include "browser/ui/gtk/gtk_util.h" +#include "ui/base/gtk/gtk_signal.h" namespace file_dialog { +namespace { + +class FileChooserDialog { + public: + FileChooserDialog(GtkFileChooserAction action, + atom::NativeWindow* parent_window, + const std::string& title, + const base::FilePath& default_path) { + GtkWindow* window = parent_window ? parent_window->GetNativeWindow() : NULL; + dialog_ = gtk_file_chooser_dialog_new( + title.c_str(), + window, + action, + GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL, + GTK_STOCK_SAVE, GTK_RESPONSE_ACCEPT, + NULL); + } + + virtual ~FileChooserDialog() { + gtk_widget_destroy(dialog_); + } + + void RunSaveAsynchronous(const SaveDialogCallback& callback) { + save_callback_ = callback; + g_signal_connect(dialog_, "delete-event", + G_CALLBACK(gtk_widget_hide_on_delete), NULL); + g_signal_connect(dialog_, "response", + G_CALLBACK(OnSelectSingleFileDialogResponseThunk), this); + gtk_widget_show_all(dialog_); + } + + CHROMEGTK_CALLBACK_1(FileChooserDialog, void, + OnSelectSingleFileDialogResponse, int); + + private: + GtkWidget* dialog_; + + SaveDialogCallback save_callback_; + OpenDialogCallback open_callback_; + + DISALLOW_COPY_AND_ASSIGN(FileChooserDialog); +}; + +void FileChooserDialog::OnSelectSingleFileDialogResponse(GtkWidget* widget, + int response) { + gtk_widget_hide_all(dialog_); + + if (response == GTK_RESPONSE_ACCEPT) { + gchar* filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(dialog_)); + save_callback_.Run(true, base::FilePath(filename)); + } else { + save_callback_.Run(false, base::FilePath()); + } + + delete this; +} + +} // namespace + bool ShowOpenDialog(atom::NativeWindow* parent_window, const std::string& title, const base::FilePath& default_path, @@ -35,7 +97,9 @@ void ShowSaveDialog(atom::NativeWindow* parent_window, const std::string& title, const base::FilePath& default_path, const SaveDialogCallback& callback) { - callback.Run(false, base::FilePath()); + FileChooserDialog* dialog = new FileChooserDialog( + GTK_FILE_CHOOSER_ACTION_SAVE, parent_window, title, default_path); + dialog->RunSaveAsynchronous(callback); } } // namespace file_dialog