1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-25 05:07:34 +00:00

LibVT: Allow dragging hyperlinks :^)

You can now drag a hyperlink as a text/uri-list. This allows you to
drag a file from "ls" output and drop it on a FileManager to copy
the file there. Truly futuristic stuff!
This commit is contained in:
Andreas Kling 2020-05-10 17:39:11 +02:00
parent 901d2e3236
commit f41bbdd46e
2 changed files with 26 additions and 1 deletions

View file

@ -36,6 +36,7 @@
#include <LibGUI/Action.h> #include <LibGUI/Action.h>
#include <LibGUI/Application.h> #include <LibGUI/Application.h>
#include <LibGUI/Clipboard.h> #include <LibGUI/Clipboard.h>
#include <LibGUI/DragOperation.h>
#include <LibGUI/Menu.h> #include <LibGUI/Menu.h>
#include <LibGUI/Painter.h> #include <LibGUI/Painter.h>
#include <LibGUI/ScrollBar.h> #include <LibGUI/ScrollBar.h>
@ -639,6 +640,7 @@ void TerminalWidget::mouseup_event(GUI::MouseEvent& event)
Desktop::Launcher::open(attribute.href); Desktop::Launcher::open(attribute.href);
} }
if (!m_active_href_id.is_null()) { if (!m_active_href_id.is_null()) {
m_active_href = {};
m_active_href_id = {}; m_active_href_id = {};
update(); update();
} }
@ -648,12 +650,16 @@ void TerminalWidget::mouseup_event(GUI::MouseEvent& event)
void TerminalWidget::mousedown_event(GUI::MouseEvent& event) void TerminalWidget::mousedown_event(GUI::MouseEvent& event)
{ {
if (event.button() == GUI::MouseButton::Left) { if (event.button() == GUI::MouseButton::Left) {
m_left_mousedown_position = event.position();
auto attribute = m_terminal.attribute_at(buffer_position_at(event.position())); auto attribute = m_terminal.attribute_at(buffer_position_at(event.position()));
if (!(event.modifiers() & Mod_Shift) && !attribute.href.is_empty()) { if (!(event.modifiers() & Mod_Shift) && !attribute.href.is_empty()) {
m_active_href = attribute.href;
m_active_href_id = attribute.href_id; m_active_href_id = attribute.href_id;
update(); update();
return; return;
} }
m_active_href = {};
m_active_href_id = {}; m_active_href_id = {};
if (m_triple_click_timer.is_valid() && m_triple_click_timer.elapsed() < 250) { if (m_triple_click_timer.is_valid() && m_triple_click_timer.elapsed() < 250) {
@ -700,8 +706,24 @@ void TerminalWidget::mousemove_event(GUI::MouseEvent& event)
if (!(event.buttons() & GUI::MouseButton::Left)) if (!(event.buttons() & GUI::MouseButton::Left))
return; return;
if (!m_active_href_id.is_null()) if (!m_active_href_id.is_null()) {
auto diff = event.position() - m_left_mousedown_position;
auto distance_travelled_squared = diff.x() * diff.x() + diff.y() * diff.y();
constexpr int drag_distance_threshold = 5;
if (distance_travelled_squared <= drag_distance_threshold)
return;
auto drag_operation = GUI::DragOperation::construct();
drag_operation->set_text(m_active_href);
drag_operation->set_data("text/uri-list", m_active_href);
drag_operation->exec();
m_active_href = {};
m_active_href_id = {};
update();
return; return;
}
auto old_selection_end = m_selection_end; auto old_selection_end = m_selection_end;
m_selection_end = position; m_selection_end = position;

View file

@ -134,6 +134,7 @@ private:
String m_hovered_href; String m_hovered_href;
String m_hovered_href_id; String m_hovered_href_id;
String m_active_href;
String m_active_href_id; String m_active_href_id;
// Snapshot of m_hovered_href when opening a context menu for a hyperlink. // Snapshot of m_hovered_href when opening a context menu for a hyperlink.
@ -179,4 +180,6 @@ private:
RefPtr<GUI::Menu> m_context_menu_for_hyperlink; RefPtr<GUI::Menu> m_context_menu_for_hyperlink;
Core::ElapsedTimer m_triple_click_timer; Core::ElapsedTimer m_triple_click_timer;
Gfx::Point m_left_mousedown_position;
}; };