aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/conversation_content_view/file_widget.vala
diff options
context:
space:
mode:
authorwkg <1515379+wkg@users.noreply.github.com>2022-01-09 16:34:09 +0300
committerGitHub <noreply@github.com>2022-01-09 14:34:09 +0100
commit25db512297781ea9e4a01c6e6719cb7e43db6db4 (patch)
treeb0ecd2beafcb86a826a44ca857b0ccdded22da68 /main/src/ui/conversation_content_view/file_widget.vala
parent975b37c498f2611bc7f13017d4491961426a8a7f (diff)
downloaddino-25db512297781ea9e4a01c6e6719cb7e43db6db4.tar.gz
dino-25db512297781ea9e4a01c6e6719cb7e43db6db4.zip
Introduce file widget menu with "Save as..." and "Open" actions (#1080)
Diffstat (limited to 'main/src/ui/conversation_content_view/file_widget.vala')
-rw-r--r--main/src/ui/conversation_content_view/file_widget.vala53
1 files changed, 47 insertions, 6 deletions
diff --git a/main/src/ui/conversation_content_view/file_widget.vala b/main/src/ui/conversation_content_view/file_widget.vala
index 5766ec25..d48185ec 100644
--- a/main/src/ui/conversation_content_view/file_widget.vala
+++ b/main/src/ui/conversation_content_view/file_widget.vala
@@ -128,6 +128,8 @@ public class FileDefaultWidgetController : Object {
public FileDefaultWidgetController(FileDefaultWidget widget) {
this.widget = widget;
widget.button_release_event.connect(on_clicked);
+ widget.file_open_button.clicked.connect(open_file);
+ widget.file_save_button.clicked.connect(save_file);
}
public void set_file_transfer(FileTransfer file_transfer, StreamInteractor stream_interactor) {
@@ -160,15 +162,54 @@ public class FileDefaultWidgetController : Object {
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);
+ } catch (Error err) {
+ warning("Failed to open %s - %s", file_uri, err.message);
+ }
+ }
+
+ private void save_as(Gtk.Dialog dialog, int response_id) {
+ var save_dialog = dialog as Gtk.FileChooserDialog;
+ File file_src;
+ switch (response_id) {
+ case Gtk.ResponseType.ACCEPT:
+ file_src = GLib.File.new_for_uri(file_uri);
+ try{
+ file_src.copy(save_dialog.get_file(), GLib.FileCopyFlags.OVERWRITE, null);
+ } catch (Error err) {
+ warning("Failed copy file %s - %s", file_uri, err.message);
+ }
+ break;
+ default:
+ break;
+ }
+ dialog.destroy();
+ }
+
+ private void save_file() {
+ var save_dialog = new Gtk.FileChooserDialog("Save as...", this as Gtk.Window, Gtk.FileChooserAction.SAVE, Gtk.Stock.CANCEL, Gtk.ResponseType.CANCEL, Gtk.Stock.SAVE, Gtk.ResponseType.ACCEPT);
+ save_dialog.set_do_overwrite_confirmation(true);
+ save_dialog.set_modal(true);
+ try {
+ (save_dialog as Gtk.FileChooser).set_current_name(GLib.Uri.escape_string(GLib.Path.get_basename(file_uri)));
+ (save_dialog as Gtk.FileChooser).set_uri(GLib.Uri.escape_string(GLib.Path.get_basename(GLib.Uri.unescape_string(file_uri))));
+ } catch (GLib.Error error) {
+ warning("Faild to open save dialog: %s\n", error.message);
+ }
+ save_dialog.response.connect(save_as);
+ save_dialog.show();
+ }
+
private bool on_clicked(EventButton event_button) {
switch (state) {
case FileTransfer.State.COMPLETE:
- if (event_button.button == 1) {
- try{
- AppInfo.launch_default_for_uri(file_uri, null);
- } catch (Error err) {
- warning("Failed to open %s - %s", file_uri, err.message);
- }
+ if (event_button.button == 1 && this.widget.file_menu.popover.visible == false) {
+ open_file();
+ }
+ if (event_button.button == 3 && this.widget.file_menu.popover.visible == false) {
+ save_file();
}
break;
case FileTransfer.State.NOT_STARTED: