From d739877807150d7854f81669ed48d4c5616769ba Mon Sep 17 00:00:00 2001 From: Rodrigo Tobar Date: Sat, 17 Dec 2022 20:36:54 +0800 Subject: [PATCH] PDFViewer: Inform about selections on Outline view Selecting an Outline Item from the Outline view informs via callback the corresponding Destination that has been selected. This will be used to move the application to the corresponding page/section/etc. --- Userland/Applications/PDFViewer/OutlineModel.cpp | 7 +++++++ Userland/Applications/PDFViewer/OutlineModel.h | 2 ++ Userland/Applications/PDFViewer/SidebarWidget.cpp | 8 ++++++++ Userland/Applications/PDFViewer/SidebarWidget.h | 4 ++++ 4 files changed, 21 insertions(+) diff --git a/Userland/Applications/PDFViewer/OutlineModel.cpp b/Userland/Applications/PDFViewer/OutlineModel.cpp index f38b450d0d..27f5b99b30 100644 --- a/Userland/Applications/PDFViewer/OutlineModel.cpp +++ b/Userland/Applications/PDFViewer/OutlineModel.cpp @@ -10,6 +10,7 @@ #include #include #include +#include enum Columns { Page, @@ -60,6 +61,12 @@ int OutlineModel::column_count(const GUI::ModelIndex&) const return Columns::_Count; } +PDF::Destination const& OutlineModel::get_destination(GUI::ModelIndex const& index) +{ + auto* outline_item = static_cast(index.internal_data()); + return outline_item->dest; +} + GUI::Variant OutlineModel::data(const GUI::ModelIndex& index, GUI::ModelRole role) const { VERIFY(index.is_valid()); diff --git a/Userland/Applications/PDFViewer/OutlineModel.h b/Userland/Applications/PDFViewer/OutlineModel.h index ec55357142..f5297a8c1a 100644 --- a/Userland/Applications/PDFViewer/OutlineModel.h +++ b/Userland/Applications/PDFViewer/OutlineModel.h @@ -23,6 +23,8 @@ public: virtual GUI::ModelIndex parent_index(const GUI::ModelIndex&) const override; virtual GUI::ModelIndex index(int row, int column, const GUI::ModelIndex&) const override; + static PDF::Destination const& get_destination(GUI::ModelIndex const&); + private: OutlineModel(NonnullRefPtr const& outline); diff --git a/Userland/Applications/PDFViewer/SidebarWidget.cpp b/Userland/Applications/PDFViewer/SidebarWidget.cpp index ad97d83cab..35ca3df457 100644 --- a/Userland/Applications/PDFViewer/SidebarWidget.cpp +++ b/Userland/Applications/PDFViewer/SidebarWidget.cpp @@ -5,6 +5,7 @@ */ #include "SidebarWidget.h" +#include "OutlineModel.h" #include #include @@ -24,6 +25,13 @@ SidebarWidget::SidebarWidget() m_outline_tree_view->set_activates_on_selection(true); m_outline_tree_view->set_should_fill_selected_rows(true); m_outline_tree_view->set_selection_behavior(GUI::AbstractView::SelectionBehavior::SelectRows); + m_outline_tree_view->on_selection_change = [this]() { + auto& selection = m_outline_tree_view->selection(); + if (selection.is_empty()) + return; + auto destination = OutlineModel::get_destination(selection.first()); + on_destination_selected(destination); + }; auto& thumbnails_container = tab_bar.add_tab("Thumbnails"); thumbnails_container.set_layout(); diff --git a/Userland/Applications/PDFViewer/SidebarWidget.h b/Userland/Applications/PDFViewer/SidebarWidget.h index 3e83d01e68..e36a44950a 100644 --- a/Userland/Applications/PDFViewer/SidebarWidget.h +++ b/Userland/Applications/PDFViewer/SidebarWidget.h @@ -6,6 +6,8 @@ #pragma once +#include "LibGUI/ModelIndex.h" +#include "LibPDF/Document.h" #include "OutlineModel.h" #include #include @@ -16,6 +18,8 @@ class SidebarWidget final : public GUI::Widget { public: ~SidebarWidget() override = default; + Function on_destination_selected; + ErrorOr set_outline(RefPtr outline) { if (outline) {