Skip to content

Commit 1d74df8

Browse files
authored
library: Adds File Dialog Entry (#387)
1 parent 8ed5a8c commit 1d74df8

File tree

3 files changed

+144
-0
lines changed

3 files changed

+144
-0
lines changed
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
using Gtk 4.0;
2+
using Adw 1;
3+
4+
Adw.StatusPage {
5+
title: _("File Dialog");
6+
description: _("Present a dialog to open and save files");
7+
8+
Box {
9+
orientation: vertical;
10+
spacing: 24;
11+
12+
Label {
13+
label: _("Modes");
14+
styles ["title-4"]
15+
}
16+
17+
DropDown dropdown_mode {
18+
halign: center;
19+
model: StringList {
20+
strings [_("Open File"), _("Open Multiple Files"), _("Select Folder"), _("Select Multiple Folders"), _("Save File")]
21+
};
22+
selected: 0;
23+
}
24+
25+
Button button {
26+
halign: center;
27+
label: _("Trigger");
28+
styles ["pill", "suggested-action"]
29+
}
30+
31+
LinkButton {
32+
label: _("API Reference");
33+
uri: "https://docs.gtk.org/gtk4/class.FileDialog.html";
34+
}
35+
}
36+
}
37+
38+
39+
Lines changed: 99 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,99 @@
1+
import Gtk from "gi://Gtk";
2+
import Gdk from "gi://Gdk";
3+
import Gio from "gi://Gio";
4+
import GLib from "gi://GLib";
5+
6+
Gio._promisify(Gtk.FileDialog.prototype, "open", "open_finish");
7+
Gio._promisify(
8+
Gtk.FileDialog.prototype,
9+
"open_multiple",
10+
"open_multiple_finish",
11+
);
12+
Gio._promisify(Gtk.FileDialog.prototype, "save", "save_finish");
13+
Gio._promisify(
14+
Gtk.FileDialog.prototype,
15+
"select_folder",
16+
"select_folder_finish",
17+
);
18+
Gio._promisify(
19+
Gtk.FileDialog.prototype,
20+
"select_multiple_folders",
21+
"select_multiple_folders_finish",
22+
);
23+
24+
const button = workbench.builder.get_object("button");
25+
const dropdown_mode = workbench.builder.get_object("dropdown_mode");
26+
27+
button.connect("clicked", () => {
28+
switch (dropdown_mode.selected) {
29+
case 0:
30+
openFile().catch(logError);
31+
break;
32+
case 1:
33+
openMultipleFiles().catch(logError);
34+
break;
35+
case 2:
36+
selectFolder().catch(logError);
37+
break;
38+
case 3:
39+
selectMultipleFolders().catch(logError);
40+
break;
41+
case 4:
42+
saveFile().catch(logError);
43+
break;
44+
}
45+
});
46+
47+
async function openFile() {
48+
const default_dir = Gio.File.new_for_path(
49+
GLib.get_user_special_dir(GLib.UserDirectory.DIRECTORY_DOWNLOAD),
50+
);
51+
const dialog_for_file = new Gtk.FileDialog({
52+
initial_folder: default_dir,
53+
});
54+
const file = await dialog_for_file.open(workbench.window, null);
55+
const info = file.query_info(
56+
"standard::name",
57+
Gio.FileQueryInfoFlags.NONE,
58+
null,
59+
);
60+
console.log(`Selected File: ${info.get_name()}`);
61+
}
62+
63+
async function openMultipleFiles() {
64+
const dialog_for_multiple_files = new Gtk.FileDialog();
65+
const files = await dialog_for_multiple_files.open_multiple(
66+
workbench.window,
67+
null,
68+
);
69+
const selected_items_count = files.get_n_items();
70+
console.log(`No of selected files: ${selected_items_count}`);
71+
}
72+
73+
async function selectFolder() {
74+
const dialog_for_folder = new Gtk.FileDialog();
75+
const file = await dialog_for_folder.select_folder(workbench.window, null);
76+
const info = file.query_info(
77+
"standard::name",
78+
Gio.FileQueryInfoFlags.NONE,
79+
null,
80+
);
81+
console.log(`"${info.get_name()}" selected`);
82+
}
83+
84+
async function selectMultipleFolders() {
85+
const dialog = new Gtk.FileDialog();
86+
const folders = await dialog.select_multiple_folders(workbench.window, null);
87+
const selected_items_count = folders.get_n_items();
88+
console.log(`${selected_items_count} selected folders`);
89+
}
90+
91+
async function saveFile() {
92+
const dialog = new Gtk.FileDialog({
93+
initial_name: "Workbench.txt",
94+
});
95+
// "save" returns a Gio.File you can write to
96+
const file = await dialog.save(workbench.window, null);
97+
console.log(`Save file to ${file.get_path()}`);
98+
}
99+
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
{
2+
"category": "platform",
3+
"description": "Present a dialog to open and save files",
4+
"panels": ["code", "preview"],
5+
"autorun": true
6+
}

0 commit comments

Comments
 (0)