X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/a567da792ac6a337e9ffeb9468215ef4f2c326ce..7eeb8dba6aeba09aa3dfa7fa5f0b00840d4d8317:/src/dolphinmainwindow.cpp diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 742f7bbf1..da4cab597 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -29,6 +29,7 @@ #endif #include "dolphinapplication.h" +#include "dolphincontextmenu.h" #include "dolphinnewmenu.h" #include "search/dolphinsearchbox.h" #include "settings/dolphinsettings.h" @@ -120,7 +121,8 @@ DolphinMainWindow::DolphinMainWindow(int id) : m_actionHandler(0), m_remoteEncoding(0), m_settingsDialog(0), - m_captionStatJob(0) + m_captionStatJob(0), + m_lastHandleUrlStatJob(0) { setObjectName("Dolphin#"); @@ -415,7 +417,7 @@ void DolphinMainWindow::openNewTab(const KUrl& url) ViewTab viewTab; viewTab.splitter = new QSplitter(this); viewTab.splitter->setChildrenCollapsible(false); - viewTab.primaryView = new DolphinViewContainer(this, viewTab.splitter, url); + viewTab.primaryView = new DolphinViewContainer(url, viewTab.splitter); viewTab.primaryView->setActive(false); connectViewSignals(viewTab.primaryView); viewTab.primaryView->view()->reload(); @@ -553,7 +555,7 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event) break; case KDialog::No: // Close only the current tab - closeTab(); + closeTab(); default: event->ignore(); return; @@ -576,12 +578,14 @@ void DolphinMainWindow::saveProperties(KConfigGroup& group) for (int i = 0; i < tabCount; ++i) { const DolphinViewContainer* cont = m_viewTab[i].primaryView; group.writeEntry(tabProperty("Primary URL", i), cont->url().url()); - group.writeEntry(tabProperty("Primary Editable", i), cont->isUrlEditable()); + group.writeEntry(tabProperty("Primary Editable", i), + cont->urlNavigator()->isUrlEditable()); cont = m_viewTab[i].secondaryView; if (cont != 0) { group.writeEntry(tabProperty("Secondary URL", i), cont->url().url()); - group.writeEntry(tabProperty("Secondary Editable", i), cont->isUrlEditable()); + group.writeEntry(tabProperty("Secondary Editable", i), + cont->urlNavigator()->isUrlEditable()); } } } @@ -629,7 +633,7 @@ void DolphinMainWindow::readProperties(const KConfigGroup& group) void DolphinMainWindow::updateNewMenu() { m_newMenu->setViewShowsHiddenFiles(activeViewContainer()->view()->showHiddenFiles()); - m_newMenu->slotCheckUpToDate(); + m_newMenu->checkUpToDate(); m_newMenu->setPopupFiles(activeViewContainer()->url()); } @@ -840,7 +844,8 @@ void DolphinMainWindow::goBack(Qt::MouseButtons buttons) // The default case (left button pressed) is handled in goBack(). if (buttons == Qt::MidButton) { KUrlNavigator* urlNavigator = activeViewContainer()->urlNavigator(); - openNewTab(urlNavigator->historyUrl(urlNavigator->historyIndex() + 1)); + const int index = urlNavigator->historyIndex() + 1; + openNewTab(urlNavigator->locationUrl(index)); } } @@ -849,7 +854,8 @@ void DolphinMainWindow::goForward(Qt::MouseButtons buttons) // The default case (left button pressed) is handled in goForward(). if (buttons == Qt::MidButton) { KUrlNavigator* urlNavigator = activeViewContainer()->urlNavigator(); - openNewTab(urlNavigator->historyUrl(urlNavigator->historyIndex() - 1)); + const int index = urlNavigator->historyIndex() - 1; + openNewTab(urlNavigator->locationUrl(index)); } } @@ -1043,6 +1049,8 @@ void DolphinMainWindow::openTabContextMenu(int index, const QPoint& pos) QAction* newTabAction = menu.addAction(KIcon("tab-new"), i18nc("@action:inmenu", "New Tab")); newTabAction->setShortcut(actionCollection()->action("new_tab")->shortcut()); + QAction* detachTabAction = menu.addAction(KIcon("tab-detach"), i18nc("@action:inmenu", "Detach Tab")); + QAction* closeOtherTabsAction = menu.addAction(KIcon("tab-close-other"), i18nc("@action:inmenu", "Close Other Tabs")); QAction* closeTabAction = menu.addAction(KIcon("tab-close"), i18nc("@action:inmenu", "Close Tab")); @@ -1055,6 +1063,25 @@ void DolphinMainWindow::openTabContextMenu(int index, const QPoint& pos) tab.secondaryView->url() : tab.primaryView->url(); openNewTab(url); m_tabBar->setCurrentIndex(m_viewTab.count() - 1); + } else if (selectedAction == detachTabAction) { + const ViewTab& tab = m_viewTab[index]; + Q_ASSERT(tab.primaryView != 0); + const KUrl primaryUrl = tab.primaryView->url(); + DolphinMainWindow* window = DolphinApplication::app()->createMainWindow(); + window->changeUrl(primaryUrl); + + if (tab.secondaryView != 0) { + const KUrl secondaryUrl = tab.secondaryView->url(); + window->toggleSplitView(); + window->m_viewTab[0].secondaryView->setUrl(secondaryUrl); + if (tab.primaryView->isActive()) { + window->m_viewTab[0].primaryView->setActive(true); + } else { + window->m_viewTab[0].secondaryView->setActive(true); + } + } + window->show(); + closeTab(index); } else if (selectedAction == closeOtherTabsAction) { const int count = m_tabBar->count(); for (int i = 0; i < index; ++i) { @@ -1068,6 +1095,12 @@ void DolphinMainWindow::openTabContextMenu(int index, const QPoint& pos) } } +void DolphinMainWindow::slotTabMoved(int from, int to) +{ + m_viewTab.move(from, to); + m_tabIndex = m_tabBar->currentIndex(); +} + void DolphinMainWindow::handlePlacesClick(const KUrl& url, Qt::MouseButtons buttons) { if (buttons & Qt::MidButton) { @@ -1091,12 +1124,6 @@ void DolphinMainWindow::searchItems() #endif } -void DolphinMainWindow::slotTabMoved(int from, int to) -{ - m_viewTab.move(from, to); - m_tabIndex = m_tabBar->currentIndex(); -} - void DolphinMainWindow::showSearchOptions() { #ifdef HAVE_NEPOMUK @@ -1104,6 +1131,68 @@ void DolphinMainWindow::showSearchOptions() #endif } +void DolphinMainWindow::handleUrl(const KUrl& url) +{ + delete m_lastHandleUrlStatJob; + m_lastHandleUrlStatJob = 0; + + if (url.isLocalFile() && QFileInfo(url.toLocalFile()).isDir()) { + activeViewContainer()->setUrl(url); + } else if (KProtocolManager::supportsListing(url)) { + // stat the URL to see if it is a dir or not + m_lastHandleUrlStatJob = KIO::stat(url, KIO::HideProgressInfo); + connect(m_lastHandleUrlStatJob, SIGNAL(result(KJob*)), + this, SLOT(slotHandleUrlStatFinished(KJob*))); + + } else { + new KRun(url, this); + } +} + +void DolphinMainWindow::slotHandleUrlStatFinished(KJob* job) +{ + m_lastHandleUrlStatJob = 0; + const KIO::UDSEntry entry = static_cast(job)->statResult(); + const KUrl url = static_cast(job)->url(); + if ( entry.isDir() ) { + activeViewContainer()->setUrl(url); + } else { + new KRun(url, this); + } +} + +void DolphinMainWindow::tabDropEvent(int tab, QDropEvent* event) +{ + const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData()); + if (!urls.isEmpty() && tab != -1) { + const ViewTab& viewTab = m_viewTab[tab]; + const KUrl destPath = viewTab.isPrimaryViewActive ? viewTab.primaryView->url() : viewTab.secondaryView->url(); + DragAndDropHelper::instance().dropUrls(KFileItem(), destPath, event, m_tabBar); + } +} + +void DolphinMainWindow::slotCaptionStatFinished(KJob* job) +{ + m_captionStatJob = 0; + const KIO::UDSEntry entry = static_cast(job)->statResult(); + const QString name = entry.stringValue(KIO::UDSEntry::UDS_DISPLAY_NAME); + setCaption(name); +} + +void DolphinMainWindow::slotWriteStateChanged(bool isFolderWritable) +{ + newMenu()->setEnabled(isFolderWritable); +} + +void DolphinMainWindow::openContextMenu(const KFileItem& item, + const KUrl& url, + const QList& customActions) +{ + DolphinContextMenu contextMenu(this, item, url); + contextMenu.setCustomActions(customActions); + contextMenu.open(); +} + void DolphinMainWindow::init() { DolphinSettings& settings = DolphinSettings::instance(); @@ -1129,9 +1218,8 @@ void DolphinMainWindow::init() connect(m_actionHandler, SIGNAL(actionBeingHandled()), SLOT(clearStatusBar())); connect(m_actionHandler, SIGNAL(createDirectory()), SLOT(createDirectory())); ViewProperties props(homeUrl); - m_viewTab[m_tabIndex].primaryView = new DolphinViewContainer(this, - m_viewTab[m_tabIndex].splitter, - homeUrl); + m_viewTab[m_tabIndex].primaryView = new DolphinViewContainer(homeUrl, + m_viewTab[m_tabIndex].splitter); m_activeViewContainer = m_viewTab[m_tabIndex].primaryView; connectViewSignals(m_activeViewContainer); @@ -1166,11 +1254,13 @@ void DolphinMainWindow::init() connect(m_tabBar, SIGNAL(testCanDecode(const QDragMoveEvent*, bool&)), this, SLOT(slotTestCanDecode(const QDragMoveEvent*, bool&))); connect(m_tabBar, SIGNAL(wheelDelta(int)), - this, SLOT(slotWheelMoved(int))); + this, SLOT(slotWheelMoved(int))); connect(m_tabBar, SIGNAL(mouseMiddleClick(int)), this, SLOT(closeTab(int))); connect(m_tabBar, SIGNAL(tabMoved(int, int)), this, SLOT(slotTabMoved(int, int))); + connect(m_tabBar, SIGNAL(receivedDropEvent(int, QDropEvent*)), + this, SLOT(tabDropEvent(int, QDropEvent*))); m_tabBar->blockSignals(true); // signals get unblocked after at least 2 tabs are open @@ -1633,6 +1723,8 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container) { connect(container, SIGNAL(showFilterBarChanged(bool)), this, SLOT(updateFilterBarAction(bool))); + connect(container, SIGNAL(writeStateChanged(bool)), + this, SLOT(slotWriteStateChanged(bool))); DolphinView* view = container->view(); connect(view, SIGNAL(selectionChanged(KFileItemList)), @@ -1643,6 +1735,8 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container) this, SLOT(toggleActiveView())); connect(view, SIGNAL(tabRequested(const KUrl&)), this, SLOT(openNewTab(const KUrl&))); + connect(view, SIGNAL(requestContextMenu(KFileItem, const KUrl&, const QList&)), + this, SLOT(openContextMenu(KFileItem, const KUrl&, const QList&))); const KUrlNavigator* navigator = container->urlNavigator(); connect(navigator, SIGNAL(urlChanged(const KUrl&)), @@ -1651,6 +1745,8 @@ void DolphinMainWindow::connectViewSignals(DolphinViewContainer* container) this, SLOT(updateHistory())); connect(navigator, SIGNAL(editableStateChanged(bool)), this, SLOT(slotEditableStateChanged(bool))); + connect(navigator, SIGNAL(tabRequested(const KUrl&)), + this, SLOT(openNewTab(KUrl))); } void DolphinMainWindow::updateSplitAction() @@ -1710,7 +1806,7 @@ void DolphinMainWindow::createSecondaryView(int tabIndex) const int newWidth = (m_viewTab[tabIndex].primaryView->width() - splitter->handleWidth()) / 2; const DolphinView* view = m_viewTab[tabIndex].primaryView->view(); - m_viewTab[tabIndex].secondaryView = new DolphinViewContainer(this, 0, view->rootUrl()); + m_viewTab[tabIndex].secondaryView = new DolphinViewContainer(view->rootUrl(), 0); splitter->addWidget(m_viewTab[tabIndex].secondaryView); splitter->setSizes(QList() << newWidth << newWidth); connectViewSignals(m_viewTab[tabIndex].secondaryView); @@ -1729,45 +1825,25 @@ void DolphinMainWindow::setUrlAsCaption(const KUrl& url) delete m_captionStatJob; m_captionStatJob = 0; - QString caption; - if (url.equals(KUrl("file:///"))) { - caption = '/'; - } else { - caption = url.fileName(); - if (caption.isEmpty()) { - caption = url.protocol(); + if (url.protocol() == QLatin1String("file")) { + QString caption; + if (url.equals(KUrl("file:///"))) { + caption = '/'; + } else { + caption = url.fileName(); + if (caption.isEmpty()) { + caption = url.protocol(); + } } - } - - setCaption(caption); - if ( url.protocol() != QLatin1String( "file" ) ) { + setCaption(caption); + } else { m_captionStatJob = KIO::stat(url, KIO::HideProgressInfo); connect(m_captionStatJob, SIGNAL(result(KJob*)), this, SLOT(slotCaptionStatFinished(KJob*))); } } -void DolphinMainWindow::handleUrl(const KUrl& url) -{ - if (KProtocolManager::supportsListing(url)) { - activeViewContainer()->setUrl(url); - } - else { - new KRun(url, this); - } -} - -void DolphinMainWindow::slotCaptionStatFinished( KJob* job ) -{ - m_captionStatJob = 0; - const KIO::UDSEntry entry = static_cast(job)->statResult(); - QString name = entry.stringValue(KIO::UDSEntry::UDS_DISPLAY_NAME); - if (!name.isEmpty()) { - setCaption(name); - } -} - QString DolphinMainWindow::squeezedText(const QString& text) const { const QFontMetrics fm = fontMetrics();