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*/);
}
|