| Age | Commit message (Collapse) | Author |
|
testWindowTitle compares the window title against fixed strings such as
"Home" and "Trash". On a machine configured for another language the
title comes back translated, for example "Dossier Personnel", and the
test fails.
Set the language environment variables to English in main(), before
QApplication is constructed and before any translation is loaded, so the
comparisons are deterministic regardless of the machine's configured
language.
|
|
On Windows QFileInfo::isWritable() returns true for a directory that
carries the read-only attribute, because the attribute does not prevent
creating child files. It does prevent writing the directory's own
extended attribute, the Alternate Data Stream where the view properties
are stored, so the save fails with access denied and the settings are
lost.
Detect the read-only attribute with GetFileAttributesW and store the view
properties in the destination directory instead, the same way a directory
without write permission is handled on other platforms.
The read-only directory test checks that the properties land in the
destination directory.
|
|
dolphinmainwindowtest requires a real window server
no_bare_qwait_in_tests requires bash and only serves as lint, so linux only is OK
|
|
|
|
Replace the setting "Switch between views with Tab key" with a
dedicated "Focus Other View" action (which can be bound to the Tab key
if the user wants to).
The "Focus Other View" action moves the keyboard focus to the inactive
split view. When there is no other view, split view is triggered
instead. The action is located in `Menubar>View`.
### Motivation
The Tab key is essential for keyboard navigation within an application.
The old "Switch between views with Tab key" setting forces users to
give up on the intended purpose of the Tab key, which means many
keyboard-bound users currently do not have a way to switch between
views when using the "Split" feature. The dedicated "Focus Other View"
action gives users more control, and they can change the keyboard
shortcut as they are used to.
|
|
testThumbnailAfterRename waited for KFileItemModelRolesUpdater::previewJobFinished
after renaming a.jpg to b.jpg. That signal is only emitted when a new preview is
generated successfully (slotGotPreview), but a rename keeps the file's content and
its already-correct thumbnail, so whether a fresh preview job runs at all is timing-
and platform-dependent. On FreeBSD CI none is produced, so the wait timed out.
Assert the actual outcome instead: the renamed item still shows a non-null preview
pixmap. This passes whether the thumbnail is regenerated, inherited across the
rename, or cache-served, and still fails if a rename ever drops the preview.
|
|
When scrollTo() is asked to move to the position the scrollbar already
holds (clamped, e.g. an item at the bottom, or a sub-pixel offset), no
animation runs and scrollingStopped() was never emitted. Callers waiting
for it stayed blocked: KItemListView::scrollToItem() delegates to scrollTo
for any non-zero offset, and DolphinView::renameSelectedItems() only opens
the inline rename editor once scrollingStopped() arrives. So inline rename
silently did nothing for the affected items.
Emit scrollingStopped() in the no-op case too, and add a regression test.
|
|
The button allows to restore to defaults, in case you are using the
per-folder view properties settings.
The button disables or enables itself whether or not it matches the
defaults view settings.
|
|
Add an explicit group role to Dolphin views so items can be grouped independently from the active sort role.
Previously, Dolphin's grouped view always used the current sort role as the grouping criterion. This meant that grouping and sorting were tied together, for example grouping by type also required sorting by type.
This change adds a separate Group By menu. It replaces the previous Show in Groups toggle and allows the user to disable grouping, keep the old Same as Sort behavior, or explicitly group by a selected criterion.
When an explicit group role is set, the model keeps groups stable and uses the normal sort role as a secondary key inside each group. The roles
updater also receives the active group role, so roles used only for grouping are still updated correctly.
BUG: 416134
CCBUG: 510670
CCBUG: 513235
CCBUG: 46393
|
|
|
|
In a fresh test environment there is no saved session, so the places panel may
not be visible. Explicitly show it before testing.
Additionally, focus-related assertions require the window to be the active
window — setFocus() on dock widget contents has no effect on an inactive window.
Replace the weak QTRY_VERIFY_WITH_TIMEOUT(activeWindow() != nullptr, 100) with
requestActivate() + qWaitForWindowActive() to enforce this precondition.
|
|
Dolphin was missing copyright and license information on ~750 files,
which would cause the KDE CI job `gitlab-templates/reuse-lint.yml` to fail.
This commit makes the project fully compliant with REUSE Specification 3.3.
REUSE.toml is used for file categories that cannot carry inline comments
or are managed externally:
- po/**: covered with precedence=aggregate so the bulk declaration
combines with individual translators' existing inline headers
- **/*.kcfg, **/*.kcfgc: KConfigXT schema files, no comment syntax
- doc/*.png: documentation screenshots
- src/icons/*.png: application icons (LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL)
- src/**/*.{qrc,rc,desktop,xml,json,knsrc,upd,in}: resource and
metadata files without usable comment syntax
- .gitignore, .git-blame-ignore-revs: infrastructure, CC0-1.0
- logo.png: application artwork (LGPL-3.0-only OR LicenseRef-KDE-Accepted-LGPL)
Inline SPDX headers are added to all source files that support comments
(C++, QML, CMake, shell scripts, Python). A small number of remaining
binary or single-purpose files retain individual .license sidecars.
License inference heuristic (applied per file, in order):
1. Existing inline SPDX-License-Identifier — reused as-is
2. Most common license among sibling files in the same directory
that already carry SPDX info, excluding infrastructure filenames
(.gitignore etc.) and requiring at least two qualifying neighbors
to prevent a single CC0 CI config from pulling source files along
3. Default: GPL-2.0-or-later
Copyright years and authors are sourced from `git log --follow` per
file. Automation accounts (l10n daemon [email protected], Weblate) are
excluded from author lists. If more than 5 authors are found only a
generic KDE Contributors was used.
|
|
|
|
Two tests via new simulateDragMove/simulateDragLeave helpers:
- testDragMoveHoverIdempotency: repeated drag-move over the same item
must not emit itemHovered more than once; moving to a different item
must emit itemUnhovered/itemHovered exactly once each.
- testDragLeaveHoverCleanup: dragLeaveEvent must emit itemUnhovered for
the currently hovered item and nothing when no item is hovered.
|
|
|
|
Bare qWait(N) calls in tests are easy to reintroduce inadvertently.
Add a ctest check that greps test sources for qWait() and fails if
any call is found without an // UNAVOIDABLE: comment on the same line.
The error message explains why the pattern is forbidden, lists the
signal-based alternatives, and shows how to suppress the check for
the rare cases where no signal or pollable condition exists.
|
|
Fixed-time sleeps are a source of intermittent failures on slow CI
machines — if the delay is too short, the test races ahead of the
code under test.
Replacements made:
- dolphinmainwindowtest: qWait() calls replaced with QTRY_COMPARE,
QTRY_VERIFY, qWaitFor lambdas and processEvents() where animations
are disabled; one genuinely unavoidable timer wait marked
// UNAVOIDABLE:
- kitemlistcontrollerexpandtest: qWaitFor(..., 100ms) / qWaitFor(...,
300ms) replaced with spy->wait() loops that block until all
expected directoryLoadingCompleted signals have arrived
- kitemlistkeyboardsearchmanagertest: timer-driven wait marked
// UNAVOIDABLE: (must wait for keyboard search timeout to expire)
Add testhelpers.h providing TestHelpers::disableAnimations(), which
eliminates the need for delays that previously waited for Qt UI
animations to settle.
|
|
When saving view properties to extended attributes failed with NoSpace,
the code cleared the xattr entry and returned without writing anything
to disk. The .directory fallback file was never created, silently
losing the user's view settings.
Fix by copying the current settings into a file-backed KConfig pointing
to .directory whenever the xattr write returns NoSpace. The copy uses
KConfigGroup::copyTo per group (not KConfig::copyFrom, which replaces
the entire entry map) so that unrelated groups already present in
.directory — such as a [Desktop Entry] group carrying a custom folder
icon — are left untouched by sync().
|
|
view props enabled
When "Use common display style for all folders" is enabled, the useDefaultSettings condition was always true because useGlobalViewProps was the first term in the OR chain. This caused special folders controlled by useSearchView, useTrashView, and useRecentDocumentsView to reset to their default view on every load, overriding any user customization.
Restrict the unconditional default-apply to non-special folders only. For special folders, the existing timestamp-based check handles the logic correctly, and the fallback in the else branch still applies defaults when no saved properties exist (first visit).
BUG: 520089
|
|
|
|
to change menuBar visibility
The menubar check was defined by menubar isHidden var. The logic has
been reverted. The toggleShowMenuBar func was simply inverting the
isVisible var. Now it's being set the menubar isChecked value.
This led to testedObjectsSizeAfterTraversingForwards=10 instead of 11
(apparently there was a phantom object), so adjust the comparation
in dolphinmainwindowtest.
BUG: 492298
|
|
Natural sorting already handled plain numeric chunks, but names containing dots between numeric segments were still ordered lexically in important cases. This broke expected ordering for decimal-style names like 0.09 and 0.1, and for version-like names such as v1.2.3 and v1.2.10.
Teach KFileItemModel's natural string comparison to recognize dotted numeric chains instead of relying solely on QCollator's numeric mode. Compare two-part numeric chains (e.g. 0.09 vs 0.1) as decimal values, and compare longer chains segment by segment like version numbers, while still treating real file extensions separately so names like 1.09.txt keep working correctly.
Add a direct unit test for KFileItemModel::stringCompare covering decimal-style names, version-like dotted numeric names, numeric basenames with extensions, leading-dot names, and the non-natural sorting fallback.
BUG: 411707
|
|
When switching tabs with split view enabled and the filter bar visible,
a storm of activation calls is triggered and at the end signal/slot
connections for both views is a mess (no listeners, navigation buttons
linked to unfocused view etc.).
Disconnect DolphinTabPage slot when it changes its own state.
BUG: 508554, 512011, 508405, 511076, 503576
|
|
|
|
|
|
Adds ZoomLevel flag to the directory and uses it instead of global settings when globalViewProps is set to false.
CCBUG: 169405
|
|
|
|
|
|
The mouse events need to modify the keyboard anchor assignments as well,
because selecting an item with a mouse and then navigating with keyboard
wouldn't follow the same selection.
BUG: 508609
|
|
So the new folder is in view.
|
|
It turns out that since f6c97d52220be9bd996b71309051e56ff7aa1834 a temp file is created here with each `save()` call for this default config, which is not deleted later. In another place where `defaultProperties()` is called for `m_node`, the file is deleted in the destructor of this class. But it is not deleted here.
So, remove temp file after loading defaultConfig or it will create temp file on each save() operation in /tmp folder.
Also keep the global/.directory file when xattr isn't supported.
BUG: 510500
|
|
Q_CHECK_PTR (other than the name suggests) is intended only to check the
success of memory allocations.
Using it for any pointers instead can be misleading due to the
"Out of memory" log printed in case of hits.
|
|
This reverts commit 122fee5625f0285ec4ebda79162c72390989eb2a.
This behavior change was well-intentioned, but has significant usability
and speed drawbacks that have not been addressed:
- Keyboard-driven folder manipulation became slower
- Unexpected behavioral differences when opening files with the pointer
compared to when opening them with the keyboard introduced
inconsistency and cognitive load
- Unexpected opening of selection mode during fast operation introduced
the potential for confusion and additional errors
- Dolphin's behavior became inconsistent with that of other file
managers users may be accustomed to
The bug tracker, discuss.kde.org, and Reddit are full of complaints
about this change. It's been a year now; I think it's clear that many
Dolphin users have not gotten used to and accepted it. I have to count
myself as one of them, I'm afraid. I've tried to get used to it for a
year, but I just have not been able to.
I don't believe the benefits of this change outweigh the drawbacks, so
let's revert it.
24d859cf19e90fa22ed687b36a68231625c1bd80 was explicitly mentioned as a
thing that should also be reverted in this case, but it's already been
done.
BUG: 494125
BUG: 511966
CCBUG: 424723
CCBUG: 492404
FIXED-IN: 25.12.0
|
|
The original keyboard search implementation had a limitation when dealing with files containing repeated characters like 44.txt. When typing 44, it would trigger rapid navigation to the next item starting with 4 instead of matching the full string 44.
This patch introduces a smarter search strategy:
1. First attempt full string matching for exact file names
2. If full match fails and user is typing repeating characters, fall back to rapid navigation using either:
- Last successful search string (for extended searches like 444 -> 4444)
- First character only (original rapid navigation behavior)
The changes include:
- Modified changeCurrentItem signal to include a found parameter for search result feedback
- Added m_lastSuccessfulSearch to track successful searches for better fallback behavior
- Used Qt::DirectConnection to ensure synchronous execution for immediate result feedback
This provides better user experience when searching for files with repeated characters while maintaining the rapid navigation feature for quick browsing.
BUG: 501851
|
|
|
|
|
|
|
|
renaming a folder
In a split-view tab, the child folder is opened in the left view and other tabs, while the parent folder is opened in the right view. After renaming the child folder from the right view:
- The activated view should not switch to the left view.
- All tab titles should be updated.
CCBUG: 496414
|
|
Found via `codespell -S "*.desktop,*.po,*.svg,*.xml,./po" -L aparent,childs,goup,lokal`
|
|
|
|
Added a 'dynamic view' option, which allows to switch from a 'compact' or 'details' view to an 'icons' view if most of the files in the directory are images or videos. It reverts to the previous view mode when we switch to a directory which doesn't meet that criteria.
The view mode is only changed once so users don't have to undo that for specific folders when they don't want icon view.
A setting is added in the "Display style" section of the general view setting page.
BUG: 491139
|
|
|
|
This huge commit is a nearly complete rewrite of the Dolphin search
code. It implements most of the improved Dolphin search UI/UX as
designed and discussed in a collaborative effort by Kristen McWilliam,
Jin Liu, Andy Betts, Tagwerk, a few others and me.
See https://invent.kde.org/system/dolphin/-/issues/46.
# Notable changes
- A toggle to change the search tool is provided as most contributors
deemed that useful in
https://invent.kde.org/system/dolphin/-/merge_requests/642#note_985112.
- The default search is changed to filenamesearch for maximum
reliability.
- Removing all search parameters will take users back to the view state
prior to starting a search instead of keeping the search results open.
- The UI for choosing file types or modification dates has been made
more powerful with more granularity and more options.
- Most search parameters can be configured from a popup menu which
gives us extra space for extra clarity.
- Labels and help buttons as well as hyperlinks to settings makes sure
the user always knows why some search parameters are unavailable in
some contexts.
- Chips show important search parameters while the popup is closed.
They allow quickly removing filters.
- The titles of the search and the input field placeholder message
change to make clear whether file names or file contents are searched.
- When the user actively switches the search tool, whether content
should be searched, or whether to search everywhere, this is preserved
for the initial state of the search bar when the user opens it the next
time after restarting Dolphin.
# Architecture
- The new DolphinQuery class is independent of the UI and contains all
search parameters modifiable in Dolphin as easy setters and getters.
- DolphinQuery objects are also used to update the states of every
component in the search UI. There is now a clear separation of UI and
search configuration/DolphinQuery.
- DolphinQuery is responsible for exporting to and importing from
search URLs.
- The search UI always reflects the currently configured DolphinQuery
no matter if the user changed the UI to change the DolphinQuery or
loaded a DolphinQuery/older search URL which then is reflected in the
UI.
- I tried to simplify all classes and their interaction between each
other as much as possible.
- I added some tests
BUG: 386754
CCBUG: 435119
CCBUG: 458761
BUG: 446387
BUG: 470136
CCBUG: 471556
CCBUG: 475439
CCBUG: 477969
BUG: 480001
BUG: 483578
BUG: 488047
BUG: 488845
BUG: 500103
FIXED-IN: 25.08
|
|
- Statusbar has three modes: Small, FullWidth and Disabled
- FullWidth is the original statusbar
- Small is the new default statusbar
- This statusbar overlays on top of the items instead of taking space
- It changes size according to content
- Disabled turns statusbar completely off
- Zoom slider and space information is only shown in full-width statusbar
- Space information is now always on
- If user navigates with keyboard, or scrolls to selection, the scrolling will take the statusbar into account
- This makes sure the statusbar does not cover any items
Related discussion: https://invent.kde.org/system/dolphin/-/issues/50
|
|
Search from the next position for new search and special repeated key search.
Otherwise search from the current position, which is current selected item if
something is selected or in selection mode, and 0 (the beginning) otherwise.
Test plan:
- create directory with files ab1, ab2, and ab3
- click ab2, and press escape to deselect
- type ab; verify that ab1 is selected
- wait a while, type ab again, verify that ab2 is selected
- wait a while, type ab again, verify that ab3 is selected
- click ab1, type ab, verify that ab2 is selected
BUG: 422951
|
|
NO_CHANGELOG
|
|
|
|
When they match the hardcoded internal settings, when they should be
kept as long as they don't match the currently set default
viewproperties.
Is saved in metadata the diff with the hardcoded internal defaults
still. A stable default reference allows to change defaults without
changing existing saved viewproperties.
CCBUG: 495878
|
|
BUG: 462899
|
|
When using keyboard search, normalize the item names and remove marks
first. Now, items containing characters with marks can be found using
keyboard search.
BUG: 482394
|