new icons and translation fix

This commit is contained in:
2026-09-21 00:27:52 +03:00
parent 01af372ef2
commit 5dba4e89cb
26 changed files with 117 additions and 54 deletions
+74 -43
View File
@@ -1,24 +1,10 @@
cmake_minimum_required(VERSION 3.20)
# C нужен для эталонного zlib: см. блок про установщики Forge ниже.
project(Minecraft_launcher VERSION 0.1 LANGUAGES CXX C)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
# CorePrivate нужен ради QZipReader — им распаковываются нативные библиотеки LWJGL.
# Про привязку к версии Qt из-за него предупреждать не нужно: это осознанный выбор.
set(QT_NO_PRIVATE_MODULE_WARNING ON)
find_package(Qt6 REQUIRED COMPONENTS Quick QuickControls2 Core CorePrivate Gui Network)
# ── Qt WebEngine: окно входа в аккаунт Microsoft ────────────────────────────
#
# Модуль необязательный, и это принципиально: он ставится отдельной галочкой в
# установщике Qt и тянет за собой WebChannel с Positioning, которых в типовой
# установке нет. Если сделать его обязательным, у любого, кто их не поставил,
# проект перестаёт конфигурироваться целиком — вместе с офлайном и Ely.by.
#
# Без модуля лаунчер собирается и работает как раньше, только вход через
# Microsoft сообщает, что эта сборка его не умеет.
find_package(Qt6 QUIET COMPONENTS WebEngineQuick)
if(Qt6WebEngineQuick_FOUND)
message(STATUS "Qt WebEngine найден: вход через аккаунт Microsoft будет доступен")
@@ -33,11 +19,56 @@ endif()
qt_standard_project_setup(REQUIRES 6.8)
qt_add_executable(appMinecraft_launcher
# Иконку самого файла приложения (то, что видно до запуска) каждая система берёт
# по-своему: Windows — из ресурса, вкомпилированного в .exe, macOS — из .icns
# внутри бандла. На Linux такого механизма нет, там иконку даёт .desktop-файл,
# который ставится ниже вместе с темой hicolor.
#
# Растры и .icns/.ico собираются из одного исходника скриптом icons/generate_icons.sh:
# у macOS арт по сетке Apple занимает 824 из 1024 точек холста, у Windows и Linux
# идёт без полей. Правки иконки вносятся в icons/master/icon_master.png с
# последующим перезапуском скрипта, а не в отдельные файлы размеров.
set(LAUNCHER_ICON_DIR "${CMAKE_CURRENT_SOURCE_DIR}/icons")
if(WIN32)
set(LAUNCHER_APP_ICON "${LAUNCHER_ICON_DIR}/icon.rc")
elseif(APPLE)
set(LAUNCHER_APP_ICON "${LAUNCHER_ICON_DIR}/icon.icns")
set_source_files_properties(${LAUNCHER_APP_ICON} PROPERTIES
MACOSX_PACKAGE_LOCATION "Resources")
else()
set(LAUNCHER_APP_ICON "")
endif()
qt_add_executable(BiLauncher
main.cpp
${LAUNCHER_APP_ICON}
)
qt_add_qml_module(appMinecraft_launcher
# Иконка окна выставляется в main.cpp через setWindowIcon() и обязана быть
# доступна на всех платформах, поэтому лежит в отдельном ресурсе, а не в
# ресурсах QML-модуля: путь :/icons/... не зависит от URI модуля.
# Размеры 24, 48 и 64 нужны панели задач Windows и значкам рабочих столов Linux.
qt_add_resources(BiLauncher "appicon"
PREFIX "/icons"
BASE "icons"
FILES
icons/icon_16x16.png
icons/icon_16x16@2x.png
icons/icon_24x24.png
icons/icon_32x32.png
icons/icon_32x32@2x.png
icons/icon_48x48.png
icons/icon_64x64.png
icons/icon_128x128.png
icons/icon_128x128@2x.png
icons/icon_256x256.png
icons/icon_256x256@2x.png
icons/icon_512x512.png
icons/icon_512x512@2x.png
)
qt_add_qml_module(BiLauncher
URI Minecraft_launcher
SOURCES
localization.h
@@ -93,44 +124,35 @@ qt_add_qml_module(appMinecraft_launcher
ProgressPanel.qml
${LAUNCHER_MSA_QML_FILES}
RESOURCES images/Folder/Folder_Active.svg images/Folder/Folder_Idle.svg images/Folder/Folder_Pressed.svg images/Options/Options_active.svg images/Options/Options_Idle.svg images/Options/Options_Pressed.svg images/Play_Button/Play_Active.svg images/Play_Button/Play_Idle.svg images/Play_Button/Play_pressed.svg images/Profile_Box/Asset_23.jpg images/Profile_Box/Asset_23.svg images/Profile_Box/Asset_24.jpg images/Profile_Box/Asset_24.svg images/Profile_Box/Kishka_Profile_Active.svg images/Profile_Box/Kishka_Profile_Idle.svg images/Profile_Box/Kishka_Profile_open.svg images/Scroll/Scroll_Lever.svg images/Scroll/Scroll_palka.svg images/Version_box/Kishka_Profile_Open.svg images/Version_box/Kishka_Ver_Active.svg images/Version_box/Kishka_Ver_idle.svg images/Trash.svg images/Pencil.svg images/GovuztTW8AAHqBf.jpeg images/photo_2025-12-16_15-04-17.jpg images/photo_2025-12-21_02-30-09.jpg i18n/translations.json
RESOURCES images/launcherBackground.png
RESOURCES images/launcherBackground2.mp4 images/launcherBackground2static.jpg
)
# Qt for iOS sets MACOSX_BUNDLE_GUI_IDENTIFIER automatically since Qt 6.1.
# If you are developing for iOS or macOS you should consider setting an
# explicit, fixed bundle identifier manually though.
set_target_properties(appMinecraft_launcher PROPERTIES
# MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appMinecraft_launcher
set_target_properties(BiLauncher PROPERTIES
# MACOSX_BUNDLE_GUI_IDENTIFIER com.example.BiLauncher
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
# Попадает в CFBundleIconFile сгенерированного Info.plist — только имя
# файла, без пути: сам .icns кладётся в Contents/Resources выше.
MACOSX_BUNDLE_ICON_FILE icon.icns
MACOSX_BUNDLE TRUE
WIN32_EXECUTABLE TRUE
)
target_link_libraries(appMinecraft_launcher
target_link_libraries(BiLauncher
PRIVATE Qt6::Quick Qt6::QuickControls2 Qt6::Core Qt6::CorePrivate Qt6::Gui Qt6::Network
)
if(Qt6WebEngineQuick_FOUND)
target_link_libraries(appMinecraft_launcher PRIVATE Qt6::WebEngineQuick)
target_compile_definitions(appMinecraft_launcher PRIVATE LAUNCHER_HAS_WEBENGINE)
target_link_libraries(BiLauncher PRIVATE Qt6::WebEngineQuick)
target_compile_definitions(BiLauncher PRIVATE LAUNCHER_HAS_WEBENGINE)
endif()
include(GNUInstallDirs)
# ── Эталонный zlib для установщиков Forge и NeoForge ────────────────────────
#
# Установщик Forge сверяет sha1 каждого jar, который сам же и собирает, с
# эталоном из install_profile.json. Эталон посчитан на обычном zlib, а
# дистрибутивы вроде CachyOS и Fedora подставляют вместо него zlib-ng: сжатие
# корректное, но побайтово другое, поэтому установка падает на любой версии
# игры («Processor failed, invalid outputs»). Сменить Java не выйдет — сборки
# OpenJDK под Linux берут libz.so.1 из системы.
#
# Поэтому собираем обычный zlib из zlib/ — его исходники лежат в репозитории,
# чтобы сборка не зависела от сети, а версия была зафиксирована: от неё зависит
# побайтовый результат сжатия. Готовую библиотеку подсовываем через LD_PRELOAD
# только процессу установщика. Сам лаунчер с ней не линкуется, системный
# zlib-ng остаётся на месте.
if(UNIX AND NOT APPLE)
set(LAUNCHER_ZLIB_DIR "${CMAKE_INSTALL_LIBDIR}/galeonLauncher")
set(LAUNCHER_ZLIB_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/zlib")
@@ -153,28 +175,37 @@ if(UNIX AND NOT APPLE)
${LAUNCHER_ZLIB_SOURCES}/zutil.c
)
target_include_directories(launcher_zlib_reference PRIVATE ${LAUNCHER_ZLIB_SOURCES})
# То же, что выставляет собственный configure zlib: без этого gz*-часть не
# видит unistd.h и не собирается.
target_compile_definitions(launcher_zlib_reference PRIVATE
HAVE_UNISTD_H=1 HAVE_STDARG_H=1 _LARGEFILE64_SOURCE=1)
# SONAME libz.so.1 обязателен: с ним ld.so считает предзагруженный объект
# закрывающим зависимость, и системный zlib-ng в процессе java не появится.
set_target_properties(launcher_zlib_reference PROPERTIES
OUTPUT_NAME z
VERSION 1.3.1
SOVERSION 1
C_VISIBILITY_PRESET default
LIBRARY_OUTPUT_DIRECTORY $<TARGET_FILE_DIR:appMinecraft_launcher>/zlib
LIBRARY_OUTPUT_DIRECTORY $<TARGET_FILE_DIR:BiLauncher>/zlib
)
add_dependencies(appMinecraft_launcher launcher_zlib_reference)
add_dependencies(BiLauncher launcher_zlib_reference)
target_compile_definitions(appMinecraft_launcher PRIVATE
target_compile_definitions(BiLauncher PRIVATE
LAUNCHER_ZLIB_INSTALL_DIR="${CMAKE_INSTALL_FULL_LIBDIR}/galeonLauncher"
)
install(TARGETS launcher_zlib_reference LIBRARY DESTINATION ${LAUNCHER_ZLIB_DIR})
# Рабочие столы ищут иконку не по имени файла, а по имени из ключа Icon=
# .desktop-файла, перебирая размеры в теме hicolor, — отсюда переименование.
foreach(icon_size IN ITEMS 16 24 32 48 64 128 256 512)
install(FILES "${LAUNCHER_ICON_DIR}/icon_${icon_size}x${icon_size}.png"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/${icon_size}x${icon_size}/apps"
RENAME bilauncher.png)
endforeach()
install(FILES "${LAUNCHER_ICON_DIR}/bilauncher.desktop"
DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications")
endif()
install(TARGETS appMinecraft_launcher
install(TARGETS BiLauncher
BUNDLE DESTINATION .
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}