aboutsummaryrefslogtreecommitdiff
path: root/main/src/ui/conversation_content_view/file_default_widget.vala
diff options
context:
space:
mode:
authorfiaxh <git@lightrise.org>2020-04-10 21:08:23 +0200
committerfiaxh <git@lightrise.org>2020-04-10 21:08:23 +0200
commitff4403fb21ea5a3575a7a3f7cafcf83a7fb46bf9 (patch)
treecabe6b83aba5caf67dab538595201f879f6db9a7 /main/src/ui/conversation_content_view/file_default_widget.vala
parentbd8063284c7d3f5f6a2646e91b4f14e87e2765a8 (diff)
downloaddino-ff4403fb21ea5a3575a7a3f7cafcf83a7fb46bf9.tar.gz
dino-ff4403fb21ea5a3575a7a3f7cafcf83a7fb46bf9.zip
Clean up file widget code
Diffstat (limited to 'main/src/ui/conversation_content_view/file_default_widget.vala')
-rw-r--r--main/src/ui/conversation_content_view/file_default_widget.vala127
1 files changed, 127 insertions, 0 deletions
diff --git a/main/src/ui/conversation_content_view/file_default_widget.vala b/main/src/ui/conversation_content_view/file_default_widget.vala
new file mode 100644
index 00000000..045223fe
--- /dev/null
+++ b/main/src/ui/conversation_content_view/file_default_widget.vala
@@ -0,0 +1,127 @@
+using Gee;
+using Gdk;
+using Gtk;
+
+using Dino.Entities;
+
+namespace Dino.Ui {
+
+[GtkTemplate (ui = "/im/dino/Dino/file_default_widget.ui")]
+public class FileDefaultWidget : EventBox {
+
+ [GtkChild] public Stack image_stack;
+ [GtkChild] public Label name_label;
+ [GtkChild] public Label mime_label;
+ [GtkChild] public Image content_type_image;
+ [GtkChild] public Spinner spinner;
+ [GtkChild] public EventBox stack_event_box;
+
+ private FileTransfer.State state;
+ private bool pointer_inside = false;
+
+ public FileDefaultWidget() {
+ this.enter_notify_event.connect(on_pointer_entered);
+ this.leave_notify_event.connect(on_pointer_left);
+
+ stack_event_box.enter_notify_event.connect((event) => { pointer_inside = true; return false; });
+ mime_label.enter_notify_event.connect((event) => { pointer_inside = true; return false; });
+ stack_event_box.leave_notify_event.connect((event) => { pointer_inside = true; return false; });
+ mime_label.leave_notify_event.connect((event) => { pointer_inside = true; return false; });
+ }
+
+ public void update_file_info(string? mime_type, FileTransfer.State state, int size) {
+ this.state = state;
+
+ spinner.active = false; // A hidden spinning spinner still uses CPU. Deactivate asap
+
+ content_type_image.icon_name = get_file_icon_name(mime_type);
+ string? mime_description = mime_type != null ? ContentType.get_description(mime_type) : null;
+
+ switch (state) {
+ case FileTransfer.State.COMPLETE:
+ mime_label.label = mime_description;
+ image_stack.set_visible_child_name("content_type_image");
+ break;
+ case FileTransfer.State.IN_PROGRESS:
+ mime_label.label = _("Downloading %s…").printf(get_size_string(size));
+ spinner.active = true;
+ image_stack.set_visible_child_name("spinner");
+ break;
+ case FileTransfer.State.NOT_STARTED:
+ if (mime_description != null) {
+ mime_label.label = _("%s offered: %s").printf(mime_description, get_size_string(size));
+ } else if (size != -1) {
+ mime_label.label = _("File offered: %s").printf(get_size_string(size));
+ } else {
+ mime_label.label = _("File offered");
+ }
+ image_stack.set_visible_child_name("content_type_image");
+ break;
+ case FileTransfer.State.FAILED:
+ mime_label.use_markup = true;
+ mime_label.label = "<span foreground=\"#f44336\">" + _("File transfer failed") + "</span>";
+ image_stack.set_visible_child_name("content_type_image");
+ break;
+ }
+ }
+
+ private bool on_pointer_entered(Gdk.EventCrossing event) {
+ pointer_inside = true;
+ Timeout.add(20, () => {
+ if (pointer_inside) {
+ event.get_window().set_cursor(new Cursor.for_display(Gdk.Display.get_default(), CursorType.HAND2));
+ content_type_image.opacity = 0.7;
+ if (state == FileTransfer.State.NOT_STARTED) {
+ image_stack.set_visible_child_name("download_image");
+ }
+ }
+ return false;
+ });
+ return false;
+ }
+
+ private bool on_pointer_left(Gdk.EventCrossing event) {
+ pointer_inside = false;
+ Timeout.add(20, () => {
+ if (!pointer_inside) {
+ event.get_window().set_cursor(new Cursor.for_display(Gdk.Display.get_default(), CursorType.XTERM));
+ content_type_image.opacity = 0.5;
+ if (state == FileTransfer.State.NOT_STARTED) {
+ image_stack.set_visible_child_name("content_type_image");
+ }
+ }
+ return false;
+ });
+ return false;
+ }
+
+ private static string get_file_icon_name(string? mime_type) {
+ if (mime_type == null) return "dino-file-symbolic";
+
+ string generic_icon_name = ContentType.get_generic_icon_name(mime_type) ?? "";
+ switch (generic_icon_name) {
+ case "audio-x-generic": return "dino-file-music-symbolic";
+ case "image-x-generic": return "dino-file-image-symbolic";
+ case "text-x-generic": return "dino-file-document-symbolic";
+ case "text-x-generic-template": return "dino-file-document-symbolic";
+ case "video-x-generic": return "dino-file-video-symbolic";
+ case "x-office-document": return "dino-file-document-symbolic";
+ case "x-office-spreadsheet": return "dino-file-table-symbolic";
+ default: return "dino-file-symbolic";
+ }
+ }
+
+ private static string get_size_string(int size) {
+ if (size < 1024) {
+ return @"$(size) B";
+ } else if (size < 1000 * 1000) {
+ return @"$(size / 1000) kB";
+ } else if (size < 1000 * 1000 * 1000) {
+ return @"$(size / 1000 / 1000) MB";
+ } else {
+ return @"$(size / 1000 / 1000 / 1000) GB";
+ }
+ }
+}
+
+}