diff options
Diffstat (limited to 'src/views')
| -rw-r--r-- | src/views/dolphinitemlistview.cpp | 23 | ||||
| -rw-r--r-- | src/views/dolphinitemlistview.h | 2 | ||||
| -rw-r--r-- | src/views/dolphinview.cpp | 95 | ||||
| -rw-r--r-- | src/views/dolphinview.h | 26 | ||||
| -rw-r--r-- | src/views/viewproperties.cpp | 15 | ||||
| -rw-r--r-- | src/views/viewproperties.h | 4 | ||||
| -rw-r--r-- | src/views/zoomwidgetaction.cpp | 4 |
7 files changed, 157 insertions, 12 deletions
diff --git a/src/views/dolphinitemlistview.cpp b/src/views/dolphinitemlistview.cpp index f9e710a31..53d1c6c34 100644 --- a/src/views/dolphinitemlistview.cpp +++ b/src/views/dolphinitemlistview.cpp @@ -45,13 +45,22 @@ void DolphinItemListView::setZoomLevel(int level) m_zoomLevel = level; + const bool useGlobalViewProps = GeneralSettings::globalViewProps(); ViewModeSettings settings(itemLayout()); + if (previewsShown()) { - const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(level); - settings.setPreviewSize(previewSize); + m_previewSize = ZoomLevelInfo::iconSizeForZoomLevel(level); + // Only update the icon size settings if we're using global view props + // to prevent inconsistent state on zoom level changes + if (useGlobalViewProps) { + settings.setPreviewSize(m_previewSize); + } } else { - const int iconSize = ZoomLevelInfo::iconSizeForZoomLevel(level); - settings.setIconSize(iconSize); + // Same as above + m_iconSize = ZoomLevelInfo::iconSizeForZoomLevel(level); + if (useGlobalViewProps) { + settings.setIconSize(m_iconSize); + } } updateGridSize(); @@ -167,9 +176,11 @@ void DolphinItemListView::updateFont() void DolphinItemListView::updateGridSize() { const ViewModeSettings settings(itemLayout()); + const bool useGlobalViewProps = GeneralSettings::globalViewProps(); // Calculate the size of the icon - const int iconSize = previewsShown() ? settings.previewSize() : settings.iconSize(); + // Only use zoom stored in settings if we're using global view props + const int iconSize = useGlobalViewProps ? (previewsShown() ? settings.previewSize() : settings.iconSize()) : (previewsShown() ? m_previewSize : m_iconSize); m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize)); KItemListStyleOption option = styleOption(); @@ -190,7 +201,7 @@ void DolphinItemListView::updateGridSize() // 9 is the average char width for 10pt Noto Sans, making fontFactor =1 // by each pixel the font gets larger the factor increases by 1/9 auto fontFactor = option.fontMetrics.averageCharWidth() / 9.0; - itemWidth = 48 + IconsModeSettings::textWidthIndex() * 64 * fontFactor * zoomFactor; + itemWidth = 16 + IconsModeSettings::textWidthIndex() * 64 * fontFactor * zoomFactor; if (itemWidth < iconSize + padding * 2 * zoomFactor) { itemWidth = iconSize + padding * 2 * zoomFactor; diff --git a/src/views/dolphinitemlistview.h b/src/views/dolphinitemlistview.h index 0483c0644..7ac7a4fad 100644 --- a/src/views/dolphinitemlistview.h +++ b/src/views/dolphinitemlistview.h @@ -62,6 +62,8 @@ private: private: int m_zoomLevel; + int m_previewSize = 0; + int m_iconSize = 0; }; #endif diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index b01833d69..3c973618c 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -130,6 +130,25 @@ DolphinView::DolphinView(const QUrl &url, QWidget *parent) KItemListController *controller = new KItemListController(m_model, m_view, this); controller->setAutoActivationEnabled(GeneralSettings::autoExpandFolders()); connect(controller, &KItemListController::doubleClickViewBackground, this, &DolphinView::doubleClickViewBackground); + connect(controller, &KItemListController::typeAheadUsed, this, [this](const QString &typedString, std::optional<int> foundIndex) { + if (foundIndex.has_value()) { + const KFileItem item = m_model->fileItem(foundIndex.value()); + if (item.isNull()) { + return; + } + const KColorScheme colorScheme = KColorScheme(QPalette::Normal, KColorScheme::Tooltip); + const QColor autoCompleteTextColor = colorScheme.foreground(KColorScheme::InactiveText).color(); + + Q_EMIT showTypeAheadFeedback(QStringLiteral("%1<font color=\"%2\">%3</font>") + .arg(typedString.toHtmlEscaped()) + .arg(autoCompleteTextColor.name()) + .arg(item.name().toHtmlEscaped().mid(typedString.size()))); + } else { + const KColorScheme colorScheme = KColorScheme(QPalette::Normal, KColorScheme::Tooltip); + const QColor noMatchTextColor = colorScheme.foreground(KColorScheme::NegativeText).color(); + Q_EMIT showTypeAheadFeedback(QStringLiteral("<font color=\"%1\">%2</font>").arg(noMatchTextColor.name()).arg(typedString.toHtmlEscaped())); + } + }); // The EnlargeSmallPreviews setting can only be changed after the model // has been set in the view by KItemListController. @@ -479,9 +498,16 @@ void DolphinView::selectItems(const QRegularExpression ®exp, bool enabled) void DolphinView::setZoomLevel(int level) { + if (m_defaultZoomLevel < 0) { + updateDefaultZoomLevel(); + } + const int oldZoomLevel = zoomLevel(); m_view->setZoomLevel(level); if (zoomLevel() != oldZoomLevel) { + ViewProperties props(viewPropertiesUrl()); + props.setZoomLevel(level == m_defaultZoomLevel ? -1 : level); + hideToolTip(); Q_EMIT zoomLevelChanged(zoomLevel(), oldZoomLevel); } @@ -632,6 +658,26 @@ QStringList DolphinView::mimeTypeFilters() const return m_model->mimeTypeFilters(); } +void DolphinView::setFilterMode(KFileItemModelFilter::FilterMode mode) +{ + m_model->setFilterMode(mode); +} + +KFileItemModelFilter::FilterMode DolphinView::filterMode() const +{ + return m_model->filterMode(); +} + +void DolphinView::setFilterCaseSensitive(bool caseSensitive) +{ + m_model->setFilterCaseSensitive(caseSensitive); +} + +bool DolphinView::isFilterCaseSensitive() const +{ + return m_model->isFilterCaseSensitive(); +} + void DolphinView::requestStatusBarText() { if (m_statJobForStatusBarText) { @@ -1798,10 +1844,10 @@ Qt::SortOrder DolphinView::defaultSortOrderForRole(const QByteArray &role) void DolphinView::resetZoomLevel() { - ViewModeSettings settings{m_mode}; - const int userDefaultIconSize = settings.iconSize(); - - setZoomLevel(ZoomLevelInfo::zoomLevelForIconSize(QSize(userDefaultIconSize, userDefaultIconSize))); + if (m_defaultZoomLevel < 0) { + updateDefaultZoomLevel(); + } + setZoomLevel(m_defaultZoomLevel); } void DolphinView::selectFileOnceAvailable(const QUrl &url, const std::function<bool()> &condition) @@ -2312,11 +2358,16 @@ void DolphinView::applyViewProperties(const ViewProperties &props) { m_view->beginTransaction(); + // Caches old zoom level change for signal emitting + int zoomLevelChangeFrom = -1; + const Mode mode = props.viewMode(); if (m_mode != mode) { const Mode previousMode = m_mode; m_mode = mode; + updateDefaultZoomLevel(); + // Changing the mode might result in changing // the zoom level. Remember the old zoom level so // that zoomLevelChanged() can get emitted. @@ -2326,7 +2377,7 @@ void DolphinView::applyViewProperties(const ViewProperties &props) Q_EMIT modeChanged(m_mode, previousMode); if (m_view->zoomLevel() != oldZoomLevel) { - Q_EMIT zoomLevelChanged(m_view->zoomLevel(), oldZoomLevel); + zoomLevelChangeFrom = oldZoomLevel; } } @@ -2383,10 +2434,28 @@ void DolphinView::applyViewProperties(const ViewProperties &props) // Changing the preview-state might result in a changed zoom-level if (oldZoomLevel != zoomLevel()) { - Q_EMIT zoomLevelChanged(zoomLevel(), oldZoomLevel); + zoomLevelChangeFrom = oldZoomLevel; + } + } + + // Only check for folder zoom changes if we're using local view props + if (!GeneralSettings::globalViewProps()) { + const int propZoomLevel = props.zoomLevel(); + if (m_defaultZoomLevel < 0) { + updateDefaultZoomLevel(); + } + + const int nextZoomLevel = propZoomLevel < 0 ? m_defaultZoomLevel : propZoomLevel; + if (nextZoomLevel != m_view->zoomLevel()) { + zoomLevelChangeFrom = m_view->zoomLevel(); + m_view->setZoomLevel(nextZoomLevel); } } + if (zoomLevelChangeFrom > -1) { + Q_EMIT zoomLevelChanged(m_view->zoomLevel(), zoomLevelChangeFrom); + } + KItemListView *itemListView = m_container->controller()->view(); if (itemListView->isHeaderVisible()) { KItemListHeader *header = itemListView->header(); @@ -2409,6 +2478,14 @@ void DolphinView::applyViewProperties(const ViewProperties &props) m_view->endTransaction(); } +void DolphinView::updateDefaultZoomLevel() +{ + ViewModeSettings settings{m_mode}; + const int userDefaultIconSize = settings.iconSize(); + + m_defaultZoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(userDefaultIconSize, userDefaultIconSize)); +} + void DolphinView::applyModeToView() { switch (m_mode) { @@ -2694,6 +2771,12 @@ void DolphinView::updatePlaceholderLabel() m_placeholderLabel->setText(i18n("No MTP-compatible devices found")); } else if (m_url.scheme() == QLatin1String("afc") && m_url.path() == QLatin1String("/")) { m_placeholderLabel->setText(i18n("No Apple devices found")); + } else if (m_url.scheme() == QLatin1String("kdeconnect") && m_url.path() == QLatin1String("/")) { + if (m_url.host().isEmpty()) { + m_placeholderLabel->setText(i18n("No KDE Connect devices found")); + } else { + m_placeholderLabel->setText(i18n("No storage found on this device")); + } } else if (m_url.scheme() == QLatin1String("bluetooth")) { m_placeholderLabel->setText(i18n("No Bluetooth devices found")); } else { diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index e3f83979c..9b068f92e 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -10,6 +10,7 @@ #include "dolphin_export.h" #include "dolphintabwidget.h" +#include "kitemviews/private/kfileitemmodelfilter.h" #include "tooltips/tooltipmanager.h" #include "config-dolphin.h" @@ -277,6 +278,18 @@ public: QStringList mimeTypeFilters() const; /** + * Sets the filtering mode of the currently used nameFilter. + */ + void setFilterMode(KFileItemModelFilter::FilterMode mode); + KFileItemModelFilter::FilterMode filterMode() const; + + /** + * Enables or disable the caseSensitive matching of the currently used nameFilter. + */ + void setFilterCaseSensitive(bool caseSensitive); + bool isFilterCaseSensitive() const; + + /** * Tells the view to generate an updated status bar text. The result * is returned through the statusBarTextChanged(QString statusBarText) signal. * It will carry a textual representation of the state of the current @@ -622,6 +635,11 @@ Q_SIGNALS: void operationCompletedMessage(const QString &msg); /** + * Is emitted so the \a typeAheadFeedback is displayed to the user. Beware: \a typeAheadFeedback is HTML-escaped rich text. + */ + void showTypeAheadFeedback(const QString &typeAheadFeedback); + + /** * Is emitted after DolphinView::setUrl() has been invoked and * the current directory is loaded. If this signal is emitted, * it is assured that the view contains already the correct root @@ -791,6 +809,11 @@ private Q_SLOTS: void updateSortFoldersFirst(bool foldersFirst); /** + * Cache out zoom mode changes to prevent constant Settings requests + */ + void updateDefaultZoomLevel(); + + /** * Updates the view properties of the current URL to the * sorting of hidden files given by \a hiddenLast. */ @@ -1007,6 +1030,9 @@ private: // resolution scroll wheels) int m_controlWheelAccumulatedDelta; + // Cached out default zoom level after view mode changes + int m_defaultZoomLevel = -1; + QList<QUrl> m_selectedUrls; // Used for making the view to remember selections after F5 and file operations bool m_clearSelectionBeforeSelectingNewItems; bool m_markFirstNewlySelectedItemAsCurrent; diff --git a/src/views/viewproperties.cpp b/src/views/viewproperties.cpp index 03ab2bd58..3d33a805b 100644 --- a/src/views/viewproperties.cpp +++ b/src/views/viewproperties.cpp @@ -229,6 +229,7 @@ ViewProperties::ViewProperties(const QUrl &url) } else { m_changedProps = false; } + setZoomLevel(-1); } if (m_node->version() < CurrentViewPropertiesVersion) { @@ -269,6 +270,19 @@ ViewProperties::~ViewProperties() m_node = nullptr; } +void ViewProperties::setZoomLevel(int zoomLevel) +{ + if (m_node->zoomLevel() != zoomLevel) { + m_node->setZoomLevel(zoomLevel); + update(); + } +} + +int ViewProperties::zoomLevel() const +{ + return m_node->zoomLevel(); +} + void ViewProperties::setViewMode(DolphinView::Mode mode) { if (m_node->viewMode() != mode) { @@ -487,6 +501,7 @@ QList<int> ViewProperties::headerColumnWidths() const void ViewProperties::setDirProperties(const ViewProperties &props) { setViewMode(props.viewMode()); + setZoomLevel(props.zoomLevel()); setPreviewsShown(props.previewsShown()); setHiddenFilesShown(props.hiddenFilesShown()); setGroupedSorting(props.groupedSorting()); diff --git a/src/views/viewproperties.h b/src/views/viewproperties.h index bee1e7330..622a1c87e 100644 --- a/src/views/viewproperties.h +++ b/src/views/viewproperties.h @@ -44,6 +44,10 @@ public: void setViewMode(DolphinView::Mode mode); DolphinView::Mode viewMode() const; + void setZoomLevel(int zoomLevel); + /// -1 is the default zoom + int zoomLevel() const; + void setPreviewsShown(bool show); bool previewsShown() const; diff --git a/src/views/zoomwidgetaction.cpp b/src/views/zoomwidgetaction.cpp index 431ac4f62..2260d9754 100644 --- a/src/views/zoomwidgetaction.cpp +++ b/src/views/zoomwidgetaction.cpp @@ -61,9 +61,13 @@ ZoomWidgetAction::ZoomWidgetAction(QAction *zoomInAction, QAction *zoomResetActi { // This is a property that KXMLGui reads to determine whether this action // should be included in the shortcut configuration UI + // they are already added to the action collection setProperty("isShortcutConfigurable", false); setPopupMode(InstantPopup); popupMenu()->addActions({zoomInAction, zoomResetAction, zoomOutAction}); + + // but this should be accessible through command bar + setMenu(popupMenu()); } bool ZoomWidgetAction::eventFilter(QObject *object, QEvent *event) |
