Merge branch 'master' into 6186/target-older-x86-macos

This commit is contained in:
Bruno Alexandre Rosa 2025-10-10 10:31:54 -03:00
commit 3395894adf
738 changed files with 4150 additions and 3757 deletions

View file

@ -31,10 +31,10 @@ jobs:
- name: Update Cockatrice translation source - name: Update Cockatrice translation source
id: cockatrice id: cockatrice
shell: bash shell: bash
env: run: |
FILE: 'cockatrice/cockatrice_en@source.ts' FILE="cockatrice/cockatrice_en@source.ts"
DIRS: 'cockatrice/src common' export DIRS="cockatrice/src $(find . -maxdepth 1 -type d -name 'libcockatrice_*')"
run: .ci/update_translation_source_strings.sh FILE="$FILE" DIRS="$DIRS" .ci/update_translation_source_strings.sh
- name: Update Oracle translation source - name: Update Oracle translation source
id: oracle id: oracle

View file

@ -328,7 +328,13 @@ endif()
include(CPack) include(CPack)
add_subdirectory(common) add_subdirectory(${CMAKE_SOURCE_DIR}/libcockatrice_protocol ${CMAKE_BINARY_DIR}/libcockatrice_protocol)
add_subdirectory(${CMAKE_SOURCE_DIR}/libcockatrice_network ${CMAKE_BINARY_DIR}/libcockatrice_network)
add_subdirectory(${CMAKE_SOURCE_DIR}/libcockatrice_deck_list ${CMAKE_BINARY_DIR}/libcockatrice_deck_list)
add_subdirectory(${CMAKE_SOURCE_DIR}/libcockatrice_rng ${CMAKE_BINARY_DIR}/libcockatrice_rng)
add_subdirectory(${CMAKE_SOURCE_DIR}/libcockatrice_settings ${CMAKE_BINARY_DIR}/libcockatrice_settings)
add_subdirectory(${CMAKE_SOURCE_DIR}/libcockatrice_card ${CMAKE_BINARY_DIR}/libcockatrice_card)
add_subdirectory(${CMAKE_SOURCE_DIR}/libcockatrice_utility ${CMAKE_BINARY_DIR}/libcockatrice_utility)
if(WITH_SERVER) if(WITH_SERVER)
add_subdirectory(servatrice) add_subdirectory(servatrice)
set(CPACK_INSTALL_CMAKE_PROJECTS "Servatrice;Servatrice;ALL;/" ${CPACK_INSTALL_CMAKE_PROJECTS}) set(CPACK_INSTALL_CMAKE_PROJECTS "Servatrice;Servatrice;ALL;/" ${CPACK_INSTALL_CMAKE_PROJECTS})

View file

