Userland: Accept drag_enter events for widgets supporting file drops

This patch will switch cursor to DragCopy when a user enters a widget
while dragging file(s), giving them a visual clue that it *might* be
dropped into this widget.

This is a rather naive approach, as the cursor icon will change for any
kind of file, as currently programs don't know the drag contents before
dropping it. But after all I think it's better than nothing. :^)
This commit is contained in:
Karol Kosek 2022-11-04 22:32:17 +01:00 committed by Andrew Kaster
parent 461ee18d64
commit 0b7f5bbdfb
Notes: sideshowbarker 2024-07-17 06:35:23 +09:00
21 changed files with 89 additions and 0 deletions

View file

@ -91,6 +91,7 @@ private:
glEndList(); glEndList();
} }
virtual void drag_enter_event(GUI::DragEvent&) override;
virtual void drop_event(GUI::DropEvent&) override; virtual void drop_event(GUI::DropEvent&) override;
virtual void paint_event(GUI::PaintEvent&) override; virtual void paint_event(GUI::PaintEvent&) override;
virtual void resize_event(GUI::ResizeEvent&) override; virtual void resize_event(GUI::ResizeEvent&) override;
@ -125,6 +126,13 @@ private:
float m_zoom = 1; float m_zoom = 1;
}; };
void GLContextWidget::drag_enter_event(GUI::DragEvent& event)
{
auto const& mime_types = event.mime_types();
if (mime_types.contains_slow("text/uri-list"))
event.accept();
}
void GLContextWidget::drop_event(GUI::DropEvent& event) void GLContextWidget::drop_event(GUI::DropEvent& event)
{ {
if (!event.mime_data().has_urls()) if (!event.mime_data().has_urls())

View file

@ -872,6 +872,13 @@ void MainWidget::update_preview()
m_font_preview_window->update(); m_font_preview_window->update();
} }
void MainWidget::drag_enter_event(GUI::DragEvent& event)
{
auto const& mime_types = event.mime_types();
if (mime_types.contains_slow("text/uri-list"))
event.accept();
}
void MainWidget::drop_event(GUI::DropEvent& event) void MainWidget::drop_event(GUI::DropEvent& event)
{ {
event.accept(); event.accept();

View file

@ -62,6 +62,7 @@ private:
ErrorOr<void> create_undo_stack(); ErrorOr<void> create_undo_stack();
ErrorOr<RefPtr<GUI::Window>> create_preview_window(); ErrorOr<RefPtr<GUI::Window>> create_preview_window();
virtual void drag_enter_event(GUI::DragEvent&) override;
virtual void drop_event(GUI::DropEvent&) override; virtual void drop_event(GUI::DropEvent&) override;
void undo(); void undo();

View file

@ -564,6 +564,13 @@ void HexEditorWidget::set_value_inspector_visible(bool visible)
m_side_panel_container->set_visible(visible || m_search_results_container->is_visible()); m_side_panel_container->set_visible(visible || m_search_results_container->is_visible());
} }
void HexEditorWidget::drag_enter_event(GUI::DragEvent& event)
{
auto const& mime_types = event.mime_types();
if (mime_types.contains_slow("text/uri-list"))
event.accept();
}
void HexEditorWidget::drop_event(GUI::DropEvent& event) void HexEditorWidget::drop_event(GUI::DropEvent& event)
{ {
event.accept(); event.accept();

View file

@ -36,6 +36,8 @@ private:
void set_search_results_visible(bool visible); void set_search_results_visible(bool visible);
void set_value_inspector_visible(bool visible); void set_value_inspector_visible(bool visible);
void update_inspector_values(size_t position); void update_inspector_values(size_t position);
virtual void drag_enter_event(GUI::DragEvent&) override;
virtual void drop_event(GUI::DropEvent&) override; virtual void drop_event(GUI::DropEvent&) override;
RefPtr<HexEditor> m_editor; RefPtr<HexEditor> m_editor;

View file

@ -198,6 +198,13 @@ void ViewWidget::load_from_file(String const& path)
reset_view(); reset_view();
} }
void ViewWidget::drag_enter_event(GUI::DragEvent& event)
{
auto const& mime_types = event.mime_types();
if (mime_types.contains_slow("text/uri-list"))
event.accept();
}
void ViewWidget::drop_event(GUI::DropEvent& event) void ViewWidget::drop_event(GUI::DropEvent& event)
{ {
event.accept(); event.accept();

View file

@ -58,6 +58,7 @@ private:
virtual void paint_event(GUI::PaintEvent&) override; virtual void paint_event(GUI::PaintEvent&) override;
virtual void mousedown_event(GUI::MouseEvent&) override; virtual void mousedown_event(GUI::MouseEvent&) override;
virtual void mouseup_event(GUI::MouseEvent&) override; virtual void mouseup_event(GUI::MouseEvent&) override;
virtual void drag_enter_event(GUI::DragEvent&) override;
virtual void drop_event(GUI::DropEvent&) override; virtual void drop_event(GUI::DropEvent&) override;
void set_bitmap(Gfx::Bitmap const* bitmap); void set_bitmap(Gfx::Bitmap const* bitmap);

View file

@ -1145,6 +1145,13 @@ ImageEditor& MainWidget::create_new_editor(NonnullRefPtr<Image> image)
return image_editor; return image_editor;
} }
void MainWidget::drag_enter_event(GUI::DragEvent& event)
{
auto const& mime_types = event.mime_types();
if (mime_types.contains_slow("text/uri-list"))
event.accept();
}
void MainWidget::drop_event(GUI::DropEvent& event) void MainWidget::drop_event(GUI::DropEvent& event)
{ {
if (!event.mime_data().has_urls()) if (!event.mime_data().has_urls())

View file

@ -56,6 +56,7 @@ private:
void set_actions_enabled(bool enabled); void set_actions_enabled(bool enabled);
virtual void drag_enter_event(GUI::DragEvent&) override;
virtual void drop_event(GUI::DropEvent&) override; virtual void drop_event(GUI::DropEvent&) override;
ProjectLoader m_loader; ProjectLoader m_loader;

View file

@ -119,6 +119,13 @@ void SoundPlayerWidgetAdvancedView::set_nonlinear_volume_slider(bool nonlinear)
m_nonlinear_volume_slider = nonlinear; m_nonlinear_volume_slider = nonlinear;
} }
void SoundPlayerWidgetAdvancedView::drag_enter_event(GUI::DragEvent& event)
{
auto const& mime_types = event.mime_types();
if (mime_types.contains_slow("text/uri-list"))
event.accept();
}
void SoundPlayerWidgetAdvancedView::drop_event(GUI::DropEvent& event) void SoundPlayerWidgetAdvancedView::drop_event(GUI::DropEvent& event)
{ {
event.accept(); event.accept();

View file

@ -57,6 +57,7 @@ private:
void sync_previous_next_actions(); void sync_previous_next_actions();
void drag_enter_event(GUI::DragEvent& event) override;
void drop_event(GUI::DropEvent& event) override; void drop_event(GUI::DropEvent& event) override;
GUI::Window& m_window; GUI::Window& m_window;

View file

@ -748,6 +748,13 @@ bool MainWidget::request_close()
return false; return false;
} }
void MainWidget::drag_enter_event(GUI::DragEvent& event)
{
auto const& mime_types = event.mime_types();
if (mime_types.contains_slow("text/uri-list"))
event.accept();
}
void MainWidget::drop_event(GUI::DropEvent& event) void MainWidget::drop_event(GUI::DropEvent& event)
{ {
event.accept(); event.accept();

View file

@ -54,6 +54,7 @@ private:
WebView::OutOfProcessWebView& ensure_web_view(); WebView::OutOfProcessWebView& ensure_web_view();
void set_web_view_visible(bool); void set_web_view_visible(bool);
virtual void drag_enter_event(GUI::DragEvent&) override;
virtual void drop_event(GUI::DropEvent&) override; virtual void drop_event(GUI::DropEvent&) override;
enum class ShowMessageIfNoResults { enum class ShowMessageIfNoResults {

View file

@ -134,6 +134,13 @@ void PreviewWidget::resize_event(GUI::ResizeEvent&)
update_preview_window_locations(); update_preview_window_locations();
} }
void PreviewWidget::drag_enter_event(GUI::DragEvent& event)
{
auto const& mime_types = event.mime_types();
if (mime_types.contains_slow("text/uri-list"))
event.accept();
}
void PreviewWidget::drop_event(GUI::DropEvent& event) void PreviewWidget::drop_event(GUI::DropEvent& event)
{ {
event.accept(); event.accept();

View file

@ -33,6 +33,7 @@ private:
virtual void paint_preview(GUI::PaintEvent&) override; virtual void paint_preview(GUI::PaintEvent&) override;
virtual void second_paint_event(GUI::PaintEvent&) override; virtual void second_paint_event(GUI::PaintEvent&) override;
virtual void resize_event(GUI::ResizeEvent&) override; virtual void resize_event(GUI::ResizeEvent&) override;
virtual void drag_enter_event(GUI::DragEvent&) override;
virtual void drop_event(GUI::DropEvent&) override; virtual void drop_event(GUI::DropEvent&) override;
virtual void palette_changed() override; virtual void palette_changed() override;

View file

@ -348,6 +348,13 @@ void Editor::mousedown_event(GUI::MouseEvent& event)
GUI::TextEditor::mousedown_event(event); GUI::TextEditor::mousedown_event(event);
} }
void Editor::drag_enter_event(GUI::DragEvent& event)
{
auto const& mime_types = event.mime_types();
if (mime_types.contains_slow("text/uri-list"))
event.accept();
}
void Editor::drop_event(GUI::DropEvent& event) void Editor::drop_event(GUI::DropEvent& event)
{ {
event.accept(); event.accept();

View file

@ -65,6 +65,7 @@ private:
virtual void paint_event(GUI::PaintEvent&) override; virtual void paint_event(GUI::PaintEvent&) override;
virtual void mousemove_event(GUI::MouseEvent&) override; virtual void mousemove_event(GUI::MouseEvent&) override;
virtual void mousedown_event(GUI::MouseEvent&) override; virtual void mousedown_event(GUI::MouseEvent&) override;
virtual void drag_enter_event(GUI::DragEvent&) override;
virtual void drop_event(GUI::DropEvent&) override; virtual void drop_event(GUI::DropEvent&) override;
virtual void enter_event(Core::Event&) override; virtual void enter_event(Core::Event&) override;
virtual void leave_event(Core::Event&) override; virtual void leave_event(Core::Event&) override;

View file

@ -397,6 +397,13 @@ void MainWidget::update_editor_actions(ScriptEditor* editor)
m_redo_action->set_enabled(editor->redo_action().is_enabled()); m_redo_action->set_enabled(editor->redo_action().is_enabled());
} }
void MainWidget::drag_enter_event(GUI::DragEvent& event)
{
auto const& mime_types = event.mime_types();
if (mime_types.contains_slow("text/uri-list"))
event.accept();
}
void MainWidget::drop_event(GUI::DropEvent& drop_event) void MainWidget::drop_event(GUI::DropEvent& drop_event)
{ {
drop_event.accept(); drop_event.accept();

View file

@ -36,6 +36,7 @@ private:
void update_statusbar(ScriptEditor*); void update_statusbar(ScriptEditor*);
void update_editor_actions(ScriptEditor*); void update_editor_actions(ScriptEditor*);
virtual void drag_enter_event(GUI::DragEvent&) override;
virtual void drop_event(GUI::DropEvent&) override; virtual void drop_event(GUI::DropEvent&) override;
RefPtr<GUI::Action> m_new_action; RefPtr<GUI::Action> m_new_action;

View file

@ -201,6 +201,13 @@ void QuickLaunchWidget::config_string_did_change(String const& domain, String co
} }
} }
void QuickLaunchWidget::drag_enter_event(GUI::DragEvent& event)
{
auto const& mime_types = event.mime_types();
if (mime_types.contains_slow("text/uri-list"))
event.accept();
}
void QuickLaunchWidget::drop_event(GUI::DropEvent& event) void QuickLaunchWidget::drop_event(GUI::DropEvent& event)
{ {
event.accept(); event.accept();

View file

@ -83,6 +83,7 @@ public:
virtual void config_key_was_removed(String const&, String const&, String const&) override; virtual void config_key_was_removed(String const&, String const&, String const&) override;
virtual void config_string_did_change(String const&, String const&, String const&, String const&) override; virtual void config_string_did_change(String const&, String const&, String const&, String const&) override;
virtual void drag_enter_event(GUI::DragEvent&) override;
virtual void drop_event(GUI::DropEvent&) override; virtual void drop_event(GUI::DropEvent&) override;
private: private: