X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e4dbe5626b092a884cfda0e99f0f0b4ba5cbc2ef..78c312a0f33b15b34aed8ea7cf9e9c344dea1f87:/src/urlnavigator.cpp diff --git a/src/urlnavigator.cpp b/src/urlnavigator.cpp index 4ce0fc009..1e8f06b6e 100644 --- a/src/urlnavigator.cpp +++ b/src/urlnavigator.cpp @@ -22,8 +22,6 @@ #include "urlnavigator.h" #include "bookmarkselector.h" -#include "dolphinsettings.h" -#include "generalsettings.h" #include "protocolcombo.h" #include "urlnavigatorbutton.h" @@ -42,10 +40,42 @@ #include #include #include +#include #include -#include - -UrlNavigator::HistoryElem::HistoryElem() : +#include + +/** + * @brief Represents the history element of an URL. + * + * 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. + */ +class HistoryElem { +public: + HistoryElem(); + HistoryElem(const KUrl& url); + ~HistoryElem(); // non virtual + + const KUrl& url() const { return m_url; } + + void setCurrentFileName(const QString& name) { m_currentFileName = name; } + const QString& currentFileName() const { return m_currentFileName; } + + void setContentsX(int x) { m_contentsX = x; } + int contentsX() const { return m_contentsX; } + + void setContentsY(int y) { m_contentsY = y; } + int contentsY() const { return m_contentsY; } + +private: + KUrl m_url; + QString m_currentFileName; + int m_contentsX; + int m_contentsY; +}; + +HistoryElem::HistoryElem() : m_url(), m_currentFileName(), m_contentsX(0), @@ -53,7 +83,7 @@ UrlNavigator::HistoryElem::HistoryElem() : { } -UrlNavigator::HistoryElem::HistoryElem(const KUrl& url) : +HistoryElem::HistoryElem(const KUrl& url) : m_url(url), m_currentFileName(), m_contentsX(0), @@ -61,63 +91,119 @@ UrlNavigator::HistoryElem::HistoryElem(const KUrl& url) : { } -UrlNavigator::HistoryElem::~HistoryElem() +HistoryElem::~HistoryElem() { } -UrlNavigator::UrlNavigator(const KUrl& url, - QWidget* parent) : - QWidget(parent), +class UrlNavigator::Private +{ +public: + Private(UrlNavigator* q, KFilePlacesModel* placesModel); + + void slotReturnPressed(const QString&); + void slotRemoteHostActivated(); + void slotProtocolChanged(const QString&); + + /** + * Appends the widget at the end of the URL navigator. It is assured + * that the filler widget remains as last widget to fill the remaining + * width. + */ + void appendWidget(QWidget* widget); + + /** + * Switches the navigation bar between the breadcrumb view and the + * traditional view (see setUrlEditable()) and is connected to the clicked signal + * of the navigation bar button. + */ + void switchView(); + + /** + * Updates the history element with the current file item + * and the contents position. + */ + 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(); + + + bool m_active; + bool m_showHiddenFiles; + int m_historyIndex; + + QHBoxLayout* m_layout; + + QList m_history; + QToolButton* m_toggleButton; + BookmarkSelector* m_bookmarkSelector; + KUrlComboBox* m_pathBox; + ProtocolCombo* m_protocols; + QLabel* m_protocolSeparator; + QLineEdit* m_host; + QLinkedList m_navButtons; + QWidget* m_filler; + QString m_homeUrl; + UrlNavigator* q; +}; + + +UrlNavigator::Private::Private(UrlNavigator* q, KFilePlacesModel* placesModel) + : m_active(true), + m_showHiddenFiles(false), m_historyIndex(0), - m_layout(0), + m_layout(new QHBoxLayout), m_protocols(0), m_protocolSeparator(0), m_host(0), - m_filler(0) + m_filler(0), + q(q) { - m_layout = new QHBoxLayout(); m_layout->setSpacing(0); m_layout->setMargin(0); - m_history.prepend(HistoryElem(url)); - - QFontMetrics fontMetrics(font()); - setMinimumHeight(fontMetrics.height() + 10); - - // intialize toggle button which switches between the breadcrumb view + // initialize toggle button which switches between the breadcrumb view // and the traditional view - m_toggleButton = new QPushButton(); + m_toggleButton = new QToolButton(); m_toggleButton->setCheckable(true); - m_toggleButton->setFlat(true); - m_toggleButton->setIcon(KIcon("locationbar_erase")); // TODO: is just a placeholder icon + m_toggleButton->setAutoRaise(true); + m_toggleButton->setIcon(KIcon("editinput")); // TODO: is just a placeholder icon (?) m_toggleButton->setFocusPolicy(Qt::NoFocus); - m_toggleButton->setMinimumHeight(minimumHeight()); + m_toggleButton->setMinimumHeight(q->minimumHeight()); connect(m_toggleButton, SIGNAL(clicked()), - this, SLOT(switchView())); - if (DolphinSettings::instance().generalSettings()->editableUrl()) { - m_toggleButton->toggle(); - } + q, SLOT(switchView())); // initialize the bookmark selector - m_bookmarkSelector = new BookmarkSelector(this); - connect(m_bookmarkSelector, SIGNAL(bookmarkActivated(const KUrl&)), - this, SLOT(setUrl(const KUrl&))); + m_bookmarkSelector = new BookmarkSelector(q, placesModel); + connect(m_bookmarkSelector, SIGNAL(placeActivated(const KUrl&)), + q, SLOT(setUrl(const KUrl&))); // initialize the path box of the traditional view - m_pathBox = new KUrlComboBox(KUrlComboBox::Directories, true, this); + m_pathBox = new KUrlComboBox(KUrlComboBox::Directories, true, q); KUrlCompletion* kurlCompletion = new KUrlCompletion(KUrlCompletion::DirCompletion); m_pathBox->setCompletionObject(kurlCompletion); m_pathBox->setAutoDeleteCompletionObject(true); - connect(m_pathBox, SIGNAL(returnPressed(const QString&)), - this, SLOT(slotReturnPressed(const QString&))); - connect(m_pathBox, SIGNAL(urlActivated(const KUrl&)), - this, SLOT(slotUrlActivated(const KUrl&))); - - //connect(dolphinView, SIGNAL(redirection(const KUrl&, const KUrl&)), - // this, SLOT(slotRedirection(const KUrl&, const KUrl&))); + connect(m_pathBox, SIGNAL(returnPressed(QString)), + q, SLOT(slotReturnPressed(QString))); + connect(m_pathBox, SIGNAL(urlActivated(KUrl)), + q, SLOT(setUrl(KUrl))); // Append a filler widget at the end, which automatically resizes to the // maximum available width. This assures that the URL navigator uses the @@ -129,210 +215,14 @@ UrlNavigator::UrlNavigator(const KUrl& url, m_layout->addWidget(m_bookmarkSelector); m_layout->addWidget(m_pathBox); m_layout->addWidget(m_filler); - setLayout(m_layout); - - updateContent(); -} - -UrlNavigator::~UrlNavigator() -{ -} - -const KUrl& UrlNavigator::url() const -{ - assert(!m_history.empty()); - QLinkedList::const_iterator it = m_history.begin(); - it += m_historyIndex; - return (*it).url(); -} - -KUrl UrlNavigator::url(int index) const -{ - assert(index >= 0); - QString path(url().pathOrUrl()); - path = path.section('/', 0, index); - - if ( path.length() >= 1 && path.at(path.length()-1) != '/') - { - path.append('/'); - } - - return path; } -const QLinkedList& UrlNavigator::history(int& index) const +void UrlNavigator::Private::appendWidget(QWidget* widget) { - index = m_historyIndex; - return m_history; -} - -void UrlNavigator::goBack() -{ - updateHistoryElem(); - - const int count = m_history.count(); - if (m_historyIndex < count - 1) { - ++m_historyIndex; - updateContent(); - emit urlChanged(url()); - emit historyChanged(); - } -} - -void UrlNavigator::goForward() -{ - if (m_historyIndex > 0) { - --m_historyIndex; - updateContent(); - emit urlChanged(url()); - emit historyChanged(); - } -} - -void UrlNavigator::goUp() -{ - setUrl(url().upUrl()); -} - -void UrlNavigator::goHome() -{ - setUrl(DolphinSettings::instance().generalSettings()->homeUrl()); -} - -void UrlNavigator::setUrlEditable(bool editable) -{ - if (isUrlEditable() != editable) { - m_toggleButton->toggle(); - switchView(); - } -} - -bool UrlNavigator::isUrlEditable() const -{ - return m_toggleButton->isChecked(); -} - -void UrlNavigator::editUrl(bool editOrBrowse) -{ - setUrlEditable(editOrBrowse); - if (editOrBrowse) { - m_pathBox->setFocus(); - } -} - -void UrlNavigator::setActive(bool active) -{ - if (active != m_active) { - m_active = active; - update(); - if (active) { - emit activated(); - } - } -} - -void UrlNavigator::dropUrls(const KUrl::List& urls, - const KUrl& destination) -{ - emit urlsDropped(urls, destination); -} - -void UrlNavigator::setUrl(const KUrl& url) -{ - QString urlStr(url.pathOrUrl()); - //kDebug() << "setUrl(" << url << ")" << endl; - if ( urlStr.length() > 0 && urlStr.at(0) == '~') { - // replace '~' by the home directory - urlStr.remove(0, 1); - urlStr.insert(0, QDir::home().path()); - } - - const KUrl transformedUrl(urlStr); - - if (m_historyIndex > 0) { - // Check whether the previous element of the history has the same Url. - // If yes, just go forward instead of inserting a duplicate history - // element. - QLinkedList::const_iterator it = m_history.begin(); - it += m_historyIndex - 1; - const KUrl& nextUrl = (*it).url(); - if (transformedUrl == nextUrl) { - goForward(); -// kDebug() << "goin' forward in history" << endl; - return; - } - } - - QLinkedList::iterator it = m_history.begin() + m_historyIndex; - const KUrl& currUrl = (*it).url(); - if (currUrl == transformedUrl) { - // don't insert duplicate history elements -// kDebug() << "currUrl == transformedUrl" << endl; - return; - } - - updateHistoryElem(); - m_history.insert(it, HistoryElem(transformedUrl)); - - updateContent(); - - emit urlChanged(transformedUrl); - emit historyChanged(); - - // Prevent an endless growing of the history: remembering - // the last 100 Urls should be enough... - if (m_historyIndex > 100) { - m_history.erase(m_history.begin()); - --m_historyIndex; - } - -/* kDebug() << "history starting ====================" << endl; - int i = 0; - for (QValueListIterator it = m_history.begin(); - it != m_history.end(); - ++it, ++i) - { - kDebug() << i << ": " << (*it).url() << endl; - } - kDebug() << "history done ========================" << endl;*/ - - requestActivation(); -} - -void UrlNavigator::requestActivation() -{ - setActive(true); -} - -void UrlNavigator::storeContentsPosition(int x, int y) -{ - QLinkedList::iterator it = m_history.begin() + m_historyIndex; - (*it).setContentsX(x); - (*it).setContentsY(y); -} - -void UrlNavigator::keyReleaseEvent(QKeyEvent* event) -{ - QWidget::keyReleaseEvent(event); - if (isUrlEditable() && (event->key() == Qt::Key_Escape)) { - setUrlEditable(false); - } -} - -void UrlNavigator::mouseReleaseEvent(QMouseEvent* event) -{ - if (event->button() == Qt::MidButton) { - QClipboard* clipboard = QApplication::clipboard(); - const QMimeData* mimeData = clipboard->mimeData(); - if (mimeData->hasText()) { - const QString text = mimeData->text(); - setUrl(KUrl(text)); - } - } - QWidget::mouseReleaseEvent(event); + m_layout->insertWidget(m_layout->count() - 1, widget); } -void UrlNavigator::slotReturnPressed(const QString& text) +void UrlNavigator::Private::slotReturnPressed(const QString& text) { // Parts of the following code have been taken // from the class KateFileSelector located in @@ -343,7 +233,7 @@ void UrlNavigator::slotReturnPressed(const QString& text) KUrl typedUrl(text); if (typedUrl.hasPass()) { - typedUrl.setPass(QString::null); + typedUrl.setPass(QString()); } QStringList urls = m_pathBox->urls(); @@ -351,20 +241,15 @@ void UrlNavigator::slotReturnPressed(const QString& text) urls.prepend(typedUrl.url()); m_pathBox->setUrls(urls, KUrlComboBox::RemoveBottom); - setUrl(typedUrl); + q->setUrl(typedUrl); // The URL might have been adjusted by UrlNavigator::setUrl(), hence // synchronize the result in the path box. - m_pathBox->setUrl(url()); + m_pathBox->setUrl(q->url()); } -void UrlNavigator::slotUrlActivated(const KUrl& url) +void UrlNavigator::Private::slotRemoteHostActivated() { - setUrl(url); -} - -void UrlNavigator::slotRemoteHostActivated() -{ - KUrl u = url(); + KUrl u = q->url(); QString host = m_host->text(); QString user; @@ -405,11 +290,11 @@ void UrlNavigator::slotRemoteHostActivated() } } - setUrl(u); + q->setUrl(u); } } -void UrlNavigator::slotProtocolChanged(const QString& protocol) +void UrlNavigator::Private::slotProtocolChanged(const QString& protocol) { KUrl url; url.setProtocol(protocol); @@ -425,19 +310,19 @@ void UrlNavigator::slotProtocolChanged(const QString& protocol) m_navButtons.clear(); if (KProtocolInfo::protocolClass(protocol) == ":local") { - setUrl(url); + q->setUrl(url); } else { if (!m_host) { - m_protocolSeparator = new QLabel("://", this); + m_protocolSeparator = new QLabel("://", q); appendWidget(m_protocolSeparator); - m_host = new QLineEdit(this); + m_host = new QLineEdit(q); appendWidget(m_host); connect(m_host, SIGNAL(lostFocus()), - this, SLOT(slotRemoteHostActivated())); + q, SLOT(slotRemoteHostActivated())); connect(m_host, SIGNAL(returnPressed()), - this, SLOT(slotRemoteHostActivated())); + q, SLOT(slotRemoteHostActivated())); } else { m_host->setText(""); @@ -448,6 +333,7 @@ void UrlNavigator::slotProtocolChanged(const QString& protocol) } } +#if 0 void UrlNavigator::slotRedirection(const KUrl& oldUrl, const KUrl& newUrl) { // kDebug() << "received redirection to " << newUrl << endl; @@ -460,35 +346,35 @@ kDebug() << "received redirection from " << oldUrl << " to " << newUrl << endl; m_urls.append(newUrl);*/ } +#endif -void UrlNavigator::switchView() +void UrlNavigator::Private::switchView() { updateContent(); - if (isUrlEditable()) { + if (q->isUrlEditable()) { m_pathBox->setFocus(); + } else { + q->setUrl(m_pathBox->currentText()); } - else { - setUrl(m_pathBox->currentText()); - } - emit requestActivation(); + emit q->requestActivation(); } -void UrlNavigator::updateHistoryElem() +void UrlNavigator::Private::updateHistoryElem() { assert(m_historyIndex >= 0); const KFileItem* item = 0; // TODO: m_dolphinView->currentFileItem(); if (item != 0) { - QLinkedList::iterator it = m_history.begin() + m_historyIndex; - (*it).setCurrentFileName(item->name()); + HistoryElem& hist = m_history[m_historyIndex]; + hist.setCurrentFileName(item->name()); } } -void UrlNavigator::updateContent() +void UrlNavigator::Private::updateContent() { - m_bookmarkSelector->updateSelection(url()); + m_bookmarkSelector->updateSelection(q->url()); m_toggleButton->setToolTip(QString()); - QString path(url().pathOrUrl()); + QString path(q->url().pathOrUrl()); // TODO: prevent accessing the DolphinMainWindow out from this scope //const QAction* action = dolphinView()->mainWindow()->actionCollection()->action("editable_location"); @@ -505,58 +391,58 @@ void UrlNavigator::updateContent() m_toggleButton->setToolTip(i18n("Browse (%1, Escape)", shortcut)); - setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); + q->setSizePolicy(QSizePolicy::Minimum, QSizePolicy::Fixed); m_pathBox->show(); - m_pathBox->setUrl(url()); + m_pathBox->setUrl(q->url()); } else { m_toggleButton->setToolTip(i18n("Edit location (%1)", shortcut)); - setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); + q->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Fixed); m_pathBox->hide(); m_filler->show(); // get the data from the currently selected bookmark - KBookmark bookmark = m_bookmarkSelector->selectedBookmark(); - //int bookmarkIndex = m_bookmarkSelector->selectedIndex(); + KUrl placeUrl = m_bookmarkSelector->selectedPlaceUrl(); - QString bookmarkPath; - if (bookmark.isNull()) { - // No bookmark is a part of the current Url. - // The following code tries to guess the bookmark + QString placePath; + if (!placeUrl.isValid()) { + // No place is a part of the current Url. + // The following code tries to guess the place // path. E. g. "fish://root@192.168.0.2/var/lib" writes - // "fish://root@192.168.0.2" to 'bookmarkPath', which leads to the + // "fish://root@192.168.0.2" to 'placePath', which leads to the // navigation indication 'Custom Path > var > lib". int idx = path.indexOf(QString("//")); idx = path.indexOf("/", (idx < 0) ? 0 : idx + 2); - bookmarkPath = (idx < 0) ? path : path.left(idx); + placePath = (idx < 0) ? path : path.left(idx); } else { - bookmarkPath = bookmark.url().pathOrUrl(); + placePath = placeUrl.pathOrUrl(); } - const uint len = bookmarkPath.length(); + const uint len = placePath.length(); // calculate the start point for the URL navigator buttons by counting - // the slashs inside the bookmark URL + // the slashs inside the place URL int slashCount = 0; for (uint i = 0; i < len; ++i) { - if (bookmarkPath.at(i) == QChar('/')) { + if (placePath.at(i) == QChar('/')) { ++slashCount; } } - if ((len > 0) && bookmarkPath.at(len - 1) == QChar('/')) { + if ((len > 0) && placePath.at(len - 1) == QChar('/')) { assert(slashCount > 0); --slashCount; } - if (!url().isLocalFile() && bookmark.isNull()) { - QString protocol = url().protocol(); + const KUrl currentUrl = q->url(); + if (!currentUrl.isLocalFile() && !placeUrl.isValid()) { + QString protocol = currentUrl.protocol(); if (!m_protocols) { deleteButtons(); - m_protocols = new ProtocolCombo(protocol, this); + m_protocols = new ProtocolCombo(protocol, q); appendWidget(m_protocols); - connect(m_protocols, SIGNAL(activated(const QString&)), - this, SLOT(slotProtocolChanged(const QString&))); + connect(m_protocols, SIGNAL(activated(QString)), + q, SLOT(slotProtocolChanged(QString))); } else { m_protocols->setProtocol(protocol); @@ -564,22 +450,23 @@ void UrlNavigator::updateContent() m_protocols->show(); if (KProtocolInfo::protocolClass(protocol) != ":local") { - QString hostText = url().host(); + QString hostText = currentUrl.host(); - if (!url().user().isEmpty()) { - hostText = url().user() + "@" + hostText; + if (!currentUrl.user().isEmpty()) { + hostText = currentUrl.user() + '@' + hostText; } if (!m_host) { - m_protocolSeparator = new QLabel("://", this); + // ######### TODO: this code is duplicated from slotProtocolChanged! + m_protocolSeparator = new QLabel("://", q); appendWidget(m_protocolSeparator); - m_host = new QLineEdit(hostText, this); + m_host = new QLineEdit(hostText, q); appendWidget(m_host); connect(m_host, SIGNAL(lostFocus()), - this, SLOT(slotRemoteHostActivated())); + q, SLOT(slotRemoteHostActivated())); connect(m_host, SIGNAL(returnPressed()), - this, SLOT(slotRemoteHostActivated())); + q, SLOT(slotRemoteHostActivated())); } else { m_host->setText(hostText); @@ -605,11 +492,12 @@ void UrlNavigator::updateContent() } } -void UrlNavigator::updateButtons(const QString& path, int startIndex) +void UrlNavigator::Private::updateButtons(const QString& path, int startIndex) { QLinkedList::iterator it = m_navButtons.begin(); const QLinkedList::const_iterator itEnd = m_navButtons.end(); bool createButton = false; + const KUrl currentUrl = q->url(); int idx = startIndex; bool hasNext = true; @@ -623,11 +511,11 @@ void UrlNavigator::updateButtons(const QString& path, int startIndex) 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(); + // place instead of the directory name + const KUrl placeUrl = m_bookmarkSelector->selectedPlaceUrl(); + text = m_bookmarkSelector->selectedPlaceText(); if (text.isEmpty()) { - if (url().isLocalFile()) { + if (currentUrl.isLocalFile()) { text = i18n("Custom Path"); } else { @@ -639,7 +527,7 @@ void UrlNavigator::updateButtons(const QString& path, int startIndex) UrlNavigatorButton* button = 0; if (createButton) { - button = new UrlNavigatorButton(idx, this); + button = new UrlNavigatorButton(idx, q); appendWidget(button); } else { @@ -672,7 +560,7 @@ void UrlNavigator::updateButtons(const QString& path, int startIndex) m_navButtons.erase(itBegin, m_navButtons.end()); } -void UrlNavigator::deleteButtons() +void UrlNavigator::Private::deleteButtons() { QLinkedList::iterator itBegin = m_navButtons.begin(); QLinkedList::iterator itEnd = m_navButtons.end(); @@ -685,9 +573,250 @@ void UrlNavigator::deleteButtons() m_navButtons.erase(itBegin, itEnd); } -void UrlNavigator::appendWidget(QWidget* widget) +//// + + +UrlNavigator::UrlNavigator(KFilePlacesModel* placesModel, + const KUrl& url, + QWidget* parent) : + QWidget(parent), + d( new Private(this, placesModel) ) { - m_layout->insertWidget(m_layout->count() - 1, widget); + d->m_history.prepend(HistoryElem(url)); + + QFontMetrics fontMetrics(font()); + setMinimumHeight(fontMetrics.height() + 10); + + setLayout(d->m_layout); + + d->updateContent(); +} + +UrlNavigator::~UrlNavigator() +{ + delete d; +} + +const KUrl& UrlNavigator::url() const +{ + assert(!d->m_history.empty()); + return d->m_history[d->m_historyIndex].url(); +} + +KUrl UrlNavigator::url(int index) const +{ + assert(index >= 0); + // keep scheme, hostname etc. maybe we will need this in the future + // for e.g. browsing ftp repositories. + KUrl newurl(url()); + newurl.setPath(QString()); + QString path(url().path()); + + if (!path.isEmpty()) { + if (index == 0) //prevent the last "/" from being stripped + path = "/"; //or we end up with an empty path + else + path = path.section('/', 0, index); + } + + newurl.setPath(path); + return newurl; +} + +QPoint UrlNavigator::savedPosition() const +{ + const HistoryElem& histElem = d->m_history[d->m_historyIndex]; + return QPoint( histElem.contentsX(), histElem.contentsY() ); +} + +int UrlNavigator::historySize() const +{ + return d->m_history.count(); +} + +void UrlNavigator::goBack() +{ + d->updateHistoryElem(); + + const int count = d->m_history.count(); + if (d->m_historyIndex < count - 1) { + ++d->m_historyIndex; + d->updateContent(); + emit urlChanged(url()); + emit historyChanged(); + } +} + +void UrlNavigator::goForward() +{ + if (d->m_historyIndex > 0) { + --d->m_historyIndex; + d->updateContent(); + emit urlChanged(url()); + emit historyChanged(); + } +} + +void UrlNavigator::goUp() +{ + setUrl(url().upUrl()); +} + +void UrlNavigator::goHome() +{ + if (d->m_homeUrl.isEmpty()) + setUrl(QDir::homePath()); + else + setUrl(d->m_homeUrl); +} + +bool UrlNavigator::isUrlEditable() const +{ + return d->m_toggleButton->isChecked(); +} + +void UrlNavigator::setUrlEditable(bool editable) +{ + if (isUrlEditable() != editable) { + d->m_toggleButton->toggle(); + d->switchView(); + } +} + +void UrlNavigator::setActive(bool active) +{ + if (active != d->m_active) { + d->m_active = active; + update(); + if (active) { + emit activated(); + } + } +} + +void UrlNavigator::setShowHiddenFiles( bool show ) +{ + d->m_showHiddenFiles = show; +} + +void UrlNavigator::dropUrls(const KUrl::List& urls, + const KUrl& destination) +{ + emit urlsDropped(urls, destination); +} + +void UrlNavigator::setUrl(const KUrl& url) +{ + QString urlStr(url.pathOrUrl()); + + // TODO: a patch has been submitted by Filip Brcic which adjusts + // the URL for tar and zip files. See https://bugs.kde.org/show_bug.cgi?id=142781 + // for details. The URL navigator part of the patch has not been committed yet, + // as the URL navigator will be subject of change and + // we might think of a more generic approach to check the protocol + MIME type for + // this use case. + + //kDebug() << "setUrl(" << url << ")" << endl; + if ( urlStr.length() > 0 && urlStr.at(0) == '~') { + // replace '~' by the home directory + urlStr.remove(0, 1); + urlStr.insert(0, QDir::homePath()); + } + + const KUrl transformedUrl(urlStr); + + if (d->m_historyIndex > 0) { + // Check whether the previous element of the history has the same Url. + // If yes, just go forward instead of inserting a duplicate history + // element. + HistoryElem& prevHistoryElem = d->m_history[d->m_historyIndex - 1]; + if (transformedUrl == prevHistoryElem.url()) { + goForward(); +// kDebug() << "goin' forward in history" << endl; + return; + } + } + + if (this->url() == transformedUrl) { + // don't insert duplicate history elements +// kDebug() << "current url == transformedUrl" << endl; + return; + } + + d->updateHistoryElem(); + d->m_history.insert(d->m_historyIndex, HistoryElem(transformedUrl)); + + d->updateContent(); + + emit urlChanged(transformedUrl); + emit historyChanged(); + + // Prevent an endless growing of the history: remembering + // the last 100 Urls should be enough... + if (d->m_historyIndex > 100) { + d->m_history.removeFirst(); + --d->m_historyIndex; + } + +/* kDebug() << "history starting ====================" << endl; + int i = 0; + for (QValueListIterator it = d->m_history.begin(); + it != d->m_history.end(); + ++it, ++i) + { + kDebug() << i << ": " << (*it).url() << endl; + } + kDebug() << "history done ========================" << endl;*/ + + requestActivation(); +} + +void UrlNavigator::requestActivation() +{ + setActive(true); +} + +void UrlNavigator::storeContentsPosition(int x, int y) +{ + HistoryElem& hist = d->m_history[d->m_historyIndex]; + hist.setContentsX(x); + hist.setContentsY(y); +} + +void UrlNavigator::keyReleaseEvent(QKeyEvent* event) +{ + QWidget::keyReleaseEvent(event); + if (isUrlEditable() && (event->key() == Qt::Key_Escape)) { + setUrlEditable(false); + } +} + +void UrlNavigator::mouseReleaseEvent(QMouseEvent* event) +{ + if (event->button() == Qt::MidButton) { + QClipboard* clipboard = QApplication::clipboard(); + const QMimeData* mimeData = clipboard->mimeData(); + if (mimeData->hasText()) { + const QString text = mimeData->text(); + setUrl(KUrl(text)); + } + } + QWidget::mouseReleaseEvent(event); +} + +bool UrlNavigator::isActive() const +{ + return d->m_active; +} + +bool UrlNavigator::showHiddenFiles() const +{ + return d->m_showHiddenFiles; +} + +void UrlNavigator::setHomeUrl(const QString& homeUrl) +{ + d->m_homeUrl = homeUrl; } #include "urlnavigator.moc"