[gtkmm] Add Gtk::NativeDialog and Gtk::FileChooserNative



commit 38d5b59eee0dfd0068ccf32b34337aa8a4c2721e
Author: Kjell Ahlstedt <kjellahlstedt gmail com>
Date:   Fri Jun 30 15:27:22 2017 +0200

    Add Gtk::NativeDialog and Gtk::FileChooserNative
    
    Bug 783801

 .gitignore                     |    4 +
 gtk/gtkmm.h                    |    1 +
 gtk/src/filechoosernative.ccg  |   45 ++++++++++++
 gtk/src/filechoosernative.hg   |  155 ++++++++++++++++++++++++++++++++++++++++
 gtk/src/filelist.am            |    2 +
 gtk/src/gtk_extra_objects.defs |    6 ++
 gtk/src/nativedialog.ccg       |   29 ++++++++
 gtk/src/nativedialog.hg        |   89 +++++++++++++++++++++++
 8 files changed, 331 insertions(+), 0 deletions(-)
---
diff --git a/.gitignore b/.gitignore
index a8a2e97..f0c3f40 100644
--- a/.gitignore
+++ b/.gitignore
@@ -230,6 +230,8 @@ gtk/gtkmm/filechooserbutton.cc
 gtk/gtkmm/filechooserbutton.h
 gtk/gtkmm/filechooserdialog.cc
 gtk/gtkmm/filechooserdialog.h
+gtk/gtkmm/filechoosernative.cc
+gtk/gtkmm/filechoosernative.h
 gtk/gtkmm/filechooserwidget.cc
 gtk/gtkmm/filechooserwidget.h
 gtk/gtkmm/filefilter.cc
@@ -320,6 +322,8 @@ gtk/gtkmm/messagedialog.cc
 gtk/gtkmm/messagedialog.h
 gtk/gtkmm/modelbutton.cc
 gtk/gtkmm/modelbutton.h
+gtk/gtkmm/nativedialog.cc
+gtk/gtkmm/nativedialog.h
 gtk/gtkmm/notebook.cc
 gtk/gtkmm/notebook.h
 gtk/gtkmm/orientable.cc
diff --git a/gtk/gtkmm.h b/gtk/gtkmm.h
index 1d23bd2..dbc8c47 100644
--- a/gtk/gtkmm.h
+++ b/gtk/gtkmm.h
@@ -147,6 +147,7 @@ extern const int gtkmm_micro_version;
 #include <gtkmm/filechooser.h>
 #include <gtkmm/filechooserbutton.h>
 #include <gtkmm/filechooserdialog.h>
+#include <gtkmm/filechoosernative.h>
 #include <gtkmm/filechooserwidget.h>
 #include <gtkmm/filefilter.h>
 #include <gtkmm/fixed.h>
