#include "dolphinsettingsdialog.h"
#include "dolphinstatusbar.h"
#include "dolphinviewcontainer.h"
-#include "fileitemcapabilities.h"
#include "infosidebarpage.h"
#include "metadatawidget.h"
#include "mainwindowadaptor.h"
#include "treeviewsidebarpage.h"
-#include "viewpropertiesdialog.h"
#include "viewproperties.h"
#ifndef Q_OS_WIN
#include <kmenu.h>
#include <kmenubar.h>
#include <kmessagebox.h>
-#include <kurlnavigator.h>
+#include <konq_fileitemcapabilities.h>
#include <konqmimedata.h>
-#include <kpropertiesdialog.h>
#include <kprotocolinfo.h>
-#include <ktoggleaction.h>
#include <krun.h>
#include <kshell.h>
#include <kstandarddirs.h>
#include <kstatusbar.h>
#include <kstandardaction.h>
#include <ktabbar.h>
+#include <ktoggleaction.h>
+#include <kurlnavigator.h>
#include <kurl.h>
#include <kurlcombobox.h>
+#include <QDBusMessage>
#include <QKeyEvent>
#include <QClipboard>
#include <QLineEdit>
new MainWindowAdaptor(this);
QDBusConnection::sessionBus().registerObject(QString("/dolphin/MainWindow%1").arg(m_id), this);
- KonqFileUndoManager* undoManager = KonqFileUndoManager::self();
+ KIO::FileUndoManager* undoManager = KIO::FileUndoManager::self();
undoManager->setUiInterface(new UndoUiInterface());
connect(undoManager, SIGNAL(undoAvailable(bool)),
m_viewTab[m_tabIndex].secondaryView = container;
}
-void DolphinMainWindow::slotDoingOperation(KonqFileUndoManager::CommandType commandType)
+void DolphinMainWindow::slotDoingOperation(KIO::FileUndoManager::CommandType commandType)
{
clearStatusBar();
m_undoCommandTypes.append(commandType);
const KUrl& destination)
{
DolphinDropController dropController(this);
- connect(&dropController, SIGNAL(doingOperation(KonqFileUndoManager::CommandType)),
- this, SLOT(slotDoingOperation(KonqFileUndoManager::CommandType)));
+ connect(&dropController, SIGNAL(doingOperation(KIO::FileUndoManager::CommandType)),
+ this, SLOT(slotDoingOperation(KIO::FileUndoManager::CommandType)));
dropController.dropUrls(urls, destination);
}
updateEditActions();
Q_ASSERT(m_viewTab[m_tabIndex].primaryView != 0);
- int selectedUrlsCount = m_viewTab[m_tabIndex].primaryView->view()->selectedUrls().count();
+ int selectedUrlsCount = m_viewTab[m_tabIndex].primaryView->view()->selectedItemsCount();
if (m_viewTab[m_tabIndex].secondaryView != 0) {
- selectedUrlsCount += m_viewTab[m_tabIndex].secondaryView->view()->selectedUrls().count();
+ selectedUrlsCount += m_viewTab[m_tabIndex].secondaryView->view()->selectedItemsCount();
}
QAction* compareFilesAction = actionCollection()->action("compare_files");
if (selectedUrlsCount == 2) {
- const bool kompareInstalled = !KGlobal::dirs()->findExe("kompare").isEmpty();
- compareFilesAction->setEnabled(selectedUrlsCount == 2 && kompareInstalled);
+ compareFilesAction->setEnabled(isKompareInstalled());
} else {
compareFilesAction->setEnabled(false);
}
+ const bool activeViewHasSelection = (activeViewContainer()->view()->selectedItemsCount() > 0);
+ actionCollection()->action("quick_view")->setEnabled(activeViewHasSelection);
+
m_activeViewContainer->updateStatusBar();
emit selectionChanged(selection);
m_newMenu->setPopupFiles(activeViewContainer()->url());
}
-void DolphinMainWindow::properties()
-{
- const KFileItemList list = m_activeViewContainer->view()->selectedItems();
-
- KPropertiesDialog *dialog = new KPropertiesDialog(list, this);
- dialog->setAttribute(Qt::WA_DeleteOnClose);
- dialog->show();
- dialog->raise();
- dialog->activateWindow();
-}
-
void DolphinMainWindow::quit()
{
close();
}
if (available && (m_undoCommandTypes.count() > 0)) {
- const KonqFileUndoManager::CommandType command = m_undoCommandTypes.takeFirst();
+ const KIO::FileUndoManager::CommandType command = m_undoCommandTypes.takeFirst();
DolphinStatusBar* statusBar = m_activeViewContainer->statusBar();
switch (command) {
- case KonqFileUndoManager::COPY:
+ case KIO::FileUndoManager::Copy:
statusBar->setMessage(i18nc("@info:status", "Copy operation completed."),
DolphinStatusBar::OperationCompleted);
break;
- case KonqFileUndoManager::MOVE:
+ case KIO::FileUndoManager::Move:
statusBar->setMessage(i18nc("@info:status", "Move operation completed."),
DolphinStatusBar::OperationCompleted);
break;
- case KonqFileUndoManager::LINK:
+ case KIO::FileUndoManager::Link:
statusBar->setMessage(i18nc("@info:status", "Link operation completed."),
DolphinStatusBar::OperationCompleted);
break;
- case KonqFileUndoManager::TRASH:
+ case KIO::FileUndoManager::Trash:
statusBar->setMessage(i18nc("@info:status", "Move to trash operation completed."),
DolphinStatusBar::OperationCompleted);
break;
- case KonqFileUndoManager::RENAME:
+ case KIO::FileUndoManager::Rename:
statusBar->setMessage(i18nc("@info:status", "Renaming operation completed."),
DolphinStatusBar::OperationCompleted);
break;
- case KonqFileUndoManager::MKDIR:
+ case KIO::FileUndoManager::Mkdir:
statusBar->setMessage(i18nc("@info:status", "Created folder."),
DolphinStatusBar::OperationCompleted);
break;
void DolphinMainWindow::undo()
{
clearStatusBar();
- KonqFileUndoManager::self()->uiInterface()->setParentWidget(this);
- KonqFileUndoManager::self()->undo();
+ KIO::FileUndoManager::self()->uiInterface()->setParentWidget(this);
+ KIO::FileUndoManager::self()->undo();
}
void DolphinMainWindow::cut()
m_viewTab[m_tabIndex].secondaryView->view()->reload();
m_viewTab[m_tabIndex].secondaryView->setActive(false);
m_viewTab[m_tabIndex].secondaryView->show();
- } else if (m_activeViewContainer == m_viewTab[m_tabIndex].primaryView) {
+
+ setActiveViewContainer(m_viewTab[m_tabIndex].secondaryView);
+ } else if (m_activeViewContainer == m_viewTab[m_tabIndex].secondaryView) {
// remove secondary view
m_viewTab[m_tabIndex].secondaryView->close();
m_viewTab[m_tabIndex].secondaryView->deleteLater();
m_viewTab[m_tabIndex].secondaryView = 0;
+
+ setActiveViewContainer(m_viewTab[m_tabIndex].primaryView);
} else {
- // The secondary view is active, hence from a users point of view
+ // The primary view is active and should be closed. Hence from a users point of view
// the content of the secondary view should be moved to the primary view.
// From an implementation point of view it is more efficient to close
// the primary view and exchange the internal pointers afterwards.
m_viewTab[m_tabIndex].primaryView->deleteLater();
m_viewTab[m_tabIndex].primaryView = m_viewTab[m_tabIndex].secondaryView;
m_viewTab[m_tabIndex].secondaryView = 0;
+
+ setActiveViewContainer(m_viewTab[m_tabIndex].primaryView);
}
- setActiveViewContainer(m_viewTab[m_tabIndex].primaryView);
updateViewActions();
}
lineEdit->setSelection(0, text.length());
}
-void DolphinMainWindow::adjustViewProperties()
-{
- clearStatusBar();
- ViewPropertiesDialog dlg(m_activeViewContainer->view());
- dlg.exec();
-}
-
void DolphinMainWindow::goBack()
{
clearStatusBar();
m_activeViewContainer->urlNavigator()->goHome();
}
-void DolphinMainWindow::findFile()
-{
- KRun::run("kfind", m_activeViewContainer->url(), this);
-}
-
void DolphinMainWindow::compareFiles()
{
// The method is only invoked if exactly 2 files have
KRun::runCommand(command, "Kompare", "kompare", this);
}
+void DolphinMainWindow::quickView()
+{
+ const KUrl::List urls = activeViewContainer()->view()->selectedUrls();
+ Q_ASSERT(urls.count() > 0);
+
+ QDBusMessage msg = QDBusMessage::createMethodCall("org.kde.plasma", "/Previewer", "", "openFile");
+ foreach (const KUrl& url, urls) {
+ msg.setArguments(QList<QVariant>() << url.prettyUrl());
+ QDBusConnection::sessionBus().send(msg);
+ }
+}
+
void DolphinMainWindow::toggleShowMenuBar()
{
const bool visible = menuBar()->isVisible();
if (index == m_tabIndex) {
// The tab that should be closed is the active tab. Activate the
// previous tab before closing the tab.
- setActiveTab((index > 0) ? index - 1 : 1);
+ m_tabBar->setCurrentIndex((index > 0) ? index - 1 : 1);
}
// delete tab
QAction* newTabAction = menu.addAction(KIcon("tab-new"), i18nc("@action:inmenu", "New Tab"));
newTabAction->setShortcut(actionCollection()->action("new_tab")->shortcut());
- QAction* closeOtherTabsAction = menu.addAction(KIcon("tab-close"), i18nc("@action:inmenu", "Close Other Tabs"));
+ 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"));
closeTabAction->setShortcut(actionCollection()->action("close_tab")->shortcut());
}
}
+void DolphinMainWindow::handlePlacesClick(const KUrl& url, Qt::MouseButtons buttons)
+{
+ if (buttons & Qt::MidButton) {
+ openNewTab(url);
+ m_tabBar->setCurrentIndex(m_viewTab.count() - 1);
+ } else {
+ changeUrl(url);
+ }
+}
+
void DolphinMainWindow::init()
{
DolphinSettings& settings = DolphinSettings::instance();
this, SLOT(closeTab(int)));
connect(m_tabBar, SIGNAL(contextMenu(int, const QPoint&)),
this, SLOT(openTabContextMenu(int, const QPoint&)));
+ connect(m_tabBar, SIGNAL(newTabRequest()),
+ this, SLOT(openNewTab()));
m_tabBar->blockSignals(true); // signals get unblocked after at least 2 tabs are open
QWidget* centralWidget = new QWidget(this);
KAction* newTab = actionCollection()->addAction("new_tab");
newTab->setIcon(KIcon("tab-new"));
newTab->setText(i18nc("@action:inmenu File", "New Tab"));
- newTab->setShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_N);
+ newTab->setShortcut(KShortcut(Qt::CTRL | Qt::SHIFT | Qt::Key_N, Qt::CTRL | Qt::Key_T));
connect(newTab, SIGNAL(triggered()), this, SLOT(openNewTab()));
QAction* closeTab = new QAction(KIcon("tab-close"), i18nc("@action:inmenu File", "Close Tab"), this);
connect(closeTab, SIGNAL(triggered()), this, SLOT(closeTab()));
actionCollection()->addAction("close_tab", closeTab);
- KAction* properties = actionCollection()->addAction("properties");
- properties->setText(i18nc("@action:inmenu File", "Properties"));
- properties->setShortcut(Qt::ALT | Qt::Key_Return);
- connect(properties, SIGNAL(triggered()), this, SLOT(properties()));
-
KStandardAction::quit(this, SLOT(quit()), actionCollection());
// setup 'Edit' menu
editLocation->setShortcut(Qt::Key_F6);
connect(editLocation, SIGNAL(triggered()), this, SLOT(editLocation()));
- KAction* adjustViewProps = actionCollection()->addAction("view_properties");
- adjustViewProps->setText(i18nc("@action:inmenu View", "Adjust View Properties..."));
- connect(adjustViewProps, SIGNAL(triggered()), this, SLOT(adjustViewProperties()));
-
// setup 'Go' menu
KAction* backAction = KStandardAction::back(this, SLOT(goBack()), actionCollection());
KShortcut backShortcut = backAction->shortcut();
KStandardAction::home(this, SLOT(goHome()), actionCollection());
// setup 'Tools' menu
- QAction* findFile = actionCollection()->addAction("find_file");
- findFile->setText(i18nc("@action:inmenu Tools", "Find File..."));
- findFile->setShortcut(Qt::CTRL | Qt::Key_F);
- findFile->setIcon(KIcon("edit-find"));
- connect(findFile, SIGNAL(triggered()), this, SLOT(findFile()));
-
KToggleAction* showFilterBar = actionCollection()->add<KToggleAction>("show_filter_bar");
showFilterBar->setText(i18nc("@action:inmenu Tools", "Show Filter Bar"));
showFilterBar->setShortcut(Qt::CTRL | Qt::Key_I);
compareFiles->setEnabled(false);
connect(compareFiles, SIGNAL(triggered()), this, SLOT(compareFiles()));
+ KAction* quickView = actionCollection()->addAction("quick_view");
+ quickView->setText(i18nc("@action:inmenu Tools", "Quick View"));
+ quickView->setIcon(KIcon("view-preview"));
+ quickView->setShortcut(Qt::Key_Space);
+ quickView->setEnabled(false);
+ connect(quickView, SIGNAL(triggered()), this, SLOT(quickView()));
+
// setup 'Settings' menu
m_showMenuBar = KStandardAction::showMenubar(this, SLOT(toggleShowMenuBar()), actionCollection());
KStandardAction::preferences(this, SLOT(editSettings()), actionCollection());
addDockWidget(Qt::LeftDockWidgetArea, treeViewDock);
connect(this, SIGNAL(urlChanged(KUrl)),
treeWidget, SLOT(setUrl(KUrl)));
- connect(treeWidget, SIGNAL(changeUrl(KUrl)),
- this, SLOT(changeUrl(KUrl)));
+ connect(treeWidget, SIGNAL(changeUrl(KUrl, Qt::MouseButtons)),
+ this, SLOT(handlePlacesClick(KUrl, Qt::MouseButtons)));
connect(treeWidget, SIGNAL(changeSelection(KFileItemList)),
this, SLOT(changeSelection(KFileItemList)));
connect(treeWidget, SIGNAL(urlsDropped(KUrl::List, KUrl)),
actionCollection()->addAction("show_places_panel", placesDock->toggleViewAction());
addDockWidget(Qt::LeftDockWidgetArea, placesDock);
- connect(placesView, SIGNAL(urlChanged(KUrl)),
- this, SLOT(changeUrl(KUrl)));
+ connect(placesView, SIGNAL(urlChanged(KUrl, Qt::MouseButtons)),
+ this, SLOT(handlePlacesClick(KUrl, Qt::MouseButtons)));
connect(this, SIGNAL(urlChanged(KUrl)),
placesView, SLOT(setUrl(KUrl)));
}
} else {
stateChanged("has_selection");
- FileItemCapabilities capabilities(list);
- actionCollection()->action("rename")->setEnabled(capabilities.supportsMoving());
+ KActionCollection* col = actionCollection();
+ QAction* renameAction = col->action("rename");
+ QAction* moveToTrashAction = col->action("move_to_trash");
+ QAction* deleteAction = col->action("delete");
+ QAction* cutAction = col->action(KStandardAction::name(KStandardAction::Cut));
+ QAction* deleteWithTrashShortcut = col->action("delete_shortcut"); // see DolphinViewActionHandler
+
+ KonqFileItemCapabilities capabilities(list);
const bool enableMoveToTrash = capabilities.isLocal() && capabilities.supportsMoving();
- actionCollection()->action("move_to_trash")->setEnabled(enableMoveToTrash);
- actionCollection()->action("delete")->setEnabled(capabilities.supportsDeleting());
+
+ renameAction->setEnabled(capabilities.supportsMoving());
+ moveToTrashAction->setEnabled(enableMoveToTrash);
+ deleteAction->setEnabled(capabilities.supportsDeleting());
+ deleteWithTrashShortcut->setEnabled(capabilities.supportsDeleting() && !enableMoveToTrash);
+ cutAction->setEnabled(capabilities.supportsMoving());
}
updatePasteAction();
}
this, SLOT(slotRequestItemInfo(KFileItem)));
connect(view, SIGNAL(activated()),
this, SLOT(toggleActiveView()));
- connect(view, SIGNAL(doingOperation(KonqFileUndoManager::CommandType)),
- this, SLOT(slotDoingOperation(KonqFileUndoManager::CommandType)));
+ connect(view, SIGNAL(doingOperation(KIO::FileUndoManager::CommandType)),
+ this, SLOT(slotDoingOperation(KIO::FileUndoManager::CommandType)));
connect(view, SIGNAL(tabRequested(const KUrl&)),
this, SLOT(openNewTab(const KUrl&)));
{
QAction* splitAction = actionCollection()->action("split_view");
if (m_viewTab[m_tabIndex].secondaryView != 0) {
- if (m_activeViewContainer == m_viewTab[m_tabIndex].primaryView) {
+ if (m_activeViewContainer == m_viewTab[m_tabIndex].secondaryView) {
splitAction->setText(i18nc("@action:intoolbar Close right view", "Close"));
splitAction->setIcon(KIcon("view-right-close"));
} else {
QString DolphinMainWindow::tabName(const KUrl& url) const
{
- return url.equals(KUrl("file:///")) ? "/" : url.fileName();
+ QString name;
+ if (url.equals(KUrl("file:///"))) {
+ name = "/";
+ } else {
+ name = url.fileName();
+ if (name.isEmpty()) {
+ name = url.protocol();
+ }
+ }
+ return name;
+}
+
+bool DolphinMainWindow::isKompareInstalled() const
+{
+ static bool initialized = false;
+ static bool installed = false;
+ if (!initialized) {
+ // TODO: maybe replace this approach later by using a menu
+ // plugin like kdiff3plugin.cpp
+ installed = !KGlobal::dirs()->findExe("kompare").isEmpty();
+ initialized = true;
+ }
+ return installed;
}
DolphinMainWindow::UndoUiInterface::UndoUiInterface() :
- KonqFileUndoManager::UiInterface()
+ KIO::FileUndoManager::UiInterface()
{
}
DolphinStatusBar* statusBar = mainWin->activeViewContainer()->statusBar();
statusBar->setMessage(job->errorString(), DolphinStatusBar::Error);
} else {
- KonqFileUndoManager::UiInterface::jobError(job);
+ KIO::FileUndoManager::UiInterface::jobError(job);
}
}