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) {