From 737dd6ec3b8daa1517b392dbad1f13b090e5d33b Mon Sep 17 00:00:00 2001 From: Yoann Laissus Date: Sun, 18 Jul 2010 19:15:44 +0200 Subject: - Performance improvements (partial updates of the tree) - Synchronisation of the folded states between each windows - Code cleanup --- src/bookmarks/bookmarkcontextmenu.cpp | 11 ++--- src/bookmarks/bookmarksmanager.cpp | 31 +++++++++++++ src/bookmarks/bookmarksmanager.h | 6 +++ src/bookmarks/bookmarkspanel.cpp | 8 ++-- src/bookmarks/bookmarkspanel.h | 4 +- src/bookmarks/bookmarkstreemodel.cpp | 85 +++++++++++++++++------------------ src/bookmarks/bookmarkstreemodel.h | 4 +- src/mainwindow.cpp | 3 ++ 8 files changed, 94 insertions(+), 58 deletions(-) (limited to 'src') diff --git a/src/bookmarks/bookmarkcontextmenu.cpp b/src/bookmarks/bookmarkcontextmenu.cpp index b5df463c..dec4382f 100644 --- a/src/bookmarks/bookmarkcontextmenu.cpp +++ b/src/bookmarks/bookmarkcontextmenu.cpp @@ -212,6 +212,7 @@ void BookmarkContextMenu::copyToClipboard() void BookmarkContextMenu::deleteBookmark() { KBookmark bm = bookmark(); + KBookmarkGroup bmg = bm.parentGroup(); bool folder = bm.isGroup(); QString name = QString(bm.text()).replace("&&", "&"); @@ -226,8 +227,8 @@ void BookmarkContextMenu::deleteBookmark() ) return; - bm.parentGroup().deleteBookmark(bm); - manager()->emitChanged(); + bmg.deleteBookmark(bm); + manager()->emitChanged(bmg); } @@ -266,7 +267,7 @@ void BookmarkContextMenu::newBookmarkGroup() KBookmark newBk; newBk = dialog->createNewFolder("New folder", selected.parentGroup()); selected.parentGroup().moveBookmark(newBk, selected); - manager()->emitChanged(); + manager()->emitChanged(newBk.parentGroup()); } } else @@ -303,7 +304,7 @@ void BookmarkContextMenu::newSeparator() if (!selected.isNull()) parent.moveBookmark(newBk, selected); - manager()->emitChanged(); + manager()->emitChanged(newBk.parentGroup()); } @@ -328,6 +329,6 @@ void BookmarkContextMenu::bookmarkCurrentPage() parent.addBookmark(owner()->currentTitle(), KUrl(owner()->currentUrl()), "text-html"); } - manager()->emitChanged(); + manager()->emitChanged(parent); } diff --git a/src/bookmarks/bookmarksmanager.cpp b/src/bookmarks/bookmarksmanager.cpp index 537b5366..57a29907 100644 --- a/src/bookmarks/bookmarksmanager.cpp +++ b/src/bookmarks/bookmarksmanager.cpp @@ -483,3 +483,34 @@ void BookmarkProvider::slotAddBookmark() parentBookmark.addBookmark(bookmarkOwner()->currentTitle(), bookmarkOwner()->currentUrl()); bookmarkManager()->emitChanged(); } + + +void BookmarkProvider::registerBookmarkPanel(BookmarksPanel *panel) +{ + if (panel && !m_bookmarkPanels.contains(panel)) + { + m_bookmarkPanels.append(panel); + connect(panel, SIGNAL(expansionChanged()), this, SLOT(slotPanelChanged())); + } +} + + +void BookmarkProvider::removeBookmarkPanel(BookmarksPanel *panel) +{ + m_bookmarkPanels.removeOne(panel); + + if (m_bookmarkPanels.isEmpty()) + { + Application::bookmarkProvider()->bookmarkManager()->emitChanged(); + } +} + + +void BookmarkProvider::slotPanelChanged() +{ + foreach (BookmarksPanel *panel, m_bookmarkPanels) + { + if (panel && panel != sender()) + panel->startLoadFoldedState(); + } +} diff --git a/src/bookmarks/bookmarksmanager.h b/src/bookmarks/bookmarksmanager.h index 4be3a94b..0915e894 100644 --- a/src/bookmarks/bookmarksmanager.h +++ b/src/bookmarks/bookmarksmanager.h @@ -37,6 +37,7 @@ // Local Includes #include "application.h" #include "urlresolver.h" +#include "bookmarkspanel.h" // Qt Includes #include @@ -234,6 +235,9 @@ public: QString titleForBookmarkUrl(QString url); + void registerBookmarkPanel(BookmarksPanel *panel); + void removeBookmarkPanel(BookmarksPanel *panel); + signals: /** * @short This signal is emitted when an url has to be loaded @@ -263,6 +267,7 @@ public slots: private slots: void triggerBookmarkMenu(); void slotAddBookmark(); + void slotPanelChanged(); private: void fillBookmarkBar(KToolBar *toolBar); @@ -272,6 +277,7 @@ private: BookmarkOwner *m_owner; KActionCollection *m_actionCollection; QList m_bookmarkToolBars; + QList m_bookmarkPanels; AwesomeUrlCompletion *m_completion; KActionMenu *_bookmarkActionMenu; diff --git a/src/bookmarks/bookmarkspanel.cpp b/src/bookmarks/bookmarkspanel.cpp index 0dbb89c4..25aab516 100644 --- a/src/bookmarks/bookmarkspanel.cpp +++ b/src/bookmarks/bookmarkspanel.cpp @@ -126,7 +126,7 @@ void BookmarksPanel::setup() connect(m_treeView, SIGNAL(collapsed(const QModelIndex &)), this, SLOT(onCollapse(const QModelIndex &))); connect(m_treeView, SIGNAL(expanded(const QModelIndex &)), this, SLOT(onExpand(const QModelIndex &))); connect(search, SIGNAL(textChanged(const QString &)), proxy, SLOT(setFilterFixedString(const QString &))); - loadFoldedState(); + startLoadFoldedState(); _loaded = true; } @@ -152,7 +152,7 @@ void BookmarksPanel::onCollapse(const QModelIndex &index) KBookmark bookmark = bookmarkForIndex(index); bookmark.internalElement().setAttribute("folded", "yes"); - emit saveOnlyRequested(); + emit expansionChanged(); } @@ -163,11 +163,11 @@ void BookmarksPanel::onExpand(const QModelIndex &index) KBookmark bookmark = bookmarkForIndex(index); bookmark.internalElement().setAttribute("folded", "no"); - emit saveOnlyRequested(); + emit expansionChanged(); } -void BookmarksPanel::loadFoldedState() +void BookmarksPanel::startLoadFoldedState() { m_loadingState = true; loadFoldedState(QModelIndex()); diff --git a/src/bookmarks/bookmarkspanel.h b/src/bookmarks/bookmarkspanel.h index 3d2dc26b..d94f2b99 100644 --- a/src/bookmarks/bookmarkspanel.h +++ b/src/bookmarks/bookmarkspanel.h @@ -59,10 +59,11 @@ public: signals: void openUrl(const KUrl &, const Rekonq::OpenType &); void itemHovered(const QString &); - void saveOnlyRequested(); + void expansionChanged(); public slots: void showing(bool); + void startLoadFoldedState(); private slots: void contextMenu(const QPoint &pos); @@ -71,7 +72,6 @@ private slots: void onCollapse(const QModelIndex &index); void onExpand(const QModelIndex &index); void loadFoldedState(const QModelIndex &root); - void loadFoldedState(); private: void setup(); diff --git a/src/bookmarks/bookmarkstreemodel.cpp b/src/bookmarks/bookmarkstreemodel.cpp index 82748ba3..b58b66e9 100644 --- a/src/bookmarks/bookmarkstreemodel.cpp +++ b/src/bookmarks/bookmarkstreemodel.cpp @@ -148,9 +148,8 @@ BookmarksTreeModel::BookmarksTreeModel(QObject *parent) , m_root(0) { resetModel(); - connect(this, SIGNAL(bookmarksUpdated()), parent, SLOT(loadFoldedState())); - connect(Application::bookmarkProvider()->bookmarkManager(), SIGNAL(changed(QString, QString)), this, SLOT(bookmarksChanged())); - connect(parent, SIGNAL(saveOnlyRequested()), this, SLOT(saveOnly())); + connect(Application::bookmarkProvider()->bookmarkManager(), SIGNAL(changed(const QString &, const QString &)), this, SLOT(bookmarksChanged(const QString &))); + connect(this, SIGNAL(bookmarksUpdated()), parent, SLOT(startLoadFoldedState())); } @@ -284,10 +283,37 @@ QVariant BookmarksTreeModel::data(const QModelIndex &index, int role) const } -void BookmarksTreeModel::bookmarksChanged() +void BookmarksTreeModel::bookmarksChanged(const QString &groupAddress) { - resetModel(); - emit bookmarksUpdated(); + if (groupAddress.isEmpty()) + { + resetModel(); + emit bookmarksUpdated(); + } + else + { + beginResetModel(); + BtmItem *node = m_root; + QModelIndex nodeIndex; + + QStringList indexChain( groupAddress.split( '/', QString::SkipEmptyParts) ); + foreach( const QString &sIndex, indexChain ) + { + bool ok; + int i = sIndex.toInt( &ok ); + if( !ok ) + break; + + if( i < 0 || i >= node->childCount() ) + break; + + node = node->child( i ); + nodeIndex = index( i, 0, nodeIndex ); + } + populate(node, Application::bookmarkProvider()->bookmarkManager()->findByAddress(groupAddress).toGroup()); + endResetModel(); + emit bookmarksUpdated(); + } } @@ -299,6 +325,7 @@ void BookmarksTreeModel::resetModel() void BookmarksTreeModel::setRoot(KBookmarkGroup bmg) { + beginResetModel(); delete m_root; m_root = new BtmItem(KBookmark()); @@ -306,7 +333,7 @@ void BookmarksTreeModel::setRoot(KBookmarkGroup bmg) return; populate(m_root, bmg); - reset(); + endResetModel(); } @@ -336,20 +363,6 @@ KBookmark BookmarksTreeModel::bookmarkForIndex(const QModelIndex &index) const } -void BookmarksTreeModel::saveOnly() -{ - disconnect(Application::bookmarkProvider()->bookmarkManager(), SIGNAL(changed(QString, QString)), this, SLOT(bookmarksChanged())); - connect(Application::bookmarkProvider()->bookmarkManager(), SIGNAL(changed(QString, QString)), this, SLOT(reconnectManager())); - Application::bookmarkProvider()->bookmarkManager()->emitChanged(); -} - - -void BookmarksTreeModel::reconnectManager() -{ - connect(Application::bookmarkProvider()->bookmarkManager(), SIGNAL(changed(QString, QString)), this, SLOT(bookmarksChanged())); -} - - Qt::DropActions BookmarksTreeModel::supportedDropActions() const { return Qt::MoveAction; @@ -366,8 +379,8 @@ QMimeData* BookmarksTreeModel::mimeData(const QModelIndexList & indexes) const { QMimeData *mimeData = new QMimeData; - QByteArray addresse = bookmarkForIndex(indexes.first()).address().toLatin1(); - mimeData->setData("application/rekonq-bookmark", addresse); + QByteArray address = bookmarkForIndex(indexes.first()).address().toLatin1(); + mimeData->setData("application/rekonq-bookmark", address); bookmarkForIndex(indexes.first()).populateMimeData(mimeData); return mimeData; @@ -395,32 +408,16 @@ bool BookmarksTreeModel::dropMimeData(const QMimeData *data, Qt::DropAction acti if (!destIndex.isValid()) { - if (!parent.isValid()) // Drop into a blank area - { - Application::bookmarkProvider()->rootGroup().deleteBookmark(bookmark); - Application::bookmarkProvider()->rootGroup().addBookmark(bookmark); - } - else // Drop at the last item of the group or directly on the main item of the group - { - root.deleteBookmark(bookmark); - root.addBookmark(bookmark); - } + root.deleteBookmark(bookmark); + root.addBookmark(bookmark); } - else + else if (row != 1) { - if (row == -1) - { - root.deleteBookmark(bookmark); - root.addBookmark(bookmark); - } - else // A classic drop - { - root.moveBookmark(bookmark, root.previous(dropDestBookmark)); - } + root.moveBookmark(bookmark, root.previous(dropDestBookmark)); } - Application::bookmarkProvider()->bookmarkManager()->emitChanged(root); + Application::bookmarkProvider()->bookmarkManager()->emitChanged(); } } return true; diff --git a/src/bookmarks/bookmarkstreemodel.h b/src/bookmarks/bookmarkstreemodel.h index 8dd0923c..c509840b 100644 --- a/src/bookmarks/bookmarkstreemodel.h +++ b/src/bookmarks/bookmarkstreemodel.h @@ -84,9 +84,7 @@ public: virtual QMimeData *mimeData(const QModelIndexList & indexes) const; private slots: - void bookmarksChanged(); - void saveOnly(); - void reconnectManager(); + void bookmarksChanged(const QString &groupAddress); signals: void bookmarksUpdated(); diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b27b7c81..0deeb15b 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -161,6 +161,7 @@ MainWindow::MainWindow() MainWindow::~MainWindow() { Application::bookmarkProvider()->removeToolBar(m_bmBar); + Application::bookmarkProvider()->removeBookmarkPanel(m_bookmarksPanel); Application::instance()->removeMainWindow(this); delete m_view; @@ -566,6 +567,8 @@ void MainWindow::setupPanels() addDockWidget(Qt::LeftDockWidgetArea, m_bookmarksPanel); + Application::bookmarkProvider()->registerBookmarkPanel(m_bookmarksPanel); + // setup bookmarks panel action a = (KAction *) m_bookmarksPanel->toggleViewAction(); a->setShortcut(KShortcut(Qt::CTRL + Qt::SHIFT + Qt::Key_B)); -- cgit v1.2.1