From aea27a6153b2c940442173bfe971baca203d878c Mon Sep 17 00:00:00 2001 From: Bharat Date: Tue, 11 Jun 2024 19:08:57 +0530 Subject: [PATCH 1/4] demos: Port 'File Monitor' demo to Vala Add Vala code for File Monitor --- src/File Monitor/main.vala | 84 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 src/File Monitor/main.vala diff --git a/src/File Monitor/main.vala b/src/File Monitor/main.vala new file mode 100644 index 00000000..d919e9fe --- /dev/null +++ b/src/File Monitor/main.vala @@ -0,0 +1,84 @@ +#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1 --pkg gio-2.0 + +private FileMonitor monitor_for_dir; +private FileMonitor monitor_for_file; + +public void main () { + + var edit_entry = (Gtk.TextView) workbench.builder.get_object ("edit_entry"); + var view_file = (Gtk.Button) workbench.builder.get_object ("view_file"); + var delete_file = (Gtk.Button) workbench.builder.get_object ("delete_file"); + var edit_file = (Gtk.Button) workbench.builder.get_object ("edit_file"); + var file_name = (Gtk.Label) workbench.builder.get_object ("file_name"); + Gtk.TextBuffer buffer = edit_entry.get_buffer (); + File file = File.new_for_uri (workbench.resolve ("workbench.txt")); + File file_dir = file.get_parent (); + var overlay = (Adw.ToastOverlay) workbench.builder.get_object ("overlay"); + var file_launcher = new Gtk.FileLauncher (file); + try { + FileInfo details = file.query_info ( + "standard::display-name", + FileQueryInfoFlags.NONE, + null); + file_name.label = details.get_display_name (); + buffer.text = "Start editing ... "; + monitor_for_dir = file_dir.monitor (FileMonitorFlags.WATCH_MOVES, null); + monitor_for_file = file.monitor (FileMonitorFlags.NONE, null); + } catch (Error e) { + message (@"$(e.message)"); + } + + delete_file.clicked.connect (() => { + file.delete_async.begin (Priority.DEFAULT, null); + }); + + view_file.clicked.connect (() => { + file_launcher.launch.begin (workbench.window, null); + }); + + monitor_for_file.changed.connect ((file, other_file, event) => { + if (event == FileMonitorEvent.CHANGES_DONE_HINT) { + var toast = new Adw.Toast ("File modified") { + timeout = 2 + }; + overlay.add_toast (toast); + } + }); + + monitor_for_dir.changed.connect ((child, other_file, event) => { + var toast = new Adw.Toast ("") { + timeout = 2 + }; + + switch (event) { + case FileMonitorEvent.RENAMED: + toast.title = @"$(child.get_basename()) was renamed to $(other_file.get_basename())"; + break; + case FileMonitorEvent.DELETED: + toast.title = @"$(child.get_basename()) was deleted from the directory"; + break; + case FileMonitorEvent.CREATED: + toast.title = @"$(child.get_basename()) created in the directory"; + break; + } + + if (toast.title != "")overlay.add_toast (toast); + }); + + edit_file.clicked.connect (() => { + string byte_string = buffer.text; + uint8[] bytes = byte_string.data; + try { + file.replace_contents ( + bytes, // contents + null, // etag + false, // make_backup + FileCreateFlags.REPLACE_DESTINATION, // flags + null, // new_etag + null // cancellable + ); + } catch (Error e) { + message (@"$(e.message)"); + } + }); +} From b2cfc88249b92b5821c8aa6ecf75929876140b6d Mon Sep 17 00:00:00 2001 From: Bharat Date: Thu, 13 Jun 2024 13:42:16 +0530 Subject: [PATCH 2/4] Minor Fixes Use property for TextBuffer Add default case to switch (Fixes compiler warnings) Use file.replace_contents_async instead of replace_contents --- src/File Monitor/main.vala | 24 +++++++++++------------- 1 file changed, 11 insertions(+), 13 deletions(-) diff --git a/src/File Monitor/main.vala b/src/File Monitor/main.vala index d919e9fe..89e0093d 100644 --- a/src/File Monitor/main.vala +++ b/src/File Monitor/main.vala @@ -10,7 +10,7 @@ public void main () { var delete_file = (Gtk.Button) workbench.builder.get_object ("delete_file"); var edit_file = (Gtk.Button) workbench.builder.get_object ("edit_file"); var file_name = (Gtk.Label) workbench.builder.get_object ("file_name"); - Gtk.TextBuffer buffer = edit_entry.get_buffer (); + Gtk.TextBuffer buffer = edit_entry.buffer; File file = File.new_for_uri (workbench.resolve ("workbench.txt")); File file_dir = file.get_parent (); var overlay = (Adw.ToastOverlay) workbench.builder.get_object ("overlay"); @@ -60,6 +60,8 @@ public void main () { case FileMonitorEvent.CREATED: toast.title = @"$(child.get_basename()) created in the directory"; break; + default: + break; } if (toast.title != "")overlay.add_toast (toast); @@ -68,17 +70,13 @@ public void main () { edit_file.clicked.connect (() => { string byte_string = buffer.text; uint8[] bytes = byte_string.data; - try { - file.replace_contents ( - bytes, // contents - null, // etag - false, // make_backup - FileCreateFlags.REPLACE_DESTINATION, // flags - null, // new_etag - null // cancellable - ); - } catch (Error e) { - message (@"$(e.message)"); - } + file.replace_contents_async.begin ( + bytes, // contents + null, // etag + false, // make_backup + FileCreateFlags.REPLACE_DESTINATION, // flags + null, // new_etag + null // cancellable + ); }); } From 5e076c1397a9123e9f3f9c044809d3e253b5c1b4 Mon Sep 17 00:00:00 2001 From: Bharat Date: Fri, 14 Jun 2024 22:13:16 +0530 Subject: [PATCH 3/4] Replace handler moved to separate method --- src/File Monitor/main.vala | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/File Monitor/main.vala b/src/File Monitor/main.vala index 89e0093d..a42b9f08 100644 --- a/src/File Monitor/main.vala +++ b/src/File Monitor/main.vala @@ -2,7 +2,6 @@ private FileMonitor monitor_for_dir; private FileMonitor monitor_for_file; - public void main () { var edit_entry = (Gtk.TextView) workbench.builder.get_object ("edit_entry"); @@ -68,15 +67,22 @@ public void main () { }); edit_file.clicked.connect (() => { - string byte_string = buffer.text; - uint8[] bytes = byte_string.data; - file.replace_contents_async.begin ( - bytes, // contents - null, // etag - false, // make_backup - FileCreateFlags.REPLACE_DESTINATION, // flags - null, // new_etag - null // cancellable - ); + replace_handler.begin (buffer, file); }); } + +async void replace_handler (Gtk.TextBuffer buffer, File file) { + string byte_string = buffer.text; + uint8[] bytes = byte_string.data; + try { + yield file.replace_contents_async (bytes, // contents + null, // etag + false, // make_backup + FileCreateFlags.REPLACE_DESTINATION, // flags + null, // new_etag + null // cancellable + ); + } catch (Error e) { + message (@"$(e.message)"); + } +} From 31773ba52567075d8e729cdb0b83f669f917e677 Mon Sep 17 00:00:00 2001 From: Bharat Date: Tue, 25 Jun 2024 21:31:38 +0530 Subject: [PATCH 4/4] minor change: Use single line lambdas --- src/File Monitor/main.vala | 12 +++--------- 1 file changed, 3 insertions(+), 9 deletions(-) diff --git a/src/File Monitor/main.vala b/src/File Monitor/main.vala index a42b9f08..51aaf71b 100644 --- a/src/File Monitor/main.vala +++ b/src/File Monitor/main.vala @@ -27,13 +27,9 @@ public void main () { message (@"$(e.message)"); } - delete_file.clicked.connect (() => { - file.delete_async.begin (Priority.DEFAULT, null); - }); + delete_file.clicked.connect (() => file.delete_async.begin (Priority.DEFAULT, null)); - view_file.clicked.connect (() => { - file_launcher.launch.begin (workbench.window, null); - }); + view_file.clicked.connect (() => file_launcher.launch.begin (workbench.window, null)); monitor_for_file.changed.connect ((file, other_file, event) => { if (event == FileMonitorEvent.CHANGES_DONE_HINT) { @@ -66,9 +62,7 @@ public void main () { if (toast.title != "")overlay.add_toast (toast); }); - edit_file.clicked.connect (() => { - replace_handler.begin (buffer, file); - }); + edit_file.clicked.connect (() => replace_handler.begin (buffer, file)); } async void replace_handler (Gtk.TextBuffer buffer, File file) {