#include "bookmarkselector.h"
#include "dolphinsettings.h"
-#include "generalsettings.h"
+#include "dolphin_generalsettings.h"
#include "protocolcombo.h"
#include "urlnavigatorbutton.h"
#include <assert.h>
#include <kfileitem.h>
+#include <kicon.h>
#include <klocale.h>
#include <kprotocolinfo.h>
#include <kurlcombobox.h>
#include <kurlcompletion.h>
+#include <QApplication>
+#include <QClipboard>
#include <QDir>
-#include <QCheckBox>
+#include <QHBoxLayout>
#include <QLabel>
#include <QLineEdit>
+#include <QMouseEvent>
+#include <QToolButton>
UrlNavigator::HistoryElem::HistoryElem() :
m_url(),
{
}
-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);
//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();
}
const KUrl& UrlNavigator::url() const
{
assert(!m_history.empty());
- QLinkedList<HistoryElem>::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::HistoryElem>& UrlNavigator::history(int& index) const
+int UrlNavigator::historySize() const
{
- index = m_historyIndex;
- return m_history;
+ return m_history.count();
}
void UrlNavigator::goBack()
{
if (isUrlEditable() != editable) {
m_toggleButton->toggle();
- slotClicked();
+ switchView();
}
}
}
}
+void UrlNavigator::setShowHiddenFiles( bool show )
+{
+ m_showHiddenFiles = show;
+}
+
void UrlNavigator::dropUrls(const KUrl::List& urls,
const KUrl& 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
// 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<HistoryElem>::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<HistoryElem>::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();
// 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;
}
void UrlNavigator::requestActivation()
{
- kDebug() << "--------------------------- request activation" << endl;
setActive(true);
}
void UrlNavigator::storeContentsPosition(int x, int y)
{
- QLinkedList<HistoryElem>::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
KUrl typedUrl(text);
if (typedUrl.hasPass()) {
- typedUrl.setPass(QString::null);
+ typedUrl.setPass(QString());
}
QStringList urls = m_pathBox->urls();
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()));
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()
assert(m_historyIndex >= 0);
const KFileItem* item = 0; // TODO: m_dolphinView->currentFileItem();
if (item != 0) {
- QLinkedList<HistoryElem>::iterator it = m_history.begin() + m_historyIndex;
- (*it).setCurrentFileName(item->name());
+ HistoryElem& hist = m_history[m_historyIndex];
+ hist.setCurrentFileName(item->name());
}
}
delete m_protocolSeparator; m_protocolSeparator = 0;
delete m_host; m_host = 0;
deleteButtons();
+ m_filler->hide();
m_toggleButton->setToolTip(i18n("Browse (%1, Escape)", shortcut));
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()) {
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&)));
}
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()));
UrlNavigatorButton* button = 0;
if (createButton) {
button = new UrlNavigatorButton(idx, this);
+ appendWidget(button);
}
else {
button = *it;
m_navButtons.erase(itBegin, itEnd);
}
+void UrlNavigator::appendWidget(QWidget* widget)
+{
+ m_layout->insertWidget(m_layout->count() - 1, widget);
+}
+
#include "urlnavigator.moc"