annotate demos/browser/history.d @ 94:87bb4e622f9e

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