Historically, we should the version build date wherever we display
the current ScummVM version.
However, this leads to issues with toolchains that care about reproducible
builds and thus set "fake" timestamps, e.g.
https://github.com/flathub/org.scummvm.ScummVM/pull/60#issuecomment-4150167445
Since we can derive the approximate release date based on our
new versioning scheme, it makes sense to hide the build date
from release builds and only use it for development builds
to keep track of "old" and "new" builds.
The Launcher search box supports rich syntax as documented
(e.g. engine:, platform:, lang=). This works correctly in
List view but was not working in Grid (Icons) view.
In Grid view, advanced expressions were ignored because
the filter logic was not hooked into GridWidget.
Connect GridWidget to the existing Launcher filter matcher so
Grid view uses the same search implementation as List view.
It leads to the Markdown help. In the launcher we show button
only on highres, non-classic themes, due to absence of vertical space
Also bump the theme version.
Move confirmRemoveGames() to LauncherDialog base class to eliminate code
duplication between list and grid views. Populate _domainTitles for both
views to ensure proper game titles are displayed in removal dialogs.
Moves the inline method implementation from the class declaration to a
separate method body, improving code organization and consistency with
other launcher methods.
Replace removeListGames() and removeGridGames() with a single virtual
confirmRemoveGames() method in LauncherDialog. Move selection validation
logic and selection array retrieval into each subclass implementation,
eliminating duplicate checking code in command handlers. Simplify
LauncherSimple and LauncherGrid removal logic while maintaining the
same functionality.
Add getVisualPos() method to ListWidget to convert real data indices to
visual indices in filtered/grouped lists. Simplify selection restoration
in both LauncherSimple and LauncherGrid using MIN() to handle out-of-bounds
cases cleanly. Move _lastSelectionStartItem to public for direct access.
Add counter to removal confirmation dialog displaying total number of
games to be removed. Display maximum 10 game names with ellipsis if
more games are selected, improving UX for bulk removals.
Optimize selection counting with early exit, and fix Remove/Load button
state by using explicit hasSelection flag instead of relying on stale
_selectedItem. This ensures buttons properly disable when all items are
deselected.
Replace duplicate addSelectedItem() and removeSelectedItem() methods with
a single markSelectedItem(int item, bool state) method in both ListWidget
and GridWidget. Update all callers across list.cpp, grid.cpp, groupedlist.cpp,
and launcher.cpp to use the new unified method.
- Replace int array _selectedEntries with bool array _selectedItems in GridWidget
- Rename getSelectedItemsBool() to getSelectedItems() in ListWidget
- Update performGameRemoval() to accept bool array parameter
- Simplify selection logic and improve deletion efficiency
Consolidate single and multi-removal logic to use multi-removal functions
in both LauncherSimple and LauncherGrid. Remove unnecessary branching and
add validation to ensure at least one item is selected before removal.
Switch ListWidget multi-selection tracking from Common::Array<int> to Common::Array<bool> for add, remove, and lookup operations.
Update all selection-related methods and launcher integration
Previously, grid view grouped games by internal title, causing mismatches with list view. Now, both views use the user-defined game description for alphabetical grouping, ensuring consistent group headers. Other grouping modes are unchanged.
Refactor game removal logic to reduce duplication between grid and list views.
Fix an issue in ListWidget where shift-click multi-selection updated the anchor
before selecting the range. The anchor is now updated after the range selection,
ensuring multi-selection works as expected.
When Delete key is pressed in the list view and multiple items are selected, call removeMultipleGames(selectedItems) to show the multi-selection confirmation dialog. Single-item behavior is unchanged.
Move duplicated removal logic into a new LauncherDialog::removeGamesWithAddons() helper and call it from LauncherSimple::removeMultipleGames() and LauncherGrid::removeSelectedGames(). The helper removes a game domain, its add-ons, and flushes configuration to disk. Reduces duplication and ensures consistent behavior across launcher views.
Change the confirmation prompt shown when removing multiple game configurations in List view. Previous wording: "Are you sure you want to remove the following games?" Now: "Do you really want to remove the following game configurations?"
Co-authored-by: Eugene Sandulenko <sev@scummvm.org>
- Added _multiSelectEnabled flag to ListWidget and GridWidget (default: false)
- Added setMultiSelectEnabled() and isMultiSelectEnabled() methods
- Gated Ctrl+Click and Shift+Click logic behind _multiSelectEnabled check
- GroupedListWidget inherits this behavior from ListWidget
Implement multi-selection in the launcher grid:
• Ctrl + Click toggles selection of individual entries
• Shift + Click selects a contiguous range from the last to the current selection
• Selected entries are consistently stored in sorted order
• Removal confirmation dialog now shows user-friendly game names
• Improved modifier key handling for reliable Ctrl and Shift detection
• Enable multi-selection in the launcher list widget (mouse, Ctrl+Click, Shift+Click).
• Update button states: disable Start, Load, and Game Options when multiple entries are selected.
• Add batch removal confirmation dialog listing selected entries.
• Refactor selection logic and highlighting in both filtered and grouped views.
• Fix group header fold indicator rendering for better UI consistency.
- Display add-ons greyed out under their base game in list mode (unless
some grouping is active)
- Add an "- Add-on" suffix to add'ons' description
- Hide add-ons in grid mode
- Ensure add-ons cannot be run, edited or removed from the launcher
- Ensure removing the base game also removes all its add-ons
When rebuilding the list of games for the grouped list widget we
need to apply the filter after reloading the list of closed groups.
Otherwise the filter is lost when we set the closed groups.