* Add scheme-variant theme asset resolution (#7209-1)
ThemeManager::assetPath() and schemeVariantPath() resolve a theme asset to its scheme-variant file (prefix-light/dark.png) with fallback to the plain asset, and themePixmap()/loadBrush()/loadExtraBrush() use them. CSS files load style-dark.css or style-light.css when present. Home widget re-resolves its background on theme change.
Link pixel_map_generator.cpp into the oracle target, which needs Qt6::Xml for QDomDocument.
* Fix clang-format wrap of theme format probe lists
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* [App] Add onboarding wizard
Took 10 minutes
Took 3 minutes
Took 7 minutes
Took 9 minutes
Took 2 minutes
Took 1 minute
Took 7 minutes
* Adjust CI
Took 14 minutes
Took 56 seconds
Took 2 seconds
Took 3 seconds
* Adjust CI again
Took 14 minutes
Took 2 seconds
* Comments and fixes
Took 9 seconds
Took 1 minute
* Rebase.
Took 5 minutes
Took 50 seconds
Took 15 seconds
* Comments.
Took 7 minutes
* CI lol
Took 3 minutes
* CI again lol
Took 4 minutes
* Drop some settings, add some new ones.
Took 19 minutes
* Resize when expanding section
Took 4 minutes
Took 3 minutes
Took 7 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* [UserList] Unify friends/online/ignored list with section dividers and add search bar.
Took 31 minutes
Took 7 seconds
* [UserList] Add a light mode theme
Took 12 minutes
Took 11 seconds
Took 5 minutes
Took 2 minutes
* [UserList] Re-sort when a user's online state changes
setUserOnline() flipped the online flag but never re-sorted, so a buddy
who went offline kept the position they had while online and stayed at
the top of the list. Re-sort (and re-apply the filter) whenever the flag
actually changes, mirroring processUserInfo().
Took 10 minutes
* [UserList] Show users in every section they belong to
The sectioned list used one row per user with a priority rule
(ignored > buddy > online), so an online buddy only appeared under
"Buddies" and never in the "Online" list. Sections are now pure
membership views: a user gets one row per section they belong to, so an
online buddy appears under both "Online" and "Buddies".
- Track rows per (section, user) in sectionUsers instead of reparenting
a single row; the name->primary-row map is kept for external lookups.
- Rebuild, presence and buddy/ignore mutations create/drop rows per
section instead of moving a single row between sections.
- Dropping one membership no longer removes the user from the other
sections.
* [UserList] Keyboard navigation for section dividers, popup on selection
Section dividers were not selectable, so arrow-key navigation skipped
them entirely, and the user popup only appeared on hover or click. Now:
- Dividers are selectable, so Up/Down navigation lands on them; they act
as collapsible headers once focused (Enter/Space toggle, Left/Right
collapse/expand per tree convention), with a focus indicator drawn by
the existing delegate.
- The popup follows keyboard selection via currentItemChanged, exactly
like mouse hover, and closes when the selection moves to a divider or
leaves the list.
- The popup anchors on the hovered/selected row instead of a user-name
lookup, so with duplicate rows (online + buddy) it stays attached to
the row under the mouse/cursor.
- Left-arrow now actually collapses an expanded section divider: the
collapse branch hardcoded the target expansion state to 'expanded',
making the key a no-op.
- The user popup no longer flashes through a fade when hopping between
users (hover or arrow-key navigation): a content swap keeps it opaque,
and pending show/hide timers are cancelled so an armed hover timer
cannot override a keyboard-selected row or a pending hide kill the
newly shown popup.
- Bulk rebuild defers per-row divider-count updates to endBulkLoad(),
removing the quadratic recount during large online-list loads.
- handleOnlineChangeLeft/handleListRemove skip the sort+filter+repaint
when nothing actually changed.
* [UserList] Tune the role row gradient colors (dark parity, light mode)
Dark mode is byte-for-byte the pre-branch painter profile, with the
original saturated-left to navy-right fade restored verbatim. Light mode
uses the same language at high tint strength: role rows get colored
fades (0.75/0.65 left to 0.18/0.10 right), and regular users get flat
warm paper cards (AlternateBase) instead of the grey slate.
* [UserList] Deselect the list and close the popup on outside clicks
Clicking anywhere outside the tree, the popup or an open menu now clears
the selection and hides the popup, so a pinned popup does not stay open
when the list loses focus.
- The application-wide event filter watches every mouse press and treats
a press as inside the list UI only when its target is the tree, the
popup or an open menu (parent-chain walk), so a click on another list,
a tab or the window background deselects.
- A hover popup now also closes when the cursor leaves the hovered row.
The hide timer previously checked whether the cursor was over the
tree, which is always true over empty list space and section dividers,
so the popup stayed open after moving off the user.
- Deselection keeps the current item so keyboard navigation is not
disturbed, and the pinned flag is dropped before hiding so the
selection-changed handler does not hide twice.
Took 15 minutes
* [UserList] Use an enum for the list sections
The section identifiers were stringly-typed: eleven hardcoded
QStringLiteral comparisons scattered through user_list_widget.cpp, and
the display path (sectionTitle) maps every id through tr() anyway, so
the raw strings were never shown. A typo compiled fine and silently
broke a section.
- enum class Section { Buddy, Online, Ignore } replaces the section
strings across the sectioned-list API (setSectioned, getSectionIds,
setSectionExpanded, the sectionExpanded signal and all membership
helpers), giving compile-time checks at every call site.
- sectionTitle becomes a switch over the enum and the dead raw-string
fallback is gone.
- The expanded-section state persists the same stable keys via the
panel widget boundary, so existing settings files survive unchanged.
- The divider reverse lookup in handleSectionExpansion no longer relies
on an empty-string sentinel from QMap::key; it scans the three
dividers and bails when the item is not one of them.
Took 12 minutes
# Commit time for manual adjustment:
# Took 2 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* [Settings] Split cache_settings into multiple files
Took 9 minutes
Took 4 minutes
* [Settings] Fwd declare settings classes in cache_settings
Took 15 minutes
* Fix oracle includes.
Took 8 minutes
* Address comments, fix windows CI
Took 8 minutes
* fix copy constructor visibility
Took 3 minutes
* lint
Took 2 minutes
* Fix native format tests.
Took 5 minutes
* Remove test header guard
Took 4 seconds
* Remove tests invalid in CI environ
Took 24 seconds
* Adjust to rebase.
Took 11 minutes
* Change settings file name.
Took 8 minutes
---------
Co-authored-by: Lukas Brübach <lukas.bruebach@bdosecurity.de>
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* [PaletteEditor] Ensure directory is writeable, don't fall back to alternate palette.
Took 17 minutes
* [ThemeManager] Extract system theme dir path resolution to helper, use it in default palette fetching
Took 8 minutes
* [ThemeManager] Expose styling again
Took 3 minutes
* [ThemeManager] Capture app palette before theme is applied for reverting
* [ThemeManager] Simply delete custom palette instead of reverting to default
* [ThemeManager] Generate and apply immediately on change.
* [PaletteEditor] Block grid signals during initial loading.
Took 5 minutes
* Address comments
Took 8 minutes
* Seed accent from scheme on reset and revert
Took 2 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* Add subtype breakdown counter for card selection
Display a categorized count of creature subtypes (and other card type
subtypes) when multiple cards are selected. The breakdown appears above
the total selection counter in the bottom-right corner.
Subtypes are grouped by main card type and sorted by frequency, with
the most common subtypes positioned adjacent to the total count for
quick reference. The feature can be toggled via a new checkbox in
Settings > User Interface.
* Alignment fix
* Computation logic moved to helper funtction in separate file
* Rename SubtypeCounter to SubtypeTally
* Fix subtype tally alignment by using grid layout instead of character padding
* Rename count to tally in the subtype breakdown feature
* partial rename
* list position fixed
* Clean up code and documentation
* Rename subtypeCountLabelStyle to subtypeTallyLabelStyle and fix include ordering
* Fix include path for selection_subtype_tally.h after file relocation
* fixed count to tally rename inconsistencies
* [App/Theme] Palette Editor
Took 1 minute
Took 1 hour 47 minutes
Took 6 seconds
Took 3 minutes
Took 5 minutes
Took 3 minutes
* Add oracle, add palette files and configs.
Took 10 minutes
* Fix a stupid include mistake, thanks IDE
Took 3 minutes
Took 20 seconds
* Includes.
Took 4 minutes
* Fix ampersand not displaying correctly.
Took 14 minutes
* Longer variable names.
Took 10 minutes
Took 5 seconds
* Change ampersand everywhere
Took 23 seconds
* Doxygen properly.
Took 1 minute
* Remove namespace, fold I/O into structs.
Took 12 minutes
* Remove namespace, fold I/O into structs.
Took 33 seconds
* Alphabetize.
Took 35 seconds
* Lint.
Took 49 seconds
* Add a combo box to quick switch settings.
Took 19 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* style: Add braces to all control flow statements
Standardize code style by adding explicit braces to all single-statement
control flow blocks (if, else, for, while) across the entire codebase.
Also documents the InsertBraces clang-format option (requires v15+) for
future automated enforcement.
* InsertBraces-check-enabled
* Utility method to check if a theme is supposed to be in dark or light mode.
Took 22 minutes
Took 4 seconds
* Method is public.
Took 3 minutes
* Add a utility method to check if we're using a built-in theme
Took 3 minutes
Took 3 seconds
* Use built-in theme detection for home screen.
Took 6 minutes
* Re-polish on theme change
Took 2 minutes
* Fetch background on theme change.
Took 4 minutes
Took 6 seconds
* No need to double polish.
Took 4 minutes
* No need to repaint.
Took 32 seconds
* Only repolish visible widgets.
Took 5 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
* Use fusions own palette.
Took 6 minutes
* Start from default palette always.
Took 4 minutes
* Add modern style.
Took 24 seconds
* Scope this fix to Windows.
Took 4 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
Adds a new default theme that causes the QT Fusion theme to be
selected. This theme looks a bit nicer than 'Windows' and supports
both light and dark mode out of the box.
* Have CardDatabase::getPreferredPrintingInfo respect card provider ID overrides (pinned printings)
Took 13 minutes
Took 37 seconds
Took 10 seconds
Took 10 seconds
# Commit time for manual adjustment:
# Took 30 seconds
Took 15 seconds
Took 8 minutes
Took 21 seconds
* Move settings cache and settings card preference provider out of libcockatrice_settings and into cockatrice
Took 52 minutes
Took 9 minutes
Took 1 minute
* Temp cache.
Took 16 minutes
* Dependency Injection for SettingsCache
* Turn SettingsCache into a QSharedPointer.
* Implement interfaces for settings that need it
Took 2 hours 38 minutes
* Adjust oracle.
Took 5 minutes
* Move abstract/noop interfaces to libcockatrice_interfaces so they can be linked against independently.
Took 52 minutes
* Clean up some links.
Took 3 minutes
* Cleanup two includes.
Took 3 minutes
* More fixes.
Took 7 minutes
* More includes that slipped past.
Took 3 minutes
* Stop mocking and start injecting for tests.
Took 15 minutes
* I don't know why remote_client was including main.
Took 4 minutes
* Include.
Took 3 minutes
* Lint.
Took 2 minutes
* Don't use Qt pointers.
Took 1 hour 7 minutes
* Make parser use CardSettingsInterface
Took 13 minutes
* Also adjust constructor lol.
Took 8 minutes
* Lint.
Took 32 minutes
* Revert "Lint."
This reverts commit ecb596c39e.
Took 3 minutes
* Test.
Took 3 minutes
---------
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>