Paste P388

Dolphin-style view modes in the file dialog
ActivePublic

Authored by ngraham on May 20 2019, 8:29 PM.
diff --git a/src/filewidgets/kdiroperator.cpp b/src/filewidgets/kdiroperator.cpp
index 3dc2b8a6..0c9359f8 100644
--- a/src/filewidgets/kdiroperator.cpp
+++ b/src/filewidgets/kdiroperator.cpp
@@ -212,6 +212,9 @@ public:
void _k_slotSortByType();
void _k_slotSortReversed(bool doReverse);
void _k_slotToggleDirsFirst();
+ void _k_slotToggleIconsView();
+ void _k_slotToggleCompactView();
+ void _k_slotToggleDetailsView();
void _k_slotToggleIgnoreCase();
void _k_slotStarted();
void _k_slotProgress(int);
@@ -712,6 +715,51 @@ void KDirOperator::Private::_k_slotToggleDirsFirst()
updateSorting(s);
}
+void KDirOperator::Private::_k_slotToggleIconsView()
+{
+ // Switch to simple view
+ KFile::FileView fileView = static_cast<KFile::FileView>((viewKind & ~allViews()) | KFile::Simple);
+ parent->setView(fileView);
+
+ // Put the icons on top
+ actionCollection->action(QStringLiteral("decorationAtTop"))->setChecked(true);
+ decorationPosition = QStyleOptionViewItem::Top;
+
+ QListView *listView = qobject_cast<QListView *>(itemView);
+ listView->setFlow(QListView::LeftToRight);
+
+ updateListViewGrid();
+ listView->update();
+}
+
+void KDirOperator::Private::_k_slotToggleCompactView()
+{
+ // Switch to simple view
+ KFile::FileView fileView = static_cast<KFile::FileView>((viewKind & ~allViews()) | KFile::Simple);
+ parent->setView(fileView);
+
+ // Put the icons on the side
+ actionCollection->action(QStringLiteral("decorationAtLeft"))->setChecked(true);
+ decorationPosition = QStyleOptionViewItem::Left;
+
+ QListView *listView = qobject_cast<QListView *>(itemView);
+ listView->setFlow(QListView::TopToBottom);
+
+ updateListViewGrid();
+ listView->update();
+}
+
+void KDirOperator::Private::_k_slotToggleDetailsView()
+{
+ KFile::FileView view;
+ if (true) {
+ view = static_cast<KFile::FileView>((viewKind & ~allViews()) | KFile::DetailTree);
+ } else {
+ view = static_cast<KFile::FileView>((viewKind & ~allViews()) | KFile::Detail);
+ }
+ parent->setView(view);
+}
+
void KDirOperator::Private::_k_slotToggleIgnoreCase()
{
// TODO: port to Qt4's QAbstractItemView
@@ -2000,6 +2048,34 @@ void KDirOperator::setupActions()
d->actionCollection->addAction(QStringLiteral("dirs first"), dirsFirstAction);
connect(dirsFirstAction, SIGNAL(triggered(bool)), this, SLOT(_k_slotToggleDirsFirst()));
+ // View modes that match those of Dolphin
+ /*
+ TODO:
+ - Make buttons reflect current state when opening in icons or compact view
+ - Make compact view use a smaller icon size by default, like detailed tree view does
+ - Implement "Allow Expansion" option for the configure menu in the corner that toggles between detailed view and detailed tree view
+*/
+ KToggleAction *iconsViewAction = new KToggleAction(i18n("Icons View"), this);
+ iconsViewAction->setIcon(QIcon::fromTheme(QStringLiteral("view-list-icons")));
+ d->actionCollection->addAction(QStringLiteral("icons view"), iconsViewAction);
+ connect(iconsViewAction, SIGNAL(triggered(bool)), this, SLOT(_k_slotToggleIconsView()));
+
+ KToggleAction *compactViewAction = new KToggleAction(i18n("Compact View"), this);
+ compactViewAction->setIcon(QIcon::fromTheme(QStringLiteral("view-list-details")));
+ d->actionCollection->addAction(QStringLiteral("compact view"), compactViewAction);
+ connect(compactViewAction, SIGNAL(triggered(bool)), this, SLOT(_k_slotToggleCompactView()));
+
+ KToggleAction *detailsViewAction = new KToggleAction(i18n("Details View"), this);
+ detailsViewAction->setIcon(QIcon::fromTheme(QStringLiteral("view-list-tree")));
+ d->actionCollection->addAction(QStringLiteral("details view"), detailsViewAction);
+ connect(detailsViewAction, SIGNAL(triggered(bool)), this, SLOT(_k_slotToggleDetailsView()));
+
+ QActionGroup *viewModeGroup = new QActionGroup(this);
+ viewModeGroup->setExclusive(true);
+ iconsViewAction->setActionGroup(viewModeGroup);
+ compactViewAction->setActionGroup(viewModeGroup);
+ detailsViewAction->setActionGroup(viewModeGroup);
+
d->decorationMenu = new KActionMenu(i18n("Icon Position"), this);
d->actionCollection->addAction(QStringLiteral("decoration menu"), d->decorationMenu);
@@ -2015,6 +2091,7 @@ void KDirOperator::setupActions()
d->decorationMenu->addAction(topAction);
QActionGroup *decorationGroup = new QActionGroup(this);
+ decorationGroup->setExclusive(true);
d->leftAction->setActionGroup(decorationGroup);
topAction->setActionGroup(decorationGroup);
@@ -2181,6 +2258,8 @@ void KDirOperator::updateViewActions()
d->actionCollection->action(QStringLiteral("detailed view"))->setChecked(KFile::isDetailView(fv));
d->actionCollection->action(QStringLiteral("tree view"))->setChecked(KFile::isTreeView(fv));
d->actionCollection->action(QStringLiteral("detailed tree view"))->setChecked(KFile::isDetailTreeView(fv));
+
+ d->actionCollection->action(QStringLiteral("details view"))->setChecked(KFile::isDetailTreeView(fv) || KFile::isDetailView(fv));
}
void KDirOperator::readConfig(const KConfigGroup &configGroup)
diff --git a/src/filewidgets/kdiroperator.h b/src/filewidgets/kdiroperator.h
index 5fd1a93c..5e1d98c1 100644
--- a/src/filewidgets/kdiroperator.h
+++ b/src/filewidgets/kdiroperator.h
@@ -936,6 +936,9 @@ private:
Q_PRIVATE_SLOT(d, void _k_slotSortByType())
Q_PRIVATE_SLOT(d, void _k_slotSortReversed(bool))
Q_PRIVATE_SLOT(d, void _k_slotToggleDirsFirst())
+ Q_PRIVATE_SLOT(d, void _k_slotToggleIconsView())
+ Q_PRIVATE_SLOT(d, void _k_slotToggleCompactView())
+ Q_PRIVATE_SLOT(d, void _k_slotToggleDetailsView())
Q_PRIVATE_SLOT(d, void _k_slotToggleIgnoreCase())
Q_PRIVATE_SLOT(d, void _k_slotStarted())
Q_PRIVATE_SLOT(d, void _k_slotProgress(int))
diff --git a/src/filewidgets/kfilewidget.cpp b/src/filewidgets/kfilewidget.cpp
index 39020c39..3dc150bc 100644
--- a/src/filewidgets/kfilewidget.cpp
+++ b/src/filewidgets/kfilewidget.cpp
@@ -487,6 +487,7 @@ KFileWidget::KFileWidget(const QUrl &_startDir, QWidget *parent)
connect(showBookmarksAction, SIGNAL(toggled(bool)),
SLOT(_k_toggleBookmarks(bool)));
+ // Build the settings menu
KActionMenu *menu = new KActionMenu(QIcon::fromTheme(QStringLiteral("configure")), i18n("Options"), this);
coll->addAction(QStringLiteral("extra menu"), menu);
menu->setWhatsThis(i18n("<qt>This is the preferences menu for the file dialog. "
@@ -497,12 +498,8 @@ KFileWidget::KFileWidget(const QUrl &_startDir, QWidget *parent)
"<li>the Places panel</li>"
"<li>file previews</li>"
"<li>separating folders from files</li></ul></qt>"));
- menu->addAction(coll->action(QStringLiteral("view menu")));
- menu->addSeparator();
- menu->addAction(coll->action(QStringLiteral("decoration menu")));
- menu->addSeparator();
+
menu->addAction(coll->action(QStringLiteral("show hidden")));
- menu->addSeparator();
menu->addAction(showSidebarAction);
menu->addAction(showBookmarksAction);
menu->addAction(coll->action(QStringLiteral("preview")));
@@ -543,6 +540,10 @@ KFileWidget::KFileWidget(const QUrl &_startDir, QWidget *parent)
d->toolbar->addAction(coll->action(QStringLiteral("up")));
d->toolbar->addAction(coll->action(QStringLiteral("reload")));
d->toolbar->addSeparator();
+ d->toolbar->addAction(coll->action(QStringLiteral("icons view")));
+ d->toolbar->addAction(coll->action(QStringLiteral("compact view")));
+ d->toolbar->addAction(coll->action(QStringLiteral("details view")));
+ d->toolbar->addSeparator();
d->toolbar->addAction(coll->action(QStringLiteral("inline preview")));
d->toolbar->addAction(coll->action(QStringLiteral("sorting menu")));
d->toolbar->addWidget(midSpacer);