annotate demos/browser/history.d @ 65:a62227112f5b

more porting
author mandel
date Tue, 19 May 2009 17:58:33 +0000
parents 71b382c10ef6
children 3b98e3fecd9b
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1 /****************************************************************************
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
2 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
3 ** Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies).
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
4 ** Contact: Qt Software Information (qt-info@nokia.com)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
5 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
6 ** This file is part of the demonstration applications of the Qt Toolkit.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
7 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
8 ** $QT_BEGIN_LICENSE:LGPL$
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
9 ** Commercial Usage
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
10 ** Licensees holding valid Qt Commercial licenses may use this file in
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
11 ** accordance with the Qt Commercial License Agreement provided with the
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
12 ** Software or, alternatively, in accordance with the terms contained in
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
13 ** a written agreement between you and Nokia.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
14 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
15 ** GNU Lesser General Public License Usage
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
16 ** Alternatively, this file may be used under the terms of the GNU Lesser
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
17 ** General Public License version 2.1 as published by the Free Software
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
18 ** Foundation and appearing in the file LICENSE.LGPL included in the
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
19 ** packaging of this file. Please review the following information to
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
20 ** ensure the GNU Lesser General Public License version 2.1 requirements
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
21 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
22 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
23 ** In addition, as a special exception, Nokia gives you certain
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
24 ** additional rights. These rights are described in the Nokia Qt LGPL
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
25 ** Exception version 1.0, included in the file LGPL_EXCEPTION.txt in this
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
26 ** package.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
27 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
28 ** GNU General Public License Usage
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
29 ** Alternatively, this file may be used under the terms of the GNU
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
30 ** General Public License version 3.0 as published by the Free Software
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
31 ** Foundation and appearing in the file LICENSE.GPL included in the
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
32 ** packaging of this file. Please review the following information to
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
33 ** ensure the GNU General Public License version 3.0 requirements will be
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
34 ** met: http://www.gnu.org/copyleft/gpl.html.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
35 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
36 ** If you are unsure which license is appropriate for your use, please
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
37 ** contact the sales department at qt-sales@nokia.com.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
38 ** $QT_END_LICENSE$
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
39 **
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
40 ****************************************************************************/
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
41 module history;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
42
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
43
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
44 import QtCore.QBuffer;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
45 import QtCore.QDir;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
46 import QtCore.QFile;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
47 import QtCore.QFileInfo;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
48 import QtCore.QSettings;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
49 import QtCore.QTemporaryFile;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
50 import QtCore.QTextStream;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
51
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
52 import QtCore.QtAlgorithms;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
53
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
54 import QtGui.QClipboard;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
55 import QtGui.QDesktopServices;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
56 import QtGui.QHeaderView;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
57 import QtGui.QStyle;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
58
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
59 import QtWebKit.QWebHistoryInterface;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
60 import QtWebKit.QWebSettings;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
61
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
62 import QtCore.QDebug;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
63
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
64 import QtCore.QDateTime;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
65 import QtCore.QHash;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
66 import QtCore.QObject;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
67 import QtCore.QTimer;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
68 import QtCore.QUrl;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
69
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
70 import QtGui.QSortFilterProxyModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
71
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
72 import QWebHistoryInterface;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
73
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
74
a62227112f5b more porting
mandel
parents: 45
diff changeset
75 import autosaver
a62227112f5b more porting
mandel
parents: 45
diff changeset
76 import browserapplication;
a62227112f5b more porting
mandel
parents: 45
diff changeset
77 import modelmenu;
a62227112f5b more porting
mandel
parents: 45
diff changeset
78
a62227112f5b more porting
mandel
parents: 45
diff changeset
79
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
80 static const unsigned int HISTORY_VERSION = 23;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
81
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
82
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
83 class HistoryItem
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
84 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
85 public:
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
86
a62227112f5b more porting
mandel
parents: 45
diff changeset
87 this() {}
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
88
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
89 this(QString u, QDateTime d = QDateTime(), QString t = QString())
a62227112f5b more porting
mandel
parents: 45
diff changeset
90 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
91 title = t;
a62227112f5b more porting
mandel
parents: 45
diff changeset
92 url = u;
a62227112f5b more porting
mandel
parents: 45
diff changeset
93 dateTime = d;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
94 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
95
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
96 //bool operator==(HistoryItem &other)
a62227112f5b more porting
mandel
parents: 45
diff changeset
97 int opEquals(HistoryItem other)
a62227112f5b more porting
mandel
parents: 45
diff changeset
98 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
99 return cast(int) (other.title == title && other.url == url && other.dateTime == dateTime);
a62227112f5b more porting
mandel
parents: 45
diff changeset
100 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
101
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
102 // history is sorted in reverse
a62227112f5b more porting
mandel
parents: 45
diff changeset
103 //bool operator <(HistoryItem &other)
a62227112f5b more porting
mandel
parents: 45
diff changeset
104 int opCmp(HistoryItem other)
a62227112f5b more porting
mandel
parents: 45
diff changeset
105 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
106 return cast(int) (dateTime > other.dateTime);
a62227112f5b more porting
mandel
parents: 45
diff changeset
107 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
108
a62227112f5b more porting
mandel
parents: 45
diff changeset
109 QString title;
a62227112f5b more porting
mandel
parents: 45
diff changeset
110 QString url;
a62227112f5b more porting
mandel
parents: 45
diff changeset
111 QDateTime dateTime;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
112 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
113
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
114
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
115 class HistoryManager : public QWebHistoryInterface
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
116 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
117 //Q_PROPERTY(int historyLimit READ historyLimit WRITE setHistoryLimit)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
118
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
119 mixin Signal!("historyReset");
a62227112f5b more porting
mandel
parents: 45
diff changeset
120 mixin Signal!("entryAdded", HistoryItem item);
a62227112f5b more porting
mandel
parents: 45
diff changeset
121 mixin Signal!("entryRemoved", HistoryItem item);
a62227112f5b more porting
mandel
parents: 45
diff changeset
122 mixin Signal!("entryUpdated", int offset);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
123
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
124 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
125
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
126 this(QObject parent = null)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
127 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
128 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
129 m_saveTimer = new AutoSaver(this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
130 m_historyLimit = 30;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
131 m_historyModel = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
132 m_historyFilterModel = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
133 m_historyTreeModel = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
134
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
135 m_expiredTimer.setSingleShot(true);
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
136
a62227112f5b more porting
mandel
parents: 45
diff changeset
137 m_expiredTimer.timeout.connect(&this.checkForExpired);
a62227112f5b more porting
mandel
parents: 45
diff changeset
138 this.entryAdded.connect(&m_saveTimer.changeOccurred);
a62227112f5b more porting
mandel
parents: 45
diff changeset
139 this.entryRemoved.connect(&m_saveTimer.changeOccurred);
a62227112f5b more porting
mandel
parents: 45
diff changeset
140
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
141 load();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
142
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
143 m_historyModel = new HistoryModel(this, this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
144 m_historyFilterModel = new HistoryFilterModel(m_historyModel, this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
145 m_historyTreeModel = new HistoryTreeModel(m_historyFilterModel, this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
146
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
147 // QWebHistoryInterface will delete the history manager
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
148 QWebHistoryInterface.setDefaultInterface(this);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
149 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
150
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
151
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
152 ~this()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
153 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
154 m_saveTimer.saveIfNeccessary();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
155 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
156
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
157
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
158 bool historyContains(QString &url)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
159 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
160 return m_historyFilterModel.historyContains(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
161 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
162
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
163 void addHistoryEntry(QString &url)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
164 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
165 QUrl cleanUrl(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
166 cleanUrl.setPassword(QString());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
167 cleanUrl.setHost(cleanUrl.host().toLower());
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
168 auto item = new HistoryItem(cleanUrl.toString(), QDateTime.currentDateTime());
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
169 addHistoryItem(item);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
170 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
171
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
172 void updateHistoryItem(QUrl &url, QString &title)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
173 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
174 for (int i = 0; i < m_history.count(); ++i) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
175 if (url == m_history.at(i).url) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
176 m_history[i].title = title;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
177 m_saveTimer.changeOccurred();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
178 if (m_lastSavedUrl.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
179 m_lastSavedUrl = m_history.at(i).url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
180 emit entryUpdated(i);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
181 break;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
182 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
183 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
184 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
185
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
186 int historyLimit()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
187 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
188 return m_historyLimit;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
189 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
190
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
191
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
192 void setHistoryLimit(int limit)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
193 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
194 if (m_historyLimit == limit)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
195 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
196 m_historyLimit = limit;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
197 checkForExpired();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
198 m_saveTimer.changeOccurred();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
199 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
200
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
201
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
202 QList<HistoryItem> history()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
203 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
204 return m_history;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
205 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
206
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
207
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
208 void setHistory(QList<HistoryItem> &history, bool loadedAndSorted = false);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
209 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
210 m_history = history;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
211
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
212 // verify that it is sorted by date
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
213 if (!loadedAndSorted)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
214 qSort(m_history.begin(), m_history.end());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
215
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
216 checkForExpired();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
217
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
218 if (loadedAndSorted) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
219 m_lastSavedUrl = m_history.value(0).url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
220 } else {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
221 m_lastSavedUrl = QString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
222 m_saveTimer.changeOccurred();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
223 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
224 emit historyReset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
225 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
226
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
227
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
228 // History manager keeps around these models for use by the completer and other classes
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
229 HistoryModel historyModel();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
230 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
231 return m_historyModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
232 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
233
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
234
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
235 HistoryFilterModel historyFilterModel()
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
236 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
237 return m_historyFilterModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
238 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
239
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
240
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
241 HistoryTreeModel historyTreeModel()
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
242 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
243 return m_historyTreeModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
244 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
245
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
246
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
247 public slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
248
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
249 void clear()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
250 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
251 m_history.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
252 m_lastSavedUrl = QString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
253 m_saveTimer.changeOccurred();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
254 m_saveTimer.saveIfNeccessary();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
255 historyReset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
256 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
257
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
258 void loadSettings()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
259 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
260 // load settings
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
261 QSettings settings;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
262 settings.beginGroup(QLatin1String("history"));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
263 m_historyLimit = settings.value(QLatin1String("historyLimit"), 30).toInt();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
264 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
265
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
266 private:
a62227112f5b more porting
mandel
parents: 45
diff changeset
267
a62227112f5b more porting
mandel
parents: 45
diff changeset
268 void save()
a62227112f5b more porting
mandel
parents: 45
diff changeset
269 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
270 QSettings settings;
a62227112f5b more porting
mandel
parents: 45
diff changeset
271 settings.beginGroup(QLatin1String("history"));
a62227112f5b more porting
mandel
parents: 45
diff changeset
272 settings.setValue(QLatin1String("historyLimit"), m_historyLimit);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
273
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
274 bool saveAll = m_lastSavedUrl.isEmpty();
a62227112f5b more porting
mandel
parents: 45
diff changeset
275 int first = m_history.count() - 1;
a62227112f5b more porting
mandel
parents: 45
diff changeset
276 if (!saveAll) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
277 // find the first one to save
a62227112f5b more porting
mandel
parents: 45
diff changeset
278 for (int i = 0; i < m_history.count(); ++i) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
279 if (m_history.at(i).url == m_lastSavedUrl) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
280 first = i - 1;
a62227112f5b more porting
mandel
parents: 45
diff changeset
281 break;
a62227112f5b more porting
mandel
parents: 45
diff changeset
282 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
283 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
284 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
285 if (first == m_history.count() - 1)
a62227112f5b more porting
mandel
parents: 45
diff changeset
286 saveAll = true;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
287
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
288 QString directory = QDesktopServices.storageLocation(QDesktopServices.DataLocation);
a62227112f5b more porting
mandel
parents: 45
diff changeset
289 if (directory.isEmpty())
a62227112f5b more porting
mandel
parents: 45
diff changeset
290 directory = QDir.homePath() + QLatin1String("/.") + QCoreApplication.applicationName();
a62227112f5b more porting
mandel
parents: 45
diff changeset
291 if (!QFile.exists(directory)) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
292 QDir dir;
a62227112f5b more porting
mandel
parents: 45
diff changeset
293 dir.mkpath(directory);
a62227112f5b more porting
mandel
parents: 45
diff changeset
294 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
295
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
296 QFile historyFile(directory + QLatin1String("/history"));
a62227112f5b more porting
mandel
parents: 45
diff changeset
297 // When saving everything use a temporary file to prevent possible data loss.
a62227112f5b more porting
mandel
parents: 45
diff changeset
298 QTemporaryFile tempFile;
a62227112f5b more porting
mandel
parents: 45
diff changeset
299 tempFile.setAutoRemove(false);
a62227112f5b more porting
mandel
parents: 45
diff changeset
300 bool open = false;
a62227112f5b more porting
mandel
parents: 45
diff changeset
301 if (saveAll) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
302 open = tempFile.open();
a62227112f5b more porting
mandel
parents: 45
diff changeset
303 } else {
a62227112f5b more porting
mandel
parents: 45
diff changeset
304 open = historyFile.open(QFile.Append);
a62227112f5b more porting
mandel
parents: 45
diff changeset
305 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
306
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
307 if (!open) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
308 qWarning() << "Unable to open history file for saving"
a62227112f5b more porting
mandel
parents: 45
diff changeset
309 << (saveAll ? tempFile.fileName() : historyFile.fileName());
a62227112f5b more porting
mandel
parents: 45
diff changeset
310 return;
a62227112f5b more porting
mandel
parents: 45
diff changeset
311 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
312
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
313 QDataStream out_ = (saveAll ? tempFile : historyFile);
a62227112f5b more porting
mandel
parents: 45
diff changeset
314 for (int i = first; i >= 0; --i) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
315 QByteArray data;
a62227112f5b more porting
mandel
parents: 45
diff changeset
316 auto stream = new QDataStream(data, QIODevice.WriteOnly);
a62227112f5b more porting
mandel
parents: 45
diff changeset
317 HistoryItem item = m_history.at(i);
a62227112f5b more porting
mandel
parents: 45
diff changeset
318 stream << HISTORY_VERSION << item.url << item.dateTime << item.title;
a62227112f5b more porting
mandel
parents: 45
diff changeset
319 out_ << data;
a62227112f5b more porting
mandel
parents: 45
diff changeset
320 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
321 tempFile.close();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
322
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
323 if (saveAll) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
324 if (historyFile.exists() && !historyFile.remove())
a62227112f5b more porting
mandel
parents: 45
diff changeset
325 qWarning() << "History: error removing old history." << historyFile.errorString();
a62227112f5b more porting
mandel
parents: 45
diff changeset
326 if (!tempFile.rename(historyFile.fileName()))
a62227112f5b more porting
mandel
parents: 45
diff changeset
327 qWarning() << "History: error moving new history over old." << tempFile.errorString() << historyFile.fileName();
a62227112f5b more porting
mandel
parents: 45
diff changeset
328 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
329 m_lastSavedUrl = m_history.value(0).url;
a62227112f5b more porting
mandel
parents: 45
diff changeset
330 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
331
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
332 void checkForExpired()
a62227112f5b more porting
mandel
parents: 45
diff changeset
333 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
334 if (m_historyLimit < 0 || m_history.isEmpty())
a62227112f5b more porting
mandel
parents: 45
diff changeset
335 return;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
336
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
337 QDateTime now = QDateTime.currentDateTime();
a62227112f5b more porting
mandel
parents: 45
diff changeset
338 int nextTimeout = 0;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
339
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
340 while (!m_history.isEmpty()) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
341 QDateTime checkForExpired = m_history.last().dateTime;
a62227112f5b more porting
mandel
parents: 45
diff changeset
342 checkForExpired.setDate(checkForExpired.date().addDays(m_historyLimit));
a62227112f5b more porting
mandel
parents: 45
diff changeset
343 if (now.daysTo(checkForExpired) > 7) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
344 // check at most in a week to prevent int overflows on the timer
a62227112f5b more porting
mandel
parents: 45
diff changeset
345 nextTimeout = 7 * 86400;
a62227112f5b more porting
mandel
parents: 45
diff changeset
346 } else {
a62227112f5b more porting
mandel
parents: 45
diff changeset
347 nextTimeout = now.secsTo(checkForExpired);
a62227112f5b more porting
mandel
parents: 45
diff changeset
348 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
349 if (nextTimeout > 0)
a62227112f5b more porting
mandel
parents: 45
diff changeset
350 break;
a62227112f5b more porting
mandel
parents: 45
diff changeset
351 HistoryItem item = m_history.takeLast();
a62227112f5b more porting
mandel
parents: 45
diff changeset
352 // remove from saved file also
a62227112f5b more porting
mandel
parents: 45
diff changeset
353 m_lastSavedUrl = QString();
a62227112f5b more porting
mandel
parents: 45
diff changeset
354 emit entryRemoved(item);
a62227112f5b more porting
mandel
parents: 45
diff changeset
355 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
356
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
357 if (nextTimeout > 0)
a62227112f5b more porting
mandel
parents: 45
diff changeset
358 m_expiredTimer.start(nextTimeout * 1000);
a62227112f5b more porting
mandel
parents: 45
diff changeset
359 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
360
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
361 protected:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
362
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
363 void addHistoryItem(HistoryItem item)
a62227112f5b more porting
mandel
parents: 45
diff changeset
364 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
365 QWebSettings globalSettings = QWebSettings.globalSettings();
a62227112f5b more porting
mandel
parents: 45
diff changeset
366 if (globalSettings.testAttribute(QWebSettings.PrivateBrowsingEnabled))
a62227112f5b more porting
mandel
parents: 45
diff changeset
367 return;
a62227112f5b more porting
mandel
parents: 45
diff changeset
368
a62227112f5b more porting
mandel
parents: 45
diff changeset
369 m_history.prepend(item);
a62227112f5b more porting
mandel
parents: 45
diff changeset
370 emit entryAdded(item);
a62227112f5b more porting
mandel
parents: 45
diff changeset
371 if (m_history.count() == 1)
a62227112f5b more porting
mandel
parents: 45
diff changeset
372 checkForExpired();
a62227112f5b more porting
mandel
parents: 45
diff changeset
373 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
374
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
375 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
376
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
377 void load()
a62227112f5b more porting
mandel
parents: 45
diff changeset
378 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
379 loadSettings();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
380
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
381 historyFile = new QFile(QDesktopServices.storageLocation(QDesktopServices.DataLocation) + QLatin1String("/history"));
a62227112f5b more porting
mandel
parents: 45
diff changeset
382 if (!historyFile.exists())
a62227112f5b more porting
mandel
parents: 45
diff changeset
383 return;
a62227112f5b more porting
mandel
parents: 45
diff changeset
384 if (!historyFile.open(QFile.ReadOnly)) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
385 qWarning() << "Unable to open history file" << historyFile.fileName();
a62227112f5b more porting
mandel
parents: 45
diff changeset
386 return;
a62227112f5b more porting
mandel
parents: 45
diff changeset
387 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
388
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
389 QList<HistoryItem> list;
a62227112f5b more porting
mandel
parents: 45
diff changeset
390 auto in_ = new QDataStream(&historyFile);
a62227112f5b more porting
mandel
parents: 45
diff changeset
391 // Double check that the history file is sorted as it is read in
a62227112f5b more porting
mandel
parents: 45
diff changeset
392 bool needToSort = false;
a62227112f5b more porting
mandel
parents: 45
diff changeset
393 HistoryItem lastInsertedItem;
a62227112f5b more porting
mandel
parents: 45
diff changeset
394 QByteArray data;
a62227112f5b more porting
mandel
parents: 45
diff changeset
395 QDataStream stream;
a62227112f5b more porting
mandel
parents: 45
diff changeset
396 QBuffer buffer;
a62227112f5b more porting
mandel
parents: 45
diff changeset
397 stream.setDevice(buffer);
a62227112f5b more porting
mandel
parents: 45
diff changeset
398 while (!historyFile.atEnd()) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
399 in_ >> data;
a62227112f5b more porting
mandel
parents: 45
diff changeset
400 buffer.close();
a62227112f5b more porting
mandel
parents: 45
diff changeset
401 buffer.setBuffer(data);
a62227112f5b more porting
mandel
parents: 45
diff changeset
402 buffer.open(QIODevice.ReadOnly);
a62227112f5b more porting
mandel
parents: 45
diff changeset
403 quint32 ver;
a62227112f5b more porting
mandel
parents: 45
diff changeset
404 stream >> ver;
a62227112f5b more porting
mandel
parents: 45
diff changeset
405 if (ver != HISTORY_VERSION)
a62227112f5b more porting
mandel
parents: 45
diff changeset
406 continue;
a62227112f5b more porting
mandel
parents: 45
diff changeset
407 HistoryItem item;
a62227112f5b more porting
mandel
parents: 45
diff changeset
408 stream >> item.url;
a62227112f5b more porting
mandel
parents: 45
diff changeset
409 stream >> item.dateTime;
a62227112f5b more porting
mandel
parents: 45
diff changeset
410 stream >> item.title;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
411
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
412 if (!item.dateTime.isValid())
a62227112f5b more porting
mandel
parents: 45
diff changeset
413 continue;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
414
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
415 if (item == lastInsertedItem) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
416 if (lastInsertedItem.title.isEmpty() && !list.isEmpty())
a62227112f5b more porting
mandel
parents: 45
diff changeset
417 list[0].title = item.title;
a62227112f5b more porting
mandel
parents: 45
diff changeset
418 continue;
a62227112f5b more porting
mandel
parents: 45
diff changeset
419 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
420
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
421 if (!needToSort && !list.isEmpty() && lastInsertedItem < item)
a62227112f5b more porting
mandel
parents: 45
diff changeset
422 needToSort = true;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
423
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
424 list.prepend(item);
a62227112f5b more porting
mandel
parents: 45
diff changeset
425 lastInsertedItem = item;
a62227112f5b more porting
mandel
parents: 45
diff changeset
426 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
427
a62227112f5b more porting
mandel
parents: 45
diff changeset
428 if (needToSort)
a62227112f5b more porting
mandel
parents: 45
diff changeset
429 qSort(list.begin(), list.end());
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
430
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
431 setHistory(list, true);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
432
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
433 // If we had to sort re-write the whole history sorted
a62227112f5b more porting
mandel
parents: 45
diff changeset
434 if (needToSort) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
435 m_lastSavedUrl = QString();
a62227112f5b more porting
mandel
parents: 45
diff changeset
436 m_saveTimer.changeOccurred();
a62227112f5b more porting
mandel
parents: 45
diff changeset
437 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
438 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
439
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
440 AutoSaver m_saveTimer;
a62227112f5b more porting
mandel
parents: 45
diff changeset
441 int m_historyLimit;
a62227112f5b more porting
mandel
parents: 45
diff changeset
442 QTimer m_expiredTimer;
a62227112f5b more porting
mandel
parents: 45
diff changeset
443 QList<HistoryItem> m_history;
a62227112f5b more porting
mandel
parents: 45
diff changeset
444 QString m_lastSavedUrl;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
445
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
446 HistoryModel m_historyModel;
a62227112f5b more porting
mandel
parents: 45
diff changeset
447 HistoryFilterModel m_historyFilterModel;
a62227112f5b more porting
mandel
parents: 45
diff changeset
448 HistoryTreeModel m_historyTreeModel;
a62227112f5b more porting
mandel
parents: 45
diff changeset
449 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
450
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
451 class HistoryModel : public QAbstractTableModel
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
452 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
453 public:
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
454
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
455 void historyReset()
a62227112f5b more porting
mandel
parents: 45
diff changeset
456 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
457 reset();
a62227112f5b more porting
mandel
parents: 45
diff changeset
458 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
459
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
460 void entryAdded()
a62227112f5b more porting
mandel
parents: 45
diff changeset
461 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
462 beginInsertRows(QModelIndex(), 0, 0);
a62227112f5b more porting
mandel
parents: 45
diff changeset
463 endInsertRows();
a62227112f5b more porting
mandel
parents: 45
diff changeset
464 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
465
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
466 void entryUpdated(int offset)
a62227112f5b more porting
mandel
parents: 45
diff changeset
467 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
468 QModelIndex idx = index(offset, 0);
a62227112f5b more porting
mandel
parents: 45
diff changeset
469 emit dataChanged(idx, idx);
a62227112f5b more porting
mandel
parents: 45
diff changeset
470 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
471
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
472 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
473
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
474 enum Roles {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
475 DateRole = Qt.UserRole + 1,
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
476 DateTimeRole = Qt.UserRole + 2,
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
477 UrlRole = Qt.UserRole + 3,
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
478 UrlStringRole = Qt.UserRole + 4
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
479 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
480
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
481 this(HistoryManager history, QObject parent = null)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
482 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
483 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
484 m_history = history;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
485
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
486 assert(m_history);
a62227112f5b more porting
mandel
parents: 45
diff changeset
487
a62227112f5b more porting
mandel
parents: 45
diff changeset
488 m_history.historyReset.connect(&this.historyReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
489 m_history.entryRemoved.connect(&this.historyReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
490 m_history.entryAdded.connect(&this.entryAdded);
a62227112f5b more porting
mandel
parents: 45
diff changeset
491 m_history.entryUpdated.connect(&this.entryUpdated);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
492 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
493
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
494 QVariant headerData(int section, Qt.Orientation orientation, int role = Qt.DisplayRole)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
495 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
496 if (orientation == Qt.Horizontal && role == Qt.DisplayRole) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
497 switch (section) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
498 case 0: return tr("Title");
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
499 case 1: return tr("Address");
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
500 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
501 }
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
502 return QAbstractTableModel.headerData(section, orientation, role);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
503 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
504
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
505 QVariant data(QModelIndex index, int role = Qt.DisplayRole)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
506 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
507 QList<HistoryItem> lst = m_history.history();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
508 if (index.row() < 0 || index.row() >= lst.size())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
509 return QVariant();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
510
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
511 HistoryItem item = lst.at(index.row());
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
512 switch (role) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
513 case DateTimeRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
514 return item.dateTime;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
515 case DateRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
516 return item.dateTime.date();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
517 case UrlRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
518 return QUrl(item.url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
519 case UrlStringRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
520 return item.url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
521 case Qt.DisplayRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
522 case Qt.EditRole: {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
523 switch (index.column()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
524 case 0:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
525 // when there is no title try to generate one from the url
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
526 if (item.title.isEmpty()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
527 QString page = QFileInfo(QUrl(item.url).path()).fileName();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
528 if (!page.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
529 return page;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
530 return item.url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
531 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
532 return item.title;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
533 case 1:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
534 return item.url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
535 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
536 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
537 case Qt.DecorationRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
538 if (index.column() == 0) {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
539 return BrowserApplication.instance().icon(item.url);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
540 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
541 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
542 return QVariant();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
543 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
544
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
545 int columnCount(QModelIndex parent = QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
546 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
547 return (parent.isValid()) ? 0 : 2;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
548 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
549
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
550 int rowCount(QModelIndex parent = QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
551 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
552 return (parent.isValid()) ? 0 : m_history.history().count();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
553 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
554
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
555 bool removeRows(int row, int count, QModelIndex parent = QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
556 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
557 if (parent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
558 return false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
559 int lastRow = row + count - 1;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
560 beginRemoveRows(parent, row, lastRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
561 QList<HistoryItem> lst = m_history.history();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
562 for (int i = lastRow; i >= row; --i)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
563 lst.removeAt(i);
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
564 m_history.historyReset.disconnect(&this.historyReset);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
565 m_history.setHistory(lst);
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
566 m_history.historyReset.connect(&this.historyReset);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
567 endRemoveRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
568 return true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
569 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
570
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
571
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
572 private:
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
573 HistoryManager m_history;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
574 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
575
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
576 const uint MOVEDROWS = 15;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
577
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
578 /*!
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
579 Proxy model that will remove any duplicate entries.
a62227112f5b more porting
mandel
parents: 45
diff changeset
580 Both m_sourceRow and m_historyHash store their offsets not from
a62227112f5b more porting
mandel
parents: 45
diff changeset
581 the front of the list, but as offsets from the back.
a62227112f5b more porting
mandel
parents: 45
diff changeset
582 */
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
583 class HistoryFilterModel : public QAbstractProxyModel
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
584 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
585 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
586
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
587 this(QAbstractItemModel sourceModel, QObject parent = null)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
588 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
589 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
590 m_loaded = false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
591 setSourceModel(sourceModel);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
592 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
593
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
594 bool historyContains(QString url)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
595 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
596 load();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
597 return m_historyHash.contains(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
598 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
599
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
600 int historyLocation(QString url);
a62227112f5b more porting
mandel
parents: 45
diff changeset
601 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
602 load();
a62227112f5b more porting
mandel
parents: 45
diff changeset
603 if (!m_historyHash.contains(url))
a62227112f5b more porting
mandel
parents: 45
diff changeset
604 return 0;
a62227112f5b more porting
mandel
parents: 45
diff changeset
605 return sourceModel().rowCount() - m_historyHash.value(url);
a62227112f5b more porting
mandel
parents: 45
diff changeset
606 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
607
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
608 QModelIndex mapFromSource(QModelIndex sourceIndex)
a62227112f5b more porting
mandel
parents: 45
diff changeset
609 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
610 load();
a62227112f5b more porting
mandel
parents: 45
diff changeset
611 QString url = sourceIndex.data(HistoryModel.UrlStringRole).toString();
a62227112f5b more porting
mandel
parents: 45
diff changeset
612 if (!m_historyHash.contains(url))
a62227112f5b more porting
mandel
parents: 45
diff changeset
613 return QModelIndex();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
614
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
615 // This can be done in a binary search, but we can't use qBinary find
a62227112f5b more porting
mandel
parents: 45
diff changeset
616 // because it can't take: qBinaryFind(m_sourceRow.end(), m_sourceRow.begin(), v);
a62227112f5b more porting
mandel
parents: 45
diff changeset
617 // so if this is a performance bottlneck then convert to binary search, until then
a62227112f5b more porting
mandel
parents: 45
diff changeset
618 // the cleaner/easier to read code wins the day.
a62227112f5b more porting
mandel
parents: 45
diff changeset
619 int realRow = -1;
a62227112f5b more porting
mandel
parents: 45
diff changeset
620 int sourceModelRow = sourceModel().rowCount() - sourceIndex.row();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
621
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
622 for (int i = 0; i < m_sourceRow.count(); ++i) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
623 if (m_sourceRow.at(i) == sourceModelRow) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
624 realRow = i;
a62227112f5b more porting
mandel
parents: 45
diff changeset
625 break;
a62227112f5b more porting
mandel
parents: 45
diff changeset
626 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
627 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
628 if (realRow == -1)
a62227112f5b more porting
mandel
parents: 45
diff changeset
629 return QModelIndex();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
630
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
631 return createIndex(realRow, sourceIndex.column(), sourceModel().rowCount() - sourceIndex.row());
a62227112f5b more porting
mandel
parents: 45
diff changeset
632 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
633
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
634
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
635 QModelIndex mapToSource(QModelIndex proxyIndex)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
636 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
637 load();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
638 int sourceRow = sourceModel().rowCount() - proxyIndex.internalId();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
639 return sourceModel().index(sourceRow, proxyIndex.column());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
640 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
641
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
642 void setSourceModel(QAbstractItemModel newSourceModel)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
643 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
644 if (sourceModel()) {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
645 sourceModel.modelReset.disconnect(&this.sourceReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
646 sourceModel.dataChanged.disconnect(&this.dataChanged);
a62227112f5b more porting
mandel
parents: 45
diff changeset
647 sourceModel.rowsInserted.disconnect(&this.sourceRowsInserted);
a62227112f5b more porting
mandel
parents: 45
diff changeset
648 sourceModel.rowsRemoved.disconnect(&this.sourceRowsRemoved);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
649 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
650
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
651 QAbstractProxyModel.setSourceModel(newSourceModel);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
652
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
653 if (sourceModel()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
654 m_loaded = false;
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
655 sourceModel.modelReset.connect(&this.sourceReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
656 sourceModel.dataChanged.connect(&this.sourceDataChanged);
a62227112f5b more porting
mandel
parents: 45
diff changeset
657 sourceModel.rowsInserted.connect(&this.sourceRowsInserted);
a62227112f5b more porting
mandel
parents: 45
diff changeset
658 sourceModel.rowsRemoved.connect(&this.sourceRowsRemoved);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
659 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
660 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
661
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
662 QVariant headerData(int section, Qt.Orientation orientation, int role = Qt.DisplayRole);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
663 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
664 return sourceModel().headerData(section, orientation, role);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
665 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
666
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
667 int rowCount(QModelIndex parent = QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
668 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
669 load();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
670 if (parent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
671 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
672 return m_historyHash.count();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
673 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
674
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
675 int columnCount(QModelIndex parent = QModelIndex());
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
676 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
677 return (parent.isValid()) ? 0 : 2;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
678 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
679
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
680 QModelIndex index(int, int, QModelIndex = QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
681 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
682 load();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
683 if (row < 0 || row >= rowCount(parent) || column < 0 || column >= columnCount(parent))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
684 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
685
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
686 return createIndex(row, column, m_sourceRow[row]);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
687 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
688
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
689 QModelIndex parent(QModelIndex index= QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
690 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
691 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
692 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
693
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
694 /*
a62227112f5b more porting
mandel
parents: 45
diff changeset
695 Removing a continuous block of rows will remove filtered rows too as this is
a62227112f5b more porting
mandel
parents: 45
diff changeset
696 the users intention.
a62227112f5b more porting
mandel
parents: 45
diff changeset
697 */
a62227112f5b more porting
mandel
parents: 45
diff changeset
698 bool removeRows(int row, int count, QModelIndex parent = QModelIndex());
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
699 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
700 if (row < 0 || count <= 0 || row + count > rowCount(parent) || parent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
701 return false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
702 int lastRow = row + count - 1;
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
703 sourceModel.rowsRemoved,disconnect(&this.sourceRowsRemoved);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
704 beginRemoveRows(parent, row, lastRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
705 int oldCount = rowCount();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
706 int start = sourceModel().rowCount() - m_sourceRow.value(row);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
707 int end = sourceModel().rowCount() - m_sourceRow.value(lastRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
708 sourceModel().removeRows(start, end - start + 1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
709 endRemoveRows();
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
710 sourceModel.rowsRemoved.connect(&this.sourceRowsRemoved);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
711 m_loaded = false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
712 if (oldCount - count != rowCount())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
713 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
714 return true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
715 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
716
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
717
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
718 QVariant data(QModelIndex index, int role = Qt.DisplayRole);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
719 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
720 return QAbstractProxyModel.data(index, role);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
721 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
722
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
723 private slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
724
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
725 void sourceReset()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
726 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
727 m_loaded = false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
728 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
729 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
730
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
731
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
732 void sourceDataChanged(QModelIndex topLeft, QModelIndex bottomRight)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
733 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
734 emit dataChanged(mapFromSource(topLeft), mapFromSource(bottomRight));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
735 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
736
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
737 void sourceRowsRemoved(QModelIndex , int start, int end)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
738 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
739 //Q_UNUSED(start);
a62227112f5b more porting
mandel
parents: 45
diff changeset
740 //Q_UNUSED(end);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
741 sourceReset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
742 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
743
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
744
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
745 void sourceRowsInserted(QModelIndex parent, int start, int end)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
746 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
747 assert(start == end && start == 0);
a62227112f5b more porting
mandel
parents: 45
diff changeset
748 //Q_UNUSED(end);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
749 if (!m_loaded)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
750 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
751 QModelIndex idx = sourceModel().index(start, 0, parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
752 QString url = idx.data(HistoryModel.UrlStringRole).toString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
753 if (m_historyHash.contains(url)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
754 int sourceRow = sourceModel().rowCount() - m_historyHash[url];
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
755 int realRow = mapFromSource(sourceModel().index(sourceRow, 0)).row();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
756 beginRemoveRows(QModelIndex(), realRow, realRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
757 m_sourceRow.removeAt(realRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
758 m_historyHash.remove(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
759 endRemoveRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
760 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
761 beginInsertRows(QModelIndex(), 0, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
762 m_historyHash.insert(url, sourceModel().rowCount() - start);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
763 m_sourceRow.insert(0, sourceModel().rowCount());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
764 endInsertRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
765 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
766
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
767 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
768 void load()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
769 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
770 if (m_loaded)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
771 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
772 m_sourceRow.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
773 m_historyHash.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
774 m_historyHash.reserve(sourceModel().rowCount());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
775 for (int i = 0; i < sourceModel().rowCount(); ++i) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
776 QModelIndex idx = sourceModel().index(i, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
777 QString url = idx.data(HistoryModel.UrlStringRole).toString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
778 if (!m_historyHash.contains(url)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
779 m_sourceRow.append(sourceModel().rowCount() - i);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
780 m_historyHash[url] = sourceModel().rowCount() - i;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
781 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
782 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
783 m_loaded = true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
784 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
785
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
786
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
787 QList<int> m_sourceRow;
a62227112f5b more porting
mandel
parents: 45
diff changeset
788 QHash<QString, int> m_historyHash;
a62227112f5b more porting
mandel
parents: 45
diff changeset
789 bool m_loaded;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
790 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
791
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
792 /*
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
793 The history menu
a62227112f5b more porting
mandel
parents: 45
diff changeset
794 - Removes the first twenty entries and puts them as children of the top level.
a62227112f5b more porting
mandel
parents: 45
diff changeset
795 - If there are less then twenty entries then the first folder is also removed.
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
796
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
797 The mapping is done by knowing that HistoryTreeModel is over a table
a62227112f5b more porting
mandel
parents: 45
diff changeset
798 We store that row offset in our index's private data.
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
799 */
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
800 class HistoryMenuModel : public QAbstractProxyModel
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
801 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
802 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
803
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
804 /*
a62227112f5b more porting
mandel
parents: 45
diff changeset
805 Maps the first bunch of items of the source model to the root
a62227112f5b more porting
mandel
parents: 45
diff changeset
806 */
a62227112f5b more porting
mandel
parents: 45
diff changeset
807 HistoryMenuModel(HistoryTreeModel sourceModel, QObject parent = null)
a62227112f5b more porting
mandel
parents: 45
diff changeset
808 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
809 super(parent);
a62227112f5b more porting
mandel
parents: 45
diff changeset
810 m_treeModel = sourceModel;
a62227112f5b more porting
mandel
parents: 45
diff changeset
811 setSourceModel(sourceModel);
a62227112f5b more porting
mandel
parents: 45
diff changeset
812 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
813
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
814 int columnCount(QModelIndex parent)
a62227112f5b more porting
mandel
parents: 45
diff changeset
815 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
816 return m_treeModel.columnCount(mapToSource(parent));
a62227112f5b more porting
mandel
parents: 45
diff changeset
817 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
818
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
819 int rowCount(QModelIndex parent = QModelIndex());
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
820 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
821 if (parent.column() > 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
822 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
823
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
824 if (!parent.isValid()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
825 int folders = sourceModel().rowCount();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
826 int bumpedItems = bumpedRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
827 if (bumpedItems <= MOVEDROWS && bumpedItems == sourceModel().rowCount(sourceModel().index(0, 0)))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
828 --folders;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
829 return bumpedItems + folders;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
830 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
831
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
832 if (parent.internalId() == -1) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
833 if (parent.row() < bumpedRows())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
834 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
835 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
836
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
837 QModelIndex idx = mapToSource(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
838 int defaultCount = sourceModel().rowCount(idx);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
839 if (idx == sourceModel().index(0, 0))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
840 return defaultCount - bumpedRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
841 return defaultCount;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
842 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
843
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
844 QModelIndex mapFromSource(QModelIndex sourceIndex)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
845 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
846 // currently not used or autotested
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
847 assert(false);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
848 int sr = m_treeModel.mapToSource(sourceIndex).row();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
849 return createIndex(sourceIndex.row(), sourceIndex.column(), sr);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
850 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
851
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
852 QModelIndex mapToSource(QModelIndex proxyIndex)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
853 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
854 if (!proxyIndex.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
855 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
856
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
857 if (proxyIndex.internalId() == -1) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
858 int bumpedItems = bumpedRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
859 if (proxyIndex.row() < bumpedItems)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
860 return m_treeModel.index(proxyIndex.row(), proxyIndex.column(), m_treeModel.index(0, 0));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
861 if (bumpedItems <= MOVEDROWS && bumpedItems == sourceModel().rowCount(m_treeModel.index(0, 0)))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
862 --bumpedItems;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
863 return m_treeModel.index(proxyIndex.row() - bumpedItems, proxyIndex.column());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
864 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
865
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
866 QModelIndex historyIndex = m_treeModel.sourceModel().index(proxyIndex.internalId(), proxyIndex.column());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
867 QModelIndex treeIndex = m_treeModel.mapFromSource(historyIndex);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
868 return treeIndex;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
869 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
870
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
871
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
872 QModelIndex index(int, int, QModelIndex &parent = QModelIndex());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
873 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
874 if (row < 0 || column < 0 || column >= columnCount(parent) || parent.column() > 0)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
875 return QModelIndex();
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
876
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
877 if (!parent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
878 return createIndex(row, column, -1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
879
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
880 QModelIndex treeIndexParent = mapToSource(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
881
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
882 int bumpedItems = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
883 if (treeIndexParent == m_treeModel.index(0, 0))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
884 bumpedItems = bumpedRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
885 QModelIndex treeIndex = m_treeModel.index(row + bumpedItems, column, treeIndexParent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
886 QModelIndex historyIndex = m_treeModel.mapToSource(treeIndex);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
887 int historyRow = historyIndex.row();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
888 if (historyRow == -1)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
889 historyRow = treeIndex.row();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
890 return createIndex(row, column, historyRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
891 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
892
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
893 QModelIndex parent(QModelIndex index = QModelIndex());
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
894 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
895 int offset = index.internalId();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
896 if (offset == -1 || !index.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
897 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
898
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
899 QModelIndex historyIndex = m_treeModel.sourceModel().index(index.internalId(), 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
900 QModelIndex treeIndex = m_treeModel.mapFromSource(historyIndex);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
901 QModelIndex treeIndexParent = treeIndex.parent();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
902
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
903 int sr = m_treeModel.mapToSource(treeIndexParent).row();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
904 int bumpedItems = bumpedRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
905 if (bumpedItems <= MOVEDROWS && bumpedItems == sourceModel().rowCount(sourceModel().index(0, 0)))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
906 --bumpedItems;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
907 return createIndex(bumpedItems + treeIndexParent.row(), treeIndexParent.column(), sr);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
908 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
909
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
910 int bumpedRows()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
911 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
912 QModelIndex first = m_treeModel.index(0, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
913 if (!first.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
914 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
915 return qMin(m_treeModel.rowCount(first), MOVEDROWS);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
916 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
917
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
918 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
919
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
920 HistoryTreeModel m_treeModel;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
921 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
922
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
923 // Menu that is dynamically populated from the history
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
924 class HistoryMenu : public ModelMenu
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
925 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
926 mixin Signal!("openUrl", QUrl url);
a62227112f5b more porting
mandel
parents: 45
diff changeset
927
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
928 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
929
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
930 this(QWidget parent = null)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
931 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
932 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
933 m_history = 0;
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
934 connect(this, SIGNAL(activated(QModelIndex )),
a62227112f5b more porting
mandel
parents: 45
diff changeset
935 this, SLOT(activated(QModelIndex )));
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
936 setHoverRole(HistoryModel.UrlStringRole);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
937 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
938
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
939 void setInitialActions(QList<QAction> actions)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
940 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
941 m_initialActions = actions;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
942 for (int i = 0; i < m_initialActions.count(); ++i)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
943 addAction(m_initialActions.at(i));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
944 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
945
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
946 protected:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
947
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
948 bool prePopulated()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
949 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
950 if (!m_history) {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
951 m_history = BrowserApplication.historyManager();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
952 m_historyMenuModel = new HistoryMenuModel(m_history.historyTreeModel(), this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
953 setModel(m_historyMenuModel);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
954 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
955 // initial actions
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
956 for (int i = 0; i < m_initialActions.count(); ++i)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
957 addAction(m_initialActions.at(i));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
958 if (!m_initialActions.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
959 addSeparator();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
960 setFirstSeparator(m_historyMenuModel.bumpedRows());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
961
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
962 return false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
963 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
964
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
965 void postPopulated()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
966 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
967 if (m_history.history().count() > 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
968 addSeparator();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
969
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
970 QAction showAllAction = new QAction(tr("Show All History"), this);
a62227112f5b more porting
mandel
parents: 45
diff changeset
971 showAllAction.triggered.connect(&this.showHistoryDialog);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
972 addAction(showAllAction);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
973
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
974 QAction clearAction = new QAction(tr("Clear History"), this);
a62227112f5b more porting
mandel
parents: 45
diff changeset
975 clearAction.triggered.connect(&m_history.clear);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
976 addAction(clearAction);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
977 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
978
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
979 private slots:
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
980 void activated(QModelIndex index)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
981 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
982 emit openUrl(index.data(HistoryModel.UrlRole).toUrl());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
983 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
984
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
985 void showHistoryDialog()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
986 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
987 auto dialog = new HistoryDialog(this);
a62227112f5b more porting
mandel
parents: 45
diff changeset
988 dialog.openUrl(QUrl).connect(&this.openUrl(QUrl));
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
989 dialog.show();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
990 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
991
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
992
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
993 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
994
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
995 HistoryManager m_history;
a62227112f5b more porting
mandel
parents: 45
diff changeset
996 HistoryMenuModel m_historyMenuModel;
a62227112f5b more porting
mandel
parents: 45
diff changeset
997 QList<QAction> m_initialActions;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
998 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
999
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1000 // proxy model for the history model that
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1001 // exposes each url http://www.foo.com and it url starting at the host www.foo.com
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1002 class HistoryCompletionModel : public QAbstractProxyModel
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1003 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1004
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1005 public:
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1006 this(QObject parent = null)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1007 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1008 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1009 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1010
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1011 QVariant data(QModelIndex index, int role)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1012 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1013 if (sourceModel()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1014 && (role == Qt.EditRole || role == Qt.DisplayRole)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1015 && index.isValid()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1016 QModelIndex idx = mapToSource(index);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1017 idx = idx.sibling(idx.row(), 1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1018 QString urlString = idx.data(HistoryModel.UrlStringRole).toString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1019 if (index.row() % 2) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1020 QUrl url = urlString;
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1021 QString s = url.toString(QUrl.RemoveScheme | QUrl.RemoveUserInfo | QUrl.StripTrailingSlash);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1022 return s.mid(2); // strip // from the front
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1023 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1024 return urlString;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1025 }
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1026 return QAbstractProxyModel.data(index, role);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1027 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1028
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1029 int rowCount(QModelIndex parent = QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1030 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1031 return (parent.isValid() || !sourceModel()) ? 0 : sourceModel().rowCount(parent) * 2;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1032 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1033
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1034 int columnCount(QModelIndex parent = QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1035 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1036 return (parent.isValid()) ? 0 : 1;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1037 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1038
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1039 QModelIndex mapFromSource(QModelIndex sourceIndex)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1040 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1041 int row = sourceIndex.row() * 2;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1042 return index(row, sourceIndex.column());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1043 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1044
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1045
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1046 QModelIndex mapToSource(QModelIndex proxyIndex)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1047 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1048 if (!sourceModel())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1049 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1050 int row = proxyIndex.row() / 2;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1051 return sourceModel().index(row, proxyIndex.column());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1052 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1053
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1054 QModelIndex index(int, int, QModelIndex = QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1055 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1056 if (row < 0 || row >= rowCount(parent) || column < 0 || column >= columnCount(parent))
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1057 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1058 return createIndex(row, column, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1059 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1060
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1061 QModelIndex parent(QModelIndex index= QModelIndex());
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1062 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1063 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1064 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1065
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1066 void setSourceModel(QAbstractItemModel sourceModel);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1067 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1068 if (sourceModel()) {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1069 sourceModel.modelReset.disconnect(&this.sourceReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1070 sourceModel.rowsInserted(QModelIndex , int, int).disconnect(&this.sourceReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1071 sourceModel.rowsRemoved(QModelIndex , int, int).disconnect(&this.sourceReset);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1072 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1073
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1074 QAbstractProxyModel.setSourceModel(newSourceModel);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1075
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1076 if (newSourceModel) {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1077 newSourceModel.modelReset.connect(&this.sourceReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1078 sourceModel.rowsInserted(QModelIndex , int, int).connect(&this.sourceReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1079 sourceModel.rowsRemoved(QModelIndex , int, int).connect(&this.sourceReset);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1080 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1081
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1082 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1083 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1084
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1085 private slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1086
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1087 void sourceReset()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1088 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1089 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1090 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1091 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1092
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1093 // proxy model for the history model that converts the list
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1094 // into a tree, one top level node per day.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1095 // Used in the HistoryDialog.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1096 class HistoryTreeModel : public QAbstractProxyModel
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1097 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1098 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1099
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1100 this(QAbstractItemModel sourceModel, QObject parent = null)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1101 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1102 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1103 setSourceModel(sourceModel);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1104 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1105
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1106 QVariant data(QModelIndex index, int role = Qt.DisplayRole);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1107 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1108 if ((role == Qt.EditRole || role == Qt.DisplayRole)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1109 int start = index.internalId();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1110 if (start == 0) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1111 int offset = sourceDateRow(index.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1112 if (index.column() == 0) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1113 QModelIndex idx = sourceModel().index(offset, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1114 QDate date = idx.data(HistoryModel.DateRole).toDate();
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1115 if (date == QDate.currentDate())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1116 return tr("Earlier Today");
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1117 return date.toString(QLatin1String("dddd, MMMM d, yyyy"));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1118 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1119 if (index.column() == 1) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1120 return tr("%1 items").arg(rowCount(index.sibling(index.row(), 0)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1121 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1122 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1123 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1124 if (role == Qt.DecorationRole && index.column() == 0 && !index.parent().isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1125 return QIcon(QLatin1String(":history.png"));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1126 if (role == HistoryModel.DateRole && index.column() == 0 && index.internalId() == 0) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1127 int offset = sourceDateRow(index.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1128 QModelIndex idx = sourceModel().index(offset, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1129 return idx.data(HistoryModel.DateRole);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1130 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1131
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1132 return QAbstractProxyModel.data(index, role);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1133 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1134
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1135
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1136 int columnCount(QModelIndex parent);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1137 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1138 return sourceModel().columnCount(mapToSource(parent));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1139 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1140
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1141
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1142 int rowCount(QModelIndex parent = QModelIndex())
a62227112f5b more porting
mandel
parents: 45
diff changeset
1143 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1144 if ( parent.internalId() != 0 || parent.column() > 0 || !sourceModel())
a62227112f5b more porting
mandel
parents: 45
diff changeset
1145 return 0;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1146
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1147 // row count OF dates
a62227112f5b more porting
mandel
parents: 45
diff changeset
1148 if (!parent.isValid()) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1149 if (!m_sourceRowCache.isEmpty())
a62227112f5b more porting
mandel
parents: 45
diff changeset
1150 return m_sourceRowCache.count();
a62227112f5b more porting
mandel
parents: 45
diff changeset
1151 QDate currentDate;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1152 int rows = 0;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1153 int totalRows = sourceModel().rowCount();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1154
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1155 for (int i = 0; i < totalRows; ++i) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1156 QDate rowDate = sourceModel().index(i, 0).data(HistoryModel.DateRole).toDate();
a62227112f5b more porting
mandel
parents: 45
diff changeset
1157 if (rowDate != currentDate) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1158 m_sourceRowCache.append(i);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1159 currentDate = rowDate;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1160 ++rows;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1161 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
1162 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
1163 assert(m_sourceRowCache.count() == rows);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1164 return rows;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1165 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1166
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1167 // row count FOR a date
a62227112f5b more porting
mandel
parents: 45
diff changeset
1168 int start = sourceDateRow(parent.row());
a62227112f5b more porting
mandel
parents: 45
diff changeset
1169 int end = sourceDateRow(parent.row() + 1);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1170 return (end - start);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1171 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1172
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1173
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1174 QModelIndex mapFromSource(QModelIndex sourceIndex);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1175 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1176 if (!sourceIndex.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1177 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1178
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1179 if (m_sourceRowCache.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1180 rowCount(QModelIndex());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1181
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1182 QList<int>.iterator it;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1183 it = qLowerBound(m_sourceRowCache.begin(), m_sourceRowCache.end(), sourceIndex.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1184 if (*it != sourceIndex.row())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1185 --it;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1186 int dateRow = qMax(0, it - m_sourceRowCache.begin());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1187 int row = sourceIndex.row() - m_sourceRowCache.at(dateRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1188 return createIndex(row, sourceIndex.column(), dateRow + 1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1189 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1190
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1191
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1192 QModelIndex mapToSource(QModelIndex proxyIndex)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1193 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1194 int offset = proxyIndex.internalId();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1195 if (offset == 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1196 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1197 int startDateRow = sourceDateRow(offset - 1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1198 return sourceModel().index(startDateRow + proxyIndex.row(), proxyIndex.column());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1199 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1200
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1201
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1202 QModelIndex index(int row, int column, QModelIndex parent = QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1203 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1204 if (row < 0 || column < 0 || column >= columnCount(parent) || parent.column() > 0)
a62227112f5b more porting
mandel
parents: 45
diff changeset
1205 return QModelIndex();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1206
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1207 if (!parent.isValid())
a62227112f5b more porting
mandel
parents: 45
diff changeset
1208 return createIndex(row, column, 0);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1209 return createIndex(row, column, parent.row() + 1);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1210 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1211
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1212
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1213 QModelIndex parent(QModelIndex index = QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1214 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1215 int offset = index.internalId();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1216 if (offset == 0 || !index.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1217 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1218 return createIndex(offset - 1, 0, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1219 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1220
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1221
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1222 bool hasChildren(QModelIndex parent = QModelIndex())
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1223 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1224 QModelIndex grandparent = parent.parent();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1225 if (!grandparent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1226 return true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1227 return false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1228 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1229
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1230
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1231 Qt.ItemFlags flags(QModelIndex index)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1232 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1233 if (!index.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1234 return Qt.NoItemFlags;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1235 return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsDragEnabled;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1236 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1237
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1238 bool removeRows(int row, int count, QModelIndex parent = QModelIndex());
a62227112f5b more porting
mandel
parents: 45
diff changeset
1239 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1240 if (row < 0 || count <= 0 || row + count > rowCount(parent))
a62227112f5b more porting
mandel
parents: 45
diff changeset
1241 return false;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1242
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1243 if (parent.isValid()) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1244 // removing pages
a62227112f5b more porting
mandel
parents: 45
diff changeset
1245 int offset = sourceDateRow(parent.row());
a62227112f5b more porting
mandel
parents: 45
diff changeset
1246 return sourceModel().removeRows(offset + row, count);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1247 } else {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1248 // removing whole dates
a62227112f5b more porting
mandel
parents: 45
diff changeset
1249 for (int i = row + count - 1; i >= row; --i) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1250 QModelIndex dateParent = index(i, 0);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1251 int offset = sourceDateRow(dateParent.row());
a62227112f5b more porting
mandel
parents: 45
diff changeset
1252 if (!sourceModel().removeRows(offset, rowCount(dateParent)))
a62227112f5b more porting
mandel
parents: 45
diff changeset
1253 return false;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1254 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
1255 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
1256 return true;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1257 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1258
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1259
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1260 QVariant headerData(int section, Qt.Orientation orientation, int role = Qt.DisplayRole)
a62227112f5b more porting
mandel
parents: 45
diff changeset
1261 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1262 return sourceModel().headerData(section, orientation, role);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1263 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1264
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1265
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1266
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1267 void setSourceModel(QAbstractItemModel newSourceModel)
a62227112f5b more porting
mandel
parents: 45
diff changeset
1268 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1269 if (sourceModel()) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1270 sourceModel.modelReset.disconnect(&this.sourceReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1271 sourceModel.layoutChanged.disconnect(&this.sourceReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1272 sourceModel.rowsInserted.disconnect(&this.sourceRowsInserted);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1273 sourceModel.rowsRemoved.disconnect(&this.sourceRowsRemoved);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1274 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1275
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1276 QAbstractProxyModel.setSourceModel(newSourceModel);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1277
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1278 if (newSourceModel) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1279 sourceModel.modelReset.connect(&this.sourceReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1280 sourceModel.layoutChanged.connect(&this.sourceReset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1281 sourceModel.rowsInserted.connect(&this.sourceRowsInserted);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1282 sourceModel.rowsRemoved.connect(&this.sourceRowsRemoved);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1283 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1284
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1285 reset();
a62227112f5b more porting
mandel
parents: 45
diff changeset
1286 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1287
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1288
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1289 private slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1290
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1291 void sourceReset()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1292 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1293 m_sourceRowCache.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1294 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1295 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1296
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1297 void sourceRowsInserted(QModelIndex parent, int start, int end);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1298 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1299 Q_UNUSED(parent); // Avoid warnings when compiling release
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1300 assert(!parent.isValid());
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1301 if (start != 0 || start != end) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1302 m_sourceRowCache.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1303 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1304 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1305 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1306
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1307 m_sourceRowCache.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1308 QModelIndex treeIndex = mapFromSource(sourceModel().index(start, 0));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1309 QModelIndex treeParent = treeIndex.parent();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1310 if (rowCount(treeParent) == 1) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1311 beginInsertRows(QModelIndex(), 0, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1312 endInsertRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1313 } else {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1314 beginInsertRows(treeParent, treeIndex.row(), treeIndex.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1315 endInsertRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1316 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1317 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1318
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1319 void sourceRowsRemoved(QModelIndex parent, int start, int end);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1320 {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1321 //Q_UNUSED(parent); // Avoid warnings when compiling release
a62227112f5b more porting
mandel
parents: 45
diff changeset
1322 assert(!parent.isValid());
a62227112f5b more porting
mandel
parents: 45
diff changeset
1323 if (m_sourceRowCache.isEmpty())
a62227112f5b more porting
mandel
parents: 45
diff changeset
1324 return;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1325 for (int i = end; i >= start;) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1326 QList<int>::iterator it;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1327 it = qLowerBound(m_sourceRowCache.begin(), m_sourceRowCache.end(), i);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1328 // playing it safe
a62227112f5b more porting
mandel
parents: 45
diff changeset
1329 if (it == m_sourceRowCache.end()) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1330 m_sourceRowCache.clear();
a62227112f5b more porting
mandel
parents: 45
diff changeset
1331 reset();
a62227112f5b more porting
mandel
parents: 45
diff changeset
1332 return;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1333 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1334
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1335 if (*it != i)
a62227112f5b more porting
mandel
parents: 45
diff changeset
1336 --it;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1337 int row = qMax(0, it - m_sourceRowCache.begin());
a62227112f5b more porting
mandel
parents: 45
diff changeset
1338 int offset = m_sourceRowCache[row];
a62227112f5b more porting
mandel
parents: 45
diff changeset
1339 QModelIndex dateParent = index(row, 0);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1340 // If we can remove all the rows in the date do that and skip over them
a62227112f5b more porting
mandel
parents: 45
diff changeset
1341 int rc = rowCount(dateParent);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1342 if (i - rc + 1 == offset && start <= i - rc + 1) {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1343 beginRemoveRows(QModelIndex(), row, row);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1344 m_sourceRowCache.removeAt(row);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1345 i -= rc + 1;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1346 } else {
a62227112f5b more porting
mandel
parents: 45
diff changeset
1347 beginRemoveRows(dateParent, i - offset, i - offset);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1348 ++row;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1349 --i;
a62227112f5b more porting
mandel
parents: 45
diff changeset
1350 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
1351 for (int j = row; j < m_sourceRowCache.count(); ++j)
a62227112f5b more porting
mandel
parents: 45
diff changeset
1352 --m_sourceRowCache[j];
a62227112f5b more porting
mandel
parents: 45
diff changeset
1353 endRemoveRows();
a62227112f5b more porting
mandel
parents: 45
diff changeset
1354 }
a62227112f5b more porting
mandel
parents: 45
diff changeset
1355 }
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1356
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1357 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1358
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1359 // Translate the top level date row into the offset where that date starts
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1360 int sourceDateRow(int row)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1361 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1362 if (row <= 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1363 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1364
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1365 if (m_sourceRowCache.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1366 rowCount(QModelIndex());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1367
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1368 if (row >= m_sourceRowCache.count()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1369 if (!sourceModel())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1370 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1371 return sourceModel().rowCount();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1372 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1373 return m_sourceRowCache.at(row);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1374 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1375
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1376 QList<int> m_sourceRowCache;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1377 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1378
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1379 // A modified QSortFilterProxyModel that always accepts the root nodes in the tree
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1380 // so filtering is only done on the children.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1381 // Used in the HistoryDialog
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1382 class TreeProxyModel : public QSortFilterProxyModel
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1383 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1384 public:
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1385
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1386 this(QObject parent = null)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1387 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1388 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1389 setSortRole(HistoryModel.DateTimeRole);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1390 setFilterCaseSensitivity(Qt.CaseInsensitive);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1391 }
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1392
a62227112f5b more porting
mandel
parents: 45
diff changeset
1393 protected:
a62227112f5b more porting
mandel
parents: 45
diff changeset
1394 bool filterAcceptsRow(int source_row, QModelIndex source_parent)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1395 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1396 if (!source_parent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1397 return true;
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1398 return QSortFilterProxyModel.filterAcceptsRow(source_row, source_parent);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1399 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1400 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1401
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1402 import ui_history;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1403
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1404 class HistoryDialog : public QDialog, public Ui_HistoryDialog
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1405 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1406 mixin Signal!("openUrl", QUrl url);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1407
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1408 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1409
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1410 this(QWidget parent = null, HistoryManager history = null) : QDialog(parent)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1411 {
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1412 HistoryManager history = setHistory;
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1413 if (!history)
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1414 history = BrowserApplication.historyManager();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1415 setupUi(this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1416 tree.setUniformRowHeights(true);
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1417 tree.setSelectionBehavior(QAbstractItemView.SelectRows);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1418 tree.setTextElideMode(Qt.ElideMiddle);
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1419 auto model = history.historyTreeModel();
a62227112f5b more porting
mandel
parents: 45
diff changeset
1420 auto proxyModel = new TreeProxyModel(this);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1421 search.textChanged(QString).connect(&proxyModel.setFilterFixedString(QString));
a62227112f5b more porting
mandel
parents: 45
diff changeset
1422 removeButton.clicked.connect(&tree.removeOne);
a62227112f5b more porting
mandel
parents: 45
diff changeset
1423 removeAllButton.clicked.connect(&history.clear);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1424 proxyModel.setSourceModel(model);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1425 tree.setModel(proxyModel);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1426 tree.setExpanded(proxyModel.index(0, 0), true);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1427 tree.setAlternatingRowColors(true);
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1428 QFontMetrics fm = font();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1429 int header = fm.width(QLatin1Char('m')) * 40;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1430 tree.header().resizeSection(0, header);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1431 tree.header().setStretchLastSection(true);
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1432 tree.activated(QModelIndex).connect(this.open);
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1433 tree.setContextMenuPolicy(Qt.CustomContextMenu);
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1434 tree.customContextMenuRequested(QPoint).connect(&this.customContextMenuRequested(QPoint));
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1435 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1436
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1437 private:
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1438
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1439 void customContextMenuRequested(QPoint pos)
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1440 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1441 QMenu menu;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1442 QModelIndex index = tree.indexAt(pos);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1443 index = index.sibling(index.row(), 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1444 if (index.isValid() && !tree.model().hasChildren(index)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1445 menu.addAction(tr("Open"), this, SLOT(open()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1446 menu.addSeparator();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1447 menu.addAction(tr("Copy"), this, SLOT(copy()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1448 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1449 menu.addAction(tr("Delete"), tree, SLOT(removeOne()));
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1450 menu.exec(QCursor.pos());
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1451 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1452
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1453
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1454 void open()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1455 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1456 QModelIndex index = tree.currentIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1457 if (!index.parent().isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1458 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1459 emit openUrl(index.data(HistoryModel.UrlRole).toUrl());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1460 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1461
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1462 void copy()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1463 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1464 QModelIndex index = tree.currentIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1465 if (!index.parent().isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1466 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1467 QString url = index.data(HistoryModel.UrlStringRole).toString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1468
65
a62227112f5b more porting
mandel
parents: 45
diff changeset
1469 QClipboard clipboard = QApplication.clipboard();
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1470 clipboard.setText(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1471 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1472 }