diff --git a/gtk/src/filechoosernative.ccg b/gtk/src/filechoosernative.ccg
new file mode 100644
index 0000000..a378da2
--- /dev/null
+++ b/gtk/src/filechoosernative.ccg
@@ -0,0 +1,45 @@
+/* Copyright (C) 2017 The gtkmm Development Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gtk/gtk.h>
+#include <gtkmm/window.h>
+
+namespace Gtk
+{
+
+FileChooserNative::FileChooserNative(const Glib::ustring& title, Window& parent,
+  FileChooser::Action action,
+  const Glib::ustring& accept_label, const Glib::ustring& cancel_label)
+:
+  _CONSTRUCT("title", title.c_str(), "transient-for", parent.gobj(),
+    "action", static_cast<GtkFileChooserAction>(action),
+    "accept_label", Glib::c_str_or_nullptr(accept_label),
+    "cancel_label", Glib::c_str_or_nullptr(cancel_label))
+{
+}
+
+FileChooserNative::FileChooserNative(const Glib::ustring& title,
+  FileChooser::Action action,
+  const Glib::ustring& accept_label, const Glib::ustring& cancel_label)
+:
+  _CONSTRUCT("title", title.c_str(),
+    "action", static_cast<GtkFileChooserAction>(action),
+    "accept_label", Glib::c_str_or_nullptr(accept_label),
+    "cancel_label", Glib::c_str_or_nullptr(cancel_label))
+{
+}
+
+} // namespace Gtk
diff --git a/gtk/src/filechoosernative.hg b/gtk/src/filechoosernative.hg
new file mode 100644
index 0000000..1a0f46f
--- /dev/null
+++ b/gtk/src/filechoosernative.hg
@@ -0,0 +1,155 @@
+/* Copyright (C) 2017 The gtkmm Development Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gtkmm/nativedialog.h>
+#include <gtkmm/filechooser.h>
+
+_DEFS(gtkmm,gtk)
+_PINCLUDE(gtkmm/private/nativedialog_p.h)
+
+namespace Gtk
+{
+class Window;
+
+/** A native file chooser dialog, suitable for “File/Open” or “File/Save” commands.
+ *
+ * %FileChooserNative is an abstraction of a dialog box suitable
+ * for use with “File/Open” or “File/Save as” commands. By default, this
+ * just uses a Gtk::FileChooserDialog to implement the actual dialog.
+ * However, on certain platforms, such as Windows, the native platform
+ * file chooser is used instead. When the application is running in a
+ * sandboxed environment without direct filesystem access (such as Flatpak),
+ * %FileChooserNative may call the proper APIs (portals) to let the user
+ * choose a file and make it available to the application.
+ *
+ * While the API of %FileChooserNative closely mirrors FileChooserDialog, the main
+ * difference is that there is no access to any Gtk::Window or Gtk::Widget for the dialog.
+ * This is required, as there may not be one in the case of a platform native dialog.
+ * Showing, hiding and running the dialog is handled by the NativeDialog functions.
+ *
+ * <h2>Response Codes</h2>
+ *
+ * %FileChooserNative inherits from NativeDialog, which means it
+ * will return Gtk::ResponseType::ACCEPT if the user accepted, and
+ * Gtk::ResponseType::CANCEL if he pressed cancel. It can also return
+ * Gtk::ResponseType::DELETE_EVENT if the window was unexpectedly closed.
+ *
+ * <h2>Differences from FileChooserDialog</h2>
+ *
+ * There are a few things in the FileChooser API that are not
+ * possible to use with %FileChooserNative, as such use would
+ * prohibit the use of a native dialog.
+ *
+ * There is no support for the signals that are emitted when the user
+ * navigates in the dialog, including:
+ * * FileChooser::signal_current_folder_changed()
+ * * FileChooser::signal_selection_changed()
+ * * FileChooser::signal_file_activated()
+ * * FileChooser::signal_confirm_overwrite()
+ *
+ * You can also not use the methods that directly control user navigation:
+ * * FileChooser::unselect_filename()
+ * * FileChooser::select_all()
+ * * FileChooser::unselect_all()
+ *
+ * If you need any of the above you will have to use FileChooserDialog directly.
+ *
+ * No operations that change the dialog work while the dialog is
+ * visible. Set all the properties that are required before showing the dialog.
+ *
+ * <h2>Win32 details</h2>
+ *
+ * On windows the IFileDialog implementation (added in Windows Vista) is
+ * used. It supports many of the features that FileChooserDialog
+ * does, but there are some things it does not handle:
+ *
+ * * Extra widgets added with FileChooser::set_extra_widget().
+ *
+ * * Use of custom previews by connecting to FileChooser::signal_update_preview().
+ *
+ * * Any Gtk::FileFilter added using a mimetype or custom filter.
+ *
+ * If any of these features are used the regular FileChooserDialog
+ * will be used in place of the native one.
+ *
+ * <h2>Portal details</h2>
+ *
+ * When the org.freedesktop.portal.FileChooser portal is available on the
+ * session bus, it is used to bring up an out-of-process file chooser. Depending
+ * on the kind of session the application is running in, this may or may not
+ * be a GTK+ file chooser. In this situation, the following things are not
+ * supported and will be silently ignored:
+ *
+ * * Extra widgets added with FileChooser::set_extra_widget().
+ *
+ * * Use of custom previews by connecting to FileChooser::signal_update_preview().
+ *
+ * * Any Gtk::FileFilter added with a custom filter.
+ *
+ * @see Gtk::FileChooser, Gtk::NativeDialog, Gtk::FileChooserDialog
+ * @newin{3,92}
+ */
+class FileChooserNative : public NativeDialog, public FileChooser
+{
+  _CLASS_GOBJECT(FileChooserNative, GtkFileChooserNative, GTK_FILE_CHOOSER_NATIVE, NativeDialog, 
GtkNativeDialog)
+  _IMPLEMENTS_INTERFACE(FileChooser)
+  _STRUCT_NOT_HIDDEN
+
+protected:
+  /** There is no create() method that corresponds to this constructor,
+   * because this constructor shall only be used by derived classes.
+   */
+  _CTOR_DEFAULT
+
+  /** Constructs a %FileChooserNative.
+   */
+  FileChooserNative(const Glib::ustring& title, Window& parent, FileChooser::Action action,
+    const Glib::ustring& accept_label, const Glib::ustring& cancel_label);
+
+  /** Constructs a %FileChooserNative.
+   */
+  FileChooserNative(const Glib::ustring& title, FileChooser::Action action,
+    const Glib::ustring& accept_label, const Glib::ustring& cancel_label);
+  _IGNORE(gtk_file_chooser_native_new)
+
+public:
+  /** Creates a %FileChooserNative.
+   *
+   * @newin{3,92}
+   *
+   * @param title Title of the native.
+   * @param parent Transient parent of the native.
+   * @param action Open or save mode for the dialog.
+   * @param accept_label Text to go in the accept button, or empty string for the default.
+   * @param cancel_label Text to go in the cancel button, or empty string for the default.
+   * @return A Glib::RefPtr to a new %FileChooserNative.
+   */
+  _WRAP_CREATE(const Glib::ustring& title, Window& parent{?},
+    FileChooser::Action action, const Glib::ustring& accept_label = Glib::ustring(),
+    const Glib::ustring& cancel_label = Glib::ustring())
+
+  _WRAP_METHOD(Glib::ustring get_accept_label() const, gtk_file_chooser_native_get_accept_label, newin 
"3,92")
+  _WRAP_METHOD(void set_accept_label(const Glib::ustring& accept_label{NULL} = Glib::ustring()), 
gtk_file_chooser_native_set_accept_label, newin "3,92")
+  _WRAP_METHOD(Glib::ustring get_cancel_label() const, gtk_file_chooser_native_get_cancel_label, newin 
"3,92")
+  _WRAP_METHOD(void set_cancel_label(const Glib::ustring& cancel_label{NULL} = Glib::ustring()), 
gtk_file_chooser_native_set_cancel_label, newin "3,92")
+
+  _WRAP_PROPERTY("accept-label", Glib::ustring, newin "3,92")
+  _WRAP_PROPERTY("cancel-label", Glib::ustring, newin "3,92")
+
+  // FileChooserNative has no signals
+};
+
+} // namespace Gtk
diff --git a/gtk/src/filelist.am b/gtk/src/filelist.am
index d4a0641..5c93382 100644
--- a/gtk/src/filelist.am
+++ b/gtk/src/filelist.am
@@ -72,6 +72,7 @@ gtkmm_files_any_hg =          \
        filechooser.hg          \
        filechooserbutton.hg    \
        filechooserdialog.hg    \
