aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/conversation_content_view/file_widget.vala
diff options
context:
space:
mode:
Diffstat (limited to 'main/src/ui/conversation_content_view/file_widget.vala')
-rw-r--r--main/src/ui/conversation_content_view/file_widget.vala132
1 files changed, 77 insertions, 55 deletions
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<Plugins.MessageAction>? 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