Commit graph

520 commits

Author SHA1 Message Date
Christian Daniel Jensen
7864af9592 Replace Visual Deck Storage WUBRG filter with compact Essence dropdown 2026-11-03 12:13:29 -07:00
Christian Daniel Jensen
22714efc13 Add reusable compact multi-select Essence popup filter 2026-11-03 12:12:50 -07:00
Christian Daniel Jensen
4e21602fce Add reusable compact multi-select Essence popup filter 2026-11-03 12:12:47 -07:00
Christian Daniel Jensen
a950a1cf7f Replace legacy WUBRG visual deck filter with all fifteen Essence symbols 2026-11-03 03:38:48 -07:00
Christian Daniel Jensen
fd352db2f5 Display Essence-based curve analytics without MTG color assumptions 2026-11-02 05:58:37 -07:00
Christian Daniel Jensen
a896c0392c Display Essence-based curve analytics without MTG color assumptions 2026-11-02 05:58:34 -07:00
Christian Daniel Jensen
a1ce48651f Display Essence-based curve analytics without MTG color assumptions 2026-11-02 05:58:31 -07:00
Christian Daniel Jensen
c3d0ccee60 Display Essence-based curve analytics without MTG color assumptions 2026-11-02 05:58:28 -07:00
Christian Daniel Jensen
781f37b2a4 Preserve readable colors for non-Essence categories in shared chart components 2026-11-02 05:57:57 -07:00
Christian Daniel Jensen
f0adc0eaa6 Avoid Qt-version-specific qMakePair helper in Essence chart ordering 2026-11-02 05:56:44 -07:00
Christian Daniel Jensen
9dc118137d Update Essence statistics, filters and distribution panels for all fifteen symbols 2026-11-02 05:53:49 -07:00
Christian Daniel Jensen
5eefdf608f Update Essence statistics, filters and distribution panels for all fifteen symbols 2026-11-02 05:53:46 -07:00
Christian Daniel Jensen
68636bca7e Update Essence statistics, filters and distribution panels for all fifteen symbols 2026-11-02 05:53:42 -07:00
Christian Daniel Jensen
3f7a1003d1 Update Essence statistics, filters and distribution panels for all fifteen symbols 2026-11-02 05:53:40 -07:00
Christian Daniel Jensen
7fe590d54d Update Essence statistics, filters and distribution panels for all fifteen symbols 2026-11-02 05:53:38 -07:00
Christian Daniel Jensen
bd197ecf56 Update Essence statistics, filters and distribution panels for all fifteen symbols 2026-11-02 05:53:35 -07:00
Christian Daniel Jensen
faa459ac24 Use chart-only Essence palettes and canonical Essence ordering 2026-11-02 05:53:19 -07:00
Christian Daniel Jensen
d04736d81a Use chart-only Essence palettes and canonical Essence ordering 2026-11-02 05:53:16 -07:00
Christian Daniel Jensen
537002a1ee Use chart-only Essence palettes and canonical Essence ordering 2026-11-02 05:53:14 -07:00
Christian Daniel Jensen
80b4243351 Use chart-only Essence palettes and canonical Essence ordering 2026-11-02 05:53:10 -07:00
Christian Daniel Jensen
f1241ae726 Provide non-canonical display palette and ordering for Essence analytics 2026-11-02 05:52:49 -07:00
Christian Daniel Jensen
c108c4578e Replace MTG WUBRG analytics with explicit fifteen-type Essence counting 2026-11-02 05:50:45 -07:00
Christian Daniel Jensen
8ff6f324e6 Render and filter Continuum Universes Essence symbols instead of MTG mana 2026-11-02 05:50:18 -07:00
Christian Daniel Jensen
167d7cc431 Render and filter Continuum Universes Essence symbols instead of MTG mana 2026-11-02 05:50:07 -07:00
Christian Daniel Jensen
2bce66671f Render and filter Continuum Universes Essence symbols instead of MTG mana 2026-11-02 05:50:04 -07:00
Christian Daniel Jensen
93fd16dc3a Render and filter Continuum Universes Essence symbols instead of MTG mana 2026-11-02 05:50:01 -07:00
Christian Daniel Jensen
10d68be254 Render and filter Continuum Universes Essence symbols instead of MTG mana 2026-11-02 05:49:51 -07:00
Christian Daniel Jensen
3a96569a0f Support native Continuumatrice XML4 card databases and remove MTG server metadata fetching 2026-11-02 03:12:26 -07:00
Christian Daniel Jensen
ea9f35cfd4 Fix renamed Qt target references and remaining user-facing branding 2026-11-02 03:10:19 -07:00
Christian Daniel Jensen
f474b4268e Fix renamed Qt target references and remaining user-facing branding 2026-11-02 03:10:14 -07:00
Christian Daniel Jensen
a05b21c862 Replace upstream-facing About UI with Continuumatrice identity and upstream attribution 2026-11-02 03:06:06 -07:00
Christian Daniel Jensen
ce1c5d1d1e Complete standalone Linux URI and data import defaults 2026-11-02 03:05:33 -07:00
Christian Daniel Jensen
bacc30c248 Disable upstream MTG onboarding/importer and bootstrap Continuumatrice card data 2026-11-02 03:04:28 -07:00
Christian Daniel Jensen
786e73c3bf Isolate Continuumatrice URLs, updates, and card artwork sources 2026-11-02 03:03:28 -07:00
Christian Daniel Jensen
96a3eac7d1 Isolate Continuumatrice URLs, updates, and card artwork sources 2026-11-02 03:03:26 -07:00
Christian Daniel Jensen
121c6fe005 Isolate Continuumatrice URLs, updates, and card artwork sources 2026-11-02 03:03:18 -07:00
Christian Daniel Jensen
04e2fef170 Isolate Continuumatrice URLs, updates, and card artwork sources 2026-11-02 03:03:16 -07:00
Christian Daniel Jensen
0dbec26603 Isolate Continuumatrice URLs, updates, and card artwork sources 2026-11-02 03:03:13 -07:00
Christian Daniel Jensen
3349ba13c7 Rebrand Continuumatrice as an independent client target and product identity 2026-11-02 03:01:37 -07:00
Christian Daniel Jensen
7182da69d9 Rebrand Continuumatrice as an independent client target and product identity 2026-11-02 03:01:34 -07:00
Christian Daniel Jensen
d9bc828f21 Continuumatrice: isolate Linux executable and desktop identity (theme_manager.cpp) 2026-11-02 02:32:15 -07:00
Christian Daniel Jensen
a786c6a2a3 Continuumatrice: isolate Linux executable and desktop identity (window_main.cpp) 2026-11-02 02:32:07 -07:00
BruebachL
94e6281d87
[Logs] Browse room history without filters with paginated infinite scroll (#7531)
* [Logs] Browse room history without filters with paginated infinite scroll

* [Logs] Continue pagination when switching log tabs

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-11-02 07:36:49 +01:00
BruebachL
5134e72eb4
[Settings] Store server profiles with QSettings arrays (#7629)
The server list used hand-numbered saveName%1/server%1 keys and an O(n)
shift loop to delete entries. Store the profiles with beginReadArray and
beginWriteArray instead, and migrate the legacy keys once in the
constructor so existing profiles and saved passwords survive.

SettingsManager::batchWrite no longer disables atomic sync, so a batch is
still written through QSettings' atomic save. Add tests for add, update,
remove, password updates and the legacy migration.

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-11-02 07:30:29 +01:00
BruebachL
ce543896f5
[Tests] Use QtTest for model contracts and signal spies (#7630)
Qt6::Test was linked into every test but never used. Add a small RAII
QAbstractItemModelTester helper and apply it to the deck list model, the card
database model and display proxy, and the sets model. Add QSignalSpy coverage
for the card-added and download-settings signals, and assert explicitly that a
card row is a leaf with no child columns (the tester does not check that).

The contract checker immediately found four model bugs, fixed here:
- DeckListModel allowed children below non-zero columns.
- CardDatabaseModel reported every card as a child of every card row.
- CardDatabaseModel reported six columns for a valid (leaf) card index.
- CardDatabaseDisplayModel claimed more rows were fetchable while rowCount
  already exposed them all, so fetchMore() inserted duplicates.

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-11-02 07:27:43 +01:00
BruebachL
50a2ae9cc8
[Server/Client] Enforce and complete the forced password change at login (#7680)
checkUserPassword ignored force_password_change on the challenge-response
path, so a reset password stayed valid. Returning PasswordChangeRequired
was not enough on its own: the session was dropped and the client told the
user to ask the administrator for the temporary password they had just used.

The pending session now keeps its identity without registering a user
session or announcing a join, may only ping and change its password, and
the client completes the change in-session before reconnecting.

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-11-02 07:01:29 +01:00
BruebachL
345b0e8ba9
[Refactor] Move game logic into libcockatrice_game (#7437)
* [Refactor] Move game logic into libcockatrice_game

* [Refactor] Include card_state.h in player_actions.h

* [Game] Inject settings providers into libcockatrice_game, drop Widgets

* [Game] Follow base rename to createCardRequested after rebase

* [Game] Drop unused CardItem forward declaration

* [Game] Fix includes after moving game logic into libcockatrice_game

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-10-31 18:44:15 +01:00
BruebachL
6f0c5dca12
[Refactor] Move LoadedDeck and DeckFileFormat data types into libcockatrice_deck_list (#7424)
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-10-31 18:44:11 +01:00
BruebachL
73d5a2a0ab
[Refactor] Emit phase toolbar intent instead of protobuf commands (#7419)
Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-10-31 18:44:10 +01:00
sentry[bot]
bbc7e462ff
[Installer] Graceful close and a way out of a stuck update (#7687)
Some checks are pending
CodeQL / Analyze (cpp) (push) Waiting to run
CodeQL / Analyze (actions) (push) Waiting to run
Build Desktop / Configure (push) Waiting to run
Build Desktop / Debian 13 (push) Blocked by required conditions
Build Desktop / Debian 12 (push) Blocked by required conditions
Build Desktop / Fedora 44 (push) Blocked by required conditions
Build Desktop / Fedora 43 (push) Blocked by required conditions
Build Desktop / Servatrice_Debian 12 (push) Blocked by required conditions
Build Desktop / Ubuntu 24.04 (push) Blocked by required conditions
Build Desktop / Ubuntu 26.04 (push) Blocked by required conditions
Build Desktop / Arch (push) Blocked by required conditions
Build Desktop / Ubuntu 26.04 cover (push) Blocked by required conditions
Build Desktop / macOS 13 Intel (push) Blocked by required conditions
Build Desktop / macOS 14 (push) Blocked by required conditions
Build Desktop / macOS 15 (push) Blocked by required conditions
Build Desktop / macOS 26 Debug (push) Blocked by required conditions
Build Desktop / Windows 10 (push) Blocked by required conditions
Build Desktop / Prune caches (push) Waiting to run
Build Docker / Servatrice (arm) (push) Waiting to run
Build Docker / Servatrice (x86) (push) Waiting to run
Build Docker / Publish multi-platform Servatrice image (push) Blocked by required conditions
* [Installer] Stop calling the payload free while an executable is locked

The guard answered "nothing is holding the payload" from two lookups that can
both miss a running instance: Restart Manager does not reliably report a
program's own image or the modules it mapped, and the image path of a process
running under another account cannot be read from the probe at all. A user log
showed exactly that: the first guard passed while cockatrice.exe was running
from the directory, the old uninstaller silently skipped the file it could not
delete, and the update aborted half an uninstall later with "cancelled by user"
after a close attempt the running window ignored.

Ask the file itself. A running image is opened without write sharing, so the
write open replacing it needs is refused with ERROR_SHARING_VIOLATION for as
long as the program runs, while a file that is merely being read still accepts
it. When neither lookup named anybody and a payload executable refuses that
open, the probe answers that the file is in use and that the program holding it
could not be identified - the guard's "could not confirm" dialog, whose Retry
works once the user has closed it - instead of passing the payload as free.

Only the payload executables are tested, not every file the purge removes: a
locked executable proves a program is running and a mapped DLL belongs to a
running executable, while a locked DLL or qt.conf can be the asking process
itself, which is the loop the guard already had. The open is retried once after
300 ms, and only for the files that refused, so a scanner holding a file for a
moment cannot stop an install for nothing.

The Windows probe check now covers that answer: a payload executable held by
the asking process, so that it cannot be named, has to come back as in use
rather than as free.

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>

* [Installer] Close running clients over a local socket

The installer could only ask a running client to close with WM_CLOSE, which an instance hidden in the notification area or sitting on its own confirmation cannot answer usefully. Give every client a per-process local socket and have the holder probe ask it there first, falling back to WM_CLOSE for clients from before the socket.

* [Installer] Offer to check again or update by hand when files stay locked

Replace the two-answer guard prompt with force close, close by hand and check again, or cancel. Retry the automatic close while the set of holders changes, and point a cancelled run at the latest release so a user who does not want anything killed has a way forward that is not cancelling the update again.

---------

Co-authored-by: Lukas Brübach <Bruebach.Lukas@bdosecurity.de>
2026-10-31 15:32:59 +01:00