new icons and translation fix
@@ -1,24 +1,10 @@
|
|||||||
cmake_minimum_required(VERSION 3.20)
|
cmake_minimum_required(VERSION 3.20)
|
||||||
|
|
||||||
# C нужен для эталонного zlib: см. блок про установщики Forge ниже.
|
|
||||||
project(Minecraft_launcher VERSION 0.1 LANGUAGES CXX C)
|
project(Minecraft_launcher VERSION 0.1 LANGUAGES CXX C)
|
||||||
|
|
||||||
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
set(CMAKE_CXX_STANDARD_REQUIRED ON)
|
||||||
|
|
||||||
# CorePrivate нужен ради QZipReader — им распаковываются нативные библиотеки LWJGL.
|
|
||||||
# Про привязку к версии Qt из-за него предупреждать не нужно: это осознанный выбор.
|
|
||||||
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
set(QT_NO_PRIVATE_MODULE_WARNING ON)
|
||||||
find_package(Qt6 REQUIRED COMPONENTS Quick QuickControls2 Core CorePrivate Gui Network)
|
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)
|
find_package(Qt6 QUIET COMPONENTS WebEngineQuick)
|
||||||
if(Qt6WebEngineQuick_FOUND)
|
if(Qt6WebEngineQuick_FOUND)
|
||||||
message(STATUS "Qt WebEngine найден: вход через аккаунт Microsoft будет доступен")
|
message(STATUS "Qt WebEngine найден: вход через аккаунт Microsoft будет доступен")
|
||||||
@@ -33,11 +19,56 @@ endif()
|
|||||||
|
|
||||||
qt_standard_project_setup(REQUIRES 6.8)
|
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
|
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
|
URI Minecraft_launcher
|
||||||
SOURCES
|
SOURCES
|
||||||
localization.h
|
localization.h
|
||||||
@@ -93,44 +124,35 @@ qt_add_qml_module(appMinecraft_launcher
|
|||||||
ProgressPanel.qml
|
ProgressPanel.qml
|
||||||
${LAUNCHER_MSA_QML_FILES}
|
${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/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.
|
# 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
|
# If you are developing for iOS or macOS you should consider setting an
|
||||||
# explicit, fixed bundle identifier manually though.
|
# explicit, fixed bundle identifier manually though.
|
||||||
set_target_properties(appMinecraft_launcher PROPERTIES
|
set_target_properties(BiLauncher PROPERTIES
|
||||||
# MACOSX_BUNDLE_GUI_IDENTIFIER com.example.appMinecraft_launcher
|
# MACOSX_BUNDLE_GUI_IDENTIFIER com.example.BiLauncher
|
||||||
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
MACOSX_BUNDLE_BUNDLE_VERSION ${PROJECT_VERSION}
|
||||||
MACOSX_BUNDLE_SHORT_VERSION_STRING ${PROJECT_VERSION_MAJOR}.${PROJECT_VERSION_MINOR}
|
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
|
MACOSX_BUNDLE TRUE
|
||||||
WIN32_EXECUTABLE 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
|
PRIVATE Qt6::Quick Qt6::QuickControls2 Qt6::Core Qt6::CorePrivate Qt6::Gui Qt6::Network
|
||||||
)
|
)
|
||||||
|
|
||||||
if(Qt6WebEngineQuick_FOUND)
|
if(Qt6WebEngineQuick_FOUND)
|
||||||
target_link_libraries(appMinecraft_launcher PRIVATE Qt6::WebEngineQuick)
|
target_link_libraries(BiLauncher PRIVATE Qt6::WebEngineQuick)
|
||||||
target_compile_definitions(appMinecraft_launcher PRIVATE LAUNCHER_HAS_WEBENGINE)
|
target_compile_definitions(BiLauncher PRIVATE LAUNCHER_HAS_WEBENGINE)
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
include(GNUInstallDirs)
|
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)
|
if(UNIX AND NOT APPLE)
|
||||||
set(LAUNCHER_ZLIB_DIR "${CMAKE_INSTALL_LIBDIR}/galeonLauncher")
|
set(LAUNCHER_ZLIB_DIR "${CMAKE_INSTALL_LIBDIR}/galeonLauncher")
|
||||||
set(LAUNCHER_ZLIB_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/zlib")
|
set(LAUNCHER_ZLIB_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}/zlib")
|
||||||
@@ -153,28 +175,37 @@ if(UNIX AND NOT APPLE)
|
|||||||
${LAUNCHER_ZLIB_SOURCES}/zutil.c
|
${LAUNCHER_ZLIB_SOURCES}/zutil.c
|
||||||
)
|
)
|
||||||
target_include_directories(launcher_zlib_reference PRIVATE ${LAUNCHER_ZLIB_SOURCES})
|
target_include_directories(launcher_zlib_reference PRIVATE ${LAUNCHER_ZLIB_SOURCES})
|
||||||
# То же, что выставляет собственный configure zlib: без этого gz*-часть не
|
|
||||||
# видит unistd.h и не собирается.
|
|
||||||
target_compile_definitions(launcher_zlib_reference PRIVATE
|
target_compile_definitions(launcher_zlib_reference PRIVATE
|
||||||
HAVE_UNISTD_H=1 HAVE_STDARG_H=1 _LARGEFILE64_SOURCE=1)
|
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
|
set_target_properties(launcher_zlib_reference PROPERTIES
|
||||||
OUTPUT_NAME z
|
OUTPUT_NAME z
|
||||||
VERSION 1.3.1
|
VERSION 1.3.1
|
||||||
SOVERSION 1
|
SOVERSION 1
|
||||||
C_VISIBILITY_PRESET default
|
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"
|
LAUNCHER_ZLIB_INSTALL_DIR="${CMAKE_INSTALL_FULL_LIBDIR}/galeonLauncher"
|
||||||
)
|
)
|
||||||
install(TARGETS launcher_zlib_reference LIBRARY DESTINATION ${LAUNCHER_ZLIB_DIR})
|
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()
|
endif()
|
||||||
|
|
||||||
install(TARGETS appMinecraft_launcher
|
install(TARGETS BiLauncher
|
||||||
BUNDLE DESTINATION .
|
BUNDLE DESTINATION .
|
||||||
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}
|
||||||
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
RUNTIME DESTINATION ${CMAKE_INSTALL_BINDIR}
|
||||||
|
|||||||
@@ -87,10 +87,8 @@ Window {
|
|||||||
// ── Background ─────────────────────────────────────────────────────────
|
// ── Background ─────────────────────────────────────────────────────────
|
||||||
Image {
|
Image {
|
||||||
id: image
|
id: image
|
||||||
opacity: 0.296
|
|
||||||
anchors.fill: parent
|
anchors.fill: parent
|
||||||
source: "images/GovuztTW8AAHqBf.jpeg"
|
source: "images/launcherBackground.png"
|
||||||
fillMode: Image.Stretch
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// ── Status toast ───────────────────────────────────────────────────────
|
// ── Status toast ───────────────────────────────────────────────────────
|
||||||
|
|||||||
@@ -32,20 +32,20 @@
|
|||||||
},
|
},
|
||||||
"strings": {
|
"strings": {
|
||||||
"app.title": {
|
"app.title": {
|
||||||
"ru": "Minecraft Launcher",
|
"ru": "BiLauncher",
|
||||||
"en": "Minecraft Launcher"
|
"en": "BiLauncher"
|
||||||
},
|
},
|
||||||
"app.tooltip.openMods": {
|
"app.tooltip.openMods": {
|
||||||
"ru": "Открыть папку с модами Minecraft",
|
"ru": "Открыть папку с модами",
|
||||||
"en": "Open the Minecraft mods folder"
|
"en": "Open mods folder"
|
||||||
},
|
},
|
||||||
"app.tooltip.seasonal": {
|
"app.tooltip.seasonal": {
|
||||||
"ru": "Готовые сборки с сервера: моды, конфиги и Java одной кнопкой",
|
"ru": "Сезонные сборки от команды Мельника",
|
||||||
"en": "Ready-made builds from the server: mods, configs and Java in one click"
|
"en": "Seasonal builds from Galeon team"
|
||||||
},
|
},
|
||||||
"app.tooltip.settings": {
|
"app.tooltip.settings": {
|
||||||
"ru": "Настройки запуска: Java, память, папка игры",
|
"ru": "Настройки запуска",
|
||||||
"en": "Launch settings: Java, memory, game folder"
|
"en": "Launch settings"
|
||||||
},
|
},
|
||||||
"auth.ely.error.enterCode": {
|
"auth.ely.error.enterCode": {
|
||||||
"ru": "Введите код двухфакторной аутентификации",
|
"ru": "Введите код двухфакторной аутентификации",
|
||||||
|
|||||||
@@ -0,0 +1,11 @@
|
|||||||
|
[Desktop Entry]
|
||||||
|
Type=Application
|
||||||
|
Version=1.0
|
||||||
|
Name=BiLauncher
|
||||||
|
GenericName=Minecraft Launcher
|
||||||
|
Comment=Launcher for Minecraft
|
||||||
|
Exec=BiLauncher
|
||||||
|
Icon=bilauncher
|
||||||
|
Terminal=false
|
||||||
|
Categories=Game;ActionGame;
|
||||||
|
StartupNotify=true
|
||||||
|
After Width: | Height: | Size: 409 KiB |
@@ -0,0 +1 @@
|
|||||||
|
IDI_ICON1 ICON "icon.ico"
|
||||||
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 852 B |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 1.5 KiB |
|
After Width: | Height: | Size: 34 KiB |
|
After Width: | Height: | Size: 129 KiB |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 129 KiB |
|
After Width: | Height: | Size: 525 KiB |
|
After Width: | Height: | Size: 5.4 KiB |
|
After Width: | Height: | Size: 534 KiB |
|
After Width: | Height: | Size: 1.3 MiB |
|
After Width: | Height: | Size: 86 KiB |
@@ -1,6 +1,7 @@
|
|||||||
#include "localization.h"
|
#include "localization.h"
|
||||||
|
|
||||||
#include <QGuiApplication>
|
#include <QGuiApplication>
|
||||||
|
#include <QIcon>
|
||||||
#include <QQmlApplicationEngine>
|
#include <QQmlApplicationEngine>
|
||||||
#include <QQuickStyle>
|
#include <QQuickStyle>
|
||||||
|
|
||||||
@@ -19,6 +20,27 @@ int main(int argc, char *argv[])
|
|||||||
|
|
||||||
QGuiApplication app(argc, argv);
|
QGuiApplication app(argc, argv);
|
||||||
|
|
||||||
|
// Иконка окна и панели задач. Отдаём все размеры сразу: оконный менеджер
|
||||||
|
// сам выберет подходящий, а готовый растр всегда чётче, чем полученный
|
||||||
|
// масштабированием одной большой картинки.
|
||||||
|
//
|
||||||
|
// На macOS этого делать нельзя: setWindowIcon подменяет иконку в доке
|
||||||
|
// растром во весь холст, и лаунчер выглядит заметно крупнее соседей. Там
|
||||||
|
// иконку берут из icon.icns внутри бандла — он нарисован по сетке Apple,
|
||||||
|
// с полями вокруг арта.
|
||||||
|
#ifndef Q_OS_MACOS
|
||||||
|
QIcon appIcon;
|
||||||
|
for (int size : {16, 24, 32, 48, 64, 128, 256, 512})
|
||||||
|
appIcon.addFile(QStringLiteral(":/icons/icon_%1x%1.png").arg(size));
|
||||||
|
for (int size : {16, 32, 128, 256, 512})
|
||||||
|
appIcon.addFile(QStringLiteral(":/icons/icon_%1x%1@2x.png").arg(size));
|
||||||
|
QGuiApplication::setWindowIcon(appIcon);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
// На Wayland окно связывается с установленным .desktop-файлом только по
|
||||||
|
// этому имени; без него композитор покажет иконку по умолчанию.
|
||||||
|
QGuiApplication::setDesktopFileName(QStringLiteral("bilauncher"));
|
||||||
|
|
||||||
// Язык интерфейса нужно знать до того, как QML вычислит первую привязку,
|
// Язык интерфейса нужно знать до того, как QML вычислит первую привязку,
|
||||||
// поэтому каталог читается здесь, а не в LauncherBackend: тот появляется
|
// поэтому каталог читается здесь, а не в LauncherBackend: тот появляется
|
||||||
// только вместе с движком. Каталог лежит в ресурсах — не прочитался, значит
|
// только вместе с движком. Каталог лежит в ресурсах — не прочитался, значит
|
||||||
|
|||||||