+       filechoosernative.hg    \
        filechooserwidget.hg    \
        filefilter.hg           \
        fixed.hg                \
@@ -117,6 +118,7 @@ gtkmm_files_any_hg =                \
        menutoolbutton.hg       \
        messagedialog.hg        \
        modelbutton.hg \
+       nativedialog.hg \
        notebook.hg             \
        orientable.hg           \
        overlay.hg              \
diff --git a/gtk/src/gtk_extra_objects.defs b/gtk/src/gtk_extra_objects.defs
index 1877b82..0748ce5 100644
--- a/gtk/src/gtk_extra_objects.defs
+++ b/gtk/src/gtk_extra_objects.defs
@@ -136,6 +136,12 @@
   (gtype-id "GTK_TYPE_ICON_INFO")
 )
 
+(define-object NativeDialog
+  (in-module "Gtk")
+  (c-name "GtkNativeDialog")
+  (gtype-id "GTK_TYPE_NATIVE_DIALOG")
+)
+
 (define-object PageSetup
   (in-module "Gtk")
   (c-name "GtkPageSetup")
diff --git a/gtk/src/nativedialog.ccg b/gtk/src/nativedialog.ccg
new file mode 100644
index 0000000..3c34ecd
--- /dev/null
+++ b/gtk/src/nativedialog.ccg
@@ -0,0 +1,29 @@
+/* Copyright (C) 2017 The gtkmm Development Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <gtk/gtk.h>
+#include <gtkmm/window.h>
+
+namespace Gtk
+{
+
+void NativeDialog::unset_transient_for()
+{
+  gtk_native_dialog_set_transient_for(gobj(), nullptr);
+}
+
+} // namespace Gtk
+
diff --git a/gtk/src/nativedialog.hg b/gtk/src/nativedialog.hg
new file mode 100644
index 0000000..8e0aec5
--- /dev/null
+++ b/gtk/src/nativedialog.hg
@@ -0,0 +1,89 @@
+/* Copyright (C) 2017 The gtkmm Development Team
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <glibmm/object.h>
+
+_DEFS(gtkmm,gtk)
+_PINCLUDE(glibmm/private/object_p.h)
+
+namespace Gtk
+{
+class Window;
+
+/** Integrate with native dialogs.
+ *
+ * Native dialogs are platform dialogs that don't use Gtk::Dialog or
+ * Gtk::Window. They are used in order to integrate better with a
+ * platform, by looking the same as other native applications and
+ * supporting platform specific features.
+ *
+ * The Gtk::Dialog functions cannot be used on such objects, but we
+ * need a similar API in order to drive them. The %NativeDialog
+ * object is an API that allows you to do this. It allows you to set
+ * various common properties on the dialog, as well as show and hide
+ * it and get a response signal when the user finished with the dialog.
+ *
+ * There is also a run() helper that makes it easy
+ * to run any native dialog in a modal way with a recursive mainloop,
+ * similar to Dialog::run().
+ *
+ * @see Gtk::FileChooserNative, Gtk::Dialog
+ * @newin{3,92}
+ */
+class NativeDialog : public Glib::Object
+{
+  _CLASS_GOBJECT(NativeDialog, GtkNativeDialog, GTK_NATIVE_DIALOG, Glib::Object, GObject)
+  _IGNORE(gtk_native_dialog_destroy)
+
+protected:
+  /** There is no create() method that corresponds to this constructor,
+   * because only derived classes shall be created.
+   */
+  _CTOR_DEFAULT
+
+public:
+  // No create() because only derived classes shall be instantiated.
+
+  _WRAP_METHOD(void show(), gtk_native_dialog_show, newin "3,92")
+  _WRAP_METHOD(void hide(), gtk_native_dialog_hide, newin "3,92")
+  _WRAP_METHOD(bool get_visible() const, gtk_native_dialog_get_visible, newin "3,92")
+  _WRAP_METHOD(void set_modal(bool modal = true), gtk_native_dialog_set_modal, newin "3,92")
+  _WRAP_METHOD(bool get_modal() const, gtk_native_dialog_get_modal, newin "3,92")
+  _WRAP_METHOD(void set_title(const Glib::ustring& title), gtk_native_dialog_set_title, newin "3,92")
+  _WRAP_METHOD(Glib::ustring get_title() const, gtk_native_dialog_get_title, newin "3,92")
+
+  _WRAP_METHOD(void set_transient_for(Window& parent), gtk_native_dialog_set_transient_for, newin "3,92")
+
+  /** Unsets the current transient window.
+   * @see set_transient_for().
+   * @newin{3,92}
+   */
+  void unset_transient_for();
+
+  _WRAP_METHOD(Window* get_transient_for(), gtk_native_dialog_get_transient_for, newin "3,92")
+  _WRAP_METHOD(const Window* get_transient_for() const, gtk_native_dialog_get_transient_for, constversion, 
newin "3,92")
+
+  _WRAP_METHOD(int run(), gtk_native_dialog_run, newin "3,92")
+
+  _WRAP_PROPERTY("title", Glib::ustring, newin "3,92")
+  _WRAP_PROPERTY("modal", bool, newin "3,92")
+  _WRAP_PROPERTY("visible", bool, newin "3,92")
+  _WRAP_PROPERTY("transient_for", Window*, newin "3,92")
+
+  _WRAP_SIGNAL(void response(int response_id), "response", newin "3,92")
+};
+
+} // namespace Gtk


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]