[gnome-boxes/wip/feborges/no-filesystem-access: 2/5] properties-window: Use GtkFileChooserNative
- From: Felipe Borges <felipeborges src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [gnome-boxes/wip/feborges/no-filesystem-access: 2/5] properties-window: Use GtkFileChooserNative
- Date: Tue, 30 Oct 2018 18:33:17 +0000 (UTC)
commit 07c06b05cd71a5969c25ee4739639228841edecf
Author: Felipe Borges <felipeborges gnome org>
Date: Fri Oct 26 14:14:29 2018 +0200
properties-window: Use GtkFileChooserNative
These changes are necessary in order to make Boxes consume the
Flatpak file chooser portal.
FileChooserNative is an abstraction of a file chooser dialog that
uses the running platform's native file chooser dialog. Although
Boxes is Linux-exclusive, we need FileChooserNative in order to
consume the org.freedesktop.portal.FileChooser portal whenever it
is available on the session bus.
This way we bring up an out-of-process file chooser that enables
the user to select a file to be used in Boxes without giving us
access to the filesystem out of the Flatpak sandbox.
These changes introduce some minor regressions such:
* We can no longer embed the file chooser into a Properties page:
For that we perform a little trick of hiding the wizard whenever
the file chooser is visible and vice-versa.
* We can't use file filters or custom filters;
data/ui/properties-toolbar.ui | 38 --------------------------------------
data/ui/properties-window.ui | 7 ++-----
src/properties-toolbar.vala | 37 -------------------------------------
src/properties-window.vala | 25 +++++++++++++++----------
4 files changed, 17 insertions(+), 90 deletions(-)
---
diff --git a/data/ui/properties-toolbar.ui b/data/ui/properties-toolbar.ui
index b8d76c4d..3d096ba3 100644
--- a/data/ui/properties-toolbar.ui
+++ b/data/ui/properties-toolbar.ui
@@ -107,44 +107,6 @@
<style>
<class name="titlebar"/>
</style>
-
- <child>
- <object class="GtkButton" id="file_chooser_cancel_button">
- <property name="visible">True</property>
- <property name="valign">center</property>
- <property name="use-underline">True</property>
- <property name="label" translatable="yes">_Cancel</property>
- <signal name="clicked" handler="on_file_chooser_cancel_clicked"/>
- <style>
- <class name="text-button"/>
- </style>
-
- </object>
-
- <packing>
- <property name="pack-type">start</property>
- </packing>
- </child>
-
- <child>
- <object class="GtkButton" id="file_chooser_open_button">
- <property name="visible">True</property>
- <property name="sensitive">False</property>
- <property name="valign">center</property>
- <property name="use-underline">True</property>
- <property name="label" translatable="yes">_Open</property>
- <signal name="clicked" handler="on_file_chooser_open_clicked"/>
- <style>
- <class name="text-button"/>
- </style>
-
- </object>
-
- <packing>
- <property name="pack-type">end</property>
- </packing>
- </child>
-
</object>
<packing>
diff --git a/data/ui/properties-window.ui b/data/ui/properties-window.ui
index ab5dc857..8c2660e0 100644
--- a/data/ui/properties-window.ui
+++ b/data/ui/properties-window.ui
@@ -16,7 +16,7 @@
| |
| |-> troubleshoot_log = new Boxes.TroubleshootLog ();
| |
- | |-> file_chooser = new Gtk.FileChooserWidget ();
+ | |-> file_chooser = new Gtk.FileChooserNative ();
|
|-> topbar = new Boxes.PropertiesToolbar (); // as titlebar
-->
@@ -71,11 +71,8 @@
</child>
<child>
- <object class="GtkFileChooserWidget" id="file_chooser">
+ <object class="GtkBox">
<property name="visible">True</property>
- <property name="show-hidden">False</property>
- <property name="local-only">True</property>
- <property name="filter">supported_files_filter</property>
</object>
<packing>
diff --git a/src/properties-toolbar.vala b/src/properties-toolbar.vala
index ab9478b7..6d15cfa3 100644
--- a/src/properties-toolbar.vala
+++ b/src/properties-toolbar.vala
@@ -21,8 +21,6 @@
[GtkChild]
private EditableEntry title_entry;
- [GtkChild]
- private Button file_chooser_open_button;
private AppWindow window;
private unowned PropertiesWindow props_window;
@@ -39,13 +37,6 @@ public void setup_ui (AppWindow window, PropertiesWindow props_window) {
this.window = window;
this.props_window = props_window;
- var file_chooser = props_window.file_chooser;
- file_chooser.selection_changed.connect (() => {
- var path = file_chooser.get_filename ();
-
- file_chooser_open_button.sensitive = (path != null);
- });
-
window.notify["ui-state"].connect (ui_state_changed);
}
@@ -66,34 +57,6 @@ private void on_copy_clipboard_clicked () requires (page == PropsWindowPage.TROU
props_window.copy_troubleshoot_log_to_clipboard ();
}
- [GtkCallback]
- private void on_file_chooser_cancel_clicked () requires (page == PropsWindowPage.FILE_CHOOSER) {
- props_window.page = PropsWindowPage.MAIN;
- }
-
- [GtkCallback]
- private void on_file_chooser_open_clicked () requires (page == PropsWindowPage.FILE_CHOOSER) {
- var file_chooser = props_window.file_chooser;
- var file = file_chooser.get_file ();
- assert (file != null);
- var file_type = file.query_file_type (FileQueryInfoFlags.NONE, null);
-
- switch (file_type) {
- case GLib.FileType.REGULAR:
- case GLib.FileType.SYMBOLIC_LINK:
- file_chooser.file_activated ();
- break;
-
- case GLib.FileType.DIRECTORY:
- file_chooser.set_current_folder (file.get_path ());
- break;
-
- default:
- debug ("Unknown file type selected");
- break;
- }
- }
-
[GtkCallback]
private void on_title_entry_changed () {
window.current_item.name = title_entry.text;
diff --git a/src/properties-window.vala b/src/properties-window.vala
index b356e3b4..09adb2cf 100644
--- a/src/properties-window.vala
+++ b/src/properties-window.vala
@@ -33,8 +33,8 @@
public Properties properties;
[GtkChild]
public TroubleshootLog troubleshoot_log;
- [GtkChild]
- public Gtk.FileChooserWidget file_chooser;
+
+ public Gtk.FileChooserNative file_chooser;
[GtkChild]
public PropertiesToolbar topbar;
[GtkChild]
@@ -51,6 +51,13 @@ public PropertiesWindow (AppWindow app_window) {
set_transient_for (app_window);
notify["ui-state"].connect (ui_state_changed);
+
+ file_chooser = new Gtk.FileChooserNative (_("Select a device or ISO file"),
+ app_window,
+ Gtk.FileChooserAction.OPEN,
+ _("Open"), _("Cancel"));
+ file_chooser.bind_property ("visible", this, "visible", BindingFlags.INVERT_BOOLEAN);
+
}
public void show_troubleshoot_log (string log) {
@@ -59,15 +66,13 @@ public void show_troubleshoot_log (string log) {
}
public void show_file_chooser (owned FileChosenFunc file_chosen_func) {
- ulong activated_id = 0;
- activated_id = file_chooser.file_activated.connect (() => {
- var path = file_chooser.get_filename ();
- file_chosen_func (path);
- file_chooser.disconnect (activated_id);
-
- page = PropsWindowPage.MAIN;
- });
page = PropsWindowPage.FILE_CHOOSER;
+ var res = file_chooser.run ();
+ if (res == Gtk.ResponseType.ACCEPT) {
+ file_chosen_func (file_chooser.get_filename ());
+ }
+
+ page = PropsWindowPage.MAIN;
}
public void copy_troubleshoot_log_to_clipboard () {
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]