* allow to toggle the content of split views by the context menu

* minor cleanups in DolphinMainWindow

svn path=/trunk/KDE/kdebase/apps/; revision=674713
This commit is contained in:
Peter Penz 2007-06-12 21:45:22 +00:00
parent 329aa0c5f7
commit 6f5f07d391
3 changed files with 160 additions and 110 deletions

View file

@ -234,6 +234,12 @@ void DolphinContextMenu::openViewportContextMenu()
viewModeMenu->addAction(previewsMode);
popup->addMenu(viewModeMenu);
QAction* toggleViewsAction = 0;
if (m_mainWindow->isSplit()) {
toggleViewsAction = popup->addAction(i18n("Toggle Views"));
}
popup->addSeparator();
QAction* bookmarkAction = popup->addAction(KIcon("bookmark-folder"), i18n("Bookmark This Folder..."));
@ -241,16 +247,18 @@ void DolphinContextMenu::openViewportContextMenu()
QAction* propertiesAction = popup->addAction(i18n("Properties"));
QAction* activatedAction = popup->exec(QCursor::pos());
if (activatedAction == propertiesAction) {
QAction* action = popup->exec(QCursor::pos());
if (action == propertiesAction) {
const KUrl& url = m_mainWindow->activeViewContainer()->url();
KPropertiesDialog dialog(url);
dialog.exec();
} else if (activatedAction == bookmarkAction) {
} else if (action == bookmarkAction) {
const KUrl& url = m_mainWindow->activeViewContainer()->url();
if (url.isValid()) {
DolphinSettings::instance().placesModel()->addPlace(url.fileName(), url);
}
} else if ((toggleViewsAction != 0) && (action == toggleViewsAction)) {
m_mainWindow->toggleViews();
}
popup->deleteLater();

View file

@ -83,8 +83,8 @@ DolphinMainWindow::DolphinMainWindow(int id) :
m_id(id)
{
setObjectName("Dolphin");
m_viewContainer[PrimaryIdx] = 0;
m_viewContainer[SecondaryIdx] = 0;
m_viewContainer[PrimaryView] = 0;
m_viewContainer[SecondaryView] = 0;
new MainWindowAdaptor(this);
QDBusConnection::sessionBus().registerObject(QString("/dolphin/MainWindow%1").arg(m_id), this);
@ -106,25 +106,43 @@ DolphinMainWindow::~DolphinMainWindow()
DolphinApplication::app()->removeMainWindow(this);
}
void DolphinMainWindow::setActiveView(DolphinViewContainer* view)
void DolphinMainWindow::toggleViews()
{
Q_ASSERT((view == m_viewContainer[PrimaryIdx]) || (view == m_viewContainer[SecondaryIdx]));
if (m_activeViewContainer == view) {
if (m_viewContainer[SecondaryView] == 0) {
return;
}
m_activeViewContainer->setActive(false);
m_activeViewContainer = view;
m_activeViewContainer->setActive(true);
// move secondary view from the last position of the splitter
// to the first position
m_splitter->insertWidget(0, m_viewContainer[SecondaryView]);
updateHistory();
updateEditActions();
updateViewActions();
updateGoActions();
DolphinViewContainer* container = m_viewContainer[PrimaryView];
m_viewContainer[PrimaryView] = m_viewContainer[SecondaryView];
m_viewContainer[SecondaryView] = container;
}
setCaption(m_activeViewContainer->url().fileName());
void DolphinMainWindow::rename(const KUrl& oldUrl, const KUrl& newUrl)
{
clearStatusBar();
KonqOperations::rename(this, oldUrl, newUrl);
m_undoCommandTypes.append(KonqUndoManager::RENAME);
}
emit activeViewChanged();
void DolphinMainWindow::refreshViews()
{
Q_ASSERT(m_viewContainer[PrimaryView] != 0);
// remember the current active view, as because of
// the refreshing the active view might change to
// the secondary view
DolphinViewContainer* activeViewContainer = m_activeViewContainer;
m_viewContainer[PrimaryView]->view()->refresh();
if (m_viewContainer[SecondaryView] != 0) {
m_viewContainer[SecondaryView]->view()->refresh();
}
setActiveViewContainer(activeViewContainer);
}
void DolphinMainWindow::dropUrls(const KUrl::List& urls,
@ -201,30 +219,6 @@ void DolphinMainWindow::dropUrls(const KUrl::List& urls,
}
}
void DolphinMainWindow::rename(const KUrl& oldUrl, const KUrl& newUrl)
{
clearStatusBar();
KonqOperations::rename(this, oldUrl, newUrl);
m_undoCommandTypes.append(KonqUndoManager::RENAME);
}
void DolphinMainWindow::refreshViews()
{
Q_ASSERT(m_viewContainer[PrimaryIdx] != 0);
// remember the current active view, as because of
// the refreshing the active view might change to
// the secondary view
DolphinViewContainer* activeViewContainer = m_activeViewContainer;
m_viewContainer[PrimaryIdx]->view()->refresh();
if (m_viewContainer[SecondaryIdx] != 0) {
m_viewContainer[SecondaryIdx]->view()->refresh();
}
setActiveView(activeViewContainer);
}
void DolphinMainWindow::changeUrl(const KUrl& url)
{
if (activeViewContainer() != 0) {
@ -346,10 +340,10 @@ void DolphinMainWindow::slotSelectionChanged(const KFileItemList& selection)
{
updateEditActions();
Q_ASSERT(m_viewContainer[PrimaryIdx] != 0);
int selectedUrlsCount = m_viewContainer[PrimaryIdx]->view()->selectedUrls().count();
if (m_viewContainer[SecondaryIdx] != 0) {
selectedUrlsCount += m_viewContainer[SecondaryIdx]->view()->selectedUrls().count();
Q_ASSERT(m_viewContainer[PrimaryView] != 0);
int selectedUrlsCount = m_viewContainer[PrimaryView]->view()->selectedUrls().count();
if (m_viewContainer[SecondaryView] != 0) {
selectedUrlsCount += m_viewContainer[SecondaryView]->view()->selectedUrls().count();
}
QAction* compareFilesAction = actionCollection()->action("compare_files");
@ -384,10 +378,10 @@ void DolphinMainWindow::openNewMainWindow()
void DolphinMainWindow::toggleActiveView()
{
if (m_activeViewContainer == m_viewContainer[PrimaryIdx]) {
setActiveView(m_viewContainer[SecondaryIdx]);
if (m_activeViewContainer == m_viewContainer[PrimaryView]) {
setActiveViewContainer(m_viewContainer[SecondaryView]);
} else {
setActiveView(m_viewContainer[PrimaryIdx]);
setActiveViewContainer(m_viewContainer[PrimaryView]);
}
}
@ -405,31 +399,31 @@ void DolphinMainWindow::closeEvent(QCloseEvent* event)
void DolphinMainWindow::saveProperties(KConfig* config)
{
KConfigGroup primaryView = config->group("Primary view");
primaryView.writeEntry("Url", m_viewContainer[PrimaryIdx]->url().url());
primaryView.writeEntry("Editable Url", m_viewContainer[PrimaryIdx]->isUrlEditable());
if (m_viewContainer[SecondaryIdx] != 0) {
primaryView.writeEntry("Url", m_viewContainer[PrimaryView]->url().url());
primaryView.writeEntry("Editable Url", m_viewContainer[PrimaryView]->isUrlEditable());
if (m_viewContainer[SecondaryView] != 0) {
KConfigGroup secondaryView = config->group("Secondary view");
secondaryView.writeEntry("Url", m_viewContainer[SecondaryIdx]->url().url());
secondaryView.writeEntry("Editable Url", m_viewContainer[SecondaryIdx]->isUrlEditable());
secondaryView.writeEntry("Url", m_viewContainer[SecondaryView]->url().url());
secondaryView.writeEntry("Editable Url", m_viewContainer[SecondaryView]->isUrlEditable());
}
}
void DolphinMainWindow::readProperties(KConfig* config)
{
const KConfigGroup primaryViewGroup = config->group("Primary view");
m_viewContainer[PrimaryIdx]->setUrl(primaryViewGroup.readEntry("Url"));
m_viewContainer[PrimaryView]->setUrl(primaryViewGroup.readEntry("Url"));
bool editable = primaryViewGroup.readEntry("Editable Url", false);
m_viewContainer[PrimaryIdx]->urlNavigator()->setUrlEditable(editable);
m_viewContainer[PrimaryView]->urlNavigator()->setUrlEditable(editable);
if (config->hasGroup("Secondary view")) {
const KConfigGroup secondaryViewGroup = config->group("Secondary view");
if (m_viewContainer[PrimaryIdx] == 0) {
if (m_viewContainer[PrimaryView] == 0) {
toggleSplitView();
}
m_viewContainer[PrimaryIdx]->setUrl(secondaryViewGroup.readEntry("Url"));
m_viewContainer[PrimaryView]->setUrl(secondaryViewGroup.readEntry("Url"));
editable = secondaryViewGroup.readEntry("Editable Url", false);
m_viewContainer[PrimaryIdx]->urlNavigator()->setUrlEditable(editable);
} else if (m_viewContainer[SecondaryIdx] != 0) {
m_viewContainer[PrimaryView]->urlNavigator()->setUrlEditable(editable);
} else if (m_viewContainer[SecondaryView] != 0) {
toggleSplitView();
}
}
@ -758,29 +752,29 @@ void DolphinMainWindow::showDateInfo()
void DolphinMainWindow::toggleSplitView()
{
if (m_viewContainer[SecondaryIdx] == 0) {
const int newWidth = (m_viewContainer[PrimaryIdx]->width() - m_splitter->handleWidth()) / 2;
if (m_viewContainer[SecondaryView] == 0) {
const int newWidth = (m_viewContainer[PrimaryView]->width() - m_splitter->handleWidth()) / 2;
// create a secondary view
const DolphinView* view = m_viewContainer[PrimaryIdx]->view();
m_viewContainer[SecondaryIdx] = new DolphinViewContainer(this,
const DolphinView* view = m_viewContainer[PrimaryView]->view();
m_viewContainer[SecondaryView] = new DolphinViewContainer(this,
0,
view->rootUrl(),
view->mode(),
view->showHiddenFiles());
connectViewSignals(SecondaryIdx);
m_splitter->addWidget(m_viewContainer[SecondaryIdx]);
connectViewSignals(SecondaryView);
m_splitter->addWidget(m_viewContainer[SecondaryView]);
m_splitter->setSizes(QList<int>() << newWidth << newWidth);
m_viewContainer[SecondaryIdx]->view()->reload();
m_viewContainer[SecondaryIdx]->setActive(false);
m_viewContainer[SecondaryIdx]->show();
m_viewContainer[SecondaryView]->view()->reload();
m_viewContainer[SecondaryView]->setActive(false);
m_viewContainer[SecondaryView]->show();
} else {
// remove secondary view
m_viewContainer[SecondaryIdx]->close();
m_viewContainer[SecondaryIdx]->deleteLater();
m_viewContainer[SecondaryIdx] = 0;
m_viewContainer[SecondaryView]->close();
m_viewContainer[SecondaryView]->deleteLater();
m_viewContainer[SecondaryView] = 0;
}
setActiveView(m_viewContainer[PrimaryIdx]);
setActiveViewContainer(m_viewContainer[PrimaryView]);
updateViewActions();
emit activeViewChanged();
}
@ -792,7 +786,8 @@ void DolphinMainWindow::reloadView()
}
void DolphinMainWindow::stopLoading()
{}
{
}
void DolphinMainWindow::togglePreview()
{
@ -894,16 +889,16 @@ void DolphinMainWindow::compareFiles()
// - both in the secondary view
// - one in the primary view and the other in the secondary
// view
Q_ASSERT(m_viewContainer[PrimaryIdx] != 0);
Q_ASSERT(m_viewContainer[PrimaryView] != 0);
KUrl urlA;
KUrl urlB;
KUrl::List urls = m_viewContainer[PrimaryIdx]->view()->selectedUrls();
KUrl::List urls = m_viewContainer[PrimaryView]->view()->selectedUrls();
switch (urls.count()) {
case 0: {
Q_ASSERT(m_viewContainer[SecondaryIdx] != 0);
urls = m_viewContainer[SecondaryIdx]->view()->selectedUrls();
Q_ASSERT(m_viewContainer[SecondaryView] != 0);
urls = m_viewContainer[SecondaryView]->view()->selectedUrls();
Q_ASSERT(urls.count() == 2);
urlA = urls[0];
urlB = urls[1];
@ -912,8 +907,8 @@ void DolphinMainWindow::compareFiles()
case 1: {
urlA = urls[0];
Q_ASSERT(m_viewContainer[SecondaryIdx] != 0);
urls = m_viewContainer[SecondaryIdx]->view()->selectedUrls();
Q_ASSERT(m_viewContainer[SecondaryView] != 0);
urls = m_viewContainer[SecondaryView]->view()->selectedUrls();
Q_ASSERT(urls.count() == 1);
urlB = urls[0];
break;
@ -968,16 +963,16 @@ void DolphinMainWindow::init()
const KUrl& homeUrl = settings.generalSettings()->homeUrl();
setCaption(homeUrl.fileName());
ViewProperties props(homeUrl);
m_viewContainer[PrimaryIdx] = new DolphinViewContainer(this,
m_viewContainer[PrimaryView] = new DolphinViewContainer(this,
m_splitter,
homeUrl,
props.viewMode(),
props.showHiddenFiles());
m_activeViewContainer = m_viewContainer[PrimaryIdx];
connectViewSignals(PrimaryIdx);
m_viewContainer[PrimaryIdx]->view()->reload();
m_viewContainer[PrimaryIdx]->show();
m_activeViewContainer = m_viewContainer[PrimaryView];
connectViewSignals(PrimaryView);
m_viewContainer[PrimaryView]->view()->reload();
m_viewContainer[PrimaryView]->show();
setCentralWidget(m_splitter);
setupDockWidgets();
@ -1015,6 +1010,27 @@ void DolphinMainWindow::loadSettings()
updateViewActions();
}
void DolphinMainWindow::setActiveViewContainer(DolphinViewContainer* view)
{
Q_ASSERT((view == m_viewContainer[PrimaryView]) || (view == m_viewContainer[SecondaryView]));
if (m_activeViewContainer == view) {
return;
}
m_activeViewContainer->setActive(false);
m_activeViewContainer = view;
m_activeViewContainer->setActive(true);
updateHistory();
updateEditActions();
updateViewActions();
updateGoActions();
setCaption(m_activeViewContainer->url().fileName());
emit activeViewChanged();
}
void DolphinMainWindow::setupActions()
{
// setup 'File' menu
@ -1421,7 +1437,7 @@ void DolphinMainWindow::updateViewActions()
static_cast<KToggleAction*>(actionCollection()->action("show_hidden_files"));
showHiddenFilesAction->setChecked(view->showHiddenFiles());
updateSplitAction(m_viewContainer[SecondaryIdx] != 0);
updateSplitAction(m_viewContainer[SecondaryView] != 0);
KToggleAction* editableLocactionAction =
static_cast<KToggleAction*>(actionCollection()->action("editable_location"));

View file

@ -53,21 +53,27 @@ public:
virtual ~DolphinMainWindow();
/**
* Activates the given view, which means that
* all menu actions are applied to this view. When
* having a split view setup the nonactive view
* Returns the currently active view.
* All menu actions are applied to this view. When
* having a split view setup, the nonactive view
* is usually shown in darker colors.
*/
void setActiveView(DolphinViewContainer* view);
inline DolphinViewContainer* activeViewContainer() const;
/**
* Returns the currently active view. See
* DolphinMainWindow::setActiveView() for more details.
* Returns true, if the main window contains two instances
* of a view container. The active view constainer can be
* accessed by DolphinMainWindow::activeViewContainer().
*/
DolphinViewContainer* activeViewContainer() const
{
return m_activeViewContainer;
}
inline bool isSplit() const;
/**
* If the main window contains two instances of a view container
* (DolphinMainWindow::isSplit() returns true), then the
* two views get toggled (the right view is on the left, the left
* view on the right).
*/
void toggleViews();
/** Renames the item represented by \a oldUrl to \a newUrl. */
void rename(const KUrl& oldUrl, const KUrl& newUrl);
@ -82,10 +88,7 @@ public:
* Returns the 'Create New...' sub menu which also can be shared
* with other menus (e. g. a context menu).
*/
KNewMenu* newMenu() const
{
return m_newMenu;
}
inline KNewMenu* newMenu() const;
public slots:
/**
@ -105,10 +108,7 @@ public slots:
/**
* Returns the main window ID used through DBus.
*/
int getId() const
{
return m_id;
}
inline int getId() const;
/**
* Inform all affected dolphin components (sidebars, views) of an URL
@ -415,7 +415,14 @@ private:
void init();
void loadSettings();
void setupAccel();
/**
* Activates the given view, which means that
* all menu actions are applied to this view. When
* having a split view setup, the nonactive view
* is usually shown in darker colors.
*/
void setActiveViewContainer(DolphinViewContainer* view);
void setupActions();
void setupDockWidgets();
void updateHistory();
@ -445,13 +452,12 @@ private:
private:
/**
* DolphinMainWindowsupports only one or two views, which
* are handled internally as primary and secondary view.
* DolphinMainWindow supports up to two views beside each other.
*/
enum ViewIndex
{
PrimaryIdx = 0,
SecondaryIdx = 1
PrimaryView = 0, ///< View shown on the left side of the main window.
SecondaryView = 1 ///< View shown on the left side of the main window.
};
/**
@ -459,7 +465,7 @@ private:
* assures that all errors are shown in the status bar of Dolphin
* instead as modal error dialog with an OK button.
*/
class UndoUiInterface : public KonqUndoManager::UiInterface
class UndoUiInterface : public KonqUndoManager::UiInterface
{
public:
UndoUiInterface(DolphinMainWindow* mainWin);
@ -475,11 +481,31 @@ class UndoUiInterface : public KonqUndoManager::UiInterface
DolphinViewContainer* m_activeViewContainer;
int m_id;
DolphinViewContainer* m_viewContainer[SecondaryIdx + 1];
DolphinViewContainer* m_viewContainer[SecondaryView + 1];
/// remember pending undo operations until they are finished
QList<KonqUndoManager::CommandType> m_undoCommandTypes;
};
DolphinViewContainer* DolphinMainWindow::activeViewContainer() const
{
return m_activeViewContainer;
}
bool DolphinMainWindow::isSplit() const
{
return m_viewContainer[SecondaryView] != 0;
}
KNewMenu* DolphinMainWindow::newMenu() const
{
return m_newMenu;
}
int DolphinMainWindow::getId() const
{
return m_id;
}
#endif // DOLPHIN_MAINWINDOW_H