* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
***************************************************************************/
-#include <config-kmetadata.h>
#include "dolphinmainwindow.h"
+#include <config-kmetadata.h>
+
#include "dolphinapplication.h"
#include "dolphinnewmenu.h"
#include "dolphinsettings.h"
#include "infosidebarpage.h"
#include "metadatawidget.h"
#include "mainwindowadaptor.h"
+#include "terminalsidebarpage.h"
#include "treeviewsidebarpage.h"
#include "kurlnavigator.h"
#include "viewpropertiesdialog.h"
#include <kstandardaction.h>
#include <kurl.h>
-#include <QCloseEvent>
-#include <QClipboard>
-#include <QSplitter>
-#include <QDockWidget>
+#include <QtGui/QKeyEvent>
+#include <QtGui/QClipboard>
+#include <QtGui/QSplitter>
+#include <QtGui/QDockWidget>
DolphinMainWindow::DolphinMainWindow(int id) :
- KMainWindow(0),
- m_newMenu(0),
- m_splitter(0),
- m_activeView(0),
- m_id(id)
+ KXmlGuiWindow(0),
+ m_newMenu(0),
+ m_splitter(0),
+ m_activeView(0),
+ m_id(id)
{
setObjectName("Dolphin");
m_view[PrimaryIdx] = 0;
void DolphinMainWindow::refreshViews()
{
- const bool split = DolphinSettings::instance().generalSettings()->splitView();
- const bool isPrimaryViewActive = (m_activeView == m_view[PrimaryIdx]);
- KUrl url;
- for (int i = PrimaryIdx; i <= SecondaryIdx; ++i) {
- if (m_view[i] != 0) {
- url = m_view[i]->url();
-
- // delete view instance...
- m_view[i]->close();
- m_view[i]->deleteLater();
- m_view[i] = 0;
- }
+ Q_ASSERT(m_view[PrimaryIdx] != 0);
- if (split || (i == PrimaryIdx)) {
- // ... and recreate it
- ViewProperties props(url);
- m_view[i] = new DolphinView(this,
- m_splitter,
- url,
- props.viewMode(),
- props.showHiddenFiles());
- connectViewSignals(i);
- m_view[i]->reload();
- m_view[i]->show();
- }
- }
+ // remember the current active view, as because of
+ // the refreshing the active view might change to
+ // the secondary view
+ DolphinView* activeView = m_activeView;
- m_activeView = isPrimaryViewActive ? m_view[PrimaryIdx] : m_view[SecondaryIdx];
- Q_ASSERT(m_activeView != 0);
+ m_view[PrimaryIdx]->refresh();
+ if (m_view[SecondaryIdx] != 0) {
+ m_view[SecondaryIdx]->refresh();
+ }
- updateViewActions();
- emit activeViewChanged();
+ setActiveView(activeView);
}
void DolphinMainWindow::changeUrl(const KUrl& url)
case DolphinView::SortByGroup:
action = actionCollection()->action("by_group");
break;
+ case DolphinView::SortByType:
+ action = actionCollection()->action("by_type");
default:
break;
}
emit selectionChanged(selection);
}
+void DolphinMainWindow::slotRequestItemInfo(const KUrl& url)
+{
+ emit requestItemInfo(url);
+}
+
void DolphinMainWindow::slotHistoryChanged()
{
updateHistory();
settings.save();
- KMainWindow::closeEvent(event);
+ KXmlGuiWindow::closeEvent(event);
}
void DolphinMainWindow::saveProperties(KConfig* config)
void DolphinMainWindow::properties()
{
const KFileItemList list = m_activeView->selectedItems();
- new KPropertiesDialog(list, this);
+ KPropertiesDialog* dlg = new KPropertiesDialog(list, this);
+ dlg->exec();
+ delete dlg;
}
void DolphinMainWindow::quit()
m_activeView->setSorting(DolphinView::SortByGroup);
}
+void DolphinMainWindow::sortByType()
+{
+ m_activeView->setSorting(DolphinView::SortByType);
+}
+
void DolphinMainWindow::toggleSortOrder()
{
const Qt::SortOrder order = (m_activeView->sortOrder() == Qt::AscendingOrder) ?
// create a secondary view
m_view[SecondaryIdx] = new DolphinView(this,
0,
- m_view[PrimaryIdx]->url(),
+ m_view[PrimaryIdx]->rootUrl(),
m_view[PrimaryIdx]->mode(),
m_view[PrimaryIdx]->showHiddenFiles());
connectViewSignals(SecondaryIdx);
m_view[SecondaryIdx]->close();
m_view[SecondaryIdx]->deleteLater();
m_view[SecondaryIdx] = 0;
- setActiveView(m_view[PrimaryIdx]);
} else {
// The secondary view is active, hence from the users point of view
// the content of the secondary view should be moved to the primary view.
delete m_view[PrimaryIdx];
m_view[PrimaryIdx] = m_view[SecondaryIdx];
m_view[SecondaryIdx] = 0;
- setActiveView(m_view[PrimaryIdx]);
}
}
+ setActiveView(m_view[PrimaryIdx]);
emit activeViewChanged();
}
m_activeView->setShowHiddenFiles(show);
}
-void DolphinMainWindow::showFilterBar()
+void DolphinMainWindow::toggleFilterBarVisibility()
{
const KToggleAction* showFilterBarAction =
static_cast<KToggleAction*>(actionCollection()->action("show_filter_bar"));
m_activeView->goHome();
}
-void DolphinMainWindow::openTerminal()
-{
- QString command("konsole --workdir \"");
- command.append(m_activeView->url().path());
- command.append('\"');
-
- KRun::runCommand(command, "Konsole", "konsole");
-}
-
void DolphinMainWindow::findFile()
{
- KRun::run("kfind", m_activeView->url());
+ KRun::run("kfind", m_activeView->url(), this);
}
void DolphinMainWindow::compareFiles()
command.append("\" \"");
command.append(urlB.pathOrUrl());
command.append('\"');
- KRun::runCommand(command, "Kompare", "kompare");
+ KRun::runCommand(command, "Kompare", "kompare", this);
}
void DolphinMainWindow::editSettings()
{
- // TODO: make a static method for opening the settings dialog
- DolphinSettingsDialog dlg(this);
- dlg.exec();
+ DolphinSettingsDialog dialog(this);
+ dialog.exec();
}
void DolphinMainWindow::init()
KToggleAction* columnView = actionCollection()->add<KToggleAction>("columns");
columnView->setText(i18n("Columns"));
columnView->setShortcut(Qt::CTRL | Qt::Key_3);
- columnView->setIcon(KIcon("view-tree"));
+ columnView->setIcon(KIcon("fileview-column"));
connect(columnView, SIGNAL(triggered()), this, SLOT(setColumnView()));
QActionGroup* viewModeGroup = new QActionGroup(this);
sortByGroup->setText(i18n("By Group"));
connect(sortByGroup, SIGNAL(triggered()), this, SLOT(sortByGroup()));
+ KToggleAction* sortByType = actionCollection()->add<KToggleAction>("by_type");
+ sortByType->setText(i18n("By Type"));
+ connect(sortByType, SIGNAL(triggered()), this, SLOT(sortByType()));
+
QActionGroup* sortGroup = new QActionGroup(this);
sortGroup->addAction(sortByName);
sortGroup->addAction(sortBySize);
sortGroup->addAction(sortByPermissions);
sortGroup->addAction(sortByOwner);
sortGroup->addAction(sortByGroup);
+ sortGroup->addAction(sortByType);
KToggleAction* sortDescending = actionCollection()->add<KToggleAction>("descending");
sortDescending->setText(i18n("Descending"));
connect(sortDescending, SIGNAL(triggered()), this, SLOT(toggleSortOrder()));
KToggleAction* sortCategorized = actionCollection()->add<KToggleAction>("categorized");
- sortCategorized->setText(i18n("Categorized"));
+ sortCategorized->setText(i18n("Show in Groups"));
connect(sortCategorized, SIGNAL(triggered()), this, SLOT(toggleSortCategorization()));
KToggleAction* clearInfo = actionCollection()->add<KToggleAction>("clear_info");
KStandardAction::home(this, SLOT(goHome()), actionCollection());
// setup 'Tools' menu
- QAction* openTerminal = actionCollection()->addAction("open_terminal");
- openTerminal->setText(i18n("Open Terminal"));
- openTerminal->setShortcut(Qt::Key_F4);
- openTerminal->setIcon(KIcon("konsole"));
- connect(openTerminal, SIGNAL(triggered()), this, SLOT(openTerminal()));
-
QAction* findFile = actionCollection()->addAction("find_file");
findFile->setText(i18n("Find File..."));
- findFile->setShortcut(Qt::Key_F);
+ findFile->setShortcut(Qt::CTRL | Qt::Key_F);
findFile->setIcon(KIcon("file-find"));
connect(findFile, SIGNAL(triggered()), this, SLOT(findFile()));
KToggleAction* showFilterBar = actionCollection()->add<KToggleAction>("show_filter_bar");
showFilterBar->setText(i18n("Show Filter Bar"));
- showFilterBar->setShortcut(Qt::Key_Slash);
- connect(showFilterBar, SIGNAL(triggered()), this, SLOT(showFilterBar()));
+ showFilterBar->setShortcut(Qt::CTRL | Qt::Key_I);
+ connect(showFilterBar, SIGNAL(triggered()), this, SLOT(toggleFilterBarVisibility()));
QAction* compareFiles = actionCollection()->addAction("compare_files");
compareFiles->setText(i18n("Compare Files"));
void DolphinMainWindow::setupDockWidgets()
{
- // TODO: there's a lot copy/paste code here. Provide a generic approach
- // after the dock concept has been finalized.
-
// setup "Information"
QDockWidget* infoDock = new QDockWidget(i18n("Information"));
infoDock->setObjectName("infoDock");
SidebarPage* infoWidget = new InfoSidebarPage(infoDock);
infoDock->setWidget(infoWidget);
-
- infoDock->toggleViewAction()->setText(i18n("Show Information Panel"));
+ infoDock->toggleViewAction()->setText(i18n("Information"));
actionCollection()->addAction("show_info_panel", infoDock->toggleViewAction());
addDockWidget(Qt::RightDockWidgetArea, infoDock);
- connectSidebarPage(infoWidget);
+ connect(this, SIGNAL(urlChanged(KUrl)),
+ infoWidget, SLOT(setUrl(KUrl)));
+ connect(this, SIGNAL(selectionChanged(KFileItemList)),
+ infoWidget, SLOT(setSelection(KFileItemList)));
+ connect(this, SIGNAL(requestItemInfo(KUrl)),
+ infoWidget, SLOT(requestDelayedItemInfo(KUrl)));
// setup "Tree View"
- QDockWidget* treeViewDock = new QDockWidget(i18n("Folders")); // TODO: naming?
+ QDockWidget* treeViewDock = new QDockWidget(i18n("Folders"));
treeViewDock->setObjectName("treeViewDock");
treeViewDock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea);
TreeViewSidebarPage* treeWidget = new TreeViewSidebarPage(treeViewDock);
treeViewDock->setWidget(treeWidget);
- treeViewDock->toggleViewAction()->setText(i18n("Show Folders Panel"));
+ treeViewDock->toggleViewAction()->setText(i18n("Folders"));
actionCollection()->addAction("show_folders_panel", treeViewDock->toggleViewAction());
addDockWidget(Qt::LeftDockWidgetArea, treeViewDock);
- connectSidebarPage(treeWidget);
+ connect(this, SIGNAL(urlChanged(KUrl)),
+ treeWidget, SLOT(setUrl(KUrl)));
+ connect(treeWidget, SIGNAL(changeUrl(KUrl)),
+ this, SLOT(changeUrl(KUrl)));
+ connect(treeWidget, SIGNAL(changeSelection(KFileItemList)),
+ this, SLOT(changeSelection(KFileItemList)));
+ connect(treeWidget, SIGNAL(urlsDropped(KUrl::List, KUrl)),
+ this, SLOT(dropUrls(KUrl::List, KUrl)));
+
+ // setup "Terminal"
+ QDockWidget* terminalDock = new QDockWidget(i18n("Terminal"));
+ terminalDock->setObjectName("terminalDock");
+ terminalDock->setAllowedAreas(Qt::TopDockWidgetArea | Qt::BottomDockWidgetArea);
+ SidebarPage* terminalWidget = new TerminalSidebarPage(terminalDock);
+ terminalDock->setWidget(terminalWidget);
+
+ terminalDock->toggleViewAction()->setText(i18n("Terminal"));
+ actionCollection()->addAction("show_terminal_panel", terminalDock->toggleViewAction());
+
+ addDockWidget(Qt::RightDockWidgetArea, terminalDock);
+ connect(this, SIGNAL(urlChanged(KUrl)),
+ terminalWidget, SLOT(setUrl(KUrl)));
const bool firstRun = DolphinSettings::instance().generalSettings()->firstRun();
if (firstRun) {
infoDock->hide();
treeViewDock->hide();
+ terminalDock->hide();
}
QDockWidget *placesDock = new QDockWidget(i18n("Places"));
KFilePlacesView *listView = new KFilePlacesView(placesDock);
placesDock->setWidget(listView);
listView->setModel(DolphinSettings::instance().placesModel());
+
+ placesDock->toggleViewAction()->setText(i18n("Show Places Panel"));
+ actionCollection()->addAction("show_places_panel", placesDock->toggleViewAction());
+
addDockWidget(Qt::LeftDockWidgetArea, placesDock);
connect(listView, SIGNAL(urlChanged(KUrl)),
this, SLOT(changeUrl(KUrl)));
this, SLOT(slotAdditionalInfoChanged(KFileItemDelegate::AdditionalInformation)));
connect(view, SIGNAL(selectionChanged(KFileItemList)),
this, SLOT(slotSelectionChanged(KFileItemList)));
+ connect(view, SIGNAL(requestItemInfo(KUrl)),
+ this, SLOT(slotRequestItemInfo(KUrl)));
connect(view, SIGNAL(showFilterBarChanged(bool)),
this, SLOT(updateFilterBarAction(bool)));
connect(view, SIGNAL(urlChanged(KUrl)),
this, SLOT(slotHistoryChanged()));
}
-void DolphinMainWindow::connectSidebarPage(SidebarPage* page)
-{
- connect(page, SIGNAL(changeUrl(KUrl)),
- this, SLOT(changeUrl(KUrl)));
- connect(page, SIGNAL(changeSelection(KFileItemList)),
- this, SLOT(changeSelection(KFileItemList)));
- connect(page, SIGNAL(urlsDropped(KUrl::List, KUrl)),
- this, SLOT(dropUrls(KUrl::List, KUrl)));
-
- connect(this, SIGNAL(urlChanged(KUrl)),
- page, SLOT(setUrl(KUrl)));
- connect(this, SIGNAL(selectionChanged(KFileItemList)),
- page, SLOT(setSelection(KFileItemList)));
-}
-
DolphinMainWindow::UndoUiInterface::UndoUiInterface(DolphinMainWindow* mainWin) :
KonqUndoManager::UiInterface(mainWin),
m_mainWin(mainWin)