From: Peter Penz Date: Sat, 17 Feb 2007 14:46:54 +0000 (+0000) Subject: Prevent a flickering of the URL navigator buttons by reusing existing buttons (before... X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/e11f9af6056d8e9d4affbcb142b67449b670c9cd Prevent a flickering of the URL navigator buttons by reusing existing buttons (before all items have been deleted and recreated). The flickering is still not solved to 100 %, but a lot better than before. @Aaron: I did not change anything inside the logic of the code -> the net protocol code works the same as in our internal KDE3 working prototype of Dolphin svn path=/trunk/KDE/kdebase/apps/; revision=634543 --- diff --git a/src/urlnavigator.cpp b/src/urlnavigator.cpp index 965e3f3d5..70cae4708 100644 --- a/src/urlnavigator.cpp +++ b/src/urlnavigator.cpp @@ -186,9 +186,7 @@ bool UrlNavigator::isUrlEditable() const void UrlNavigator::editUrl(bool editOrBrowse) { setUrlEditable(editOrBrowse); - - if (editOrBrowse) - { + if (editOrBrowse) { m_pathBox->setFocus(); } } @@ -207,7 +205,6 @@ void UrlNavigator::setActive(bool active) void UrlNavigator::dropUrls(const KUrl::List& urls, const KUrl& destination) { - kDebug() << "------------------- URLS dropped" << endl; emit urlsDropped(urls, destination); } @@ -314,7 +311,7 @@ void UrlNavigator::slotReturnPressed(const QString& text) m_pathBox->setUrls(urls, KUrlComboBox::RemoveBottom); setUrl(typedUrl); - // The Url might have been adjusted by UrlNavigator::setUrl(), hence + // The URL might have been adjusted by UrlNavigator::setUrl(), hence // synchronize the result in the path box. m_pathBox->setUrl(url()); } @@ -377,8 +374,8 @@ void UrlNavigator::slotProtocolChanged(const QString& protocol) url.setProtocol(protocol); //url.setPath(KProtocolInfo::protocolClass(protocol) == ":local" ? "/" : ""); url.setPath("/"); - QLinkedList::const_iterator it = m_navButtons.begin(); - const QLinkedList::const_iterator itEnd = m_navButtons.end(); + QLinkedList::const_iterator it = m_navButtons.begin(); + const QLinkedList::const_iterator itEnd = m_navButtons.end(); while (it != itEnd) { (*it)->close(); (*it)->deleteLater(); @@ -445,16 +442,6 @@ void UrlNavigator::updateHistoryElem() void UrlNavigator::updateContent() { - // delete all existing Url navigator buttons - QLinkedList::const_iterator it = m_navButtons.begin(); - const QLinkedList::const_iterator itEnd = m_navButtons.end(); - while (it != itEnd) { - (*it)->close(); - (*it)->deleteLater(); - ++it; - } - m_navButtons.clear(); - m_bookmarkSelector->updateSelection(url()); m_toggleButton->setToolTip(QString()); @@ -470,6 +457,7 @@ void UrlNavigator::updateContent() delete m_protocols; m_protocols = 0; delete m_protocolSeparator; m_protocolSeparator = 0; delete m_host; m_host = 0; + deleteButtons(); m_toggleButton->setToolTip(i18n("Browse (%1, Escape)", shortcut)); @@ -482,7 +470,6 @@ void UrlNavigator::updateContent() setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); m_pathBox->hide(); - QString dir_name; // get the data from the currently selected bookmark KBookmark bookmark = m_bookmarkSelector->selectedBookmark(); @@ -504,8 +491,8 @@ void UrlNavigator::updateContent() } const uint len = bookmarkPath.length(); - // calculate the start point for the Url navigator buttons by counting - // the slashs inside the bookmark Url + // calculate the start point for the URL navigator buttons by counting + // the slashs inside the bookmark URL int slashCount = 0; for (uint i = 0; i < len; ++i) { if (bookmarkPath.at(i) == QChar('/')) { @@ -520,6 +507,7 @@ void UrlNavigator::updateContent() if (!url().isLocalFile() && bookmark.isNull()) { QString protocol = url().protocol(); if (!m_protocols) { + deleteButtons(); m_protocols = new ProtocolCombo(protocol, this); connect(m_protocols, SIGNAL(activated(const QString&)), this, SLOT(slotProtocolChanged(const QString&))); @@ -529,12 +517,10 @@ void UrlNavigator::updateContent() } m_protocols->show(); - if (KProtocolInfo::protocolClass(protocol) != ":local") - { + if (KProtocolInfo::protocolClass(protocol) != ":local") { QString hostText = url().host(); - if (!url().user().isEmpty()) - { + if (!url().user().isEmpty()) { hostText = url().user() + "@" + hostText; } @@ -567,39 +553,87 @@ void UrlNavigator::updateContent() } } - // create Url navigator buttons - int idx = slashCount; - bool hasNext = true; - do { - dir_name = path.section('/', idx, idx); - const bool isFirstButton = (idx == slashCount); - hasNext = isFirstButton || !dir_name.isEmpty(); - if (hasNext) { - UrlNavigatorButton* button = new UrlNavigatorButton(idx, this); - if (isFirstButton) { - // the first Url navigator button should get the name of the - // bookmark instead of the directory name - QString text = bookmark.text(); - if (text.isEmpty()) { - if (url().isLocalFile()) - { - text = i18n("Custom Path"); - } - else - { - delete button; - ++idx; - continue; - } + updateButtons(path, slashCount); + } +} + +void UrlNavigator::updateButtons(const QString& path, int startIndex) +{ + QLinkedList::iterator it = m_navButtons.begin(); + const QLinkedList::const_iterator itEnd = m_navButtons.end(); + bool createButton = false; + + int idx = startIndex; + bool hasNext = true; + do { + createButton = (it == itEnd); + + const QString dirName = path.section('/', idx, idx); + const bool isFirstButton = (idx == startIndex); + hasNext = isFirstButton || !dirName.isEmpty(); + if (hasNext) { + QString text; + if (isFirstButton) { + // the first URL navigator button should get the name of the + // bookmark instead of the directory name + const KBookmark bookmark = m_bookmarkSelector->selectedBookmark(); + text = bookmark.text(); + if (text.isEmpty()) { + if (url().isLocalFile()) { + text = i18n("Custom Path"); + } + else { + ++idx; + continue; } - button->setText(text); } + } + + UrlNavigatorButton* button = 0; + if (createButton) { + button = new UrlNavigatorButton(idx, this); + } + else { + button = *it; + button->setIndex(idx); + } + + if (isFirstButton) { + button->setText(text); + } + + if (createButton) { button->show(); m_navButtons.append(button); - ++idx; } - } while (hasNext); + else { + ++it; + } + ++idx; + } + } while (hasNext); + + // delete buttons which are not used anymore + QLinkedList::iterator itBegin = it; + while (it != itEnd) { + (*it)->close(); + (*it)->deleteLater(); + ++it; + } + m_navButtons.erase(itBegin, m_navButtons.end()); +} + +void UrlNavigator::deleteButtons() +{ + QLinkedList::iterator itBegin = m_navButtons.begin(); + QLinkedList::iterator itEnd = m_navButtons.end(); + QLinkedList::iterator it = itBegin; + while (it != itEnd) { + (*it)->close(); + (*it)->deleteLater(); + ++it; } + m_navButtons.erase(itBegin, itEnd); } #include "urlnavigator.moc" diff --git a/src/urlnavigator.h b/src/urlnavigator.h index 1815a902c..b2e1da90e 100644 --- a/src/urlnavigator.h +++ b/src/urlnavigator.h @@ -35,13 +35,14 @@ class KFileItem; class KUrlComboBox; class BookmarkSelector; +class UrlNavigatorButton; class ProtocolCombo; /** * @brief Navigation bar which contains the current shown URL. * * The URL navigator offers two modes: - * - Editable: Represents the 'classic' mode, where the current Url + * - Editable: Represents the 'classic' mode, where the current URL * is editable inside a line editor. * - Non editable: The URL is represented by a number of buttons, where * clicking on a button results in activating the URL @@ -63,9 +64,9 @@ class UrlNavigator : public KHBox public: /** - * @brief Represents the history element of an Url. + * @brief Represents the history element of an URL. * - * A history element contains the Url, the name of the current file + * A history element contains the URL, the name of the current file * (the 'current file' is the file where the cursor is located) and * the x- and y-position of the content. */ @@ -96,14 +97,14 @@ public: UrlNavigator(const KUrl& url, QWidget* parent); virtual ~UrlNavigator(); - /** Returns the current active Url. */ + /** Returns the current active URL. */ const KUrl& url() const; - /** Returns the portion of the current active Url up to the button at index. */ + /** Returns the portion of the current active URL up to the button at index. */ KUrl url(int index) const; /** - * Returns the complete Url history. The index 0 indicates the oldest + * Returns the complete URL history. The index 0 indicates the oldest * history element. * @param index Output parameter which indicates the current * index of the location. @@ -111,35 +112,35 @@ public: const QLinkedList& history(int& index) const; /** - * Goes back one step in the Url history. The signals + * Goes back one step in the URL history. The signals * UrlNavigator::urlChanged and UrlNavigator::historyChanged * are submitted. */ void goBack(); /** - * Goes forward one step in the Url history. The signals + * Goes forward one step in the URL history. The signals * UrlNavigator::urlChanged and UrlNavigator::historyChanged * are submitted. */ void goForward(); /** - * Goes up one step of the Url path. The signals + * Goes up one step of the URL path. The signals * UrlNavigator::urlChanged and UrlNavigator::historyChanged * are submitted. */ void goUp(); /** - * Goes to the home Url. The signals UrlNavigator::urlChanged + * Goes to the home URL. The signals UrlNavigator::urlChanged * and UrlNavigator::historyChanged are submitted. */ void goHome(); /** - * @return True, if the Url is editable by the user within a line editor. - * If false is returned, each part of the Url is presented by a button + * @return True, if the URL is editable by the user within a line editor. + * If false is returned, each part of the URL is presented by a button * for fast navigation. */ bool isUrlEditable() const; @@ -239,18 +240,6 @@ private slots: void slotClicked(); private: - bool m_active; - int m_historyIndex; - QLinkedList m_history; - QCheckBox* m_toggleButton; - BookmarkSelector* m_bookmarkSelector; - KUrlComboBox* m_pathBox; - ProtocolCombo* m_protocols; - QLabel* m_protocolSeparator; - QLineEdit* m_host; - QLinkedList m_navButtons; - //UrlStack m_urls; - /** * Allows to edit the Url of the navigation bar if \a editable * is true. If \a editable is false, each part of @@ -264,6 +253,35 @@ private: */ void updateHistoryElem(); void updateContent(); + + /** + * Updates all buttons to have one button for each part of the + * path \a path. Existing buttons, which are available by m_navButtons, + * are reused if possible. If the path is longer, new buttons will be + * created, if the path is shorter, the remaining buttons will be deleted. + * @param startIndex Start index of path part (/), where the buttons + * should be created for each following part. + */ + void updateButtons(const QString& path, int startIndex); + + /** + * Deletes all URL navigator buttons. m_navButtons is + * empty after this operation. + */ + void deleteButtons(); + +private: + bool m_active; + int m_historyIndex; + QLinkedList m_history; + QCheckBox* m_toggleButton; + BookmarkSelector* m_bookmarkSelector; + KUrlComboBox* m_pathBox; + ProtocolCombo* m_protocols; + QLabel* m_protocolSeparator; + QLineEdit* m_host; + QLinkedList m_navButtons; + //UrlStack m_urls; }; #endif