Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

drop-zone: Fixes and improvements to Vala code #99

Merged
merged 1 commit into from
Mar 1, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
143 changes: 67 additions & 76 deletions demos/Drop Zone/main.vala
Original file line number Diff line number Diff line change
@@ -1,130 +1,121 @@
#! /usr/bin/env -S vala workbench.vala --pkg gtk4 --pkg libadwaita-1 --pkg gio-2.0 --pkg gobject-2.0
#! /usr/bin/env -S vala workbench.vala --pkg libadwaita-1

using Gtk;
using GLib;
using Gdk;
using Adw;

void main() {
Adw.Bin bin = workbench.builder.get_object("bin") as Adw.Bin;
public void main () {
var bin = (Adw.Bin) workbench.builder.get_object ("bin");

// Universal drop target for any String data
var string_drop_target = new DropTarget(GLib.Type.STRING, Gdk.DragAction.COPY);
bin.add_controller(string_drop_target);
var string_drop_target = new Gtk.DropTarget (Type.STRING, COPY);
bin.add_controller (string_drop_target);

string_drop_target.drop.connect((self, value, x, y) => {
bin.child = createTextPreview(value.get_string());
bin.remove_css_class("overlay-drag-area");
string_drop_target.drop.connect ((value, x, y) => {
bin.child = create_text_preview (value.get_string ());
bin.remove_css_class ("overlay-drag-area");
return true;
});

// Drop Target for Files
var file_drop_target = new DropTarget(typeof (GLib.File), Gdk.DragAction.COPY);
bin.add_controller(file_drop_target);

file_drop_target.drop.connect((self, value, x, y) => {
File file = value.get_object() as GLib.File;
var file_drop_target = new Gtk.DropTarget (typeof (File), COPY);
bin.add_controller (file_drop_target);

if (!(file is GLib.File))
return false;
file_drop_target.drop.connect ((value, x, y) => {
var file = (File) value;

try {
var file_info = file.query_info("standard::content-type", 0, null);
string content_type = file_info.get_content_type();
if (content_type.has_prefix("image/")) {
bin.child = createImagePreview(file);
} else if (content_type.has_prefix("video/")) {
bin.child = createVideoPreview(file);
var file_info = file.query_info ("standard::content-type", 0, null);
string content_type = file_info.get_content_type ();
if (content_type.has_prefix ("image/")) {
bin.child = create_image_preview (file);
} else if (content_type.has_prefix ("video/")) {
bin.child = create_video_preview (file);
} else {
bin.child = createFilePreview(file);
bin.child = create_file_preview (file);
}
} catch (GLib.Error e) {
message("Failed to retrieve file info: \"%s\"", e.message);
} catch (Error e) {
critical (@"Unable to load preview: \"$(e.message)\"");
}

bin.remove_css_class("overlay-drag-area");
bin.remove_css_class ("overlay-drag-area");
return true;
});

// Drop Hover Effect
file_drop_target.enter.connect(() => {
bin.add_css_class("overlay-drag-area");
return Gdk.DragAction.COPY;
file_drop_target.enter.connect (() => {
bin.add_css_class ("overlay-drag-area");
return COPY;
});

file_drop_target.leave.connect(() => {
bin.remove_css_class("overlay-drag-area");
return;
file_drop_target.leave.connect (() => {
bin.remove_css_class ("overlay-drag-area");
});

string_drop_target.enter.connect(() => {
bin.add_css_class("overlay-drag-area");
return Gdk.DragAction.COPY;
string_drop_target.enter.connect (() => {
bin.add_css_class ("overlay-drag-area");
return COPY;
});

string_drop_target.leave.connect(() => {
bin.remove_css_class("overlay-drag-area");
return;
string_drop_target.leave.connect (() => {
bin.remove_css_class ("overlay-drag-area");
});
}

private Widget createImagePreview(GLib.File file) {
var widget = createBoxWidget();
private Gtk.Widget create_image_preview (File file) {
var widget = create_box_widget ();

var picture = new Picture() {
file = file, can_shrink = true, content_fit = Gtk.ContentFit.SCALE_DOWN
var picture = new Gtk.Picture () {
file = file,
can_shrink = true,
content_fit = SCALE_DOWN
};
widget.append(picture);
widget.append (picture);

return widget;
}

private Widget createTextPreview(string text) {
var widget = createBoxWidget();
private Gtk.Widget create_text_preview (string text) {
var widget = create_box_widget ();

var label = new Label(text) {
var label = new Gtk.Label (text) {
wrap = true
};
widget.append(label);
widget.append (label);

return widget;
}

private Widget createVideoPreview(GLib.File file) {
var widget = createBoxWidget();
private Gtk.Widget create_video_preview (File file) {
var widget = create_box_widget ();

var video = new Video.for_file(file);
widget.append(video);
var video = new Gtk.Video.for_file (file);
widget.append (video);

return widget;
}

private Widget createFilePreview(GLib.File file) {
var widget = createBoxWidget();
private Gtk.Widget create_file_preview (File file) {
var widget = create_box_widget ();

try {
var file_info = file.query_info("standard::icon", 0, null);
var icon = new Image.from_gicon(file_info.get_icon());
widget.append(icon);
icon.icon_size = IconSize.LARGE;

var file_name = new Label(file.get_basename());
widget.append(file_name);
} catch (GLib.Error e) {
message("Failed to retrieve file icon: \"%s\"", e.message);
var file_info = file.query_info ("standard::icon", NONE, null);
var icon = new Gtk.Image.from_gicon (file_info.get_icon ());
widget.append (icon);
icon.icon_size = LARGE;

var file_name = new Gtk.Label (file.get_basename ());
widget.append (file_name);
} catch (Error e) {
critical (@"Failed to retrieve file icon: $(e.message)");
}

return widget;
}

private Box createBoxWidget() {
var widget = new Box(Orientation.VERTICAL, 6);
widget.halign = Align.CENTER;
widget.valign = Align.CENTER;
widget.margin_top = 12;
widget.margin_bottom = 12;
widget.margin_start = 12;
widget.margin_end = 12;

return widget;
private Gtk.Box create_box_widget () {
return new Gtk.Box (VERTICAL, 6) {
halign = CENTER,
valign = CENTER,
margin_top = 12,
margin_bottom = 12,
margin_start = 12,
margin_end = 12
};
}
Loading