annotate demos/browser/history.d @ 45:71b382c10ef6

add coarse and incomplete QT browser port
author mandel
date Sun, 17 May 2009 18:49:59 +0000
parents
children a62227112f5b
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 #include "autosaver.h"
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
44 #include "browserapplication.h"
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
45
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
46 import QtCore.QBuffer;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
47 import QtCore.QDir;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
48 import QtCore.QFile;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
49 import QtCore.QFileInfo;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
50 import QtCore.QSettings;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
51 import QtCore.QTemporaryFile;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
52 import QtCore.QTextStream;
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 QtCore.QtAlgorithms;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
55
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
56 import QtGui.QClipboard;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
57 import QtGui.QDesktopServices;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
58 import QtGui.QHeaderView;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
59 import QtGui.QStyle;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
60
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
61 import QtWebKit.QWebHistoryInterface;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
62 import QtWebKit.QWebSettings;
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.QDebug;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
65
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
66
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
67 #include "modelmenu.h"
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
68
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
69 import QtCore.QDateTime;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
70 import QtCore.QHash;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
71 import QtCore.QObject;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
72 import QtCore.QTimer;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
73 import QtCore.QUrl;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
74
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
75 import QtGui.QSortFilterProxyModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
76
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
77 import QWebHistoryInterface;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
78
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
79 static const unsigned int HISTORY_VERSION = 23;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
80
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 class HistoryItem
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
83 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
84 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
85 this() {}
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
86 this(const QString &u, const QDateTime &d = QDateTime(), const QString &t = QString())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
87 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
88 title = t;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
89 url = u;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
90 dateTime = d;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
91 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
92
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
93 inline bool operator==(const HistoryItem &other)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
94 { return other.title == title
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
95 && other.url == url && other.dateTime == dateTime;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
96 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
97
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
98 // history is sorted in reverse
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
99 inline bool operator <(const HistoryItem &other)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
100 { return dateTime > other.dateTime; }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
101
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
102 QString title;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
103 QString url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
104 QDateTime dateTime;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
105 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
106
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
107 /*
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
108 class AutoSaver;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
109 class HistoryModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
110 class HistoryFilterModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
111 class HistoryTreeModel;
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 class HistoryManager : public QWebHistoryInterface
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
115 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
116 Q_OBJECT
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
117 Q_PROPERTY(int historyLimit READ historyLimit WRITE setHistoryLimit)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
118
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
119 signals:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
120 void historyReset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
121 void entryAdded(const HistoryItem &item);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
122 void entryRemoved(const HistoryItem &item);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
123 void entryUpdated(int offset);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
124
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
125 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
126
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
127 this(QObject *parent = null)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
128 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
129 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
130 m_saveTimer = new AutoSaver(this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
131 m_historyLimit = 30;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
132 m_historyModel = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
133 m_historyFilterModel = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
134 m_historyTreeModel = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
135
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
136 m_expiredTimer.setSingleShot(true);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
137 connect(&m_expiredTimer, SIGNAL(timeout()),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
138 this, SLOT(checkForExpired()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
139 connect(this, SIGNAL(entryAdded(const HistoryItem &)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
140 m_saveTimer, SLOT(changeOccurred()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
141 connect(this, SIGNAL(entryRemoved(const HistoryItem &)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
142 m_saveTimer, SLOT(changeOccurred()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
143 load();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
144
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
145 m_historyModel = new HistoryModel(this, this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
146 m_historyFilterModel = new HistoryFilterModel(m_historyModel, this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
147 m_historyTreeModel = new HistoryTreeModel(m_historyFilterModel, this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
148
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
149 // QWebHistoryInterface will delete the history manager
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
150 QWebHistoryInterface::setDefaultInterface(this);
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
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 ~this()
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 m_saveTimer.saveIfNeccessary();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
157 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
158
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 bool historyContains(const QString &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 return m_historyFilterModel.historyContains(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
163 }
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 void addHistoryEntry(QString &url)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
166 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
167 QUrl cleanUrl(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
168 cleanUrl.setPassword(QString());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
169 cleanUrl.setHost(cleanUrl.host().toLower());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
170 HistoryItem item(cleanUrl.toString(), QDateTime::currentDateTime());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
171 addHistoryItem(item);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
172 }
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 void updateHistoryItem(QUrl &url, QString &title)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
175 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
176 for (int i = 0; i < m_history.count(); ++i) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
177 if (url == m_history.at(i).url) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
178 m_history[i].title = title;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
179 m_saveTimer.changeOccurred();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
180 if (m_lastSavedUrl.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
181 m_lastSavedUrl = m_history.at(i).url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
182 emit entryUpdated(i);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
183 break;
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 }
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 int 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 return m_historyLimit;
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
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 void setHistoryLimit(int limit)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
195 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
196 if (m_historyLimit == limit)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
197 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
198 m_historyLimit = limit;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
199 checkForExpired();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
200 m_saveTimer.changeOccurred();
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
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 QList<HistoryItem> 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 return m_history;
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
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 void setHistory(QList<HistoryItem> &history, bool loadedAndSorted = false);
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 m_history = history;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
213
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
214 // verify that it is sorted by date
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
215 if (!loadedAndSorted)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
216 qSort(m_history.begin(), m_history.end());
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 checkForExpired();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
219
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
220 if (loadedAndSorted) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
221 m_lastSavedUrl = m_history.value(0).url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
222 } else {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
223 m_lastSavedUrl = QString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
224 m_saveTimer.changeOccurred();
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 emit historyReset();
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
229
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
230 // History manager keeps around these models for use by the completer and other classes
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
231 HistoryModel *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 return m_historyModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
234 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
235
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 HistoryFilterModel *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 return m_historyFilterModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
240 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
241
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 HistoryTreeModel *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 return m_historyTreeModel;
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
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 public slots:
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 void clear()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
252 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
253 m_history.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
254 m_lastSavedUrl = QString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
255 m_saveTimer.changeOccurred();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
256 m_saveTimer.saveIfNeccessary();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
257 historyReset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
258 }
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 void loadSettings()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
261 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
262 // load settings
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
263 QSettings settings;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
264 settings.beginGroup(QLatin1String("history"));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
265 m_historyLimit = settings.value(QLatin1String("historyLimit"), 30).toInt();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
266 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
267
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
268 private slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
269 void save()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
270 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
271 QSettings settings;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
272 settings.beginGroup(QLatin1String("history"));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
273 settings.setValue(QLatin1String("historyLimit"), m_historyLimit);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
274
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
275 bool saveAll = m_lastSavedUrl.isEmpty();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
276 int first = m_history.count() - 1;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
277 if (!saveAll) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
278 // find the first one to save
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
279 for (int i = 0; i < m_history.count(); ++i) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
280 if (m_history.at(i).url == m_lastSavedUrl) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
281 first = i - 1;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
282 break;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
283 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
284 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
285 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
286 if (first == m_history.count() - 1)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
287 saveAll = true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
288
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
289 QString directory = QDesktopServices::storageLocation(QDesktopServices::DataLocation);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
290 if (directory.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
291 directory = QDir::homePath() + QLatin1String("/.") + QCoreApplication::applicationName();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
292 if (!QFile::exists(directory)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
293 QDir dir;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
294 dir.mkpath(directory);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
295 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
296
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
297 QFile historyFile(directory + QLatin1String("/history"));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
298 // When saving everything use a temporary file to prevent possible data loss.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
299 QTemporaryFile tempFile;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
300 tempFile.setAutoRemove(false);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
301 bool open = false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
302 if (saveAll) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
303 open = tempFile.open();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
304 } else {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
305 open = historyFile.open(QFile::Append);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
306 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
307
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
308 if (!open) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
309 qWarning() << "Unable to open history file for saving"
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
310 << (saveAll ? tempFile.fileName() : historyFile.fileName());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
311 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
312 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
313
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
314 QDataStream out(saveAll ? &tempFile : &historyFile);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
315 for (int i = first; i >= 0; --i) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
316 QByteArray data;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
317 QDataStream stream(&data, QIODevice::WriteOnly);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
318 HistoryItem item = m_history.at(i);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
319 stream << HISTORY_VERSION << item.url << item.dateTime << item.title;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
320 out << data;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
321 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
322 tempFile.close();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
323
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
324 if (saveAll) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
325 if (historyFile.exists() && !historyFile.remove())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
326 qWarning() << "History: error removing old history." << historyFile.errorString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
327 if (!tempFile.rename(historyFile.fileName()))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
328 qWarning() << "History: error moving new history over old." << tempFile.errorString() << historyFile.fileName();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
329 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
330 m_lastSavedUrl = m_history.value(0).url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
331 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
332
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
333 void checkForExpired()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
334 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
335 if (m_historyLimit < 0 || m_history.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
336 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
337
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
338 QDateTime now = QDateTime::currentDateTime();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
339 int nextTimeout = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
340
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
341 while (!m_history.isEmpty()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
342 QDateTime checkForExpired = m_history.last().dateTime;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
343 checkForExpired.setDate(checkForExpired.date().addDays(m_historyLimit));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
344 if (now.daysTo(checkForExpired) > 7) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
345 // check at most in a week to prevent int overflows on the timer
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
346 nextTimeout = 7 * 86400;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
347 } else {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
348 nextTimeout = now.secsTo(checkForExpired);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
349 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
350 if (nextTimeout > 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
351 break;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
352 HistoryItem item = m_history.takeLast();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
353 // remove from saved file also
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
354 m_lastSavedUrl = QString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
355 emit entryRemoved(item);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
356 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
357
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
358 if (nextTimeout > 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
359 m_expiredTimer.start(nextTimeout * 1000);
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
362 protected:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
363 void addHistoryItem(HistoryItem &item)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
364 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
365 QWebSettings *globalSettings = QWebSettings::globalSettings();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
366 if (globalSettings.testAttribute(QWebSettings::PrivateBrowsingEnabled))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
367 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
368
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
369 m_history.prepend(item);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
370 emit entryAdded(item);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
371 if (m_history.count() == 1)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
372 checkForExpired();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
373 }
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
377 void load()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
378 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
379 loadSettings();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
380
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
381 QFile historyFile(QDesktopServices::storageLocation(QDesktopServices::DataLocation)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
382 + QLatin1String("/history"));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
383 if (!historyFile.exists())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
384 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
385 if (!historyFile.open(QFile::ReadOnly)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
386 qWarning() << "Unable to open history file" << historyFile.fileName();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
387 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
388 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
389
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
390 QList<HistoryItem> list;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
391 QDataStream in(&historyFile);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
392 // Double check that the history file is sorted as it is read in
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
393 bool needToSort = false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
394 HistoryItem lastInsertedItem;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
395 QByteArray data;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
396 QDataStream stream;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
397 QBuffer buffer;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
398 stream.setDevice(&buffer);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
399 while (!historyFile.atEnd()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
400 in >> data;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
401 buffer.close();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
402 buffer.setBuffer(&data);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
403 buffer.open(QIODevice::ReadOnly);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
404 quint32 ver;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
405 stream >> ver;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
406 if (ver != HISTORY_VERSION)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
407 continue;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
408 HistoryItem item;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
409 stream >> item.url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
410 stream >> item.dateTime;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
411 stream >> item.title;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
412
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
413 if (!item.dateTime.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
414 continue;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
415
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
416 if (item == lastInsertedItem) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
417 if (lastInsertedItem.title.isEmpty() && !list.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
418 list[0].title = item.title;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
419 continue;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
420 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
421
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
422 if (!needToSort && !list.isEmpty() && lastInsertedItem < item)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
423 needToSort = true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
424
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
425 list.prepend(item);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
426 lastInsertedItem = item;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
427 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
428 if (needToSort)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
429 qSort(list.begin(), list.end());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
430
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
431 setHistory(list, true);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
432
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
433 // If we had to sort re-write the whole history sorted
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
434 if (needToSort) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
435 m_lastSavedUrl = QString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
436 m_saveTimer.changeOccurred();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
437 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
438 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
439
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
440 AutoSaver *m_saveTimer;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
441 int m_historyLimit;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
442 QTimer m_expiredTimer;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
443 QList<HistoryItem> m_history;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
444 QString m_lastSavedUrl;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
445
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
446 HistoryModel *m_historyModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
447 HistoryFilterModel *m_historyFilterModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
448 HistoryTreeModel *m_historyTreeModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
449 };
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 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
453 Q_OBJECT
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
454
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
455 public slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
456 void historyReset()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
457 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
458 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
459 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
460
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
461 void entryAdded()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
462 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
463 beginInsertRows(QModelIndex(), 0, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
464 endInsertRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
465 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
466
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
467 void entryUpdated(int offset)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
468 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
469 QModelIndex idx = index(offset, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
470 emit dataChanged(idx, idx);
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
473 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
474
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
475 enum Roles {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
476 DateRole = Qt.UserRole + 1,
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
477 DateTimeRole = Qt.UserRole + 2,
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
478 UrlRole = Qt.UserRole + 3,
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
479 UrlStringRole = Qt.UserRole + 4
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
480 };
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
481
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
482 this(HistoryManager *history, QObject *parent = null)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
483 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
484 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
485 m_history = history;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
486
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
487 Q_ASSERT(m_history);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
488 connect(m_history, SIGNAL(historyReset()),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
489 this, SLOT(historyReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
490 connect(m_history, SIGNAL(entryRemoved(HistoryItem &)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
491 this, SLOT(historyReset()));
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 connect(m_history, SIGNAL(entryAdded(HistoryItem &)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
494 this, SLOT(entryAdded()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
495 connect(m_history, SIGNAL(entryUpdated(int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
496 this, SLOT(entryUpdated(int)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
497 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
498
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
499 QVariant headerData(int section, Qt.Orientation orientation, int role = Qt.DisplayRole)
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 if (orientation == Qt.Horizontal && role == Qt.DisplayRole) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
502 switch (section) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
503 case 0: return tr("Title");
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
504 case 1: return tr("Address");
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
505 }
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 return QAbstractTableModel::headerData(section, orientation, role);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
508 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
509
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
510 QVariant data(QModelIndex &index, int role = Qt.DisplayRole)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
511 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
512 QList<HistoryItem> lst = m_history.history();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
513 if (index.row() < 0 || index.row() >= lst.size())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
514 return QVariant();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
515
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
516 const HistoryItem &item = lst.at(index.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
517 switch (role) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
518 case DateTimeRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
519 return item.dateTime;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
520 case DateRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
521 return item.dateTime.date();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
522 case UrlRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
523 return QUrl(item.url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
524 case UrlStringRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
525 return item.url;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
526 case Qt.DisplayRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
527 case Qt.EditRole: {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
528 switch (index.column()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
529 case 0:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
530 // when there is no title try to generate one from the url
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
531 if (item.title.isEmpty()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
532 QString page = QFileInfo(QUrl(item.url).path()).fileName();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
533 if (!page.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
534 return page;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
535 return item.url;
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 return item.title;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
538 case 1:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
539 return item.url;
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 case Qt.DecorationRole:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
543 if (index.column() == 0) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
544 return BrowserApplication::instance().icon(item.url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
545 }
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 QVariant();
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
550 int columnCount(QModelIndex &parent = QModelIndex())
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 : 2;
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
555 int rowCount(QModelIndex &parent = QModelIndex())
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 return (parent.isValid()) ? 0 : m_history.history().count();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
558 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
559
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
560 bool removeRows(int row, int count, QModelIndex &parent = QModelIndex())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
561 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
562 if (parent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
563 return false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
564 int lastRow = row + count - 1;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
565 beginRemoveRows(parent, row, lastRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
566 QList<HistoryItem> lst = m_history.history();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
567 for (int i = lastRow; i >= row; --i)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
568 lst.removeAt(i);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
569 disconnect(m_history, SIGNAL(historyReset()), this, SLOT(historyReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
570 m_history.setHistory(lst);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
571 connect(m_history, SIGNAL(historyReset()), this, SLOT(historyReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
572 endRemoveRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
573 return true;
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
577 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
578 HistoryManager *m_history;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
579 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
580
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
581 const uint MOVEDROWS = 15;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
582
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
583 /*!
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
584 Proxy model that will remove any duplicate entries.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
585 Both m_sourceRow and m_historyHash store their offsets not from
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
586 the front of the list, but as offsets from the back.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
587 */
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
588 class HistoryFilterModel : public QAbstractProxyModel
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
589 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
590 Q_OBJECT
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
591
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
592 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
593
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
594 this(QAbstractItemModel *sourceModel, QObject *parent = null)
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 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
597 m_loaded = false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
598 setSourceModel(sourceModel);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
599 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
600
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
601 inline bool historyContains(QString &url)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
602 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
603 load();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
604 return m_historyHash.contains(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
605 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
606
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
607 int historyLocation(QString &url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
608 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
609 load();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
610 if (!m_historyHash.contains(url))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
611 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
612 return sourceModel().rowCount() - m_historyHash.value(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
613 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
614
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
615 QModelIndex mapFromSource(QModelIndex &sourceIndex)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
616 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
617 load();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
618 QString url = sourceIndex.data(HistoryModel.UrlStringRole).toString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
619 if (!m_historyHash.contains(url))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
620 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
621
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
622 // This can be done in a binary search, but we can't use qBinary find
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
623 // because it can't take: qBinaryFind(m_sourceRow.end(), m_sourceRow.begin(), v);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
624 // so if this is a performance bottlneck then convert to binary search, until then
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
625 // the cleaner/easier to read code wins the day.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
626 int realRow = -1;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
627 int sourceModelRow = sourceModel().rowCount() - sourceIndex.row();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
628
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
629 for (int i = 0; i < m_sourceRow.count(); ++i) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
630 if (m_sourceRow.at(i) == sourceModelRow) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
631 realRow = i;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
632 break;
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 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
635 if (realRow == -1)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
636 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
637
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
638 return createIndex(realRow, sourceIndex.column(), sourceModel().rowCount() - sourceIndex.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
639 }
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
642 QModelIndex mapToSource(QModelIndex &proxyIndex)
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 load();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
645 int sourceRow = sourceModel().rowCount() - proxyIndex.internalId();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
646 return sourceModel().index(sourceRow, proxyIndex.column());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
647 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
648
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
649 void setSourceModel(QAbstractItemModel *newSourceModel)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
650 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
651 if (sourceModel()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
652 disconnect(sourceModel(), SIGNAL(modelReset()), this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
653 disconnect(sourceModel(), SIGNAL(dataChanged(QModelIndex &, QModelIndex &)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
654 this, SLOT(dataChanged(QModelIndex &, QModelIndex &)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
655 disconnect(sourceModel(), SIGNAL(rowsInserted(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
656 this, SLOT(sourceRowsInserted(QModelIndex &, int, int)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
657 disconnect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
658 this, SLOT(sourceRowsRemoved(QModelIndex &, int, int)));
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 QAbstractProxyModel::setSourceModel(newSourceModel);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
662
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
663 if (sourceModel()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
664 m_loaded = false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
665 connect(sourceModel(), SIGNAL(modelReset()), this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
666 connect(sourceModel(), SIGNAL(dataChanged(QModelIndex &, QModelIndex &)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
667 this, SLOT(sourceDataChanged(QModelIndex &, QModelIndex &)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
668 connect(sourceModel(), SIGNAL(rowsInserted(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
669 this, SLOT(sourceRowsInserted(QModelIndex &, int, int)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
670 connect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
671 this, SLOT(sourceRowsRemoved(QModelIndex &, int, int)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
672 }
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
675 QVariant headerData(int section, Qt.Orientation orientation, int role = Qt.DisplayRole);
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 sourceModel().headerData(section, orientation, role);
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
680 int rowCount(QModelIndex &parent = QModelIndex())
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 (parent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
684 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
685 return m_historyHash.count();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
686 }
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 int columnCount(QModelIndex &parent = QModelIndex());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
689 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
690 return (parent.isValid()) ? 0 : 2;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
691 }
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 QModelIndex index(int, int, QModelIndex& = QModelIndex())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
694 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
695 load();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
696 if (row < 0 || row >= rowCount(parent) || column < 0 || column >= columnCount(parent))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
697 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
698
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
699 return createIndex(row, column, m_sourceRow[row]);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
700 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
701
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
702
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
703 QModelIndex parent(QModelIndex& index= QModelIndex())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
704 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
705 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
706 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
707
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
708 /*
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
709 Removing a continuous block of rows will remove filtered rows too as this is
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
710 the users intention.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
711 */
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
712 bool removeRows(int row, int count, QModelIndex &parent = QModelIndex());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
713 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
714 if (row < 0 || count <= 0 || row + count > rowCount(parent) || parent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
715 return false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
716 int lastRow = row + count - 1;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
717 disconnect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
718 this, SLOT(sourceRowsRemoved(QModelIndex &, int, int)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
719 beginRemoveRows(parent, row, lastRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
720 int oldCount = rowCount();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
721 int start = sourceModel().rowCount() - m_sourceRow.value(row);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
722 int end = sourceModel().rowCount() - m_sourceRow.value(lastRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
723 sourceModel().removeRows(start, end - start + 1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
724 endRemoveRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
725 connect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
726 this, SLOT(sourceRowsRemoved(QModelIndex &, int, int)));
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 if (oldCount - count != rowCount())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
729 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
730 return true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
731 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
732
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 QVariant data(QModelIndex &index, int role = Qt.DisplayRole);
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 return QAbstractProxyModel::data(index, role);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
737 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
738
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
739 private slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
740
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
741 void 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 m_loaded = false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
744 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
745 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
746
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
747
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
748 void sourceDataChanged(QModelIndex &topLeft, QModelIndex &bottomRight)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
749 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
750 emit dataChanged(mapFromSource(topLeft), mapFromSource(bottomRight));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
751 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
752
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
753 void sourceRowsRemoved(QModelIndex &, int start, int end)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
754 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
755 Q_UNUSED(start);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
756 Q_UNUSED(end);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
757 sourceReset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
758 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
759
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 void sourceRowsInserted(QModelIndex &parent, int start, int end)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
762 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
763 Q_ASSERT(start == end && start == 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
764 Q_UNUSED(end);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
765 if (!m_loaded)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
766 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
767 QModelIndex idx = sourceModel().index(start, 0, parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
768 QString url = idx.data(HistoryModel.UrlStringRole).toString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
769 if (m_historyHash.contains(url)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
770 int sourceRow = sourceModel().rowCount() - m_historyHash[url];
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
771 int realRow = mapFromSource(sourceModel().index(sourceRow, 0)).row();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
772 beginRemoveRows(QModelIndex(), realRow, realRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
773 m_sourceRow.removeAt(realRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
774 m_historyHash.remove(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
775 endRemoveRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
776 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
777 beginInsertRows(QModelIndex(), 0, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
778 m_historyHash.insert(url, sourceModel().rowCount() - start);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
779 m_sourceRow.insert(0, sourceModel().rowCount());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
780 endInsertRows();
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 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
784 void load()
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 if (m_loaded)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
787 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
788 m_sourceRow.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
789 m_historyHash.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
790 m_historyHash.reserve(sourceModel().rowCount());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
791 for (int i = 0; i < sourceModel().rowCount(); ++i) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
792 QModelIndex idx = sourceModel().index(i, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
793 QString url = idx.data(HistoryModel.UrlStringRole).toString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
794 if (!m_historyHash.contains(url)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
795 m_sourceRow.append(sourceModel().rowCount() - i);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
796 m_historyHash[url] = sourceModel().rowCount() - i;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
797 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
798 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
799 m_loaded = true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
800 }
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
803 mutable QList<int> m_sourceRow;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
804 mutable QHash<QString, int> m_historyHash;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
805 mutable bool m_loaded;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
806 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
807
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
808 /*
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
809 The history menu
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
810 - Removes the first twenty entries and puts them as children of the top level.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
811 - If there are less then twenty entries then the first folder is also removed.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
812
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
813 The mapping is done by knowing that HistoryTreeModel is over a table
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
814 We store that row offset in our index's private data.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
815 */
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
816 class HistoryMenuModel : public QAbstractProxyModel
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
817 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
818 Q_OBJECT
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
819
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
820 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
821
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
822 /*
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
823 Maps the first bunch of items of the source model to the root
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
824 */
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
825 HistoryMenuModel(HistoryTreeModel *sourceModel, QObject *parent = null)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
826 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
827 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
828 m_treeModel = sourceModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
829 setSourceModel(sourceModel);
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 int columnCount(QModelIndex &parent)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
833 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
834 return m_treeModel.columnCount(mapToSource(parent));
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 int rowCount(QModelIndex &parent = QModelIndex());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
838 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
839 if (parent.column() > 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
840 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
841
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
842 if (!parent.isValid()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
843 int folders = sourceModel().rowCount();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
844 int bumpedItems = bumpedRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
845 if (bumpedItems <= MOVEDROWS && bumpedItems == sourceModel().rowCount(sourceModel().index(0, 0)))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
846 --folders;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
847 return bumpedItems + folders;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
848 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
849
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
850 if (parent.internalId() == -1) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
851 if (parent.row() < bumpedRows())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
852 return 0;
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
855 QModelIndex idx = mapToSource(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
856 int defaultCount = sourceModel().rowCount(idx);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
857 if (idx == sourceModel().index(0, 0))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
858 return defaultCount - bumpedRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
859 return defaultCount;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
860 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
861
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
862 QModelIndex mapFromSource(QModelIndex &sourceIndex)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
863 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
864 // currently not used or autotested
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
865 Q_ASSERT(false);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
866 int sr = m_treeModel.mapToSource(sourceIndex).row();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
867 return createIndex(sourceIndex.row(), sourceIndex.column(), sr);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
868 }
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 QModelIndex mapToSource(QModelIndex &proxyIndex)
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 if (!proxyIndex.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
873 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
874
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
875 if (proxyIndex.internalId() == -1) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
876 int bumpedItems = bumpedRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
877 if (proxyIndex.row() < bumpedItems)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
878 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
879 if (bumpedItems <= MOVEDROWS && bumpedItems == sourceModel().rowCount(m_treeModel.index(0, 0)))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
880 --bumpedItems;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
881 return m_treeModel.index(proxyIndex.row() - bumpedItems, proxyIndex.column());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
882 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
883
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
884 QModelIndex historyIndex = m_treeModel.sourceModel().index(proxyIndex.internalId(), proxyIndex.column());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
885 QModelIndex treeIndex = m_treeModel.mapFromSource(historyIndex);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
886 return treeIndex;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
887 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
888
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
889
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
890 QModelIndex index(int, int, QModelIndex &parent = QModelIndex());
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 if (row < 0
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
893 || column < 0 || column >= columnCount(parent)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
894 || parent.column() > 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
895 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
896 if (!parent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
897 return createIndex(row, column, -1);
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 treeIndexParent = mapToSource(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
900
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
901 int bumpedItems = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
902 if (treeIndexParent == m_treeModel.index(0, 0))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
903 bumpedItems = bumpedRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
904 QModelIndex treeIndex = m_treeModel.index(row + bumpedItems, column, treeIndexParent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
905 QModelIndex historyIndex = m_treeModel.mapToSource(treeIndex);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
906 int historyRow = historyIndex.row();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
907 if (historyRow == -1)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
908 historyRow = treeIndex.row();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
909 return createIndex(row, column, historyRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
910 }
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 parent(QModelIndex &index = QModelIndex());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
913 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
914 int offset = index.internalId();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
915 if (offset == -1 || !index.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
916 return QModelIndex();
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 QModelIndex historyIndex = m_treeModel.sourceModel().index(index.internalId(), 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
919 QModelIndex treeIndex = m_treeModel.mapFromSource(historyIndex);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
920 QModelIndex treeIndexParent = treeIndex.parent();
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 int sr = m_treeModel.mapToSource(treeIndexParent).row();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
923 int bumpedItems = bumpedRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
924 if (bumpedItems <= MOVEDROWS && bumpedItems == sourceModel().rowCount(sourceModel().index(0, 0)))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
925 --bumpedItems;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
926 return createIndex(bumpedItems + treeIndexParent.row(), treeIndexParent.column(), sr);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
927 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
928
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
929 int bumpedRows()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
930 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
931 QModelIndex first = m_treeModel.index(0, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
932 if (!first.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
933 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
934 return qMin(m_treeModel.rowCount(first), MOVEDROWS);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
935 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
936
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
937 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
938
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
939 HistoryTreeModel *m_treeModel;
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
942 // Menu that is dynamically populated from the history
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
943 class HistoryMenu : public ModelMenu
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 Q_OBJECT
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
946
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
947 signals:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
948 void openUrl(QUrl &url);
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 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
951
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
952 this(QWidget *parent = null)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
953 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
954 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
955 m_history = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
956 connect(this, SIGNAL(activated(QModelIndex &)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
957 this, SLOT(activated(QModelIndex &)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
958 setHoverRole(HistoryModel.UrlStringRole);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
959 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
960
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
961 void setInitialActions(QList<QAction*> actions)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
962 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
963 m_initialActions = actions;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
964 for (int i = 0; i < m_initialActions.count(); ++i)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
965 addAction(m_initialActions.at(i));
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
968 protected:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
969
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
970 bool prePopulated()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
971 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
972 if (!m_history) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
973 m_history = BrowserApplication::historyManager();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
974 m_historyMenuModel = new HistoryMenuModel(m_history.historyTreeModel(), this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
975 setModel(m_historyMenuModel);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
976 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
977 // initial actions
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
978 for (int i = 0; i < m_initialActions.count(); ++i)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
979 addAction(m_initialActions.at(i));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
980 if (!m_initialActions.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
981 addSeparator();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
982 setFirstSeparator(m_historyMenuModel.bumpedRows());
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 return false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
985 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
986
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
987 void postPopulated()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
988 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
989 if (m_history.history().count() > 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
990 addSeparator();
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 QAction *showAllAction = new QAction(tr("Show All History"), this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
993 connect(showAllAction, SIGNAL(triggered()), this, SLOT(showHistoryDialog()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
994 addAction(showAllAction);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
995
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
996 QAction *clearAction = new QAction(tr("Clear History"), this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
997 connect(clearAction, SIGNAL(triggered()), m_history, SLOT(clear()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
998 addAction(clearAction);
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1001 private slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1002 void activated(QModelIndex &index)
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 emit openUrl(index.data(HistoryModel.UrlRole).toUrl());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1005 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1006
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1007 void showHistoryDialog()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1008 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1009 HistoryDialog *dialog = new HistoryDialog(this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1010 connect(dialog, SIGNAL(openUrl(QUrl&)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1011 this, SIGNAL(openUrl(QUrl&)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1012 dialog.show();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1013 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1014
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1015
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1016 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1017
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1018 HistoryManager *m_history;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1019 HistoryMenuModel *m_historyMenuModel;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1020 QList<QAction*> m_initialActions;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1021 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1022
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1023 // proxy model for the history model that
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1024 // 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
1025 class HistoryCompletionModel : public QAbstractProxyModel
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1026 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1027 Q_OBJECT
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1028
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1029 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1030 this(QObject *parent = null)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1031 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1032 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1033 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1034
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1035 QVariant data(QModelIndex &index, int role)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1036 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1037 if (sourceModel()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1038 && (role == Qt.EditRole || role == Qt.DisplayRole)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1039 && index.isValid()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1040 QModelIndex idx = mapToSource(index);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1041 idx = idx.sibling(idx.row(), 1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1042 QString urlString = idx.data(HistoryModel.UrlStringRole).toString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1043 if (index.row() % 2) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1044 QUrl url = urlString;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1045 QString s = url.toString(QUrl::RemoveScheme | QUrl::RemoveUserInfo | QUrl::StripTrailingSlash);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1046 return s.mid(2); // strip // from the front
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 return urlString;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1049 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1050 return QAbstractProxyModel::data(index, role);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1051 }
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 int rowCount(QModelIndex &parent = QModelIndex())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1054 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1055 return (parent.isValid() || !sourceModel()) ? 0 : sourceModel().rowCount(parent) * 2;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1056 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1057
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1058 int columnCount(QModelIndex &parent = QModelIndex())
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 return (parent.isValid()) ? 0 : 1;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1061 }
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 QModelIndex mapFromSource(QModelIndex &sourceIndex)
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 int row = sourceIndex.row() * 2;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1066 return index(row, sourceIndex.column());
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1069
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1070 QModelIndex mapToSource(QModelIndex &proxyIndex)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1071 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1072 if (!sourceModel())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1073 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1074 int row = proxyIndex.row() / 2;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1075 return sourceModel().index(row, proxyIndex.column());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1076 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1077
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1078 QModelIndex index(int, int, QModelIndex& = QModelIndex())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1079 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1080 if (row < 0 || row >= rowCount(parent)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1081 || column < 0 || column >= columnCount(parent))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1082 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1083 return createIndex(row, column, 0);
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1086 QModelIndex parent(QModelIndex& index= QModelIndex());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1087 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1088 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1089 }
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 void setSourceModel(QAbstractItemModel *sourceModel);
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 if (sourceModel()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1094 disconnect(sourceModel(), SIGNAL(modelReset()), this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1095 disconnect(sourceModel(), SIGNAL(rowsInserted(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1096 this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1097 disconnect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1098 this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1099 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1100
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1101 QAbstractProxyModel::setSourceModel(newSourceModel);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1102
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1103 if (newSourceModel) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1104 connect(newSourceModel, SIGNAL(modelReset()), this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1105 connect(sourceModel(), SIGNAL(rowsInserted(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1106 this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1107 connect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1108 this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1109 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1110
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1111 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1112 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1113
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1114 private slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1115
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1116 void sourceReset()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1117 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1118 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1119 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1120 }
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 // proxy model for the history model that converts the list
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1123 // into a tree, one top level node per day.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1124 // Used in the HistoryDialog.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1125 class HistoryTreeModel : public QAbstractProxyModel
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1126 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1127 Q_OBJECT
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1128
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1129 public:
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 this(QAbstractItemModel *sourceModel, QObject *parent = null)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1132 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1133 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1134 setSourceModel(sourceModel);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1135 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1136
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1137 QVariant data(QModelIndex &index, int role = Qt.DisplayRole);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1138 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1139 if ((role == Qt.EditRole || role == Qt.DisplayRole)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1140 int start = index.internalId();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1141 if (start == 0) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1142 int offset = sourceDateRow(index.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1143 if (index.column() == 0) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1144 QModelIndex idx = sourceModel().index(offset, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1145 QDate date = idx.data(HistoryModel.DateRole).toDate();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1146 if (date == QDate::currentDate())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1147 return tr("Earlier Today");
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1148 return date.toString(QLatin1String("dddd, MMMM d, yyyy"));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1149 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1150 if (index.column() == 1) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1151 return tr("%1 items").arg(rowCount(index.sibling(index.row(), 0)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1152 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1153 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1154 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1155 if (role == Qt.DecorationRole && index.column() == 0 && !index.parent().isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1156 return QIcon(QLatin1String(":history.png"));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1157 if (role == HistoryModel.DateRole && index.column() == 0 && index.internalId() == 0) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1158 int offset = sourceDateRow(index.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1159 QModelIndex idx = sourceModel().index(offset, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1160 return idx.data(HistoryModel.DateRole);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1161 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1162
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1163 return QAbstractProxyModel::data(index, role);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1164 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1165
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1166
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1167 int columnCount(QModelIndex &parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1168 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1169 return sourceModel().columnCount(mapToSource(parent));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1170 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1171
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 int rowCount(QModelIndex &parent = QModelIndex())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1174 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1175 if ( parent.internalId() != 0
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1176 || parent.column() > 0
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1177 || !sourceModel())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1178 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1179
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1180 // row count OF dates
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1181 if (!parent.isValid()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1182 if (!m_sourceRowCache.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1183 return m_sourceRowCache.count();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1184 QDate currentDate;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1185 int rows = 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1186 int totalRows = sourceModel().rowCount();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1187
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1188 for (int i = 0; i < totalRows; ++i) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1189 QDate rowDate = sourceModel().index(i, 0).data(HistoryModel.DateRole).toDate();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1190 if (rowDate != currentDate) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1191 m_sourceRowCache.append(i);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1192 currentDate = rowDate;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1193 ++rows;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1194 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1195 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1196 Q_ASSERT(m_sourceRowCache.count() == rows);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1197 return rows;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1198 }
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 // row count FOR a date
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1201 int start = sourceDateRow(parent.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1202 int end = sourceDateRow(parent.row() + 1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1203 return (end - start);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1204 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1205
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1206
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1207 QModelIndex mapFromSource(QModelIndex &sourceIndex);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1208 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1209 if (!sourceIndex.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1210 return QModelIndex();
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 if (m_sourceRowCache.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1213 rowCount(QModelIndex());
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 QList<int>::iterator it;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1216 it = qLowerBound(m_sourceRowCache.begin(), m_sourceRowCache.end(), sourceIndex.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1217 if (*it != sourceIndex.row())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1218 --it;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1219 int dateRow = qMax(0, it - m_sourceRowCache.begin());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1220 int row = sourceIndex.row() - m_sourceRowCache.at(dateRow);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1221 return createIndex(row, sourceIndex.column(), dateRow + 1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1222 }
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1225 QModelIndex mapToSource(QModelIndex &proxyIndex)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1226 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1227 int offset = proxyIndex.internalId();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1228 if (offset == 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1229 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1230 int startDateRow = sourceDateRow(offset - 1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1231 return sourceModel().index(startDateRow + proxyIndex.row(), proxyIndex.column());
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1234
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1235 QModelIndex index(int row, int column, QModelIndex &parent = QModelIndex())
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 if (row < 0 || column < 0 || column >= columnCount(parent) || parent.column() > 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1238 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1239
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1240 if (!parent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1241 return createIndex(row, column, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1242 return createIndex(row, column, parent.row() + 1);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1243 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1244
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1245
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1246 QModelIndex parent(QModelIndex &index= QModelIndex())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1247 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1248 int offset = index.internalId();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1249 if (offset == 0 || !index.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1250 return QModelIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1251 return createIndex(offset - 1, 0, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1252 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1253
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1254
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1255 bool hasChildren(QModelIndex &parent = QModelIndex())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1256 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1257 QModelIndex grandparent = parent.parent();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1258 if (!grandparent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1259 return true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1260 return false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1261 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1262
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1263
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1264 Qt.ItemFlags flags(QModelIndex &index)
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 if (!index.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1267 return Qt.NoItemFlags;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1268 return Qt.ItemIsSelectable | Qt.ItemIsEnabled | Qt.ItemIsDragEnabled;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1269 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1270
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1271 bool removeRows(int row, int count, QModelIndex &parent = QModelIndex());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1272 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1273 if (row < 0 || count <= 0 || row + count > rowCount(parent))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1274 return false;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1275
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1276 if (parent.isValid()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1277 // removing pages
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1278 int offset = sourceDateRow(parent.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1279 return sourceModel().removeRows(offset + row, count);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1280 } else {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1281 // removing whole dates
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1282 for (int i = row + count - 1; i >= row; --i) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1283 QModelIndex dateParent = index(i, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1284 int offset = sourceDateRow(dateParent.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1285 if (!sourceModel().removeRows(offset, rowCount(dateParent)))
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1286 return false;
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 return true;
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
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 QVariant headerData(int section, Qt.Orientation orientation, int role = Qt.DisplayRole)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1294 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1295 return sourceModel().headerData(section, orientation, role);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1296 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1297
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
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1300 void setSourceModel(QAbstractItemModel *newSourceModel)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1301 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1302 if (sourceModel()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1303 disconnect(sourceModel(), SIGNAL(modelReset()), this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1304 disconnect(sourceModel(), SIGNAL(layoutChanged()), this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1305 disconnect(sourceModel(), SIGNAL(rowsInserted(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1306 this, SLOT(sourceRowsInserted(QModelIndex &, int, int)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1307 disconnect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1308 this, SLOT(sourceRowsRemoved(QModelIndex &, int, int)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1309 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1310
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1311 QAbstractProxyModel::setSourceModel(newSourceModel);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1312
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1313 if (newSourceModel) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1314 connect(sourceModel(), SIGNAL(modelReset()), this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1315 connect(sourceModel(), SIGNAL(layoutChanged()), this, SLOT(sourceReset()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1316 connect(sourceModel(), SIGNAL(rowsInserted(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1317 this, SLOT(sourceRowsInserted(QModelIndex &, int, int)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1318 connect(sourceModel(), SIGNAL(rowsRemoved(QModelIndex &, int, int)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1319 this, SLOT(sourceRowsRemoved(QModelIndex &, int, int)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1320 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1321
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1322 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1323 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1324
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1325
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1326 private slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1327
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1328 void sourceReset()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1329 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1330 m_sourceRowCache.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1331 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1332 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1333
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1334 void sourceRowsInserted(QModelIndex &parent, int start, int end);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1335 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1336 Q_UNUSED(parent); // Avoid warnings when compiling release
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1337 Q_ASSERT(!parent.isValid());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1338 if (start != 0 || start != end) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1339 m_sourceRowCache.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1340 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1341 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1342 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1343
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1344 m_sourceRowCache.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1345 QModelIndex treeIndex = mapFromSource(sourceModel().index(start, 0));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1346 QModelIndex treeParent = treeIndex.parent();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1347 if (rowCount(treeParent) == 1) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1348 beginInsertRows(QModelIndex(), 0, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1349 endInsertRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1350 } else {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1351 beginInsertRows(treeParent, treeIndex.row(), treeIndex.row());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1352 endInsertRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1353 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1354 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1355
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 void sourceRowsRemoved(QModelIndex &parent, int start, int end);
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 Q_UNUSED(parent); // Avoid warnings when compiling release
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1360 Q_ASSERT(!parent.isValid());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1361 if (m_sourceRowCache.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1362 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1363 for (int i = end; i >= start;) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1364 QList<int>::iterator it;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1365 it = qLowerBound(m_sourceRowCache.begin(), m_sourceRowCache.end(), i);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1366 // playing it safe
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1367 if (it == m_sourceRowCache.end()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1368 m_sourceRowCache.clear();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1369 reset();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1370 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1371 }
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 if (*it != i)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1374 --it;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1375 int row = qMax(0, it - m_sourceRowCache.begin());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1376 int offset = m_sourceRowCache[row];
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1377 QModelIndex dateParent = index(row, 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1378 // If we can remove all the rows in the date do that and skip over them
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1379 int rc = rowCount(dateParent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1380 if (i - rc + 1 == offset && start <= i - rc + 1) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1381 beginRemoveRows(QModelIndex(), row, row);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1382 m_sourceRowCache.removeAt(row);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1383 i -= rc + 1;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1384 } else {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1385 beginRemoveRows(dateParent, i - offset, i - offset);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1386 ++row;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1387 --i;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1388 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1389 for (int j = row; j < m_sourceRowCache.count(); ++j)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1390 --m_sourceRowCache[j];
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1391 endRemoveRows();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1392 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1393 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1394
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1395 private:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1396
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1397 // 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
1398 int sourceDateRow(int row)
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 if (row <= 0)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1401 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1402
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1403 if (m_sourceRowCache.isEmpty())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1404 rowCount(QModelIndex());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1405
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1406 if (row >= m_sourceRowCache.count()) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1407 if (!sourceModel())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1408 return 0;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1409 return sourceModel().rowCount();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1410 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1411 return m_sourceRowCache.at(row);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1412 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1413
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1414 mutable QList<int> m_sourceRowCache;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1415 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1416
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1417 // A modified QSortFilterProxyModel that always accepts the root nodes in the tree
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1418 // so filtering is only done on the children.
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1419 // Used in the HistoryDialog
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1420 class TreeProxyModel : public QSortFilterProxyModel
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1421 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1422 Q_OBJECT
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1423
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1424 public:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1425 this(QObject *parent = null)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1426 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1427 super(parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1428 setSortRole(HistoryModel.DateTimeRole);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1429 setFilterCaseSensitivity(Qt.CaseInsensitive);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1430 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1431
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1432 protected:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1433 bool filterAcceptsRow(int source_row, QModelIndex &source_parent)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1434 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1435 if (!source_parent.isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1436 return true;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1437 return QSortFilterProxyModel::filterAcceptsRow(source_row, source_parent);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1438 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1439 }
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 #include "ui_history.h"
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1442
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1443 class HistoryDialog : public QDialog, public Ui_HistoryDialog
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1444 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1445 Q_OBJECT
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1446
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1447 signals:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1448 void openUrl(QUrl &url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1449
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1450 public:
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 this(QWidget *parent = null, HistoryManager *history = null) : QDialog(parent)
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 HistoryManager *history = setHistory;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1455 if (!history)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1456 history = BrowserApplication::historyManager();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1457 setupUi(this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1458 tree.setUniformRowHeights(true);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1459 tree.setSelectionBehavior(QAbstractItemView::SelectRows);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1460 tree.setTextElideMode(Qt.ElideMiddle);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1461 QAbstractItemModel *model = history.historyTreeModel();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1462 TreeProxyModel *proxyModel = new TreeProxyModel(this);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1463 connect(search, SIGNAL(textChanged(QString)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1464 proxyModel, SLOT(setFilterFixedString(QString)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1465 connect(removeButton, SIGNAL(clicked()), tree, SLOT(removeOne()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1466 connect(removeAllButton, SIGNAL(clicked()), history, SLOT(clear()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1467 proxyModel.setSourceModel(model);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1468 tree.setModel(proxyModel);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1469 tree.setExpanded(proxyModel.index(0, 0), true);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1470 tree.setAlternatingRowColors(true);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1471 QFontMetrics fm(font());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1472 int header = fm.width(QLatin1Char('m')) * 40;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1473 tree.header().resizeSection(0, header);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1474 tree.header().setStretchLastSection(true);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1475 connect(tree, SIGNAL(activated(QModelIndex&)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1476 this, SLOT(open()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1477 tree.setContextMenuPolicy(Qt.CustomContextMenu);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1478 connect(tree, SIGNAL(customContextMenuRequested(QPoint &)),
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1479 this, SLOT(customContextMenuRequested(QPoint &)));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1480 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1481
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1482 private slots:
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1483
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1484 void customContextMenuRequested(QPoint &pos)
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1485 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1486 QMenu menu;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1487 QModelIndex index = tree.indexAt(pos);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1488 index = index.sibling(index.row(), 0);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1489 if (index.isValid() && !tree.model().hasChildren(index)) {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1490 menu.addAction(tr("Open"), this, SLOT(open()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1491 menu.addSeparator();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1492 menu.addAction(tr("Copy"), this, SLOT(copy()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1493 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1494 menu.addAction(tr("Delete"), tree, SLOT(removeOne()));
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1495 menu.exec(QCursor::pos());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1496 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1497
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1498
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1499 void open()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1500 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1501 QModelIndex index = tree.currentIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1502 if (!index.parent().isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1503 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1504 emit openUrl(index.data(HistoryModel.UrlRole).toUrl());
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1505 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1506
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1507 void copy()
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1508 {
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1509 QModelIndex index = tree.currentIndex();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1510 if (!index.parent().isValid())
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1511 return;
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1512 QString url = index.data(HistoryModel.UrlStringRole).toString();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1513
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1514 QClipboard *clipboard = QApplication::clipboard();
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1515 clipboard.setText(url);
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1516 }
71b382c10ef6 add coarse and incomplete QT browser port
mandel
parents:
diff changeset
1517 }