|
| 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