mirror of
https://github.com/LadybirdBrowser/ladybird.git
synced 2024-11-22 15:40:19 +00:00
UI/Qt: Assign dropdown handler for select in WebContentView, not Tab
This makes `<select>` elements also work outside of Tab content, for example in the Inspector. Co-authored-by: Tim Flynn <trflynn89@serenityos.org>
This commit is contained in:
parent
ced7b6de5e
commit
421fb6309f
Notes:
github-actions[bot]
2024-09-03 09:14:01 +00:00
Author: https://github.com/AtkinsSJ Commit: https://github.com/LadybirdBrowser/ladybird/commit/421fb6309f6 Pull-request: https://github.com/LadybirdBrowser/ladybird/pull/1168 Reviewed-by: https://github.com/trflynn89
4 changed files with 53 additions and 48 deletions
|
@ -319,47 +319,6 @@ Tab::Tab(BrowserWindow* window, RefPtr<WebView::WebContentClient> parent_client,
|
||||||
m_find_in_page->update_result_label(current_match_index, total_match_count);
|
m_find_in_page->update_result_label(current_match_index, total_match_count);
|
||||||
};
|
};
|
||||||
|
|
||||||
m_select_dropdown = new QMenu("Select Dropdown", this);
|
|
||||||
QObject::connect(m_select_dropdown, &QMenu::aboutToHide, this, [this]() {
|
|
||||||
if (!m_select_dropdown->activeAction())
|
|
||||||
view().select_dropdown_closed({});
|
|
||||||
});
|
|
||||||
|
|
||||||
view().on_request_select_dropdown = [this](Gfx::IntPoint content_position, i32 minimum_width, Vector<Web::HTML::SelectItem> items) {
|
|
||||||
m_select_dropdown->clear();
|
|
||||||
m_select_dropdown->setMinimumWidth(minimum_width / view().device_pixel_ratio());
|
|
||||||
|
|
||||||
auto add_menu_item = [this](Web::HTML::SelectItemOption const& item_option, bool in_option_group) {
|
|
||||||
QAction* action = new QAction(qstring_from_ak_string(in_option_group ? MUST(String::formatted(" {}", item_option.label)) : item_option.label), this);
|
|
||||||
action->setCheckable(true);
|
|
||||||
action->setChecked(item_option.selected);
|
|
||||||
action->setDisabled(item_option.disabled);
|
|
||||||
action->setData(QVariant(static_cast<uint>(item_option.id)));
|
|
||||||
QObject::connect(action, &QAction::triggered, this, &Tab::select_dropdown_action);
|
|
||||||
m_select_dropdown->addAction(action);
|
|
||||||
};
|
|
||||||
|
|
||||||
for (auto const& item : items) {
|
|
||||||
if (item.has<Web::HTML::SelectItemOptionGroup>()) {
|
|
||||||
auto const& item_option_group = item.get<Web::HTML::SelectItemOptionGroup>();
|
|
||||||
QAction* subtitle = new QAction(qstring_from_ak_string(item_option_group.label), this);
|
|
||||||
subtitle->setDisabled(true);
|
|
||||||
m_select_dropdown->addAction(subtitle);
|
|
||||||
|
|
||||||
for (auto const& item_option : item_option_group.items)
|
|
||||||
add_menu_item(item_option, true);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (item.has<Web::HTML::SelectItemOption>())
|
|
||||||
add_menu_item(item.get<Web::HTML::SelectItemOption>(), false);
|
|
||||||
|
|
||||||
if (item.has<Web::HTML::SelectItemSeparator>())
|
|
||||||
m_select_dropdown->addSeparator();
|
|
||||||
}
|
|
||||||
|
|
||||||
m_select_dropdown->exec(view().map_point_to_global_position(content_position));
|
|
||||||
};
|
|
||||||
|
|
||||||
QObject::connect(focus_location_editor_action, &QAction::triggered, this, &Tab::focus_location_editor);
|
QObject::connect(focus_location_editor_action, &QAction::triggered, this, &Tab::focus_location_editor);
|
||||||
|
|
||||||
view().on_received_source = [this](auto const& url, auto const& source) {
|
view().on_received_source = [this](auto const& url, auto const& source) {
|
||||||
|
@ -796,12 +755,6 @@ Tab::~Tab()
|
||||||
delete m_inspector_widget;
|
delete m_inspector_widget;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Tab::select_dropdown_action()
|
|
||||||
{
|
|
||||||
QAction* action = qobject_cast<QAction*>(sender());
|
|
||||||
view().select_dropdown_closed(action->data().value<uint>());
|
|
||||||
}
|
|
||||||
|
|
||||||
void Tab::update_reset_zoom_button()
|
void Tab::update_reset_zoom_button()
|
||||||
{
|
{
|
||||||
auto zoom_level = view().zoom_level();
|
auto zoom_level = view().zoom_level();
|
||||||
|
|
|
@ -84,7 +84,6 @@ public:
|
||||||
public slots:
|
public slots:
|
||||||
void focus_location_editor();
|
void focus_location_editor();
|
||||||
void location_edit_return_pressed();
|
void location_edit_return_pressed();
|
||||||
void select_dropdown_action();
|
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void title_changed(int id, QString const&);
|
void title_changed(int id, QString const&);
|
||||||
|
|
|
@ -142,10 +142,57 @@ WebContentView::WebContentView(QWidget* window, RefPtr<WebView::WebContentClient
|
||||||
auto worker_client = MUST(launch_web_worker_process(MUST(get_paths_for_helper_process("WebWorker"sv)), request_server_client));
|
auto worker_client = MUST(launch_web_worker_process(MUST(get_paths_for_helper_process("WebWorker"sv)), request_server_client));
|
||||||
return worker_client->dup_socket();
|
return worker_client->dup_socket();
|
||||||
};
|
};
|
||||||
|
|
||||||
|
m_select_dropdown = new QMenu("Select Dropdown", this);
|
||||||
|
QObject::connect(m_select_dropdown, &QMenu::aboutToHide, this, [this]() {
|
||||||
|
if (!m_select_dropdown->activeAction())
|
||||||
|
select_dropdown_closed({});
|
||||||
|
});
|
||||||
|
|
||||||
|
on_request_select_dropdown = [this](Gfx::IntPoint content_position, i32 minimum_width, Vector<Web::HTML::SelectItem> items) {
|
||||||
|
m_select_dropdown->clear();
|
||||||
|
m_select_dropdown->setMinimumWidth(minimum_width / device_pixel_ratio());
|
||||||
|
|
||||||
|
auto add_menu_item = [this](Web::HTML::SelectItemOption const& item_option, bool in_option_group) {
|
||||||
|
QAction* action = new QAction(qstring_from_ak_string(in_option_group ? MUST(String::formatted(" {}", item_option.label)) : item_option.label), this);
|
||||||
|
action->setCheckable(true);
|
||||||
|
action->setChecked(item_option.selected);
|
||||||
|
action->setDisabled(item_option.disabled);
|
||||||
|
action->setData(QVariant(static_cast<uint>(item_option.id)));
|
||||||
|
QObject::connect(action, &QAction::triggered, this, &WebContentView::select_dropdown_action);
|
||||||
|
m_select_dropdown->addAction(action);
|
||||||
|
};
|
||||||
|
|
||||||
|
for (auto const& item : items) {
|
||||||
|
if (item.has<Web::HTML::SelectItemOptionGroup>()) {
|
||||||
|
auto const& item_option_group = item.get<Web::HTML::SelectItemOptionGroup>();
|
||||||
|
QAction* subtitle = new QAction(qstring_from_ak_string(item_option_group.label), this);
|
||||||
|
subtitle->setDisabled(true);
|
||||||
|
m_select_dropdown->addAction(subtitle);
|
||||||
|
|
||||||
|
for (auto const& item_option : item_option_group.items)
|
||||||
|
add_menu_item(item_option, true);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.has<Web::HTML::SelectItemOption>())
|
||||||
|
add_menu_item(item.get<Web::HTML::SelectItemOption>(), false);
|
||||||
|
|
||||||
|
if (item.has<Web::HTML::SelectItemSeparator>())
|
||||||
|
m_select_dropdown->addSeparator();
|
||||||
|
}
|
||||||
|
|
||||||
|
m_select_dropdown->exec(map_point_to_global_position(content_position));
|
||||||
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
WebContentView::~WebContentView() = default;
|
WebContentView::~WebContentView() = default;
|
||||||
|
|
||||||
|
void WebContentView::select_dropdown_action()
|
||||||
|
{
|
||||||
|
QAction* action = qobject_cast<QAction*>(sender());
|
||||||
|
select_dropdown_closed(action->data().value<uint>());
|
||||||
|
}
|
||||||
|
|
||||||
static Web::UIEvents::MouseButton get_button_from_qt_mouse_button(Qt::MouseButton button)
|
static Web::UIEvents::MouseButton get_button_from_qt_mouse_button(Qt::MouseButton button)
|
||||||
{
|
{
|
||||||
if (button == Qt::MouseButton::LeftButton)
|
if (button == Qt::MouseButton::LeftButton)
|
||||||
|
|
|
@ -22,6 +22,7 @@
|
||||||
#include <LibWeb/HTML/ActivateTab.h>
|
#include <LibWeb/HTML/ActivateTab.h>
|
||||||
#include <LibWebView/ViewImplementation.h>
|
#include <LibWebView/ViewImplementation.h>
|
||||||
#include <QAbstractScrollArea>
|
#include <QAbstractScrollArea>
|
||||||
|
#include <QMenu>
|
||||||
#include <QTimer>
|
#include <QTimer>
|
||||||
#include <QUrl>
|
#include <QUrl>
|
||||||
|
|
||||||
|
@ -88,6 +89,9 @@ public:
|
||||||
|
|
||||||
QPoint map_point_to_global_position(Gfx::IntPoint) const;
|
QPoint map_point_to_global_position(Gfx::IntPoint) const;
|
||||||
|
|
||||||
|
public slots:
|
||||||
|
void select_dropdown_action();
|
||||||
|
|
||||||
signals:
|
signals:
|
||||||
void urls_dropped(QList<QUrl> const&);
|
void urls_dropped(QList<QUrl> const&);
|
||||||
|
|
||||||
|
@ -119,6 +123,8 @@ private:
|
||||||
bool m_should_show_line_box_borders { false };
|
bool m_should_show_line_box_borders { false };
|
||||||
|
|
||||||
Gfx::IntSize m_viewport_size;
|
Gfx::IntSize m_viewport_size;
|
||||||
|
|
||||||
|
QMenu* m_select_dropdown { nullptr };
|
||||||
};
|
};
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue