Falkon Develop
Cross-platform Qt-based web browser
treewidget.cpp
Go to the documentation of this file.
1/* ============================================================
2* Falkon - Qt web browser
3* Copyright (C) 2010-2014 David Rosca <nowrep@gmail.com>
4*
5* This program is free software: you can redistribute it and/or modify
6* it under the terms of the GNU General Public License as published by
7* the Free Software Foundation, either version 3 of the License, or
8* (at your option) any later version.
9*
10* This program is distributed in the hope that it will be useful,
11* but WITHOUT ANY WARRANTY; without even the implied warranty of
12* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13* GNU General Public License for more details.
14*
15* You should have received a copy of the GNU General Public License
16* along with this program. If not, see <http://www.gnu.org/licenses/>.
17* ============================================================ */
18#include "treewidget.h"
19
20#include <QMouseEvent>
21
22TreeWidget::TreeWidget(QWidget* parent)
23 : QTreeWidget(parent)
24 , m_refreshAllItemsNeeded(true)
25 , m_showMode(ItemsCollapsed)
26{
27 connect(this, &QTreeWidget::itemChanged, this, &TreeWidget::sheduleRefresh);
28}
29
31{
32 QTreeWidget::clear();
33 m_allTreeItems.clear();
34}
35
36void TreeWidget::sheduleRefresh()
37{
38 m_refreshAllItemsNeeded = true;
39}
40
41void TreeWidget::addTopLevelItem(QTreeWidgetItem* item)
42{
43 m_allTreeItems.append(item);
44 QTreeWidget::addTopLevelItem(item);
45}
46
47void TreeWidget::addTopLevelItems(const QList<QTreeWidgetItem*> &items)
48{
49 m_allTreeItems.append(items);
50 QTreeWidget::addTopLevelItems(items);
51}
52
53void TreeWidget::insertTopLevelItem(int index, QTreeWidgetItem* item)
54{
55 m_allTreeItems.append(item);
56 QTreeWidget::insertTopLevelItem(index, item);
57}
58
59void TreeWidget::insertTopLevelItems(int index, const QList<QTreeWidgetItem*> &items)
60{
61 m_allTreeItems.append(items);
62 QTreeWidget::insertTopLevelItems(index, items);
63}
64
65void TreeWidget::mousePressEvent(QMouseEvent* event)
66{
67 if (event->modifiers() == Qt::ControlModifier) {
68 Q_EMIT itemControlClicked(itemAt(event->position().toPoint()));
69 }
70
71 if (event->buttons() == Qt::MiddleButton) {
72 Q_EMIT itemMiddleButtonClicked(itemAt(event->position().toPoint()));
73 }
74
75 QTreeWidget::mousePressEvent(event);
76}
77
78void TreeWidget::iterateAllItems(QTreeWidgetItem* parent)
79{
80 int count = parent ? parent->childCount() : topLevelItemCount();
81
82 for (int i = 0; i < count; i++) {
83 QTreeWidgetItem* item = parent ? parent->child(i) : topLevelItem(i);
84
85 if (item->childCount() == 0) {
86 m_allTreeItems.append(item);
87 }
88
89 iterateAllItems(item);
90 }
91}
92
93QList<QTreeWidgetItem*> TreeWidget::allItems()
94{
95 if (m_refreshAllItemsNeeded) {
96 m_allTreeItems.clear();
97 iterateAllItems(nullptr);
98 m_refreshAllItemsNeeded = false;
99 }
100
101 return m_allTreeItems;
102}
103
104void TreeWidget::filterString(const QString &string)
105{
106 const QList<QTreeWidgetItem*> _allItems = allItems();
107 QList<QTreeWidgetItem*> parents;
108 bool stringIsEmpty = string.isEmpty();
109 for (QTreeWidgetItem* item : _allItems) {
110 bool containsString = stringIsEmpty || item->text(0).contains(string, Qt::CaseInsensitive);
111 if (containsString) {
112 item->setHidden(false);
113 if (item->parent()) {
114 if (!parents.contains(item->parent())) {
115 parents << item->parent();
116 }
117 }
118 }
119 else {
120 item->setHidden(true);
121 if (item->parent()) {
122 item->parent()->setHidden(true);
123 }
124 }
125 }
126
127 for (int i = 0; i < parents.size(); ++i) {
128 QTreeWidgetItem* parentItem = parents.at(i);
129 parentItem->setHidden(false);
130 if (stringIsEmpty) {
131 parentItem->setExpanded(m_showMode == ItemsExpanded);
132 }
133 else {
134 parentItem->setExpanded(true);
135 }
136
137 if (parentItem->parent() && !parents.contains(parentItem->parent())) {
138 parents << parentItem->parent();
139 }
140 }
141}
142
143bool TreeWidget::appendToParentItem(const QString &parentText, QTreeWidgetItem* item)
144{
145 QList<QTreeWidgetItem*> list = findItems(parentText, Qt::MatchExactly);
146 if (list.isEmpty()) {
147 return false;
148 }
149 QTreeWidgetItem* parentItem = list.at(0);
150 if (!parentItem) {
151 return false;
152 }
153
154 m_allTreeItems.append(item);
155 parentItem->addChild(item);
156 return true;
157}
158
159bool TreeWidget::appendToParentItem(QTreeWidgetItem* parent, QTreeWidgetItem* item)
160{
161 if (!parent || parent->treeWidget() != this) {
162 return false;
163 }
164
165 m_allTreeItems.append(item);
166 parent->addChild(item);
167 return true;
168}
169
170bool TreeWidget::prependToParentItem(const QString &parentText, QTreeWidgetItem* item)
171{
172 QList<QTreeWidgetItem*> list = findItems(parentText, Qt::MatchExactly);
173 if (list.isEmpty()) {
174 return false;
175 }
176 QTreeWidgetItem* parentItem = list.at(0);
177 if (!parentItem) {
178 return false;
179 }
180
181 m_allTreeItems.append(item);
182 parentItem->insertChild(0, item);
183 return true;
184}
185
186bool TreeWidget::prependToParentItem(QTreeWidgetItem* parent, QTreeWidgetItem* item)
187{
188 if (!parent || parent->treeWidget() != this) {
189 return false;
190 }
191
192 m_allTreeItems.append(item);
193 parent->insertChild(0, item);
194 return true;
195}
196
197void TreeWidget::deleteItem(QTreeWidgetItem* item)
198{
199// if (m_allTreeItems.contains(item)) {
200// m_allTreeItems.removeOne(item);
201// }
202
203 m_refreshAllItemsNeeded = true;
204
205 delete item;
206}
207
208void TreeWidget::deleteItems(const QList<QTreeWidgetItem*> &items)
209{
210 m_refreshAllItemsNeeded = true;
211
212 qDeleteAll(items);
213}
bool prependToParentItem(const QString &parentText, QTreeWidgetItem *item)
Definition: treewidget.cpp:170
void addTopLevelItem(QTreeWidgetItem *item)
Definition: treewidget.cpp:41
void insertTopLevelItems(int index, const QList< QTreeWidgetItem * > &items)
Definition: treewidget.cpp:59
void filterString(const QString &string)
Definition: treewidget.cpp:104
void itemMiddleButtonClicked(QTreeWidgetItem *item)
void addTopLevelItems(const QList< QTreeWidgetItem * > &items)
Definition: treewidget.cpp:47
void clear()
Definition: treewidget.cpp:30
void deleteItem(QTreeWidgetItem *item)
Definition: treewidget.cpp:197
void itemControlClicked(QTreeWidgetItem *item)
@ ItemsExpanded
Definition: treewidget.h:30
QList< QTreeWidgetItem * > allItems()
Definition: treewidget.cpp:93
TreeWidget(QWidget *parent=nullptr)
Definition: treewidget.cpp:22
void deleteItems(const QList< QTreeWidgetItem * > &items)
Definition: treewidget.cpp:208
void insertTopLevelItem(int index, QTreeWidgetItem *item)
Definition: treewidget.cpp:53
bool appendToParentItem(const QString &parentText, QTreeWidgetItem *item)
Definition: treewidget.cpp:143
i
Definition: i18n.py:23