X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/e11f9af6056d8e9d4affbcb142b67449b670c9cd..85bc196887fbed01187e3830cd28c2500cb01cb2:/src/urlnavigator.cpp diff --git a/src/urlnavigator.cpp b/src/urlnavigator.cpp index 70cae4708..aa4c94c69 100644 --- a/src/urlnavigator.cpp +++ b/src/urlnavigator.cpp @@ -23,22 +23,27 @@ #include "bookmarkselector.h" #include "dolphinsettings.h" -#include "generalsettings.h" +#include "dolphin_generalsettings.h" #include "protocolcombo.h" #include "urlnavigatorbutton.h" #include #include +#include #include #include #include #include +#include +#include #include -#include +#include #include #include +#include +#include UrlNavigator::HistoryElem::HistoryElem() : m_url(), @@ -60,35 +65,48 @@ UrlNavigator::HistoryElem::~HistoryElem() { } -UrlNavigator::UrlNavigator(const KUrl& url, +UrlNavigator::UrlNavigator(KBookmarkManager* bookmarkManager, + const KUrl& url, QWidget* parent) : - KHBox(parent), + QWidget(parent), m_active(true), + m_showHiddenFiles(false), m_historyIndex(0), + m_layout(0), m_protocols(0), m_protocolSeparator(0), - m_host(0) + m_host(0), + m_filler(0) { + m_layout = new QHBoxLayout(); + m_layout->setSpacing(0); + m_layout->setMargin(0); + m_history.prepend(HistoryElem(url)); QFontMetrics fontMetrics(font()); - setMinimumHeight(fontMetrics.height() + 8); - - m_toggleButton = new QCheckBox(this); - //m_toggleButton->setFlat(true); - //m_toggleButton->setToggleButton(true); + setMinimumHeight(fontMetrics.height() + 10); + + // intialize toggle button which switches between the breadcrumb view + // and the traditional view + m_toggleButton = new QToolButton(); + m_toggleButton->setCheckable(true); + m_toggleButton->setAutoRaise(true); + m_toggleButton->setIcon(KIcon("editinput")); // TODO: is just a placeholder icon (?) m_toggleButton->setFocusPolicy(Qt::NoFocus); m_toggleButton->setMinimumHeight(minimumHeight()); connect(m_toggleButton, SIGNAL(clicked()), - this, SLOT(slotClicked())); + this, SLOT(switchView())); if (DolphinSettings::instance().generalSettings()->editableUrl()) { m_toggleButton->toggle(); } - m_bookmarkSelector = new BookmarkSelector(this); + // initialize the bookmark selector + m_bookmarkSelector = new BookmarkSelector(this, bookmarkManager); connect(m_bookmarkSelector, SIGNAL(bookmarkActivated(const KUrl&)), this, SLOT(setUrl(const KUrl&))); + // initialize the path box of the traditional view m_pathBox = new KUrlComboBox(KUrlComboBox::Directories, true, this); KUrlCompletion* kurlCompletion = new KUrlCompletion(KUrlCompletion::DirCompletion); @@ -102,6 +120,19 @@ UrlNavigator::UrlNavigator(const KUrl& url, //connect(dolphinView, SIGNAL(redirection(const KUrl&, const KUrl&)), // this, SLOT(slotRedirection(const KUrl&, const KUrl&))); + + // Append a filler widget at the end, which automatically resizes to the + // maximum available width. This assures that the URL navigator uses the + // whole width, so that the clipboard content can be dropped. + m_filler = new QWidget(); + m_filler->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Preferred); + + m_layout->addWidget(m_toggleButton); + m_layout->addWidget(m_bookmarkSelector); + m_layout->addWidget(m_pathBox); + m_layout->addWidget(m_filler); + setLayout(m_layout); + updateContent(); } @@ -112,29 +143,37 @@ UrlNavigator::~UrlNavigator() const KUrl& UrlNavigator::url() const { assert(!m_history.empty()); - QLinkedList::const_iterator it = m_history.begin(); - it += m_historyIndex; - return (*it).url(); + return m_history[m_historyIndex].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('/'); + // 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); } - return path; + newurl.setPath(path); + return newurl; +} + +UrlNavigator::HistoryElem UrlNavigator::currentHistoryItem() const +{ + return m_history[m_historyIndex]; } -const QLinkedList& UrlNavigator::history(int& index) const +int UrlNavigator::historySize() const { - index = m_historyIndex; - return m_history; + return m_history.count(); } void UrlNavigator::goBack() @@ -174,7 +213,7 @@ void UrlNavigator::setUrlEditable(bool editable) { if (isUrlEditable() != editable) { m_toggleButton->toggle(); - slotClicked(); + switchView(); } } @@ -202,6 +241,11 @@ void UrlNavigator::setActive(bool active) } } +void UrlNavigator::setShowHiddenFiles( bool show ) +{ + m_showHiddenFiles = show; +} + void UrlNavigator::dropUrls(const KUrl::List& urls, const KUrl& destination) { @@ -211,6 +255,14 @@ void UrlNavigator::dropUrls(const KUrl::List& urls, 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 @@ -224,26 +276,22 @@ void UrlNavigator::setUrl(const KUrl& url) // 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) { + HistoryElem& prevHistoryElem = m_history[m_historyIndex - 1]; + if (transformedUrl == prevHistoryElem.url()) { goForward(); // kDebug() << "goin' forward in history" << endl; return; } } - QLinkedList::iterator it = m_history.begin() + m_historyIndex; - const KUrl& currUrl = (*it).url(); - if (currUrl == transformedUrl) { + if (this->url() == transformedUrl) { // don't insert duplicate history elements -// kDebug() << "currUrl == transformedUrl" << endl; +// kDebug() << "current url == transformedUrl" << endl; return; } updateHistoryElem(); - m_history.insert(it, HistoryElem(transformedUrl)); + m_history.insert(m_historyIndex, HistoryElem(transformedUrl)); updateContent(); @@ -253,7 +301,7 @@ void UrlNavigator::setUrl(const KUrl& url) // 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_history.removeFirst(); --m_historyIndex; } @@ -272,25 +320,37 @@ void UrlNavigator::setUrl(const KUrl& url) void UrlNavigator::requestActivation() { - kDebug() << "--------------------------- request activation" << endl; setActive(true); } void UrlNavigator::storeContentsPosition(int x, int y) { - QLinkedList::iterator it = m_history.begin() + m_historyIndex; - (*it).setContentsX(x); - (*it).setContentsY(y); + HistoryElem& hist = m_history[m_historyIndex]; + hist.setContentsX(x); + hist.setContentsY(y); } void UrlNavigator::keyReleaseEvent(QKeyEvent* event) { - KHBox::keyReleaseEvent(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); +} + void UrlNavigator::slotReturnPressed(const QString& text) { // Parts of the following code have been taken @@ -302,7 +362,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(); @@ -389,7 +449,9 @@ void UrlNavigator::slotProtocolChanged(const QString& protocol) else { if (!m_host) { m_protocolSeparator = new QLabel("://", this); + appendWidget(m_protocolSeparator); m_host = new QLineEdit(this); + appendWidget(m_host); connect(m_host, SIGNAL(lostFocus()), this, SLOT(slotRemoteHostActivated())); @@ -418,16 +480,16 @@ kDebug() << "received redirection from " << oldUrl << " to " << newUrl << endl; m_urls.append(newUrl);*/ } -void UrlNavigator::slotClicked() +void UrlNavigator::switchView() { + updateContent(); if (isUrlEditable()) { m_pathBox->setFocus(); - updateContent(); } else { setUrl(m_pathBox->currentText()); - emit requestActivation(); } + emit requestActivation(); } void UrlNavigator::updateHistoryElem() @@ -435,8 +497,8 @@ void UrlNavigator::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()); } } @@ -458,6 +520,7 @@ void UrlNavigator::updateContent() delete m_protocolSeparator; m_protocolSeparator = 0; delete m_host; m_host = 0; deleteButtons(); + m_filler->hide(); m_toggleButton->setToolTip(i18n("Browse (%1, Escape)", shortcut)); @@ -468,12 +531,12 @@ void UrlNavigator::updateContent() else { m_toggleButton->setToolTip(i18n("Edit location (%1)", shortcut)); - setSizePolicy(QSizePolicy::Fixed, QSizePolicy::Fixed); + 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(); QString bookmarkPath; if (bookmark.isNull()) { @@ -509,6 +572,7 @@ void UrlNavigator::updateContent() if (!m_protocols) { deleteButtons(); m_protocols = new ProtocolCombo(protocol, this); + appendWidget(m_protocols); connect(m_protocols, SIGNAL(activated(const QString&)), this, SLOT(slotProtocolChanged(const QString&))); } @@ -521,12 +585,14 @@ void UrlNavigator::updateContent() QString hostText = url().host(); if (!url().user().isEmpty()) { - hostText = url().user() + "@" + hostText; + hostText = url().user() + '@' + hostText; } if (!m_host) { m_protocolSeparator = new QLabel("://", this); + appendWidget(m_protocolSeparator); m_host = new QLineEdit(hostText, this); + appendWidget(m_host); connect(m_host, SIGNAL(lostFocus()), this, SLOT(slotRemoteHostActivated())); @@ -592,6 +658,7 @@ void UrlNavigator::updateButtons(const QString& path, int startIndex) UrlNavigatorButton* button = 0; if (createButton) { button = new UrlNavigatorButton(idx, this); + appendWidget(button); } else { button = *it; @@ -636,4 +703,9 @@ void UrlNavigator::deleteButtons() m_navButtons.erase(itBegin, itEnd); } +void UrlNavigator::appendWidget(QWidget* widget) +{ + m_layout->insertWidget(m_layout->count() - 1, widget); +} + #include "urlnavigator.moc"