From e35df88d4a00c3a34f2b4d9fb7f10bb5d877bd29 Mon Sep 17 00:00:00 2001 From: Marvin W Date: Tue, 24 Jan 2023 18:57:04 +0100 Subject: Fix UI for libadwaita --- .../ui/conversation_content_view/file_widget.vala | 132 ++++++++++++--------- 1 file changed, 77 insertions(+), 55 deletions(-) (limited to 'main/src/ui/conversation_content_view/file_widget.vala') diff --git a/main/src/ui/conversation_content_view/file_widget.vala b/main/src/ui/conversation_content_view/file_widget.vala index 52a26f33..8c36475a 100644 --- a/main/src/ui/conversation_content_view/file_widget.vala +++ b/main/src/ui/conversation_content_view/file_widget.vala @@ -21,7 +21,9 @@ public class FileMetaItem : ConversationSummary.ContentMetaItem { } public override Object? get_widget(Plugins.ConversationItemWidgetInterface outer, Plugins.WidgetType type) { - return new FileWidget(stream_interactor, file_transfer); + FileWidget widget = new FileWidget(file_transfer); + FileWidgetController widget_controller = new FileWidgetController(widget, file_transfer, stream_interactor); + return widget; } public override Gee.List? get_item_actions(Plugins.WidgetType type) { @@ -57,7 +59,6 @@ public class FileWidget : SizeRequestBox { DEFAULT } - private StreamInteractor stream_interactor; private FileTransfer file_transfer; public FileTransfer.State file_transfer_state { get; set; } public string file_transfer_mime_type { get; set; } @@ -66,13 +67,24 @@ public class FileWidget : SizeRequestBox { private FileDefaultWidgetController default_widget_controller; private Widget? content = null; + public signal void open_file(); + public signal void save_file_as(); + public signal void start_download(); + public signal void cancel_download(); + + class construct { + install_action("file.open", null, (widget, action_name) => { ((FileWidget) widget).open_file(); }); + install_action("file.save_as", null, (widget, action_name) => { ((FileWidget) widget).save_file_as(); }); + install_action("file.download", null, (widget, action_name) => { ((FileWidget) widget).start_download(); }); + install_action("file.cancel", null, (widget, action_name) => { ((FileWidget) widget).cancel_download(); }); + } + construct { margin_top = 4; size_request_mode = SizeRequestMode.HEIGHT_FOR_WIDTH; } - public FileWidget(StreamInteractor stream_interactor, FileTransfer file_transfer) { - this.stream_interactor = stream_interactor; + public FileWidget(FileTransfer file_transfer) { this.file_transfer = file_transfer; update_widget.begin(); @@ -113,7 +125,7 @@ public class FileWidget : SizeRequestBox { if (content != null) this.remove(content); FileDefaultWidget default_file_widget = new FileDefaultWidget(); default_widget_controller = new FileDefaultWidgetController(default_file_widget); - default_widget_controller.set_file_transfer(file_transfer, stream_interactor); + default_widget_controller.set_file_transfer(file_transfer); content = default_file_widget; this.state = State.DEFAULT; this.append(content); @@ -138,94 +150,104 @@ public class FileWidget : SizeRequestBox { } } -public class FileDefaultWidgetController : Object { - - private FileDefaultWidget widget; - private FileTransfer? file_transfer; - public string file_transfer_path { get; set; } - public string file_transfer_state { get; set; } - public string file_transfer_mime_type { get; set; } +public class FileWidgetController : Object { + private weak Widget widget; + private FileTransfer file_transfer; private StreamInteractor? stream_interactor; - private string file_uri; - private string file_name; - private FileTransfer.State state; - public FileDefaultWidgetController(FileDefaultWidget widget) { + public FileWidgetController(FileWidget widget, FileTransfer file_transfer, StreamInteractor? stream_interactor = null) { this.widget = widget; + this.ref(); + this.widget.weak_ref(() => { + this.widget = null; + this.unref(); + }); + this.file_transfer = file_transfer; + this.stream_interactor = stream_interactor; - widget.clicked.connect(on_clicked); widget.open_file.connect(open_file); widget.save_file_as.connect(save_file); + widget.start_download.connect(start_download); widget.cancel_download.connect(cancel_download); } - public void set_file_transfer(FileTransfer file_transfer, StreamInteractor stream_interactor) { - this.file_transfer = file_transfer; - this.stream_interactor = stream_interactor; - - widget.name_label.label = file_name = file_transfer.file_name; - - file_transfer.bind_property("path", this, "file-transfer-path"); - file_transfer.bind_property("state", this, "file-transfer-state"); - file_transfer.bind_property("mime-type", this, "file-transfer-mime-type"); - - this.notify["file-transfer-path"].connect(update_file_info); - this.notify["file-transfer-state"].connect(update_file_info); - this.notify["file-transfer-mime-type"].connect(update_file_info); - - update_file_info(); - } - - public void set_file(File file, string file_name, string? mime_type) { - file_uri = file.get_uri(); - state = FileTransfer.State.COMPLETE; - widget.name_label.label = this.file_name = file_name; - widget.update_file_info(mime_type, state, -1); - } - - private void update_file_info() { - file_uri = file_transfer.get_file().get_uri(); - state = file_transfer.state; - widget.update_file_info(file_transfer.mime_type, file_transfer.state, file_transfer.size); - } - private void open_file() { try{ - AppInfo.launch_default_for_uri(file_uri, null); + AppInfo.launch_default_for_uri(file_transfer.get_file().get_uri(), null); } catch (Error err) { - warning("Failed to open %s - %s", file_uri, err.message); + warning("Failed to open %s - %s", file_transfer.get_file().get_uri(), err.message); } } private void save_file() { var save_dialog = new FileChooserNative(_("Save as…"), widget.get_root() as Gtk.Window, FileChooserAction.SAVE, null, null); save_dialog.set_modal(true); - save_dialog.set_current_name(file_name); + save_dialog.set_current_name(file_transfer.file_name); save_dialog.response.connect(() => { try{ - GLib.File.new_for_uri(file_uri).copy(save_dialog.get_file(), GLib.FileCopyFlags.OVERWRITE, null); + GLib.File.new_for_uri(file_transfer.get_file().get_uri()).copy(save_dialog.get_file(), GLib.FileCopyFlags.OVERWRITE, null); } catch (Error err) { - warning("Failed copy file %s - %s", file_uri, err.message); + warning("Failed copy file %s - %s", file_transfer.get_file().get_uri(), err.message); } }); save_dialog.show(); } + private void start_download() { + if (stream_interactor != null) { + stream_interactor.get_module(FileManager.IDENTITY).download_file.begin(file_transfer); + } + } + private void cancel_download() { file_transfer.cancellable.cancel(); } +} + +public class FileDefaultWidgetController : Object { + + private FileDefaultWidget widget; + private FileTransfer? file_transfer; + public string file_transfer_state { get; set; } + public string file_transfer_mime_type { get; set; } + + private FileTransfer.State state; + + public FileDefaultWidgetController(FileDefaultWidget widget) { + this.widget = widget; + + widget.clicked.connect(on_clicked); + + this.notify["file-transfer-state"].connect(update_file_info); + this.notify["file-transfer-mime-type"].connect(update_file_info); + } + + public void set_file_transfer(FileTransfer file_transfer) { + this.file_transfer = file_transfer; + + widget.name_label.label = file_transfer.file_name; + + file_transfer.bind_property("state", this, "file-transfer-state"); + file_transfer.bind_property("mime-type", this, "file-transfer-mime-type"); + + update_file_info(); + } + + private void update_file_info() { + state = file_transfer.state; + widget.update_file_info(file_transfer.mime_type, file_transfer.state, file_transfer.size); + } private void on_clicked() { switch (state) { case FileTransfer.State.COMPLETE: - open_file(); + widget.activate_action("file.open", null); break; case FileTransfer.State.NOT_STARTED: - assert(stream_interactor != null && file_transfer != null); - stream_interactor.get_module(FileManager.IDENTITY).download_file.begin(file_transfer); + widget.activate_action("file.download", null); break; default: // Clicking doesn't do anything in FAILED and IN_PROGRESS states -- cgit v1.2.3-54-g00ecf