aboutsummaryrefslogtreecommitdiffstats
path: root/src/shared/help/contentwindow.cpp
blob: 75bf8073b5abd02aa37920fd81aa5a9410896538 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
// Copyright (C) 2016 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0+ OR GPL-3.0 WITH Qt-GPL-exception-1.0

#include "contentwindow.h"

#include <helpviewer.h>
#include <localhelpmanager.h>
#include <openpagesmanager.h>

#include <utils/navigationtreeview.h>

#include <QLayout>
#include <QFocusEvent>
#include <QMenu>

#include <QHelpEngine>
#include <QHelpContentModel>

using namespace Help::Internal;

ContentWindow::ContentWindow()
    : m_contentWidget(0)
    , m_expandDepth(-2)
    , m_isOpenInNewPageActionVisible(true)
{
    m_contentModel = (&LocalHelpManager::helpEngine())->contentModel();
    m_contentWidget = new Utils::NavigationTreeView;
    m_contentWidget->setModel(m_contentModel);
    m_contentWidget->setActivationMode(Utils::SingleClickActivation);
    m_contentWidget->installEventFilter(this);
    m_contentWidget->viewport()->installEventFilter(this);
    m_contentWidget->setContextMenuPolicy(Qt::CustomContextMenu);
    setFocusProxy(m_contentWidget);

    QVBoxLayout *layout = new QVBoxLayout(this);
    layout->setContentsMargins(0, 0, 0, 0);
    layout->addWidget(m_contentWidget);

    connect(m_contentWidget, &QWidget::customContextMenuRequested,
            this, &ContentWindow::showContextMenu);
    connect(m_contentWidget, &QTreeView::activated,
            this, &ContentWindow::itemActivated);

    connect(m_contentModel, &QHelpContentModel::contentsCreated,
            this, &ContentWindow::expandTOC);
}

ContentWindow::~ContentWindow()
{
}

void ContentWindow::setOpenInNewPageActionVisible(bool visible)
{
    m_isOpenInNewPageActionVisible = visible;
}

void ContentWindow::expandTOC()
{
    if (m_expandDepth > -2) {
        expandToDepth(m_expandDepth);
        m_expandDepth = -2;
    }
}

void ContentWindow::expandToDepth(int depth)
{
    m_expandDepth = depth;
    if (depth == -1)
        m_contentWidget->expandAll();
    else
        m_contentWidget->expandToDepth(depth);
}

bool ContentWindow::eventFilter(QObject *o, QEvent *e)
{
    if (m_isOpenInNewPageActionVisible && m_contentWidget && o == m_contentWidget->viewport()
        && e->type() == QEvent::MouseButtonRelease) {
        QMouseEvent *me = static_cast<QMouseEvent*>(e);
        QItemSelectionModel *sm = m_contentWidget->selectionModel();
        if (!sm)
            return QWidget::eventFilter(o, e);

        Qt::MouseButtons button = me->button();
        const QModelIndex &index = m_contentWidget->indexAt(me->pos());

        if (index.isValid() && sm->isSelected(index)) {
            if ((button == Qt::LeftButton && (me->modifiers() & Qt::ControlModifier))
                    || (button == Qt::MiddleButton)) {
                QHelpContentItem *itm = m_contentModel->contentItemAt(index);
                if (itm)
                    emit linkActivated(itm->url(), true/*newPage*/);
            }
        }
    }
    return QWidget::eventFilter(o, e);
}

void ContentWindow::showContextMenu(const QPoint &pos)
{
    if (!m_contentWidget->indexAt(pos).isValid())
        return;

    QHelpContentModel *contentModel =
        qobject_cast<QHelpContentModel*>(m_contentWidget->model());
    QHelpContentItem *itm =
        contentModel->contentItemAt(m_contentWidget->currentIndex());

    QMenu menu;
    QAction *curTab = menu.addAction(tr("Open Link"));
    QAction *newTab = 0;
    if (m_isOpenInNewPageActionVisible)
        newTab = menu.addAction(tr("Open Link as New Page"));

    QAction *action = menu.exec(m_contentWidget->mapToGlobal(pos));
    if (curTab == action)
        emit linkActivated(itm->url(), false/*newPage*/);
    else if (newTab && newTab == action)
        emit linkActivated(itm->url(), true/*newPage*/);
}

void ContentWindow::itemActivated(const QModelIndex &index)
{
    if (QHelpContentItem *itm = m_contentModel->contentItemAt(index))
        emit linkActivated(itm->url(), false/*newPage*/);
}