Merge branch 'master' into 6269/ci/strip-fat-bins

This commit is contained in:
Bruno Alexandre Rosa 2025-12-14 14:12:36 -03:00 committed by GitHub
commit 4414219f72
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
393 changed files with 6943 additions and 2264 deletions

View file

@ -46,7 +46,8 @@ Latest <kbd>beta</kbd> version:
- [Magic-Token](https://github.com/Cockatrice/Magic-Token): MtG token data to use in Cockatrice - [Magic-Token](https://github.com/Cockatrice/Magic-Token): MtG token data to use in Cockatrice
- [Magic-Spoiler](https://github.com/Cockatrice/Magic-Spoiler): Script to generate MtG spoiler data from [MTGJSON](https://github.com/mtgjson/mtgjson) to use in Cockatrice - [Magic-Spoiler](https://github.com/Cockatrice/Magic-Spoiler): Script to generate MtG spoiler data from [MTGJSON](https://github.com/mtgjson/mtgjson) to use in Cockatrice
- [cockatrice.github.io](https://github.com/Cockatrice/cockatrice.github.io): Code of the official webpage of the Cockatrice project - [cockatrice.github.io](https://github.com/Cockatrice/cockatrice.github.io): Code of the official Cockatrice webpage
- [Cockatrice @Flathub](https://github.com/flathub/io.github.Cockatrice.cockatrice): Configuration for our Linux `flatpak` package
# Community Resources [![Discord](https://img.shields.io/discord/314987288398659595?label=Discord&logo=discord&logoColor=white)](https://discord.gg/3Z9yzmA) # Community Resources [![Discord](https://img.shields.io/discord/314987288398659595?label=Discord&logo=discord&logoColor=white)](https://discord.gg/3Z9yzmA)
@ -54,6 +55,7 @@ Latest <kbd>beta</kbd> version:
Join our [Discord community](https://discord.gg/3Z9yzmA) to connect with other projet contributors (`#dev` channel) or fellow users of the app. Come here to talk about the application, features, or just to hang out. Join our [Discord community](https://discord.gg/3Z9yzmA) to connect with other projet contributors (`#dev` channel) or fellow users of the app. Come here to talk about the application, features, or just to hang out.
- [Official Website](https://cockatrice.github.io) - [Official Website](https://cockatrice.github.io)
- [Official Wiki](https://github.com/Cockatrice/Cockatrice/wiki) - [Official Wiki](https://github.com/Cockatrice/Cockatrice/wiki)
- [Official Code Documentation](https://cockatrice.github.io/docs)
- [Official Discord](https://discord.gg/3Z9yzmA) - [Official Discord](https://discord.gg/3Z9yzmA)
- [reddit r/Cockatrice](https://reddit.com/r/cockatrice) - [reddit r/Cockatrice](https://reddit.com/r/cockatrice)

View file

@ -19,7 +19,10 @@ set(cockatrice_SOURCES
src/client/settings/card_counter_settings.cpp src/client/settings/card_counter_settings.cpp
src/client/settings/shortcut_treeview.cpp src/client/settings/shortcut_treeview.cpp
src/client/settings/shortcuts_settings.cpp src/client/settings/shortcuts_settings.cpp
src/interface/deck_loader/card_node_function.cpp
src/interface/deck_loader/deck_file_format.cpp
src/interface/deck_loader/deck_loader.cpp src/interface/deck_loader/deck_loader.cpp
src/interface/deck_loader/loaded_deck.cpp
src/interface/widgets/dialogs/dlg_connect.cpp src/interface/widgets/dialogs/dlg_connect.cpp
src/interface/widgets/dialogs/dlg_convert_deck_to_cod_format.cpp src/interface/widgets/dialogs/dlg_convert_deck_to_cod_format.cpp
src/interface/widgets/dialogs/dlg_create_game.cpp src/interface/widgets/dialogs/dlg_create_game.cpp
@ -142,6 +145,7 @@ set(cockatrice_SOURCES
src/interface/widgets/cards/deck_card_zone_display_widget.cpp src/interface/widgets/cards/deck_card_zone_display_widget.cpp
src/interface/widgets/cards/deck_preview_card_picture_widget.cpp src/interface/widgets/cards/deck_preview_card_picture_widget.cpp
src/interface/widgets/deck_analytics/deck_analytics_widget.cpp src/interface/widgets/deck_analytics/deck_analytics_widget.cpp
src/interface/widgets/deck_analytics/deck_list_statistics_analyzer.cpp
src/interface/widgets/deck_analytics/mana_base_widget.cpp src/interface/widgets/deck_analytics/mana_base_widget.cpp
src/interface/widgets/deck_analytics/mana_curve_widget.cpp src/interface/widgets/deck_analytics/mana_curve_widget.cpp
src/interface/widgets/deck_analytics/mana_devotion_widget.cpp src/interface/widgets/deck_analytics/mana_devotion_widget.cpp
@ -153,8 +157,10 @@ set(cockatrice_SOURCES
src/interface/widgets/deck_editor/deck_editor_printing_selector_dock_widget.cpp src/interface/widgets/deck_editor/deck_editor_printing_selector_dock_widget.cpp
src/interface/widgets/deck_editor/deck_list_style_proxy.cpp src/interface/widgets/deck_editor/deck_list_style_proxy.cpp
src/interface/widgets/general/background_sources.cpp src/interface/widgets/general/background_sources.cpp
src/interface/widgets/general/display/background_plate_widget.cpp
src/interface/widgets/general/display/banner_widget.cpp src/interface/widgets/general/display/banner_widget.cpp
src/interface/widgets/general/display/bar_widget.cpp src/interface/widgets/general/display/bar_widget.cpp
src/interface/widgets/general/display/color_bar.cpp
src/interface/widgets/general/display/dynamic_font_size_label.cpp src/interface/widgets/general/display/dynamic_font_size_label.cpp
src/interface/widgets/general/display/dynamic_font_size_push_button.cpp src/interface/widgets/general/display/dynamic_font_size_push_button.cpp
src/interface/widgets/general/display/labeled_input.cpp src/interface/widgets/general/display/labeled_input.cpp
@ -196,12 +202,14 @@ set(cockatrice_SOURCES
src/interface/widgets/utility/sequence_edit.cpp src/interface/widgets/utility/sequence_edit.cpp
src/interface/widgets/visual_database_display/visual_database_display_color_filter_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_color_filter_widget.cpp
src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_filter_save_load_widget.cpp
src/interface/widgets/visual_database_display/visual_database_display_format_legality_filter_widget.cpp
src/interface/widgets/visual_database_display/visual_database_display_main_type_filter_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_main_type_filter_widget.cpp
src/interface/widgets/visual_database_display/visual_database_display_name_filter_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_name_filter_widget.cpp
src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_set_filter_widget.cpp
src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_sub_type_filter_widget.cpp
src/interface/widgets/visual_database_display/visual_database_display_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_widget.cpp
src/interface/widgets/visual_database_display/visual_database_filter_display_widget.cpp src/interface/widgets/visual_database_display/visual_database_filter_display_widget.cpp
src/interface/widgets/visual_deck_editor/visual_deck_display_options_widget.cpp
src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp src/interface/widgets/visual_deck_editor/visual_deck_editor_sample_hand_widget.cpp
src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp src/interface/widgets/visual_deck_editor/visual_deck_editor_widget.cpp
src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.cpp src/interface/widgets/visual_deck_storage/deck_preview/deck_preview_color_identity_filter_widget.cpp
@ -220,6 +228,19 @@ set(cockatrice_SOURCES
src/interface/window_main.cpp src/interface/window_main.cpp
src/main.cpp src/main.cpp
src/interface/widgets/tabs/abstract_tab_deck_editor.cpp src/interface/widgets/tabs/abstract_tab_deck_editor.cpp
src/interface/widgets/tabs/api/archidekt/tab_archidekt.cpp
src/interface/widgets/tabs/api/archidekt/api_response/archidekt_deck_listing_api_response.cpp
src/interface/widgets/tabs/api/archidekt/api_response/card/archidekt_api_response_card.cpp
src/interface/widgets/tabs/api/archidekt/api_response/card/archidekt_api_response_card_entry.cpp
src/interface/widgets/tabs/api/archidekt/api_response/card/archidekt_api_response_edition.cpp
src/interface/widgets/tabs/api/archidekt/api_response/deck/archidekt_api_response_deck.cpp
src/interface/widgets/tabs/api/archidekt/api_response/deck/archidekt_api_response_deck_category.cpp
src/interface/widgets/tabs/api/archidekt/api_response/deck_listings/archidekt_api_response_deck_listing_container.cpp
src/interface/widgets/tabs/api/archidekt/api_response/deck_listings/archidekt_api_response_deck_owner.cpp
src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_display_widget.cpp
src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_entry_display_widget.cpp
src/interface/widgets/tabs/api/archidekt/display/archidekt_api_response_deck_listings_display_widget.cpp
src/interface/widgets/tabs/api/archidekt/display/archidekt_deck_preview_image_display_widget.cpp
src/interface/widgets/tabs/api/edhrec/api_response/archidekt_links/edhrec_api_response_archidekt_links.cpp src/interface/widgets/tabs/api/edhrec/api_response/archidekt_links/edhrec_api_response_archidekt_links.cpp
src/interface/widgets/tabs/api/edhrec/api_response/average_deck/edhrec_average_deck_api_response.cpp src/interface/widgets/tabs/api/edhrec/api_response/average_deck/edhrec_average_deck_api_response.cpp
src/interface/widgets/tabs/api/edhrec/api_response/average_deck/edhrec_deck_api_response.cpp src/interface/widgets/tabs/api/edhrec/api_response/average_deck/edhrec_deck_api_response.cpp

View file

@ -1,6 +1,10 @@
[Rules] [Rules]
# The default log level is info # The default log level is info
*.debug = false *.debug = false
#*.info = true
#*.warning = true
#*.critical = true
#*.fatal = true
# Uncomment a rule to see debug level logs for that category, # Uncomment a rule to see debug level logs for that category,
# or set <category> = false to disable logging # or set <category> = false to disable logging

View file

@ -350,11 +350,11 @@
style="fill-opacity:1;stroke:black;stroke-width:2.78220296;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill-opacity:1;stroke:black;stroke-width:2.78220296;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 49.84375 1.71875 C 36.719738 1.71875 26.0625 12.375988 26.0625 25.5 C 26.0625 32.977454 29.538325 39.612734 34.9375 43.96875 C 24.439951 49.943698 17.919149 62.196126 14.3125 75.65625 C 9.0380874 95.34065 30.224013 98.21875 49.84375 98.21875 C 69.463486 98.21875 90.549327 94.96715 85.375 75.65625 C 81.693381 61.916246 75.224585 49.827177 64.8125 43.9375 C 70.181573 39.580662 73.59375 32.953205 73.59375 25.5 C 73.59375 12.375988 62.967762 1.71875 49.84375 1.71875 z " d="M 49.84375 1.71875 C 36.719738 1.71875 26.0625 12.375988 26.0625 25.5 C 26.0625 32.977454 29.538325 39.612734 34.9375 43.96875 C 24.439951 49.943698 17.919149 62.196126 14.3125 75.65625 C 9.0380874 95.34065 30.224013 98.21875 49.84375 98.21875 C 69.463486 98.21875 90.549327 94.96715 85.375 75.65625 C 81.693381 61.916246 75.224585 49.827177 64.8125 43.9375 C 70.181573 39.580662 73.59375 32.953205 73.59375 25.5 C 73.59375 12.375988 62.967762 1.71875 49.84375 1.71875 z "
transform="translate(0,952.36218)" transform="translate(0,952.36218)"
id="right" /> id="left" />
<path <path
style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.73577702;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.73577702;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 51.28696,1001.834 0,-46.98372 1.434151,0.16768 c 5.155008,0.60274 9.462857,2.72154 12.938257,6.36366 4.74393,4.9715 6.87913,11.35611 6.16464,18.43328 -0.53702,5.31935 -3.09008,10.59498 -6.83833,14.13074 l -1.94072,1.83069 3.04083,2.20427 c 3.58084,2.5957 7.18975,6.4912 9.55296,10.3116 4.89572,7.9144 9.23593,21.4918 8.50487,26.6055 -0.81312,5.6877 -5.43872,9.6977 -13.62216,11.8093 -3.80822,0.9826 -7.68056,1.4713 -14.763321,1.8633 l -4.471177,0.2474 0,-46.9837 z" d="m 51.28696,1001.834 0,-46.98372 1.434151,0.16768 c 5.155008,0.60274 9.462857,2.72154 12.938257,6.36366 4.74393,4.9715 6.87913,11.35611 6.16464,18.43328 -0.53702,5.31935 -3.09008,10.59498 -6.83833,14.13074 l -1.94072,1.83069 3.04083,2.20427 c 3.58084,2.5957 7.18975,6.4912 9.55296,10.3116 4.89572,7.9144 9.23593,21.4918 8.50487,26.6055 -0.81312,5.6877 -5.43872,9.6977 -13.62216,11.8093 -3.80822,0.9826 -7.68056,1.4713 -14.763321,1.8633 l -4.471177,0.2474 0,-46.9837 z"
id="left" id="right"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
<path <path
style="display:inline;fill:url(#linearGradient3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.77952756;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers" style="display:inline;fill:url(#linearGradient3);fill-opacity:1;fill-rule:evenodd;stroke:#000000;stroke-width:3.77952756;stroke-dasharray:none;stroke-opacity:1;paint-order:stroke fill markers"

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

Before After
Before After

View file

@ -321,11 +321,11 @@
style="fill-opacity:1;stroke:black;stroke-width:2.78220296;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill-opacity:1;stroke:black;stroke-width:2.78220296;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 49.84375 1.71875 C 36.719738 1.71875 26.0625 12.375988 26.0625 25.5 C 26.0625 32.977454 29.538325 39.612734 34.9375 43.96875 C 24.439951 49.943698 17.919149 62.196126 14.3125 75.65625 C 9.0380874 95.34065 30.224013 98.21875 49.84375 98.21875 C 69.463486 98.21875 90.549327 94.96715 85.375 75.65625 C 81.693381 61.916246 75.224585 49.827177 64.8125 43.9375 C 70.181573 39.580662 73.59375 32.953205 73.59375 25.5 C 73.59375 12.375988 62.967762 1.71875 49.84375 1.71875 z " d="M 49.84375 1.71875 C 36.719738 1.71875 26.0625 12.375988 26.0625 25.5 C 26.0625 32.977454 29.538325 39.612734 34.9375 43.96875 C 24.439951 49.943698 17.919149 62.196126 14.3125 75.65625 C 9.0380874 95.34065 30.224013 98.21875 49.84375 98.21875 C 69.463486 98.21875 90.549327 94.96715 85.375 75.65625 C 81.693381 61.916246 75.224585 49.827177 64.8125 43.9375 C 70.181573 39.580662 73.59375 32.953205 73.59375 25.5 C 73.59375 12.375988 62.967762 1.71875 49.84375 1.71875 z "
transform="translate(0,952.36218)" transform="translate(0,952.36218)"
id="right" /> id="left" />
<path <path
style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.73577702;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.73577702;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 51.28696,1001.834 0,-46.98372 1.434151,0.16768 c 5.155008,0.60274 9.462857,2.72154 12.938257,6.36366 4.74393,4.9715 6.87913,11.35611 6.16464,18.43328 -0.53702,5.31935 -3.09008,10.59498 -6.83833,14.13074 l -1.94072,1.83069 3.04083,2.20427 c 3.58084,2.5957 7.18975,6.4912 9.55296,10.3116 4.89572,7.9144 9.23593,21.4918 8.50487,26.6055 -0.81312,5.6877 -5.43872,9.6977 -13.62216,11.8093 -3.80822,0.9826 -7.68056,1.4713 -14.763321,1.8633 l -4.471177,0.2474 0,-46.9837 z" d="m 51.28696,1001.834 0,-46.98372 1.434151,0.16768 c 5.155008,0.60274 9.462857,2.72154 12.938257,6.36366 4.74393,4.9715 6.87913,11.35611 6.16464,18.43328 -0.53702,5.31935 -3.09008,10.59498 -6.83833,14.13074 l -1.94072,1.83069 3.04083,2.20427 c 3.58084,2.5957 7.18975,6.4912 9.55296,10.3116 4.89572,7.9144 9.23593,21.4918 8.50487,26.6055 -0.81312,5.6877 -5.43872,9.6977 -13.62216,11.8093 -3.80822,0.9826 -7.68056,1.4713 -14.763321,1.8633 l -4.471177,0.2474 0,-46.9837 z"
id="left" id="right"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
<path <path
d="m 46.656521,12.167234 18.055171,18.054184 a 6.6081919,6.6078288 0 0 1 -0.126303,9.352065 6.6804126,6.6800456 0 0 1 -8.233169,1.011048 l -7.944268,7.943843 6.463762,6.445343 a 6.9331851,6.9328042 0 0 1 5.741536,2.022073 l 28.057729,28.092294 a 6.9962797,6.9958953 0 0 1 -9.894222,9.893685 L 50.719018,66.907526 A 7.0595711,7.0591833 0 0 1 49.18433,59.270613 l -5.741527,-5.741238 -7.944298,7.943843 A 6.716523,6.7161541 0 0 1 25.134866,69.832263 L 7.079684,51.778091 a 6.716523,6.7161541 0 0 1 8.39566,-10.345064 L 36.31101,20.59853 a 6.716523,6.7161541 0 0 1 10.345612,-8.431329 z" d="m 46.656521,12.167234 18.055171,18.054184 a 6.6081919,6.6078288 0 0 1 -0.126303,9.352065 6.6804126,6.6800456 0 0 1 -8.233169,1.011048 l -7.944268,7.943843 6.463762,6.445343 a 6.9331851,6.9328042 0 0 1 5.741536,2.022073 l 28.057729,28.092294 a 6.9962797,6.9958953 0 0 1 -9.894222,9.893685 L 50.719018,66.907526 A 7.0595711,7.0591833 0 0 1 49.18433,59.270613 l -5.741527,-5.741238 -7.944298,7.943843 A 6.716523,6.7161541 0 0 1 25.134866,69.832263 L 7.079684,51.778091 a 6.716523,6.7161541 0 0 1 8.39566,-10.345064 L 36.31101,20.59853 a 6.716523,6.7161541 0 0 1 10.345612,-8.431329 z"

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

View file

@ -340,11 +340,11 @@
style="fill-opacity:1;stroke:black;stroke-width:2.78220296;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none" style="fill-opacity:1;stroke:black;stroke-width:2.78220296;stroke-miterlimit:4;stroke-opacity:1;stroke-dasharray:none"
d="M 49.84375 1.71875 C 36.719738 1.71875 26.0625 12.375988 26.0625 25.5 C 26.0625 32.977454 29.538325 39.612734 34.9375 43.96875 C 24.439951 49.943698 17.919149 62.196126 14.3125 75.65625 C 9.0380874 95.34065 30.224013 98.21875 49.84375 98.21875 C 69.463486 98.21875 90.549327 94.96715 85.375 75.65625 C 81.693381 61.916246 75.224585 49.827177 64.8125 43.9375 C 70.181573 39.580662 73.59375 32.953205 73.59375 25.5 C 73.59375 12.375988 62.967762 1.71875 49.84375 1.71875 z " d="M 49.84375 1.71875 C 36.719738 1.71875 26.0625 12.375988 26.0625 25.5 C 26.0625 32.977454 29.538325 39.612734 34.9375 43.96875 C 24.439951 49.943698 17.919149 62.196126 14.3125 75.65625 C 9.0380874 95.34065 30.224013 98.21875 49.84375 98.21875 C 69.463486 98.21875 90.549327 94.96715 85.375 75.65625 C 81.693381 61.916246 75.224585 49.827177 64.8125 43.9375 C 70.181573 39.580662 73.59375 32.953205 73.59375 25.5 C 73.59375 12.375988 62.967762 1.71875 49.84375 1.71875 z "
transform="translate(0,952.36218)" transform="translate(0,952.36218)"
id="right" /> id="left" />
<path <path
style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.73577702;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" style="opacity:1;fill-opacity:1;fill-rule:nonzero;stroke:#000000;stroke-width:1.73577702;stroke-linecap:butt;stroke-linejoin:round;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 51.28696,1001.834 0,-46.98372 1.434151,0.16768 c 5.155008,0.60274 9.462857,2.72154 12.938257,6.36366 4.74393,4.9715 6.87913,11.35611 6.16464,18.43328 -0.53702,5.31935 -3.09008,10.59498 -6.83833,14.13074 l -1.94072,1.83069 3.04083,2.20427 c 3.58084,2.5957 7.18975,6.4912 9.55296,10.3116 4.89572,7.9144 9.23593,21.4918 8.50487,26.6055 -0.81312,5.6877 -5.43872,9.6977 -13.62216,11.8093 -3.80822,0.9826 -7.68056,1.4713 -14.763321,1.8633 l -4.471177,0.2474 0,-46.9837 z" d="m 51.28696,1001.834 0,-46.98372 1.434151,0.16768 c 5.155008,0.60274 9.462857,2.72154 12.938257,6.36366 4.74393,4.9715 6.87913,11.35611 6.16464,18.43328 -0.53702,5.31935 -3.09008,10.59498 -6.83833,14.13074 l -1.94072,1.83069 3.04083,2.20427 c 3.58084,2.5957 7.18975,6.4912 9.55296,10.3116 4.89572,7.9144 9.23593,21.4918 8.50487,26.6055 -0.81312,5.6877 -5.43872,9.6977 -13.62216,11.8093 -3.80822,0.9826 -7.68056,1.4713 -14.763321,1.8633 l -4.471177,0.2474 0,-46.9837 z"
id="left" id="right"
inkscape:connector-curvature="0" /> inkscape:connector-curvature="0" />
<path <path
sodipodi:type="star" sodipodi:type="star"

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

Before After
Before After

View file

@ -2,13 +2,13 @@
#include <QDesktopServices> #include <QDesktopServices>
#include <QMessageBox> #include <QMessageBox>
#include <QNetworkAccessManager>
#include <QNetworkReply> #include <QNetworkReply>
#include <QNetworkRequest> #include <QNetworkRequest>
#include <QRegularExpression> #include <QRegularExpression>
#include <QUrlQuery> #include <QUrlQuery>
#include <libcockatrice/deck_list/deck_list.h> #include <libcockatrice/deck_list/deck_list.h>
#include <libcockatrice/deck_list/deck_list_card_node.h> #include <libcockatrice/deck_list/tree/deck_list_card_node.h>
#include <version_string.h>
DeckStatsInterface::DeckStatsInterface(CardDatabase &_cardDatabase, QObject *parent) DeckStatsInterface::DeckStatsInterface(CardDatabase &_cardDatabase, QObject *parent)
: QObject(parent), cardDatabase(_cardDatabase) : QObject(parent), cardDatabase(_cardDatabase)
@ -63,6 +63,7 @@ void DeckStatsInterface::analyzeDeck(DeckList *deck)
QNetworkRequest request(QUrl("https://deckstats.net/index.php")); QNetworkRequest request(QUrl("https://deckstats.net/index.php"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
request.setHeader(QNetworkRequest::UserAgentHeader, QString("Cockatrice %1").arg(VERSION_STRING));
manager->post(request, data); manager->post(request, data);
} }

View file

@ -7,7 +7,6 @@
#ifndef DECKSTATS_INTERFACE_H #ifndef DECKSTATS_INTERFACE_H
#define DECKSTATS_INTERFACE_H #define DECKSTATS_INTERFACE_H
#include <QObject>
#include <libcockatrice/card/database/card_database.h> #include <libcockatrice/card/database/card_database.h>
#include <libcockatrice/deck_list/deck_list.h> #include <libcockatrice/deck_list/deck_list.h>

View file

@ -2,13 +2,13 @@
#include <QDesktopServices> #include <QDesktopServices>
#include <QMessageBox> #include <QMessageBox>
#include <QNetworkAccessManager>
#include <QNetworkReply> #include <QNetworkReply>
#include <QNetworkRequest> #include <QNetworkRequest>
#include <QRegularExpression> #include <QRegularExpression>
#include <QUrlQuery> #include <QUrlQuery>
#include <libcockatrice/deck_list/deck_list.h> #include <libcockatrice/deck_list/deck_list.h>
#include <libcockatrice/deck_list/deck_list_card_node.h> #include <libcockatrice/deck_list/tree/deck_list_card_node.h>
#include <version_string.h>
TappedOutInterface::TappedOutInterface(CardDatabase &_cardDatabase, QObject *parent) TappedOutInterface::TappedOutInterface(CardDatabase &_cardDatabase, QObject *parent)
: QObject(parent), cardDatabase(_cardDatabase) : QObject(parent), cardDatabase(_cardDatabase)
@ -88,6 +88,7 @@ void TappedOutInterface::analyzeDeck(DeckList *deck)
QNetworkRequest request(QUrl("https://tappedout.net/mtg-decks/paste/")); QNetworkRequest request(QUrl("https://tappedout.net/mtg-decks/paste/"));
request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded"); request.setHeader(QNetworkRequest::ContentTypeHeader, "application/x-www-form-urlencoded");
request.setHeader(QNetworkRequest::UserAgentHeader, QString("Cockatrice %1").arg(VERSION_STRING));
manager->post(request, data); manager->post(request, data);
} }

View file

@ -7,8 +7,6 @@
#ifndef TAPPEDOUT_INTERFACE_H #ifndef TAPPEDOUT_INTERFACE_H
#define TAPPEDOUT_INTERFACE_H #define TAPPEDOUT_INTERFACE_H
#include <QLoggingCategory>
#include <QObject>
#include <libcockatrice/card/database/card_database.h> #include <libcockatrice/card/database/card_database.h>
#include <libcockatrice/deck_list/deck_list.h> #include <libcockatrice/deck_list/deck_list.h>

View file

@ -6,6 +6,8 @@
#ifndef INTERFACE_JSON_DECK_PARSER_H #ifndef INTERFACE_JSON_DECK_PARSER_H
#define INTERFACE_JSON_DECK_PARSER_H #define INTERFACE_JSON_DECK_PARSER_H
#include "../../../interface/deck_loader/card_node_function.h"
#include "../../../interface/deck_loader/deck_loader.h" #include "../../../interface/deck_loader/deck_loader.h"
#include <QJsonArray> #include <QJsonArray>
@ -48,7 +50,7 @@ public:
} }
loader->getDeckList()->loadFromStream_Plain(outStream, false); loader->getDeckList()->loadFromStream_Plain(outStream, false);
DeckLoader::resolveSetNameAndNumberToProviderID(loader->getDeckList()); loader->getDeckList()->forEachCard(CardNodeFunction::ResolveProviderId());
return loader; return loader;
} }
@ -95,7 +97,7 @@ public:
} }
loader->getDeckList()->loadFromStream_Plain(outStream, false); loader->getDeckList()->loadFromStream_Plain(outStream, false);
DeckLoader::resolveSetNameAndNumberToProviderID(loader->getDeckList()); loader->getDeckList()->forEachCard(CardNodeFunction::ResolveProviderId());
QJsonObject commandersObj = obj.value("commanders").toObject(); QJsonObject commandersObj = obj.value("commanders").toObject();
if (!commandersObj.isEmpty()) { if (!commandersObj.isEmpty()) {

View file

@ -4,18 +4,17 @@
#include "../../../../main.h" #include "../../../../main.h"
#include "../../../settings/cache_settings.h" #include "../../../settings/cache_settings.h"
#include <QApplication>
#include <QCryptographicHash> #include <QCryptographicHash>
#include <QDateTime> #include <QDateTime>
#include <QDebug> #include <QDebug>
#include <QFile> #include <QFile>
#include <QLocale> #include <QLocale>
#include <QMessageBox>
#include <QNetworkReply> #include <QNetworkReply>
#include <QUrl> #include <QUrl>
#include <QtConcurrent> #include <QtConcurrent>
#include <libcockatrice/card/database/card_database.h> #include <libcockatrice/card/database/card_database.h>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <version_string.h>
#define SPOILERS_STATUS_URL "https://raw.githubusercontent.com/Cockatrice/Magic-Spoiler/files/SpoilerSeasonEnabled" #define SPOILERS_STATUS_URL "https://raw.githubusercontent.com/Cockatrice/Magic-Spoiler/files/SpoilerSeasonEnabled"
#define SPOILERS_URL "https://raw.githubusercontent.com/Cockatrice/Magic-Spoiler/files/spoiler.xml" #define SPOILERS_URL "https://raw.githubusercontent.com/Cockatrice/Magic-Spoiler/files/spoiler.xml"
@ -41,7 +40,9 @@ void SpoilerBackgroundUpdater::startSpoilerDownloadProcess(QString url, bool sav
void SpoilerBackgroundUpdater::downloadFromURL(QUrl url, bool saveResults) void SpoilerBackgroundUpdater::downloadFromURL(QUrl url, bool saveResults)
{ {
auto *nam = new QNetworkAccessManager(this); auto *nam = new QNetworkAccessManager(this);
QNetworkReply *reply = nam->get(QNetworkRequest(url)); auto request = QNetworkRequest(url);
request.setHeader(QNetworkRequest::UserAgentHeader, QString("Cockatrice %1").arg(VERSION_STRING));
QNetworkReply *reply = nam->get(request);
if (saveResults) { if (saveResults) {
// This will write out to the file (used for spoiler.xml) // This will write out to the file (used for spoiler.xml)

View file

@ -22,7 +22,7 @@ public:
inline QString getCardUpdaterBinaryName() inline QString getCardUpdaterBinaryName()
{ {
return "oracle"; return "oracle";
}; }
QByteArray getHash(const QString fileName); QByteArray getHash(const QString fileName);
QByteArray getHash(QByteArray data); QByteArray getHash(QByteArray data);
static bool deleteSpoilerFile(); static bool deleteSpoilerFile();

View file

@ -1,6 +1,5 @@
#include "update_downloader.h" #include "update_downloader.h"
#include <QDebug>
#include <QUrl> #include <QUrl>
UpdateDownloader::UpdateDownloader(QObject *parent) : QObject(parent), response(nullptr) UpdateDownloader::UpdateDownloader(QObject *parent) : QObject(parent), response(nullptr)

View file

@ -7,9 +7,7 @@
#ifndef COCKATRICE_UPDATEDOWNLOADER_H #ifndef COCKATRICE_UPDATEDOWNLOADER_H
#define COCKATRICE_UPDATEDOWNLOADER_H #define COCKATRICE_UPDATEDOWNLOADER_H
#include <QDate>
#include <QObject> #include <QObject>
#include <QUrl>
#include <QtNetwork> #include <QtNetwork>
class UpdateDownloader : public QObject class UpdateDownloader : public QObject

View file

@ -310,10 +310,15 @@ SettingsCache::SettingsCache()
settings->value("interface/visualdeckstorageselectionanimation", true).toBool(); settings->value("interface/visualdeckstorageselectionanimation", true).toBool();
defaultDeckEditorType = settings->value("interface/defaultDeckEditorType", 1).toInt(); defaultDeckEditorType = settings->value("interface/defaultDeckEditorType", 1).toInt();
visualDatabaseDisplayFilterToMostRecentSetsEnabled = visualDatabaseDisplayFilterToMostRecentSetsEnabled =
settings->value("interface/visualdatabasedisplayfiltertomostrecentsetsenabled", true).toBool(); settings->value("interface/visualdatabasedisplayfiltertomostrecentsetsenabled", false).toBool();
visualDatabaseDisplayFilterToMostRecentSetsAmount = visualDatabaseDisplayFilterToMostRecentSetsAmount =
settings->value("interface/visualdatabasedisplayfiltertomostrecentsetsamount", 10).toInt(); settings->value("interface/visualdatabasedisplayfiltertomostrecentsetsamount", 10).toInt();
visualDeckEditorSampleHandSize = settings->value("interface/visualdeckeditorsamplehandsize", 7).toInt(); visualDeckEditorSampleHandSize = settings->value("interface/visualdeckeditorsamplehandsize", 7).toInt();
visualDeckEditorCardSize = settings->value("interface/visualdeckeditorcardsize", 100).toInt();
visualDatabaseDisplayCardSize = settings->value("interface/visualdatabasedisplaycardsize", 100).toInt();
edhrecCardSize = settings->value("interface/edhreccardsize", 100).toInt();
archidektPreviewSize = settings->value("interface/archidektpreviewsize", 100).toInt();
horizontalHand = settings->value("hand/horizontal", true).toBool(); horizontalHand = settings->value("hand/horizontal", true).toBool();
invertVerticalCoordinate = settings->value("table/invert_vertical", false).toBool(); invertVerticalCoordinate = settings->value("table/invert_vertical", false).toBool();
minPlayersForMultiColumnLayout = settings->value("interface/min_players_multicolumn", 4).toInt(); minPlayersForMultiColumnLayout = settings->value("interface/min_players_multicolumn", 4).toInt();
@ -863,6 +868,34 @@ void SettingsCache::setVisualDeckStorageSelectionAnimation(QT_STATE_CHANGED_T va
emit visualDeckStorageSelectionAnimationChanged(visualDeckStorageSelectionAnimation); emit visualDeckStorageSelectionAnimationChanged(visualDeckStorageSelectionAnimation);
} }
void SettingsCache::setVisualDeckEditorCardSize(int _visualDeckEditorCardSize)
{
visualDeckEditorCardSize = _visualDeckEditorCardSize;
settings->setValue("interface/visualdeckeditorcardsize", visualDeckEditorCardSize);
emit visualDeckEditorCardSizeChanged();
}
void SettingsCache::setVisualDatabaseDisplayCardSize(int _visualDatabaseDisplayCardSize)
{
visualDatabaseDisplayCardSize = _visualDatabaseDisplayCardSize;
settings->setValue("interface/visualdatabasedisplaycardsize", visualDatabaseDisplayCardSize);
emit visualDatabaseDisplayCardSizeChanged();
}
void SettingsCache::setEDHRecCardSize(int _edhrecCardSize)
{
edhrecCardSize = _edhrecCardSize;
settings->setValue("interface/edhreccardsize", edhrecCardSize);
emit edhRecCardSizeChanged();
}
void SettingsCache::setArchidektPreviewCardSize(int _archidektPreviewCardSize)
{
archidektPreviewSize = _archidektPreviewCardSize;
settings->setValue("interface/archidektpreviewsize", archidektPreviewSize);
emit archidektPreviewSizeChanged();
}
void SettingsCache::setDefaultDeckEditorType(int value) void SettingsCache::setDefaultDeckEditorType(int value)
{ {
defaultDeckEditorType = value; defaultDeckEditorType = value;

View file

@ -11,7 +11,6 @@
#include <QDate> #include <QDate>
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QObject>
#include <QSize> #include <QSize>
#include <QStringList> #include <QStringList>
#include <libcockatrice/interfaces/interface_card_database_path_provider.h> #include <libcockatrice/interfaces/interface_card_database_path_provider.h>
@ -167,6 +166,10 @@ signals:
void visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged(bool enabled); void visualDatabaseDisplayFilterToMostRecentSetsEnabledChanged(bool enabled);
void visualDatabaseDisplayFilterToMostRecentSetsAmountChanged(int amount); void visualDatabaseDisplayFilterToMostRecentSetsAmountChanged(int amount);
void visualDeckEditorSampleHandSizeAmountChanged(int amount); void visualDeckEditorSampleHandSizeAmountChanged(int amount);
void visualDeckEditorCardSizeChanged();
void visualDatabaseDisplayCardSizeChanged();
void edhRecCardSizeChanged();
void archidektPreviewSizeChanged();
void horizontalHandChanged(); void horizontalHandChanged();
void handJustificationChanged(); void handJustificationChanged();
void invertVerticalCoordinateChanged(); void invertVerticalCoordinateChanged();
@ -250,6 +253,10 @@ private:
QStringList visualDeckStorageDefaultTagsList; QStringList visualDeckStorageDefaultTagsList;
bool visualDeckStorageSearchFolderNames; bool visualDeckStorageSearchFolderNames;
int visualDeckStorageCardSize; int visualDeckStorageCardSize;
int visualDeckEditorCardSize;
int visualDatabaseDisplayCardSize;
int edhrecCardSize;
int archidektPreviewSize;
bool visualDeckStorageDrawUnusedColorIdentities; bool visualDeckStorageDrawUnusedColorIdentities;
int visualDeckStorageUnusedColorIdentitiesOpacity; int visualDeckStorageUnusedColorIdentitiesOpacity;
int visualDeckStorageTooltipType; int visualDeckStorageTooltipType;
@ -317,8 +324,8 @@ private:
int keepalive; int keepalive;
int timeout; int timeout;
void translateLegacySettings(); void translateLegacySettings();
QString getSafeConfigPath(QString configEntry, QString defaultPath) const; [[nodiscard]] QString getSafeConfigPath(QString configEntry, QString defaultPath) const;
QString getSafeConfigFilePath(QString configEntry, QString defaultPath) const; [[nodiscard]] QString getSafeConfigFilePath(QString configEntry, QString defaultPath) const;
void loadPaths(); void loadPaths();
bool rememberGameSettings; bool rememberGameSettings;
QList<ReleaseChannel *> releaseChannels; QList<ReleaseChannel *> releaseChannels;
@ -330,137 +337,137 @@ public:
SettingsCache(); SettingsCache();
QString getDataPath(); QString getDataPath();
QString getSettingsPath(); QString getSettingsPath();
QString getCachePath() const; [[nodiscard]] QString getCachePath() const;
QString getNetworkCachePath() const; [[nodiscard]] QString getNetworkCachePath() const;
const QByteArray &getMainWindowGeometry() const [[nodiscard]] const QByteArray &getMainWindowGeometry() const
{ {
return mainWindowGeometry; return mainWindowGeometry;
} }
const QByteArray &getTokenDialogGeometry() const [[nodiscard]] const QByteArray &getTokenDialogGeometry() const
{ {
return tokenDialogGeometry; return tokenDialogGeometry;
} }
const QByteArray &getSetsDialogGeometry() const [[nodiscard]] const QByteArray &getSetsDialogGeometry() const
{ {
return setsDialogGeometry; return setsDialogGeometry;
} }
QString getLang() const [[nodiscard]] QString getLang() const
{ {
return lang; return lang;
} }
QString getDeckPath() const [[nodiscard]] QString getDeckPath() const
{ {
return deckPath; return deckPath;
} }
QString getFiltersPath() const [[nodiscard]] QString getFiltersPath() const
{ {
return filtersPath; return filtersPath;
} }
QString getReplaysPath() const [[nodiscard]] QString getReplaysPath() const
{ {
return replaysPath; return replaysPath;
} }
QString getThemesPath() const [[nodiscard]] QString getThemesPath() const
{ {
return themesPath; return themesPath;
} }
QString getPicsPath() const [[nodiscard]] QString getPicsPath() const
{ {
return picsPath; return picsPath;
} }
QString getRedirectCachePath() const [[nodiscard]] QString getRedirectCachePath() const
{ {
return redirectCachePath; return redirectCachePath;
} }
QString getCustomPicsPath() const [[nodiscard]] QString getCustomPicsPath() const
{ {
return customPicsPath; return customPicsPath;
} }
QString getCustomCardDatabasePath() const override [[nodiscard]] QString getCustomCardDatabasePath() const override
{ {
return customCardDatabasePath; return customCardDatabasePath;
} }
QString getCardDatabasePath() const override [[nodiscard]] QString getCardDatabasePath() const override
{ {
return cardDatabasePath; return cardDatabasePath;
} }
QString getSpoilerCardDatabasePath() const override [[nodiscard]] QString getSpoilerCardDatabasePath() const override
{ {
return spoilerDatabasePath; return spoilerDatabasePath;
} }
QString getTokenDatabasePath() const override [[nodiscard]] QString getTokenDatabasePath() const override
{ {
return tokenDatabasePath; return tokenDatabasePath;
} }
QString getThemeName() const [[nodiscard]] QString getThemeName() const
{ {
return themeName; return themeName;
} }
QString getHomeTabBackgroundSource() const [[nodiscard]] QString getHomeTabBackgroundSource() const
{ {
return homeTabBackgroundSource; return homeTabBackgroundSource;
} }
int getHomeTabBackgroundShuffleFrequency() const [[nodiscard]] int getHomeTabBackgroundShuffleFrequency() const
{ {
return homeTabBackgroundShuffleFrequency; return homeTabBackgroundShuffleFrequency;
} }
bool getTabVisualDeckStorageOpen() const [[nodiscard]] bool getTabVisualDeckStorageOpen() const
{ {
return tabVisualDeckStorageOpen; return tabVisualDeckStorageOpen;
} }
bool getTabServerOpen() const [[nodiscard]] bool getTabServerOpen() const
{ {
return tabServerOpen; return tabServerOpen;
} }
bool getTabAccountOpen() const [[nodiscard]] bool getTabAccountOpen() const
{ {
return tabAccountOpen; return tabAccountOpen;
} }
bool getTabDeckStorageOpen() const [[nodiscard]] bool getTabDeckStorageOpen() const
{ {
return tabDeckStorageOpen; return tabDeckStorageOpen;
} }
bool getTabReplaysOpen() const [[nodiscard]] bool getTabReplaysOpen() const
{ {
return tabReplaysOpen; return tabReplaysOpen;
} }
bool getTabAdminOpen() const [[nodiscard]] bool getTabAdminOpen() const
{ {
return tabAdminOpen; return tabAdminOpen;
} }
bool getTabLogOpen() const [[nodiscard]] bool getTabLogOpen() const
{ {
return tabLogOpen; return tabLogOpen;
} }
QString getChatMentionColor() const [[nodiscard]] QString getChatMentionColor() const
{ {
return chatMentionColor; return chatMentionColor;
} }
QString getChatHighlightColor() const [[nodiscard]] QString getChatHighlightColor() const
{ {
return chatHighlightColor; return chatHighlightColor;
} }
bool getPicDownload() const [[nodiscard]] bool getPicDownload() const
{ {
return picDownload; return picDownload;
} }
bool getShowStatusBar() const [[nodiscard]] bool getShowStatusBar() const
{ {
return showStatusBar; return showStatusBar;
} }
bool getNotificationsEnabled() const [[nodiscard]] bool getNotificationsEnabled() const
{ {
return notificationsEnabled; return notificationsEnabled;
} }
bool getSpectatorNotificationsEnabled() const [[nodiscard]] bool getSpectatorNotificationsEnabled() const
{ {
return spectatorNotificationsEnabled; return spectatorNotificationsEnabled;
} }
bool getBuddyConnectNotificationsEnabled() const [[nodiscard]] bool getBuddyConnectNotificationsEnabled() const
{ {
return buddyConnectNotificationsEnabled; return buddyConnectNotificationsEnabled;
} }
bool getCheckUpdatesOnStartup() const [[nodiscard]] bool getCheckUpdatesOnStartup() const
{ {
return checkUpdatesOnStartup; return checkUpdatesOnStartup;
} }
@ -472,247 +479,263 @@ public:
{ {
return startupCardUpdateCheckAlwaysUpdate; return startupCardUpdateCheckAlwaysUpdate;
} }
int getCardUpdateCheckInterval() const [[nodiscard]] int getCardUpdateCheckInterval() const
{ {
return cardUpdateCheckInterval; return cardUpdateCheckInterval;
} }
QDate getLastCardUpdateCheck() const [[nodiscard]] QDate getLastCardUpdateCheck() const
{ {
return lastCardUpdateCheck; return lastCardUpdateCheck;
} }
bool getCardUpdateCheckRequired() const [[nodiscard]] bool getCardUpdateCheckRequired() const
{ {
return getLastCardUpdateCheck().daysTo(QDateTime::currentDateTime().date()) >= getCardUpdateCheckInterval() && return getLastCardUpdateCheck().daysTo(QDateTime::currentDateTime().date()) >= getCardUpdateCheckInterval() &&
getLastCardUpdateCheck() != QDateTime::currentDateTime().date(); getLastCardUpdateCheck() != QDateTime::currentDateTime().date();
} }
bool getNotifyAboutUpdates() const override [[nodiscard]] bool getNotifyAboutUpdates() const override
{ {
return notifyAboutUpdates; return notifyAboutUpdates;
} }
bool getNotifyAboutNewVersion() const [[nodiscard]] bool getNotifyAboutNewVersion() const
{ {
return notifyAboutNewVersion; return notifyAboutNewVersion;
} }
bool getShowTipsOnStartup() const [[nodiscard]] bool getShowTipsOnStartup() const
{ {
return showTipsOnStartup; return showTipsOnStartup;
} }
QList<int> getSeenTips() const [[nodiscard]] QList<int> getSeenTips() const
{ {
return seenTips; return seenTips;
} }
int getUpdateReleaseChannelIndex() const [[nodiscard]] int getUpdateReleaseChannelIndex() const
{ {
return updateReleaseChannel; return updateReleaseChannel;
} }
ReleaseChannel *getUpdateReleaseChannel() const [[nodiscard]] ReleaseChannel *getUpdateReleaseChannel() const
{ {
return releaseChannels.at(qMax(0, updateReleaseChannel)); return releaseChannels.at(qMax(0, updateReleaseChannel));
} }
QList<ReleaseChannel *> getUpdateReleaseChannels() const [[nodiscard]] QList<ReleaseChannel *> getUpdateReleaseChannels() const
{ {
return releaseChannels; return releaseChannels;
} }
bool getDoubleClickToPlay() const [[nodiscard]] bool getDoubleClickToPlay() const
{ {
return doubleClickToPlay; return doubleClickToPlay;
} }
bool getClickPlaysAllSelected() const [[nodiscard]] bool getClickPlaysAllSelected() const
{ {
return clickPlaysAllSelected; return clickPlaysAllSelected;
} }
bool getPlayToStack() const [[nodiscard]] bool getPlayToStack() const
{ {
return playToStack; return playToStack;
} }
bool getDoNotDeleteArrowsInSubPhases() const [[nodiscard]] bool getDoNotDeleteArrowsInSubPhases() const
{ {
return doNotDeleteArrowsInSubPhases; return doNotDeleteArrowsInSubPhases;
} }
int getStartingHandSize() const [[nodiscard]] int getStartingHandSize() const
{ {
return startingHandSize; return startingHandSize;
} }
bool getAnnotateTokens() const [[nodiscard]] bool getAnnotateTokens() const
{ {
return annotateTokens; return annotateTokens;
} }
QByteArray getTabGameSplitterSizes() const [[nodiscard]] QByteArray getTabGameSplitterSizes() const
{ {
return tabGameSplitterSizes; return tabGameSplitterSizes;
} }
bool getShowShortcuts() const [[nodiscard]] bool getShowShortcuts() const
{ {
return showShortcuts; return showShortcuts;
} }
bool getDisplayCardNames() const [[nodiscard]] bool getDisplayCardNames() const
{ {
return displayCardNames; return displayCardNames;
} }
bool getOverrideAllCardArtWithPersonalPreference() const [[nodiscard]] bool getOverrideAllCardArtWithPersonalPreference() const
{ {
return overrideAllCardArtWithPersonalPreference; return overrideAllCardArtWithPersonalPreference;
} }
bool getBumpSetsWithCardsInDeckToTop() const [[nodiscard]] bool getBumpSetsWithCardsInDeckToTop() const
{ {
return bumpSetsWithCardsInDeckToTop; return bumpSetsWithCardsInDeckToTop;
} }
int getPrintingSelectorSortOrder() const [[nodiscard]] int getPrintingSelectorSortOrder() const
{ {
return printingSelectorSortOrder; return printingSelectorSortOrder;
} }
int getPrintingSelectorCardSize() const [[nodiscard]] int getPrintingSelectorCardSize() const
{ {
return printingSelectorCardSize; return printingSelectorCardSize;
} }
bool getIncludeRebalancedCards() const [[nodiscard]] bool getIncludeRebalancedCards() const
{ {
return includeRebalancedCards; return includeRebalancedCards;
} }
bool getPrintingSelectorNavigationButtonsVisible() const [[nodiscard]] bool getPrintingSelectorNavigationButtonsVisible() const
{ {
return printingSelectorNavigationButtonsVisible; return printingSelectorNavigationButtonsVisible;
} }
bool getDeckEditorBannerCardComboBoxVisible() const [[nodiscard]] bool getDeckEditorBannerCardComboBoxVisible() const
{ {
return deckEditorBannerCardComboBoxVisible; return deckEditorBannerCardComboBoxVisible;
} }
bool getDeckEditorTagsWidgetVisible() const [[nodiscard]] bool getDeckEditorTagsWidgetVisible() const
{ {
return deckEditorTagsWidgetVisible; return deckEditorTagsWidgetVisible;
} }
int getVisualDeckStorageSortingOrder() const [[nodiscard]] int getVisualDeckStorageSortingOrder() const
{ {
return visualDeckStorageSortingOrder; return visualDeckStorageSortingOrder;
} }
bool getVisualDeckStorageShowFolders() const [[nodiscard]] bool getVisualDeckStorageShowFolders() const
{ {
return visualDeckStorageShowFolders; return visualDeckStorageShowFolders;
} }
bool getVisualDeckStorageShowTagFilter() const [[nodiscard]] bool getVisualDeckStorageShowTagFilter() const
{ {
return visualDeckStorageShowTagFilter; return visualDeckStorageShowTagFilter;
} }
QStringList getVisualDeckStorageDefaultTagsList() const [[nodiscard]] QStringList getVisualDeckStorageDefaultTagsList() const
{ {
return visualDeckStorageDefaultTagsList; return visualDeckStorageDefaultTagsList;
} }
bool getVisualDeckStorageSearchFolderNames() const [[nodiscard]] bool getVisualDeckStorageSearchFolderNames() const
{ {
return visualDeckStorageSearchFolderNames; return visualDeckStorageSearchFolderNames;
} }
bool getVisualDeckStorageShowBannerCardComboBox() const [[nodiscard]] bool getVisualDeckStorageShowBannerCardComboBox() const
{ {
return visualDeckStorageShowBannerCardComboBox; return visualDeckStorageShowBannerCardComboBox;
} }
bool getVisualDeckStorageShowTagsOnDeckPreviews() const [[nodiscard]] bool getVisualDeckStorageShowTagsOnDeckPreviews() const
{ {
return visualDeckStorageShowTagsOnDeckPreviews; return visualDeckStorageShowTagsOnDeckPreviews;
} }
int getVisualDeckStorageCardSize() const [[nodiscard]] int getVisualDeckStorageCardSize() const
{ {
return visualDeckStorageCardSize; return visualDeckStorageCardSize;
} }
bool getVisualDeckStorageDrawUnusedColorIdentities() const [[nodiscard]] bool getVisualDeckStorageDrawUnusedColorIdentities() const
{ {
return visualDeckStorageDrawUnusedColorIdentities; return visualDeckStorageDrawUnusedColorIdentities;
} }
int getVisualDeckStorageUnusedColorIdentitiesOpacity() const [[nodiscard]] int getVisualDeckStorageUnusedColorIdentitiesOpacity() const
{ {
return visualDeckStorageUnusedColorIdentitiesOpacity; return visualDeckStorageUnusedColorIdentitiesOpacity;
} }
int getVisualDeckStorageTooltipType() const [[nodiscard]] int getVisualDeckStorageTooltipType() const
{ {
return visualDeckStorageTooltipType; return visualDeckStorageTooltipType;
} }
bool getVisualDeckStoragePromptForConversion() const [[nodiscard]] bool getVisualDeckStoragePromptForConversion() const
{ {
return visualDeckStoragePromptForConversion; return visualDeckStoragePromptForConversion;
} }
bool getVisualDeckStorageAlwaysConvert() const [[nodiscard]] bool getVisualDeckStorageAlwaysConvert() const
{ {
return visualDeckStorageAlwaysConvert; return visualDeckStorageAlwaysConvert;
} }
bool getVisualDeckStorageInGame() const [[nodiscard]] bool getVisualDeckStorageInGame() const
{ {
return visualDeckStorageInGame; return visualDeckStorageInGame;
} }
bool getVisualDeckStorageSelectionAnimation() const [[nodiscard]] bool getVisualDeckStorageSelectionAnimation() const
{ {
return visualDeckStorageSelectionAnimation; return visualDeckStorageSelectionAnimation;
} }
int getDefaultDeckEditorType() const [[nodiscard]] int getVisualDeckEditorCardSize() const
{
return visualDeckEditorCardSize;
}
[[nodiscard]] int getVisualDatabaseDisplayCardSize() const
{
return visualDatabaseDisplayCardSize;
}
[[nodiscard]] int getEDHRecCardSize() const
{
return edhrecCardSize;
}
[[nodiscard]] int getArchidektPreviewSize() const
{
return archidektPreviewSize;
}
[[nodiscard]] int getDefaultDeckEditorType() const
{ {
return defaultDeckEditorType; return defaultDeckEditorType;
} }
bool getVisualDatabaseDisplayFilterToMostRecentSetsEnabled() const [[nodiscard]] bool getVisualDatabaseDisplayFilterToMostRecentSetsEnabled() const
{ {
return visualDatabaseDisplayFilterToMostRecentSetsEnabled; return visualDatabaseDisplayFilterToMostRecentSetsEnabled;
} }
int getVisualDatabaseDisplayFilterToMostRecentSetsAmount() const [[nodiscard]] int getVisualDatabaseDisplayFilterToMostRecentSetsAmount() const
{ {
return visualDatabaseDisplayFilterToMostRecentSetsAmount; return visualDatabaseDisplayFilterToMostRecentSetsAmount;
} }
int getVisualDeckEditorSampleHandSize() const [[nodiscard]] int getVisualDeckEditorSampleHandSize() const
{ {
return visualDeckEditorSampleHandSize; return visualDeckEditorSampleHandSize;
} }
bool getHorizontalHand() const [[nodiscard]] bool getHorizontalHand() const
{ {
return horizontalHand; return horizontalHand;
} }
bool getInvertVerticalCoordinate() const [[nodiscard]] bool getInvertVerticalCoordinate() const
{ {
return invertVerticalCoordinate; return invertVerticalCoordinate;
} }
int getMinPlayersForMultiColumnLayout() const [[nodiscard]] int getMinPlayersForMultiColumnLayout() const
{ {
return minPlayersForMultiColumnLayout; return minPlayersForMultiColumnLayout;
} }
bool getTapAnimation() const [[nodiscard]] bool getTapAnimation() const
{ {
return tapAnimation; return tapAnimation;
} }
bool getAutoRotateSidewaysLayoutCards() const [[nodiscard]] bool getAutoRotateSidewaysLayoutCards() const
{ {
return autoRotateSidewaysLayoutCards; return autoRotateSidewaysLayoutCards;
} }
bool getOpenDeckInNewTab() const [[nodiscard]] bool getOpenDeckInNewTab() const
{ {
return openDeckInNewTab; return openDeckInNewTab;
} }
int getRewindBufferingMs() const [[nodiscard]] int getRewindBufferingMs() const
{ {
return rewindBufferingMs; return rewindBufferingMs;
} }
bool getChatMention() const [[nodiscard]] bool getChatMention() const
{ {
return chatMention; return chatMention;
} }
bool getChatMentionCompleter() const [[nodiscard]] bool getChatMentionCompleter() const
{ {
return chatMentionCompleter; return chatMentionCompleter;
} }
bool getChatMentionForeground() const [[nodiscard]] bool getChatMentionForeground() const
{ {
return chatMentionForeground; return chatMentionForeground;
} }
bool getChatHighlightForeground() const [[nodiscard]] bool getChatHighlightForeground() const
{ {
return chatHighlightForeground; return chatHighlightForeground;
} }
/** /**
* Currently selected index for the `Group by X` QComboBox * Currently selected index for the `Group by X` QComboBox
*/ */
int getZoneViewGroupByIndex() const [[nodiscard]] int getZoneViewGroupByIndex() const
{ {
return zoneViewGroupByIndex; return zoneViewGroupByIndex;
} }
/** /**
* Currently selected index for the `Sort by X` QComboBox * Currently selected index for the `Sort by X` QComboBox
*/ */
int getZoneViewSortByIndex() const [[nodiscard]] int getZoneViewSortByIndex() const
{ {
return zoneViewSortByIndex; return zoneViewSortByIndex;
} }
@ -720,136 +743,136 @@ public:
Returns if the view should be sorted into pile view. Returns if the view should be sorted into pile view.
@return zoneViewPileView if the view should be sorted into pile view. @return zoneViewPileView if the view should be sorted into pile view.
*/ */
bool getZoneViewPileView() const [[nodiscard]] bool getZoneViewPileView() const
{ {
return zoneViewPileView; return zoneViewPileView;
} }
bool getSoundEnabled() const [[nodiscard]] bool getSoundEnabled() const
{ {
return soundEnabled; return soundEnabled;
} }
QString getSoundThemeName() const [[nodiscard]] QString getSoundThemeName() const
{ {
return soundThemeName; return soundThemeName;
} }
bool getIgnoreUnregisteredUsers() const [[nodiscard]] bool getIgnoreUnregisteredUsers() const
{ {
return ignoreUnregisteredUsers; return ignoreUnregisteredUsers;
} }
bool getIgnoreUnregisteredUserMessages() const [[nodiscard]] bool getIgnoreUnregisteredUserMessages() const
{ {
return ignoreUnregisteredUserMessages; return ignoreUnregisteredUserMessages;
} }
int getPixmapCacheSize() const [[nodiscard]] int getPixmapCacheSize() const
{ {
return pixmapCacheSize; return pixmapCacheSize;
} }
int getNetworkCacheSizeInMB() const [[nodiscard]] int getNetworkCacheSizeInMB() const
{ {
return networkCacheSize; return networkCacheSize;
} }
int getRedirectCacheTtl() const [[nodiscard]] int getRedirectCacheTtl() const
{ {
return redirectCacheTtl; return redirectCacheTtl;
} }
bool getScaleCards() const [[nodiscard]] bool getScaleCards() const
{ {
return scaleCards; return scaleCards;
} }
int getStackCardOverlapPercent() const [[nodiscard]] int getStackCardOverlapPercent() const
{ {
return verticalCardOverlapPercent; return verticalCardOverlapPercent;
} }
bool getShowMessagePopup() const [[nodiscard]] bool getShowMessagePopup() const
{ {
return showMessagePopups; return showMessagePopups;
} }
bool getShowMentionPopup() const [[nodiscard]] bool getShowMentionPopup() const
{ {
return showMentionPopups; return showMentionPopups;
} }
bool getRoomHistory() const [[nodiscard]] bool getRoomHistory() const
{ {
return roomHistory; return roomHistory;
} }
bool getLeftJustified() const [[nodiscard]] bool getLeftJustified() const
{ {
return leftJustified; return leftJustified;
} }
int getMasterVolume() const [[nodiscard]] int getMasterVolume() const
{ {
return masterVolume; return masterVolume;
} }
int getCardInfoViewMode() const [[nodiscard]] int getCardInfoViewMode() const
{ {
return cardInfoViewMode; return cardInfoViewMode;
} }
QStringList getCountries() const; [[nodiscard]] QStringList getCountries() const;
QString getHighlightWords() const [[nodiscard]] QString getHighlightWords() const
{ {
return highlightWords; return highlightWords;
} }
QString getGameDescription() const [[nodiscard]] QString getGameDescription() const
{ {
return gameDescription; return gameDescription;
} }
int getMaxPlayers() const [[nodiscard]] int getMaxPlayers() const
{ {
return maxPlayers; return maxPlayers;
} }
QString getGameTypes() const [[nodiscard]] QString getGameTypes() const
{ {
return gameTypes; return gameTypes;
} }
bool getOnlyBuddies() const [[nodiscard]] bool getOnlyBuddies() const
{ {
return onlyBuddies; return onlyBuddies;
} }
bool getOnlyRegistered() const [[nodiscard]] bool getOnlyRegistered() const
{ {
return onlyRegistered; return onlyRegistered;
} }
bool getSpectatorsAllowed() const [[nodiscard]] bool getSpectatorsAllowed() const
{ {
return spectatorsAllowed; return spectatorsAllowed;
} }
bool getSpectatorsNeedPassword() const [[nodiscard]] bool getSpectatorsNeedPassword() const
{ {
return spectatorsNeedPassword; return spectatorsNeedPassword;
} }
bool getSpectatorsCanTalk() const [[nodiscard]] bool getSpectatorsCanTalk() const
{ {
return spectatorsCanTalk; return spectatorsCanTalk;
} }
bool getSpectatorsCanSeeEverything() const [[nodiscard]] bool getSpectatorsCanSeeEverything() const
{ {
return spectatorsCanSeeEverything; return spectatorsCanSeeEverything;
} }
int getDefaultStartingLifeTotal() const [[nodiscard]] int getDefaultStartingLifeTotal() const
{ {
return defaultStartingLifeTotal; return defaultStartingLifeTotal;
} }
bool getShareDecklistsOnLoad() const [[nodiscard]] bool getShareDecklistsOnLoad() const
{ {
return shareDecklistsOnLoad; return shareDecklistsOnLoad;
} }
bool getCreateGameAsSpectator() const [[nodiscard]] bool getCreateGameAsSpectator() const
{ {
return createGameAsSpectator; return createGameAsSpectator;
} }
bool getRememberGameSettings() const [[nodiscard]] bool getRememberGameSettings() const
{ {
return rememberGameSettings; return rememberGameSettings;
} }
int getKeepAlive() const override [[nodiscard]] int getKeepAlive() const override
{ {
return keepalive; return keepalive;
} }
int getTimeOut() const override [[nodiscard]] int getTimeOut() const override
{ {
return timeout; return timeout;
} }
int getMaxFontSize() const [[nodiscard]] int getMaxFontSize() const
{ {
return maxFontSize; return maxFontSize;
} }
@ -877,73 +900,73 @@ public:
{ {
return useTearOffMenus; return useTearOffMenus;
} }
int getCardViewInitialRowsMax() const [[nodiscard]] int getCardViewInitialRowsMax() const
{ {
return cardViewInitialRowsMax; return cardViewInitialRowsMax;
} }
int getCardViewExpandedRowsMax() const [[nodiscard]] int getCardViewExpandedRowsMax() const
{ {
return cardViewExpandedRowsMax; return cardViewExpandedRowsMax;
} }
bool getCloseEmptyCardView() const [[nodiscard]] bool getCloseEmptyCardView() const
{ {
return closeEmptyCardView; return closeEmptyCardView;
} }
bool getFocusCardViewSearchBar() const [[nodiscard]] bool getFocusCardViewSearchBar() const
{ {
return focusCardViewSearchBar; return focusCardViewSearchBar;
} }
ShortcutsSettings &shortcuts() const [[nodiscard]] ShortcutsSettings &shortcuts() const
{ {
return *shortcutsSettings; return *shortcutsSettings;
} }
CardDatabaseSettings *cardDatabase() const [[nodiscard]] CardDatabaseSettings *cardDatabase() const
{ {
return cardDatabaseSettings; return cardDatabaseSettings;
} }
ServersSettings &servers() const [[nodiscard]] ServersSettings &servers() const
{ {
return *serversSettings; return *serversSettings;
} }
MessageSettings &messages() const [[nodiscard]] MessageSettings &messages() const
{ {
return *messageSettings; return *messageSettings;
} }
GameFiltersSettings &gameFilters() const [[nodiscard]] GameFiltersSettings &gameFilters() const
{ {
return *gameFiltersSettings; return *gameFiltersSettings;
} }
LayoutsSettings &layouts() const [[nodiscard]] LayoutsSettings &layouts() const
{ {
return *layoutsSettings; return *layoutsSettings;
} }
DownloadSettings &downloads() const [[nodiscard]] DownloadSettings &downloads() const
{ {
return *downloadSettings; return *downloadSettings;
} }
RecentsSettings &recents() const [[nodiscard]] RecentsSettings &recents() const
{ {
return *recentsSettings; return *recentsSettings;
} }
CardOverrideSettings &cardOverrides() const [[nodiscard]] CardOverrideSettings &cardOverrides() const
{ {
return *cardOverrideSettings; return *cardOverrideSettings;
} }
DebugSettings &debug() const [[nodiscard]] DebugSettings &debug() const
{ {
return *debugSettings; return *debugSettings;
} }
CardCounterSettings &cardCounters() const; [[nodiscard]] CardCounterSettings &cardCounters() const;
bool getIsPortableBuild() const [[nodiscard]] bool getIsPortableBuild() const
{ {
return isPortableBuild; return isPortableBuild;
} }
bool getDownloadSpoilersStatus() const [[nodiscard]] bool getDownloadSpoilersStatus() const
{ {
return mbDownloadSpoilers; return mbDownloadSpoilers;
} }
bool getRoundCardCorners() const [[nodiscard]] bool getRoundCardCorners() const
{ {
return roundCardCorners; return roundCardCorners;
} }
@ -1018,6 +1041,10 @@ public slots:
void setVisualDeckStorageAlwaysConvert(bool _visualDeckStorageAlwaysConvert); void setVisualDeckStorageAlwaysConvert(bool _visualDeckStorageAlwaysConvert);
void setVisualDeckStorageInGame(QT_STATE_CHANGED_T value); void setVisualDeckStorageInGame(QT_STATE_CHANGED_T value);
void setVisualDeckStorageSelectionAnimation(QT_STATE_CHANGED_T value); void setVisualDeckStorageSelectionAnimation(QT_STATE_CHANGED_T value);
void setVisualDeckEditorCardSize(int _visualDeckEditorCardSize);
void setVisualDatabaseDisplayCardSize(int _visualDatabaseDisplayCardSize);
void setEDHRecCardSize(int _EDHRecCardSize);
void setArchidektPreviewCardSize(int _archidektPreviewCardSize);
void setDefaultDeckEditorType(int value); void setDefaultDeckEditorType(int value);
void setVisualDatabaseDisplayFilterToMostRecentSetsEnabled(QT_STATE_CHANGED_T _enabled); void setVisualDatabaseDisplayFilterToMostRecentSetsEnabled(QT_STATE_CHANGED_T _enabled);
void setVisualDatabaseDisplayFilterToMostRecentSetsAmount(int _amount); void setVisualDatabaseDisplayFilterToMostRecentSetsAmount(int _amount);

View file

@ -7,7 +7,6 @@
#ifndef CARD_COUNTER_SETTINGS_H #ifndef CARD_COUNTER_SETTINGS_H
#define CARD_COUNTER_SETTINGS_H #define CARD_COUNTER_SETTINGS_H
#include <QObject>
#include <libcockatrice/settings/settings_manager.h> #include <libcockatrice/settings/settings_manager.h>
class QSettings; class QSettings;
@ -20,9 +19,9 @@ class CardCounterSettings : public SettingsManager
public: public:
CardCounterSettings(const QString &settingsPath, QObject *parent = nullptr); CardCounterSettings(const QString &settingsPath, QObject *parent = nullptr);
QColor color(int counterId) const; [[nodiscard]] QColor color(int counterId) const;
QString displayName(int counterId) const; [[nodiscard]] QString displayName(int counterId) const;
public slots: public slots:
void setColor(int counterId, const QColor &color); void setColor(int counterId, const QColor &color);

View file

@ -7,7 +7,6 @@
#ifndef SHORTCUT_TREEVIEW_H #ifndef SHORTCUT_TREEVIEW_H
#define SHORTCUT_TREEVIEW_H #define SHORTCUT_TREEVIEW_H
#include <QModelIndex>
#include <QSortFilterProxyModel> #include <QSortFilterProxyModel>
#include <QStandardItemModel> #include <QStandardItemModel>
#include <QTreeView> #include <QTreeView>
@ -22,7 +21,7 @@ public:
explicit ShortcutFilterProxyModel(QObject *parent = nullptr); explicit ShortcutFilterProxyModel(QObject *parent = nullptr);
protected: protected:
bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override; [[nodiscard]] bool filterAcceptsRow(int sourceRow, const QModelIndex &sourceParent) const override;
}; };
class ShortcutTreeView : public QTreeView class ShortcutTreeView : public QTreeView

View file

@ -99,15 +99,15 @@ public:
void setSequence(const QList &_sequence) void setSequence(const QList &_sequence)
{ {
QList::operator=(_sequence); QList::operator=(_sequence);
}; }
QString getName() const [[nodiscard]] QString getName() const
{ {
return QApplication::translate("shortcutsTab", name.toUtf8().data()); return QApplication::translate("shortcutsTab", name.toUtf8().data());
}; }
QString getGroupName() const [[nodiscard]] QString getGroupName() const
{ {
return ShortcutGroup::getGroupName(group); return ShortcutGroup::getGroupName(group);
}; }
private: private:
QString name; QString name;
@ -120,24 +120,24 @@ class ShortcutsSettings : public QObject
public: public:
explicit ShortcutsSettings(const QString &settingsFilePath, QObject *parent = nullptr); explicit ShortcutsSettings(const QString &settingsFilePath, QObject *parent = nullptr);
ShortcutKey getDefaultShortcut(const QString &name) const; [[nodiscard]] ShortcutKey getDefaultShortcut(const QString &name) const;
ShortcutKey getShortcut(const QString &name) const; [[nodiscard]] ShortcutKey getShortcut(const QString &name) const;
QKeySequence getSingleShortcut(const QString &name) const; [[nodiscard]] QKeySequence getSingleShortcut(const QString &name) const;
QString getDefaultShortcutString(const QString &name) const; [[nodiscard]] QString getDefaultShortcutString(const QString &name) const;
QString getShortcutString(const QString &name) const; [[nodiscard]] QString getShortcutString(const QString &name) const;
QString getShortcutFriendlyName(const QString &shortcutName) const; [[nodiscard]] QString getShortcutFriendlyName(const QString &shortcutName) const;
QList<QString> getAllShortcutKeys() const [[nodiscard]] QList<QString> getAllShortcutKeys() const
{ {
return shortCuts.keys(); return shortCuts.keys();
}; }
void setShortcuts(const QString &name, const QList<QKeySequence> &Sequence); void setShortcuts(const QString &name, const QList<QKeySequence> &Sequence);
void setShortcuts(const QString &name, const QKeySequence &Sequence); void setShortcuts(const QString &name, const QKeySequence &Sequence);
void setShortcuts(const QString &name, const QString &sequences); void setShortcuts(const QString &name, const QString &sequences);
bool isKeyAllowed(const QString &name, const QString &sequences) const; [[nodiscard]] bool isKeyAllowed(const QString &name, const QString &sequences) const;
bool isValid(const QString &name, const QString &sequences) const; [[nodiscard]] bool isValid(const QString &name, const QString &sequences) const;
QStringList findOverlaps(const QString &name, const QString &sequences) const; [[nodiscard]] QStringList findOverlaps(const QString &name, const QString &sequences) const;
void resetAllShortcuts(); void resetAllShortcuts();
void clearAllShortcuts(); void clearAllShortcuts();
@ -152,8 +152,8 @@ private:
QString settingsFilePath; QString settingsFilePath;
QHash<QString, ShortcutKey> shortCuts; QHash<QString, ShortcutKey> shortCuts;
QString stringifySequence(const QList<QKeySequence> &Sequence) const; [[nodiscard]] QString stringifySequence(const QList<QKeySequence> &Sequence) const;
QList<QKeySequence> parseSequenceString(const QString &stringSequence) const; [[nodiscard]] QList<QKeySequence> parseSequenceString(const QString &stringSequence) const;
const QHash<QString, ShortcutKey> defaultShortCuts = { const QHash<QString, ShortcutKey> defaultShortCuts = {
{"MainWindow/aCheckCardUpdates", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Check for Card Updates..."), {"MainWindow/aCheckCardUpdates", ShortcutKey(QT_TRANSLATE_NOOP("shortcutsTab", "Check for Card Updates..."),

View file

@ -7,15 +7,15 @@
class SettingsCardPreferenceProvider : public ICardPreferenceProvider class SettingsCardPreferenceProvider : public ICardPreferenceProvider
{ {
public: public:
QString getCardPreferenceOverride(const QString &cardName) const override [[nodiscard]] QString getCardPreferenceOverride(const QString &cardName) const override
{ {
return SettingsCache::instance().cardOverrides().getCardPreferenceOverride(cardName); return SettingsCache::instance().cardOverrides().getCardPreferenceOverride(cardName);
} }
bool getIncludeRebalancedCards() const override [[nodiscard]] bool getIncludeRebalancedCards() const override
{ {
return SettingsCache::instance().getIncludeRebalancedCards(); return SettingsCache::instance().getIncludeRebalancedCards();
}; }
}; };
#endif // COCKATRICE_SETTINGS_CARD_PREFERENCE_PROVIDER_H #endif // COCKATRICE_SETTINGS_CARD_PREFERENCE_PROVIDER_H

View file

@ -1,5 +1,6 @@
#include "deck_filter_string.h" #include "deck_filter_string.h"
#include <QFileInfo>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/filters/filter_string.h> #include <libcockatrice/filters/filter_string.h>
#include <libcockatrice/utility/peglib.h> #include <libcockatrice/utility/peglib.h>
@ -117,12 +118,13 @@ static void setupParserRules()
return [=](const DeckPreviewWidget *deck, const ExtraDeckSearchInfo &) -> bool { return [=](const DeckPreviewWidget *deck, const ExtraDeckSearchInfo &) -> bool {
int count = 0; int count = 0;
deck->deckLoader->getDeckList()->forEachCard([&](InnerDecklistNode *, const DecklistCardNode *node) { auto cardNodes = deck->deckLoader->getDeckList()->getCardNodes();
for (auto node : cardNodes) {
auto cardInfoPtr = CardDatabaseManager::query()->getCardInfo(node->getName()); auto cardInfoPtr = CardDatabaseManager::query()->getCardInfo(node->getName());
if (!cardInfoPtr.isNull() && cardFilter.check(cardInfoPtr)) { if (!cardInfoPtr.isNull() && cardFilter.check(cardInfoPtr)) {
count += node->getNumber(); count += node->getNumber();
} }
}); }
return numberMatcher(count); return numberMatcher(count);
}; };
}; };

View file

@ -10,10 +10,8 @@
#include "../interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h" #include "../interface/widgets/visual_deck_storage/deck_preview/deck_preview_widget.h"
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QMap>
#include <QString> #include <QString>
#include <functional> #include <functional>
#include <utility>
inline Q_LOGGING_CATEGORY(DeckFilterStringLog, "deck_filter_string"); inline Q_LOGGING_CATEGORY(DeckFilterStringLog, "deck_filter_string");
@ -40,7 +38,7 @@ public:
return filter(deck, info); return filter(deck, info);
} }
bool valid() const [[nodiscard]] bool valid() const
{ {
return _error.isEmpty(); return _error.isEmpty();
} }

View file

@ -24,8 +24,8 @@ public slots:
void addFilter(const CardFilter *f); void addFilter(const CardFilter *f);
void removeFilter(const CardFilter *f); void removeFilter(const CardFilter *f);
void clearFiltersOfType(CardFilter::Attr filterType); void clearFiltersOfType(CardFilter::Attr filterType);
QList<const CardFilter *> getFiltersOfType(CardFilter::Attr filterType) const; [[nodiscard]] QList<const CardFilter *> getFiltersOfType(CardFilter::Attr filterType) const;
QList<const CardFilter *> allFilters() const; [[nodiscard]] QList<const CardFilter *> allFilters() const;
private slots: private slots:
void proxyBeginInsertRow(const FilterTreeNode *, int); void proxyBeginInsertRow(const FilterTreeNode *, int);
@ -34,23 +34,23 @@ private slots:
void proxyEndRemoveRow(const FilterTreeNode *, int); void proxyEndRemoveRow(const FilterTreeNode *, int);
private: private:
FilterTreeNode *indexToNode(const QModelIndex &idx) const; [[nodiscard]] FilterTreeNode *indexToNode(const QModelIndex &idx) const;
QModelIndex nodeIndex(const FilterTreeNode *node, int row, int column) const; QModelIndex nodeIndex(const FilterTreeNode *node, int row, int column) const;
public: public:
FilterTreeModel(QObject *parent = nullptr); FilterTreeModel(QObject *parent = nullptr);
~FilterTreeModel() override; ~FilterTreeModel() override;
FilterTree *filterTree() const [[nodiscard]] FilterTree *filterTree() const
{ {
return fTree; return fTree;
} }
int rowCount(const QModelIndex &parent = QModelIndex()) const override; [[nodiscard]] int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex & /*parent*/ = QModelIndex()) const override; [[nodiscard]] int columnCount(const QModelIndex & /*parent*/ = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role) const override; [[nodiscard]] QVariant data(const QModelIndex &index, int role) const override;
bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override; bool setData(const QModelIndex &index, const QVariant &value, int role = Qt::EditRole) override;
Qt::ItemFlags flags(const QModelIndex &index) const override; [[nodiscard]] Qt::ItemFlags flags(const QModelIndex &index) const override;
QModelIndex parent(const QModelIndex &ind) const override; [[nodiscard]] QModelIndex parent(const QModelIndex &ind) const override;
QModelIndex index(int row, int column, const QModelIndex &parent) const override; [[nodiscard]] QModelIndex index(int row, int column, const QModelIndex &parent) const override;
bool removeRows(int row, int count, const QModelIndex &parent) override; bool removeRows(int row, int count, const QModelIndex &parent) override;
void clear(); void clear();
}; };

View file

@ -3,15 +3,14 @@
#include "../../client/settings/cache_settings.h" #include "../../client/settings/cache_settings.h"
#include "../../interface/widgets/tabs/tab_game.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../player/player.h" #include "../player/player.h"
#include "../player/player_actions.h"
#include "translate_counter_name.h" #include "translate_counter_name.h"
#include <QAction> #include <QAction>
#include <QApplication> #include <QApplication>
#include <QGraphicsSceneHoverEvent>
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <QKeyEvent> #include <QKeyEvent>
#include <QMenu> #include <QMenu>
#include <QPainter>
#include <QString> #include <QString>
#include <libcockatrice/protocol/pb/command_inc_counter.pb.h> #include <libcockatrice/protocol/pb/command_inc_counter.pb.h>
#include <libcockatrice/protocol/pb/command_set_counter.pb.h> #include <libcockatrice/protocol/pb/command_set_counter.pb.h>

View file

@ -3,6 +3,7 @@
#include "../../client/settings/cache_settings.h" #include "../../client/settings/cache_settings.h"
#include "../player/player.h" #include "../player/player.h"
#include "../player/player_actions.h"
#include "../player/player_target.h" #include "../player/player_target.h"
#include "../zones/card_zone.h" #include "../zones/card_zone.h"
#include "card_item.h" #include "card_item.h"

View file

@ -5,7 +5,7 @@
#include "../game_scene.h" #include "../game_scene.h"
#include "../phase.h" #include "../phase.h"
#include "../player/player.h" #include "../player/player.h"
#include "../zones/card_zone.h" #include "../player/player_actions.h"
#include "../zones/logic/view_zone_logic.h" #include "../zones/logic/view_zone_logic.h"
#include "../zones/table_zone.h" #include "../zones/table_zone.h"
#include "../zones/view_zone.h" #include "../zones/view_zone.h"

View file

@ -10,7 +10,7 @@
#include <algorithm> #include <algorithm>
#include <libcockatrice/card/card_info.h> #include <libcockatrice/card/card_info.h>
#include <libcockatrice/deck_list/deck_list.h> #include <libcockatrice/deck_list/deck_list.h>
#include <libcockatrice/deck_list/deck_list_card_node.h> #include <libcockatrice/deck_list/tree/deck_list_card_node.h>
DeckViewCardDragItem::DeckViewCardDragItem(DeckViewCard *_item, DeckViewCardDragItem::DeckViewCardDragItem(DeckViewCard *_item,
const QPointF &_hotSpot, const QPointF &_hotSpot,
@ -343,10 +343,7 @@ void DeckViewScene::rebuildTree()
if (!deck) if (!deck)
return; return;
InnerDecklistNode *listRoot = deck->getRoot(); for (auto *currentZone : deck->getZoneNodes()) {
for (int i = 0; i < listRoot->size(); i++) {
auto *currentZone = dynamic_cast<InnerDecklistNode *>(listRoot->at(i));
DeckViewCardContainer *container = cardContainers.value(currentZone->getName(), 0); DeckViewCardContainer *container = cardContainers.value(currentZone->getName(), 0);
if (!container) { if (!container) {
container = new DeckViewCardContainer(currentZone->getName()); container = new DeckViewCardContainer(currentZone->getName());

View file

@ -9,11 +9,8 @@
#include "../board/abstract_card_drag_item.h" #include "../board/abstract_card_drag_item.h"
#include <QGraphicsScene>
#include <QGraphicsView> #include <QGraphicsView>
#include <QMap> #include <QMap>
#include <QMultiMap>
#include <QPixmap>
#include <libcockatrice/protocol/pb/move_card_to_zone.pb.h> #include <libcockatrice/protocol/pb/move_card_to_zone.pb.h>
class DeckList; class DeckList;

View file

@ -8,13 +8,9 @@
#include "../../interface/widgets/dialogs/dlg_load_deck_from_website.h" #include "../../interface/widgets/dialogs/dlg_load_deck_from_website.h"
#include "../../interface/widgets/dialogs/dlg_load_remote_deck.h" #include "../../interface/widgets/dialogs/dlg_load_remote_deck.h"
#include "../../interface/widgets/tabs/tab_game.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../game_scene.h"
#include "deck_view.h" #include "deck_view.h"
#include <QMessageBox> #include <QMessageBox>
#include <QMouseEvent>
#include <QToolButton>
#include <google/protobuf/descriptor.h>
#include <libcockatrice/card/database/card_database.h> #include <libcockatrice/card/database/card_database.h>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/protocol/pb/command_deck_select.pb.h> #include <libcockatrice/protocol/pb/command_deck_select.pb.h>
@ -263,7 +259,7 @@ void DeckViewContainer::loadLocalDeck()
void DeckViewContainer::loadDeckFromFile(const QString &filePath) void DeckViewContainer::loadDeckFromFile(const QString &filePath)
{ {
DeckLoader::FileFormat fmt = DeckLoader::getFormatFromName(filePath); DeckFileFormat::Format fmt = DeckFileFormat::getFormatFromName(filePath);
DeckLoader deck(this); DeckLoader deck(this);
bool success = deck.loadFromFile(filePath, fmt, true); bool success = deck.loadFromFile(filePath, fmt, true);

View file

@ -16,7 +16,6 @@
#include <QLineEdit> #include <QLineEdit>
#include <QRadioButton> #include <QRadioButton>
#include <QTreeView> #include <QTreeView>
#include <QVBoxLayout>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/deck_list/deck_list.h> #include <libcockatrice/deck_list/deck_list.h>
#include <libcockatrice/models/database/card_database_model.h> #include <libcockatrice/models/database/card_database_model.h>

View file

@ -8,7 +8,6 @@
#define DLG_CREATETOKEN_H #define DLG_CREATETOKEN_H
#include <QDialog> #include <QDialog>
#include <QModelIndex>
class QLabel; class QLabel;
class QLineEdit; class QLineEdit;

View file

@ -15,7 +15,6 @@
#include <libcockatrice/protocol/pb/command_set_active_phase.pb.h> #include <libcockatrice/protocol/pb/command_set_active_phase.pb.h>
#include <libcockatrice/protocol/pb/context_connection_state_changed.pb.h> #include <libcockatrice/protocol/pb/context_connection_state_changed.pb.h>
#include <libcockatrice/protocol/pb/context_deck_select.pb.h> #include <libcockatrice/protocol/pb/context_deck_select.pb.h>
#include <libcockatrice/protocol/pb/context_ping_changed.pb.h>
#include <libcockatrice/protocol/pb/event_game_closed.pb.h> #include <libcockatrice/protocol/pb/event_game_closed.pb.h>
#include <libcockatrice/protocol/pb/event_game_host_changed.pb.h> #include <libcockatrice/protocol/pb/event_game_host_changed.pb.h>
#include <libcockatrice/protocol/pb/event_game_say.pb.h> #include <libcockatrice/protocol/pb/event_game_say.pb.h>

View file

@ -8,7 +8,6 @@
#include "zones/view_zone.h" #include "zones/view_zone.h"
#include "zones/view_zone_widget.h" #include "zones/view_zone_widget.h"
#include <QAction>
#include <QBasicTimer> #include <QBasicTimer>
#include <QDebug> #include <QDebug>
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>

View file

@ -7,10 +7,8 @@
#ifndef COCKATRICE_GAME_STATE_H #ifndef COCKATRICE_GAME_STATE_H
#define COCKATRICE_GAME_STATE_H #define COCKATRICE_GAME_STATE_H
#include <QObject>
#include <QTimer> #include <QTimer>
#include <libcockatrice/network/client/abstract/abstract_client.h> #include <libcockatrice/network/client/abstract/abstract_client.h>
#include <libcockatrice/protocol/pb/serverinfo_game.pb.h>
class AbstractGame; class AbstractGame;
class ServerInfo_PlayerProperties; class ServerInfo_PlayerProperties;

View file

@ -6,12 +6,10 @@
#include "../board/translate_counter_name.h" #include "../board/translate_counter_name.h"
#include "../phase.h" #include "../phase.h"
#include "../player/player.h" #include "../player/player.h"
#include "../zones/card_zone.h"
#include <../../client/settings/card_counter_settings.h> #include <../../client/settings/card_counter_settings.h>
#include <libcockatrice/protocol/pb/context_move_card.pb.h> #include <libcockatrice/protocol/pb/context_move_card.pb.h>
#include <libcockatrice/protocol/pb/context_mulligan.pb.h> #include <libcockatrice/protocol/pb/context_mulligan.pb.h>
#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
#include <utility> #include <utility>
static const QString TABLE_ZONE_NAME = "table"; static const QString TABLE_ZONE_NAME = "table";

View file

@ -7,12 +7,9 @@
#ifndef MESSAGELOGWIDGET_H #ifndef MESSAGELOGWIDGET_H
#define MESSAGELOGWIDGET_H #define MESSAGELOGWIDGET_H
#include "../../client/translation.h"
#include "../../interface/widgets/server/chat_view/chat_view.h" #include "../../interface/widgets/server/chat_view/chat_view.h"
#include "../zones/logic/card_zone_logic.h" #include "../zones/logic/card_zone_logic.h"
#include <libcockatrice/network/server/remote/user_level.h>
class AbstractGame; class AbstractGame;
class CardItem; class CardItem;
class GameEventContext; class GameEventContext;

View file

@ -3,7 +3,6 @@
#include "../../abstract_game.h" #include "../../abstract_game.h"
#include "../player.h" #include "../player.h"
#include "../player_actions.h" #include "../player_actions.h"
#include "grave_menu.h"
#include <QAction> #include <QAction>
#include <QMenu> #include <QMenu>

View file

@ -3,12 +3,11 @@
#include "../../../interface/widgets/tabs/tab_game.h" #include "../../../interface/widgets/tabs/tab_game.h"
#include "../../board/card_item.h" #include "../../board/card_item.h"
#include "../../zones/hand_zone.h" #include "../../zones/hand_zone.h"
#include "../card_menu_action_type.h" #include "../../zones/pile_zone.h"
#include "../player_actions.h" #include "../../zones/table_zone.h"
#include "card_menu.h" #include "card_menu.h"
#include "hand_menu.h" #include "hand_menu.h"
#include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/protocol/pb/command_reveal_cards.pb.h> #include <libcockatrice/protocol/pb/command_reveal_cards.pb.h>
PlayerMenu::PlayerMenu(Player *_player) : player(_player) PlayerMenu::PlayerMenu(Player *_player) : player(_player)

View file

@ -1,6 +1,7 @@
#include "sideboard_menu.h" #include "sideboard_menu.h"
#include "../player.h" #include "../player.h"
#include "../player_actions.h"
SideboardMenu::SideboardMenu(Player *player, QMenu *playerMenu) : QMenu(playerMenu) SideboardMenu::SideboardMenu(Player *player, QMenu *playerMenu) : QMenu(playerMenu)
{ {

View file

@ -1,9 +1,13 @@
#include "utility_menu.h" #include "utility_menu.h"
#include "../../../interface/deck_loader/deck_loader.h"
#include "../player.h" #include "../player.h"
#include "../player_actions.h" #include "../player_actions.h"
#include "player_menu.h" #include "player_menu.h"
#include <libcockatrice/deck_list/tree/deck_list_card_node.h>
#include <libcockatrice/deck_list/tree/inner_deck_list_node.h>
UtilityMenu::UtilityMenu(Player *_player, QMenu *playerMenu) : QMenu(playerMenu), player(_player) UtilityMenu::UtilityMenu(Player *_player, QMenu *playerMenu) : QMenu(playerMenu), player(_player)
{ {
PlayerActions *playerActions = player->getPlayerActions(); PlayerActions *playerActions = player->getPlayerActions();
@ -62,15 +66,13 @@ void UtilityMenu::populatePredefinedTokensMenu()
return; return;
} }
InnerDecklistNode *tokenZone = auto tokenCardNodes = _deck->getDeckList()->getCardNodes({DECK_ZONE_TOKENS});
dynamic_cast<InnerDecklistNode *>(_deck->getDeckList()->getRoot()->findChild(DECK_ZONE_TOKENS));
if (tokenZone) { if (!tokenCardNodes.isEmpty()) {
if (!tokenZone->empty())
setEnabled(true); setEnabled(true);
for (int i = 0; i < tokenZone->size(); ++i) { for (int i = 0; i < tokenCardNodes.size(); ++i) {
const QString tokenName = tokenZone->at(i)->getName(); const QString tokenName = tokenCardNodes[i]->getName();
predefinedTokens.append(tokenName); predefinedTokens.append(tokenName);
QAction *a = addAction(tokenName); QAction *a = addAction(tokenName);
if (i < 10) { if (i < 10) {

View file

@ -11,7 +11,7 @@
#include "../zones/pile_zone.h" #include "../zones/pile_zone.h"
#include "../zones/stack_zone.h" #include "../zones/stack_zone.h"
#include "../zones/table_zone.h" #include "../zones/table_zone.h"
#include "../zones/view_zone.h" #include "player_actions.h"
#include "player_target.h" #include "player_target.h"
#include <QDebug> #include <QDebug>

View file

@ -9,9 +9,11 @@
#include "../../game_graphics/board/abstract_graphics_item.h" #include "../../game_graphics/board/abstract_graphics_item.h"
#include "../../interface/widgets/menus/tearoff_menu.h" #include "../../interface/widgets/menus/tearoff_menu.h"
#include "../dialogs/dlg_create_token.h" #include "../zones/logic/hand_zone_logic.h"
#include "../zones/logic/pile_zone_logic.h"
#include "../zones/logic/stack_zone_logic.h"
#include "../zones/logic/table_zone_logic.h"
#include "menu/player_menu.h" #include "menu/player_menu.h"
#include "player_actions.h"
#include "player_area.h" #include "player_area.h"
#include "player_event_handler.h" #include "player_event_handler.h"
#include "player_graphics_item.h" #include "player_graphics_item.h"
@ -20,9 +22,7 @@
#include <QInputDialog> #include <QInputDialog>
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QMap> #include <QMap>
#include <QPoint>
#include <QTimer> #include <QTimer>
#include <libcockatrice/card/card_info.h>
#include <libcockatrice/filters/filter_string.h> #include <libcockatrice/filters/filter_string.h>
#include <libcockatrice/protocol/pb/card_attributes.pb.h> #include <libcockatrice/protocol/pb/card_attributes.pb.h>
#include <libcockatrice/protocol/pb/game_event.pb.h> #include <libcockatrice/protocol/pb/game_event.pb.h>
@ -113,7 +113,7 @@ public:
[[nodiscard]] PlayerActions *getPlayerActions() const [[nodiscard]] PlayerActions *getPlayerActions() const
{ {
return playerActions; return playerActions;
}; }
[[nodiscard]] PlayerEventHandler *getPlayerEventHandler() const [[nodiscard]] PlayerEventHandler *getPlayerEventHandler() const
{ {
@ -123,7 +123,7 @@ public:
[[nodiscard]] PlayerInfo *getPlayerInfo() const [[nodiscard]] PlayerInfo *getPlayerInfo() const
{ {
return playerInfo; return playerInfo;
}; }
[[nodiscard]] PlayerMenu *getPlayerMenu() const [[nodiscard]] PlayerMenu *getPlayerMenu() const
{ {

View file

@ -5,14 +5,15 @@
#include "../board/card_item.h" #include "../board/card_item.h"
#include "../dialogs/dlg_move_top_cards_until.h" #include "../dialogs/dlg_move_top_cards_until.h"
#include "../dialogs/dlg_roll_dice.h" #include "../dialogs/dlg_roll_dice.h"
#include "../zones/hand_zone.h"
#include "../zones/logic/view_zone_logic.h" #include "../zones/logic/view_zone_logic.h"
#include "../zones/table_zone.h"
#include "card_menu_action_type.h" #include "card_menu_action_type.h"
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/card/relation/card_relation.h> #include <libcockatrice/card/relation/card_relation.h>
#include <libcockatrice/protocol/pb/command_attach_card.pb.h> #include <libcockatrice/protocol/pb/command_attach_card.pb.h>
#include <libcockatrice/protocol/pb/command_change_zone_properties.pb.h> #include <libcockatrice/protocol/pb/command_change_zone_properties.pb.h>
#include <libcockatrice/protocol/pb/command_concede.pb.h>
#include <libcockatrice/protocol/pb/command_create_token.pb.h> #include <libcockatrice/protocol/pb/command_create_token.pb.h>
#include <libcockatrice/protocol/pb/command_draw_cards.pb.h> #include <libcockatrice/protocol/pb/command_draw_cards.pb.h>
#include <libcockatrice/protocol/pb/command_flip_card.pb.h> #include <libcockatrice/protocol/pb/command_flip_card.pb.h>

View file

@ -7,6 +7,7 @@
#ifndef COCKATRICE_PLAYER_ACTIONS_H #ifndef COCKATRICE_PLAYER_ACTIONS_H
#define COCKATRICE_PLAYER_ACTIONS_H #define COCKATRICE_PLAYER_ACTIONS_H
#include "../dialogs/dlg_create_token.h"
#include "event_processing_options.h" #include "event_processing_options.h"
#include "player.h" #include "player.h"

View file

@ -6,6 +6,7 @@
#include "../board/card_list.h" #include "../board/card_list.h"
#include "../zones/view_zone.h" #include "../zones/view_zone.h"
#include "player.h" #include "player.h"
#include "player_actions.h"
#include <libcockatrice/protocol/pb/command_set_card_attr.pb.h> #include <libcockatrice/protocol/pb/command_set_card_attr.pb.h>
#include <libcockatrice/protocol/pb/context_move_card.pb.h> #include <libcockatrice/protocol/pb/context_move_card.pb.h>

View file

@ -1,7 +1,12 @@
#include "player_graphics_item.h" #include "player_graphics_item.h"
#include "../../interface/widgets/tabs/tab_game.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../board/abstract_card_item.h"
#include "../hand_counter.h" #include "../hand_counter.h"
#include "../zones/hand_zone.h"
#include "../zones/pile_zone.h"
#include "../zones/stack_zone.h"
#include "../zones/table_zone.h"
PlayerGraphicsItem::PlayerGraphicsItem(Player *_player) : player(_player) PlayerGraphicsItem::PlayerGraphicsItem(Player *_player) : player(_player)
{ {

View file

@ -7,11 +7,6 @@
#ifndef COCKATRICE_PLAYER_INFO_H #ifndef COCKATRICE_PLAYER_INFO_H
#define COCKATRICE_PLAYER_INFO_H #define COCKATRICE_PLAYER_INFO_H
#include "../../interface/deck_loader/deck_loader.h"
#include "../zones/hand_zone.h"
#include "../zones/pile_zone.h"
#include "../zones/stack_zone.h"
#include "../zones/table_zone.h"
#include "player_target.h" #include "player_target.h"
#include <QObject> #include <QObject>

View file

@ -4,15 +4,11 @@
#include "../../interface/widgets/server/user/user_context_menu.h" #include "../../interface/widgets/server/user/user_context_menu.h"
#include "../../interface/widgets/server/user/user_list_manager.h" #include "../../interface/widgets/server/user/user_list_manager.h"
#include "../../interface/widgets/server/user/user_list_widget.h" #include "../../interface/widgets/server/user/user_list_widget.h"
#include "../../interface/widgets/tabs/tab_account.h"
#include "../../interface/widgets/tabs/tab_game.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../../interface/widgets/tabs/tab_supervisor.h" #include "../../interface/widgets/tabs/tab_supervisor.h"
#include <QAction>
#include <QHeaderView> #include <QHeaderView>
#include <QMenu>
#include <QMouseEvent> #include <QMouseEvent>
#include <libcockatrice/network/client/abstract/abstract_client.h>
#include <libcockatrice/protocol/pb/command_kick_from_game.pb.h> #include <libcockatrice/protocol/pb/command_kick_from_game.pb.h>
#include <libcockatrice/protocol/pb/serverinfo_playerproperties.pb.h> #include <libcockatrice/protocol/pb/serverinfo_playerproperties.pb.h>
#include <libcockatrice/protocol/pb/session_commands.pb.h> #include <libcockatrice/protocol/pb/session_commands.pb.h>

View file

@ -11,7 +11,6 @@
#include "../board/abstract_counter.h" #include "../board/abstract_counter.h"
#include "../board/arrow_target.h" #include "../board/arrow_target.h"
#include <QFont>
#include <QPixmap> #include <QPixmap>
class Player; class Player;

View file

@ -5,6 +5,7 @@
#include "../board/card_drag_item.h" #include "../board/card_drag_item.h"
#include "../board/card_item.h" #include "../board/card_item.h"
#include "../player/player.h" #include "../player/player.h"
#include "../player/player_actions.h"
#include <QPainter> #include <QPainter>
#include <libcockatrice/protocol/pb/command_move_card.pb.h> #include <libcockatrice/protocol/pb/command_move_card.pb.h>

View file

@ -2,7 +2,7 @@
#include "../../board/card_item.h" #include "../../board/card_item.h"
#include "../../player/player.h" #include "../../player/player.h"
#include "../pile_zone.h" #include "../../player/player_actions.h"
#include "../view_zone.h" #include "../view_zone.h"
#include "view_zone_logic.h" #include "view_zone_logic.h"
@ -10,7 +10,6 @@
#include <QDebug> #include <QDebug>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/protocol/pb/command_move_card.pb.h> #include <libcockatrice/protocol/pb/command_move_card.pb.h>
#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
/** /**
* @param _player the player that the zone belongs to * @param _player the player that the zone belongs to
@ -148,17 +147,24 @@ void CardZoneLogic::moveAllToZone()
void CardZoneLogic::clearContents() void CardZoneLogic::clearContents()
{ {
for (int i = 0; i < cards.size(); i++) { // First gather the cards into a safe temporary list.
const CardList toClear = cards;
// Detach and notify attached cards and zones *before* deleting anything.
for (CardItem *card : toClear) {
// If an incorrectly implemented server doesn't return attached cards to whom they belong before dropping a // If an incorrectly implemented server doesn't return attached cards to whom they belong before dropping a
// player, we have to return them to avoid a crash. // player, we have to return them to avoid a crash.
const QList<CardItem *> &attachedCards = card->getAttachedCards();
const QList<CardItem *> &attachedCards = cards[i]->getAttachedCards(); for (CardItem *attachedCard : attachedCards) {
for (auto attachedCard : attachedCards) {
emit attachedCard->getZone()->cardAdded(attachedCard); emit attachedCard->getZone()->cardAdded(attachedCard);
} }
player->deleteCard(cards.at(i));
} }
// Now request deletions after all manipulations are done.
for (CardItem *card : toClear) {
player->deleteCard(card);
}
cards.clear(); cards.clear();
emit cardCountChanged(); emit cardCountChanged();
} }

View file

@ -52,7 +52,7 @@ public:
void rawInsertCard(CardItem *card, int index) void rawInsertCard(CardItem *card, int index)
{ {
cards.insert(index, card); cards.insert(index, card);
}; }
[[nodiscard]] const CardList &getCards() const [[nodiscard]] const CardList &getCards() const
{ {

View file

@ -3,6 +3,7 @@
#include "../board/card_drag_item.h" #include "../board/card_drag_item.h"
#include "../board/card_item.h" #include "../board/card_item.h"
#include "../player/player.h" #include "../player/player.h"
#include "../player/player_actions.h"
#include "logic/pile_zone_logic.h" #include "logic/pile_zone_logic.h"
#include "view_zone.h" #include "view_zone.h"

View file

@ -6,10 +6,10 @@
#include "../board/card_drag_item.h" #include "../board/card_drag_item.h"
#include "../board/card_item.h" #include "../board/card_item.h"
#include "../player/player.h" #include "../player/player.h"
#include "../player/player_actions.h"
#include "logic/stack_zone_logic.h" #include "logic/stack_zone_logic.h"
#include <QPainter> #include <QPainter>
#include <QSet>
#include <libcockatrice/protocol/pb/command_move_card.pb.h> #include <libcockatrice/protocol/pb/command_move_card.pb.h>
StackZone::StackZone(StackZoneLogic *_logic, int _zoneHeight, QGraphicsItem *parent) StackZone::StackZone(StackZoneLogic *_logic, int _zoneHeight, QGraphicsItem *parent)

View file

@ -6,11 +6,11 @@
#include "../board/card_drag_item.h" #include "../board/card_drag_item.h"
#include "../board/card_item.h" #include "../board/card_item.h"
#include "../player/player.h" #include "../player/player.h"
#include "../player/player_actions.h"
#include "logic/table_zone_logic.h" #include "logic/table_zone_logic.h"
#include <QGraphicsScene> #include <QGraphicsScene>
#include <QPainter> #include <QPainter>
#include <QSet>
#include <libcockatrice/card/card_info.h> #include <libcockatrice/card/card_info.h>
#include <libcockatrice/protocol/pb/command_move_card.pb.h> #include <libcockatrice/protocol/pb/command_move_card.pb.h>
#include <libcockatrice/protocol/pb/command_set_card_attr.pb.h> #include <libcockatrice/protocol/pb/command_set_card_attr.pb.h>

View file

@ -3,6 +3,7 @@
#include "../board/card_drag_item.h" #include "../board/card_drag_item.h"
#include "../board/card_item.h" #include "../board/card_item.h"
#include "../player/player.h" #include "../player/player.h"
#include "../player/player_actions.h"
#include "logic/view_zone_logic.h" #include "logic/view_zone_logic.h"
#include <QBrush> #include <QBrush>
@ -10,7 +11,6 @@
#include <QGraphicsSceneWheelEvent> #include <QGraphicsSceneWheelEvent>
#include <QPainter> #include <QPainter>
#include <QtMath> #include <QtMath>
#include <libcockatrice/card/card_info.h>
#include <libcockatrice/protocol/pb/command_dump_zone.pb.h> #include <libcockatrice/protocol/pb/command_dump_zone.pb.h>
#include <libcockatrice/protocol/pb/command_move_card.pb.h> #include <libcockatrice/protocol/pb/command_move_card.pb.h>
#include <libcockatrice/protocol/pb/response_dump_zone.pb.h> #include <libcockatrice/protocol/pb/response_dump_zone.pb.h>

View file

@ -6,6 +6,7 @@
#include "../board/card_item.h" #include "../board/card_item.h"
#include "../game_scene.h" #include "../game_scene.h"
#include "../player/player.h" #include "../player/player.h"
#include "../player/player_actions.h"
#include "view_zone.h" #include "view_zone.h"
#include <QCheckBox> #include <QCheckBox>
@ -16,7 +17,6 @@
#include <QPainter> #include <QPainter>
#include <QScrollBar> #include <QScrollBar>
#include <QStyleOption> #include <QStyleOption>
#include <QStyleOptionTitleBar>
#include <libcockatrice/protocol/pb/command_shuffle.pb.h> #include <libcockatrice/protocol/pb/command_shuffle.pb.h>
/** /**

View file

@ -9,7 +9,6 @@
#include <QFileInfo> #include <QFileInfo>
#include <QMainWindow> #include <QMainWindow>
#include <QMovie> #include <QMovie>
#include <QNetworkDiskCache>
#include <QNetworkRequest> #include <QNetworkRequest>
#include <QPainter> #include <QPainter>
#include <QPixmapCache> #include <QPixmapCache>

View file

@ -5,7 +5,6 @@
#include "card_picture_loader_worker.h" #include "card_picture_loader_worker.h"
#include <QLoggingCategory> #include <QLoggingCategory>
#include <libcockatrice/card/card_info.h>
inline Q_LOGGING_CATEGORY(CardPictureLoaderLog, "card_picture_loader"); inline Q_LOGGING_CATEGORY(CardPictureLoaderLog, "card_picture_loader");
inline Q_LOGGING_CATEGORY(CardPictureLoaderCardBackCacheFailLog, "card_picture_loader.card_back_cache_fail"); inline Q_LOGGING_CATEGORY(CardPictureLoaderCardBackCacheFailLog, "card_picture_loader.card_back_cache_fail");

View file

@ -1,8 +1,6 @@
#ifndef PICTURE_LOADER_LOCAL_H #ifndef PICTURE_LOADER_LOCAL_H
#define PICTURE_LOADER_LOCAL_H #define PICTURE_LOADER_LOCAL_H
#include <QLoggingCategory>
#include <QObject>
#include <QTimer> #include <QTimer>
#include <libcockatrice/card/printing/exact_card.h> #include <libcockatrice/card/printing/exact_card.h>
@ -42,7 +40,7 @@ public:
* *
* Uses a set of name variants and folder paths to attempt to locate the correct image. * Uses a set of name variants and folder paths to attempt to locate the correct image.
*/ */
QImage tryLoad(const ExactCard &toLoad) const; [[nodiscard]] QImage tryLoad(const ExactCard &toLoad) const;
private: private:
QString picsPath; ///< Path to standard card image folder QString picsPath; ///< Path to standard card image folder
@ -72,7 +70,7 @@ private:
* Uses several filename patterns to match card images, in order from * Uses several filename patterns to match card images, in order from
* most-specific to least-specific. * most-specific to least-specific.
*/ */
QImage tryLoadCardImageFromDisk(const QString &setName, [[nodiscard]] QImage tryLoadCardImageFromDisk(const QString &setName,
const QString &correctedCardName, const QString &correctedCardName,
const QString &collectorNumber, const QString &collectorNumber,
const QString &providerId) const; const QString &providerId) const;

View file

@ -1,11 +1,11 @@
#ifndef PICTURE_LOADER_REQUEST_STATUS_DISPLAY_WIDGET_H #ifndef PICTURE_LOADER_REQUEST_STATUS_DISPLAY_WIDGET_H
#define PICTURE_LOADER_REQUEST_STATUS_DISPLAY_WIDGET_H #define PICTURE_LOADER_REQUEST_STATUS_DISPLAY_WIDGET_H
#include "card_picture_loader_worker_work.h"
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel> #include <QLabel>
#include <QUrl>
#include <QWidget> #include <QWidget>
#include <libcockatrice/card/printing/exact_card.h>
/** /**
* @class CardPictureLoaderRequestStatusDisplayWidget * @class CardPictureLoaderRequestStatusDisplayWidget

View file

@ -6,7 +6,6 @@
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QProgressBar> #include <QProgressBar>
#include <QTimer>
#include <QWidget> #include <QWidget>
/** /**

View file

@ -9,8 +9,8 @@
#include <QNetworkDiskCache> #include <QNetworkDiskCache>
#include <QNetworkReply> #include <QNetworkReply>
#include <QThread> #include <QThread>
#include <libcockatrice/card/database/card_database_manager.h>
#include <utility> #include <utility>
#include <version_string.h>
static constexpr int MAX_REQUESTS_PER_SEC = 10; static constexpr int MAX_REQUESTS_PER_SEC = 10;
@ -87,6 +87,7 @@ QNetworkReply *CardPictureLoaderWorker::makeRequest(const QUrl &url, CardPicture
} }
QNetworkRequest req(url); QNetworkRequest req(url);
req.setHeader(QNetworkRequest::UserAgentHeader, QString("Cockatrice %1").arg(VERSION_STRING));
if (!picDownload) { if (!picDownload) {
req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysCache); req.setAttribute(QNetworkRequest::CacheLoadControlAttribute, QNetworkRequest::AlwaysCache);
} }

View file

@ -7,11 +7,9 @@
#include <QDirIterator> #include <QDirIterator>
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QMovie> #include <QMovie>
#include <QNetworkDiskCache>
#include <QNetworkReply> #include <QNetworkReply>
#include <QThread> #include <QThread>
#include <QThreadPool> #include <QThreadPool>
#include <libcockatrice/card/database/card_database_manager.h>
// Card back returned by gatherer when card is not found // Card back returned by gatherer when card is not found
static const QStringList MD5_BLACKLIST = {"db0c48db407a907c16ade38de048a441"}; static const QStringList MD5_BLACKLIST = {"db0c48db407a907c16ade38de048a441"};

View file

@ -1,7 +1,6 @@
#ifndef PICTURE_TO_LOAD_H #ifndef PICTURE_TO_LOAD_H
#define PICTURE_TO_LOAD_H #define PICTURE_TO_LOAD_H
#include <QLoggingCategory>
#include <libcockatrice/card/printing/exact_card.h> #include <libcockatrice/card/printing/exact_card.h>
inline Q_LOGGING_CATEGORY(CardPictureToLoadLog, "card_picture_loader.picture_to_load"); inline Q_LOGGING_CATEGORY(CardPictureToLoadLog, "card_picture_loader.picture_to_load");

View file

@ -0,0 +1,40 @@
#include "card_node_function.h"
#include <libcockatrice/card/database/card_database.h>
#include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/deck_list/tree/deck_list_card_node.h>
void CardNodeFunction::SetProviderIdToPreferred::operator()(const InnerDecklistNode *node, DecklistCardNode *card) const
{
Q_UNUSED(node);
PrintingInfo preferredPrinting = CardDatabaseManager::query()->getPreferredPrinting(card->getName());
QString providerId = preferredPrinting.getUuid();
QString setShortName = preferredPrinting.getSet()->getShortName();
QString collectorNumber = preferredPrinting.getProperty("num");
card->setCardProviderId(providerId);
card->setCardCollectorNumber(collectorNumber);
card->setCardSetShortName(setShortName);
}
void CardNodeFunction::ClearPrintingData::operator()(const InnerDecklistNode *node, DecklistCardNode *card) const
{
Q_UNUSED(node);
card->setCardSetShortName(nullptr);
card->setCardCollectorNumber(nullptr);
card->setCardProviderId(nullptr);
}
void CardNodeFunction::ResolveProviderId::operator()(const InnerDecklistNode *node, DecklistCardNode *card) const
{
Q_UNUSED(node);
// Retrieve the providerId based on setName and collectorNumber
QString providerId =
CardDatabaseManager::getInstance()
->query()
->getSpecificPrinting(card->getName(), card->getCardSetShortName(), card->getCardCollectorNumber())
.getUuid();
// Set the providerId on the card
card->setCardProviderId(providerId);
}

View file

@ -0,0 +1,39 @@
#ifndef COCKATRICE_DECK_FUNCTION_H
#define COCKATRICE_DECK_FUNCTION_H
class DecklistCardNode;
class InnerDecklistNode;
/**
* Functions to be used with DeckList::forEachCard
*/
namespace CardNodeFunction
{
/**
* @brief Sets the providerId of the card to the preferred printing.
*/
struct SetProviderIdToPreferred
{
void operator()(const InnerDecklistNode *node, DecklistCardNode *card) const;
};
/**
* @brief Clears all fields on the card related to the printing
*/
struct ClearPrintingData
{
void operator()(const InnerDecklistNode *node, DecklistCardNode *card) const;
};
/**
* @brief Sets the providerId of the card based on its set name and collector number.
*/
struct ResolveProviderId
{
void operator()(const InnerDecklistNode *node, DecklistCardNode *card) const;
};
} // namespace CardNodeFunction
#endif // COCKATRICE_DECK_FUNCTION_H

View file

@ -0,0 +1,9 @@
#include "deck_file_format.h"
DeckFileFormat::Format DeckFileFormat::getFormatFromName(const QString &fileName)
{
if (fileName.endsWith(".cod", Qt::CaseInsensitive)) {
return Cockatrice;
}
return PlainText;
}

View file

@ -0,0 +1,36 @@
#ifndef COCKATRICE_DECK_FILE_FORMAT_H
#define COCKATRICE_DECK_FILE_FORMAT_H
#include <QString>
namespace DeckFileFormat
{
/**
* The deck file formats that Cockatrice supports.
*/
enum Format
{
/**
* Plaintext deck files, a format that is intended to be widely supported among different programs.
* This format does not support Cockatrice specific features such as banner cards or tags.
*/
PlainText,
/**
* This is cockatrice's native deck file format, and supports deck metadata such as banner cards and tags.
* Stored as .cod files.
*/
Cockatrice
};
/**
* Determines what deck file format the given filename corresponds to.
*
* @param fileName The filename
* @return The deck format
*/
Format getFormatFromName(const QString &fileName);
} // namespace DeckFileFormat
#endif // COCKATRICE_DECK_FILE_FORMAT_H

View file

@ -18,24 +18,22 @@
#include <libcockatrice/card/database/card_database.h> #include <libcockatrice/card/database/card_database.h>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/deck_list/deck_list.h> #include <libcockatrice/deck_list/deck_list.h>
#include <libcockatrice/deck_list/deck_list_card_node.h> #include <libcockatrice/deck_list/tree/deck_list_card_node.h>
const QStringList DeckLoader::ACCEPTED_FILE_EXTENSIONS = {"*.cod", "*.dec", "*.dek", "*.txt", "*.mwDeck"}; const QStringList DeckLoader::ACCEPTED_FILE_EXTENSIONS = {"*.cod", "*.dec", "*.dek", "*.txt", "*.mwDeck"};
const QStringList DeckLoader::FILE_NAME_FILTERS = { const QStringList DeckLoader::FILE_NAME_FILTERS = {
tr("Common deck formats (%1)").arg(ACCEPTED_FILE_EXTENSIONS.join(" ")), tr("All files (*.*)")}; tr("Common deck formats (%1)").arg(ACCEPTED_FILE_EXTENSIONS.join(" ")), tr("All files (*.*)")};
DeckLoader::DeckLoader(QObject *parent) DeckLoader::DeckLoader(QObject *parent) : QObject(parent), deckList(new DeckList())
: QObject(parent), deckList(new DeckList()), lastFileFormat(CockatriceFormat), lastRemoteDeckId(-1)
{ {
} }
DeckLoader::DeckLoader(QObject *parent, DeckList *_deckList) DeckLoader::DeckLoader(QObject *parent, DeckList *_deckList) : QObject(parent), deckList(_deckList)
: QObject(parent), deckList(_deckList), lastFileFormat(CockatriceFormat), lastRemoteDeckId(-1)
{ {
} }
bool DeckLoader::loadFromFile(const QString &fileName, FileFormat fmt, bool userRequest) bool DeckLoader::loadFromFile(const QString &fileName, DeckFileFormat::Format fmt, bool userRequest)
{ {
QFile file(fileName); QFile file(fileName);
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) {
@ -44,17 +42,17 @@ bool DeckLoader::loadFromFile(const QString &fileName, FileFormat fmt, bool user
bool result = false; bool result = false;
switch (fmt) { switch (fmt) {
case PlainTextFormat: case DeckFileFormat::PlainText:
result = deckList->loadFromFile_Plain(&file); result = deckList->loadFromFile_Plain(&file);
break; break;
case CockatriceFormat: { case DeckFileFormat::Cockatrice: {
result = deckList->loadFromFile_Native(&file); result = deckList->loadFromFile_Native(&file);
qCInfo(DeckLoaderLog) << "Loaded from" << fileName << "-" << result; qCInfo(DeckLoaderLog) << "Loaded from" << fileName << "-" << result;
if (!result) { if (!result) {
qCInfo(DeckLoaderLog) << "Retrying as plain format"; qCInfo(DeckLoaderLog) << "Retrying as plain format";
file.seek(0); file.seek(0);
result = deckList->loadFromFile_Plain(&file); result = deckList->loadFromFile_Plain(&file);
fmt = PlainTextFormat; fmt = DeckFileFormat::PlainText;
} }
break; break;
} }
@ -64,8 +62,10 @@ bool DeckLoader::loadFromFile(const QString &fileName, FileFormat fmt, bool user
} }
if (result) { if (result) {
lastFileName = fileName; lastLoadInfo = {
lastFileFormat = fmt; .fileName = fileName,
.fileFormat = fmt,
};
if (userRequest) { if (userRequest) {
updateLastLoadedTimestamp(fileName, fmt); updateLastLoadedTimestamp(fileName, fmt);
} }
@ -77,7 +77,7 @@ bool DeckLoader::loadFromFile(const QString &fileName, FileFormat fmt, bool user
return result; return result;
} }
bool DeckLoader::loadFromFileAsync(const QString &fileName, FileFormat fmt, bool userRequest) bool DeckLoader::loadFromFileAsync(const QString &fileName, DeckFileFormat::Format fmt, bool userRequest)
{ {
auto *watcher = new QFutureWatcher<bool>(this); auto *watcher = new QFutureWatcher<bool>(this);
@ -86,8 +86,10 @@ bool DeckLoader::loadFromFileAsync(const QString &fileName, FileFormat fmt, bool
watcher->deleteLater(); watcher->deleteLater();
if (result) { if (result) {
lastFileName = fileName; lastLoadInfo = {
lastFileFormat = fmt; .fileName = fileName,
.fileFormat = fmt,
};
if (userRequest) { if (userRequest) {
updateLastLoadedTimestamp(fileName, fmt); updateLastLoadedTimestamp(fileName, fmt);
} }
@ -104,9 +106,9 @@ bool DeckLoader::loadFromFileAsync(const QString &fileName, FileFormat fmt, bool
} }
switch (fmt) { switch (fmt) {
case PlainTextFormat: case DeckFileFormat::PlainText:
return deckList->loadFromFile_Plain(&file); return deckList->loadFromFile_Plain(&file);
case CockatriceFormat: { case DeckFileFormat::Cockatrice: {
bool result = false; bool result = false;
result = deckList->loadFromFile_Native(&file); result = deckList->loadFromFile_Native(&file);
if (!result) { if (!result) {
@ -129,16 +131,16 @@ bool DeckLoader::loadFromRemote(const QString &nativeString, int remoteDeckId)
{ {
bool result = deckList->loadFromString_Native(nativeString); bool result = deckList->loadFromString_Native(nativeString);
if (result) { if (result) {
lastFileName = QString(); lastLoadInfo = {
lastFileFormat = CockatriceFormat; .remoteDeckId = remoteDeckId,
lastRemoteDeckId = remoteDeckId; };
emit deckLoaded(); emit deckLoaded();
} }
return result; return result;
} }
bool DeckLoader::saveToFile(const QString &fileName, FileFormat fmt) bool DeckLoader::saveToFile(const QString &fileName, DeckFileFormat::Format fmt)
{ {
QFile file(fileName); QFile file(fileName);
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) { if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) {
@ -147,18 +149,20 @@ bool DeckLoader::saveToFile(const QString &fileName, FileFormat fmt)
bool result = false; bool result = false;
switch (fmt) { switch (fmt) {
case PlainTextFormat: case DeckFileFormat::PlainText:
result = deckList->saveToFile_Plain(&file); result = deckList->saveToFile_Plain(&file);
break; break;
case CockatriceFormat: case DeckFileFormat::Cockatrice:
result = deckList->saveToFile_Native(&file); result = deckList->saveToFile_Native(&file);
qCInfo(DeckLoaderLog) << "Saving to " << fileName << "-" << result; qCInfo(DeckLoaderLog) << "Saving to " << fileName << "-" << result;
break; break;
} }
if (result) { if (result) {
lastFileName = fileName; lastLoadInfo = {
lastFileFormat = fmt; .fileName = fileName,
.fileFormat = fmt,
};
qCInfo(DeckLoaderLog) << "Deck was saved -" << result; qCInfo(DeckLoaderLog) << "Deck was saved -" << result;
} }
@ -168,7 +172,7 @@ bool DeckLoader::saveToFile(const QString &fileName, FileFormat fmt)
return result; return result;
} }
bool DeckLoader::updateLastLoadedTimestamp(const QString &fileName, FileFormat fmt) bool DeckLoader::updateLastLoadedTimestamp(const QString &fileName, DeckFileFormat::Format fmt)
{ {
QFileInfo fileInfo(fileName); QFileInfo fileInfo(fileName);
if (!fileInfo.exists()) { if (!fileInfo.exists()) {
@ -189,10 +193,10 @@ bool DeckLoader::updateLastLoadedTimestamp(const QString &fileName, FileFormat f
// Perform file modifications // Perform file modifications
switch (fmt) { switch (fmt) {
case PlainTextFormat: case DeckFileFormat::PlainText:
result = deckList->saveToFile_Plain(&file); result = deckList->saveToFile_Plain(&file);
break; break;
case CockatriceFormat: case DeckFileFormat::Cockatrice:
deckList->setLastLoadedTimestamp(QDateTime::currentDateTime().toString()); deckList->setLastLoadedTimestamp(QDateTime::currentDateTime().toString());
result = deckList->saveToFile_Native(&file); result = deckList->saveToFile_Native(&file);
break; break;
@ -201,8 +205,10 @@ bool DeckLoader::updateLastLoadedTimestamp(const QString &fileName, FileFormat f
file.close(); // Close the file to ensure changes are flushed file.close(); // Close the file to ensure changes are flushed
if (result) { if (result) {
lastFileName = fileName; lastLoadInfo = {
lastFileFormat = fmt; .fileName = fileName,
.fileFormat = fmt,
};
// Re-open the file and set the original timestamp // Re-open the file and set the original timestamp
if (!file.open(QIODevice::ReadWrite)) { if (!file.open(QIODevice::ReadWrite)) {
@ -263,6 +269,20 @@ static QString toDecklistExportString(const DecklistCardNode *card)
return cardString; return cardString;
} }
/**
* Converts all cards in the list to their decklist export string and joins them into one string
*/
static QString toDecklistExportString(const QList<const DecklistCardNode *> &cardNodes)
{
QString result;
for (auto cardNode : cardNodes) {
result += toDecklistExportString(cardNode);
}
return result;
}
/** /**
* Export deck to decklist function, called to format the deck in a way to be sent to a server * Export deck to decklist function, called to format the deck in a way to be sent to a server
* *
@ -273,29 +293,11 @@ QString DeckLoader::exportDeckToDecklist(const DeckList *deckList, DecklistWebsi
{ {
// Add the base url // Add the base url
QString deckString = "https://" + getDomainForWebsite(website) + "/?"; QString deckString = "https://" + getDomainForWebsite(website) + "/?";
// Create two strings to pass to function
QString mainBoardCards, sideBoardCards;
// Set up the function to call // export all cards in zone
auto formatDeckListForExport = [&mainBoardCards, &sideBoardCards](const auto *node, const auto *card) { QString mainBoardCards = toDecklistExportString(deckList->getCardNodes({DECK_ZONE_MAIN}));
// Get the card name QString sideBoardCards = toDecklistExportString(deckList->getCardNodes({DECK_ZONE_SIDE}));
CardInfoPtr dbCard = CardDatabaseManager::query()->getCardInfo(card->getName());
if (!dbCard || dbCard->getIsToken()) {
// If it's a token, we don't care about the card.
return;
}
// Check if it's a sideboard card.
if (node->getName() == DECK_ZONE_SIDE) {
sideBoardCards += toDecklistExportString(card);
} else {
// If it's a mainboard card, do the same thing, but for the mainboard card string
mainBoardCards += toDecklistExportString(card);
}
};
// call our struct function for each card in the deck
deckList->forEachCard(formatDeckListForExport);
// Remove the extra return at the end of the last cards // Remove the extra return at the end of the last cards
mainBoardCards.chop(3); mainBoardCards.chop(3);
sideBoardCards.chop(3); sideBoardCards.chop(3);
@ -310,112 +312,6 @@ QString DeckLoader::exportDeckToDecklist(const DeckList *deckList, DecklistWebsi
return deckString; return deckString;
} }
// This struct is here to support the forEachCard function call, defined in decklist.
// It requires a function to be called for each card, and it will set the providerId to the preferred printing.
struct SetProviderIdToPreferred
{
// Main operator for struct, allowing the foreachcard to work.
SetProviderIdToPreferred()
{
}
void operator()(const InnerDecklistNode *node, DecklistCardNode *card) const
{
Q_UNUSED(node);
PrintingInfo preferredPrinting = CardDatabaseManager::query()->getPreferredPrinting(card->getName());
QString providerId = preferredPrinting.getUuid();
QString setShortName = preferredPrinting.getSet()->getShortName();
QString collectorNumber = preferredPrinting.getProperty("num");
card->setCardProviderId(providerId);
card->setCardCollectorNumber(collectorNumber);
card->setCardSetShortName(setShortName);
}
};
/**
* This function iterates through each card in the decklist and sets the providerId
* on each card based on its set name and collector number.
*
* @param deckList The decklist to modify
*/
void DeckLoader::setProviderIdToPreferredPrinting(const DeckList *deckList)
{
// Set up the struct to call.
SetProviderIdToPreferred setProviderIdToPreferred;
// Call the forEachCard method for each card in the deck
deckList->forEachCard(setProviderIdToPreferred);
}
/**
* Sets the providerId on each card in the decklist based on its set name and collector number.
*
* @param deckList The decklist to modify
*/
void DeckLoader::resolveSetNameAndNumberToProviderID(const DeckList *deckList)
{
auto setProviderId = [](const auto node, const auto card) {
Q_UNUSED(node);
// Retrieve the providerId based on setName and collectorNumber
QString providerId =
CardDatabaseManager::getInstance()
->query()
->getSpecificPrinting(card->getName(), card->getCardSetShortName(), card->getCardCollectorNumber())
.getUuid();
// Set the providerId on the card
card->setCardProviderId(providerId);
};
deckList->forEachCard(setProviderId);
}
// This struct is here to support the forEachCard function call, defined in decklist.
// It requires a function to be called for each card, and it will set the providerId.
struct ClearSetNameNumberAndProviderId
{
// Main operator for struct, allowing the foreachcard to work.
ClearSetNameNumberAndProviderId()
{
}
void operator()(const InnerDecklistNode *node, DecklistCardNode *card) const
{
Q_UNUSED(node);
// Set the providerId on the card
card->setCardSetShortName(nullptr);
card->setCardCollectorNumber(nullptr);
card->setCardProviderId(nullptr);
}
};
/**
* Clears the set name and numbers on each card in the decklist.
*
* @param deckList The decklist to modify
*/
void DeckLoader::clearSetNamesAndNumbers(const DeckList *deckList)
{
auto clearSetNameAndNumber = [](const auto node, auto card) {
Q_UNUSED(node)
// Set the providerId on the card
card->setCardSetShortName(nullptr);
card->setCardCollectorNumber(nullptr);
card->setCardProviderId(nullptr);
};
deckList->forEachCard(clearSetNameAndNumber);
}
DeckLoader::FileFormat DeckLoader::getFormatFromName(const QString &fileName)
{
if (fileName.endsWith(".cod", Qt::CaseInsensitive)) {
return CockatriceFormat;
}
return PlainTextFormat;
}
void DeckLoader::saveToClipboard(const DeckList *deckList, bool addComments, bool addSetNameAndNumber) void DeckLoader::saveToClipboard(const DeckList *deckList, bool addComments, bool addSetNameAndNumber)
{ {
QString buffer; QString buffer;
@ -435,9 +331,7 @@ bool DeckLoader::saveToStream_Plain(QTextStream &out,
} }
// loop zones // loop zones
for (int i = 0; i < deckList->getRoot()->size(); i++) { for (auto zoneNode : deckList->getZoneNodes()) {
const auto *zoneNode = dynamic_cast<InnerDecklistNode *>(deckList->getRoot()->at(i));
saveToStream_DeckZone(out, zoneNode, addComments, addSetNameAndNumber); saveToStream_DeckZone(out, zoneNode, addComments, addSetNameAndNumber);
// end of zone // end of zone
@ -558,12 +452,12 @@ bool DeckLoader::convertToCockatriceFormat(QString fileName)
bool result = false; bool result = false;
// Perform file modifications based on the detected format // Perform file modifications based on the detected format
switch (getFormatFromName(fileName)) { switch (DeckFileFormat::getFormatFromName(fileName)) {
case PlainTextFormat: case DeckFileFormat::PlainText:
// Save in Cockatrice's native format // Save in Cockatrice's native format
result = deckList->saveToFile_Native(&file); result = deckList->saveToFile_Native(&file);
break; break;
case CockatriceFormat: case DeckFileFormat::Cockatrice:
qCInfo(DeckLoaderLog) << "File is already in Cockatrice format. No conversion needed."; qCInfo(DeckLoaderLog) << "File is already in Cockatrice format. No conversion needed.";
result = true; result = true;
break; break;
@ -582,8 +476,10 @@ bool DeckLoader::convertToCockatriceFormat(QString fileName)
} else { } else {
qCInfo(DeckLoaderLog) << "Original file deleted successfully:" << fileName; qCInfo(DeckLoaderLog) << "Original file deleted successfully:" << fileName;
} }
lastFileName = newFileName; lastLoadInfo = {
lastFileFormat = CockatriceFormat; .fileName = newFileName,
.fileFormat = DeckFileFormat::Cockatrice,
};
} }
return result; return result;
@ -612,7 +508,7 @@ QString DeckLoader::getCompleteCardName(const QString &cardName)
return cardName; return cardName;
} }
void DeckLoader::printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node) void DeckLoader::printDeckListNode(QTextCursor *cursor, const InnerDecklistNode *node)
{ {
const int totalColumns = 2; const int totalColumns = 2;
@ -695,12 +591,11 @@ void DeckLoader::printDeckList(QPrinter *printer, const DeckList *deckList)
cursor.insertText(deckList->getComments()); cursor.insertText(deckList->getComments());
cursor.insertBlock(headerBlockFormat, headerCharFormat); cursor.insertBlock(headerBlockFormat, headerCharFormat);
for (int i = 0; i < deckList->getRoot()->size(); i++) { for (auto zoneNode : deckList->getZoneNodes()) {
cursor.insertHtml("<br><img src=theme:hr.jpg>"); cursor.insertHtml("<br><img src=theme:hr.jpg>");
// cursor.insertHtml("<hr>");
cursor.insertBlock(headerBlockFormat, headerCharFormat); cursor.insertBlock(headerBlockFormat, headerCharFormat);
printDeckListNode(&cursor, dynamic_cast<InnerDecklistNode *>(deckList->getRoot()->at(i))); printDeckListNode(&cursor, zoneNode);
} }
doc.print(printer); doc.print(printer);

View file

@ -7,14 +7,16 @@
#ifndef DECK_LOADER_H #ifndef DECK_LOADER_H
#define DECK_LOADER_H #define DECK_LOADER_H
#include "loaded_deck.h"
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QPrinter> #include <QPrinter>
#include <QTextCursor> #include <QTextCursor>
#include <libcockatrice/deck_list/deck_list.h> #include <libcockatrice/deck_list/deck_list.h>
inline Q_LOGGING_CATEGORY(DeckLoaderLog, "deck_loader") inline Q_LOGGING_CATEGORY(DeckLoaderLog, "deck_loader");
class DeckLoader : public QObject class DeckLoader : public QObject
{ {
Q_OBJECT Q_OBJECT
signals: signals:
@ -22,12 +24,6 @@ signals:
void loadFinished(bool success); void loadFinished(bool success);
public: public:
enum FileFormat
{
PlainTextFormat,
CockatriceFormat
};
/** /**
* Supported file extensions for decklist files * Supported file extensions for decklist files
*/ */
@ -46,9 +42,7 @@ public:
private: private:
DeckList *deckList; DeckList *deckList;
QString lastFileName; LoadedDeck::LoadInfo lastLoadInfo;
FileFormat lastFileFormat;
int lastRemoteDeckId;
public: public:
DeckLoader(QObject *parent); DeckLoader(QObject *parent);
@ -56,42 +50,29 @@ public:
DeckLoader(const DeckLoader &) = delete; DeckLoader(const DeckLoader &) = delete;
DeckLoader &operator=(const DeckLoader &) = delete; DeckLoader &operator=(const DeckLoader &) = delete;
const QString &getLastFileName() const const LoadedDeck::LoadInfo &getLastLoadInfo() const
{ {
return lastFileName; return lastLoadInfo;
}
void setLastFileName(const QString &_lastFileName)
{
lastFileName = _lastFileName;
}
FileFormat getLastFileFormat() const
{
return lastFileFormat;
}
int getLastRemoteDeckId() const
{
return lastRemoteDeckId;
} }
bool hasNotBeenLoaded() const void setLastLoadInfo(const LoadedDeck::LoadInfo &info)
{ {
return getLastFileName().isEmpty() && getLastRemoteDeckId() == -1; lastLoadInfo = info;
} }
static void clearSetNamesAndNumbers(const DeckList *deckList); [[nodiscard]] bool hasNotBeenLoaded() const
static FileFormat getFormatFromName(const QString &fileName); {
return lastLoadInfo.isEmpty();
}
bool loadFromFile(const QString &fileName, FileFormat fmt, bool userRequest = false); bool loadFromFile(const QString &fileName, DeckFileFormat::Format fmt, bool userRequest = false);
bool loadFromFileAsync(const QString &fileName, FileFormat fmt, bool userRequest); bool loadFromFileAsync(const QString &fileName, DeckFileFormat::Format fmt, bool userRequest);
bool loadFromRemote(const QString &nativeString, int remoteDeckId); bool loadFromRemote(const QString &nativeString, int remoteDeckId);
bool saveToFile(const QString &fileName, FileFormat fmt); bool saveToFile(const QString &fileName, DeckFileFormat::Format fmt);
bool updateLastLoadedTimestamp(const QString &fileName, FileFormat fmt); bool updateLastLoadedTimestamp(const QString &fileName, DeckFileFormat::Format fmt);
static QString exportDeckToDecklist(const DeckList *deckList, DecklistWebsite website); static QString exportDeckToDecklist(const DeckList *deckList, DecklistWebsite website);
static void setProviderIdToPreferredPrinting(const DeckList *deckList);
static void resolveSetNameAndNumberToProviderID(const DeckList *deckList);
static void saveToClipboard(const DeckList *deckList, bool addComments = true, bool addSetNameAndNumber = true); static void saveToClipboard(const DeckList *deckList, bool addComments = true, bool addSetNameAndNumber = true);
static bool saveToStream_Plain(QTextStream &out, static bool saveToStream_Plain(QTextStream &out,
const DeckList *deckList, const DeckList *deckList,
@ -113,7 +94,7 @@ public:
} }
private: private:
static void printDeckListNode(QTextCursor *cursor, InnerDecklistNode *node); static void printDeckListNode(QTextCursor *cursor, const InnerDecklistNode *node);
static void saveToStream_DeckHeader(QTextStream &out, const DeckList *deckList); static void saveToStream_DeckHeader(QTextStream &out, const DeckList *deckList);
static void saveToStream_DeckZone(QTextStream &out, static void saveToStream_DeckZone(QTextStream &out,

View file

@ -0,0 +1,11 @@
#include "loaded_deck.h"
bool LoadedDeck::LoadInfo::isEmpty() const
{
return fileName.isEmpty() && remoteDeckId == NON_REMOTE_ID;
}
bool LoadedDeck::isEmpty() const
{
return deckList.isEmpty() && lastLoadInfo.isEmpty();
}

View file

@ -0,0 +1,39 @@
#ifndef COCKATRICE_LOADED_DECK_H
#define COCKATRICE_LOADED_DECK_H
#include "deck_file_format.h"
#include "libcockatrice/deck_list/deck_list.h"
#include <QString>
/**
* @brief Represents a deck that was loaded from somewhere.
* Contains the DeckList itself, as well as info about where it was loaded from.
*/
struct LoadedDeck
{
/**
* @brief Information about where the deck was loaded from.
*
* For local decks, the remoteDeckId field will always be -1.
* For remote decks, fileName will be empty and fileFormat will always be CockatriceFormat
*/
struct LoadInfo
{
static constexpr int NON_REMOTE_ID = -1;
QString fileName = "";
DeckFileFormat::Format fileFormat = DeckFileFormat::Cockatrice;
int remoteDeckId = NON_REMOTE_ID;
bool isEmpty() const;
};
DeckList deckList; ///< The decklist itself
LoadInfo lastLoadInfo; ///< info about where the deck was loaded from
bool isEmpty() const;
};
#endif // COCKATRICE_LOADED_DECK_H

View file

@ -23,9 +23,9 @@ public:
~FlowLayout() override; ~FlowLayout() override;
void insertWidgetAtIndex(QWidget *toInsert, int index); void insertWidgetAtIndex(QWidget *toInsert, int index);
QSize calculateMinimumSizeHorizontal() const; [[nodiscard]] QSize calculateMinimumSizeHorizontal() const;
QSize calculateSizeHintVertical() const; [[nodiscard]] QSize calculateSizeHintVertical() const;
QSize calculateMinimumSizeVertical() const; [[nodiscard]] QSize calculateMinimumSizeVertical() const;
void addItem(QLayoutItem *item) override; void addItem(QLayoutItem *item) override;
[[nodiscard]] int count() const override; [[nodiscard]] int count() const override;
[[nodiscard]] QLayoutItem *itemAt(int index) const override; [[nodiscard]] QLayoutItem *itemAt(int index) const override;
@ -48,7 +48,7 @@ public:
void layoutSingleColumn(const QVector<QLayoutItem *> &colItems, int x, int y); void layoutSingleColumn(const QVector<QLayoutItem *> &colItems, int x, int y);
[[nodiscard]] QSize sizeHint() const override; [[nodiscard]] QSize sizeHint() const override;
[[nodiscard]] QSize minimumSize() const override; [[nodiscard]] QSize minimumSize() const override;
QSize calculateSizeHintHorizontal() const; [[nodiscard]] QSize calculateSizeHintHorizontal() const;
protected: protected:
QList<QLayoutItem *> items; // List to store layout items QList<QLayoutItem *> items; // List to store layout items

View file

@ -5,7 +5,6 @@
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel> #include <QLabel>
#include <QPixmap>
#include <QRegularExpression> #include <QRegularExpression>
#include <QResizeEvent> #include <QResizeEvent>
#include <QSize> #include <QSize>

View file

@ -4,7 +4,6 @@
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel> #include <QLabel>
#include <QPixmap>
#include <QResizeEvent> #include <QResizeEvent>
#include <QSize> #include <QSize>
#include <qregularexpression.h> #include <qregularexpression.h>

View file

@ -23,15 +23,15 @@ public:
[[nodiscard]] bool isColorActive() const [[nodiscard]] bool isColorActive() const
{ {
return isActive; return isActive;
}; }
[[nodiscard]] QString getSymbol() const [[nodiscard]] QString getSymbol() const
{ {
return symbol; return symbol;
}; }
[[nodiscard]] QChar getSymbolChar() const [[nodiscard]] QChar getSymbolChar() const
{ {
return symbol[0]; return symbol[0];
}; }
void loadManaIcon(); void loadManaIcon();

View file

@ -3,13 +3,13 @@
#include "../card_info_picture_with_text_overlay_widget.h" #include "../card_info_picture_with_text_overlay_widget.h"
#include <QResizeEvent> #include <QResizeEvent>
#include <libcockatrice/card/card_info_comparator.h>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/models/deck_list/deck_list_model.h> #include <libcockatrice/models/deck_list/deck_list_model.h>
#include <libcockatrice/models/deck_list/deck_list_sort_filter_proxy_model.h> #include <libcockatrice/models/deck_list/deck_list_sort_filter_proxy_model.h>
CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent, CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent,
DeckListModel *_deckListModel, DeckListModel *_deckListModel,
QItemSelectionModel *_selectionModel,
QPersistentModelIndex _trackedIndex, QPersistentModelIndex _trackedIndex,
QString _zoneName, QString _zoneName,
QString _cardGroupCategory, QString _cardGroupCategory,
@ -17,8 +17,8 @@ CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent,
QStringList _activeSortCriteria, QStringList _activeSortCriteria,
int bannerOpacity, int bannerOpacity,
CardSizeWidget *_cardSizeWidget) CardSizeWidget *_cardSizeWidget)
: QWidget(parent), deckListModel(_deckListModel), trackedIndex(_trackedIndex), zoneName(_zoneName), : QWidget(parent), deckListModel(_deckListModel), selectionModel(_selectionModel), trackedIndex(_trackedIndex),
cardGroupCategory(_cardGroupCategory), activeGroupCriteria(_activeGroupCriteria), zoneName(_zoneName), cardGroupCategory(_cardGroupCategory), activeGroupCriteria(_activeGroupCriteria),
activeSortCriteria(_activeSortCriteria), cardSizeWidget(_cardSizeWidget) activeSortCriteria(_activeSortCriteria), cardSizeWidget(_cardSizeWidget)
{ {
layout = new QVBoxLayout(this); layout = new QVBoxLayout(this);
@ -32,9 +32,50 @@ CardGroupDisplayWidget::CardGroupDisplayWidget(QWidget *parent,
CardGroupDisplayWidget::updateCardDisplays(); CardGroupDisplayWidget::updateCardDisplays();
connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &CardGroupDisplayWidget::onCardAddition); connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &CardGroupDisplayWidget::onCardAddition);
if (selectionModel) {
connect(selectionModel, &QItemSelectionModel::selectionChanged, this,
&CardGroupDisplayWidget::onSelectionChanged);
}
connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &CardGroupDisplayWidget::onCardRemoval); connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &CardGroupDisplayWidget::onCardRemoval);
} }
void CardGroupDisplayWidget::onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
auto proxyModel = qobject_cast<QAbstractProxyModel *>(selectionModel->model());
for (auto &range : selected) {
for (int row = range.top(); row <= range.bottom(); ++row) {
QModelIndex idx = range.model()->index(row, 0, range.parent());
if (proxyModel) {
idx = proxyModel->mapToSource(idx);
}
auto it = indexToWidgetMap.find(QPersistentModelIndex(idx));
if (it != indexToWidgetMap.end()) {
if (auto displayWidget = qobject_cast<CardInfoPictureWithTextOverlayWidget *>(it.value())) {
displayWidget->setHighlighted(true);
}
}
}
}
for (auto &range : deselected) {
for (int row = range.top(); row <= range.bottom(); ++row) {
QModelIndex idx = range.model()->index(row, 0, range.parent());
if (proxyModel)
idx = proxyModel->mapToSource(idx);
auto it = indexToWidgetMap.find(QPersistentModelIndex(idx));
if (it != indexToWidgetMap.end()) {
if (auto displayWidget = qobject_cast<CardInfoPictureWithTextOverlayWidget *>(it.value())) {
displayWidget->setHighlighted(false);
}
}
}
}
}
void CardGroupDisplayWidget::clearAllDisplayWidgets() void CardGroupDisplayWidget::clearAllDisplayWidgets()
{ {
for (auto idx : indexToWidgetMap.keys()) { for (auto idx : indexToWidgetMap.keys()) {
@ -138,6 +179,14 @@ void CardGroupDisplayWidget::onActiveSortCriteriaChanged(QStringList _activeSort
updateCardDisplays(); updateCardDisplays();
} }
void CardGroupDisplayWidget::mousePressEvent(QMouseEvent *event)
{
QWidget::mousePressEvent(event);
if (selectionModel) {
selectionModel->clearSelection();
}
}
void CardGroupDisplayWidget::onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card) void CardGroupDisplayWidget::onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card)
{ {
emit cardClicked(event, card); emit cardClicked(event, card);

View file

@ -11,10 +11,10 @@
#include "../card_info_picture_with_text_overlay_widget.h" #include "../card_info_picture_with_text_overlay_widget.h"
#include "../card_size_widget.h" #include "../card_size_widget.h"
#include <QItemSelectionModel>
#include <QLabel> #include <QLabel>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QWidget> #include <QWidget>
#include <libcockatrice/card/card_info.h>
#include <libcockatrice/models/deck_list/deck_list_model.h> #include <libcockatrice/models/deck_list/deck_list_model.h>
class CardGroupDisplayWidget : public QWidget class CardGroupDisplayWidget : public QWidget
@ -24,6 +24,7 @@ class CardGroupDisplayWidget : public QWidget
public: public:
CardGroupDisplayWidget(QWidget *parent, CardGroupDisplayWidget(QWidget *parent,
DeckListModel *deckListModel, DeckListModel *deckListModel,
QItemSelectionModel *selectionModel,
QPersistentModelIndex trackedIndex, QPersistentModelIndex trackedIndex,
QString zoneName, QString zoneName,
QString cardGroupCategory, QString cardGroupCategory,
@ -31,9 +32,11 @@ public:
QStringList activeSortCriteria, QStringList activeSortCriteria,
int bannerOpacity, int bannerOpacity,
CardSizeWidget *cardSizeWidget); CardSizeWidget *cardSizeWidget);
void onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
void clearAllDisplayWidgets(); void clearAllDisplayWidgets();
DeckListModel *deckListModel; DeckListModel *deckListModel;
QItemSelectionModel *selectionModel;
QPersistentModelIndex trackedIndex; QPersistentModelIndex trackedIndex;
QHash<QPersistentModelIndex, QWidget *> indexToWidgetMap; QHash<QPersistentModelIndex, QWidget *> indexToWidgetMap;
QString zoneName; QString zoneName;
@ -43,6 +46,7 @@ public:
CardSizeWidget *cardSizeWidget; CardSizeWidget *cardSizeWidget;
public slots: public slots:
void mousePressEvent(QMouseEvent *event) override;
void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card); void onClick(QMouseEvent *event, CardInfoPictureWithTextOverlayWidget *card);
void onHover(const ExactCard &card); void onHover(const ExactCard &card);
virtual QWidget *constructWidgetForIndex(QPersistentModelIndex index); virtual QWidget *constructWidgetForIndex(QPersistentModelIndex index);

View file

@ -1,15 +1,13 @@
#include "flat_card_group_display_widget.h" #include "flat_card_group_display_widget.h"
#include "../card_info_picture_with_text_overlay_widget.h"
#include <QResizeEvent> #include <QResizeEvent>
#include <libcockatrice/card/card_info_comparator.h>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/models/deck_list/deck_list_model.h> #include <libcockatrice/models/deck_list/deck_list_model.h>
#include <utility> #include <utility>
FlatCardGroupDisplayWidget::FlatCardGroupDisplayWidget(QWidget *parent, FlatCardGroupDisplayWidget::FlatCardGroupDisplayWidget(QWidget *parent,
DeckListModel *_deckListModel, DeckListModel *_deckListModel,
QItemSelectionModel *_selectionModel,
QPersistentModelIndex _trackedIndex, QPersistentModelIndex _trackedIndex,
QString _zoneName, QString _zoneName,
QString _cardGroupCategory, QString _cardGroupCategory,
@ -19,6 +17,7 @@ FlatCardGroupDisplayWidget::FlatCardGroupDisplayWidget(QWidget *parent,
CardSizeWidget *_cardSizeWidget) CardSizeWidget *_cardSizeWidget)
: CardGroupDisplayWidget(parent, : CardGroupDisplayWidget(parent,
_deckListModel, _deckListModel,
_selectionModel,
std::move(_trackedIndex), std::move(_trackedIndex),
_zoneName, _zoneName,
_cardGroupCategory, _cardGroupCategory,

View file

@ -17,6 +17,7 @@ class FlatCardGroupDisplayWidget : public CardGroupDisplayWidget
public: public:
FlatCardGroupDisplayWidget(QWidget *parent, FlatCardGroupDisplayWidget(QWidget *parent,
DeckListModel *deckListModel, DeckListModel *deckListModel,
QItemSelectionModel *selectionModel,
QPersistentModelIndex trackedIndex, QPersistentModelIndex trackedIndex,
QString zoneName, QString zoneName,
QString cardGroupCategory, QString cardGroupCategory,

View file

@ -1,14 +1,12 @@
#include "overlapped_card_group_display_widget.h" #include "overlapped_card_group_display_widget.h"
#include "../card_info_picture_with_text_overlay_widget.h"
#include <QResizeEvent> #include <QResizeEvent>
#include <libcockatrice/card/card_info_comparator.h>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/models/deck_list/deck_list_model.h> #include <libcockatrice/models/deck_list/deck_list_model.h>
OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *parent, OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *parent,
DeckListModel *_deckListModel, DeckListModel *_deckListModel,
QItemSelectionModel *_selectionModel,
QPersistentModelIndex _trackedIndex, QPersistentModelIndex _trackedIndex,
QString _zoneName, QString _zoneName,
QString _cardGroupCategory, QString _cardGroupCategory,
@ -18,6 +16,7 @@ OverlappedCardGroupDisplayWidget::OverlappedCardGroupDisplayWidget(QWidget *pare
CardSizeWidget *_cardSizeWidget) CardSizeWidget *_cardSizeWidget)
: CardGroupDisplayWidget(parent, : CardGroupDisplayWidget(parent,
_deckListModel, _deckListModel,
_selectionModel,
_trackedIndex, _trackedIndex,
_zoneName, _zoneName,
_cardGroupCategory, _cardGroupCategory,

View file

@ -17,6 +17,7 @@ class OverlappedCardGroupDisplayWidget : public CardGroupDisplayWidget
public: public:
OverlappedCardGroupDisplayWidget(QWidget *parent, OverlappedCardGroupDisplayWidget(QWidget *parent,
DeckListModel *deckListModel, DeckListModel *deckListModel,
QItemSelectionModel *selectionModel,
QPersistentModelIndex trackedIndex, QPersistentModelIndex trackedIndex,
QString zoneName, QString zoneName,
QString cardGroupCategory, QString cardGroupCategory,

View file

@ -1,7 +1,6 @@
#include "card_info_display_widget.h" #include "card_info_display_widget.h"
#include "../../../game/board/card_item.h" #include "../../../game/board/card_item.h"
#include "../../../main.h"
#include "card_info_picture_widget.h" #include "card_info_picture_widget.h"
#include "card_info_text_widget.h" #include "card_info_text_widget.h"
@ -9,7 +8,6 @@
#include <QScreen> #include <QScreen>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <utility>
CardInfoDisplayWidget::CardInfoDisplayWidget(const CardRef &cardRef, QWidget *parent, Qt::WindowFlags flags) CardInfoDisplayWidget::CardInfoDisplayWidget(const CardRef &cardRef, QWidget *parent, Qt::WindowFlags flags)
: QFrame(parent, flags), aspectRatio((qreal)CARD_HEIGHT / (qreal)CARD_WIDTH) : QFrame(parent, flags), aspectRatio((qreal)CARD_HEIGHT / (qreal)CARD_WIDTH)
@ -51,7 +49,7 @@ void CardInfoDisplayWidget::setCard(const ExactCard &card)
if (exactCard) if (exactCard)
connect(exactCard.getCardPtr().data(), &QObject::destroyed, this, &CardInfoDisplayWidget::clear); connect(exactCard.getCardPtr().data(), &QObject::destroyed, this, &CardInfoDisplayWidget::clear);
text->setCard(exactCard.getCardPtr()); text->setCard(exactCard);
pic->setCard(exactCard); pic->setCard(exactCard);
} }

View file

@ -10,7 +10,6 @@
#include <QVBoxLayout> #include <QVBoxLayout>
#include <libcockatrice/card/database/card_database_manager.h> #include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/card/relation/card_relation.h> #include <libcockatrice/card/relation/card_relation.h>
#include <utility>
CardInfoFrameWidget::CardInfoFrameWidget(QWidget *parent) CardInfoFrameWidget::CardInfoFrameWidget(QWidget *parent)
: QTabWidget(parent), viewTransformationButton(nullptr), cardTextOnly(false) : QTabWidget(parent), viewTransformationButton(nullptr), cardTextOnly(false)
@ -155,7 +154,7 @@ void CardInfoFrameWidget::setCard(const ExactCard &card)
setViewTransformationButtonVisibility(hasTransformation(exactCard.getInfo())); setViewTransformationButtonVisibility(hasTransformation(exactCard.getInfo()));
text->setCard(exactCard.getCardPtr()); text->setCard(exactCard);
pic->setCard(exactCard); pic->setCard(exactCard);
} }

View file

@ -5,7 +5,6 @@
#include <QPainterPath> #include <QPainterPath>
#include <QStylePainter> #include <QStylePainter>
#include <utility>
/** /**
* @brief Constructs a CardPictureEnlargedWidget. * @brief Constructs a CardPictureEnlargedWidget.
@ -34,10 +33,13 @@ CardInfoPictureEnlargedWidget::CardInfoPictureEnlargedWidget(QWidget *parent) :
*/ */
void CardInfoPictureEnlargedWidget::loadPixmap(const QSize &size) void CardInfoPictureEnlargedWidget::loadPixmap(const QSize &size)
{ {
// Handle DPI scaling
qreal dpr = devicePixelRatio(); // Get the actual scaling factor
QSize availableSize = size * dpr; // Convert to physical pixel size
if (card) { if (card) {
CardPictureLoader::getPixmap(enlargedPixmap, card, size); CardPictureLoader::getPixmap(enlargedPixmap, card, availableSize);
} else { } else {
CardPictureLoader::getCardBackPixmap(enlargedPixmap, size); CardPictureLoader::getCardBackPixmap(enlargedPixmap, availableSize);
} }
pixmapDirty = false; pixmapDirty = false;
} }
@ -78,25 +80,35 @@ void CardInfoPictureEnlargedWidget::paintEvent(QPaintEvent *event)
loadPixmap(size()); loadPixmap(size());
} }
// Scale the size of the pixmap to fit the widget while maintaining the aspect ratio qreal dpr = enlargedPixmap.devicePixelRatio();
QSize scaledSize = enlargedPixmap.size().scaled(size().width(), size().height(), Qt::KeepAspectRatio);
// Calculate the position to center the scaled pixmap QSize logicalPixmapSize(enlargedPixmap.width() / dpr, enlargedPixmap.height() / dpr);
QPoint topLeft{(width() - scaledSize.width()) / 2, (height() - scaledSize.height()) / 2};
// Define the radius for rounded corners // Scale the pixmap to fit the widget (logical → logical)
// Adjust the radius as needed for rounded corners QSize scaledLogicalSize = logicalPixmapSize.scaled(size(), Qt::KeepAspectRatio);
qreal radius = SettingsCache::instance().getRoundCardCorners() ? 0.05 * scaledSize.width() : 0.;
// Convert scaled logical size → physical size for scaled()
QSize scaledPhysicalSize = scaledLogicalSize * dpr;
// Pixmap scaled in PHYSICAL pixels
QPixmap finalPixmap = enlargedPixmap.scaled(scaledPhysicalSize, Qt::KeepAspectRatio, Qt::SmoothTransformation);
finalPixmap.setDevicePixelRatio(dpr);
// Center inside widget
QPoint topLeft{(width() - scaledLogicalSize.width()) / 2, (height() - scaledLogicalSize.height()) / 2};
// Rounded corner radius based on logical width
qreal radius = SettingsCache::instance().getRoundCardCorners() ? 0.05 * scaledLogicalSize.width() : 0.0;
QStylePainter painter(this); QStylePainter painter(this);
// Fill the background with transparent color to ensure rounded corners are rendered properly // Fill the background with transparent color to ensure rounded corners are rendered properly
painter.fillRect(rect(), Qt::transparent); // Use the transparent background painter.fillRect(rect(), Qt::transparent); // Use the transparent background
QPainterPath shape; QPainterPath shape;
shape.addRoundedRect(QRect(topLeft, scaledSize), radius, radius); shape.addRoundedRect(QRect(topLeft, scaledLogicalSize), radius, radius);
painter.setClipPath(shape); // Set the clipping path painter.setClipPath(shape); // Set the clipping path
// Draw the pixmap scaled to the calculated size // Draw the pixmap scaled to the calculated size
painter.drawItemPixmap(QRect(topLeft, scaledSize), Qt::AlignCenter, painter.drawPixmap(QRect(topLeft, scaledLogicalSize), finalPixmap);
enlargedPixmap.scaled(scaledSize, Qt::KeepAspectRatio, Qt::SmoothTransformation));
} }

View file

@ -8,7 +8,6 @@
#ifndef CARD_PICTURE_ENLARGED_WIDGET_H #ifndef CARD_PICTURE_ENLARGED_WIDGET_H
#define CARD_PICTURE_ENLARGED_WIDGET_H #define CARD_PICTURE_ENLARGED_WIDGET_H
#include <QPixmap>
#include <QWidget> #include <QWidget>
#include <libcockatrice/card/printing/exact_card.h> #include <libcockatrice/card/printing/exact_card.h>

View file

@ -10,7 +10,6 @@
#include "card_info_picture_enlarged_widget.h" #include "card_info_picture_enlarged_widget.h"
#include <QPropertyAnimation> #include <QPropertyAnimation>
#include <QTimer>
#include <QWidget> #include <QWidget>
#include <libcockatrice/card/printing/exact_card.h> #include <libcockatrice/card/printing/exact_card.h>

View file

@ -3,7 +3,6 @@
#include <QFontMetrics> #include <QFontMetrics>
#include <QPainterPath> #include <QPainterPath>
#include <QStylePainter> #include <QStylePainter>
#include <QTextOption>
/** /**
* @brief Constructs a CardPictureWithTextOverlay widget. * @brief Constructs a CardPictureWithTextOverlay widget.
@ -25,7 +24,7 @@ CardInfoPictureWithTextOverlayWidget::CardInfoPictureWithTextOverlayWidget(QWidg
const int fontSize, const int fontSize,
const Qt::Alignment alignment) const Qt::Alignment alignment)
: CardInfoPictureWidget(parent, hoverToZoomEnabled, raiseOnEnter), textColor(textColor), outlineColor(outlineColor), : CardInfoPictureWidget(parent, hoverToZoomEnabled, raiseOnEnter), textColor(textColor), outlineColor(outlineColor),
fontSize(fontSize), textAlignment(alignment) fontSize(fontSize), textAlignment(alignment), highlighted(false)
{ {
this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
} }
@ -82,6 +81,16 @@ void CardInfoPictureWithTextOverlayWidget::setTextAlignment(const Qt::Alignment
update(); update();
} }
void CardInfoPictureWithTextOverlayWidget::setHighlighted(bool _highlighted)
{
if (highlighted == _highlighted) {
return;
}
highlighted = _highlighted;
update();
}
void CardInfoPictureWithTextOverlayWidget::mousePressEvent(QMouseEvent *event) void CardInfoPictureWithTextOverlayWidget::mousePressEvent(QMouseEvent *event)
{ {
emit imageClicked(event, this); emit imageClicked(event, this);
@ -98,11 +107,6 @@ void CardInfoPictureWithTextOverlayWidget::paintEvent(QPaintEvent *event)
// Call the base class's paintEvent to draw the card image // Call the base class's paintEvent to draw the card image
CardInfoPictureWidget::paintEvent(event); CardInfoPictureWidget::paintEvent(event);
// If no overlay text, skip drawing the text
if (overlayText.isEmpty()) {
return;
}
QStylePainter painter(this); QStylePainter painter(this);
// Get the pixmap from the base class using the getter // Get the pixmap from the base class using the getter
@ -116,6 +120,36 @@ void CardInfoPictureWithTextOverlayWidget::paintEvent(QPaintEvent *event)
const QPoint topLeft{(width() - scaledSize.width()) / 2, (height() - scaledSize.height()) / 2}; const QPoint topLeft{(width() - scaledSize.width()) / 2, (height() - scaledSize.height()) / 2};
const QRect pixmapRect(topLeft, scaledSize); const QRect pixmapRect(topLeft, scaledSize);
if (highlighted) {
painter.save();
painter.setRenderHint(QPainter::Antialiasing, true);
// Soft glow and border around the pixmap
const int padding = 4; // glow extends a little beyond image
QRect glowRect = pixmapRect.adjusted(-padding, -padding, padding, padding);
QPainterPath path;
int radius = 8; // rounded corners
path.addRoundedRect(glowRect, radius, radius);
// Soft outer glow
QColor glowColor(0, 150, 255, 80); // subtle blu
painter.setPen(QPen(glowColor, 6));
painter.drawPath(path);
// Thin inner border for crispness
QColor borderColor(0, 150, 255, 200);
painter.setPen(QPen(borderColor, 2));
painter.drawRoundedRect(pixmapRect, radius, radius);
painter.restore();
}
// If no overlay text, skip drawing the text
if (overlayText.isEmpty()) {
return;
}
// Calculate the optimal font size // Calculate the optimal font size
QFont font = painter.font(); QFont font = painter.font();
int optimalFontSize = fontSize; // Start with the user-defined font size int optimalFontSize = fontSize; // Start with the user-defined font size

View file

@ -32,6 +32,7 @@ public:
void setOutlineColor(const QColor &color); void setOutlineColor(const QColor &color);
void setFontSize(int size); void setFontSize(int size);
void setTextAlignment(Qt::Alignment alignment); void setTextAlignment(Qt::Alignment alignment);
void setHighlighted(bool _highlighted);
[[nodiscard]] QSize sizeHint() const override; [[nodiscard]] QSize sizeHint() const override;
signals: signals:
@ -53,6 +54,7 @@ private:
QColor outlineColor; QColor outlineColor;
int fontSize; int fontSize;
Qt::Alignment textAlignment; Qt::Alignment textAlignment;
bool highlighted;
}; };
#endif // CARD_PICTURE_WITH_TEXT_OVERLAY_H #endif // CARD_PICTURE_WITH_TEXT_OVERLAY_H

View file

@ -6,7 +6,6 @@
#include <QLabel> #include <QLabel>
#include <QScrollArea> #include <QScrollArea>
#include <QScrollBar> #include <QScrollBar>
#include <QSizePolicy>
#include <QTextEdit> #include <QTextEdit>
#include <libcockatrice/card/game_specific_terms.h> #include <libcockatrice/card/game_specific_terms.h>
#include <libcockatrice/card/relation/card_relation.h> #include <libcockatrice/card/relation/card_relation.h>
@ -51,8 +50,9 @@ void CardInfoTextWidget::setTexts(const QString &propsText, const QString &textT
textLabel->setText(textText); textLabel->setText(textText);
} }
void CardInfoTextWidget::setCard(CardInfoPtr card) void CardInfoTextWidget::setCard(const ExactCard &exactCard)
{ {
auto card = exactCard.getCardPtr();
if (card == nullptr) { if (card == nullptr) {
setTexts("", ""); setTexts("", "");
return; return;
@ -62,6 +62,15 @@ void CardInfoTextWidget::setCard(CardInfoPtr card)
text += QString("<tr><td>%1</td><td width=\"5\"></td><td>%2</td></tr>") text += QString("<tr><td>%1</td><td width=\"5\"></td><td>%2</td></tr>")
.arg(tr("Name:"), card->getName().toHtmlEscaped()); .arg(tr("Name:"), card->getName().toHtmlEscaped());
if (exactCard.getPrinting() != PrintingInfo()) {
QString setShort = exactCard.getPrinting().getSet()->getShortName().toHtmlEscaped();
QString cardNum = exactCard.getPrinting().getProperty("num").toHtmlEscaped();
text += QString("<tr><td>%1</td><td></td><td>%2</td></tr>").arg(tr("Set:"), setShort);
text += QString("<tr><td>%1</td><td></td><td>%2</td></tr>").arg(tr("Collector Number:"), cardNum);
}
QStringList cardProps = card->getProperties(); QStringList cardProps = card->getProperties();
for (const QString &key : cardProps) { for (const QString &key : cardProps) {
if (key.contains("-")) if (key.contains("-"))

View file

@ -7,6 +7,8 @@
#ifndef CARDINFOTEXT_H #ifndef CARDINFOTEXT_H
#define CARDINFOTEXT_H #define CARDINFOTEXT_H
#include "libcockatrice/card/printing/exact_card.h"
#include <QFrame> #include <QFrame>
#include <libcockatrice/card/card_info.h> #include <libcockatrice/card/card_info.h>
class QLabel; class QLabel;
@ -32,7 +34,7 @@ public:
signals: signals:
void linkActivated(const QString &link); void linkActivated(const QString &link);
public slots: public slots:
void setCard(CardInfoPtr card); void setCard(const ExactCard &card);
}; };
#endif #endif

View file

@ -1,6 +1,5 @@
#include "card_size_widget.h" #include "card_size_widget.h"
#include "../../../client/settings/cache_settings.h"
#include "../printing_selector/printing_selector.h" #include "../printing_selector/printing_selector.h"
#include "../visual_deck_storage/visual_deck_storage_widget.h" #include "../visual_deck_storage/visual_deck_storage_widget.h"

View file

@ -4,11 +4,11 @@
#include "card_group_display_widgets/overlapped_card_group_display_widget.h" #include "card_group_display_widgets/overlapped_card_group_display_widget.h"
#include <QResizeEvent> #include <QResizeEvent>
#include <libcockatrice/card/card_info_comparator.h>
#include <libcockatrice/models/deck_list/deck_list_model.h> #include <libcockatrice/models/deck_list/deck_list_model.h>
DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent, DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent,
DeckListModel *_deckListModel, DeckListModel *_deckListModel,
QItemSelectionModel *_selectionModel,
QPersistentModelIndex _trackedIndex, QPersistentModelIndex _trackedIndex,
QString _zoneName, QString _zoneName,
QString _activeGroupCriteria, QString _activeGroupCriteria,
@ -17,9 +17,10 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent,
int bannerOpacity, int bannerOpacity,
int subBannerOpacity, int subBannerOpacity,
CardSizeWidget *_cardSizeWidget) CardSizeWidget *_cardSizeWidget)
: QWidget(parent), deckListModel(_deckListModel), trackedIndex(_trackedIndex), zoneName(_zoneName), : QWidget(parent), deckListModel(_deckListModel), selectionModel(_selectionModel), trackedIndex(_trackedIndex),
activeGroupCriteria(_activeGroupCriteria), activeSortCriteria(_activeSortCriteria), displayType(_displayType), zoneName(_zoneName), activeGroupCriteria(_activeGroupCriteria), activeSortCriteria(_activeSortCriteria),
bannerOpacity(bannerOpacity), subBannerOpacity(subBannerOpacity), cardSizeWidget(_cardSizeWidget) displayType(_displayType), bannerOpacity(bannerOpacity), subBannerOpacity(subBannerOpacity),
cardSizeWidget(_cardSizeWidget)
{ {
layout = new QVBoxLayout(this); layout = new QVBoxLayout(this);
setLayout(layout); setLayout(layout);
@ -37,9 +38,36 @@ DeckCardZoneDisplayWidget::DeckCardZoneDisplayWidget(QWidget *parent,
displayCards(); displayCards();
connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &DeckCardZoneDisplayWidget::onCategoryAddition); connect(deckListModel, &QAbstractItemModel::rowsInserted, this, &DeckCardZoneDisplayWidget::onCategoryAddition);
if (selectionModel) {
connect(selectionModel, &QItemSelectionModel::selectionChanged, this,
&DeckCardZoneDisplayWidget::onSelectionChanged);
}
connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &DeckCardZoneDisplayWidget::onCategoryRemoval); connect(deckListModel, &QAbstractItemModel::rowsRemoved, this, &DeckCardZoneDisplayWidget::onCategoryRemoval);
} }
void DeckCardZoneDisplayWidget::onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected)
{
for (auto &range : selected) {
for (int row = range.top(); row <= range.bottom(); ++row) {
QModelIndex idx = range.model()->index(row, 0, range.parent());
auto it = indexToWidgetMap.find(QPersistentModelIndex(idx));
if (it != indexToWidgetMap.end()) {
// it.value()->setHighlighted(true);
}
}
}
for (auto &range : deselected) {
for (int row = range.top(); row <= range.bottom(); ++row) {
QModelIndex idx = range.model()->index(row, 0, range.parent());
auto it = indexToWidgetMap.find(QPersistentModelIndex(idx));
if (it != indexToWidgetMap.end()) {
// it.value()->setHighlighted(false);
}
}
}
}
void DeckCardZoneDisplayWidget::cleanupInvalidCardGroup(CardGroupDisplayWidget *displayWidget) void DeckCardZoneDisplayWidget::cleanupInvalidCardGroup(CardGroupDisplayWidget *displayWidget)
{ {
cardGroupLayout->removeWidget(displayWidget); cardGroupLayout->removeWidget(displayWidget);
@ -60,8 +88,8 @@ void DeckCardZoneDisplayWidget::constructAppropriateWidget(QPersistentModelIndex
} }
if (displayType == DisplayType::Overlap) { if (displayType == DisplayType::Overlap) {
auto *displayWidget = new OverlappedCardGroupDisplayWidget( auto *displayWidget = new OverlappedCardGroupDisplayWidget(
cardGroupContainer, deckListModel, index, zoneName, categoryName, activeGroupCriteria, activeSortCriteria, cardGroupContainer, deckListModel, selectionModel, index, zoneName, categoryName, activeGroupCriteria,
subBannerOpacity, cardSizeWidget); activeSortCriteria, subBannerOpacity, cardSizeWidget);
connect(displayWidget, &OverlappedCardGroupDisplayWidget::cardClicked, this, connect(displayWidget, &OverlappedCardGroupDisplayWidget::cardClicked, this,
&DeckCardZoneDisplayWidget::onClick); &DeckCardZoneDisplayWidget::onClick);
connect(displayWidget, &OverlappedCardGroupDisplayWidget::cardHovered, this, connect(displayWidget, &OverlappedCardGroupDisplayWidget::cardHovered, this,
@ -73,9 +101,9 @@ void DeckCardZoneDisplayWidget::constructAppropriateWidget(QPersistentModelIndex
cardGroupLayout->addWidget(displayWidget); cardGroupLayout->addWidget(displayWidget);
indexToWidgetMap.insert(index, displayWidget); indexToWidgetMap.insert(index, displayWidget);
} else if (displayType == DisplayType::Flat) { } else if (displayType == DisplayType::Flat) {
auto *displayWidget = auto *displayWidget = new FlatCardGroupDisplayWidget(cardGroupContainer, deckListModel, selectionModel, index,
new FlatCardGroupDisplayWidget(cardGroupContainer, deckListModel, index, zoneName, categoryName, zoneName, categoryName, activeGroupCriteria,
activeGroupCriteria, activeSortCriteria, subBannerOpacity, cardSizeWidget); activeSortCriteria, subBannerOpacity, cardSizeWidget);
connect(displayWidget, &FlatCardGroupDisplayWidget::cardClicked, this, &DeckCardZoneDisplayWidget::onClick); connect(displayWidget, &FlatCardGroupDisplayWidget::cardClicked, this, &DeckCardZoneDisplayWidget::onClick);
connect(displayWidget, &FlatCardGroupDisplayWidget::cardHovered, this, &DeckCardZoneDisplayWidget::onHover); connect(displayWidget, &FlatCardGroupDisplayWidget::cardHovered, this, &DeckCardZoneDisplayWidget::onHover);
connect(displayWidget, &CardGroupDisplayWidget::cleanupRequested, this, connect(displayWidget, &CardGroupDisplayWidget::cleanupRequested, this,

View file

@ -16,7 +16,6 @@
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QWidget> #include <QWidget>
#include <libcockatrice/card/card_info.h>
#include <libcockatrice/models/deck_list/deck_list_model.h> #include <libcockatrice/models/deck_list/deck_list_model.h>
class DeckCardZoneDisplayWidget : public QWidget class DeckCardZoneDisplayWidget : public QWidget
@ -26,6 +25,7 @@ class DeckCardZoneDisplayWidget : public QWidget
public: public:
DeckCardZoneDisplayWidget(QWidget *parent, DeckCardZoneDisplayWidget(QWidget *parent,
DeckListModel *deckListModel, DeckListModel *deckListModel,
QItemSelectionModel *selectionModel,
QPersistentModelIndex trackedIndex, QPersistentModelIndex trackedIndex,
QString zoneName, QString zoneName,
QString activeGroupCriteria, QString activeGroupCriteria,
@ -34,7 +34,9 @@ public:
int bannerOpacity, int bannerOpacity,
int subBannerOpacity, int subBannerOpacity,
CardSizeWidget *_cardSizeWidget); CardSizeWidget *_cardSizeWidget);
void onSelectionChanged(const QItemSelection &selected, const QItemSelection &deselected);
DeckListModel *deckListModel; DeckListModel *deckListModel;
QItemSelectionModel *selectionModel;
QPersistentModelIndex trackedIndex; QPersistentModelIndex trackedIndex;
QString zoneName; QString zoneName;
void addCardsToOverlapWidget(); void addCardsToOverlapWidget();

View file

@ -8,7 +8,6 @@
#include <QMouseEvent> #include <QMouseEvent>
#include <QPainterPath> #include <QPainterPath>
#include <QStylePainter> #include <QStylePainter>
#include <QTextOption>
/** /**
* @brief Constructs a CardPictureWithTextOverlay widget. * @brief Constructs a CardPictureWithTextOverlay widget.

View file

@ -13,6 +13,7 @@
#include <QColor> #include <QColor>
#include <QSize> #include <QSize>
#include <QTextOption> #include <QTextOption>
#include <QTimer>
class DeckPreviewCardPictureWidget final : public CardInfoPictureWithTextOverlayWidget class DeckPreviewCardPictureWidget final : public CardInfoPictureWithTextOverlayWidget
{ {

View file

@ -17,20 +17,19 @@ DeckAnalyticsWidget::DeckAnalyticsWidget(QWidget *parent, DeckListModel *_deckLi
container->setLayout(containerLayout); container->setLayout(containerLayout);
scrollArea->setWidget(container); scrollArea->setWidget(container);
manaCurveWidget = new ManaCurveWidget(this, deckListModel); deckListStatisticsAnalyzer = new DeckListStatisticsAnalyzer(this, deckListModel);
manaCurveWidget = new ManaCurveWidget(this, deckListStatisticsAnalyzer);
containerLayout->addWidget(manaCurveWidget); containerLayout->addWidget(manaCurveWidget);
manaDevotionWidget = new ManaDevotionWidget(this, deckListModel); manaDevotionWidget = new ManaDevotionWidget(this, deckListStatisticsAnalyzer);
containerLayout->addWidget(manaDevotionWidget); containerLayout->addWidget(manaDevotionWidget);
manaBaseWidget = new ManaBaseWidget(this, deckListModel); manaBaseWidget = new ManaBaseWidget(this, deckListStatisticsAnalyzer);
containerLayout->addWidget(manaBaseWidget); containerLayout->addWidget(manaBaseWidget);
} }
void DeckAnalyticsWidget::refreshDisplays(DeckListModel *_deckModel) void DeckAnalyticsWidget::refreshDisplays()
{ {
deckListModel = _deckModel; deckListStatisticsAnalyzer->update();
manaCurveWidget->setDeckModel(_deckModel);
manaDevotionWidget->setDeckModel(_deckModel);
manaBaseWidget->setDeckModel(_deckModel);
} }

View file

@ -7,16 +7,13 @@
#ifndef DECK_ANALYTICS_WIDGET_H #ifndef DECK_ANALYTICS_WIDGET_H
#define DECK_ANALYTICS_WIDGET_H #define DECK_ANALYTICS_WIDGET_H
#include "../general/layout_containers/flow_widget.h"
#include "mana_base_widget.h" #include "mana_base_widget.h"
#include "mana_curve_widget.h" #include "mana_curve_widget.h"
#include "mana_devotion_widget.h" #include "mana_devotion_widget.h"
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QScrollArea> #include <QScrollArea>
#include <QVBoxLayout>
#include <QWidget> #include <QWidget>
#include <libcockatrice/deck_list/deck_list.h>
#include <libcockatrice/models/deck_list/deck_list_model.h> #include <libcockatrice/models/deck_list/deck_list_model.h>
class DeckAnalyticsWidget : public QWidget class DeckAnalyticsWidget : public QWidget
@ -27,10 +24,11 @@ public:
explicit DeckAnalyticsWidget(QWidget *parent, DeckListModel *deckListModel); explicit DeckAnalyticsWidget(QWidget *parent, DeckListModel *deckListModel);
void setDeckList(const DeckList &_deckListModel); void setDeckList(const DeckList &_deckListModel);
std::map<int, int> analyzeManaCurve(); std::map<int, int> analyzeManaCurve();
void refreshDisplays(DeckListModel *_deckListModel); void refreshDisplays();
private: private:
DeckListModel *deckListModel; DeckListModel *deckListModel;
DeckListStatisticsAnalyzer *deckListStatisticsAnalyzer;
QVBoxLayout *mainLayout; QVBoxLayout *mainLayout;
QWidget *container; QWidget *container;

Some files were not shown because too many files have changed in this diff Show more