NAME
Chandra::DragDrop - Drag and drop support for Chandra applications
SYNOPSIS
use Chandra::App;
my $app = Chandra::App->new(title => 'My App');
# File drops on entire window
$app->on_file_drop(sub {
my ($files) = @_;
print "Dropped: $_\n" for @$files;
});
# Drop zone specific
$app->drop_zone('#upload-area', sub {
my ($files, $target) = @_;
upload_files(@$files);
});
# Text drops
my $dd = $app->drag_drop;
$dd->on_text_drop(sub {
my ($text, $target) = @_;
print "Dropped text: $text\n";
});
# Drag feedback
$dd->on_drag_enter(sub {
my ($target) = @_;
return 'drag-highlight'; # CSS class added during drag-over
});
$dd->on_drag_leave(sub {
my ($target) = @_;
});
# Intra-app draggable elements
$dd->make_draggable('#item-1', data => { id => 1, type => 'task' });
$dd->make_draggable('.card', data_from => 'data-item-id');
$dd->on_internal_drop(sub {
my ($data, $source, $target) = @_;
move_item($data->{id}, $target->{id});
});
# Enable/disable
$dd->disable;
$dd->enable;
# Remove specific handlers
$dd->remove_drop_zone('#upload-area');
$dd->remove_draggable('.card');
DESCRIPTION
Chandra::DragDrop handles file drops and intra-app drag-and-drop with Perl callbacks. It injects JavaScript event listeners into the webview that intercept drag events and forward them to registered Perl handlers via the window.chandra.invoke() bridge.
File drops from the OS, text drops, and intra-app element dragging are all supported. Drop zones restrict where drops are accepted using CSS selectors.
METHODS
new
my $dd = Chandra::DragDrop->new(app => $app);
Create a new DragDrop instance. Usually accessed via $app->drag_drop.
on_file_drop
$dd->on_file_drop(sub {
my ($files, $target) = @_;
# $files = ['/path/to/file1.txt', ...]
# $target = { id => '...', class => '...', tag => '...' }
});
Register a global handler for files dragged from the OS into the webview. Called for any drop not handled by a zone-specific handler.
on_text_drop
$dd->on_text_drop(sub {
my ($text, $target) = @_;
});
Register a handler for text/plain drops.
on_drag_enter
$dd->on_drag_enter(sub {
my ($target) = @_;
return 'highlight-css-class';
});
Called when a drag enters an element. Return a CSS class name to add visual feedback (the class is added to the target element by id).
on_drag_leave
$dd->on_drag_leave(sub { my ($target) = @_ });
Called when a drag leaves an element.
on_internal_drop
$dd->on_internal_drop(sub {
my ($data, $source, $target) = @_;
});
Called when a draggable element is dropped on another element within the same webview.
add_drop_zone
$dd->add_drop_zone('#upload-area', sub {
my ($files, $target) = @_;
});
Register a zone-specific file drop handler. The CSS selector is matched on the JS side via el.closest().
remove_drop_zone
$dd->remove_drop_zone('#upload-area');
drop_zones
my @selectors = $dd->drop_zones;
List registered drop zone selectors.
make_draggable
$dd->make_draggable('.card', data => { id => 1 });
$dd->make_draggable('.row', data_from => 'data-item-id');
Mark elements matching the selector as draggable. Use data for static drag payloads or data_from to read from a DOM attribute.
remove_draggable
$dd->remove_draggable('.card');
enable / disable / is_enabled
$dd->disable;
$dd->enable;
say $dd->is_enabled;
Toggle drag-and-drop event processing.
inject
$dd->inject;
Inject the drag-and-drop JavaScript. Called automatically by Chandra::App->run() when handlers are registered.
js_code
my $js = $dd->js_code;
Return the JavaScript source for manual injection.
SEE ALSO
AUTHOR
LNATION <email@lnation.org>
LICENSE
This is free software; you can redistribute it and/or modify it under the same terms as Perl itself.