@ -7,66 +7,39 @@ project(Cockatrice VERSION "${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}.${
set(cockatrice_SOURCES set(cockatrice_SOURCES
${VERSION_STRING_CPP} ${VERSION_STRING_CPP}
# sort by alphabetical order, so that there is no debate about where to add new sources to the list # sort by alphabetical order, so that there is no debate about where to add new sources to the list
src/card/card_info.cpp src/client/network/update/client/update_downloader.cpp
src/card/card_relation.cpp src/client/network/interfaces/deck_stats_interface.cpp
src/card/card_set.cpp src/client/network/interfaces/tapped_out_interface.cpp
src/card/card_set_list.cpp
src/card/exact_card.cpp
src/card/printing_info.cpp
src/client/deck_editor_menu.cpp
src/client/get_text_with_max.cpp
src/client/network/client_update_checker.cpp
src/client/network/parsers/deck_link_to_api_transformer.cpp src/client/network/parsers/deck_link_to_api_transformer.cpp
src/client/network/release_channel.cpp src/client/network/update/client/client_update_checker.cpp
src/client/network/replay_timeline_widget.cpp src/client/network/update/client/release_channel.cpp
src/client/network/sets_model.cpp src/client/network/update/card_spoiler/spoiler_background_updater.cpp
src/client/network/spoiler_background_updater.cpp
src/client/replay_manager.cpp
src/client/sound_engine.cpp src/client/sound_engine.cpp
src/client/tapped_out_interface.cpp src/interface/widgets/dialogs/dlg_connect.cpp
src/client/update_downloader.cpp src/interface/widgets/dialogs/dlg_convert_deck_to_cod_format.cpp
src/database/card_database.cpp src/interface/widgets/dialogs/dlg_create_game.cpp
src/database/card_database_loader.cpp src/interface/widgets/dialogs/dlg_default_tags_editor.cpp
src/database/card_database_manager.cpp src/interface/widgets/dialogs/dlg_edit_avatar.cpp
src/database/card_database_querier.cpp src/interface/widgets/dialogs/dlg_edit_password.cpp
src/database/model/card_database_model.cpp src/interface/widgets/dialogs/dlg_edit_tokens.cpp
src/database/model/card_database_display_model.cpp src/interface/widgets/dialogs/dlg_edit_user.cpp
src/database/model/card/card_completer_proxy_model.cpp src/interface/widgets/dialogs/dlg_filter_games.cpp
src/database/model/card/card_search_model.cpp src/interface/widgets/dialogs/dlg_forgot_password_challenge.cpp
src/database/model/token/token_display_model.cpp src/interface/widgets/dialogs/dlg_forgot_password_request.cpp
src/database/model/token/token_edit_model.cpp src/interface/widgets/dialogs/dlg_forgot_password_reset.cpp
src/database/parser/card_database_parser.cpp src/interface/widgets/dialogs/dlg_load_deck.cpp
src/database/parser/cockatrice_xml_3.cpp src/interface/widgets/dialogs/dlg_load_deck_from_clipboard.cpp
src/database/parser/cockatrice_xml_4.cpp src/interface/widgets/dialogs/dlg_load_deck_from_website.cpp
src/deck/custom_line_edit.cpp src/interface/widgets/dialogs/dlg_load_remote_deck.cpp
src/deck/deck_list_model.cpp src/interface/widgets/dialogs/dlg_manage_sets.cpp
src/deck/deck_loader.cpp src/interface/widgets/dialogs/dlg_register.cpp
src/deck/deck_stats_interface.cpp src/interface/widgets/dialogs/dlg_select_set_for_cards.cpp
src/dialogs/dlg_connect.cpp src/interface/widgets/dialogs/dlg_settings.cpp
src/dialogs/dlg_convert_deck_to_cod_format.cpp src/interface/widgets/dialogs/dlg_startup_card_check.cpp
src/dialogs/dlg_create_game.cpp src/interface/widgets/dialogs/dlg_tip_of_the_day.cpp
src/dialogs/dlg_default_tags_editor.cpp src/interface/widgets/dialogs/dlg_update.cpp
src/dialogs/dlg_edit_avatar.cpp src/interface/widgets/dialogs/dlg_view_log.cpp
src/dialogs/dlg_edit_password.cpp src/interface/widgets/dialogs/tip_of_the_day.cpp
src/dialogs/dlg_edit_tokens.cpp
src/dialogs/dlg_edit_user.cpp
src/dialogs/dlg_filter_games.cpp
src/dialogs/dlg_forgot_password_challenge.cpp
src/dialogs/dlg_forgot_password_request.cpp
src/dialogs/dlg_forgot_password_reset.cpp
src/dialogs/dlg_load_deck.cpp
src/dialogs/dlg_load_deck_from_clipboard.cpp
src/dialogs/dlg_load_deck_from_website.cpp
src/dialogs/dlg_load_remote_deck.cpp
src/dialogs/dlg_manage_sets.cpp
src/dialogs/dlg_register.cpp
src/dialogs/dlg_select_set_for_cards.cpp
src/dialogs/dlg_settings.cpp
src/dialogs/dlg_startup_card_check.cpp
src/dialogs/dlg_tip_of_the_day.cpp
src/dialogs/dlg_update.cpp
src/dialogs/dlg_view_log.cpp
src/dialogs/tip_of_the_day.cpp
src/filters/deck_filter_string.cpp src/filters/deck_filter_string.cpp
src/filters/filter_builder.cpp src/filters/filter_builder.cpp
src/filters/filter_card.cpp src/filters/filter_card.cpp
@ -138,9 +111,16 @@ set(cockatrice_SOURCES
src/game/zones/table_zone.cpp src/game/zones/table_zone.cpp
src/game/zones/view_zone.cpp src/game/zones/view_zone.cpp
src/game/zones/view_zone_widget.cpp src/game/zones/view_zone_widget.cpp
src/interface/card_picture_loader/card_picture_loader.cpp
src/interface/card_picture_loader/card_picture_loader_local.cpp
src/interface/card_picture_loader/card_picture_loader_request_status_display_widget.cpp
src/interface/card_picture_loader/card_picture_loader_status_bar.cpp
src/interface/card_picture_loader/card_picture_loader_worker.cpp
src/interface/card_picture_loader/card_picture_loader_worker_work.cpp
src/interface/card_picture_loader/card_picture_to_load.cpp
src/interface/layouts/flow_layout.cpp src/interface/layouts/flow_layout.cpp
src/interface/layouts/overlap_layout.cpp src/interface/layouts/overlap_layout.cpp
src/interface/line_edit_completer.cpp src/interface/widgets/utility/line_edit_completer.cpp
src/interface/pixel_map_generator.cpp src/interface/pixel_map_generator.cpp
src/interface/theme_manager.cpp src/interface/theme_manager.cpp
src/interface/widgets/cards/additional_info/color_identity_widget.cpp src/interface/widgets/cards/additional_info/color_identity_widget.cpp
@ -181,6 +161,7 @@ set(cockatrice_SOURCES
src/interface/widgets/general/layout_containers/flow_widget.cpp src/interface/widgets/general/layout_containers/flow_widget.cpp
src/interface/widgets/general/layout_containers/overlap_control_widget.cpp src/interface/widgets/general/layout_containers/overlap_control_widget.cpp
src/interface/widgets/general/layout_containers/overlap_widget.cpp src/interface/widgets/general/layout_containers/overlap_widget.cpp
src/interface/widgets/menus/deck_editor_menu.cpp
src/interface/widgets/printing_selector/all_zones_card_amount_widget.cpp src/interface/widgets/printing_selector/all_zones_card_amount_widget.cpp
src/interface/widgets/printing_selector/card_amount_widget.cpp src/interface/widgets/printing_selector/card_amount_widget.cpp
src/interface/widgets/printing_selector/printing_selector.cpp src/interface/widgets/printing_selector/printing_selector.cpp
@ -192,6 +173,22 @@ set(cockatrice_SOURCES
src/interface/widgets/printing_selector/set_name_and_collectors_number_display_widget.cpp src/interface/widgets/printing_selector/set_name_and_collectors_number_display_widget.cpp
src/interface/widgets/quick_settings/settings_button_widget.cpp src/interface/widgets/quick_settings/settings_button_widget.cpp
src/interface/widgets/quick_settings/settings_popup_widget.cpp src/interface/widgets/quick_settings/settings_popup_widget.cpp
src/interface/widgets/replay/replay_manager.cpp
src/interface/widgets/replay/replay_timeline_widget.cpp
src/interface/widgets/server/chat_view/chat_view.cpp
src/interface/widgets/server/game_selector.cpp
src/interface/widgets/server/games_model.cpp
src/interface/widgets/server/handle_public_servers.cpp
src/interface/widgets/server/remote/remote_decklist_tree_widget.cpp
src/interface/widgets/server/remote/remote_replay_list_tree_widget.cpp
src/interface/widgets/server/user/user_context_menu.cpp
src/interface/widgets/server/user/user_info_box.cpp
src/interface/widgets/server/user/user_info_connection.cpp
src/interface/widgets/server/user/user_list_manager.cpp
src/interface/widgets/server/user/user_list_widget.cpp
src/interface/widgets/utility/custom_line_edit.cpp
src/interface/widgets/utility/get_text_with_max.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_main_type_filter_widget.cpp src/interface/widgets/visual_database_display/visual_database_display_main_type_filter_widget.cpp
@ -217,94 +214,50 @@ set(cockatrice_SOURCES
src/interface/widgets/visual_deck_storage/visual_deck_storage_widget.cpp src/interface/widgets/visual_deck_storage/visual_deck_storage_widget.cpp
src/interface/window_main.cpp src/interface/window_main.cpp
src/main.cpp src/main.cpp
src/picture_loader/picture_loader.cpp src/interface/widgets/tabs/abstract_tab_deck_editor.cpp
src/picture_loader/picture_loader_local.cpp src/interface/widgets/tabs/api/edhrec/api_response/archidekt_links/edhrec_api_response_archidekt_links.cpp
src/picture_loader/picture_loader_request_status_display_widget.cpp src/interface/widgets/tabs/api/edhrec/api_response/average_deck/edhrec_average_deck_api_response.cpp
src/picture_loader/picture_loader_status_bar.cpp src/interface/widgets/tabs/api/edhrec/api_response/average_deck/edhrec_deck_api_response.cpp
src/picture_loader/picture_loader_worker.cpp src/interface/widgets/tabs/api/edhrec/api_response/card_prices/edhrec_api_response_card_prices.cpp
src/picture_loader/picture_loader_worker_work.cpp src/interface/widgets/tabs/api/edhrec/api_response/cards/edhrec_api_response_card_container.cpp
src/picture_loader/picture_to_load.cpp src/interface/widgets/tabs/api/edhrec/api_response/cards/edhrec_api_response_card_details.cpp
src/server/abstract_client.cpp src/interface/widgets/tabs/api/edhrec/api_response/cards/edhrec_api_response_card_list.cpp
src/server/chat_view/chat_view.cpp src/interface/widgets/tabs/api/edhrec/api_response/cards/edhrec_commander_api_response_commander_details.cpp
src/server/game_selector.cpp src/interface/widgets/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response.cpp
src/server/games_model.cpp src/interface/widgets/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_average_deck_statistics.cpp
src/server/handle_public_servers.cpp src/interface/widgets/tabs/api/edhrec/api_response/top_cards/edhrec_top_cards_api_response.cpp
src/server/local_client.cpp src/interface/widgets/tabs/api/edhrec/api_response/top_commanders/edhrec_top_commanders_api_response.cpp
src/server/local_server.cpp src/interface/widgets/tabs/api/edhrec/api_response/top_tags/edhrec_top_tags_api_response.cpp
src/server/local_server_interface.cpp src/interface/widgets/tabs/api/edhrec/display/card_prices/edhrec_api_response_card_prices_display_widget.cpp
src/server/pending_command.cpp src/interface/widgets/tabs/api/edhrec/display/cards/edhrec_api_response_card_details_display_widget.cpp
src/server/remote/remote_client.cpp src/interface/widgets/tabs/api/edhrec/display/cards/edhrec_api_response_card_inclusion_display_widget.cpp
src/server/remote/remote_decklist_tree_widget.cpp src/interface/widgets/tabs/api/edhrec/display/cards/edhrec_api_response_card_list_display_widget.cpp
src/server/remote/remote_replay_list_tree_widget.cpp src/interface/widgets/tabs/api/edhrec/display/cards/edhrec_api_response_card_synergy_display_widget.cpp
src/server/user/user_context_menu.cpp src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_api_response_commander_details_display_widget.cpp
src/server/user/user_info_box.cpp src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_commander_api_response_display_widget.cpp
src/server/user/user_info_connection.cpp src/interface/widgets/tabs/api/edhrec/display/commander/edhrec_commander_api_response_navigation_widget.cpp
src/server/user/user_list_manager.cpp src/interface/widgets/tabs/api/edhrec/display/top_cards/edhrec_top_cards_api_response_display_widget.cpp
src/server/user/user_list_widget.cpp src/interface/widgets/tabs/api/edhrec/display/top_commander/edhrec_top_commanders_api_response_display_widget.cpp
src/settings/cache_settings.cpp src/interface/widgets/tabs/api/edhrec/display/top_tags/edhrec_top_tags_api_response_display_widget.cpp
src/settings/card_counter_settings.cpp src/interface/widgets/tabs/api/edhrec/tab_edhrec.cpp
src/settings/card_database_settings.cpp src/interface/widgets/tabs/api/edhrec/tab_edhrec_main.cpp
src/settings/card_override_settings.cpp src/interface/widgets/tabs/tab.cpp
src/settings/debug_settings.cpp src/interface/widgets/tabs/tab_account.cpp
src/settings/download_settings.cpp src/interface/widgets/tabs/tab_admin.cpp
src/settings/game_filters_settings.cpp src/interface/widgets/tabs/tab_deck_editor.cpp
src/settings/layouts_settings.cpp src/interface/widgets/tabs/tab_deck_storage.cpp
src/settings/message_settings.cpp src/interface/widgets/tabs/tab_game.cpp
src/settings/recents_settings.cpp src/interface/widgets/tabs/tab_home.cpp
src/settings/servers_settings.cpp src/interface/widgets/tabs/tab_logs.cpp
src/settings/settings_manager.cpp src/interface/widgets/tabs/tab_message.cpp
src/settings/shortcut_treeview.cpp src/interface/widgets/tabs/tab_replays.cpp
src/settings/shortcuts_settings.cpp src/interface/widgets/tabs/tab_room.cpp
src/tabs/abstract_tab_deck_editor.cpp src/interface/widgets/tabs/tab_server.cpp
src/tabs/api/edhrec/api_response/archidekt_links/edhrec_api_response_archidekt_links.cpp src/interface/widgets/tabs/tab_supervisor.cpp
src/tabs/api/edhrec/api_response/average_deck/edhrec_average_deck_api_response.cpp src/interface/widgets/tabs/tab_visual_database_display.cpp
src/tabs/api/edhrec/api_response/average_deck/edhrec_deck_api_response.cpp src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual.cpp
src/tabs/api/edhrec/api_response/card_prices/edhrec_api_response_card_prices.cpp src/interface/widgets/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.cpp
src/tabs/api/edhrec/api_response/cards/edhrec_api_response_card_container.cpp src/interface/widgets/tabs/visual_deck_storage/tab_deck_storage_visual.cpp
src/tabs/api/edhrec/api_response/cards/edhrec_api_response_card_details.cpp
src/tabs/api/edhrec/api_response/cards/edhrec_api_response_card_list.cpp
src/tabs/api/edhrec/api_response/cards/edhrec_commander_api_response_commander_details.cpp
src/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response.cpp
src/tabs/api/edhrec/api_response/commander/edhrec_commander_api_response_average_deck_statistics.cpp
src/tabs/api/edhrec/api_response/top_cards/edhrec_top_cards_api_response.cpp
src/tabs/api/edhrec/api_response/top_commanders/edhrec_top_commanders_api_response.cpp
src/tabs/api/edhrec/api_response/top_tags/edhrec_top_tags_api_response.cpp
src/tabs/api/edhrec/display/card_prices/edhrec_api_response_card_prices_display_widget.cpp
src/tabs/api/edhrec/display/cards/edhrec_api_response_card_details_display_widget.cpp
src/tabs/api/edhrec/display/cards/edhrec_api_response_card_inclusion_display_widget.cpp
src/tabs/api/edhrec/display/cards/edhrec_api_response_card_list_display_widget.cpp
src/tabs/api/edhrec/display/cards/edhrec_api_response_card_synergy_display_widget.cpp
src/tabs/api/edhrec/display/commander/edhrec_api_response_commander_details_display_widget.cpp
src/tabs/api/edhrec/display/commander/edhrec_commander_api_response_display_widget.cpp
src/tabs/api/edhrec/display/commander/edhrec_commander_api_response_navigation_widget.cpp
src/tabs/api/edhrec/display/top_cards/edhrec_top_cards_api_response_display_widget.cpp
src/tabs/api/edhrec/display/top_commander/edhrec_top_commanders_api_response_display_widget.cpp
src/tabs/api/edhrec/display/top_tags/edhrec_top_tags_api_response_display_widget.cpp
src/tabs/api/edhrec/tab_edhrec.cpp
src/tabs/api/edhrec/tab_edhrec_main.cpp
src/tabs/tab.cpp
src/tabs/tab_account.cpp
src/tabs/tab_admin.cpp
src/tabs/tab_deck_editor.cpp
src/tabs/tab_deck_storage.cpp
src/tabs/tab_game.cpp
src/tabs/tab_home.cpp
src/tabs/tab_logs.cpp
src/tabs/tab_message.cpp
src/tabs/tab_replays.cpp
src/tabs/tab_room.cpp
src/tabs/tab_server.cpp
src/tabs/tab_supervisor.cpp
src/tabs/tab_visual_database_display.cpp
src/tabs/visual_deck_editor/tab_deck_editor_visual.cpp
src/tabs/visual_deck_editor/tab_deck_editor_visual_tab_widget.cpp
src/tabs/visual_deck_storage/tab_deck_storage_visual.cpp
src/utility/card_info_comparator.cpp
src/utility/deck_list_sort_filter_proxy_model.cpp
src/utility/key_signals.cpp
src/utility/levenshtein.cpp
src/utility/logger.cpp
src/utility/sequence_edit.cpp
) )
add_subdirectory(sounds) add_subdirectory(sounds)
@ -316,15 +269,23 @@ configure_file(
set(cockatrice_RESOURCES cockatrice.qrc) set(cockatrice_RESOURCES cockatrice.qrc)
if(UPDATE_TRANSLATIONS) if(UPDATE_TRANSLATIONS)
# Cockatrice main sources
file(GLOB_RECURSE translate_cockatrice_SRCS ${CMAKE_SOURCE_DIR}/cockatrice/src/*.cpp file(GLOB_RECURSE translate_cockatrice_SRCS ${CMAKE_SOURCE_DIR}/cockatrice/src/*.cpp
${CMAKE_SOURCE_DIR}/cockatrice/src/*.h ${CMAKE_SOURCE_DIR}/cockatrice/src/*.h
) )
file(GLOB_RECURSE translate_common_SRCS ${CMAKE_SOURCE_DIR}/common/*.cpp ${CMAKE_SOURCE_DIR}/common/*.h)
set(translate_SRCS ${translate_cockatrice_SRCS} ${translate_common_SRCS}) # All libcockatrice_* libraries (recursively)
file(GLOB_RECURSE translate_lib_SRCS ${CMAKE_SOURCE_DIR}/libcockatrice_*/**/*.cpp
${CMAKE_SOURCE_DIR}/libcockatrice_*/**/*.h
)
# Combine all sources for translation
set(translate_SRCS ${translate_cockatrice_SRCS} ${translate_lib_SRCS})
set(cockatrice_TS "${CMAKE_CURRENT_SOURCE_DIR}/cockatrice_en@source.ts") set(cockatrice_TS "${CMAKE_CURRENT_SOURCE_DIR}/cockatrice_en@source.ts")
else() else()
file(GLOB cockatrice_TS "${CMAKE_CURRENT_SOURCE_DIR}/translations/*.ts") file(GLOB cockatrice_TS "${CMAKE_CURRENT_SOURCE_DIR}/translations/*.ts")
endif(UPDATE_TRANSLATIONS) endif()
if(WIN32) if(WIN32)
set(cockatrice_SOURCES ${cockatrice_SOURCES} cockatrice.rc) set(cockatrice_SOURCES ${cockatrice_SOURCES} cockatrice.rc)
@ -354,12 +315,6 @@ set(DESKTOPDIR
CACHE STRING "desktop file destination" CACHE STRING "desktop file destination"
) )
# Include directories
include_directories(../common)
include_directories(${PROTOBUF_INCLUDE_DIR})
include_directories(${CMAKE_BINARY_DIR}/common)
include_directories(${CMAKE_CURRENT_BINARY_DIR})
set(COCKATRICE_MAC_QM_INSTALL_DIR "cockatrice.app/Contents/Resources/translations") set(COCKATRICE_MAC_QM_INSTALL_DIR "cockatrice.app/Contents/Resources/translations")
set(COCKATRICE_UNIX_QM_INSTALL_DIR "share/cockatrice/translations") set(COCKATRICE_UNIX_QM_INSTALL_DIR "share/cockatrice/translations")
set(COCKATRICE_WIN32_QM_INSTALL_DIR "translations") set(COCKATRICE_WIN32_QM_INSTALL_DIR "translations")
@ -399,9 +354,20 @@ elseif(Qt5_FOUND)
endif() endif()
if(Qt5_FOUND) if(Qt5_FOUND)
target_link_libraries(cockatrice cockatrice_common ${COCKATRICE_QT_MODULES}) target_link_libraries(
cockatrice
libcockatrice_card
libcockatrice_deck_list
libcockatrice_utility
libcockatrice_network
libcockatrice_rng
${COCKATRICE_QT_MODULES}
)
else() else()
target_link_libraries(cockatrice PUBLIC cockatrice_common ${COCKATRICE_QT_MODULES}) target_link_libraries(
cockatrice PUBLIC libcockatrice_card libcockatrice_deck_list libcockatrice_utility libcockatrice_network
libcockatrice_rng ${COCKATRICE_QT_MODULES}
)
endif() endif()
if(UNIX) if(UNIX)

File diff suppressed because it is too large Load diff

View file

@ -1,8 +1,5 @@
#include "deck_stats_interface.h" #include "deck_stats_interface.h"
#include "deck_list.h"
#include "deck_list_card_node.h"
#include <QDesktopServices> #include <QDesktopServices>
#include <QMessageBox> #include <QMessageBox>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
@ -10,6 +7,8 @@
#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_card_node.h>
DeckStatsInterface::DeckStatsInterface(CardDatabase &_cardDatabase, QObject *parent) DeckStatsInterface::DeckStatsInterface(CardDatabase &_cardDatabase, QObject *parent)
: QObject(parent), cardDatabase(_cardDatabase) : QObject(parent), cardDatabase(_cardDatabase)

View file

@ -7,10 +7,9 @@
#ifndef DECKSTATS_INTERFACE_H #ifndef DECKSTATS_INTERFACE_H
#define DECKSTATS_INTERFACE_H #define DECKSTATS_INTERFACE_H
#include "../database/card_database.h"
#include "deck_list.h"
#include <QObject> #include <QObject>
#include <libcockatrice/card/database/card_database.h>
#include <libcockatrice/deck_list/deck_list.h>
class QByteArray; class QByteArray;
class QNetworkAccessManager; class QNetworkAccessManager;

View file

@ -1,8 +1,5 @@
#include "tapped_out_interface.h" #include "tapped_out_interface.h"
#include "deck_list.h"
#include "deck_list_card_node.h"
#include <QDesktopServices> #include <QDesktopServices>
#include <QMessageBox> #include <QMessageBox>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
@ -10,6 +7,8 @@
#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_card_node.h>
TappedOutInterface::TappedOutInterface(CardDatabase &_cardDatabase, QObject *parent) TappedOutInterface::TappedOutInterface(CardDatabase &_cardDatabase, QObject *parent)
: QObject(parent), cardDatabase(_cardDatabase) : QObject(parent), cardDatabase(_cardDatabase)

View file

@ -7,11 +7,10 @@
#ifndef TAPPEDOUT_INTERFACE_H #ifndef TAPPEDOUT_INTERFACE_H
#define TAPPEDOUT_INTERFACE_H #define TAPPEDOUT_INTERFACE_H
#include "../database/card_database.h"
#include "deck_list.h"
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QObject> #include <QObject>
#include <libcockatrice/card/database/card_database.h>
#include <libcockatrice/deck_list/deck_list.h>
inline Q_LOGGING_CATEGORY(TappedOutInterfaceLog, "tapped_out_interface"); inline Q_LOGGING_CATEGORY(TappedOutInterfaceLog, "tapped_out_interface");

View file

@ -6,10 +6,9 @@
#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 "../../../deck/deck_loader.h"
#include <QJsonArray> #include <QJsonArray>
#include <QJsonObject> #include <QJsonObject>
#include <libcockatrice/deck_list/deck_loader.h>
class IJsonDeckParser class IJsonDeckParser
{ {

View file

@ -1,10 +1,7 @@
#include "spoiler_background_updater.h" #include "spoiler_background_updater.h"
#include "../../database/card_database.h" #include "../../../../interface/window_main.h"
#include "../../database/card_database_manager.h" #include "../../../../main.h"
#include "../../interface/window_main.h"
#include "../../main.h"
#include "../../settings/cache_settings.h"
#include <QApplication> #include <QApplication>
#include <QCryptographicHash> #include <QCryptographicHash>
@ -16,6 +13,9 @@
#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_manager.h>
#include <libcockatrice/settings/cache_settings.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"

View file

@ -1,8 +1,9 @@
#include "client_update_checker.h" #include "client_update_checker.h"
#include "../../settings/cache_settings.h"
#include "release_channel.h" #include "release_channel.h"
#include <libcockatrice/settings/cache_settings.h>
ClientUpdateChecker::ClientUpdateChecker(QObject *parent) : QObject(parent) ClientUpdateChecker::ClientUpdateChecker(QObject *parent) : QObject(parent)
{ {
} }

View file

@ -1,9 +1,8 @@
#include "sound_engine.h" #include "sound_engine.h"
#include "../settings/cache_settings.h"
#include <QDir> #include <QDir>
#include <QMediaPlayer> #include <QMediaPlayer>
#include <libcockatrice/settings/cache_settings.h>
#if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0)) #if (QT_VERSION >= QT_VERSION_CHECK(6, 0, 0))
#include <QAudioOutput> #include <QAudioOutput>

View file

@ -1,8 +1,9 @@
#include "deck_filter_string.h" #include "deck_filter_string.h"
#include "../database/card_database_manager.h"
#include "filter_string.h" #include "filter_string.h"
#include "lib/peglib.h"
#include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/utility/peglib.h>
static peg::parser search(R"( static peg::parser search(R"(
Start <- QueryPartList Start <- QueryPartList

View file

@ -1,6 +1,6 @@
#include "filter_builder.h" #include "filter_builder.h"
#include "../deck/custom_line_edit.h" #include "../interface/widgets/utility/custom_line_edit.h"
#include "filter_card.h" #include "filter_card.h"
#include <QComboBox> #include <QComboBox>

View file

@ -1,12 +1,11 @@
#include "filter_string.h" #include "filter_string.h"
#include "../../../common/lib/peglib.h"
#include <QByteArray> #include <QByteArray>
#include <QDebug> #include <QDebug>
#include <QRegularExpression> #include <QRegularExpression>
#include <QString> #include <QString>
#include <functional> #include <functional>
#include <libcockatrice/utility/peglib.h>
static peg::parser search(R"( static peg::parser search(R"(
Start <- QueryPartList Start <- QueryPartList

View file

@ -7,13 +7,13 @@
#ifndef FILTER_STRING_H #ifndef FILTER_STRING_H
#define FILTER_STRING_H #define FILTER_STRING_H
#include "../card/card_info.h"
#include "filter_tree.h" #include "filter_tree.h"
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QMap> #include <QMap>
#include <QString> #include <QString>
#include <functional> #include <functional>
#include <libcockatrice/card/card_info.h>
#include <utility> #include <utility>
inline Q_LOGGING_CATEGORY(FilterStringLog, "filter_string"); inline Q_LOGGING_CATEGORY(FilterStringLog, "filter_string");

View file

@ -7,12 +7,12 @@
#ifndef FILTERTREE_H #ifndef FILTERTREE_H
#define FILTERTREE_H #define FILTERTREE_H
#include "../database/card_database.h"
#include "filter_card.h" #include "filter_card.h"
#include <QList> #include <QList>
#include <QMap> #include <QMap>
#include <QObject> #include <QObject>
#include <libcockatrice/card/database/card_database.h>
#include <utility> #include <utility>
class FilterTreeNode class FilterTreeNode

View file

@ -7,13 +7,13 @@
#ifndef COCKATRICE_ABSTRACT_GAME_H #ifndef COCKATRICE_ABSTRACT_GAME_H
#define COCKATRICE_ABSTRACT_GAME_H #define COCKATRICE_ABSTRACT_GAME_H
#include "../../../common/pb/game_replay.pb.h"
#include "game_event_handler.h" #include "game_event_handler.h"
#include "game_meta_info.h" #include "game_meta_info.h"
#include "game_state.h" #include "game_state.h"
#include "player/player_manager.h" #include "player/player_manager.h"
#include <QObject> #include <QObject>
#include <libcockatrice/protocol/pb/game_replay.pb.h>
class CardItem; class CardItem;
class TabGame; class TabGame;

View file

@ -1,11 +1,10 @@
#include "abstract_card_drag_item.h" #include "abstract_card_drag_item.h"
#include "../../settings/cache_settings.h"
#include <QCursor> #include <QCursor>
#include <QDebug> #include <QDebug>
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <QPainter> #include <QPainter>
#include <libcockatrice/settings/cache_settings.h>
static const float CARD_WIDTH_HALF = CARD_WIDTH / 2; static const float CARD_WIDTH_HALF = CARD_WIDTH / 2;
static const float CARD_HEIGHT_HALF = CARD_HEIGHT / 2; static const float CARD_HEIGHT_HALF = CARD_HEIGHT / 2;

View file

@ -1,9 +1,6 @@
#include "abstract_card_item.h" #include "abstract_card_item.h"
#include "../../database/card_database.h" #include "../../interface/card_picture_loader/card_picture_loader.h"
#include "../../database/card_database_manager.h"
#include "../../picture_loader/picture_loader.h"
#include "../../settings/cache_settings.h"
#include "../game_scene.h" #include "../game_scene.h"
#include <QCursor> #include <QCursor>
@ -11,6 +8,9 @@
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <QPainter> #include <QPainter>
#include <algorithm> #include <algorithm>
#include <libcockatrice/card/database/card_database.h>
#include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/settings/cache_settings.h>
AbstractCardItem::AbstractCardItem(QGraphicsItem *parent, const CardRef &cardRef, Player *_owner, int _id) AbstractCardItem::AbstractCardItem(QGraphicsItem *parent, const CardRef &cardRef, Player *_owner, int _id)
: ArrowTarget(_owner, parent), id(_id), cardRef(cardRef), tapped(false), facedown(false), tapAngle(0), : ArrowTarget(_owner, parent), id(_id), cardRef(cardRef), tapped(false), facedown(false), tapAngle(0),
@ -119,11 +119,11 @@ void AbstractCardItem::paintPicture(QPainter *painter, const QSizeF &translatedS
if (facedown || cardRef.name.isEmpty()) { if (facedown || cardRef.name.isEmpty()) {
// never reveal card color, always paint the card back // never reveal card color, always paint the card back
PictureLoader::getCardBackPixmap(translatedPixmap, translatedSize.toSize()); CardPictureLoader::getCardBackPixmap(translatedPixmap, translatedSize.toSize());
} else { } else {
// don't even spend time trying to load the picture if our size is too small // don't even spend time trying to load the picture if our size is too small
if (translatedSize.width() > 10) { if (translatedSize.width() > 10) {
PictureLoader::getPixmap(translatedPixmap, exactCard, translatedSize.toSize()); CardPictureLoader::getPixmap(translatedPixmap, exactCard, translatedSize.toSize());
if (translatedPixmap.isNull()) if (translatedPixmap.isNull())
paintImage = false; paintImage = false;
} else { } else {

View file

@ -7,11 +7,12 @@
#ifndef ABSTRACTCARDITEM_H #ifndef ABSTRACTCARDITEM_H
#define ABSTRACTCARDITEM_H #define ABSTRACTCARDITEM_H
#include "../../card/exact_card.h"
#include "arrow_target.h" #include "arrow_target.h"
#include "card_ref.h"
#include "graphics_item_type.h" #include "graphics_item_type.h"
#include <libcockatrice/card/printing/exact_card.h>
#include <libcockatrice/utility/card_ref.h>
class Player; class Player;
const int CARD_WIDTH = 72; const int CARD_WIDTH = 72;

View file

@ -1,11 +1,7 @@
#include "abstract_counter.h" #include "abstract_counter.h"
#include "../../settings/cache_settings.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../../tabs/tab_game.h"
#include "../player/player.h" #include "../player/player.h"
#include "expression.h"
#include "pb/command_inc_counter.pb.h"
#include "pb/command_set_counter.pb.h"
#include "translate_counter_name.h" #include "translate_counter_name.h"
#include <QAction> #include <QAction>
@ -16,6 +12,10 @@
#include <QMenu> #include <QMenu>
#include <QPainter> #include <QPainter>
#include <QString> #include <QString>
#include <libcockatrice/protocol/pb/command_inc_counter.pb.h>
#include <libcockatrice/protocol/pb/command_set_counter.pb.h>
#include <libcockatrice/settings/cache_settings.h>
#include <libcockatrice/utility/expression.h>
AbstractCounter::AbstractCounter(Player *_player, AbstractCounter::AbstractCounter(Player *_player,
int _id, int _id,

View file

@ -7,7 +7,7 @@
#ifndef COUNTER_H #ifndef COUNTER_H
#define COUNTER_H #define COUNTER_H
#include "../../interface/tearoff_menu.h" #include "../../interface/widgets/menus/tearoff_menu.h"
#include <QGraphicsItem> #include <QGraphicsItem>
#include <QInputDialog> #include <QInputDialog>

View file

@ -1,22 +1,22 @@
#define _USE_MATH_DEFINES #define _USE_MATH_DEFINES
#include "arrow_item.h" #include "arrow_item.h"
#include "../../card/card_info.h"
#include "../../settings/cache_settings.h"
#include "../player/player.h" #include "../player/player.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"
#include "color.h"
#include "pb/command_attach_card.pb.h"
#include "pb/command_create_arrow.pb.h"
#include "pb/command_delete_arrow.pb.h"
#include <QDebug> #include <QDebug>
#include <QGraphicsScene> #include <QGraphicsScene>
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <QPainter> #include <QPainter>
#include <QtMath> #include <QtMath>
#include <libcockatrice/card/card_info.h>
#include <libcockatrice/protocol/pb/command_attach_card.pb.h>
#include <libcockatrice/protocol/pb/command_create_arrow.pb.h>
#include <libcockatrice/protocol/pb/command_delete_arrow.pb.h>
#include <libcockatrice/settings/cache_settings.h>
#include <libcockatrice/utility/color.h>
ArrowItem::ArrowItem(Player *_player, int _id, ArrowTarget *_startItem, ArrowTarget *_targetItem, const QColor &_color) ArrowItem::ArrowItem(Player *_player, int _id, ArrowTarget *_startItem, ArrowTarget *_targetItem, const QColor &_color)
: QGraphicsItem(), player(_player), id(_id), startItem(_startItem), targetItem(_targetItem), targetLocked(false), : QGraphicsItem(), player(_player), id(_id), startItem(_startItem), targetItem(_targetItem), targetLocked(false),

View file

@ -1,9 +1,6 @@
#include "card_item.h" #include "card_item.h"
#include "../../card/card_info.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../../settings/cache_settings.h"
#include "../../settings/card_counter_settings.h"
#include "../../tabs/tab_game.h"
#include "../game_scene.h" #include "../game_scene.h"
#include "../player/player.h" #include "../player/player.h"
#include "../zones/card_zone.h" #include "../zones/card_zone.h"
@ -12,12 +9,15 @@
#include "../zones/view_zone.h" #include "../zones/view_zone.h"
#include "arrow_item.h" #include "arrow_item.h"
#include "card_drag_item.h" #include "card_drag_item.h"
#include "pb/serverinfo_card.pb.h"
#include <QApplication> #include <QApplication>
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <QMenu> #include <QMenu>
#include <QPainter> #include <QPainter>
#include <libcockatrice/card/card_info.h>
#include <libcockatrice/protocol/pb/serverinfo_card.pb.h>
#include <libcockatrice/settings/cache_settings.h>
#include <libcockatrice/settings/card_counter_settings.h>
CardItem::CardItem(Player *_owner, QGraphicsItem *parent, const CardRef &cardRef, int _cardid, CardZoneLogic *_zone) CardItem::CardItem(Player *_owner, QGraphicsItem *parent, const CardRef &cardRef, int _cardid, CardZoneLogic *_zone)
: AbstractCardItem(parent, cardRef, _owner, _cardid), zone(_zone), attacking(false), destroyOnZoneChange(false), : AbstractCardItem(parent, cardRef, _owner, _cardid), zone(_zone), attacking(false), destroyOnZoneChange(false),

View file

@ -9,7 +9,8 @@
#include "../zones/logic/card_zone_logic.h" #include "../zones/logic/card_zone_logic.h"
#include "abstract_card_item.h" #include "abstract_card_item.h"
#include "server/game/server_card.h"
#include <libcockatrice/network/server/remote/game/server_card.h>
class CardDatabase; class CardDatabase;
class CardDragItem; class CardDragItem;

View file

@ -1,10 +1,10 @@
#include "card_list.h" #include "card_list.h"
#include "../../card/card_info.h"
#include "card_item.h" #include "card_item.h"
#include <QDebug> #include <QDebug>
#include <algorithm> #include <algorithm>
#include <libcockatrice/card/card_info.h>
CardList::CardList(bool _contentsKnown) : QList<CardItem *>(), contentsKnown(_contentsKnown) CardList::CardList(bool _contentsKnown) : QList<CardItem *>(), contentsKnown(_contentsKnown)
{ {

View file

@ -1,16 +1,16 @@
#include "deck_view.h" #include "deck_view.h"
#include "../../card/card_info.h"
#include "../../interface/theme_manager.h" #include "../../interface/theme_manager.h"
#include "../../settings/cache_settings.h"
#include "deck_list.h"
#include "deck_list_card_node.h"
#include <QApplication> #include <QApplication>
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <QMouseEvent> #include <QMouseEvent>
#include <QtMath> #include <QtMath>
#include <algorithm> #include <algorithm>
#include <libcockatrice/card/card_info.h>
#include <libcockatrice/deck_list/deck_list.h>
#include <libcockatrice/deck_list/deck_list_card_node.h>
#include <libcockatrice/settings/cache_settings.h>
DeckViewCardDragItem::DeckViewCardDragItem(DeckViewCard *_item, DeckViewCardDragItem::DeckViewCardDragItem(DeckViewCard *_item,
const QPointF &_hotSpot, const QPointF &_hotSpot,

View file

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

View file

@ -1,29 +1,29 @@
#include "deck_view_container.h" #include "deck_view_container.h"
#include "../../database/card_database.h" #include "../../interface/card_picture_loader/card_picture_loader.h"
#include "../../database/card_database_manager.h" #include "../../interface/widgets/dialogs/dlg_load_deck.h"
#include "../../deck/deck_loader.h" #include "../../interface/widgets/dialogs/dlg_load_deck_from_clipboard.h"
#include "../../dialogs/dlg_load_deck.h" #include "../../interface/widgets/dialogs/dlg_load_deck_from_website.h"
#include "../../dialogs/dlg_load_deck_from_clipboard.h" #include "../../interface/widgets/dialogs/dlg_load_remote_deck.h"
#include "../../dialogs/dlg_load_deck_from_website.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../../dialogs/dlg_load_remote_deck.h"
#include "../../picture_loader/picture_loader.h"
#include "../../server/pending_command.h"
#include "../../settings/cache_settings.h"
#include "../../tabs/tab_game.h"
#include "../game_scene.h" #include "../game_scene.h"
#include "deck_view.h" #include "deck_view.h"
#include "pb/command_deck_select.pb.h"
#include "pb/command_ready_start.pb.h"
#include "pb/command_set_sideboard_lock.pb.h"
#include "pb/command_set_sideboard_plan.pb.h"
#include "pb/response_deck_download.pb.h"
#include "trice_limits.h"
#include <QMessageBox> #include <QMessageBox>
#include <QMouseEvent> #include <QMouseEvent>
#include <QToolButton> #include <QToolButton>
#include <google/protobuf/descriptor.h> #include <google/protobuf/descriptor.h>
#include <libcockatrice/card/database/card_database.h>
#include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/deck_list/deck_loader.h>
#include <libcockatrice/protocol/pb/command_deck_select.pb.h>
#include <libcockatrice/protocol/pb/command_ready_start.pb.h>
#include <libcockatrice/protocol/pb/command_set_sideboard_lock.pb.h>
#include <libcockatrice/protocol/pb/command_set_sideboard_plan.pb.h>
#include <libcockatrice/protocol/pb/response_deck_download.pb.h>
#include <libcockatrice/protocol/pending_command.h>
#include <libcockatrice/settings/cache_settings.h>
#include <libcockatrice/utility/trice_limits.h>
ToggleButton::ToggleButton(QWidget *parent) : QPushButton(parent), state(false) ToggleButton::ToggleButton(QWidget *parent) : QPushButton(parent), state(false)
{ {
@ -332,7 +332,7 @@ void DeckViewContainer::deckSelectFinished(const Response &r)
{ {
const Response_DeckDownload &resp = r.GetExtension(Response_DeckDownload::ext); const Response_DeckDownload &resp = r.GetExtension(Response_DeckDownload::ext);
DeckLoader newDeck(QString::fromStdString(resp.deck())); DeckLoader newDeck(QString::fromStdString(resp.deck()));
PictureLoader::cacheCardPixmaps(CardDatabaseManager::query()->getCards(newDeck.getCardRefList())); CardPictureLoader::cacheCardPixmaps(CardDatabaseManager::query()->getCards(newDeck.getCardRefList()));
setDeck(newDeck); setDeck(newDeck);
switchToDeckLoadedView(); switchToDeckLoadedView();
} }

View file

@ -7,9 +7,8 @@
#ifndef DECK_VIEW_CONTAINER_H #ifndef DECK_VIEW_CONTAINER_H
#define DECK_VIEW_CONTAINER_H #define DECK_VIEW_CONTAINER_H
#include "../../deck/deck_loader.h"
#include <QPushButton> #include <QPushButton>
#include <libcockatrice/deck_list/deck_loader.h>
class QVBoxLayout; class QVBoxLayout;
class AbstractCardItem; class AbstractCardItem;

View file

@ -1,6 +1,6 @@
#include "tabbed_deck_view_container.h" #include "tabbed_deck_view_container.h"
#include "../../tabs/tab_game.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "deck_view.h" #include "deck_view.h"
TabbedDeckViewContainer::TabbedDeckViewContainer(int _playerId, TabGame *parent) TabbedDeckViewContainer::TabbedDeckViewContainer(int _playerId, TabGame *parent)

View file

@ -1,13 +1,7 @@
#include "dlg_create_token.h" #include "dlg_create_token.h"
#include "../../database/card_database_manager.h"
#include "../../database/model/card_database_model.h"
#include "../../database/model/token/token_display_model.h"
#include "../../interface/widgets/cards/card_info_picture_widget.h" #include "../../interface/widgets/cards/card_info_picture_widget.h"
#include "../../main.h" #include "../../main.h"
#include "../../settings/cache_settings.h"
#include "deck_list.h"
#include "trice_limits.h"
#include <QCheckBox> #include <QCheckBox>
#include <QCloseEvent> #include <QCloseEvent>
@ -22,6 +16,12 @@
#include <QRadioButton> #include <QRadioButton>
#include <QTreeView> #include <QTreeView>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/card/database/model/card_database_model.h>
#include <libcockatrice/card/database/model/token/token_display_model.h>
#include <libcockatrice/deck_list/deck_list.h>
#include <libcockatrice/settings/cache_settings.h>
#include <libcockatrice/utility/trice_limits.h>
DlgCreateToken::DlgCreateToken(const QStringList &_predefinedTokens, QWidget *parent) DlgCreateToken::DlgCreateToken(const QStringList &_predefinedTokens, QWidget *parent)
: QDialog(parent), predefinedTokens(_predefinedTokens) : QDialog(parent), predefinedTokens(_predefinedTokens)

View file

@ -1,7 +1,5 @@
#include "dlg_move_top_cards_until.h" #include "dlg_move_top_cards_until.h"
#include "../../database/card_database.h"
#include "../../database/card_database_manager.h"
#include "../../filters/filter_string.h" #include "../../filters/filter_string.h"
#include <QDialogButtonBox> #include <QDialogButtonBox>
@ -12,6 +10,8 @@
#include <QString> #include <QString>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QWidget> #include <QWidget>
#include <libcockatrice/card/database/card_database.h>
#include <libcockatrice/card/database/card_database_manager.h>
DlgMoveTopCardsUntil::DlgMoveTopCardsUntil(QWidget *parent, QStringList exprs, uint _numberOfHits, bool autoPlay) DlgMoveTopCardsUntil::DlgMoveTopCardsUntil(QWidget *parent, QStringList exprs, uint _numberOfHits, bool autoPlay)
: QDialog(parent) : QDialog(parent)

View file

@ -1,12 +1,11 @@
#include "dlg_roll_dice.h" #include "dlg_roll_dice.h"
#include "trice_limits.h"
#include <QDialogButtonBox> #include <QDialogButtonBox>
#include <QLabel> #include <QLabel>
#include <QSpinBox> #include <QSpinBox>
#include <QVBoxLayout> #include <QVBoxLayout>
#include <QWidget> #include <QWidget>
#include <libcockatrice/utility/trice_limits.h>
DlgRollDice::DlgRollDice(QWidget *parent) : QDialog(parent) DlgRollDice::DlgRollDice(QWidget *parent) : QDialog(parent)
{ {

View file

@ -1,7 +1,8 @@
#include "game.h" #include "game.h"
#include "../tabs/tab_game.h" #include "../interface/widgets/tabs/tab_game.h"
#include "pb/event_game_joined.pb.h"
#include <libcockatrice/protocol/pb/event_game_joined.pb.h>
Game::Game(TabGame *_tab, Game::Game(TabGame *_tab,
QList<AbstractClient *> &_clients, QList<AbstractClient *> &_clients,

View file

@ -1,33 +1,34 @@
#include "game_event_handler.h" #include "game_event_handler.h"
#include "../server/abstract_client.h" #include "../interface/widgets/tabs/tab_game.h"
#include "../server/pending_command.h"
#include "../tabs/tab_game.h"
#include "abstract_game.h" #include "abstract_game.h"
#include "get_pb_extension.h"
#include "log/message_log_widget.h" #include "log/message_log_widget.h"
#include "pb/command_concede.pb.h"
#include "pb/command_delete_arrow.pb.h" #include <libcockatrice/network/client/abstract/abstract_client.h>
#include "pb/command_game_say.pb.h" #include <libcockatrice/protocol/get_pb_extension.h>
#include "pb/command_leave_game.pb.h" #include <libcockatrice/protocol/pb/command_concede.pb.h>
#include "pb/command_next_turn.pb.h" #include <libcockatrice/protocol/pb/command_delete_arrow.pb.h>
#include "pb/command_reverse_turn.pb.h" #include <libcockatrice/protocol/pb/command_game_say.pb.h>
#include "pb/command_set_active_phase.pb.h" #include <libcockatrice/protocol/pb/command_leave_game.pb.h>
#include "pb/context_connection_state_changed.pb.h" #include <libcockatrice/protocol/pb/command_next_turn.pb.h>
#include "pb/context_deck_select.pb.h" #include <libcockatrice/protocol/pb/command_reverse_turn.pb.h>
#include "pb/context_ping_changed.pb.h" #include <libcockatrice/protocol/pb/command_set_active_phase.pb.h>
#include "pb/event_game_closed.pb.h" #include <libcockatrice/protocol/pb/context_connection_state_changed.pb.h>
#include "pb/event_game_host_changed.pb.h" #include <libcockatrice/protocol/pb/context_deck_select.pb.h>
#include "pb/event_game_say.pb.h" #include <libcockatrice/protocol/pb/context_ping_changed.pb.h>
#include "pb/event_game_state_changed.pb.h" #include <libcockatrice/protocol/pb/event_game_closed.pb.h>
#include "pb/event_join.pb.h" #include <libcockatrice/protocol/pb/event_game_host_changed.pb.h>
#include "pb/event_kicked.pb.h" #include <libcockatrice/protocol/pb/event_game_say.pb.h>
#include "pb/event_leave.pb.h" #include <libcockatrice/protocol/pb/event_game_state_changed.pb.h>
#include "pb/event_player_properties_changed.pb.h" #include <libcockatrice/protocol/pb/event_join.pb.h>
#include "pb/event_reverse_turn.pb.h" #include <libcockatrice/protocol/pb/event_kicked.pb.h>
#include "pb/event_set_active_phase.pb.h" #include <libcockatrice/protocol/pb/event_leave.pb.h>
#include "pb/event_set_active_player.pb.h" #include <libcockatrice/protocol/pb/event_player_properties_changed.pb.h>
#include "pb/game_event_container.pb.h" #include <libcockatrice/protocol/pb/event_reverse_turn.pb.h>
#include <libcockatrice/protocol/pb/event_set_active_phase.pb.h>
#include <libcockatrice/protocol/pb/event_set_active_player.pb.h>
#include <libcockatrice/protocol/pb/game_event_container.pb.h>
#include <libcockatrice/protocol/pending_command.h>
GameEventHandler::GameEventHandler(AbstractGame *_game) : QObject(_game), game(_game) GameEventHandler::GameEventHandler(AbstractGame *_game) : QObject(_game), game(_game)
{ {

View file

@ -7,12 +7,12 @@
#ifndef COCKATRICE_GAME_EVENT_HANDLER_H #ifndef COCKATRICE_GAME_EVENT_HANDLER_H
#define COCKATRICE_GAME_EVENT_HANDLER_H #define COCKATRICE_GAME_EVENT_HANDLER_H
#include "pb/event_leave.pb.h"
#include "pb/serverinfo_player.pb.h"
#include "player/event_processing_options.h" #include "player/event_processing_options.h"
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QObject> #include <QObject>
#include <libcockatrice/protocol/pb/event_leave.pb.h>
#include <libcockatrice/protocol/pb/serverinfo_player.pb.h>
class AbstractClient; class AbstractClient;
class Response; class Response;

View file

@ -7,10 +7,9 @@
#ifndef GAME_META_INFO_H #ifndef GAME_META_INFO_H
#define GAME_META_INFO_H #define GAME_META_INFO_H
#include "pb/serverinfo_game.pb.h"
#include <QMap> #include <QMap>
#include <QObject> #include <QObject>
#include <libcockatrice/protocol/pb/serverinfo_game.pb.h>
// Translation layer class to expose protobuf safely and hook it up to Qt Signals. // Translation layer class to expose protobuf safely and hook it up to Qt Signals.
// This class de-couples the domain object (i.e. the GameMetaInfo) from the network object. // This class de-couples the domain object (i.e. the GameMetaInfo) from the network object.

View file

@ -1,6 +1,5 @@
#include "game_scene.h" #include "game_scene.h"
#include "../settings/cache_settings.h"
#include "board/card_item.h" #include "board/card_item.h"
#include "phases_toolbar.h" #include "phases_toolbar.h"
#include "player/player.h" #include "player/player.h"
@ -15,6 +14,7 @@
#include <QGraphicsView> #include <QGraphicsView>
#include <QSet> #include <QSet>
#include <QtMath> #include <QtMath>
#include <libcockatrice/settings/cache_settings.h>
#include <numeric> #include <numeric>
/** /**

View file

@ -7,11 +7,10 @@
#ifndef COCKATRICE_GAME_STATE_H #ifndef COCKATRICE_GAME_STATE_H
#define COCKATRICE_GAME_STATE_H #define COCKATRICE_GAME_STATE_H
#include "../server/abstract_client.h"
#include "pb/serverinfo_game.pb.h"
#include <QObject> #include <QObject>
#include <QTimer> #include <QTimer>
#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

@ -1,11 +1,11 @@
#include "game_view.h" #include "game_view.h"
#include "../settings/cache_settings.h"
#include "game_scene.h" #include "game_scene.h"
#include <QAction> #include <QAction>
#include <QResizeEvent> #include <QResizeEvent>
#include <QRubberBand> #include <QRubberBand>
#include <libcockatrice/settings/cache_settings.h>
GameView::GameView(GameScene *scene, QWidget *parent) : QGraphicsView(scene, parent), rubberBand(0) GameView::GameView(GameScene *scene, QWidget *parent) : QGraphicsView(scene, parent), rubberBand(0)
{ {

View file

@ -1,17 +1,17 @@
#include "message_log_widget.h" #include "message_log_widget.h"
#include "../../client/sound_engine.h" #include "../../client/sound_engine.h"
#include "../../settings/card_counter_settings.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../../tabs/tab_game.h"
#include "../board/card_item.h" #include "../board/card_item.h"
#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 "../zones/card_zone.h"
#include "pb/context_move_card.pb.h"
#include "pb/context_mulligan.pb.h"
#include "pb/serverinfo_user.pb.h"
#include <libcockatrice/protocol/pb/context_move_card.pb.h>
#include <libcockatrice/protocol/pb/context_mulligan.pb.h>
#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
#include <libcockatrice/settings/card_counter_settings.h>
#include <utility> #include <utility>
static const QString TABLE_ZONE_NAME = "table"; static const QString TABLE_ZONE_NAME = "table";

View file

@ -8,9 +8,10 @@
#define MESSAGELOGWIDGET_H #define MESSAGELOGWIDGET_H
#include "../../client/translation.h" #include "../../client/translation.h"
#include "../../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 "user_level.h"
#include <libcockatrice/network/server/remote/user_level.h>
class AbstractGame; class AbstractGame;
class CardItem; class CardItem;

View file

@ -1,16 +1,16 @@
#include "phases_toolbar.h" #include "phases_toolbar.h"
#include "../interface/pixel_map_generator.h" #include "../interface/pixel_map_generator.h"
#include "pb/command_draw_cards.pb.h"
#include "pb/command_next_turn.pb.h"
#include "pb/command_set_active_phase.pb.h"
#include "pb/command_set_card_attr.pb.h"
#include <QAction> #include <QAction>
#include <QDebug> #include <QDebug>
#include <QPainter> #include <QPainter>
#include <QPen> #include <QPen>
#include <QTimer> #include <QTimer>
#include <libcockatrice/protocol/pb/command_draw_cards.pb.h>
#include <libcockatrice/protocol/pb/command_next_turn.pb.h>
#include <libcockatrice/protocol/pb/command_set_active_phase.pb.h>
#include <libcockatrice/protocol/pb/command_set_card_attr.pb.h>
PhaseButton::PhaseButton(const QString &_name, QGraphicsItem *parent, QAction *_doubleClickAction, bool _highlightable) PhaseButton::PhaseButton(const QString &_name, QGraphicsItem *parent, QAction *_doubleClickAction, bool _highlightable)
: QObject(), QGraphicsItem(parent), name(_name), active(false), highlightable(_highlightable), : QObject(), QGraphicsItem(parent), name(_name), active(false), highlightable(_highlightable),

View file

@ -1,9 +1,6 @@
#include "card_menu.h" #include "card_menu.h"
#include "../../../card/card_relation.h" #include "../../../interface/widgets/tabs/tab_game.h"
#include "../../../database/card_database_manager.h"
#include "../../../settings/card_counter_settings.h"
#include "../../../tabs/tab_game.h"
#include "../../board/card_item.h" #include "../../board/card_item.h"
#include "../../zones/logic/view_zone_logic.h" #include "../../zones/logic/view_zone_logic.h"
#include "../card_menu_action_type.h" #include "../card_menu_action_type.h"
@ -12,6 +9,10 @@
#include "move_menu.h" #include "move_menu.h"
#include "pt_menu.h" #include "pt_menu.h"
#include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/card/relation/card_relation.h>
#include <libcockatrice/settings/card_counter_settings.h>
CardMenu::CardMenu(Player *_player, const CardItem *_card, bool _shortcutsActive) CardMenu::CardMenu(Player *_player, const CardItem *_card, bool _shortcutsActive)
: player(_player), card(_card), shortcutsActive(_shortcutsActive) : player(_player), card(_card), shortcutsActive(_shortcutsActive)
{ {
@ -488,12 +489,4 @@ void CardMenu::setShortcutsActive()
aRemoveCounter[i]->setShortcuts(shortcuts.getShortcut("Player/aRC" + colorWords[i])); aRemoveCounter[i]->setShortcuts(shortcuts.getShortcut("Player/aRC" + colorWords[i]));
aSetCounter[i]->setShortcuts(shortcuts.getShortcut("Player/aSC" + colorWords[i])); aSetCounter[i]->setShortcuts(shortcuts.getShortcut("Player/aSC" + colorWords[i]));
} }
// Don't enable always-active shortcuts in local games, since it causes keyboard shortcuts to work inconsistently
// when there are more than 1 player.
if (!player->getGame()->getGameState()->getIsLocalGame()) {
// unattach action is only active in card menu if the active card is attached.
// make unattach shortcut always active so that it consistently works when multiple cards are selected.
player->getGame()->getTab()->addAction(aUnattach);
}
} }

View file

@ -7,7 +7,7 @@
#ifndef COCKATRICE_GRAVE_MENU_H #ifndef COCKATRICE_GRAVE_MENU_H
#define COCKATRICE_GRAVE_MENU_H #define COCKATRICE_GRAVE_MENU_H
#include "../../../interface/tearoff_menu.h" #include "../../../interface/widgets/menus/tearoff_menu.h"
#include <QAction> #include <QAction>
#include <QMenu> #include <QMenu>

View file

@ -1,7 +1,5 @@
#include "hand_menu.h" #include "hand_menu.h"
#include "../../../settings/cache_settings.h"
#include "../../../settings/shortcuts_settings.h"
#include "../../abstract_game.h" #include "../../abstract_game.h"
#include "../../zones/hand_zone.h" #include "../../zones/hand_zone.h"
#include "../player.h" #include "../player.h"
@ -9,6 +7,8 @@
#include <QAction> #include <QAction>
#include <QMenu> #include <QMenu>
#include <libcockatrice/settings/cache_settings.h>
#include <libcockatrice/settings/shortcuts_settings.h>
HandMenu::HandMenu(Player *_player, PlayerActions *actions, QWidget *parent) : TearOffMenu(parent), player(_player) HandMenu::HandMenu(Player *_player, PlayerActions *actions, QWidget *parent) : TearOffMenu(parent), player(_player)
{ {

View file

@ -7,7 +7,7 @@
#ifndef COCKATRICE_HAND_MENU_H #ifndef COCKATRICE_HAND_MENU_H
#define COCKATRICE_HAND_MENU_H #define COCKATRICE_HAND_MENU_H
#include "../../../interface/tearoff_menu.h" #include "../../../interface/widgets/menus/tearoff_menu.h"
#include <QAction> #include <QAction>
#include <QMenu> #include <QMenu>

View file

@ -1,14 +1,14 @@
#include "library_menu.h" #include "library_menu.h"
#include "../../../settings/cache_settings.h" #include "../../../interface/widgets/tabs/tab_game.h"
#include "../../../settings/shortcuts_settings.h"
#include "../../../tabs/tab_game.h"
#include "../../abstract_game.h" #include "../../abstract_game.h"
#include "../player.h" #include "../player.h"
#include "../player_actions.h" #include "../player_actions.h"
#include <QAction> #include <QAction>
#include <QMenu> #include <QMenu>
#include <libcockatrice/settings/cache_settings.h>
#include <libcockatrice/settings/shortcuts_settings.h>
LibraryMenu::LibraryMenu(Player *_player, QWidget *parent) : TearOffMenu(parent), player(_player) LibraryMenu::LibraryMenu(Player *_player, QWidget *parent) : TearOffMenu(parent), player(_player)
{ {

View file

@ -7,7 +7,7 @@
#ifndef COCKATRICE_LIBRARY_MENU_H #ifndef COCKATRICE_LIBRARY_MENU_H
#define COCKATRICE_LIBRARY_MENU_H #define COCKATRICE_LIBRARY_MENU_H
#include "../../../interface/tearoff_menu.h" #include "../../../interface/widgets/menus/tearoff_menu.h"
#include <QAction> #include <QAction>
#include <QMenu> #include <QMenu>

View file

@ -1,8 +1,6 @@
#include "player_menu.h" #include "player_menu.h"
#include "../../../common/pb/command_reveal_cards.pb.h" #include "../../../interface/widgets/tabs/tab_game.h"
#include "../../../database/card_database_manager.h"
#include "../../../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 "../card_menu_action_type.h"
@ -10,6 +8,9 @@
#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>
PlayerMenu::PlayerMenu(Player *_player) : player(_player) PlayerMenu::PlayerMenu(Player *_player) : player(_player)
{ {
playerMenu = new TearOffMenu(); playerMenu = new TearOffMenu();

View file

@ -7,7 +7,7 @@
#ifndef COCKATRICE_PLAYER_MENU_H #ifndef COCKATRICE_PLAYER_MENU_H
#define COCKATRICE_PLAYER_MENU_H #define COCKATRICE_PLAYER_MENU_H
#include "../../../interface/tearoff_menu.h" #include "../../../interface/widgets/menus/tearoff_menu.h"
#include "../player.h" #include "../player.h"
#include "custom_zone_menu.h" #include "custom_zone_menu.h"
#include "grave_menu.h" #include "grave_menu.h"

View file

@ -7,7 +7,7 @@
#ifndef COCKATRICE_RFG_MENU_H #ifndef COCKATRICE_RFG_MENU_H
#define COCKATRICE_RFG_MENU_H #define COCKATRICE_RFG_MENU_H
#include "../../../interface/tearoff_menu.h" #include "../../../interface/widgets/menus/tearoff_menu.h"
#include <QAction> #include <QAction>
#include <QMenu> #include <QMenu>

View file

@ -1,9 +1,10 @@
#include "say_menu.h" #include "say_menu.h"
#include "../../../settings/cache_settings.h"
#include "../player.h" #include "../player.h"
#include "../player_actions.h" #include "../player_actions.h"
#include <libcockatrice/settings/cache_settings.h>
SayMenu::SayMenu(Player *_player) : player(_player) SayMenu::SayMenu(Player *_player) : player(_player)
{ {
connect(&SettingsCache::instance().messages(), &MessageSettings::messageMacrosChanged, this, &SayMenu::initSayMenu); connect(&SettingsCache::instance().messages(), &MessageSettings::messageMacrosChanged, this, &SayMenu::initSayMenu);

View file

@ -1,7 +1,7 @@
#include "player.h" #include "player.h"
#include "../../interface/theme_manager.h" #include "../../interface/theme_manager.h"
#include "../../tabs/tab_game.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../board/arrow_item.h" #include "../board/arrow_item.h"
#include "../board/card_item.h" #include "../board/card_item.h"
#include "../board/card_list.h" #include "../board/card_list.h"
@ -12,15 +12,6 @@
#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 "../zones/view_zone.h"
#include "color.h"
#include "pb/command_attach_card.pb.h"
#include "pb/command_set_card_counter.pb.h"
#include "pb/event_create_arrow.pb.h"
#include "pb/event_create_counter.pb.h"
#include "pb/event_draw_cards.pb.h"
#include "pb/serverinfo_player.pb.h"
#include "pb/serverinfo_user.pb.h"
#include "pb/serverinfo_zone.pb.h"
#include "player_target.h" #include "player_target.h"
#include <QDebug> #include <QDebug>
@ -28,6 +19,15 @@
#include <QMetaType> #include <QMetaType>
#include <QPainter> #include <QPainter>
#include <QtConcurrent> #include <QtConcurrent>
#include <libcockatrice/protocol/pb/command_attach_card.pb.h>
#include <libcockatrice/protocol/pb/command_set_card_counter.pb.h>
#include <libcockatrice/protocol/pb/event_create_arrow.pb.h>
#include <libcockatrice/protocol/pb/event_create_counter.pb.h>
#include <libcockatrice/protocol/pb/event_draw_cards.pb.h>
#include <libcockatrice/protocol/pb/serverinfo_player.pb.h>
#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
#include <libcockatrice/protocol/pb/serverinfo_zone.pb.h>
#include <libcockatrice/utility/color.h>
Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, AbstractGame *_parent) Player::Player(const ServerInfo_User &info, int _id, bool _local, bool _judge, AbstractGame *_parent)
: QObject(_parent), game(_parent), playerInfo(new PlayerInfo(info, _id, _local, _judge)), : QObject(_parent), game(_parent), playerInfo(new PlayerInfo(info, _id, _local, _judge)),

View file

@ -7,14 +7,11 @@
#ifndef PLAYER_H #ifndef PLAYER_H
#define PLAYER_H #define PLAYER_H
#include "../../card/card_info.h"
#include "../../filters/filter_string.h" #include "../../filters/filter_string.h"
#include "../../interface/tearoff_menu.h" #include "../../interface/widgets/menus/tearoff_menu.h"
#include "../board/abstract_graphics_item.h" #include "../board/abstract_graphics_item.h"
#include "../dialogs/dlg_create_token.h" #include "../dialogs/dlg_create_token.h"
#include "menu/player_menu.h" #include "menu/player_menu.h"
#include "pb/card_attributes.pb.h"
#include "pb/game_event.pb.h"
#include "player_actions.h" #include "player_actions.h"
#include "player_area.h" #include "player_area.h"
#include "player_event_handler.h" #include "player_event_handler.h"
@ -26,6 +23,9 @@
#include <QMap> #include <QMap>
#include <QPoint> #include <QPoint>
#include <QTimer> #include <QTimer>
#include <libcockatrice/card/card_info.h>
#include <libcockatrice/protocol/pb/card_attributes.pb.h>
#include <libcockatrice/protocol/pb/game_event.pb.h>
inline Q_LOGGING_CATEGORY(PlayerLog, "player"); inline Q_LOGGING_CATEGORY(PlayerLog, "player");

View file

@ -1,31 +1,32 @@
#include "player_actions.h" #include "player_actions.h"
#include "../../../common/pb/context_move_card.pb.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../../card/card_relation.h" #include "../../interface/widgets/utility/get_text_with_max.h"
#include "../../client/get_text_with_max.h"
#include "../../database/card_database_manager.h"
#include "../../tabs/tab_game.h"
#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/logic/view_zone_logic.h" #include "../zones/logic/view_zone_logic.h"
#include "card_menu_action_type.h" #include "card_menu_action_type.h"
#include "pb/command_attach_card.pb.h"
#include "pb/command_change_zone_properties.pb.h" #include <libcockatrice/card/database/card_database_manager.h>
#include "pb/command_concede.pb.h" #include <libcockatrice/card/relation/card_relation.h>
#include "pb/command_create_token.pb.h" #include <libcockatrice/protocol/pb/command_attach_card.pb.h>
#include "pb/command_draw_cards.pb.h" #include <libcockatrice/protocol/pb/command_change_zone_properties.pb.h>
#include "pb/command_flip_card.pb.h" #include <libcockatrice/protocol/pb/command_concede.pb.h>
#include "pb/command_game_say.pb.h" #include <libcockatrice/protocol/pb/command_create_token.pb.h>
#include "pb/command_move_card.pb.h" #include <libcockatrice/protocol/pb/command_draw_cards.pb.h>
#include "pb/command_mulligan.pb.h" #include <libcockatrice/protocol/pb/command_flip_card.pb.h>
#include "pb/command_reveal_cards.pb.h" #include <libcockatrice/protocol/pb/command_game_say.pb.h>
#include "pb/command_roll_die.pb.h" #include <libcockatrice/protocol/pb/command_move_card.pb.h>
#include "pb/command_set_card_attr.pb.h" #include <libcockatrice/protocol/pb/command_mulligan.pb.h>
#include "pb/command_set_card_counter.pb.h" #include <libcockatrice/protocol/pb/command_reveal_cards.pb.h>
#include "pb/command_shuffle.pb.h" #include <libcockatrice/protocol/pb/command_roll_die.pb.h>
#include "pb/command_undo_draw.pb.h" #include <libcockatrice/protocol/pb/command_set_card_attr.pb.h>
#include "trice_limits.h" #include <libcockatrice/protocol/pb/command_set_card_counter.pb.h>
#include <libcockatrice/protocol/pb/command_shuffle.pb.h>
#include <libcockatrice/protocol/pb/command_undo_draw.pb.h>
#include <libcockatrice/protocol/pb/context_move_card.pb.h>
#include <libcockatrice/utility/trice_limits.h>
// milliseconds in between triggers of the move top cards until action // milliseconds in between triggers of the move top cards until action
static constexpr int MOVE_TOP_CARD_UNTIL_INTERVAL = 100; static constexpr int MOVE_TOP_CARD_UNTIL_INTERVAL = 100;

View file

@ -7,12 +7,13 @@
#ifndef COCKATRICE_PLAYER_ACTIONS_H #ifndef COCKATRICE_PLAYER_ACTIONS_H
#define COCKATRICE_PLAYER_ACTIONS_H #define COCKATRICE_PLAYER_ACTIONS_H
#include "../../card/card_relation_type.h"
#include "event_processing_options.h" #include "event_processing_options.h"
#include "player.h" #include "player.h"
#include <QMenu> #include <QMenu>
#include <QObject> #include <QObject>
#include <libcockatrice/card/relation/card_relation_type.h>
#include <libcockatrice/protocol/pb/card_attributes.pb.h>
namespace google namespace google
{ {

View file

@ -1,34 +1,35 @@
#include "player_event_handler.h" #include "player_event_handler.h"
#include "../../tabs/tab_game.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../board/arrow_item.h" #include "../board/arrow_item.h"
#include "../board/card_item.h" #include "../board/card_item.h"
#include "../board/card_list.h" #include "../board/card_list.h"
#include "../zones/view_zone.h" #include "../zones/view_zone.h"
#include "pb/command_set_card_attr.pb.h"
#include "pb/context_move_card.pb.h"
#include "pb/context_undo_draw.pb.h"
#include "pb/event_attach_card.pb.h"
#include "pb/event_change_zone_properties.pb.h"
#include "pb/event_create_arrow.pb.h"
#include "pb/event_create_counter.pb.h"
#include "pb/event_create_token.pb.h"
#include "pb/event_del_counter.pb.h"
#include "pb/event_delete_arrow.pb.h"
#include "pb/event_destroy_card.pb.h"
#include "pb/event_draw_cards.pb.h"
#include "pb/event_dump_zone.pb.h"
#include "pb/event_flip_card.pb.h"
#include "pb/event_game_say.pb.h"
#include "pb/event_move_card.pb.h"
#include "pb/event_reveal_cards.pb.h"
#include "pb/event_roll_die.pb.h"
#include "pb/event_set_card_attr.pb.h"
#include "pb/event_set_card_counter.pb.h"
#include "pb/event_set_counter.pb.h"
#include "pb/event_shuffle.pb.h"
#include "player.h" #include "player.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_undo_draw.pb.h>
#include <libcockatrice/protocol/pb/event_attach_card.pb.h>
#include <libcockatrice/protocol/pb/event_change_zone_properties.pb.h>
#include <libcockatrice/protocol/pb/event_create_arrow.pb.h>
#include <libcockatrice/protocol/pb/event_create_counter.pb.h>
#include <libcockatrice/protocol/pb/event_create_token.pb.h>
#include <libcockatrice/protocol/pb/event_del_counter.pb.h>
#include <libcockatrice/protocol/pb/event_delete_arrow.pb.h>
#include <libcockatrice/protocol/pb/event_destroy_card.pb.h>
#include <libcockatrice/protocol/pb/event_draw_cards.pb.h>
#include <libcockatrice/protocol/pb/event_dump_zone.pb.h>
#include <libcockatrice/protocol/pb/event_flip_card.pb.h>
#include <libcockatrice/protocol/pb/event_game_say.pb.h>
#include <libcockatrice/protocol/pb/event_move_card.pb.h>
#include <libcockatrice/protocol/pb/event_reveal_cards.pb.h>
#include <libcockatrice/protocol/pb/event_roll_die.pb.h>
#include <libcockatrice/protocol/pb/event_set_card_attr.pb.h>
#include <libcockatrice/protocol/pb/event_set_card_counter.pb.h>
#include <libcockatrice/protocol/pb/event_set_counter.pb.h>
#include <libcockatrice/protocol/pb/event_shuffle.pb.h>
PlayerEventHandler::PlayerEventHandler(Player *_player) : player(_player) PlayerEventHandler::PlayerEventHandler(Player *_player) : player(_player)
{ {
} }

View file

@ -9,8 +9,8 @@
#include "event_processing_options.h" #include "event_processing_options.h"
#include <QObject> #include <QObject>
#include <pb/game_event.pb.h> #include <libcockatrice/protocol/pb/game_event.pb.h>
#include <pb/game_event_context.pb.h> #include <libcockatrice/protocol/pb/game_event_context.pb.h>
class CardItem; class CardItem;
class CardZoneLogic; class CardZoneLogic;

View file

@ -1,6 +1,6 @@
#include "player_graphics_item.h" #include "player_graphics_item.h"
#include "../../tabs/tab_game.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../hand_counter.h" #include "../hand_counter.h"
PlayerGraphicsItem::PlayerGraphicsItem(Player *_player) : player(_player) PlayerGraphicsItem::PlayerGraphicsItem(Player *_player) : player(_player)

View file

@ -7,8 +7,6 @@
#ifndef COCKATRICE_PLAYER_INFO_H #ifndef COCKATRICE_PLAYER_INFO_H
#define COCKATRICE_PLAYER_INFO_H #define COCKATRICE_PLAYER_INFO_H
#include "../../../common/pb/serverinfo_user.pb.h"
#include "../../deck/deck_loader.h"
#include "../zones/hand_zone.h" #include "../zones/hand_zone.h"
#include "../zones/pile_zone.h" #include "../zones/pile_zone.h"
#include "../zones/stack_zone.h" #include "../zones/stack_zone.h"
@ -16,6 +14,8 @@
#include "player_target.h" #include "player_target.h"
#include <QObject> #include <QObject>
#include <libcockatrice/deck_list/deck_loader.h>
#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
class PlayerInfo : public QObject class PlayerInfo : public QObject
{ {

View file

@ -1,21 +1,21 @@
#include "player_list_widget.h" #include "player_list_widget.h"
#include "../../interface/pixel_map_generator.h" #include "../../interface/pixel_map_generator.h"
#include "../../server/abstract_client.h" #include "../../interface/widgets/server/user/user_context_menu.h"
#include "../../server/user/user_context_menu.h" #include "../../interface/widgets/server/user/user_list_manager.h"
#include "../../server/user/user_list_manager.h" #include "../../interface/widgets/server/user/user_list_widget.h"
#include "../../server/user/user_list_widget.h" #include "../../interface/widgets/tabs/tab_account.h"
#include "../../tabs/tab_account.h" #include "../../interface/widgets/tabs/tab_game.h"
#include "../../tabs/tab_game.h" #include "../../interface/widgets/tabs/tab_supervisor.h"
#include "../../tabs/tab_supervisor.h"
#include "pb/command_kick_from_game.pb.h"
#include "pb/serverinfo_playerproperties.pb.h"
#include "pb/session_commands.pb.h"
#include <QAction> #include <QAction>
#include <QHeaderView> #include <QHeaderView>
#include <QMenu> #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/serverinfo_playerproperties.pb.h>
#include <libcockatrice/protocol/pb/session_commands.pb.h>
PlayerListItemDelegate::PlayerListItemDelegate(QObject *const parent) : QStyledItemDelegate(parent) PlayerListItemDelegate::PlayerListItemDelegate(QObject *const parent) : QStyledItemDelegate(parent)
{ {

View file

@ -7,10 +7,9 @@
#ifndef COCKATRICE_PLAYER_MANAGER_H #ifndef COCKATRICE_PLAYER_MANAGER_H
#define COCKATRICE_PLAYER_MANAGER_H #define COCKATRICE_PLAYER_MANAGER_H
#include "pb/serverinfo_playerproperties.pb.h"
#include <QMap> #include <QMap>
#include <QObject> #include <QObject>
#include <libcockatrice/protocol/pb/serverinfo_playerproperties.pb.h>
class AbstractGame; class AbstractGame;
class Player; class Player;

View file

@ -1,13 +1,13 @@
#include "player_target.h" #include "player_target.h"
#include "../../interface/pixel_map_generator.h" #include "../../interface/pixel_map_generator.h"
#include "pb/serverinfo_user.pb.h"
#include "player.h" #include "player.h"
#include <QDebug> #include <QDebug>
#include <QPainter> #include <QPainter>
#include <QPixmapCache> #include <QPixmapCache>
#include <QtMath> #include <QtMath>
#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
PlayerCounter::PlayerCounter(Player *_player, int _id, const QString &_name, int _value, QGraphicsItem *parent) PlayerCounter::PlayerCounter(Player *_player, int _id, const QString &_name, int _value, QGraphicsItem *parent)
: AbstractCounter(_player, _id, _name, false, _value, false, parent) : AbstractCounter(_player, _id, _name, false, _value, false, parent)

View file

@ -1,6 +1,6 @@
#include "replay.h" #include "replay.h"
#include "../tabs/tab_game.h" #include "../interface/widgets/tabs/tab_game.h"
Replay::Replay(TabGame *_tab, GameReplay *_replay) : AbstractGame(_tab) Replay::Replay(TabGame *_tab, GameReplay *_replay) : AbstractGame(_tab)
{ {

View file

@ -1,13 +1,13 @@
#include "hand_zone.h" #include "hand_zone.h"
#include "../../interface/theme_manager.h" #include "../../interface/theme_manager.h"
#include "../../settings/cache_settings.h"
#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 "pb/command_move_card.pb.h"
#include <QPainter> #include <QPainter>
#include <libcockatrice/protocol/pb/command_move_card.pb.h>
#include <libcockatrice/settings/cache_settings.h>
HandZone::HandZone(HandZoneLogic *_logic, int _zoneHeight, QGraphicsItem *parent) HandZone::HandZone(HandZoneLogic *_logic, int _zoneHeight, QGraphicsItem *parent)
: SelectZone(_logic, parent), zoneHeight(_zoneHeight) : SelectZone(_logic, parent), zoneHeight(_zoneHeight)

View file

@ -1,16 +1,16 @@
#include "card_zone_logic.h" #include "card_zone_logic.h"
#include "../../../database/card_database_manager.h"
#include "../../board/card_item.h" #include "../../board/card_item.h"
#include "../../player/player.h" #include "../../player/player.h"
#include "../pile_zone.h" #include "../pile_zone.h"
#include "../view_zone.h" #include "../view_zone.h"
#include "pb/command_move_card.pb.h"
#include "pb/serverinfo_user.pb.h"
#include "view_zone_logic.h" #include "view_zone_logic.h"
#include <QAction> #include <QAction>
#include <QDebug> #include <QDebug>
#include <libcockatrice/card/database/card_database_manager.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

View file

@ -1,8 +1,9 @@
#include "view_zone_logic.h" #include "view_zone_logic.h"
#include "../../../settings/cache_settings.h"
#include "../../board/card_item.h" #include "../../board/card_item.h"
#include <libcockatrice/settings/cache_settings.h>
/** /**
* @param _player the player that the cards are revealed to. * @param _player the player that the cards are revealed to.
* @param _origZone the zone the cards were revealed from. * @param _origZone the zone the cards were revealed from.

View file

@ -4,12 +4,12 @@
#include "../board/card_item.h" #include "../board/card_item.h"
#include "../player/player.h" #include "../player/player.h"
#include "logic/pile_zone_logic.h" #include "logic/pile_zone_logic.h"
#include "pb/command_move_card.pb.h"
#include "view_zone.h" #include "view_zone.h"
#include <QApplication> #include <QApplication>
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <QPainter> #include <QPainter>
#include <libcockatrice/protocol/pb/command_move_card.pb.h>
PileZone::PileZone(PileZoneLogic *_logic, QGraphicsItem *parent) : CardZone(_logic, parent) PileZone::PileZone(PileZoneLogic *_logic, QGraphicsItem *parent) : CardZone(_logic, parent)
{ {

View file

@ -1,11 +1,11 @@
#include "select_zone.h" #include "select_zone.h"
#include "../../settings/cache_settings.h"
#include "../board/card_item.h" #include "../board/card_item.h"
#include "../game_scene.h" #include "../game_scene.h"
#include <QDebug> #include <QDebug>
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <libcockatrice/settings/cache_settings.h>
qreal divideCardSpaceInZone(qreal index, int cardCount, qreal totalHeight, qreal cardHeight, bool reverse) qreal divideCardSpaceInZone(qreal index, int cardCount, qreal totalHeight, qreal cardHeight, bool reverse)
{ {

View file

@ -1,16 +1,16 @@
#include "stack_zone.h" #include "stack_zone.h"
#include "../../interface/theme_manager.h" #include "../../interface/theme_manager.h"
#include "../../settings/cache_settings.h"
#include "../board/arrow_item.h" #include "../board/arrow_item.h"
#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 "logic/stack_zone_logic.h" #include "logic/stack_zone_logic.h"
#include "pb/command_move_card.pb.h"
#include <QPainter> #include <QPainter>
#include <QSet> #include <QSet>
#include <libcockatrice/protocol/pb/command_move_card.pb.h>
#include <libcockatrice/settings/cache_settings.h>
StackZone::StackZone(StackZoneLogic *_logic, int _zoneHeight, QGraphicsItem *parent) StackZone::StackZone(StackZoneLogic *_logic, int _zoneHeight, QGraphicsItem *parent)
: SelectZone(_logic, parent), zoneHeight(_zoneHeight) : SelectZone(_logic, parent), zoneHeight(_zoneHeight)

View file

@ -1,19 +1,19 @@
#include "table_zone.h" #include "table_zone.h"
#include "../../card/card_info.h"
#include "../../interface/theme_manager.h" #include "../../interface/theme_manager.h"
#include "../../settings/cache_settings.h"
#include "../board/arrow_item.h" #include "../board/arrow_item.h"
#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 "logic/table_zone_logic.h" #include "logic/table_zone_logic.h"
#include "pb/command_move_card.pb.h"
#include "pb/command_set_card_attr.pb.h"
#include <QGraphicsScene> #include <QGraphicsScene>
#include <QPainter> #include <QPainter>
#include <QSet> #include <QSet>
#include <libcockatrice/card/card_info.h>
#include <libcockatrice/protocol/pb/command_move_card.pb.h>
#include <libcockatrice/protocol/pb/command_set_card_attr.pb.h>
#include <libcockatrice/settings/cache_settings.h>
const QColor TableZone::BACKGROUND_COLOR = QColor(100, 100, 100); const QColor TableZone::BACKGROUND_COLOR = QColor(100, 100, 100);
const QColor TableZone::FADE_MASK = QColor(0, 0, 0, 80); const QColor TableZone::FADE_MASK = QColor(0, 0, 0, 80);

View file

@ -1,21 +1,21 @@
#include "view_zone.h" #include "view_zone.h"
#include "../../card/card_info.h"
#include "../../server/pending_command.h"
#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 "logic/view_zone_logic.h" #include "logic/view_zone_logic.h"
#include "pb/command_dump_zone.pb.h"
#include "pb/command_move_card.pb.h"
#include "pb/response_dump_zone.pb.h"
#include "pb/serverinfo_card.pb.h"
#include <QBrush> #include <QBrush>
#include <QDebug> #include <QDebug>
#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_move_card.pb.h>
#include <libcockatrice/protocol/pb/response_dump_zone.pb.h>
#include <libcockatrice/protocol/pb/serverinfo_card.pb.h>
#include <libcockatrice/protocol/pending_command.h>
/** /**
* @param parent the parent QGraphicsWidget containing the reveal zone * @param parent the parent QGraphicsWidget containing the reveal zone

View file

@ -13,7 +13,7 @@
#include <QGraphicsLayoutItem> #include <QGraphicsLayoutItem>
#include <QLoggingCategory> #include <QLoggingCategory>
#include <pb/commands.pb.h> #include <libcockatrice/protocol/pb/commands.pb.h>
inline Q_LOGGING_CATEGORY(ViewZoneLog, "view_zone"); inline Q_LOGGING_CATEGORY(ViewZoneLog, "view_zone");

View file

@ -2,11 +2,9 @@
#include "../../filters/syntax_help.h" #include "../../filters/syntax_help.h"
#include "../../interface/pixel_map_generator.h" #include "../../interface/pixel_map_generator.h"
#include "../../settings/cache_settings.h"
#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 "pb/command_shuffle.pb.h"
#include "view_zone.h" #include "view_zone.h"
#include <QCheckBox> #include <QCheckBox>
@ -18,6 +16,8 @@
#include <QScrollBar> #include <QScrollBar>
#include <QStyleOption> #include <QStyleOption>
#include <QStyleOptionTitleBar> #include <QStyleOptionTitleBar>
#include <libcockatrice/protocol/pb/command_shuffle.pb.h>
#include <libcockatrice/settings/cache_settings.h>
/** /**
* @param _player the player the cards were revealed to. * @param _player the player the cards were revealed to.

View file

@ -7,7 +7,6 @@
#ifndef ZONEVIEWWIDGET_H #ifndef ZONEVIEWWIDGET_H
#define ZONEVIEWWIDGET_H #define ZONEVIEWWIDGET_H
#include "../../utility/macros.h"
#include "logic/card_zone_logic.h" #include "logic/card_zone_logic.h"
#include <QCheckBox> #include <QCheckBox>
@ -15,6 +14,7 @@
#include <QGraphicsProxyWidget> #include <QGraphicsProxyWidget>
#include <QGraphicsWidget> #include <QGraphicsWidget>
#include <QLineEdit> #include <QLineEdit>
#include <libcockatrice/utility/macros.h>
class QLabel; class QLabel;
class QPushButton; class QPushButton;

View file

@ -1,6 +1,4 @@
#include "picture_loader.h" #include "card_picture_loader.h"
#include "../settings/cache_settings.h"
#include <QApplication> #include <QApplication>
#include <QBuffer> #include <QBuffer>
@ -17,48 +15,51 @@
#include <QStatusBar> #include <QStatusBar>
#include <QThread> #include <QThread>
#include <algorithm> #include <algorithm>
#include <libcockatrice/settings/cache_settings.h>
#include <utility> #include <utility>
// never cache more than 300 cards at once for a single deck // never cache more than 300 cards at once for a single deck
#define CACHED_CARD_PER_DECK_MAX 300 #define CACHED_CARD_PER_DECK_MAX 300
PictureLoader::PictureLoader() : QObject(nullptr) CardPictureLoader::CardPictureLoader() : QObject(nullptr)
{ {
worker = new PictureLoaderWorker; worker = new CardPictureLoaderWorker;
connect(&SettingsCache::instance(), &SettingsCache::picsPathChanged, this, &PictureLoader::picsPathChanged); connect(&SettingsCache::instance(), &SettingsCache::picsPathChanged, this, &CardPictureLoader::picsPathChanged);
connect(&SettingsCache::instance(), &SettingsCache::picDownloadChanged, this, &PictureLoader::picDownloadChanged); connect(&SettingsCache::instance(), &SettingsCache::picDownloadChanged, this,
&CardPictureLoader::picDownloadChanged);
connect(worker, &PictureLoaderWorker::imageLoaded, this, &PictureLoader::imageLoaded); connect(worker, &CardPictureLoaderWorker::imageLoaded, this, &CardPictureLoader::imageLoaded);
statusBar = new PictureLoaderStatusBar(nullptr); statusBar = new CardPictureLoaderStatusBar(nullptr);
QMainWindow *mainWindow = qobject_cast<QMainWindow *>(QApplication::activeWindow()); QMainWindow *mainWindow = qobject_cast<QMainWindow *>(QApplication::activeWindow());
if (mainWindow) { if (mainWindow) {
mainWindow->statusBar()->addPermanentWidget(statusBar); mainWindow->statusBar()->addPermanentWidget(statusBar);
} }
connect(worker, &PictureLoaderWorker::imageRequestQueued, statusBar, &PictureLoaderStatusBar::addQueuedImageLoad); connect(worker, &CardPictureLoaderWorker::imageRequestQueued, statusBar,
connect(worker, &PictureLoaderWorker::imageRequestSucceeded, statusBar, &CardPictureLoaderStatusBar::addQueuedImageLoad);
&PictureLoaderStatusBar::addSuccessfulImageLoad); connect(worker, &CardPictureLoaderWorker::imageRequestSucceeded, statusBar,
&CardPictureLoaderStatusBar::addSuccessfulImageLoad);
} }
PictureLoader::~PictureLoader() CardPictureLoader::~CardPictureLoader()
{ {
worker->deleteLater(); worker->deleteLater();
} }
void PictureLoader::getCardBackPixmap(QPixmap &pixmap, QSize size) void CardPictureLoader::getCardBackPixmap(QPixmap &pixmap, QSize size)
{ {
QString backCacheKey = "_trice_card_back_" + QString::number(size.width()) + "x" + QString::number(size.height()); QString backCacheKey = "_trice_card_back_" + QString::number(size.width()) + "x" + QString::number(size.height());
if (!QPixmapCache::find(backCacheKey, &pixmap)) { if (!QPixmapCache::find(backCacheKey, &pixmap)) {
qCDebug(PictureLoaderLog) << "PictureLoader: cache miss for" << backCacheKey; qCDebug(CardPictureLoaderLog) << "PictureLoader: cache miss for" << backCacheKey;
QPixmap tmpPixmap("theme:cardback"); QPixmap tmpPixmap("theme:cardback");
if (tmpPixmap.isNull()) { if (tmpPixmap.isNull()) {
qCWarning(PictureLoaderLog) << "Failed to load 'theme:cardback'! Using fallback pixmap."; qCWarning(CardPictureLoaderLog) << "Failed to load 'theme:cardback'! Using fallback pixmap.";
tmpPixmap = QPixmap(size); tmpPixmap = QPixmap(size);
tmpPixmap.fill(Qt::gray); // Fallback to a gray pixmap tmpPixmap.fill(Qt::gray); // Fallback to a gray pixmap
} else { } else {
qCDebug(PictureLoaderLog) << "Successfully loaded 'theme:cardback'."; qCDebug(CardPictureLoaderLog) << "Successfully loaded 'theme:cardback'.";
} }
pixmap = tmpPixmap.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap = tmpPixmap.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
@ -66,20 +67,21 @@ void PictureLoader::getCardBackPixmap(QPixmap &pixmap, QSize size)
} }
} }
void PictureLoader::getCardBackLoadingInProgressPixmap(QPixmap &pixmap, QSize size) void CardPictureLoader::getCardBackLoadingInProgressPixmap(QPixmap &pixmap, QSize size)
{ {
QString backCacheKey = QString backCacheKey =
"_trice_card_back_inprogress_" + QString::number(size.width()) + "x" + QString::number(size.height()); "_trice_card_back_inprogress_" + QString::number(size.width()) + "x" + QString::number(size.height());
if (!QPixmapCache::find(backCacheKey, &pixmap)) { if (!QPixmapCache::find(backCacheKey, &pixmap)) {
qCDebug(PictureLoaderCardBackCacheFailLog) << "PictureLoader: cache miss for" << backCacheKey; qCDebug(CardPictureLoaderCardBackCacheFailLog) << "PictureLoader: cache miss for" << backCacheKey;
QPixmap tmpPixmap("theme:cardback"); QPixmap tmpPixmap("theme:cardback");
if (tmpPixmap.isNull()) { if (tmpPixmap.isNull()) {
qCWarning(PictureLoaderLog) << "Failed to load 'theme:cardback' for in-progress state! Using fallback."; qCWarning(CardPictureLoaderLog) << "Failed to load 'theme:cardback' for in-progress state! Using fallback.";
tmpPixmap = QPixmap(size); tmpPixmap = QPixmap(size);
tmpPixmap.fill(Qt::blue); // Fallback with blue color tmpPixmap.fill(Qt::blue); // Fallback with blue color
} else { } else {
qCDebug(PictureLoaderCardBackCacheFailLog) << "Successfully loaded 'theme:cardback' for in-progress state."; qCDebug(CardPictureLoaderCardBackCacheFailLog)
<< "Successfully loaded 'theme:cardback' for in-progress state.";
} }
pixmap = tmpPixmap.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap = tmpPixmap.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
@ -87,20 +89,20 @@ void PictureLoader::getCardBackLoadingInProgressPixmap(QPixmap &pixmap, QSize si
} }
} }
void PictureLoader::getCardBackLoadingFailedPixmap(QPixmap &pixmap, QSize size) void CardPictureLoader::getCardBackLoadingFailedPixmap(QPixmap &pixmap, QSize size)
{ {
QString backCacheKey = QString backCacheKey =
"_trice_card_back_failed_" + QString::number(size.width()) + "x" + QString::number(size.height()); "_trice_card_back_failed_" + QString::number(size.width()) + "x" + QString::number(size.height());
if (!QPixmapCache::find(backCacheKey, &pixmap)) { if (!QPixmapCache::find(backCacheKey, &pixmap)) {
qCDebug(PictureLoaderCardBackCacheFailLog) << "PictureLoader: cache miss for" << backCacheKey; qCDebug(CardPictureLoaderCardBackCacheFailLog) << "PictureLoader: cache miss for" << backCacheKey;
QPixmap tmpPixmap("theme:cardback"); QPixmap tmpPixmap("theme:cardback");
if (tmpPixmap.isNull()) { if (tmpPixmap.isNull()) {
qCWarning(PictureLoaderLog) << "Failed to load 'theme:cardback' for failed state! Using fallback."; qCWarning(CardPictureLoaderLog) << "Failed to load 'theme:cardback' for failed state! Using fallback.";
tmpPixmap = QPixmap(size); tmpPixmap = QPixmap(size);
tmpPixmap.fill(Qt::red); // Fallback with red color tmpPixmap.fill(Qt::red); // Fallback with red color
} else { } else {
qCDebug(PictureLoaderCardBackCacheFailLog) << "Successfully loaded 'theme:cardback' for failed state."; qCDebug(CardPictureLoaderCardBackCacheFailLog) << "Successfully loaded 'theme:cardback' for failed state.";
} }
pixmap = tmpPixmap.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap = tmpPixmap.scaled(size, Qt::KeepAspectRatio, Qt::SmoothTransformation);
@ -108,10 +110,10 @@ void PictureLoader::getCardBackLoadingFailedPixmap(QPixmap &pixmap, QSize size)
} }
} }
void PictureLoader::getPixmap(QPixmap &pixmap, const ExactCard &card, QSize size) void CardPictureLoader::getPixmap(QPixmap &pixmap, const ExactCard &card, QSize size)
{ {
if (!card) { if (!card) {
qCWarning(PictureLoaderLog) << "getPixmap called with null card!"; qCWarning(CardPictureLoaderLog) << "getPixmap called with null card!";
return; return;
} }
@ -126,13 +128,13 @@ void PictureLoader::getPixmap(QPixmap &pixmap, const ExactCard &card, QSize size
QPixmap bigPixmap; QPixmap bigPixmap;
if (QPixmapCache::find(key, &bigPixmap)) { if (QPixmapCache::find(key, &bigPixmap)) {
if (bigPixmap.isNull()) { if (bigPixmap.isNull()) {
qCDebug(PictureLoaderLog) << "Cached pixmap for key" << key << "is NULL!"; qCDebug(CardPictureLoaderLog) << "Cached pixmap for key" << key << "is NULL!";
return; return;
} }
QScreen *screen = qApp->primaryScreen(); QScreen *screen = qApp->primaryScreen();
qreal dpr = screen ? screen->devicePixelRatio() : 1.0; qreal dpr = screen ? screen->devicePixelRatio() : 1.0;
qCDebug(PictureLoaderLog) << "Scaling cached image for" << card.getName(); qCDebug(CardPictureLoaderLog) << "Scaling cached image for" << card.getName();
pixmap = bigPixmap.scaled(size * dpr, Qt::KeepAspectRatio, Qt::SmoothTransformation); pixmap = bigPixmap.scaled(size * dpr, Qt::KeepAspectRatio, Qt::SmoothTransformation);
pixmap.setDevicePixelRatio(dpr); pixmap.setDevicePixelRatio(dpr);
@ -141,14 +143,14 @@ void PictureLoader::getPixmap(QPixmap &pixmap, const ExactCard &card, QSize size
} }
// add the card to the load queue // add the card to the load queue
qCDebug(PictureLoaderLog) << "Enqueuing " << card.getName() << " for " << card.getPixmapCacheKey(); qCDebug(CardPictureLoaderLog) << "Enqueuing " << card.getName() << " for " << card.getPixmapCacheKey();
getInstance().worker->enqueueImageLoad(card); getInstance().worker->enqueueImageLoad(card);
} }
void PictureLoader::imageLoaded(const ExactCard &card, const QImage &image) void CardPictureLoader::imageLoaded(const ExactCard &card, const QImage &image)
{ {
if (image.isNull()) { if (image.isNull()) {
qCDebug(PictureLoaderLog) << "Caching NULL pixmap for" << card.getName(); qCDebug(CardPictureLoaderLog) << "Caching NULL pixmap for" << card.getName();
QPixmapCache::insert(card.getPixmapCacheKey(), QPixmap()); QPixmapCache::insert(card.getPixmapCacheKey(), QPixmap());
} else { } else {
if (card.getInfo().getUpsideDownArt()) { if (card.getInfo().getUpsideDownArt()) {
@ -164,7 +166,7 @@ void PictureLoader::imageLoaded(const ExactCard &card, const QImage &image)
} }
// imageLoaded should only be reached if the exactCard isn't already in cache. // imageLoaded should only be reached if the exactCard isn't already in cache.
// (plus there's a deduplication mechanism in PictureLoaderWorker) // (plus there's a deduplication mechanism in CardPictureLoaderWorker)
// It should be safe to connect the CardInfo here without worrying about redundant connections. // It should be safe to connect the CardInfo here without worrying about redundant connections.
connect(card.getCardPtr().data(), &QObject::destroyed, this, connect(card.getCardPtr().data(), &QObject::destroyed, this,
[cacheKey = card.getPixmapCacheKey()] { QPixmapCache::remove(cacheKey); }); [cacheKey = card.getPixmapCacheKey()] { QPixmapCache::remove(cacheKey); });
@ -172,17 +174,17 @@ void PictureLoader::imageLoaded(const ExactCard &card, const QImage &image)
card.emitPixmapUpdated(); card.emitPixmapUpdated();
} }
void PictureLoader::clearPixmapCache() void CardPictureLoader::clearPixmapCache()
{ {
QPixmapCache::clear(); QPixmapCache::clear();
} }
void PictureLoader::clearNetworkCache() void CardPictureLoader::clearNetworkCache()
{ {
getInstance().worker->clearNetworkCache(); getInstance().worker->clearNetworkCache();
} }
void PictureLoader::cacheCardPixmaps(const QList<ExactCard> &cards) void CardPictureLoader::cacheCardPixmaps(const QList<ExactCard> &cards)
{ {
QPixmap tmp; QPixmap tmp;
int max = qMin(cards.size(), CACHED_CARD_PER_DECK_MAX); int max = qMin(cards.size(), CACHED_CARD_PER_DECK_MAX);
@ -201,17 +203,17 @@ void PictureLoader::cacheCardPixmaps(const QList<ExactCard> &cards)
} }
} }
void PictureLoader::picDownloadChanged() void CardPictureLoader::picDownloadChanged()
{ {
QPixmapCache::clear(); QPixmapCache::clear();
} }
void PictureLoader::picsPathChanged() void CardPictureLoader::picsPathChanged()
{ {
QPixmapCache::clear(); QPixmapCache::clear();
} }
bool PictureLoader::hasCustomArt() bool CardPictureLoader::hasCustomArt()
{ {
auto picsPath = SettingsCache::instance().getPicsPath(); auto picsPath = SettingsCache::instance().getPicsPath();
QDirIterator it(picsPath, QDir::Dirs | QDir::NoDotAndDotDot); QDirIterator it(picsPath, QDir::Dirs | QDir::NoDotAndDotDot);

View file

@ -1,40 +1,40 @@
/** /**
* @file picture_loader.h * @file card_picture_loader.h
* @ingroup PictureLoader * @ingroup PictureLoader
* @brief TODO: Document this. * @brief TODO: Document this.
*/ */
#ifndef PICTURELOADER_H #ifndef CARD_PICTURE_LOADER_H
#define PICTURELOADER_H #define CARD_PICTURE_LOADER_H
#include "../card/card_info.h" #include "card_picture_loader_status_bar.h"
#include "picture_loader_status_bar.h" #include "card_picture_loader_worker.h"
#include "picture_loader_worker.h"
#include <QLoggingCategory> #include <QLoggingCategory>
#include <libcockatrice/card/card_info.h>
inline Q_LOGGING_CATEGORY(PictureLoaderLog, "picture_loader"); inline Q_LOGGING_CATEGORY(CardPictureLoaderLog, "card_picture_loader");
inline Q_LOGGING_CATEGORY(PictureLoaderCardBackCacheFailLog, "picture_loader.card_back_cache_fail"); inline Q_LOGGING_CATEGORY(CardPictureLoaderCardBackCacheFailLog, "card_picture_loader.card_back_cache_fail");
class PictureLoader : public QObject class CardPictureLoader : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
static PictureLoader &getInstance() static CardPictureLoader &getInstance()
{ {
static PictureLoader instance; static CardPictureLoader instance;
return instance; return instance;
} }
private: private:
explicit PictureLoader(); explicit CardPictureLoader();
~PictureLoader() override; ~CardPictureLoader() override;
// Singleton - Don't implement copy constructor and assign operator // Singleton - Don't implement copy constructor and assign operator
PictureLoader(PictureLoader const &); CardPictureLoader(CardPictureLoader const &);
void operator=(PictureLoader const &); void operator=(CardPictureLoader const &);
PictureLoaderWorker *worker; CardPictureLoaderWorker *worker;
PictureLoaderStatusBar *statusBar; CardPictureLoaderStatusBar *statusBar;
public: public:
static void getPixmap(QPixmap &pixmap, const ExactCard &card, QSize size); static void getPixmap(QPixmap &pixmap, const ExactCard &card, QSize size);

View file

@ -1,29 +1,30 @@
#include "picture_loader_local.h" #include "card_picture_loader_local.h"
#include "../database/card_database_manager.h" #include "card_picture_to_load.h"
#include "../settings/cache_settings.h"
#include "picture_to_load.h"
#include <QDirIterator> #include <QDirIterator>
#include <QMovie> #include <QMovie>
#include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/settings/cache_settings.h>
static constexpr int REFRESH_INTERVAL_MS = 10 * 1000; static constexpr int REFRESH_INTERVAL_MS = 10 * 1000;
PictureLoaderLocal::PictureLoaderLocal(QObject *parent) CardPictureLoaderLocal::CardPictureLoaderLocal(QObject *parent)
: QObject(parent), picsPath(SettingsCache::instance().getPicsPath()), : QObject(parent), picsPath(SettingsCache::instance().getPicsPath()),
customPicsPath(SettingsCache::instance().getCustomPicsPath()) customPicsPath(SettingsCache::instance().getCustomPicsPath())
{ {
// Hook up signals to settings // Hook up signals to settings
connect(&SettingsCache::instance(), &SettingsCache::picsPathChanged, this, &PictureLoaderLocal::picsPathChanged); connect(&SettingsCache::instance(), &SettingsCache::picsPathChanged, this,
&CardPictureLoaderLocal::picsPathChanged);
refreshIndex(); refreshIndex();
refreshTimer = new QTimer(this); refreshTimer = new QTimer(this);
connect(refreshTimer, &QTimer::timeout, this, &PictureLoaderLocal::refreshIndex); connect(refreshTimer, &QTimer::timeout, this, &CardPictureLoaderLocal::refreshIndex);
refreshTimer->start(REFRESH_INTERVAL_MS); refreshTimer->start(REFRESH_INTERVAL_MS);
} }
void PictureLoaderLocal::refreshIndex() void CardPictureLoaderLocal::refreshIndex()
{ {
customFolderIndex.clear(); customFolderIndex.clear();
@ -42,8 +43,8 @@ void PictureLoaderLocal::refreshIndex()
} }
} }
qCDebug(PictureLoaderLocalLog) << "Finished indexing local image folder CUSTOM; map now has" qCDebug(CardPictureLoaderLocalLog) << "Finished indexing local image folder CUSTOM; map now has"
<< customFolderIndex.size() << "entries."; << customFolderIndex.size() << "entries.";
} }
/** /**
@ -52,7 +53,7 @@ void PictureLoaderLocal::refreshIndex()
* @param toLoad The card to load * @param toLoad The card to load
* @return The loaded image, or an empty QImage if loading failed. * @return The loaded image, or an empty QImage if loading failed.
*/ */
QImage PictureLoaderLocal::tryLoad(const ExactCard &toLoad) const QImage CardPictureLoaderLocal::tryLoad(const ExactCard &toLoad) const
{ {
PrintingInfo setInstance = toLoad.getPrinting(); PrintingInfo setInstance = toLoad.getPrinting();
@ -67,15 +68,15 @@ QImage PictureLoaderLocal::tryLoad(const ExactCard &toLoad) const
providerId = setInstance.getUuid(); providerId = setInstance.getUuid();
} }
qCDebug(PictureLoaderLocalLog).nospace() qCDebug(CardPictureLoaderLocalLog).nospace()
<< "[card: " << cardName << " set: " << setName << "]: Attempting to load picture from local"; << "[card: " << cardName << " set: " << setName << "]: Attempting to load picture from local";
return tryLoadCardImageFromDisk(setName, correctedCardName, collectorNumber, providerId); return tryLoadCardImageFromDisk(setName, correctedCardName, collectorNumber, providerId);
} }
QImage PictureLoaderLocal::tryLoadCardImageFromDisk(const QString &setName, QImage CardPictureLoaderLocal::tryLoadCardImageFromDisk(const QString &setName,
const QString &correctedCardName, const QString &correctedCardName,
const QString &collectorNumber, const QString &collectorNumber,
const QString &providerId) const const QString &providerId) const
{ {
QImage image; QImage image;
QImageReader imgReader; QImageReader imgReader;
@ -134,7 +135,7 @@ QImage PictureLoaderLocal::tryLoadCardImageFromDisk(const QString &setName,
imgReader.setFileName(fullPath); imgReader.setFileName(fullPath);
if (imgReader.read(&image)) { if (imgReader.read(&image)) {
qCDebug(PictureLoaderLocalLog).nospace() qCDebug(CardPictureLoaderLocalLog).nospace()
<< "[card: " << correctedCardName << " set: " << setName << "] Found picture at: " << fullPath; << "[card: " << correctedCardName << " set: " << setName << "] Found picture at: " << fullPath;
return image; return image;
} }
@ -142,12 +143,12 @@ QImage PictureLoaderLocal::tryLoadCardImageFromDisk(const QString &setName,
} }
} }
qCDebug(PictureLoaderLocalLog).nospace() qCDebug(CardPictureLoaderLocalLog).nospace()
<< "[card: " << correctedCardName << " set: " << setName << "]: Picture NOT found on disk."; << "[card: " << correctedCardName << " set: " << setName << "]: Picture NOT found on disk.";
return QImage(); return QImage();
} }
void PictureLoaderLocal::picsPathChanged() void CardPictureLoaderLocal::picsPathChanged()
{ {
picsPath = SettingsCache::instance().getPicsPath(); picsPath = SettingsCache::instance().getPicsPath();
customPicsPath = SettingsCache::instance().getCustomPicsPath(); customPicsPath = SettingsCache::instance().getCustomPicsPath();

View file

@ -1,5 +1,5 @@
/** /**
* @file picture_loader_local.h * @file card_picture_loader_local.h
* @ingroup PictureLoader * @ingroup PictureLoader
* @brief TODO: Document this. * @brief TODO: Document this.
*/ */
@ -7,24 +7,23 @@
#ifndef PICTURE_LOADER_LOCAL_H #ifndef PICTURE_LOADER_LOCAL_H
#define PICTURE_LOADER_LOCAL_H #define PICTURE_LOADER_LOCAL_H
#include "../card/exact_card.h"
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QObject> #include <QObject>
#include <QTimer> #include <QTimer>
#include <libcockatrice/card/printing/exact_card.h>
inline Q_LOGGING_CATEGORY(PictureLoaderLocalLog, "picture_loader.local"); inline Q_LOGGING_CATEGORY(CardPictureLoaderLocalLog, "card_picture_loader.local");
/** /**
* Handles searching for and loading card images from the local pics and custom image folders. * Handles searching for and loading card images from the local pics and custom image folders.
* This class maintains an index of the CUSTOM folder, to avoid repeatedly searching the entire directory. * This class maintains an index of the CUSTOM folder, to avoid repeatedly searching the entire directory.
*/ */
class PictureLoaderLocal : public QObject class CardPictureLoaderLocal : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit PictureLoaderLocal(QObject *parent); explicit CardPictureLoaderLocal(QObject *parent);
QImage tryLoad(const ExactCard &toLoad) const; QImage tryLoad(const ExactCard &toLoad) const;

View file

@ -1,9 +1,9 @@
#include "picture_loader_request_status_display_widget.h" #include "card_picture_loader_request_status_display_widget.h"
PictureLoaderRequestStatusDisplayWidget::PictureLoaderRequestStatusDisplayWidget(QWidget *parent, CardPictureLoaderRequestStatusDisplayWidget::CardPictureLoaderRequestStatusDisplayWidget(QWidget *parent,
const QUrl &_url, const QUrl &_url,
const ExactCard &card, const ExactCard &card,
const QString &setName) const QString &setName)
: QWidget(parent) : QWidget(parent)
{ {
layout = new QHBoxLayout(this); layout = new QHBoxLayout(this);

View file

@ -1,25 +1,25 @@
/** /**
* @file picture_loader_request_status_display_widget.h * @file card_picture_loader_request_status_display_widget.h
* @ingroup PictureLoader * @ingroup PictureLoader
* @brief TODO: Document this. * @brief TODO: Document this.
*/ */
#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 "picture_loader_worker_work.h" #include "card_picture_loader_worker_work.h"
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QLabel> #include <QLabel>
#include <QWidget> #include <QWidget>
class PictureLoaderRequestStatusDisplayWidget : public QWidget class CardPictureLoaderRequestStatusDisplayWidget : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
PictureLoaderRequestStatusDisplayWidget(QWidget *parent, CardPictureLoaderRequestStatusDisplayWidget(QWidget *parent,
const QUrl &url, const QUrl &url,
const ExactCard &card, const ExactCard &card,
const QString &setName); const QString &setName);
void setFinished() void setFinished()
{ {

View file

@ -1,8 +1,8 @@
#include "picture_loader_status_bar.h" #include "card_picture_loader_status_bar.h"
#include "picture_loader_request_status_display_widget.h" #include "card_picture_loader_request_status_display_widget.h"
PictureLoaderStatusBar::PictureLoaderStatusBar(QWidget *parent) : QWidget(parent) CardPictureLoaderStatusBar::CardPictureLoaderStatusBar(QWidget *parent) : QWidget(parent)
{ {
layout = new QHBoxLayout(this); layout = new QHBoxLayout(this);
progressBar = new QProgressBar(this); progressBar = new QProgressBar(this);
@ -15,19 +15,19 @@ PictureLoaderStatusBar::PictureLoaderStatusBar(QWidget *parent) : QWidget(parent
cleaner = new QTimer(this); cleaner = new QTimer(this);
cleaner->setInterval(1000); cleaner->setInterval(1000);
connect(cleaner, &QTimer::timeout, this, &PictureLoaderStatusBar::cleanOldEntries); connect(cleaner, &QTimer::timeout, this, &CardPictureLoaderStatusBar::cleanOldEntries);
cleaner->start(); cleaner->start();
setLayout(layout); setLayout(layout);
} }
void PictureLoaderStatusBar::cleanOldEntries() void CardPictureLoaderStatusBar::cleanOldEntries()
{ {
if (!loadLog || !loadLog->popup) { if (!loadLog || !loadLog->popup) {
return; return;
} }
for (PictureLoaderRequestStatusDisplayWidget *statusDisplayWidget : for (CardPictureLoaderRequestStatusDisplayWidget *statusDisplayWidget :
loadLog->popup->findChildren<PictureLoaderRequestStatusDisplayWidget *>()) { loadLog->popup->findChildren<CardPictureLoaderRequestStatusDisplayWidget *>()) {
statusDisplayWidget->queryElapsedSeconds(); statusDisplayWidget->queryElapsedSeconds();
if (statusDisplayWidget->getFinished() && if (statusDisplayWidget->getFinished() &&
QDateTime::fromString(statusDisplayWidget->getStartTime()).secsTo(QDateTime::currentDateTime()) > 10) { QDateTime::fromString(statusDisplayWidget->getStartTime()).secsTo(QDateTime::currentDateTime()) > 10) {
@ -38,17 +38,17 @@ void PictureLoaderStatusBar::cleanOldEntries()
} }
} }
void PictureLoaderStatusBar::addQueuedImageLoad(const QUrl &url, const ExactCard &card, const QString &setName) void CardPictureLoaderStatusBar::addQueuedImageLoad(const QUrl &url, const ExactCard &card, const QString &setName)
{ {
loadLog->addSettingsWidget(new PictureLoaderRequestStatusDisplayWidget(loadLog, url, card, setName)); loadLog->addSettingsWidget(new CardPictureLoaderRequestStatusDisplayWidget(loadLog, url, card, setName));
progressBar->setMaximum(progressBar->maximum() + 1); progressBar->setMaximum(progressBar->maximum() + 1);
} }
void PictureLoaderStatusBar::addSuccessfulImageLoad(const QUrl &url) void CardPictureLoaderStatusBar::addSuccessfulImageLoad(const QUrl &url)
{ {
progressBar->setValue(progressBar->value() + 1); progressBar->setValue(progressBar->value() + 1);
for (PictureLoaderRequestStatusDisplayWidget *statusDisplayWidget : for (CardPictureLoaderRequestStatusDisplayWidget *statusDisplayWidget :
loadLog->popup->findChildren<PictureLoaderRequestStatusDisplayWidget *>()) { loadLog->popup->findChildren<CardPictureLoaderRequestStatusDisplayWidget *>()) {
if (statusDisplayWidget->getUrl() == url.toString()) { if (statusDisplayWidget->getUrl() == url.toString()) {
statusDisplayWidget->queryElapsedSeconds(); statusDisplayWidget->queryElapsedSeconds();
statusDisplayWidget->setFinished(); statusDisplayWidget->setFinished();

View file

@ -1,5 +1,5 @@
/** /**
* @file picture_loader_status_bar.h * @file card_picture_loader_status_bar.h
* @ingroup PictureLoader * @ingroup PictureLoader
* @brief TODO: Document this. * @brief TODO: Document this.
*/ */
@ -7,18 +7,18 @@
#ifndef PICTURE_LOADER_STATUS_BAR_H #ifndef PICTURE_LOADER_STATUS_BAR_H
#define PICTURE_LOADER_STATUS_BAR_H #define PICTURE_LOADER_STATUS_BAR_H
#include "../interface/widgets/quick_settings/settings_button_widget.h" #include "../../interface/widgets/quick_settings/settings_button_widget.h"
#include "picture_loader_worker_work.h" #include "card_picture_loader_worker_work.h"
#include <QHBoxLayout> #include <QHBoxLayout>
#include <QProgressBar> #include <QProgressBar>
#include <QWidget> #include <QWidget>
class PictureLoaderStatusBar : public QWidget class CardPictureLoaderStatusBar : public QWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit PictureLoaderStatusBar(QWidget *parent); explicit CardPictureLoaderStatusBar(QWidget *parent);
public slots: public slots:
void addQueuedImageLoad(const QUrl &url, const ExactCard &card, const QString &setName); void addQueuedImageLoad(const QUrl &url, const ExactCard &card, const QString &setName);

View file

@ -1,20 +1,20 @@
#include "picture_loader_worker.h" #include "card_picture_loader_worker.h"
#include "../database/card_database_manager.h" #include "card_picture_loader_local.h"
#include "../settings/cache_settings.h" #include "card_picture_loader_worker_work.h"
#include "picture_loader_local.h"
#include "picture_loader_worker_work.h"
#include <QDirIterator> #include <QDirIterator>
#include <QMovie> #include <QMovie>
#include <QNetworkDiskCache> #include <QNetworkDiskCache>
#include <QNetworkReply> #include <QNetworkReply>
#include <QThread> #include <QThread>
#include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/settings/cache_settings.h>
#include <utility> #include <utility>
static constexpr int MAX_REQUESTS_PER_SEC = 10; static constexpr int MAX_REQUESTS_PER_SEC = 10;
PictureLoaderWorker::PictureLoaderWorker() CardPictureLoaderWorker::CardPictureLoaderWorker()
: QObject(nullptr), picDownload(SettingsCache::instance().getPicDownload()), requestQuota(MAX_REQUESTS_PER_SEC) : QObject(nullptr), picDownload(SettingsCache::instance().getPicDownload()), requestQuota(MAX_REQUESTS_PER_SEC)
{ {
networkManager = new QNetworkAccessManager(this); networkManager = new QNetworkAccessManager(this);
@ -41,28 +41,28 @@ PictureLoaderWorker::PictureLoaderWorker()
cleanStaleEntries(); cleanStaleEntries();
connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this, connect(QCoreApplication::instance(), &QCoreApplication::aboutToQuit, this,
&PictureLoaderWorker::saveRedirectCache); &CardPictureLoaderWorker::saveRedirectCache);
localLoader = new PictureLoaderLocal(this); localLoader = new CardPictureLoaderLocal(this);
pictureLoaderThread = new QThread; pictureLoaderThread = new QThread;
pictureLoaderThread->start(QThread::LowPriority); pictureLoaderThread->start(QThread::LowPriority);
moveToThread(pictureLoaderThread); moveToThread(pictureLoaderThread);
connect(this, &PictureLoaderWorker::imageLoadEnqueued, this, &PictureLoaderWorker::handleImageLoadEnqueued); connect(this, &CardPictureLoaderWorker::imageLoadEnqueued, this, &CardPictureLoaderWorker::handleImageLoadEnqueued);
connect(&requestTimer, &QTimer::timeout, this, &PictureLoaderWorker::resetRequestQuota); connect(&requestTimer, &QTimer::timeout, this, &CardPictureLoaderWorker::resetRequestQuota);
requestTimer.setInterval(1000); requestTimer.setInterval(1000);
requestTimer.start(); requestTimer.start();
} }
PictureLoaderWorker::~PictureLoaderWorker() CardPictureLoaderWorker::~CardPictureLoaderWorker()
{ {
saveRedirectCache(); saveRedirectCache();
pictureLoaderThread->deleteLater(); pictureLoaderThread->deleteLater();
} }
void PictureLoaderWorker::queueRequest(const QUrl &url, PictureLoaderWorkerWork *worker) void CardPictureLoaderWorker::queueRequest(const QUrl &url, CardPictureLoaderWorkerWork *worker)
{ {
QUrl cachedRedirect = getCachedRedirect(url); QUrl cachedRedirect = getCachedRedirect(url);
if (!cachedRedirect.isEmpty()) { if (!cachedRedirect.isEmpty()) {
@ -77,7 +77,7 @@ void PictureLoaderWorker::queueRequest(const QUrl &url, PictureLoaderWorkerWork
} }
} }
QNetworkReply *PictureLoaderWorker::makeRequest(const QUrl &url, PictureLoaderWorkerWork *worker) QNetworkReply *CardPictureLoaderWorker::makeRequest(const QUrl &url, CardPictureLoaderWorkerWork *worker)
{ {
// Check for cached redirects // Check for cached redirects
QUrl cachedRedirect = getCachedRedirect(url); QUrl cachedRedirect = getCachedRedirect(url);
@ -99,7 +99,7 @@ QNetworkReply *PictureLoaderWorker::makeRequest(const QUrl &url, PictureLoaderWo
return reply; return reply;
} }
void PictureLoaderWorker::resetRequestQuota() void CardPictureLoaderWorker::resetRequestQuota()
{ {
requestQuota = MAX_REQUESTS_PER_SEC; requestQuota = MAX_REQUESTS_PER_SEC;
processQueuedRequests(); processQueuedRequests();
@ -108,7 +108,7 @@ void PictureLoaderWorker::resetRequestQuota()
/** /**
* Keeps processing requests from the queue until it is empty or until the quota runs out. * Keeps processing requests from the queue until it is empty or until the quota runs out.
*/ */
void PictureLoaderWorker::processQueuedRequests() void CardPictureLoaderWorker::processQueuedRequests()
{ {
while (requestQuota > 0 && processSingleRequest()) { while (requestQuota > 0 && processSingleRequest()) {
--requestQuota; --requestQuota;
@ -119,7 +119,7 @@ void PictureLoaderWorker::processQueuedRequests()
* Immediately processes a single queued request. No-ops if the load queue is empty * Immediately processes a single queued request. No-ops if the load queue is empty
* @return If a request was processed * @return If a request was processed
*/ */
bool PictureLoaderWorker::processSingleRequest() bool CardPictureLoaderWorker::processSingleRequest()
{ {
if (!requestLoadQueue.isEmpty()) { if (!requestLoadQueue.isEmpty()) {
auto request = requestLoadQueue.takeFirst(); auto request = requestLoadQueue.takeFirst();
@ -129,17 +129,17 @@ bool PictureLoaderWorker::processSingleRequest()
return false; return false;
} }
void PictureLoaderWorker::enqueueImageLoad(const ExactCard &card) void CardPictureLoaderWorker::enqueueImageLoad(const ExactCard &card)
{ {
// Send call through a connection to ensure the handling is run on the pictureLoader thread // Send call through a connection to ensure the handling is run on the pictureLoader thread
emit imageLoadEnqueued(card); emit imageLoadEnqueued(card);
} }
void PictureLoaderWorker::handleImageLoadEnqueued(const ExactCard &card) void CardPictureLoaderWorker::handleImageLoadEnqueued(const ExactCard &card)
{ {
// deduplicate loads for the same card // deduplicate loads for the same card
if (currentlyLoading.contains(card.getPixmapCacheKey())) { if (currentlyLoading.contains(card.getPixmapCacheKey())) {
qCDebug(PictureLoaderWorkerLog()) qCDebug(CardPictureLoaderWorkerLog())
<< "Skipping enqueued" << card.getName() << "because it's already being loaded"; << "Skipping enqueued" << card.getName() << "because it's already being loaded";
return; return;
} }
@ -151,31 +151,31 @@ void PictureLoaderWorker::handleImageLoadEnqueued(const ExactCard &card)
handleImageLoaded(card, image); handleImageLoaded(card, image);
} else { } else {
// queue up to load image from remote only after local loading failed // queue up to load image from remote only after local loading failed
new PictureLoaderWorkerWork(this, card); new CardPictureLoaderWorkerWork(this, card);
} }
} }
/** /**
* Called when image loading is done. Failures are indicated by an empty QImage. * Called when image loading is done. Failures are indicated by an empty QImage.
*/ */
void PictureLoaderWorker::handleImageLoaded(const ExactCard &card, const QImage &image) void CardPictureLoaderWorker::handleImageLoaded(const ExactCard &card, const QImage &image)
{ {
currentlyLoading.remove(card.getPixmapCacheKey()); currentlyLoading.remove(card.getPixmapCacheKey());
emit imageLoaded(card, image); emit imageLoaded(card, image);
} }
void PictureLoaderWorker::cacheRedirect(const QUrl &originalUrl, const QUrl &redirectUrl) void CardPictureLoaderWorker::cacheRedirect(const QUrl &originalUrl, const QUrl &redirectUrl)
{ {
redirectCache[originalUrl] = qMakePair(redirectUrl, QDateTime::currentDateTimeUtc()); redirectCache[originalUrl] = qMakePair(redirectUrl, QDateTime::currentDateTimeUtc());
// saveRedirectCache(); // saveRedirectCache();
} }
void PictureLoaderWorker::removedCachedUrl(const QUrl &url) void CardPictureLoaderWorker::removedCachedUrl(const QUrl &url)
{ {
networkManager->cache()->remove(url); networkManager->cache()->remove(url);
} }
QUrl PictureLoaderWorker::getCachedRedirect(const QUrl &originalUrl) const QUrl CardPictureLoaderWorker::getCachedRedirect(const QUrl &originalUrl) const
{ {
if (redirectCache.contains(originalUrl)) { if (redirectCache.contains(originalUrl)) {
return redirectCache[originalUrl].first; return redirectCache[originalUrl].first;
@ -183,7 +183,7 @@ QUrl PictureLoaderWorker::getCachedRedirect(const QUrl &originalUrl) const
return {}; return {};
} }
void PictureLoaderWorker::loadRedirectCache() void CardPictureLoaderWorker::loadRedirectCache()
{ {
QSettings settings(cacheFilePath, QSettings::IniFormat); QSettings settings(cacheFilePath, QSettings::IniFormat);
@ -202,7 +202,7 @@ void PictureLoaderWorker::loadRedirectCache()
settings.endArray(); settings.endArray();
} }
void PictureLoaderWorker::saveRedirectCache() const void CardPictureLoaderWorker::saveRedirectCache() const
{ {
QSettings settings(cacheFilePath, QSettings::IniFormat); QSettings settings(cacheFilePath, QSettings::IniFormat);
@ -217,7 +217,7 @@ void PictureLoaderWorker::saveRedirectCache() const
settings.endArray(); settings.endArray();
} }
void PictureLoaderWorker::cleanStaleEntries() void CardPictureLoaderWorker::cleanStaleEntries()
{ {
QDateTime now = QDateTime::currentDateTimeUtc(); QDateTime now = QDateTime::currentDateTimeUtc();
@ -231,7 +231,7 @@ void PictureLoaderWorker::cleanStaleEntries()
} }
} }
void PictureLoaderWorker::clearNetworkCache() void CardPictureLoaderWorker::clearNetworkCache()
{ {
networkManager->cache()->clear(); networkManager->cache()->clear();
redirectCache.clear(); redirectCache.clear();

View file

@ -1,5 +1,5 @@
/** /**
* @file picture_loader_worker.h * @file card_picture_loader_worker.h
* @ingroup PictureLoader * @ingroup PictureLoader
* @brief TODO: Document this. * @brief TODO: Document this.
*/ */
@ -7,11 +7,9 @@
#ifndef PICTURE_LOADER_WORKER_H #ifndef PICTURE_LOADER_WORKER_H
#define PICTURE_LOADER_WORKER_H #define PICTURE_LOADER_WORKER_H
#include "../card/card_info.h" #include "card_picture_loader_local.h"
#include "../database/card_database.h" #include "card_picture_loader_worker_work.h"
#include "picture_loader_local.h" #include "card_picture_to_load.h"
#include "picture_loader_worker_work.h"
#include "picture_to_load.h"
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QMutex> #include <QMutex>
@ -20,6 +18,8 @@
#include <QObject> #include <QObject>
#include <QQueue> #include <QQueue>
#include <QTimer> #include <QTimer>
#include <libcockatrice/card/card_info.h>
#include <libcockatrice/card/database/card_database.h>
#define REDIRECT_HEADER_NAME "redirects" #define REDIRECT_HEADER_NAME "redirects"
#define REDIRECT_ORIGINAL_URL "original" #define REDIRECT_ORIGINAL_URL "original"
@ -27,22 +27,22 @@
#define REDIRECT_TIMESTAMP "timestamp" #define REDIRECT_TIMESTAMP "timestamp"
#define REDIRECT_CACHE_FILENAME "cache.ini" #define REDIRECT_CACHE_FILENAME "cache.ini"
inline Q_LOGGING_CATEGORY(PictureLoaderWorkerLog, "picture_loader.worker"); inline Q_LOGGING_CATEGORY(CardPictureLoaderWorkerLog, "card_picture_loader.worker");
class PictureLoaderWorkerWork; class CardPictureLoaderWorkerWork;
class PictureLoaderWorker : public QObject class CardPictureLoaderWorker : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit PictureLoaderWorker(); explicit CardPictureLoaderWorker();
~PictureLoaderWorker() override; ~CardPictureLoaderWorker() override;
void enqueueImageLoad(const ExactCard &card); // Starts a thread for the image to be loaded void enqueueImageLoad(const ExactCard &card); // Starts a thread for the image to be loaded
void queueRequest(const QUrl &url, PictureLoaderWorkerWork *worker); // Queues network requests for load threads void queueRequest(const QUrl &url, CardPictureLoaderWorkerWork *worker); // Queues network requests for load threads
void clearNetworkCache(); void clearNetworkCache();
public slots: public slots:
QNetworkReply *makeRequest(const QUrl &url, PictureLoaderWorkerWork *workThread); QNetworkReply *makeRequest(const QUrl &url, CardPictureLoaderWorkerWork *workThread);
void processQueuedRequests(); void processQueuedRequests();
bool processSingleRequest(); bool processSingleRequest();
void handleImageLoaded(const ExactCard &card, const QImage &image); void handleImageLoaded(const ExactCard &card, const QImage &image);
@ -57,12 +57,12 @@ private:
QString cacheFilePath; // Path to persistent storage QString cacheFilePath; // Path to persistent storage
static constexpr int CacheTTLInDays = 30; // TODO: Make user configurable static constexpr int CacheTTLInDays = 30; // TODO: Make user configurable
bool picDownload; bool picDownload;
QQueue<QPair<QUrl, PictureLoaderWorkerWork *>> requestLoadQueue; QQueue<QPair<QUrl, CardPictureLoaderWorkerWork *>> requestLoadQueue;
int requestQuota; int requestQuota;
QTimer requestTimer; // Timer for refreshing request quota QTimer requestTimer; // Timer for refreshing request quota
PictureLoaderLocal *localLoader; CardPictureLoaderLocal *localLoader;
QSet<QString> currentlyLoading; // for deduplication purposes. Contains pixmapCacheKey QSet<QString> currentlyLoading; // for deduplication purposes. Contains pixmapCacheKey
QUrl getCachedRedirect(const QUrl &originalUrl) const; QUrl getCachedRedirect(const QUrl &originalUrl) const;

View file

@ -1,8 +1,6 @@
#include "picture_loader_worker_work.h" #include "card_picture_loader_worker_work.h"
#include "../database/card_database_manager.h" #include "card_picture_loader_worker.h"
#include "../settings/cache_settings.h"
#include "picture_loader_worker.h"
#include <QBuffer> #include <QBuffer>
#include <QDirIterator> #include <QDirIterator>
@ -12,19 +10,24 @@
#include <QNetworkReply> #include <QNetworkReply>
#include <QThread> #include <QThread>
#include <QThreadPool> #include <QThreadPool>
#include <libcockatrice/card/database/card_database_manager.h>
#include <libcockatrice/settings/cache_settings.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"};
PictureLoaderWorkerWork::PictureLoaderWorkerWork(const PictureLoaderWorker *worker, const ExactCard &toLoad) CardPictureLoaderWorkerWork::CardPictureLoaderWorkerWork(const CardPictureLoaderWorker *worker, const ExactCard &toLoad)
: QObject(nullptr), cardToDownload(PictureToLoad(toLoad)), picDownload(SettingsCache::instance().getPicDownload()) : QObject(nullptr), cardToDownload(CardPictureToLoad(toLoad)),
picDownload(SettingsCache::instance().getPicDownload())
{ {
// Hook up signals to the orchestrator // Hook up signals to the orchestrator
connect(this, &PictureLoaderWorkerWork::requestImageDownload, worker, &PictureLoaderWorker::queueRequest); connect(this, &CardPictureLoaderWorkerWork::requestImageDownload, worker, &CardPictureLoaderWorker::queueRequest);
connect(this, &PictureLoaderWorkerWork::urlRedirected, worker, &PictureLoaderWorker::cacheRedirect); connect(this, &CardPictureLoaderWorkerWork::urlRedirected, worker, &CardPictureLoaderWorker::cacheRedirect);
connect(this, &PictureLoaderWorkerWork::cachedUrlInvalidated, worker, &PictureLoaderWorker::removedCachedUrl); connect(this, &CardPictureLoaderWorkerWork::cachedUrlInvalidated, worker,
connect(this, &PictureLoaderWorkerWork::imageLoaded, worker, &PictureLoaderWorker::handleImageLoaded); &CardPictureLoaderWorker::removedCachedUrl);
connect(this, &PictureLoaderWorkerWork::requestSucceeded, worker, &PictureLoaderWorker::imageRequestSucceeded); connect(this, &CardPictureLoaderWorkerWork::imageLoaded, worker, &CardPictureLoaderWorker::handleImageLoaded);
connect(this, &CardPictureLoaderWorkerWork::requestSucceeded, worker,
&CardPictureLoaderWorker::imageRequestSucceeded);
// Hook up signals to settings // Hook up signals to settings
connect(&SettingsCache::instance(), SIGNAL(picDownloadChanged()), this, SLOT(picDownloadChanged())); connect(&SettingsCache::instance(), SIGNAL(picDownloadChanged()), this, SLOT(picDownloadChanged()));
@ -32,7 +35,7 @@ PictureLoaderWorkerWork::PictureLoaderWorkerWork(const PictureLoaderWorker *work
startNextPicDownload(); startNextPicDownload();
} }
void PictureLoaderWorkerWork::startNextPicDownload() void CardPictureLoaderWorkerWork::startNextPicDownload()
{ {
QString picUrl = cardToDownload.getCurrentUrl(); QString picUrl = cardToDownload.getCurrentUrl();
@ -40,7 +43,7 @@ void PictureLoaderWorkerWork::startNextPicDownload()
picDownloadFailed(); picDownloadFailed();
} else { } else {
QUrl url(picUrl); QUrl url(picUrl);
qCDebug(PictureLoaderWorkerWorkLog).nospace() qCDebug(CardPictureLoaderWorkerWorkLog).nospace()
<< "PictureLoader: [card: " << cardToDownload.getCard().getInfo().getCorrectedName() << "PictureLoader: [card: " << cardToDownload.getCard().getInfo().getCorrectedName()
<< " set: " << cardToDownload.getSetName() << "]: Trying to fetch picture from url " << " set: " << cardToDownload.getSetName() << "]: Trying to fetch picture from url "
<< url.toDisplayString(); << url.toDisplayString();
@ -52,7 +55,7 @@ void PictureLoaderWorkerWork::startNextPicDownload()
* Starts another pic download using the next possible url combination for the card. * Starts another pic download using the next possible url combination for the card.
* If all possibilities are exhausted, then concludes the image loading with an empty QImage. * If all possibilities are exhausted, then concludes the image loading with an empty QImage.
*/ */
void PictureLoaderWorkerWork::picDownloadFailed() void CardPictureLoaderWorkerWork::picDownloadFailed()
{ {
/* Take advantage of short-circuiting here to call the nextUrl until one /* Take advantage of short-circuiting here to call the nextUrl until one
is not available. Only once nextUrl evaluates to false will this move is not available. Only once nextUrl evaluates to false will this move
@ -61,7 +64,7 @@ void PictureLoaderWorkerWork::picDownloadFailed()
if (cardToDownload.nextUrl() || cardToDownload.nextSet()) { if (cardToDownload.nextUrl() || cardToDownload.nextSet()) {
startNextPicDownload(); startNextPicDownload();
} else { } else {
qCWarning(PictureLoaderWorkerWorkLog).nospace() qCWarning(CardPictureLoaderWorkerWorkLog).nospace()
<< "PictureLoader: [card: " << cardToDownload.getCard().getInfo().getCorrectedName() << "PictureLoader: [card: " << cardToDownload.getCard().getInfo().getCorrectedName()
<< " set: " << cardToDownload.getSetName() << "]: Picture NOT found, " << " set: " << cardToDownload.getSetName() << "]: Picture NOT found, "
<< (picDownload ? "download failed" : "downloads disabled") << (picDownload ? "download failed" : "downloads disabled")
@ -74,7 +77,7 @@ void PictureLoaderWorkerWork::picDownloadFailed()
* *
* @param reply The reply. Takes ownership of the object * @param reply The reply. Takes ownership of the object
*/ */
void PictureLoaderWorkerWork::handleNetworkReply(QNetworkReply *reply) void CardPictureLoaderWorkerWork::handleNetworkReply(QNetworkReply *reply)
{ {
QVariant redirectTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute); QVariant redirectTarget = reply->attribute(QNetworkRequest::RedirectionTargetAttribute);
if (redirectTarget.isValid()) { if (redirectTarget.isValid()) {
@ -102,15 +105,15 @@ static bool imageIsBlackListed(const QByteArray &picData)
return MD5_BLACKLIST.contains(md5sum); return MD5_BLACKLIST.contains(md5sum);
} }
void PictureLoaderWorkerWork::handleFailedReply(const QNetworkReply *reply) void CardPictureLoaderWorkerWork::handleFailedReply(const QNetworkReply *reply)
{ {
if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 429) { if (reply->attribute(QNetworkRequest::HttpStatusCodeAttribute).toInt() == 429) {
qCWarning(PictureLoaderWorkerWorkLog) << "Too many requests."; qCWarning(CardPictureLoaderWorkerWorkLog) << "Too many requests.";
} else { } else {
bool isFromCache = reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool(); bool isFromCache = reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool();
if (isFromCache) { if (isFromCache) {
qCDebug(PictureLoaderWorkerWorkLog).nospace() qCDebug(CardPictureLoaderWorkerWorkLog).nospace()
<< "PictureLoader: [card: " << cardToDownload.getCard().getName() << "PictureLoader: [card: " << cardToDownload.getCard().getName()
<< " set: " << cardToDownload.getSetName() << "]: Removing corrupted cache file for url " << " set: " << cardToDownload.getSetName() << "]: Removing corrupted cache file for url "
<< reply->url().toDisplayString() << " and retrying (" << reply->errorString() << ")"; << reply->url().toDisplayString() << " and retrying (" << reply->errorString() << ")";
@ -119,7 +122,7 @@ void PictureLoaderWorkerWork::handleFailedReply(const QNetworkReply *reply)
emit requestImageDownload(reply->url(), this); emit requestImageDownload(reply->url(), this);
} else { } else {
qCDebug(PictureLoaderWorkerWorkLog).nospace() qCDebug(CardPictureLoaderWorkerWorkLog).nospace()
<< "PictureLoader: [card: " << cardToDownload.getCard().getName() << "PictureLoader: [card: " << cardToDownload.getCard().getName()
<< " set: " << cardToDownload.getSetName() << "]: " << (picDownload ? "Download" : "Cache search") << " set: " << cardToDownload.getSetName() << "]: " << (picDownload ? "Download" : "Cache search")
<< " failed for url " << reply->url().toDisplayString() << " (" << reply->errorString() << ")"; << " failed for url " << reply->url().toDisplayString() << " (" << reply->errorString() << ")";
@ -129,7 +132,7 @@ void PictureLoaderWorkerWork::handleFailedReply(const QNetworkReply *reply)
} }
} }
void PictureLoaderWorkerWork::handleSuccessfulReply(QNetworkReply *reply) void CardPictureLoaderWorkerWork::handleSuccessfulReply(QNetworkReply *reply)
{ {
bool isFromCache = reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool(); bool isFromCache = reply->attribute(QNetworkRequest::SourceIsFromCacheAttribute).toBool();
@ -138,7 +141,7 @@ void PictureLoaderWorkerWork::handleSuccessfulReply(QNetworkReply *reply)
if (statusCode == 301 || statusCode == 302 || statusCode == 303 || statusCode == 305 || statusCode == 307 || if (statusCode == 301 || statusCode == 302 || statusCode == 303 || statusCode == 305 || statusCode == 307 ||
statusCode == 308) { statusCode == 308) {
QUrl redirectUrl = reply->header(QNetworkRequest::LocationHeader).toUrl(); QUrl redirectUrl = reply->header(QNetworkRequest::LocationHeader).toUrl();
qCDebug(PictureLoaderWorkerWorkLog).nospace() qCDebug(CardPictureLoaderWorkerWorkLog).nospace()
<< "PictureLoader: [card: " << cardToDownload.getCard().getName() << " set: " << cardToDownload.getSetName() << "PictureLoader: [card: " << cardToDownload.getCard().getName() << " set: " << cardToDownload.getSetName()
<< "]: following " << (isFromCache ? "cached redirect" : "redirect") << " to " << "]: following " << (isFromCache ? "cached redirect" : "redirect") << " to "
<< redirectUrl.toDisplayString(); << redirectUrl.toDisplayString();
@ -150,7 +153,7 @@ void PictureLoaderWorkerWork::handleSuccessfulReply(QNetworkReply *reply)
const QByteArray &picData = reply->peek(reply->size()); const QByteArray &picData = reply->peek(reply->size());
if (imageIsBlackListed(picData)) { if (imageIsBlackListed(picData)) {
qCDebug(PictureLoaderWorkerWorkLog).nospace() qCDebug(CardPictureLoaderWorkerWorkLog).nospace()
<< "PictureLoader: [card: " << cardToDownload.getCard().getName() << " set: " << cardToDownload.getSetName() << "PictureLoader: [card: " << cardToDownload.getCard().getName() << " set: " << cardToDownload.getSetName()
<< "]: Picture found, but blacklisted, will consider it as not found"; << "]: Picture found, but blacklisted, will consider it as not found";
@ -161,14 +164,14 @@ void PictureLoaderWorkerWork::handleSuccessfulReply(QNetworkReply *reply)
QImage image = tryLoadImageFromReply(reply); QImage image = tryLoadImageFromReply(reply);
if (image.isNull()) { if (image.isNull()) {
qCDebug(PictureLoaderWorkerWorkLog).nospace() qCDebug(CardPictureLoaderWorkerWorkLog).nospace()
<< "PictureLoader: [card: " << cardToDownload.getCard().getName() << " set: " << cardToDownload.getSetName() << "PictureLoader: [card: " << cardToDownload.getCard().getName() << " set: " << cardToDownload.getSetName()
<< "]: Possible " << (isFromCache ? "cached" : "downloaded") << " picture at " << "]: Possible " << (isFromCache ? "cached" : "downloaded") << " picture at "
<< reply->url().toDisplayString() << " could not be loaded: " << reply->errorString(); << reply->url().toDisplayString() << " could not be loaded: " << reply->errorString();
picDownloadFailed(); picDownloadFailed();
} else { } else {
qCDebug(PictureLoaderWorkerWorkLog).nospace() qCDebug(CardPictureLoaderWorkerWorkLog).nospace()
<< "PictureLoader: [card: " << cardToDownload.getCard().getName() << " set: " << cardToDownload.getSetName() << "PictureLoader: [card: " << cardToDownload.getCard().getName() << " set: " << cardToDownload.getSetName()
<< "]: Image successfully " << (isFromCache ? "loaded from cached" : "downloaded from") << " url " << "]: Image successfully " << (isFromCache ? "loaded from cached" : "downloaded from") << " url "
<< reply->url().toDisplayString(); << reply->url().toDisplayString();
@ -181,7 +184,7 @@ void PictureLoaderWorkerWork::handleSuccessfulReply(QNetworkReply *reply)
* @param reply The reply to load the image from * @param reply The reply to load the image from
* @return The loaded image, or an empty QImage if loading failed * @return The loaded image, or an empty QImage if loading failed
*/ */
QImage PictureLoaderWorkerWork::tryLoadImageFromReply(QNetworkReply *reply) QImage CardPictureLoaderWorkerWork::tryLoadImageFromReply(QNetworkReply *reply)
{ {
static constexpr int riffHeaderSize = 12; // RIFF_HEADER_SIZE from webp/format_constants.h static constexpr int riffHeaderSize = 12; // RIFF_HEADER_SIZE from webp/format_constants.h
auto replyHeader = reply->peek(riffHeaderSize); auto replyHeader = reply->peek(riffHeaderSize);
@ -208,13 +211,13 @@ QImage PictureLoaderWorkerWork::tryLoadImageFromReply(QNetworkReply *reply)
* Call this method when the image has finished being loaded. * Call this method when the image has finished being loaded.
* @param image The image that was loaded. Empty QImage indicates failure. * @param image The image that was loaded. Empty QImage indicates failure.
*/ */
void PictureLoaderWorkerWork::concludeImageLoad(const QImage &image) void CardPictureLoaderWorkerWork::concludeImageLoad(const QImage &image)
{ {
emit imageLoaded(cardToDownload.getCard(), image); emit imageLoaded(cardToDownload.getCard(), image);
deleteLater(); deleteLater();
} }
void PictureLoaderWorkerWork::picDownloadChanged() void CardPictureLoaderWorkerWork::picDownloadChanged()
{ {
picDownload = SettingsCache::instance().getPicDownload(); picDownload = SettingsCache::instance().getPicDownload();
} }

View file

@ -7,15 +7,15 @@
#ifndef PICTURE_LOADER_WORKER_WORK_H #ifndef PICTURE_LOADER_WORKER_WORK_H
#define PICTURE_LOADER_WORKER_WORK_H #define PICTURE_LOADER_WORKER_WORK_H
#include "../database/card_database.h" #include "card_picture_loader_worker.h"
#include "picture_loader_worker.h" #include "card_picture_to_load.h"
#include "picture_to_load.h"
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QMutex> #include <QMutex>
#include <QNetworkAccessManager> #include <QNetworkAccessManager>
#include <QObject> #include <QObject>
#include <QThread> #include <QThread>
#include <libcockatrice/card/database/card_database.h>
#define REDIRECT_HEADER_NAME "redirects" #define REDIRECT_HEADER_NAME "redirects"
#define REDIRECT_ORIGINAL_URL "original" #define REDIRECT_ORIGINAL_URL "original"
@ -23,17 +23,17 @@
#define REDIRECT_TIMESTAMP "timestamp" #define REDIRECT_TIMESTAMP "timestamp"
#define REDIRECT_CACHE_FILENAME "cache.ini" #define REDIRECT_CACHE_FILENAME "cache.ini"
inline Q_LOGGING_CATEGORY(PictureLoaderWorkerWorkLog, "picture_loader.worker"); inline Q_LOGGING_CATEGORY(CardPictureLoaderWorkerWorkLog, "card_picture_loader.worker");
class PictureLoaderWorker; class CardPictureLoaderWorker;
class PictureLoaderWorkerWork : public QObject class CardPictureLoaderWorkerWork : public QObject
{ {
Q_OBJECT Q_OBJECT
public: public:
explicit PictureLoaderWorkerWork(const PictureLoaderWorker *worker, const ExactCard &toLoad); explicit CardPictureLoaderWorkerWork(const CardPictureLoaderWorker *worker, const ExactCard &toLoad);
PictureToLoad cardToDownload; CardPictureToLoad cardToDownload;
public slots: public slots:
void handleNetworkReply(QNetworkReply *reply); void handleNetworkReply(QNetworkReply *reply);
@ -63,7 +63,7 @@ signals:
* Emitted when a request did not return a 400 or 500 response * Emitted when a request did not return a 400 or 500 response
*/ */
void requestSucceeded(const QUrl &url); void requestSucceeded(const QUrl &url);
void requestImageDownload(const QUrl &url, PictureLoaderWorkerWork *instance); void requestImageDownload(const QUrl &url, CardPictureLoaderWorkerWork *instance);
void urlRedirected(const QUrl &originalUrl, const QUrl &redirectUrl); void urlRedirected(const QUrl &originalUrl, const QUrl &redirectUrl);
void cachedUrlInvalidated(const QUrl &url); void cachedUrlInvalidated(const QUrl &url);

View file

@ -1,15 +1,14 @@
#include "picture_to_load.h" #include "card_picture_to_load.h"
#include "../settings/cache_settings.h"
#include "../utility/card_set_comparator.h"
#include <QCoreApplication> #include <QCoreApplication>
#include <QDate> #include <QDate>
#include <QRegularExpression> #include <QRegularExpression>
#include <QUrl> #include <QUrl>
#include <algorithm> #include <algorithm>
#include <libcockatrice/card/set/card_set_comparator.h>
#include <libcockatrice/settings/cache_settings.h>
PictureToLoad::PictureToLoad(const ExactCard &_card) CardPictureToLoad::CardPictureToLoad(const ExactCard &_card)
: card(_card), urlTemplates(SettingsCache::instance().downloads().getAllURLs()) : card(_card), urlTemplates(SettingsCache::instance().downloads().getAllURLs())
{ {
if (card) { if (card) {
@ -25,7 +24,7 @@ PictureToLoad::PictureToLoad(const ExactCard &_card)
* *
* @return A list of sets. Will not be empty. * @return A list of sets. Will not be empty.
*/ */
QList<CardSetPtr> PictureToLoad::extractSetsSorted(const ExactCard &card) QList<CardSetPtr> CardPictureToLoad::extractSetsSorted(const ExactCard &card)
{ {
QList<CardSetPtr> sortedSets; QList<CardSetPtr> sortedSets;
for (const auto &printings : card.getInfo().getSets()) { for (const auto &printings : card.getInfo().getSets()) {
@ -80,7 +79,7 @@ static PrintingInfo findPrintingForSet(const ExactCard &card, const QString &set
return setsToPrintings[setName][0]; return setsToPrintings[setName][0];
} }
void PictureToLoad::populateSetUrls() void CardPictureToLoad::populateSetUrls()
{ {
/* currentSetUrls is a list, populated each time a new set is requested for a particular card /* currentSetUrls is a list, populated each time a new set is requested for a particular card
and Urls are removed from it as a download is attempted from each one. Custom Urls for and Urls are removed from it as a download is attempted from each one. Custom Urls for
@ -113,7 +112,7 @@ void PictureToLoad::populateSetUrls()
* If we are already at the end of the list, then currentSet is set to empty. * If we are already at the end of the list, then currentSet is set to empty.
* @return If we are already at the end of the list * @return If we are already at the end of the list
*/ */
bool PictureToLoad::nextSet() bool CardPictureToLoad::nextSet()
{ {
if (!sortedSets.isEmpty()) { if (!sortedSets.isEmpty()) {
currentSet = sortedSets.takeFirst(); currentSet = sortedSets.takeFirst();
@ -129,7 +128,7 @@ bool PictureToLoad::nextSet()
* If we are already at the end of the list, then currentUrl is set to empty. * If we are already at the end of the list, then currentUrl is set to empty.
* @return If we are already at the end of the list * @return If we are already at the end of the list
*/ */
bool PictureToLoad::nextUrl() bool CardPictureToLoad::nextUrl()
{ {
if (!currentSetUrls.isEmpty()) { if (!currentSetUrls.isEmpty()) {
currentUrl = currentSetUrls.takeFirst(); currentUrl = currentSetUrls.takeFirst();
@ -139,7 +138,7 @@ bool PictureToLoad::nextUrl()
return false; return false;
} }
QString PictureToLoad::getSetName() const QString CardPictureToLoad::getSetName() const
{ {
if (currentSet) { if (currentSet) {
return currentSet->getCorrectedShortName(); return currentSet->getCorrectedShortName();
@ -185,7 +184,7 @@ static int parse(const QString &urlTemplate,
} }
QString propertyValue = getProperty(cardPropertyName); QString propertyValue = getProperty(cardPropertyName);
if (propertyValue.isEmpty()) { if (propertyValue.isEmpty()) {
qCDebug(PictureToLoadLog).nospace() qCDebug(CardPictureToLoadLog).nospace()
<< "PictureLoader: [card: " << cardName << " set: " << setName << "]: Requested " << propType << "PictureLoader: [card: " << cardName << " set: " << setName << "]: Requested " << propType
<< "property (" << cardPropertyName << ") for Url template (" << urlTemplate << ") is not available"; << "property (" << cardPropertyName << ") for Url template (" << urlTemplate << ") is not available";
return 1; return 1;
@ -193,7 +192,7 @@ static int parse(const QString &urlTemplate,
int propLength = propertyValue.length(); int propLength = propertyValue.length();
if (subStrLen > 0) { if (subStrLen > 0) {
if (subStrPos + subStrLen > propLength) { if (subStrPos + subStrLen > propLength) {
qCDebug(PictureToLoadLog).nospace() qCDebug(CardPictureToLoadLog).nospace()
<< "PictureLoader: [card: " << cardName << " set: " << setName << "]: Requested " << propType << "PictureLoader: [card: " << cardName << " set: " << setName << "]: Requested " << propType
<< " property (" << cardPropertyName << ") for Url template (" << urlTemplate << " property (" << cardPropertyName << ") for Url template (" << urlTemplate
<< ") is smaller than substr specification (" << subStrPos << " + " << subStrLen << " > " << ") is smaller than substr specification (" << subStrPos << " + " << subStrLen << " > "
@ -208,7 +207,7 @@ static int parse(const QString &urlTemplate,
if (!fillWith.isEmpty()) { if (!fillWith.isEmpty()) {
int fillLength = fillWith.length(); int fillLength = fillWith.length();
if (fillLength < propLength) { if (fillLength < propLength) {
qCDebug(PictureToLoadLog).nospace() qCDebug(CardPictureToLoadLog).nospace()
<< "PictureLoader: [card: " << cardName << " set: " << setName << "]: Requested " << propType << "PictureLoader: [card: " << cardName << " set: " << setName << "]: Requested " << propType
<< " property (" << cardPropertyName << ") for Url template (" << urlTemplate << " property (" << cardPropertyName << ") for Url template (" << urlTemplate
<< ") is longer than fill specification (" << fillWith << ")"; << ") is longer than fill specification (" << fillWith << ")";
@ -225,7 +224,7 @@ static int parse(const QString &urlTemplate,
return 0; return 0;
} }
QString PictureToLoad::transformUrl(const QString &urlTemplate) const QString CardPictureToLoad::transformUrl(const QString &urlTemplate) const
{ {
/* This function takes Url templates and substitutes actual card details /* This function takes Url templates and substitutes actual card details
into the url. This is used for making Urls with follow a predictable format into the url. This is used for making Urls with follow a predictable format
@ -279,7 +278,7 @@ QString PictureToLoad::transformUrl(const QString &urlTemplate) const
* populated in this card, so it should return an empty string, * populated in this card, so it should return an empty string,
* indicating an invalid Url. * indicating an invalid Url.
*/ */
qCDebug(PictureToLoadLog).nospace() qCDebug(CardPictureToLoadLog).nospace()
<< "PictureLoader: [card: " << cardName << " set: " << setName << "]: Requested information (" << "PictureLoader: [card: " << cardName << " set: " << setName << "]: Requested information ("
<< prop << ") for Url template (" << urlTemplate << ") is not available"; << prop << ") for Url template (" << urlTemplate << ") is not available";
return QString(); return QString();

View file

@ -1,5 +1,5 @@
/** /**
* @file picture_to_load.h * @file card_picture_to_load.h
* @ingroup PictureLoader * @ingroup PictureLoader
* @brief TODO: Document this. * @brief TODO: Document this.
*/ */
@ -7,13 +7,12 @@
#ifndef PICTURE_TO_LOAD_H #ifndef PICTURE_TO_LOAD_H
#define PICTURE_TO_LOAD_H #define PICTURE_TO_LOAD_H
#include "../card/exact_card.h"
#include <QLoggingCategory> #include <QLoggingCategory>
#include <libcockatrice/card/printing/exact_card.h>
inline Q_LOGGING_CATEGORY(PictureToLoadLog, "picture_loader.picture_to_load"); inline Q_LOGGING_CATEGORY(CardPictureToLoadLog, "card_picture_loader.picture_to_load");
class PictureToLoad class CardPictureToLoad
{ {
private: private:
ExactCard card; ExactCard card;
@ -24,7 +23,7 @@ private:
CardSetPtr currentSet; CardSetPtr currentSet;
public: public:
explicit PictureToLoad(const ExactCard &_card); explicit CardPictureToLoad(const ExactCard &_card);
const ExactCard &getCard() const const ExactCard &getCard() const
{ {

View file

@ -1,13 +1,12 @@
#include "pixel_map_generator.h" #include "pixel_map_generator.h"
#include "pb/serverinfo_user.pb.h"
#include <QApplication> #include <QApplication>
#include <QDomDocument> #include <QDomDocument>
#include <QFile> #include <QFile>
#include <QPainter> #include <QPainter>
#include <QPalette> #include <QPalette>
#include <QSvgRenderer> #include <QSvgRenderer>
#include <libcockatrice/protocol/pb/serverinfo_user.pb.h>
#define DEFAULT_COLOR_UNREGISTERED "#32c8ec"; #define DEFAULT_COLOR_UNREGISTERED "#32c8ec";
#define DEFAULT_COLOR_REGISTERED "#5ed900"; #define DEFAULT_COLOR_REGISTERED "#5ed900";

View file

@ -7,12 +7,11 @@
#ifndef PIXMAPGENERATOR_H #ifndef PIXMAPGENERATOR_H
#define PIXMAPGENERATOR_H #define PIXMAPGENERATOR_H
#include "user_level.h"
#include <QIcon> #include <QIcon>
#include <QLoggingCategory> #include <QLoggingCategory>
#include <QMap> #include <QMap>
#include <QPixmap> #include <QPixmap>
#include <libcockatrice/network/server/remote/user_level.h>
inline Q_LOGGING_CATEGORY(PixelMapGeneratorLog, "pixel_map_generator"); inline Q_LOGGING_CATEGORY(PixelMapGeneratorLog, "pixel_map_generator");

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