Skip to content

Commit 644fb6b

Browse files
authored
Port 'File Monitor' demo to Vala (#175)
1 parent 0db0113 commit 644fb6b

File tree

1 file changed

+82
-0
lines changed

1 file changed

+82
-0
lines changed

src/File Monitor/main.vala

Lines changed: 82 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,82 @@
1+
#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 --pkg gio-2.0
2+
3+
private FileMonitor monitor_for_dir;
4+
private FileMonitor monitor_for_file;
5+
public void main () {
6+
7+
var edit_entry = (Gtk.TextView) workbench.builder.get_object ("edit_entry");
8+
var view_file = (Gtk.Button) workbench.builder.get_object ("view_file");
9+
var delete_file = (Gtk.Button) workbench.builder.get_object ("delete_file");
10+
var edit_file = (Gtk.Button) workbench.builder.get_object ("edit_file");
11+
var file_name = (Gtk.Label) workbench.builder.get_object ("file_name");
12+
Gtk.TextBuffer buffer = edit_entry.buffer;
13+
File file = File.new_for_uri (workbench.resolve ("workbench.txt"));
14+
File file_dir = file.get_parent ();
15+
var overlay = (Adw.ToastOverlay) workbench.builder.get_object ("overlay");
16+
var file_launcher = new Gtk.FileLauncher (file);
17+
try {
18+
FileInfo details = file.query_info (
19+
"standard::display-name",
20+
FileQueryInfoFlags.NONE,
21+
null);
22+
file_name.label = details.get_display_name ();
23+
buffer.text = "Start editing ... ";
24+
monitor_for_dir = file_dir.monitor (FileMonitorFlags.WATCH_MOVES, null);
25+
monitor_for_file = file.monitor (FileMonitorFlags.NONE, null);
26+
} catch (Error e) {
27+
message (@"$(e.message)");
28+
}
29+
30+
delete_file.clicked.connect (() => file.delete_async.begin (Priority.DEFAULT, null));
31+
32+
view_file.clicked.connect (() => file_launcher.launch.begin (workbench.window, null));
33+
34+
monitor_for_file.changed.connect ((file, other_file, event) => {
35+
if (event == FileMonitorEvent.CHANGES_DONE_HINT) {
36+
var toast = new Adw.Toast ("File modified") {
37+
timeout = 2
38+
};
39+
overlay.add_toast (toast);
40+
}
41+
});
42+
43+
monitor_for_dir.changed.connect ((child, other_file, event) => {
44+
var toast = new Adw.Toast ("") {
45+
timeout = 2
46+
};
47+
48+
switch (event) {
49+
case FileMonitorEvent.RENAMED:
50+
toast.title = @"$(child.get_basename()) was renamed to $(other_file.get_basename())";
51+
break;
52+
case FileMonitorEvent.DELETED:
53+
toast.title = @"$(child.get_basename()) was deleted from the directory";
54+
break;
55+
case FileMonitorEvent.CREATED:
56+
toast.title = @"$(child.get_basename()) created in the directory";
57+
break;
58+
default:
59+
break;
60+
}
61+
62+
if (toast.title != "")overlay.add_toast (toast);
63+
});
64+
65+
edit_file.clicked.connect (() => replace_handler.begin (buffer, file));
66+
}
67+
68+
async void replace_handler (Gtk.TextBuffer buffer, File file) {
69+
string byte_string = buffer.text;
70+
uint8[] bytes = byte_string.data;
71+
try {
72+
yield file.replace_contents_async (bytes, // contents
73+
null, // etag
74+
false, // make_backup
75+
FileCreateFlags.REPLACE_DESTINATION, // flags
76+
null, // new_etag
77+
null // cancellable
78+
);
79+
} catch (Error e) {
80+
message (@"$(e.message)");
81+
}
82+
}

0 commit comments

Comments
 (0)