* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *\r
***************************************************************************/\r
\r
+#include <config-kmetadata.h>\r
#include "dolphinmainwindow.h"\r
\r
-#include <assert.h>\r
-\r
+#include "bookmarkssidebarpage.h"\r
#include "dolphinapplication.h"\r
+#include "dolphinnewmenu.h"\r
#include "dolphinsettings.h"\r
#include "dolphinsettingsdialog.h"\r
#include "dolphinstatusbar.h"\r
-#include "dolphinapplication.h"\r
-#include "urlnavigator.h"\r
-#include "dolphinsettings.h"\r
-#include "bookmarkssidebarpage.h"\r
#include "infosidebarpage.h"\r
-#include "generalsettings.h"\r
+#include "metadatawidget.h"\r
+#include "mainwindowadaptor.h"\r
+#include "treeviewsidebarpage.h"\r
+#include "urlnavigator.h"\r
#include "viewpropertiesdialog.h"\r
#include "viewproperties.h"\r
\r
+#include "dolphin_generalsettings.h"\r
+\r
#include <kaction.h>\r
#include <kactioncollection.h>\r
#include <kbookmarkmanager.h>\r
#include <kicon.h>\r
#include <kiconloader.h>\r
#include <kio/netaccess.h>\r
+#include <kio/deletejob.h>\r
#include <kio/renamedialog.h>\r
#include <kinputdialog.h>\r
#include <klocale.h>\r
#include <kmenu.h>\r
#include <kmessagebox.h>\r
-#include <knewmenu.h>\r
#include <konqmimedata.h>\r
-#include <konq_undo.h>\r
+#include <konq_operations.h>\r
#include <kpropertiesdialog.h>\r
#include <kprotocolinfo.h>\r
#include <ktoggleaction.h>\r
#include <kstandardaction.h>\r
#include <kurl.h>\r
\r
-#include <Q3ValueList> // TODO\r
#include <QCloseEvent>\r
#include <QClipboard>\r
#include <QSplitter>\r
#include <QDockWidget>\r
\r
-DolphinMainWindow::DolphinMainWindow() :\r
+DolphinMainWindow::DolphinMainWindow(int id) :\r
KMainWindow(0),\r
m_newMenu(0),\r
m_splitter(0),\r
- m_activeView(0)\r
+ m_activeView(0),\r
+ m_id(id)\r
{\r
setObjectName("Dolphin");\r
m_view[PrimaryIdx] = 0;\r
m_view[SecondaryIdx] = 0;\r
\r
+ new MainWindowAdaptor(this);\r
+ QDBusConnection::sessionBus().registerObject(QString("/dolphin/MainWindow%1").arg(m_id), this);\r
+\r
KonqUndoManager::incRef();\r
\r
- connect(KonqUndoManager::self(), SIGNAL(undoAvailable(bool)),\r
+ KonqUndoManager* undoManager = KonqUndoManager::self();\r
+ undoManager->setUiInterface(new UndoUiInterface(this));\r
+\r
+ connect(undoManager, SIGNAL(undoAvailable(bool)),\r
this, SLOT(slotUndoAvailable(bool)));\r
- connect(KonqUndoManager::self(), SIGNAL(undoTextChanged(const QString&)),\r
+ connect(undoManager, SIGNAL(undoTextChanged(const QString&)),\r
this, SLOT(slotUndoTextChanged(const QString&)));\r
}\r
\r
\r
void DolphinMainWindow::setActiveView(DolphinView* view)\r
{\r
- assert((view == m_view[PrimaryIdx]) || (view == m_view[SecondaryIdx]));\r
+ Q_ASSERT((view == m_view[PrimaryIdx]) || (view == m_view[SecondaryIdx]));\r
if (m_activeView == view) {\r
return;\r
}\r
void DolphinMainWindow::dropUrls(const KUrl::List& urls,\r
const KUrl& destination)\r
{\r
- m_dropDestination = destination;\r
- m_droppedUrls = urls;\r
-\r
- /* KDE4-TODO\r
- const ButtonState keyboardState = KApplication::keyboardMouseState();\r
- const bool shiftPressed = (keyboardState & ShiftButton) > 0;\r
- const bool controlPressed = (keyboardState & ControlButton) > 0;\r
-\r
-\r
+ Qt::DropAction action = Qt::CopyAction;\r
\r
+ Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers();\r
+ const bool shiftPressed = modifier & Qt::ShiftModifier;\r
+ const bool controlPressed = modifier & Qt::ControlModifier;\r
if (shiftPressed && controlPressed) {\r
- // shortcut for 'Linke Here' is used\r
- selectedIndex = 2;\r
- }\r
- else if (controlPressed) {\r
- // shortcut for 'Copy Here' is used\r
- selectedIndex = 1;\r
+ // shortcut for 'Link Here' is used\r
+ action = Qt::LinkAction;\r
}\r
else if (shiftPressed) {\r
// shortcut for 'Move Here' is used\r
- selectedIndex = 0;\r
+ action = Qt::MoveAction;\r
}\r
- else*/ {\r
- // no shortcut is used, hence open a popup menu\r
+ else if (controlPressed) {\r
+ // shortcut for 'Copy Here' is used\r
+ action = Qt::CopyAction;\r
+ }\r
+ else {\r
+ // open a context menu which offers the following actions:\r
+ // - Move Here\r
+ // - Copy Here\r
+ // - Link Here\r
+ // - Cancel\r
+\r
KMenu popup(this);\r
\r
- QAction* moveAction = popup.addAction(SmallIcon("goto"), i18n("&Move Here"));\r
- connect(moveAction, SIGNAL(triggered()), this, SLOT(moveDroppedItems()));\r
+ QString seq = QKeySequence(Qt::ShiftModifier).toString();\r
+ seq.chop(1); // chop superfluous '+'\r
+ QAction* moveAction = popup.addAction(KIcon("goto-page"),\r
+ i18n("&Move Here") + '\t' + seq);\r
\r
- QAction* copyAction = popup.addAction(SmallIcon("editcopy"), i18n( "&Copy Here" ));\r
- connect(copyAction, SIGNAL(triggered()), this, SLOT(copyDroppedItems()));\r
+ seq = QKeySequence(Qt::ControlModifier).toString();\r
+ seq.chop(1);\r
+ QAction* copyAction = popup.addAction(KIcon("edit-copy"),\r
+ i18n("&Copy Here") + '\t' + seq);\r
\r
- QAction* linkAction = popup.addAction(i18n("&Link Here"));\r
- connect(linkAction, SIGNAL(triggered()), this, SLOT(linkDroppedItems()));\r
+ seq = QKeySequence(Qt::ControlModifier + Qt::ShiftModifier).toString();\r
+ seq.chop(1);\r
+ QAction* linkAction = popup.addAction(KIcon("www"),\r
+ i18n("&Link Here") + '\t' + seq);\r
\r
- QAction* cancelAction = popup.addAction(SmallIcon("stop"), i18n("Cancel"));\r
- popup.insertSeparator(cancelAction);\r
+ popup.addSeparator();\r
+ popup.addAction(KIcon("process-stop"), i18n("Cancel"));\r
\r
- popup.exec(QCursor::pos());\r
+ QAction* activatedAction = popup.exec(QCursor::pos());\r
+ if (activatedAction == moveAction) {\r
+ action = Qt::MoveAction;\r
+ }\r
+ else if (activatedAction == copyAction) {\r
+ action = Qt::CopyAction;\r
+ }\r
+ else if (activatedAction == linkAction) {\r
+ action = Qt::LinkAction;\r
+ }\r
+ else {\r
+ return;\r
+ }\r
+ }\r
+\r
+ switch (action) {\r
+ case Qt::MoveAction:\r
+ moveUrls(urls, destination);\r
+ break;\r
+\r
+ case Qt::CopyAction:\r
+ copyUrls(urls, destination);\r
+ break;\r
+\r
+ case Qt::LinkAction:\r
+ linkUrls(urls, destination);\r
+ break;\r
+\r
+ default:\r
+ break;\r
}\r
+}\r
\r
- m_droppedUrls.clear();\r
+void DolphinMainWindow::rename(const KUrl& oldUrl, const KUrl& newUrl)\r
+{\r
+ clearStatusBar();\r
+ KonqOperations::rename(this, oldUrl, newUrl);\r
+ m_undoCommandTypes.append(KonqUndoManager::RENAME);\r
}\r
\r
void DolphinMainWindow::refreshViews()\r
}\r
\r
m_activeView = isPrimaryViewActive ? m_view[PrimaryIdx] : m_view[SecondaryIdx];\r
- assert(m_activeView != 0);\r
+ Q_ASSERT(m_activeView != 0);\r
\r
updateViewActions();\r
emit activeViewChanged();\r
}\r
\r
+void DolphinMainWindow::changeUrl(const QString& url)\r
+{\r
+ if (activeView() != 0) {\r
+ activeView()->setUrl(KUrl(url));\r
+ }\r
+}\r
+\r
void DolphinMainWindow::slotViewModeChanged()\r
{\r
updateViewActions();\r
}\r
\r
+void DolphinMainWindow::slotShowPreviewChanged()\r
+{\r
+ // It is not enough to update the 'Show Preview' action, also\r
+ // the 'Zoom In' and 'Zoom Out' actions must be adapted.\r
+ updateViewActions();\r
+}\r
+\r
void DolphinMainWindow::slotShowHiddenFilesChanged()\r
{\r
KToggleAction* showHiddenFilesAction =\r
case DolphinView::SortByDate:\r
action = actionCollection()->action("by_date");\r
break;\r
+ case DolphinView::SortByPermissions:\r
+ action = actionCollection()->action("by_permissions");\r
+ break;\r
+ case DolphinView::SortByOwner:\r
+ action = actionCollection()->action("by_owner");\r
+ break;\r
+ case DolphinView::SortByGroup:\r
+ action = actionCollection()->action("by_group");\r
+ break;\r
default:\r
break;\r
}\r
descending->setChecked(sortDescending);\r
}\r
\r
+void DolphinMainWindow::slotAdditionalInfoChanged(KFileItemDelegate::AdditionalInformation info)\r
+{\r
+ QAction* action = 0;\r
+ switch (info) {\r
+ case KFileItemDelegate::FriendlyMimeType:\r
+ action = actionCollection()->action("show_mime_info");\r
+ break;\r
+ case KFileItemDelegate::Size:\r
+ action = actionCollection()->action("show_size_info");\r
+ break;\r
+ case KFileItemDelegate::ModificationTime:\r
+ action = actionCollection()->action("show_date_info");\r
+ break;\r
+ case KFileItemDelegate::NoInformation:\r
+ default:\r
+ action = actionCollection()->action("clear_info");\r
+ break;\r
+ }\r
+\r
+ if (action != 0) {\r
+ KToggleAction* toggleAction = static_cast<KToggleAction*>(action);\r
+ toggleAction->setChecked(true);\r
+\r
+ QActionGroup* group = toggleAction->actionGroup();\r
+ Q_ASSERT(group != 0);\r
+ group->setEnabled(m_activeView->mode() == DolphinView::IconsView);\r
+ }\r
+}\r
+\r
void DolphinMainWindow::slotSelectionChanged()\r
{\r
updateEditActions();\r
\r
- assert(m_view[PrimaryIdx] != 0);\r
+ Q_ASSERT(m_view[PrimaryIdx] != 0);\r
int selectedUrlsCount = m_view[PrimaryIdx]->selectedUrls().count();\r
if (m_view[SecondaryIdx] != 0) {\r
selectedUrlsCount += m_view[SecondaryIdx]->selectedUrls().count();\r
void DolphinMainWindow::slotUrlChanged(const KUrl& url)\r
{\r
updateEditActions();\r
+ updateViewActions();\r
updateGoActions();\r
setCaption(url.fileName());\r
}\r
DolphinApplication::app()->createMainWindow()->show();\r
}\r
\r
-void DolphinMainWindow::moveDroppedItems()\r
-{\r
- moveUrls(m_droppedUrls, m_dropDestination);\r
-}\r
-\r
-void DolphinMainWindow::copyDroppedItems()\r
-{\r
- copyUrls(m_droppedUrls, m_dropDestination);\r
-}\r
-\r
-void DolphinMainWindow::linkDroppedItems()\r
-{\r
- KonqOperations::copy(this, KonqOperations::LINK, m_droppedUrls, m_dropDestination);\r
- m_undoOperations.append(KonqOperations::LINK);\r
-}\r
-\r
void DolphinMainWindow::closeEvent(QCloseEvent* event)\r
{\r
DolphinSettings& settings = DolphinSettings::instance();\r
\r
// TODO: I assume there will be a generic way in KDE 4 to store the docks\r
// of the main window. In the meantime they are stored manually:\r
- QString filename = KStandardDirs::locateLocal("data", KGlobal::instance()->instanceName());\r
+ QString filename = KStandardDirs::locateLocal("data", KGlobal::mainComponent().componentName());\r
filename.append("/panels_layout");\r
QFile file(filename);\r
if (file.open(QIODevice::WriteOnly)) {\r
\r
void DolphinMainWindow::saveProperties(KConfig* config)\r
{\r
- config->setGroup("Primary view");\r
- config->writeEntry("Url", m_view[PrimaryIdx]->url().url());\r
- config->writeEntry("Editable Url", m_view[PrimaryIdx]->isUrlEditable());\r
+ KConfigGroup primaryView = config->group("Primary view");\r
+ primaryView.writeEntry("Url", m_view[PrimaryIdx]->url().url());\r
+ primaryView.writeEntry("Editable Url", m_view[PrimaryIdx]->isUrlEditable());\r
if (m_view[SecondaryIdx] != 0) {\r
- config->setGroup("Secondary view");\r
- config->writeEntry("Url", m_view[SecondaryIdx]->url().url());\r
- config->writeEntry("Editable Url", m_view[SecondaryIdx]->isUrlEditable());\r
+ KConfigGroup secondaryView = config->group("Secondary view");\r
+ secondaryView.writeEntry("Url", m_view[SecondaryIdx]->url().url());\r
+ secondaryView.writeEntry("Editable Url", m_view[SecondaryIdx]->isUrlEditable());\r
}\r
}\r
\r
void DolphinMainWindow::readProperties(KConfig* config)\r
{\r
- config->setGroup("Primary view");\r
- m_view[PrimaryIdx]->setUrl(config->readEntry("Url"));\r
- m_view[PrimaryIdx]->setUrlEditable(config->readEntry("Editable Url", false));\r
+ const KConfigGroup primaryView = config->group("Primary view");\r
+ m_view[PrimaryIdx]->setUrl(primaryView.readEntry("Url"));\r
+ m_view[PrimaryIdx]->setUrlEditable(primaryView.readEntry("Editable Url", false));\r
if (config->hasGroup("Secondary view")) {\r
- config->setGroup("Secondary view");\r
+ const KConfigGroup secondaryView = config->group("Secondary view");\r
if (m_view[SecondaryIdx] == 0) {\r
toggleSplitView();\r
}\r
- m_view[SecondaryIdx]->setUrl(config->readEntry("Url"));\r
- m_view[SecondaryIdx]->setUrlEditable(config->readEntry("Editable Url", false));\r
+ m_view[SecondaryIdx]->setUrl(secondaryView.readEntry("Url"));\r
+ m_view[SecondaryIdx]->setUrlEditable(secondaryView.readEntry("Editable Url", false));\r
}\r
else if (m_view[SecondaryIdx] != 0) {\r
toggleSplitView();\r
clearStatusBar();\r
const KUrl::List selectedUrls = m_activeView->selectedUrls();\r
KonqOperations::del(this, KonqOperations::TRASH, selectedUrls);\r
- m_undoOperations.append(KonqOperations::TRASH);\r
+ m_undoCommandTypes.append(KonqUndoManager::TRASH);\r
}\r
\r
void DolphinMainWindow::deleteItems()\r
{\r
clearStatusBar();\r
\r
+ // TODO: if KonqOperations::askDeleteConfirmation() would indicate when\r
+ // the operation has been finished, this method should be used.\r
+\r
KUrl::List list = m_activeView->selectedUrls();\r
const uint itemCount = list.count();\r
- assert(itemCount >= 1);\r
+ Q_ASSERT(itemCount >= 1);\r
\r
QString text;\r
if (itemCount > 1) {\r
- text = i18n("Do you really want to delete the %1 selected items?",itemCount);\r
+ text = i18n("Do you really want to delete the %1 selected items?", itemCount);\r
}\r
else {\r
const KUrl& url = list.first();\r
- text = i18n("Do you really want to delete '%1'?",url.fileName());\r
+ QString itemName;\r
+ if (url.protocol() == "trash" ) {\r
+ itemName = url.path();\r
+ // TODO: check comment in konq_undo.cc in the method askDeleteConfirmation()\r
+ itemName.remove(QRegExp("^/[0-9]*-"));\r
+ }\r
+ else {\r
+ itemName = url.pathOrUrl();\r
+ }\r
+ text = i18n("Do you really want to delete '%1'?", itemName);\r
}\r
\r
const bool del = KMessageBox::warningContinueCancel(this,\r
text,\r
- QString::null,\r
- KGuiItem(i18n("Delete"), KIcon("editdelete"))\r
+ QString(),\r
+ KGuiItem(i18n("Delete"), KIcon("edit-delete"))\r
) == KMessageBox::Continue;\r
if (del) {\r
KIO::Job* job = KIO::del(list);\r
void DolphinMainWindow::slotHandleJobError(KJob* job)\r
{\r
if (job->error() != 0) {\r
- m_activeView->statusBar()->setMessage(job->errorString(),\r
- DolphinStatusBar::Error);\r
+ DolphinStatusBar* statusBar = m_activeView->statusBar();\r
+ statusBar->setMessage(job->errorString(),\r
+ DolphinStatusBar::Error);\r
}\r
}\r
\r
void DolphinMainWindow::slotDeleteFileFinished(KJob* job)\r
{\r
if (job->error() == 0) {\r
- m_activeView->statusBar()->setMessage(i18n("Delete operation completed."),\r
- DolphinStatusBar::OperationCompleted);\r
-\r
- // TODO: In opposite to the 'Move to Trash' operation in the class KFileIconView\r
- // no rearranging of the item position is done when a file has been deleted.\r
- // This is bypassed by reloading the view, but it might be worth to investigate\r
- // deeper for the root of this issue.\r
- m_activeView->reload();\r
+ DolphinStatusBar* statusBar = m_activeView->statusBar();\r
+ statusBar->setMessage(i18n("Delete operation completed."),\r
+ DolphinStatusBar::OperationCompleted);\r
}\r
}\r
\r
undoAction->setEnabled(available);\r
}\r
\r
- if (available && (m_undoOperations.count() > 0)) {\r
- const KonqOperations::Operation op = m_undoOperations.takeFirst();\r
+ if (available && (m_undoCommandTypes.count() > 0)) {\r
+ const KonqUndoManager::CommandType command = m_undoCommandTypes.takeFirst();\r
DolphinStatusBar* statusBar = m_activeView->statusBar();\r
- switch (op) {\r
- case KonqOperations::COPY:\r
+ switch (command) {\r
+ case KonqUndoManager::COPY:\r
statusBar->setMessage(i18n("Copy operation completed."),\r
DolphinStatusBar::OperationCompleted);\r
break;\r
- case KonqOperations::MOVE:\r
+ case KonqUndoManager::MOVE:\r
statusBar->setMessage(i18n("Move operation completed."),\r
DolphinStatusBar::OperationCompleted);\r
break;\r
- case KonqOperations::LINK:\r
+ case KonqUndoManager::LINK:\r
statusBar->setMessage(i18n("Link operation completed."),\r
DolphinStatusBar::OperationCompleted);\r
break;\r
- case KonqOperations::TRASH:\r
+ case KonqUndoManager::TRASH:\r
statusBar->setMessage(i18n("Move to trash operation completed."),\r
DolphinStatusBar::OperationCompleted);\r
break;\r
+ case KonqUndoManager::RENAME:\r
+ statusBar->setMessage(i18n("Renaming operation completed."),\r
+ DolphinStatusBar::OperationCompleted);\r
+ break;\r
+\r
+ case KonqUndoManager::MKDIR:\r
+ statusBar->setMessage(i18n("Created directory."),\r
+ DolphinStatusBar::OperationCompleted);\r
+ break;\r
+\r
default:\r
break;\r
}\r
}\r
}\r
\r
+void DolphinMainWindow::undo()\r
+{\r
+ clearStatusBar();\r
+ KonqUndoManager::self()->undo();\r
+}\r
+\r
void DolphinMainWindow::cut()\r
{\r
+ QClipboard* clipboard = QApplication::clipboard();\r
+ const QMimeData* currentMimeData = clipboard->mimeData();\r
+ const bool hadCutSelection = KonqMimeData::decodeIsCutSelection(currentMimeData);\r
+\r
QMimeData* mimeData = new QMimeData();\r
const KUrl::List kdeUrls = m_activeView->selectedUrls();\r
const KUrl::List mostLocalUrls;\r
KonqMimeData::populateMimeData(mimeData, kdeUrls, mostLocalUrls, true);\r
QApplication::clipboard()->setMimeData(mimeData);\r
+\r
+ if (hadCutSelection) {\r
+ // If an old cut selection has been applied, the view must\r
+ // be reloaded to get the original icons of the items without an\r
+ // applied item effect.\r
+ m_view[PrimaryIdx]->reload();\r
+ if (m_view[SecondaryIdx] != 0) {\r
+ m_view[SecondaryIdx]->reload();\r
+ }\r
+ }\r
+ else {\r
+ // apply an item effect for the icons of all cut items\r
+ m_view[PrimaryIdx]->updateCutItems();\r
+ if (m_view[SecondaryIdx] != 0) {\r
+ m_view[SecondaryIdx]->updateCutItems();\r
+ }\r
+ }\r
}\r
\r
void DolphinMainWindow::copy()\r
if (!urls.isEmpty()) {\r
pasteAction->setEnabled(true);\r
\r
- const int count = urls.count();\r
- if (count == 1) {\r
- pasteAction->setText(i18n("Paste 1 File"));\r
- }\r
- else {\r
- pasteAction->setText(i18n("Paste %1 Files").arg(count));\r
- }\r
+ pasteAction->setText(i18np("Paste One File", "Paste %1 Files", urls.count()));\r
}\r
else {\r
pasteAction->setEnabled(false);\r
m_activeView->setSorting(DolphinView::SortByDate);\r
}\r
\r
+void DolphinMainWindow::sortByPermissions()\r
+{\r
+ m_activeView->setSorting(DolphinView::SortByPermissions);\r
+}\r
+\r
+void DolphinMainWindow::sortByOwner()\r
+{\r
+ m_activeView->setSorting(DolphinView::SortByOwner);\r
+}\r
+\r
+void DolphinMainWindow::sortByGroup()\r
+{\r
+ m_activeView->setSorting(DolphinView::SortByGroup);\r
+}\r
+\r
void DolphinMainWindow::toggleSortOrder()\r
{\r
const Qt::SortOrder order = (m_activeView->sortOrder() == Qt::Ascending) ?\r
m_activeView->setSortOrder(order);\r
}\r
\r
+void DolphinMainWindow::clearInfo()\r
+{\r
+ m_activeView->setAdditionalInfo(KFileItemDelegate::NoInformation);\r
+}\r
+\r
+void DolphinMainWindow::showMimeInfo()\r
+{\r
+ clearStatusBar();\r
+ m_activeView->setAdditionalInfo(KFileItemDelegate::FriendlyMimeType);\r
+}\r
+\r
+void DolphinMainWindow::showSizeInfo()\r
+{\r
+ clearStatusBar();\r
+ m_activeView->setAdditionalInfo(KFileItemDelegate::Size);\r
+}\r
+\r
+void DolphinMainWindow::showDateInfo()\r
+{\r
+ clearStatusBar();\r
+ m_activeView->setAdditionalInfo(KFileItemDelegate::ModificationTime);\r
+}\r
+\r
void DolphinMainWindow::toggleSplitView()\r
{\r
if (m_view[SecondaryIdx] == 0) {\r
setActiveView(m_view[PrimaryIdx]);\r
}\r
}\r
+ emit activeViewChanged();\r
}\r
\r
void DolphinMainWindow::reloadView()\r
\r
void DolphinMainWindow::editLocation()\r
{\r
- KToggleAction* action = static_cast<KToggleAction*>(actionCollection()->action("editable_location"));\r
- action->setChecked(true);\r
m_activeView->setUrlEditable(true);\r
}\r
\r
// - both in the secondary view\r
// - one in the primary view and the other in the secondary\r
// view\r
- assert(m_view[PrimaryIdx] != 0);\r
+ Q_ASSERT(m_view[PrimaryIdx] != 0);\r
\r
KUrl urlA;\r
KUrl urlB;\r
\r
switch (urls.count()) {\r
case 0: {\r
- assert(m_view[SecondaryIdx] != 0);\r
+ Q_ASSERT(m_view[SecondaryIdx] != 0);\r
urls = m_view[SecondaryIdx]->selectedUrls();\r
- assert(urls.count() == 2);\r
+ Q_ASSERT(urls.count() == 2);\r
urlA = urls[0];\r
urlB = urls[1];\r
break;\r
\r
case 1: {\r
urlA = urls[0];\r
- assert(m_view[SecondaryIdx] != 0);\r
+ Q_ASSERT(m_view[SecondaryIdx] != 0);\r
urls = m_view[SecondaryIdx]->selectedUrls();\r
- assert(urls.count() == 1);\r
+ Q_ASSERT(urls.count() == 1);\r
urlB = urls[0];\r
break;\r
}\r
default: {\r
// may not happen: compareFiles may only get invoked if 2\r
// files are selected\r
- assert(false);\r
+ Q_ASSERT(false);\r
}\r
}\r
\r
// a proper default window size is given at the end of DolphinMainWindow::init().\r
GeneralSettings* generalSettings = DolphinSettings::instance().generalSettings();\r
const bool firstRun = generalSettings->firstRun();\r
+ if (firstRun) {\r
+ generalSettings->setViewPropsTimestamp(QDateTime::currentDateTime());\r
+ }\r
\r
setAcceptDrops(true);\r
\r
DolphinSettings& settings = DolphinSettings::instance();\r
\r
KBookmarkManager* manager = settings.bookmarkManager();\r
- assert(manager != 0);\r
+ Q_ASSERT(manager != 0);\r
KBookmarkGroup root = manager->root();\r
if (root.first().isNull()) {\r
- root.addBookmark(manager, i18n("Home"), settings.generalSettings()->homeUrl(), "folder_home");\r
- root.addBookmark(manager, i18n("Storage Media"), KUrl("media:/"), "blockdevice");\r
- root.addBookmark(manager, i18n("Network"), KUrl("remote:/"), "network_local");\r
- root.addBookmark(manager, i18n("Root"), KUrl("/"), "folder_red");\r
- root.addBookmark(manager, i18n("Trash"), KUrl("trash:/"), "trashcan_full");\r
+ root.addBookmark(manager, i18n("Home"), settings.generalSettings()->homeUrl(), "folder-home");\r
+ root.addBookmark(manager, i18n("Storage Media"), KUrl("media:/"), "hdd-mount");\r
+ root.addBookmark(manager, i18n("Network"), KUrl("remote:/"), "network-local");\r
+ root.addBookmark(manager, i18n("Root"), KUrl("/"), "folder-red");\r
+ root.addBookmark(manager, i18n("Trash"), KUrl("trash:/"), "user-trash");\r
}\r
\r
setupActions();\r
\r
- const KUrl& homeUrl = root.first().url();\r
+ const KUrl& homeUrl = settings.generalSettings()->homeUrl();\r
setCaption(homeUrl.fileName());\r
ViewProperties props(homeUrl);\r
m_view[PrimaryIdx] = new DolphinView(this,\r
// assure a proper default size if Dolphin runs the first time\r
resize(640, 480);\r
}\r
+ #ifdef HAVE_KMETADATA\r
+ if ( !MetaDataWidget::metaDataAvailable() )\r
+ activeView()->statusBar()->setMessage(i18n("Failed to contact Nepomuk service, annotation and tagging are disabled."), DolphinStatusBar::Error);\r
+ #endif\r
}\r
\r
void DolphinMainWindow::loadSettings()\r
// TODO: I assume there will be a generic way in KDE 4 to restore the docks\r
// of the main window. In the meantime they are restored manually (see also\r
// DolphinMainWindow::closeEvent() for more details):\r
- QString filename = KStandardDirs::locateLocal("data", KGlobal::instance()->instanceName());\r
- filename.append("/panels_layout");\r
+ QString filename = KStandardDirs::locateLocal("data", KGlobal::mainComponent().componentName()); filename.append("/panels_layout");\r
QFile file(filename);\r
if (file.open(QIODevice::ReadOnly)) {\r
QByteArray data = file.readAll();\r
void DolphinMainWindow::setupActions()\r
{\r
// setup 'File' menu\r
- m_newMenu = new KNewMenu(actionCollection(), this, "create_new");\r
+ m_newMenu = new DolphinNewMenu(this);\r
KMenu* menu = m_newMenu->menu();\r
menu->setTitle(i18n("Create New..."));\r
- menu->setIcon(SmallIcon("filenew"));\r
+ menu->setIcon(SmallIcon("document-new"));\r
connect(menu, SIGNAL(aboutToShow()),\r
this, SLOT(updateNewMenu()));\r
\r
- QAction* action = actionCollection()->addAction("new_window");\r
- action->setIcon(KIcon("window_new"));\r
- action->setText(i18n("New &Window"));\r
- connect(action, SIGNAL(triggered()), this, SLOT(openNewMainWindow()));\r
+ QAction* newWindow = actionCollection()->addAction("new_window");\r
+ newWindow->setIcon(KIcon("window-new"));\r
+ newWindow->setText(i18n("New &Window"));\r
+ newWindow->setShortcut(Qt::CTRL | Qt::Key_N);\r
+ connect(newWindow, SIGNAL(triggered()), this, SLOT(openNewMainWindow()));\r
\r
QAction* rename = actionCollection()->addAction("rename");\r
rename->setText(i18n("Rename"));\r
\r
QAction* moveToTrash = actionCollection()->addAction("move_to_trash");\r
moveToTrash->setText(i18n("Move to Trash"));\r
- moveToTrash->setIcon(KIcon("edittrash"));\r
+ moveToTrash->setIcon(KIcon("edit-trash"));\r
moveToTrash->setShortcut(QKeySequence::Delete);\r
connect(moveToTrash, SIGNAL(triggered()), this, SLOT(moveToTrash()));\r
\r
QAction* deleteAction = actionCollection()->addAction("delete");\r
deleteAction->setText(i18n("Delete"));\r
- deleteAction->setShortcut(Qt::ALT | Qt::Key_Delete);\r
- deleteAction->setIcon(KIcon("editdelete"));\r
+ deleteAction->setShortcut(Qt::SHIFT | Qt::Key_Delete);\r
+ deleteAction->setIcon(KIcon("edit-delete"));\r
connect(deleteAction, SIGNAL(triggered()), this, SLOT(deleteItems()));\r
\r
QAction* properties = actionCollection()->addAction("properties");\r
- properties->setText(i18n("Propert&ies"));\r
- properties->setShortcut(Qt::Key_Alt | Qt::Key_Return);\r
+ properties->setText(i18n("Properties"));\r
+ properties->setShortcut(Qt::ALT | Qt::Key_Return);\r
connect(properties, SIGNAL(triggered()), this, SLOT(properties()));\r
\r
KStandardAction::quit(this, SLOT(quit()), actionCollection());\r
\r
// setup 'Edit' menu\r
- KStandardAction::undo(KonqUndoManager::self(),\r
+ KStandardAction::undo(this,\r
SLOT(undo()),\r
actionCollection());\r
\r
KToggleAction* iconsView = actionCollection()->add<KToggleAction>("icons");\r
iconsView->setText(i18n("Icons"));\r
iconsView->setShortcut(Qt::CTRL | Qt::Key_1);\r
- iconsView->setIcon(KIcon("view_icon"));\r
+ iconsView->setIcon(KIcon("view-icon"));\r
connect(iconsView, SIGNAL(triggered()), this, SLOT(setIconsView()));\r
\r
KToggleAction* detailsView = actionCollection()->add<KToggleAction>("details");\r
detailsView->setText(i18n("Details"));\r
detailsView->setShortcut(Qt::CTRL | Qt::Key_2);\r
- detailsView->setIcon(KIcon("view_text"));\r
+ detailsView->setIcon(KIcon("fileview-text"));\r
connect(detailsView, SIGNAL(triggered()), this, SLOT(setDetailsView()));\r
\r
QActionGroup* viewModeGroup = new QActionGroup(this);\r
sortByDate->setText(i18n("By Date"));\r
connect(sortByDate, SIGNAL(triggered()), this, SLOT(sortByDate()));\r
\r
+ KToggleAction* sortByPermissions = actionCollection()->add<KToggleAction>("by_permissions");\r
+ sortByPermissions->setText(i18n("By Permissions"));\r
+ connect(sortByPermissions, SIGNAL(triggered()), this, SLOT(sortByPermissions()));\r
+\r
+ KToggleAction* sortByOwner = actionCollection()->add<KToggleAction>("by_owner");\r
+ sortByOwner->setText(i18n("By Owner"));\r
+ connect(sortByOwner, SIGNAL(triggered()), this, SLOT(sortByOwner()));\r
+\r
+ KToggleAction* sortByGroup = actionCollection()->add<KToggleAction>("by_group");\r
+ sortByGroup->setText(i18n("By Group"));\r
+ connect(sortByGroup, SIGNAL(triggered()), this, SLOT(sortByGroup()));\r
+\r
QActionGroup* sortGroup = new QActionGroup(this);\r
sortGroup->addAction(sortByName);\r
sortGroup->addAction(sortBySize);\r
sortGroup->addAction(sortByDate);\r
+ sortGroup->addAction(sortByPermissions);\r
+ sortGroup->addAction(sortByOwner);\r
+ sortGroup->addAction(sortByGroup);\r
\r
KToggleAction* sortDescending = actionCollection()->add<KToggleAction>("descending");\r
sortDescending->setText(i18n("Descending"));\r
connect(sortDescending, SIGNAL(triggered()), this, SLOT(toggleSortOrder()));\r
\r
+ KToggleAction* clearInfo = actionCollection()->add<KToggleAction>("clear_info");\r
+ clearInfo->setText(i18n("No Information"));\r
+ connect(clearInfo, SIGNAL(triggered()), this, SLOT(clearInfo()));\r
+\r
+ KToggleAction* showMimeInfo = actionCollection()->add<KToggleAction>("show_mime_info");\r
+ showMimeInfo->setText(i18n("Type"));\r
+ connect(showMimeInfo, SIGNAL(triggered()), this, SLOT(showMimeInfo()));\r
+\r
+ KToggleAction* showSizeInfo = actionCollection()->add<KToggleAction>("show_size_info");\r
+ showSizeInfo->setText(i18n("Size"));\r
+ connect(showSizeInfo, SIGNAL(triggered()), this, SLOT(showSizeInfo()));\r
+\r
+ KToggleAction* showDateInfo = actionCollection()->add<KToggleAction>("show_date_info");\r
+ showDateInfo->setText(i18n("Date"));\r
+ connect(showDateInfo, SIGNAL(triggered()), this, SLOT(showDateInfo()));\r
+\r
+ QActionGroup* infoGroup = new QActionGroup(this);\r
+ infoGroup->addAction(clearInfo);\r
+ infoGroup->addAction(showMimeInfo);\r
+ infoGroup->addAction(showSizeInfo);\r
+ infoGroup->addAction(showDateInfo);\r
+\r
KToggleAction* showPreview = actionCollection()->add<KToggleAction>("show_preview");\r
- showPreview->setText(i18n("Show Preview"));\r
+ showPreview->setText(i18n("Preview"));\r
+ showPreview->setIcon(KIcon("thumbnail-show"));\r
connect(showPreview, SIGNAL(triggered()), this, SLOT(togglePreview()));\r
\r
KToggleAction* showHiddenFiles = actionCollection()->add<KToggleAction>("show_hidden_files");\r
showHiddenFiles->setText(i18n("Show Hidden Files"));\r
- //showHiddenFiles->setShortcut(Qt::ALT | Qt::Key_ KDE4-TODO: what Qt-Key represents '.'?\r
+ showHiddenFiles->setShortcut(Qt::ALT | Qt::Key_Period);\r
connect(showHiddenFiles, SIGNAL(triggered()), this, SLOT(toggleShowHiddenFiles()));\r
\r
KToggleAction* split = actionCollection()->add<KToggleAction>("split_view");\r
- split->setText(i18n("Split View"));\r
+ split->setText(i18n("Split"));\r
split->setShortcut(Qt::Key_F10);\r
- split->setIcon(KIcon("view_left_right"));\r
+ split->setIcon(KIcon("view-left-right"));\r
connect(split, SIGNAL(triggered()), this, SLOT(toggleSplitView()));\r
\r
QAction* reload = actionCollection()->addAction("reload");\r
reload->setText(i18n("Reload"));\r
reload->setShortcut(Qt::Key_F5);\r
- reload->setIcon(KIcon("reload"));\r
+ reload->setIcon(KIcon("view-refresh"));\r
connect(reload, SIGNAL(triggered()), this, SLOT(reloadView()));\r
\r
QAction* stop = actionCollection()->addAction("stop");\r
stop->setText(i18n("Stop"));\r
- stop->setIcon(KIcon("stop"));\r
+ stop->setIcon(KIcon("process-stop"));\r
connect(stop, SIGNAL(triggered()), this, SLOT(stopLoading()));\r
\r
+ // TODO: the URL navigator must emit a signal if the editable state has been\r
+ // changed, so that the corresponding showFullLocation action is updated. Also\r
+ // the naming "Show full Location" is currently confusing...\r
KToggleAction* showFullLocation = actionCollection()->add<KToggleAction>("editable_location");\r
showFullLocation->setText(i18n("Show Full Location"));\r
showFullLocation->setShortcut(Qt::CTRL | Qt::Key_L);\r
connect(showFullLocation, SIGNAL(triggered()), this, SLOT(toggleEditLocation()));\r
\r
- KToggleAction* editLocation = actionCollection()->add<KToggleAction>("edit_location");\r
+ QAction* editLocation = actionCollection()->addAction("edit_location");\r
editLocation->setText(i18n("Edit Location"));\r
editLocation->setShortcut(Qt::Key_F6);\r
connect(editLocation, SIGNAL(triggered()), this, SLOT(editLocation()));\r
QAction* findFile = actionCollection()->addAction("find_file");\r
findFile->setText(i18n("Find File..."));\r
findFile->setShortcut(Qt::Key_F);\r
- findFile->setIcon(KIcon("filefind"));\r
+ findFile->setIcon(KIcon("file-find"));\r
connect(findFile, SIGNAL(triggered()), this, SLOT(findFile()));\r
\r
KToggleAction* showFilterBar = actionCollection()->add<KToggleAction>("show_filter_bar");\r
\r
void DolphinMainWindow::setupDockWidgets()\r
{\r
+ // TODO: there's a lot copy/paste code here. Provide a generic approach\r
+ // after the dock concept has been finalized.\r
+\r
+ // setup "Bookmarks"\r
QDockWidget* shortcutsDock = new QDockWidget(i18n("Bookmarks"));\r
shortcutsDock->setObjectName("bookmarksDock");\r
shortcutsDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);\r
\r
addDockWidget(Qt::LeftDockWidgetArea, shortcutsDock);\r
\r
+ // setup "Information"\r
QDockWidget* infoDock = new QDockWidget(i18n("Information"));\r
infoDock->setObjectName("infoDock");\r
infoDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);\r
actionCollection()->addAction("show_info_panel", infoDock->toggleViewAction());\r
\r
addDockWidget(Qt::RightDockWidgetArea, infoDock);\r
+\r
+ // setup "Tree View"\r
+ QDockWidget* treeViewDock = new QDockWidget(i18n("Folders")); // TODO: naming?\r
+ treeViewDock->setObjectName("treeViewDock");\r
+ treeViewDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);\r
+ treeViewDock->setWidget(new TreeViewSidebarPage(this));\r
+\r
+ treeViewDock->toggleViewAction()->setText(i18n("Show Folders Panel"));\r
+ actionCollection()->addAction("show_folders_panel", treeViewDock->toggleViewAction());\r
+\r
+ addDockWidget(Qt::LeftDockWidgetArea, treeViewDock);\r
+\r
+ const bool firstRun = DolphinSettings::instance().generalSettings()->firstRun();\r
+ if (firstRun) {\r
+ infoDock->hide();\r
+ treeViewDock->hide();\r
+ }\r
}\r
\r
void DolphinMainWindow::updateHistory()\r
{\r
int index = 0;\r
- const Q3ValueList<UrlNavigator::HistoryElem> list = m_activeView->urlHistory(index);\r
+ const QLinkedList<UrlNavigator::HistoryElem> list = m_activeView->urlHistory(index);\r
\r
QAction* backAction = actionCollection()->action("go_back");\r
if (backAction != 0) {\r
\r
slotSortingChanged(m_activeView->sorting());\r
slotSortOrderChanged(m_activeView->sortOrder());\r
+ slotAdditionalInfoChanged(m_activeView->additionalInfo());\r
\r
KToggleAction* showFilterBarAction =\r
static_cast<KToggleAction*>(actionCollection()->action("show_filter_bar"));\r
showFilterBarAction->setChecked(m_activeView->isFilterBarVisible());\r
\r
+ KToggleAction* showPreviewAction =\r
+ static_cast<KToggleAction*>(actionCollection()->action("show_preview"));\r
+ showPreviewAction->setChecked(m_activeView->showPreview());\r
+\r
KToggleAction* showHiddenFilesAction =\r
static_cast<KToggleAction*>(actionCollection()->action("show_hidden_files"));\r
showHiddenFilesAction->setChecked(m_activeView->showHiddenFiles());\r
\r
KToggleAction* splitAction = static_cast<KToggleAction*>(actionCollection()->action("split_view"));\r
splitAction->setChecked(m_view[SecondaryIdx] != 0);\r
+\r
+ KToggleAction* editableLocactionAction =\r
+ static_cast<KToggleAction*>(actionCollection()->action("editable_location"));\r
+ editableLocactionAction->setChecked(m_activeView->isUrlEditable());\r
}\r
\r
void DolphinMainWindow::updateGoActions()\r
void DolphinMainWindow::copyUrls(const KUrl::List& source, const KUrl& dest)\r
{\r
KonqOperations::copy(this, KonqOperations::COPY, source, dest);\r
- m_undoOperations.append(KonqOperations::COPY);\r
+ m_undoCommandTypes.append(KonqUndoManager::COPY);\r
}\r
\r
void DolphinMainWindow::moveUrls(const KUrl::List& source, const KUrl& dest)\r
{\r
KonqOperations::copy(this, KonqOperations::MOVE, source, dest);\r
- m_undoOperations.append(KonqOperations::MOVE);\r
+ m_undoCommandTypes.append(KonqUndoManager::MOVE);\r
+}\r
+\r
+void DolphinMainWindow::linkUrls(const KUrl::List& source, const KUrl& dest)\r
+{\r
+ KonqOperations::copy(this, KonqOperations::LINK, source, dest);\r
+ m_undoCommandTypes.append(KonqUndoManager::LINK);\r
}\r
\r
void DolphinMainWindow::clearStatusBar()\r
DolphinView* view = m_view[viewIndex];\r
connect(view, SIGNAL(modeChanged()),\r
this, SLOT(slotViewModeChanged()));\r
+ connect(view, SIGNAL(showPreviewChanged()),\r
+ this, SLOT(slotShowPreviewChanged()));\r
connect(view, SIGNAL(showHiddenFilesChanged()),\r
this, SLOT(slotShowHiddenFilesChanged()));\r
connect(view, SIGNAL(sortingChanged(DolphinView::Sorting)),\r
this, SLOT(slotSortingChanged(DolphinView::Sorting)));\r
connect(view, SIGNAL(sortOrderChanged(Qt::SortOrder)),\r
this, SLOT(slotSortOrderChanged(Qt::SortOrder)));\r
+ connect(view, SIGNAL(additionalInfoChanged(KFileItemDelegate::AdditionalInformation)),\r
+ this, SLOT(slotAdditionalInfoChanged(KFileItemDelegate::AdditionalInformation)));\r
connect(view, SIGNAL(selectionChanged()),\r
this, SLOT(slotSelectionChanged()));\r
connect(view, SIGNAL(showFilterBarChanged(bool)),\r
\r
}\r
\r
+DolphinMainWindow::UndoUiInterface::UndoUiInterface(DolphinMainWindow* mainWin) :\r
+ KonqUndoManager::UiInterface(mainWin),\r
+ m_mainWin(mainWin)\r
+{\r
+ Q_ASSERT(m_mainWin != 0);\r
+}\r
+\r
+DolphinMainWindow::UndoUiInterface::~UndoUiInterface()\r
+{\r
+}\r
+\r
+void DolphinMainWindow::UndoUiInterface::jobError(KIO::Job* job)\r
+{\r
+ DolphinStatusBar* statusBar = m_mainWin->activeView()->statusBar();\r
+ statusBar->setMessage(job->errorString(), DolphinStatusBar::Error);\r
+}\r
+\r
#include "dolphinmainwindow.moc"\r