QtScroller on bookmark view
[semperweb:semperweb.git] / src / BookmarksView.cpp
1 #include <QtScroller>
2
3 #include "BookmarksView.h"
4 #include "BookmarksDelegate.h"
5 #include "BookmarkItem.h"
6
7 #include "MyPreferences.h"
8
9 BookmarksView::BookmarksView(QWidget *parent)
10     : QWidget(parent)
11 {
12     QString sData;
13     QList<QStandardItem *> items;
14
15     fromXml();
16
17 #if 1
18     int rowCount;
19     if (!m_model.rowCount()) {
20         qDebug() << "Bookmarks: " << QDir::homePath() + "/Bookmarks.bin";
21         QFile f(QDir::homePath() + "/Bookmarks.bin");
22         f.open(QIODevice::ReadOnly);
23         if (f.isOpen()) {
24             QDataStream d(&f);
25             d >> rowCount;
26             for (int i=0; i<rowCount; i++) {
27                 items.clear();
28                 d >> sData;
29                 BookmarkItem* it = new BookmarkItem(sData);
30                 it->setEditable(false);
31                 it->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled);
32                 d >> sData;
33                 it->bookmark().uri = sData;
34                 m_model.appendRow(it);
35             }
36             f.close();;
37         }
38     }
39 #endif
40
41     if (!m_model.rowCount()) {
42         BookmarkItem* bk1 = new BookmarkItem("SemperPax");
43         bk1->bookmark().uri = "http://redmine.semperpax.com";
44         bk1->setEditable(false);
45         bk1->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled);
46         m_model.appendRow(bk1);
47
48         bk1 = new BookmarkItem("Twitter");
49         bk1->bookmark().uri = "http://mobile.twitter.com";
50         bk1->setEditable(false);
51         bk1->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled);
52         m_model.appendRow(bk1);
53
54         bk1 = new BookmarkItem("Wikipedia (Mobile)");
55         bk1->bookmark().uri = "http://mobile.wikipedia.org";
56         bk1->setEditable(false);
57         bk1->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled);
58         m_model.appendRow(bk1);
59
60         BookmarkItem* fld1 = new BookmarkItem("Google");
61         fld1->setEditable(false);
62         fld1->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
63         m_model.appendRow(fld1);
64
65         bk1 = new BookmarkItem("Google Search");
66         bk1->bookmark().uri = "http://www.google.com/m";
67         bk1->setEditable(false);
68         bk1->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled);
69         fld1->setChild(fld1->rowCount(), bk1);
70
71         bk1 = new BookmarkItem("GMail");
72         bk1->bookmark().uri = "http://m.gmail.com";
73         bk1->setEditable(false);
74         bk1->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled);
75         fld1->setChild(fld1->rowCount(), bk1);
76     }
77
78     m_iconView = new QTreeView(this);
79     m_iconView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
80     QtScroller::grabGesture(m_iconView->viewport(), QtScroller::LeftMouseButtonGesture);
81
82     m_iconView->setDragEnabled(true);
83     m_iconView->setAcceptDrops(true);
84     m_iconView->setDropIndicatorShown(true);
85     m_iconView->setDefaultDropAction(Qt::MoveAction);
86     m_iconView->setSelectionBehavior(QAbstractItemView::SelectRows);
87     m_iconView->setDragDropOverwriteMode(false);
88     m_iconView->setExpandsOnDoubleClick(false);
89     m_iconView->setAutoScroll(true);
90
91     m_iconView->setModel(&m_model);
92     connect(m_iconView, SIGNAL(clicked(const QModelIndex &)), SLOT(select(const QModelIndex &)));
93     connect(m_iconView, SIGNAL(doubleClicked(const QModelIndex &)), SLOT(activate(const QModelIndex &)));
94
95     m_iconView->setHeaderHidden(true);
96     m_iconView->setRootIsDecorated(false);
97     m_iconView->setIndentation(10);
98     m_iconView->setAnimated(true);
99     m_iconView->setUniformRowHeights(true);
100     m_iconView->setItemDelegate(new BookmarksDelegate(this));
101
102 //    charm = new MouseMachine(m_iconView, MouseMachine::AutoScroll);
103 //      connect(charm, SIGNAL(singleTap(QPoint)), SLOT(slotClicked(QPoint)));
104 //    connect(charm, SIGNAL(doubleTap(QPoint)), SLOT(slotDoubleClicked(QPoint)));
105 //      connect(charm, SIGNAL(tapAndHold(QPoint)), SLOT(slotTapAndHold(QPoint)));
106
107     QVBoxLayout *layout = new QVBoxLayout(this);
108     setLayout(layout);
109     layout->setMargin(0);
110     layout->addWidget(m_iconView);
111
112     setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
113 }
114
115 BookmarksView::~BookmarksView()
116 {
117     toXml();
118 }
119
120 void BookmarksView::select(const QModelIndex &index)
121 {
122     BookmarkItem *item=static_cast<BookmarkItem*>(m_model.itemFromIndex(index));
123
124     QString name = item->bookmark().title;
125     QString url = item->bookmark().uri;
126
127     if (url.isEmpty())
128         m_iconView->setExpanded(index, !m_iconView->isExpanded(index));
129     emit bookmarkSelected(name, url, item->bookmark().Ua);
130 }
131
132 void BookmarksView::activate(const QModelIndex &index)
133 {
134     BookmarkItem *item=static_cast<BookmarkItem*>(m_model.itemFromIndex(index));
135     if (!item)
136         return;
137
138     if (item->bookmark().uri.isEmpty())
139         m_iconView->setExpanded(index, !m_iconView->isExpanded(index));
140     else {
141         M_PREFS->setCurrentUa(item->bookmark().Ua);
142         emit urlSelected(QUrl(item->bookmark().uri));
143     }
144 }
145
146 void BookmarksView::bookmarkAdd(const QString& name, const QString &url, int ua,int seq)
147 {
148     QList<QStandardItem *> items = m_model.findItems(name, Qt::MatchRecursive | Qt::MatchExactly);
149     if (items.size() == 0) {
150         BookmarkItem *ibk;
151
152         ibk = new BookmarkItem(name);
153         ibk->bookmark().uri = url;
154         ibk->setEditable(false);
155         ibk->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled);
156         if (url.isEmpty())
157             ibk->setFlags(ibk->flags() | Qt::ItemIsDropEnabled);
158         ibk->bookmark().Ua = ua;
159         items.append(ibk);
160         m_model.appendRow(items);
161     } else {
162         BookmarkItem *item=static_cast<BookmarkItem*>(items[0]);
163         bool isfolder = url.isEmpty();
164         if (item->isFolder() != isfolder) {
165             bookmarkAdd(QString("%1#%2").arg(name).arg(seq, 1), url, ua, ++seq);
166         } else {
167             item->bookmark().uri = url;
168             item->bookmark().Ua = ua;
169         }
170     }
171 }
172
173 void BookmarksView::bookmarkDel(const QString& name)
174 {
175     QList<QStandardItem *> items = m_model.findItems(name, Qt::MatchRecursive | Qt::MatchExactly);
176     if (items.size() != 0) {
177         QModelIndex ix = m_model.indexFromItem(items[0]);
178         m_model.removeRow(ix.row(), ix.parent());
179     }
180 }
181
182 void BookmarksView::slotDoubleClicked(QPoint p)
183 {
184     QModelIndex index = m_iconView->indexAt(p);
185     activate(index);
186 }
187
188 void BookmarksView::fromXmlFolder(QDomElement& e, BookmarkItem* fit)
189 {
190     QDomElement c = e.firstChildElement();
191     while(!c.isNull()) {
192         if (c.tagName() == "Bookmark") {
193             BookmarkItem* bk = new BookmarkItem(c.attribute("title"));
194             bk->setEditable(false);
195             bk->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled);
196             bk->bookmark().uri = c.attribute("uri");
197
198             fit->setChild(fit->rowCount(), bk);
199         } else if (c.tagName() == "Folder") {
200             BookmarkItem* bk = new BookmarkItem(c.attribute("title"));
201             bk->setEditable(false);
202             bk->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
203             fit->setChild(fit->rowCount(), bk);
204
205             fromXmlFolder(c, bk);
206         }
207
208         c = c.nextSiblingElement();
209     }
210 }
211
212 void BookmarksView::fromXml()
213 {
214     qDebug() << "Bookmarks: " << QDir::homePath() + "/semperWebBookmarks.xml";
215     QFile f(QDir::homePath() + "/semperWebBookmarks.xml");
216     f.open(QIODevice::ReadOnly);
217     if (f.isOpen()) {
218         QDomDocument doc;
219         doc.setContent(&f);
220         f.close();
221
222         QDomElement bks = doc.documentElement();
223         while (!bks.isNull()) {
224             if (bks.nodeName() == "BookmarkList") {
225                 QDomElement c = bks.firstChildElement();
226                 while(!c.isNull()) {
227                     if (c.tagName() == "Bookmark") {
228                         BookmarkItem* bk = new BookmarkItem(c.attribute("title"));
229                         bk->setEditable(false);
230                         bk->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled);
231                         bk->bookmark().uri = c.attribute("uri");
232                         bk->bookmark().Ua = c.attribute("ua", "0").toInt();
233
234                         m_model.appendRow(bk);
235                     } else if (c.tagName() == "Folder") {
236                         BookmarkItem* bk = new BookmarkItem(c.attribute("title"));
237                         bk->setEditable(false);
238                         bk->setFlags(Qt::ItemIsSelectable | Qt::ItemIsDragEnabled | Qt::ItemIsEnabled | Qt::ItemIsDropEnabled);
239                         m_model.appendRow(bk);
240
241                         fromXmlFolder(c, bk);
242                     }
243
244                     c = c.nextSiblingElement();
245                 }
246             }
247             bks = bks.nextSiblingElement();
248         }
249     }
250 }
251
252 void BookmarksView::toXmlFolder(QDomElement& e, QModelIndex& pindex)
253 {
254     BookmarkItem* pit = static_cast<BookmarkItem*>(m_model.itemFromIndex(pindex));
255
256     for (int i=0; i<pit->rowCount(); ++i) {
257         QModelIndex ix = m_model.index(i, 0, pindex);
258         BookmarkItem* it = static_cast<BookmarkItem*>(m_model.itemFromIndex(ix));
259
260         if (it->bookmark().uri.isEmpty()) {
261             QDomElement fld = e.ownerDocument().createElement("Folder");
262             e.appendChild(fld);
263
264             fld.setAttribute("title", it->bookmark().title);
265             toXmlFolder(fld, ix);
266         } else {
267             QDomElement bk = e.ownerDocument().createElement("Bookmark");
268             e.appendChild(bk);
269
270             bk.setAttribute("title", it->bookmark().title);
271             bk.setAttribute("uri", it->bookmark().uri);
272         }
273     }
274 }
275
276 void BookmarksView::toXml()
277 {
278     QDomDocument doc;
279     doc.appendChild(doc.createProcessingInstruction("xml", "version=\"1.0\""));
280
281     QDomElement rt = doc.createElement("BookmarkList");
282     doc.appendChild(rt);
283
284     for (int i=0; i<m_model.rowCount(); ++i) {
285         QModelIndex ix = m_model.index(i, 0);
286         BookmarkItem* it = static_cast<BookmarkItem*>(m_model.itemFromIndex(ix));
287
288         if (it->bookmark().uri.isEmpty()) {
289             QDomElement fld = doc.createElement("Folder");
290             rt.appendChild(fld);
291
292             fld.setAttribute("title", it->bookmark().title);
293             toXmlFolder(fld, ix);
294         } else {
295             QDomElement bk = doc.createElement("Bookmark");
296             rt.appendChild(bk);
297
298             bk.setAttribute("title", it->bookmark().title);
299             bk.setAttribute("uri", it->bookmark().uri);
300             bk.setAttribute("ua", it->bookmark().Ua);
301         }
302     }
303     QByteArray ba = doc.toByteArray();
304
305     QFile f(QDir::homePath() + "/semperWebBookmarks.xml");
306     f.open(QIODevice::WriteOnly);
307     if (f.isOpen()) {
308         f.write(ba);
309         f.close();
310     }
311 }
312