comparison demos/browser/bookmarks.d @ 100:dcd36d8db2da

more porting
author mandel
date Fri, 29 May 2009 11:36:51 +0000
parents 87bb4e622f9e
children 8636c819ce4d
comparison
equal deleted inserted replaced
99:e252fcf214c5 100:dcd36d8db2da
42 module bookmarks; 42 module bookmarks;
43 43
44 44
45 import qt.core.QObject; 45 import qt.core.QObject;
46 import qt.core.QAbstractItemModel; 46 import qt.core.QAbstractItemModel;
47
48
49 import qt.core.QBuffer; 47 import qt.core.QBuffer;
50 import qt.core.QFile; 48 import qt.core.QFile;
51 import qt.core.QMimeData; 49 import qt.core.QMimeData;
52 import qt.core.QPersistentModelIndex; 50 import qt.core.QPersistentModelIndex;
53
54 import qt.gui.QUndoStack; 51 import qt.gui.QUndoStack;
55 import qt.gui.QUndoCommand; 52 import qt.gui.QUndoCommand;
56 import qt.gui.QDesktopServices; 53 import qt.gui.QDesktopServices;
57 import qt.gui.QDragEnterEvent; 54 import qt.gui.QDragEnterEvent;
58 import qt.gui.QFileDialog; 55 import qt.gui.QFileDialog;
59 import qt.gui.QHeaderView; 56 import qt.gui.QHeaderView;
60 import qt.gui.QIcon; 57 import qt.gui.QIcon;
61 import qt.gui.QMessageBox; 58 import qt.gui.QMessageBox;
62 import qt.gui.QToolButton; 59 import qt.gui.QToolButton;
63 60 import qt.xml.QXmlStreamReader;
64 import qt.webkit.QWebSettings; 61 import qt.webkit.QWebSettings;
62
63 import tango.text.convert.Format;
65 64
66 //import qt.core.QDebug; 65 //import qt.core.QDebug;
67 66
68 import bookmarks; 67 import bookmarks;
69 import autosaver; 68 import autosaver;
73 72
74 73
75 const string BOOKMARKBAR = "Bookmarks Bar"; 74 const string BOOKMARKBAR = "Bookmarks Bar";
76 const string BOOKMARKMENU = "Bookmarks Menu"; 75 const string BOOKMARKMENU = "Bookmarks Menu";
77 76
77 // workaround for QList implementation
78 int indexOf(T)(T[] items, T item)
79 {
80 for(auto i = 0; i < items.length; ++i)
81 {
82 if(items[i] == item)
83 return i;
84 }
85 return -1;
86 }
78 87
79 /*! 88 /*!
80 Bookmark manager, owner of the bookmarks, loads, saves and basic tasks 89 Bookmark manager, owner of the bookmarks, loads, saves and basic tasks
81 */ 90 */
82 class BookmarksManager : public QObject 91 class BookmarksManager : public QObject
118 if (!m_loaded) 127 if (!m_loaded)
119 return; 128 return;
120 129
121 assert(node); 130 assert(node);
122 BookmarkNode parent = node.parent(); 131 BookmarkNode parent = node.parent();
123 int row = parent.children().indexOf(node); 132 int row = indexOf(parent.children(), node);
124 RemoveBookmarksCommand command = new RemoveBookmarksCommand(this, parent, row); 133 RemoveBookmarksCommand command = new RemoveBookmarksCommand(this, parent, row);
125 m_commands.push(command); 134 m_commands.push(command);
126 } 135 }
127 136
128 void setTitle(BookmarkNode node, string newTitle) 137 void setTitle(BookmarkNode node, string newTitle)
160 BookmarkNode menu() 169 BookmarkNode menu()
161 { 170 {
162 if (!m_loaded) 171 if (!m_loaded)
163 load(); 172 load();
164 173
165 for (int i = m_bookmarkRootNode.children().count() - 1; i >= 0; --i) { 174 for (int i = m_bookmarkRootNode.children().length - 1; i >= 0; --i) {
166 BookmarkNode node = m_bookmarkRootNode.children()[i]; 175 BookmarkNode node = m_bookmarkRootNode.children()[i];
167 if (node.title == tr(BOOKMARKMENU)) 176 if (node.title == tr(BOOKMARKMENU))
168 return node; 177 return node;
169 } 178 }
170 assert(false); 179 assert(false);
171 return 0; 180 return null;
172 } 181 }
173 182
174 BookmarkNode toolbar() 183 BookmarkNode toolbar()
175 { 184 {
176 if (!m_loaded) 185 if (!m_loaded)
177 load(); 186 load();
178 187
179 for (int i = m_bookmarkRootNode.children().count() - 1; i >= 0; --i) { 188 for (int i = m_bookmarkRootNode.children().length - 1; i >= 0; --i) {
180 BookmarkNode node = m_bookmarkRootNode.children()[i]; 189 BookmarkNode node = m_bookmarkRootNode.children()[i];
181 if (node.title == tr(BOOKMARKBAR)) 190 if (node.title == tr(BOOKMARKBAR))
182 return node; 191 return node;
183 } 192 }
184 assert(false); 193 assert(false);
185 return 0; 194 return null;
186 } 195 }
187 196
188 BookmarksModel bookmarksModel() 197 BookmarksModel bookmarksModel()
189 { 198 {
190 if (!m_bookmarkModel) 199 if (!m_bookmarkModel)
196 205
197 public: 206 public:
198 207
199 void importBookmarks() 208 void importBookmarks()
200 { 209 {
201 string fileName = QFileDialog.getOpenFileName(0, tr("Open File"), null, tr("XBEL (*.xbel *.xml)")); 210 string fileName = QFileDialog.getOpenFileName(null, tr("Open File"), null, tr("XBEL (*.xbel *.xml)"));
202 if (fileName.isEmpty()) 211 if (fileName.length == 0)
203 return; 212 return;
204 213
205 XbelReader reader; 214 auto reader = new XbelReader;
206 BookmarkNode importRootNode = reader.read(fileName); 215 BookmarkNode importRootNode = reader.read(fileName);
207 if (reader.error() != QXmlStreamReader.NoError) { 216 if (reader.error() != QXmlStreamReader.NoError) {
208 QMessageBox.warning(0, "Loading Bookmark", 217 QMessageBox.warning(null, "Loading Bookmark",
209 tr("Error when loading bookmarks on line %1, column %2:\n" 218 Format(tr("Error when loading bookmarks on line %1, column %2:\n"
210 "%3").arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.errorString())); 219 "%3"), reader.lineNumber(), reader.columnNumber(), reader.errorString()));
211 } 220 }
212 221
213 importRootNode.setType(BookmarkNode.Folder); 222 importRootNode.setType(BookmarkNode.Type.Folder);
214 importRootNode.title = (tr("Imported %1").arg(QDate.currentDate().toString(Qt.SystemLocaleShortDate))); 223 importRootNode.title = Format(tr("Imported %1"), QDate.currentDate().toString(Qt_DateFormat.SystemLocaleShortDate));
215 addBookmark(menu(), importRootNode); 224 addBookmark(menu(), importRootNode);
216 } 225 }
217 226
218
219 void exportBookmarks() 227 void exportBookmarks()
220 { 228 {
221 string fileName = QFileDialog.getSaveFileName(0, tr("Save File"), 229 string fileName = QFileDialog.getSaveFileName(null, tr("Save File"),
222 tr("%1 Bookmarks.xbel").arg(QCoreApplication.applicationName()), 230 Format(tr("%1 Bookmarks.xbel"), QCoreApplication.applicationName()),
223 tr("XBEL (*.xbel *.xml)")); 231 tr("XBEL (*.xbel *.xml)"));
224 if (fileName.isEmpty()) 232 if (fileName.length == 0)
225 return; 233 return;
226 234
227 XbelWriter writer; 235 auto writer = new XbelWriter;
228 if (!writer.write(fileName, m_bookmarkRootNode)) 236 if (!writer.write(fileName, m_bookmarkRootNode))
229 QMessageBox.critical(0, tr("Export error"), tr("error saving bookmarks")); 237 QMessageBox.critical(null, tr("Export error"), tr("error saving bookmarks"));
230 } 238 }
231 239
232 private: 240 private:
233 241
234 void save() 242 void save()
235 { 243 {
236 if (!m_loaded) 244 if (!m_loaded)
237 return; 245 return;
238 246
239 XbelWriter writer; 247 auto writer = new XbelWriter;
240 string dir = QDesktopServices.storageLocation(QDesktopServices.DataLocation); 248 string dir = QDesktopServices.storageLocation(QDesktopServices.DataLocation);
241 string bookmarkFile = dir ~ "/bookmarks.xbel"; 249 string bookmarkFile = dir ~ "/bookmarks.xbel";
242 if (!writer.write(bookmarkFile, m_bookmarkRootNode)) 250 if (!writer.write(bookmarkFile, m_bookmarkRootNode))
243 qWarning("BookmarkManager: error saving to" ~ bookmarkFile); 251 qWarning("BookmarkManager: error saving to" ~ bookmarkFile);
244 } 252 }
257 bookmarkFile = ":defaultbookmarks.xbel"; 265 bookmarkFile = ":defaultbookmarks.xbel";
258 266
259 XbelReader reader; 267 XbelReader reader;
260 m_bookmarkRootNode = reader.read(bookmarkFile); 268 m_bookmarkRootNode = reader.read(bookmarkFile);
261 if (reader.error() != QXmlStreamReader.NoError) { 269 if (reader.error() != QXmlStreamReader.NoError) {
262 QMessageBox.warning(0, "Loading Bookmark", 270 QMessageBox.warning(null, "Loading Bookmark",
263 tr("Error when loading bookmarks on line %1, column %2:\n" 271 Format(tr("Error when loading bookmarks on line %1, column %2:\n"
264 "%3").arg(reader.lineNumber()).arg(reader.columnNumber()).arg(reader.errorString())); 272 "%3"), reader.lineNumber(), reader.columnNumber(), reader.errorString()));
265 } 273 }
266 274
267 BookmarkNode toolbar = null; 275 BookmarkNode toolbar = null;
268 BookmarkNode menu = null; 276 BookmarkNode menu = null;
269 BookmarkNode[] others; 277 BookmarkNode[] others;
270 for (int i = m_bookmarkRootNode.children().count() - 1; i >= 0; --i) { 278 for (int i = m_bookmarkRootNode.children().length - 1; i >= 0; --i) {
271 BookmarkNode node = m_bookmarkRootNode.children()[i]; 279 BookmarkNode node = m_bookmarkRootNode.children()[i];
272 if (node.type() == BookmarkNode.Folder) { 280 if (node.type() == BookmarkNode.Type.Folder) {
273 // Automatically convert 281 // Automatically convert
274 if (node.title == tr("Toolbar Bookmarks") && !toolbar) { 282 if (node.title == tr("Toolbar Bookmarks") && !toolbar) {
275 node.title = tr(BOOKMARKBAR); 283 node.title = tr(BOOKMARKBAR);
276 } 284 }
277 if (node.title == tr(BOOKMARKBAR) && !toolbar) { 285 if (node.title == tr(BOOKMARKBAR) && !toolbar) {
288 } else { 296 } else {
289 others ~= node; 297 others ~= node;
290 } 298 }
291 m_bookmarkRootNode.remove(node); 299 m_bookmarkRootNode.remove(node);
292 } 300 }
293 assert(m_bookmarkRootNode.children().count() == 0); 301 assert(m_bookmarkRootNode.children().length == 0);
294 if (!toolbar) { 302 if (!toolbar) {
295 toolbar = new BookmarkNode(BookmarkNode.Folder, m_bookmarkRootNode); 303 toolbar = new BookmarkNode(BookmarkNode.Type.Folder, m_bookmarkRootNode);
296 toolbar.title = tr(BOOKMARKBAR); 304 toolbar.title = tr(BOOKMARKBAR);
297 } else { 305 } else {
298 m_bookmarkRootNode.add(toolbar); 306 m_bookmarkRootNode.add(toolbar);
299 } 307 }
300 308
301 if (!menu) { 309 if (!menu) {
302 menu = new BookmarkNode(BookmarkNode.Folder, m_bookmarkRootNode); 310 menu = new BookmarkNode(BookmarkNode.Type.Folder, m_bookmarkRootNode);
303 menu.title = tr(BOOKMARKMENU); 311 menu.title = tr(BOOKMARKMENU);
304 } else { 312 } else {
305 m_bookmarkRootNode.add(menu); 313 m_bookmarkRootNode.add(menu);
306 } 314 }
307 315
318 326
319 class RemoveBookmarksCommand : public QUndoCommand 327 class RemoveBookmarksCommand : public QUndoCommand
320 { 328 {
321 public: 329 public:
322 330
323 this(BookmarksManager m_bookmarkManagaer, BookmarkNode parent, int row) 331 this(BookmarksManager m_bookmarkManager, BookmarkNode parent, int row)
324 { 332 {
325 super(BookmarksManager.tr("Remove Bookmark")); 333 super(tr("Remove Bookmark"));
326 m_row = row; 334 m_row = row;
327 m_bookmarkManagaer = m_bookmarkManagaer; 335 m_bookmarkManager = m_bookmarkManager;
328 m_node = parent.children().value(row); 336 m_node = (row < parent.children().length) ? parent.children()[row] : null;
329 m_parent = parent; 337 m_parent = parent;
330 m_done = false; 338 m_done = false;
331 } 339 }
332 340
333 ~this() 341 ~this()
338 } 346 }
339 347
340 void undo() 348 void undo()
341 { 349 {
342 m_parent.add(m_node, m_row); 350 m_parent.add(m_node, m_row);
343 m_bookmarkManagaer.entryAdded.emit(m_node); 351 m_bookmarkManager.entryAdded.emit(m_node);
344 m_done = false; 352 m_done = false;
345 } 353 }
346 354
347 void redo() 355 void redo()
348 { 356 {
349 m_parent.remove(m_node); 357 m_parent.remove(m_node);
350 m_bookmarkManagaer.entryRemoved.emit(m_parent, m_row, m_node); 358 m_bookmarkManager.entryRemoved.emit(m_parent, m_row, m_node);
351 m_done = true; 359 m_done = true;
352 } 360 }
353 361
354 protected: 362 protected:
355 363
356 int m_row; 364 int m_row;
357 BookmarksManager m_bookmarkManagaer; 365 BookmarksManager m_bookmarkManager;
358 BookmarkNode m_node; 366 BookmarkNode m_node;
359 BookmarkNode m_parent; 367 BookmarkNode m_parent;
360 bool m_done; 368 bool m_done;
361 } 369 }
362 370
363 class InsertBookmarksCommand : public RemoveBookmarksCommand 371 class InsertBookmarksCommand : public RemoveBookmarksCommand
364 { 372 {
365 public: 373 public:
366 this(BookmarksManager m_bookmarkManagaer, BookmarkNode parent, BookmarkNode node, int row) 374
367 { 375 this(BookmarksManager m_bookmarkManager, BookmarkNode parent, BookmarkNode node, int row)
368 super(m_bookmarkManagaer, parent, row); 376 {
369 377 super(m_bookmarkManager, parent, row);
370 setText(BookmarksManager.tr("Insert Bookmark")); 378
379 setText(tr("Insert Bookmark"));
371 m_node = node; 380 m_node = node;
372 } 381 }
373 382
374 void undo() { RemoveBookmarksCommand.redo(); } 383 void undo() { RemoveBookmarksCommand.redo(); }
375 void redo() { RemoveBookmarksCommand.undo(); } 384 void redo() { RemoveBookmarksCommand.undo(); }
377 386
378 class ChangeBookmarkCommand : public QUndoCommand 387 class ChangeBookmarkCommand : public QUndoCommand
379 { 388 {
380 public: 389 public:
381 390
382 this(BookmarksManager m_bookmarkManagaer, BookmarkNode node, string newValue, bool title) 391 this(BookmarksManager m_bookmarkManager, BookmarkNode node, string newValue, bool title)
383 { 392 {
384 super(); 393 super();
385 m_bookmarkManagaer = m_bookmarkManagaer; 394 m_bookmarkManager = m_bookmarkManager;
386 m_title = title; 395 m_title = title;
387 m_newValue = newValue; 396 m_newValue = newValue;
388 m_node = node; 397 m_node = node;
389 if (m_title) { 398 if (m_title) {
390 m_oldValue = m_node.title; 399 m_oldValue = m_node.title;
391 setText(BookmarksManager.tr("Name Change")); 400 setText(tr("Name Change"));
392 } else { 401 } else {
393 m_oldValue = m_node.url; 402 m_oldValue = m_node.url;
394 setText(BookmarksManager.tr("Address Change")); 403 setText(tr("Address Change"));
395 } 404 }
396 } 405 }
397 406
398 void undo() 407 void undo()
399 { 408 {
400 if (m_title) 409 if (m_title)
401 m_node.title = m_oldValue; 410 m_node.title = m_oldValue;
402 else 411 else
403 m_node.url = m_oldValue; 412 m_node.url = m_oldValue;
404 m_bookmarkManagaer.entryChanged.emit(m_node); 413 m_bookmarkManager.entryChanged.emit(m_node);
405 } 414 }
406 415
407 void redo() 416 void redo()
408 { 417 {
409 if (m_title) 418 if (m_title)
410 m_node.title = m_newValue; 419 m_node.title = m_newValue;
411 else 420 else
412 m_node.url = m_newValue; 421 m_node.url = m_newValue;
413 m_bookmarkManagaer.entryChanged.emit(m_node); 422 m_bookmarkManager.entryChanged.emit(m_node);
414 } 423 }
415 424
416 private: 425 private:
417 426
418 BookmarksManager m_bookmarkManagaer; 427 BookmarksManager m_bookmarkManager;
419 bool m_title; 428 bool m_title;
420 string m_oldValue; 429 string m_oldValue;
421 string m_newValue; 430 string m_newValue;
422 BookmarkNode m_node; 431 BookmarkNode m_node;
423 } 432 }
432 public: 441 public:
433 442
434 void entryAdded(BookmarkNode item) 443 void entryAdded(BookmarkNode item)
435 { 444 {
436 assert(item && item.parent()); 445 assert(item && item.parent());
437 int row = item.parent().children().indexOf(item); 446 int row = indexOf(item.parent().children(), item);
438 BookmarkNode parent = item.parent(); 447 BookmarkNode parent = item.parent();
439 // item was already added so remove beore beginInsertRows is called 448 // item was already added so remove beore beginInsertRows is called
440 parent.remove(item); 449 parent.remove(item);
441 beginInsertRows(index(parent), row, row); 450 beginInsertRows(index(parent), row, row);
442 parent.add(item, row); 451 parent.add(item, row);
484 493
485 QVariant headerData(int section, Qt.Orientation orientation, int role = Qt.DisplayRole) 494 QVariant headerData(int section, Qt.Orientation orientation, int role = Qt.DisplayRole)
486 { 495 {
487 if (orientation == Qt.Horizontal && role == Qt.DisplayRole) { 496 if (orientation == Qt.Horizontal && role == Qt.DisplayRole) {
488 switch (section) { 497 switch (section) {
489 case 0: return tr("Title"); 498 case 0: return new QVariant(tr("Title"));
490 case 1: return tr("Address"); 499 case 1: return QVariant(tr("Address"));
491 } 500 }
492 } 501 }
493 return QAbstractItemModel.headerData(section, orientation, role); 502 return QAbstractItemModel.headerData(section, orientation, role);
494 } 503 }
495 504
496 QVariant data(QModelIndex index, int role = Qt.DisplayRole) 505 QVariant data(QModelIndex index, int role = Qt.DisplayRole)
497 { 506 {
498 if (!index.isValid() || index.model() != this) 507 if (!index.isValid() || index.model() != this)
499 return QVariant(); 508 return new QVariant();
500 509
501 BookmarkNode bookmarkNode = node(index); 510 BookmarkNode bookmarkNode = node(index);
502 switch (role) { 511 switch (role) {
503 case Qt.EditRole: 512 case Qt_ItemDataRole.EditRole:
504 case Qt.DisplayRole: 513 case Qt_ItemDataRole.DisplayRole:
505 if (bookmarkNode.type() == BookmarkNode.Separator) { 514 if (bookmarkNode.type() == BookmarkNode.Type.Separator) {
506 switch (index.column()) { 515 switch (index.column()) {
507 case 0: return QString(50, 0xB7); 516 case 0:
517 char[] tmp = new char[](50);
518 tmp[] = 0xB7;
519 return new QVariant(tmp);
508 case 1: return null; 520 case 1: return null;
509 } 521 }
510 } 522 }
511 523
512 switch (index.column()) { 524 switch (index.column()) {
513 case 0: return bookmarkNode.title; 525 case 0: return new QVariant(bookmarkNode.title);
514 case 1: return bookmarkNode.url; 526 case 1: return new QVariant(bookmarkNode.url);
515 } 527 }
516 break; 528 break;
517 case BookmarksModel.UrlRole: 529 case BookmarksModel.Roles.UrlRole:
518 return new QUrl(bookmarkNode.url); 530 return new QVariant(new QUrl(bookmarkNode.url));
519 break; 531 break;
520 case BookmarksModel.UrlStringRole: 532 case BookmarksModel.Roles.UrlStringRole:
521 return bookmarkNode.url; 533 return new QVariant(bookmarkNode.url);
522 break; 534 break;
523 case BookmarksModel.TypeRole: 535 case BookmarksModel.Roles.TypeRole:
524 return bookmarkNode.type(); 536 return new QVariant(cast(ulong) bookmarkNode.type());
525 break; 537 break;
526 case BookmarksModel.SeparatorRole: 538 case BookmarksModel.Roles.SeparatorRole:
527 return (bookmarkNode.type() == BookmarkNode.Separator); 539 return new QVariant(bookmarkNode.type() == BookmarkNode.Type.Separator);
528 break; 540 break;
529 case Qt.DecorationRole: 541 case Qt_ItemDataRole.DecorationRole:
530 if (index.column() == 0) { 542 if (index.column() == 0) {
531 if (bookmarkNode.type() == BookmarkNode.Folder) 543 if (bookmarkNode.type() == BookmarkNode.Type.Folder)
532 return QApplication.style().standardIcon(QStyle.SP_DirIcon); 544 return new QVariant(QApplication.style().standardIcon(QStyle.SP_DirIcon));
533 return BrowserApplication.instance().icon(bookmarkNode.url); 545 return new QVariant(BrowserApplication.instance().icon(bookmarkNode.url));
534 } 546 }
535 } 547 }
536 548
537 return QVariant(); 549 return new QVariant();
538 } 550 }
539 551
540 int columnCount(QModelIndex parent = QModelIndex()) 552 int columnCount(QModelIndex parent = QModelIndex())
541 { 553 {
542 return (parent.column() > 0) ? 0 : 2; 554 return (parent.column() > 0) ? 0 : 2;
546 { 558 {
547 if (parent.column() > 0) 559 if (parent.column() > 0)
548 return 0; 560 return 0;
549 561
550 if (!parent.isValid()) 562 if (!parent.isValid())
551 return m_bookmarksManager.bookmarks().children().count(); 563 return m_bookmarksManager.bookmarks().children().length;
552 564
553 BookmarkNode item = cast(BookmarkNode) parent.internalPointer(); 565 BookmarkNode item = cast(BookmarkNode) parent.internalPointer();
554 return item.children().count(); 566 return item.children().length;
555 } 567 }
556 568
557 QModelIndex index(int row, int column, QModelIndex parent = QModelIndex()) 569 QModelIndex index(int row, int column, QModelIndex parent = QModelIndex())
558 { 570 {
559 if (row < 0 || column < 0 || row >= rowCount(parent) || column >= columnCount(parent)) 571 if (row < 0 || column < 0 || row >= rowCount(parent) || column >= columnCount(parent))
560 return QModelIndex(); 572 return QModelIndex();
561 573
562 // get the parent node 574 // get the parent node
563 BookmarkNode parentNode = node(parent); 575 BookmarkNode parentNode = node(parent);
564 return createIndex(row, column, parentNode.children()[row]); 576 return createIndex(row, column, cast(void*) parentNode.children()[row]);
565 } 577 }
566 578
567 QModelIndex parent(QModelIndex index = QModelIndex()) 579 QModelIndex parent(QModelIndex index = QModelIndex())
568 { 580 {
569 if (!index.isValid()) 581 if (!index.isValid())
570 return QModelIndex(); 582 return QModelIndex();
571 583
572 BookmarkNode itemNode = node(index); 584 BookmarkNode itemNode = node(index);
573 BookmarkNode parentNode = (itemNode ? itemNode.parent() : 0); 585 BookmarkNode parentNode = (itemNode ? itemNode.parent() : null);
574 if (!parentNode || parentNode == m_bookmarksManager.bookmarks()) 586 if (!parentNode || parentNode == m_bookmarksManager.bookmarks())
575 return QModelIndex(); 587 return QModelIndex();
576 588
577 // get the parent's row 589 // get the parent's row
578 BookmarkNode grandParentNode = parentNode.parent(); 590 BookmarkNode grandParentNode = parentNode.parent();
579 int parentRow = grandParentNode.children().indexOf(parentNode); 591 int parentRow = grandParentNode.children().indexOf(parentNode);
580 assert(parentRow >= 0); 592 assert(parentRow >= 0);
581 return createIndex(parentRow, 0, parentNode); 593 return createIndex(parentRow, 0, cast(void*) parentNode);
582 } 594 }
583 595
584 int flags(QModelIndex index) 596 int flags(QModelIndex index)
585 { 597 {
586 if (!index.isValid()) 598 if (!index.isValid())
590 602
591 BookmarkNode bookmarkNode = node(index); 603 BookmarkNode bookmarkNode = node(index);
592 604
593 if (bookmarkNode != m_bookmarksManager.menu() && bookmarkNode != m_bookmarksManager.toolbar()) { 605 if (bookmarkNode != m_bookmarksManager.menu() && bookmarkNode != m_bookmarksManager.toolbar()) {
594 flags |= Qt_ItemFlag.ItemIsDragEnabled; 606 flags |= Qt_ItemFlag.ItemIsDragEnabled;
595 if (bookmarkNode.type() != BookmarkNode.Separator) 607 if (bookmarkNode.type() != BookmarkNode.Type.Separator)
596 flags |= Qt_ItemFlag.ItemIsEditable; 608 flags |= Qt_ItemFlag.ItemIsEditable;
597 } 609 }
598 if (hasChildren(index)) 610 if (hasChildren(index))
599 flags |= Qt_ItemFlag.ItemIsDropEnabled; 611 flags |= Qt_ItemFlag.ItemIsDropEnabled;
600 return flags; 612 return flags;
601 } 613 }
602 614
603 int supportedDropActions() 615 int supportedDropActions()
604 { 616 {
605 return Qt_DropActiont.CopyAction | Qt_DropAction.MoveAction; 617 return Qt_DropAction.CopyAction | Qt_DropAction.MoveAction;
606 } 618 }
607 619
608 bool removeRows(int row, int count, QModelIndex parent = QModelIndex()) 620 bool removeRows(int row, int count, QModelIndex parent = QModelIndex())
609 { 621 {
610 if (row < 0 || count <= 0 || row + count > rowCount(parent)) 622 if (row < 0 || count <= 0 || row + count > rowCount(parent))
631 return false; 643 return false;
632 644
633 BookmarkNode item = node(index); 645 BookmarkNode item = node(index);
634 646
635 switch (role) { 647 switch (role) {
636 case Qt_ItemFlag.EditRole: 648 case Qt_ItemDataRole.EditRole:
637 case Qt_ItemFlag.DisplayRole: 649 case Qt_ItemDataRole.DisplayRole:
638 if (index.column() == 0) { 650 if (index.column() == 0) {
639 m_bookmarksManager.setTitle(item, value.toString()); 651 m_bookmarksManager.setTitle(item, value.toString());
640 break; 652 break;
641 } 653 }
642 if (index.column() == 1) { 654 if (index.column() == 1) {
643 m_bookmarksManager.setUrl(item, value.toString()); 655 m_bookmarksManager.setUrl(item, value.toString());
644 break; 656 break;
645 } 657 }
646 return false; 658 return false;
647 case BookmarksModel.UrlRole: 659 case BookmarksModel.Roles.UrlRole:
648 m_bookmarksManager.setUrl(item, value.toUrl().toString()); 660 m_bookmarksManager.setUrl(item, value.toUrl().toString());
649 break; 661 break;
650 case BookmarksModel.UrlStringRole: 662 case BookmarksModel.Roles.UrlStringRole:
651 m_bookmarksManager.setUrl(item, value.toString()); 663 m_bookmarksManager.setUrl(item, value.toString());
652 break; 664 break;
653 default: 665 default:
654 break; 666 break;
655 return false; 667 return false;
670 auto buffer = new QBuffer(encodedData); 682 auto buffer = new QBuffer(encodedData);
671 buffer.open(QBuffer.ReadWrite); 683 buffer.open(QBuffer.ReadWrite);
672 auto writer = new XbelWriter; 684 auto writer = new XbelWriter;
673 BookmarkNode parentNode = node(index); 685 BookmarkNode parentNode = node(index);
674 writer.write(buffer, parentNode); 686 writer.write(buffer, parentNode);
675 stream << encodedData; 687 foreach(b; encodedData.data()[0..encodedData.size()])
688 stream.writeByte(cast(byte) b);
676 } 689 }
677 mimeData.setData(MIMETYPE, data); 690 mimeData.setData(MIMETYPE, data);
678 return mimeData; 691 return mimeData;
679 } 692 }
680 693
702 undoStack.beginMacro("Move Bookmarks"); 715 undoStack.beginMacro("Move Bookmarks");
703 716
704 while (!stream.atEnd()) { 717 while (!stream.atEnd()) {
705 auto encodedData = new QByteArray; 718 auto encodedData = new QByteArray;
706 stream >> encodedData; 719 stream >> encodedData;
720
707 auto buffer = new QBuffer(encodedData); 721 auto buffer = new QBuffer(encodedData);
708 buffer.open(QBuffer.ReadOnly); 722 buffer.open(QBuffer.ReadOnly);
709 723
710 auto reader = new XbelReader; 724 auto reader = new XbelReader;
711 BookmarkNode rootNode = reader.read(buffer); 725 BookmarkNode rootNode = reader.read(buffer);
712 BookmarkNode[] children = rootNode.children(); 726 BookmarkNode[] children = rootNode.children();
713 for (int i = 0; i < children.count(); ++i) { 727 for (int i = 0; i < children.length; ++i) {
714 BookmarkNode bookmarkNode = children[i]; 728 BookmarkNode bookmarkNode = children[i];
715 rootNode.remove(bookmarkNode); 729 rootNode.remove(bookmarkNode);
716 row = qMax(0, row); 730 row = qMax(0, row);
717 BookmarkNode parentNode = node(parent); 731 BookmarkNode parentNode = node(parent);
718 m_bookmarksManager.addBookmark(parentNode, bookmarkNode, row); 732 m_bookmarksManager.addBookmark(parentNode, bookmarkNode, row);
726 bool hasChildren(QModelIndex parent = QModelIndex()) 740 bool hasChildren(QModelIndex parent = QModelIndex())
727 { 741 {
728 if (!parent.isValid()) 742 if (!parent.isValid())
729 return true; 743 return true;
730 const BookmarkNode parentNode = node(parent); 744 const BookmarkNode parentNode = node(parent);
731 return (parentNode.type() == BookmarkNode.Folder); 745 return (parentNode.type() == BookmarkNode.Type.Folder);
732 } 746 }
733 747
734 BookmarkNode node(QModelIndex index) 748 BookmarkNode node(QModelIndex index)
735 { 749 {
736 BookmarkNode itemNode = cast(BookmarkNode) index.internalPointer(); 750 BookmarkNode itemNode = cast(BookmarkNode) index.internalPointer();
742 QModelIndex index(BookmarkNode node) 756 QModelIndex index(BookmarkNode node)
743 { 757 {
744 BookmarkNode parent = node.parent(); 758 BookmarkNode parent = node.parent();
745 if (!parent) 759 if (!parent)
746 return QModelIndex(); 760 return QModelIndex();
747 return createIndex(parent.children().indexOf(node), 0, node); 761 return createIndex(indexOf(parent.children(), node), 0, cast(void*) node);
748 } 762 }
749 763
750 private: 764 private:
751 765
752 bool m_endMacro; 766 bool m_endMacro;
763 public: 777 public:
764 778
765 this(QWidget parent = null) 779 this(QWidget parent = null)
766 { 780 {
767 super(parent); 781 super(parent);
768 m_bookmarksManager = 0; 782 m_bookmarksManager = null;
769 this.activated.connect(&this.activated); 783 this.activated.connect(&this.activated);
770 setMaxRows(-1); 784 setMaxRows(-1);
771 setHoverRole(BookmarksModel.UrlStringRole); 785 setHoverRole(BookmarksModel.Roles.UrlStringRole);
772 setSeparatorRole(BookmarksModel.SeparatorRole); 786 setSeparatorRole(BookmarksModel.Roles.SeparatorRole);
773 } 787 }
774 788
775 void setInitialActions(QAction[] actions) 789 void setInitialActions(QAction[] actions)
776 { 790 {
777 m_initialActions = actions; 791 m_initialActions = actions;
778 for (int i = 0; i < m_initialActions.count(); ++i) 792 for (int i = 0; i < m_initialActions.length; ++i)
779 addAction(m_initialActions[i]); 793 addAction(m_initialActions[i]);
780 } 794 }
781 795
782 protected: 796 protected:
783 797
785 { 799 {
786 m_bookmarksManager = BrowserApplication.bookmarksManager(); 800 m_bookmarksManager = BrowserApplication.bookmarksManager();
787 setModel(m_bookmarksManager.bookmarksModel()); 801 setModel(m_bookmarksManager.bookmarksModel());
788 setRootIndex(m_bookmarksManager.bookmarksModel().index(1, 0)); 802 setRootIndex(m_bookmarksManager.bookmarksModel().index(1, 0));
789 // initial actions 803 // initial actions
790 for (int i = 0; i < m_initialActions.count(); ++i) 804 for (int i = 0; i < m_initialActions.length; ++i)
791 addAction(m_initialActions[i]); 805 addAction(m_initialActions[i]);
792 if (!m_initialActions.isEmpty()) 806 if (m_initialActions.length)
793 addSeparator(); 807 addSeparator();
794 createMenu(model().index(0, 0), 1, this); 808 createMenu(model().index(0, 0), 1, this);
795 return true; 809 return true;
796 } 810 }
797 811
798 private: 812 private:
799 813
800 void activated(QModelIndex index) 814 void activated(QModelIndex index)
801 { 815 {
802 openUrl.emit(index.data(BookmarksModel.UrlRole).toUrl()); 816 openUrl.emit(index.data(BookmarksModel.Roles.UrlRole).toUrl());
803 } 817 }
804 818
805 private: 819 private:
806 820
807 BookmarksManager m_bookmarksManager; 821 BookmarksManager m_bookmarksManager;
971 void open() 985 void open()
972 { 986 {
973 QModelIndex index = tree.currentIndex(); 987 QModelIndex index = tree.currentIndex();
974 if (!index.parent().isValid()) 988 if (!index.parent().isValid())
975 return; 989 return;
976 openUrl.emit(index.sibling(index.row(), 1).data(BookmarksModel.UrlRole).toUrl()); 990 openUrl.emit(index.sibling(index.row(), 1).data(BookmarksModel.Roles.UrlRole).toUrl());
977 } 991 }
978 992
979 void newFolder() 993 void newFolder()
980 { 994 {
981 QModelIndex currentIndex = tree.currentIndex(); 995 QModelIndex currentIndex = tree.currentIndex();
984 idx = idx.parent(); 998 idx = idx.parent();
985 if (!idx.isValid()) 999 if (!idx.isValid())
986 idx = tree.rootIndex(); 1000 idx = tree.rootIndex();
987 idx = m_proxyModel.mapToSource(idx); 1001 idx = m_proxyModel.mapToSource(idx);
988 BookmarkNode parent = m_bookmarksManager.bookmarksModel().node(idx); 1002 BookmarkNode parent = m_bookmarksManager.bookmarksModel().node(idx);
989 BookmarkNode node = new BookmarkNode(BookmarkNode.Folder); 1003 BookmarkNode node = new BookmarkNode(BookmarkNode.Type.Folder);
990 node.title = tr("New Folder"); 1004 node.title = tr("New Folder");
991 m_bookmarksManager.addBookmark(parent, node, currentIndex.row() + 1); 1005 m_bookmarksManager.addBookmark(parent, node, currentIndex.row() + 1);
992 } 1006 }
993 1007
994 private: 1008 private:
1103 BookmarkNode parent = m_bookmarksModel.node(parentIndex); 1117 BookmarkNode parent = m_bookmarksModel.node(parentIndex);
1104 BookmarksManager bookmarksManager = m_bookmarksModel.bookmarksManager(); 1118 BookmarksManager bookmarksManager = m_bookmarksModel.bookmarksManager();
1105 bookmarksManager.addBookmark(parent, bookmark, row); 1119 bookmarksManager.addBookmark(parent, bookmark, row);
1106 event.acceptProposedAction(); 1120 event.acceptProposedAction();
1107 } 1121 }
1108 QToolBar.dropEvent(event); 1122 super.dropEvent(event);
1109 } 1123 }
1110 1124
1111 private: 1125 private:
1112 1126
1113 void triggered(QAction action) 1127 void triggered(QAction action)
1118 } 1132 }
1119 } 1133 }
1120 1134
1121 void activated(QModelIndex index) 1135 void activated(QModelIndex index)
1122 { 1136 {
1123 openUrl.emit(index.data(BookmarksModel.UrlRole).toUrl()); 1137 openUrl.emit(index.data(BookmarksModel.Roles.UrlRole).toUrl());
1124 } 1138 }
1125 1139
1126 void build() 1140 void build()
1127 { 1141 {
1128 clear(); 1142 clear();
1137 menu.activated.connect(&this.activated); 1151 menu.activated.connect(&this.activated);
1138 menu.setModel(m_bookmarksModel); 1152 menu.setModel(m_bookmarksModel);
1139 menu.setRootIndex(idx); 1153 menu.setRootIndex(idx);
1140 menu.addAction(new QAction(menu)); 1154 menu.addAction(new QAction(menu));
1141 button.setMenu(menu); 1155 button.setMenu(menu);
1142 button.setToolButtonStyle(Qt.ToolButtonTextOnly); 1156 button.setToolButtonStyle(Qt_ToolButtonStyle.ToolButtonTextOnly);
1143 QAction a = addWidget(button); 1157 QAction a = addWidget(button);
1144 a.setText(idx.data().toString()); 1158 a.setText(idx.data().toString());
1145 } else { 1159 } else {
1146 QAction action = addAction(idx.data().toString()); 1160 QAction action = addAction(idx.data().toString());
1147 action.setData(idx.data(BookmarksModel.UrlRole)); 1161 action.setData(idx.data(BookmarksModel.Roles.UrlRole));
1148 } 1162 }
1149 } 1163 }
1150 } 1164 }
1151 1165
1152 private: 1166 private: