Skip to content
Draft
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
64 commits
Select commit Hold shift + click to select a range
c838e51
[phase-02] Reach launcher services through LauncherContext
grxtor Sep 22, 2026
0cd4251
[phase-02] Move LaunchController into the UI layer
grxtor Sep 22, 2026
ffa39c5
[phase-02] Ask the user through UiHost instead of building dialogs
grxtor Sep 22, 2026
de53acc
[phase-02] Route the external updater's prompts through UiHost
grxtor Sep 22, 2026
24f7517
[phase-02] Put the last misfiled UI code where it belongs
grxtor Sep 22, 2026
48a2d7e
[phase-02] Add WCAG contrast math for the theme tokens
grxtor Sep 22, 2026
365878e
[phase-03] Split the core into a library that cannot link QtWidgets
grxtor Sep 22, 2026
df08cdc
[phase-08] Open a QML window on the core's real models
grxtor Sep 22, 2026
d6ca191
[phase-06] Define the colour tokens both themes are built from
grxtor Sep 22, 2026
cc983a7
[phase-08] Show instances sorted, grouped and with their icons
grxtor Sep 22, 2026
8a616ff
[phase-07] Add MeshMC.Theme, the single source of design tokens
grxtor Sep 22, 2026
4c46576
[phase-04] Say why a plugin was refused instead of dropping it
grxtor Sep 22, 2026
c314405
[phase-07] Build the main window from the design system
grxtor Sep 22, 2026
42fa46d
[phase-08][BE] Give the QML library the data and actions a launcher n…
grxtor Sep 22, 2026
34edd54
[phase-07][FE] Redesign the library as a real launcher screen
grxtor Sep 22, 2026
7f27cb6
[phase-07][FE] Show the redesigned components in the gallery
grxtor Sep 22, 2026
ec66399
[phase-08][FE] Show the account's skin face in the sidebar
grxtor Sep 22, 2026
53481b5
[phase-09][BE] Let QML read and write launcher settings
grxtor Sep 22, 2026
55948b1
[phase-09][FE] Move launcher settings into the QML shell
grxtor Sep 22, 2026
2702061
[phase-08] Show launch progress on the instance itself
grxtor Sep 22, 2026
cdfb7bf
[phase-09][BE] Search and install Modrinth modpacks without widgets
grxtor Sep 22, 2026
a09f004
[phase-09][BE] Give QML one instance's mods, worlds, screenshots and log
grxtor Sep 22, 2026
782a068
[phase-09][FE] Browse and install Modrinth modpacks in Discover
grxtor Sep 22, 2026
99af996
[phase-09][FE] Open instances in a page of their own
grxtor Sep 22, 2026
70ba29f
[phase-09][BE] List an instance's mods by name
grxtor Sep 22, 2026
6eaedf4
[phase-09][BE] Let QML manage accounts and create instances
grxtor Sep 22, 2026
dce3ea0
[phase-09][FE] Accounts page and a new-instance dialog in QML
grxtor Sep 22, 2026
97b5ec1
[phase-09][BE] Rename, regroup, re-icon, copy and delete instances fr…
grxtor Sep 23, 2026
5199208
[phase-09][FE] Manage instances from the library menu
grxtor Sep 23, 2026
4886303
[phase-09][FE] Send Play without an account to the Accounts page
grxtor Sep 23, 2026
f7cc83c
[phase-04] Plugin ABI 5: plugins describe UI as data
grxtor Sep 23, 2026
bccf0bc
[phase-09][BE] Browse and install content for one instance from QML
grxtor Sep 23, 2026
0ca77da
[phase-09][FE] Add mods, packs and shaders from the instance page
grxtor Sep 23, 2026
63e0cd3
[phase-04] OfflineWiki: the wiki as a settings surface
grxtor Sep 23, 2026
5f52551
[phase-04] NVIDIAPrime, LinuxPerf: settings as surfaces
grxtor Sep 23, 2026
aa2c3e9
[phase-04] GitVersioning: history page and settings as surfaces
grxtor Sep 23, 2026
5a376de
[phase-09][FE] Render plugin surfaces in the QML shell
grxtor Sep 23, 2026
753770a
[phase-04] Plugin SDK without Qt Widgets; ErrorOracle as a surface
grxtor Sep 23, 2026
b6d2c72
[phase-04] Copy instance ids before the next host call
grxtor Sep 23, 2026
ecaf92d
[phase-09] Plugins and the core's questions reach the QML shell
grxtor Sep 23, 2026
8f6efbf
[phase-09] First run in the QML shell: a welcome flow, not a wizard
grxtor Sep 23, 2026
6ba36ab
[phase-07][FE] Rename SearchField to SearchBox
grxtor Sep 23, 2026
e8a6035
[phase-12] Ship Qt's QML modules with every package
grxtor Sep 23, 2026
dd63dff
[phase-10] Extract the QML shell's strings for translation
grxtor Sep 23, 2026
be0f960
[phase-09] Launch without widget dialogs under the QML shell
grxtor Sep 23, 2026
cca2b63
[phase-01] Fix the Linux, macOS arm64 and MinGW CI builds
grxtor Sep 23, 2026
d71c362
[phase-10][FE] Choose the display language in Settings
grxtor Sep 23, 2026
780d0f2
[phase-09][BE] Expose resource, shader and texture packs and proxy se…
grxtor Sep 23, 2026
a7a62b3
[phase-08][FE] Open any QML screen at startup for review snapshots
grxtor Sep 23, 2026
7ab7813
[phase-09][FE] Second design pass of the QML shell
grxtor Sep 23, 2026
ae04656
[phase-04][BE] Fix a crash when a plugin settings surface is torn down
grxtor Sep 23, 2026
93f3c8a
[phase-10][FE] Three colour palettes: Obsidian, Ember and Diamond
grxtor Sep 23, 2026
6b3ab50
[phase-09][FE] Install content in parallel and give the version list …
grxtor Sep 23, 2026
1285350
[phase-09][BE] Keep widget dialogs out of the QML shell
grxtor Sep 23, 2026
f44a7c8
[phase-09][FE] Import instances in the QML new-instance dialog
grxtor Sep 23, 2026
ea43b9d
[phase-10][FE] Remember the chosen colour palette across restarts
grxtor Sep 23, 2026
ce8035d
[phase-09][FE] Skin and cape for Microsoft accounts; proxy, tools and…
grxtor Sep 23, 2026
3bde479
[phase-10][FE] New shell layout: sidebar menus, profile top right, pl…
grxtor Sep 23, 2026
aaf8264
[phase-10][BE] Home page data; scan cover art off the GUI thread; saf…
grxtor Sep 23, 2026
f44cc7f
[phase-10][FE] Home page as the new start page
grxtor Sep 24, 2026
3be7849
[phase-10][FE] Design pass: bundled Inter, readable surfaces, calm co…
grxtor Sep 24, 2026
7cb45a6
[phase-10][FE] Design pass: backgrounds with content, calmer cards an…
grxtor Sep 24, 2026
c41c6e4
[phase-09][FE] Instance page: Version tab, other logs, game options
grxtor Sep 24, 2026
e3cec54
[phase-10][FE] Instance tabs B, grass palette + pixel art, 3D cat, lo…
grxtor Sep 24, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
64 changes: 61 additions & 3 deletions .github/actions/package/linux/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -96,11 +96,39 @@ runs:
)
fi

# Qt's own QML modules (QtQuick, QtQuick.Controls, ...) live in
# $QT_INSTALL_QML, a directory *sibling to* $QT_PLUGIN_PATH -- the
# "$QT_PLUGIN_PATH"/*/*.so glob below never reaches them, so the QML
# shell has nothing to import QtQuick from. Deploy only the modules
# launcher/qml/ actually imports (found with qmlimportscanner)
# rather than the whole Qt QML tree (Quick3D, WebEngine, etc.).
qt_root="$(dirname "${QT_PLUGIN_PATH%/}")"
QT_QML_PATH="$qt_root/qml"
qmlimportscanner_bin="$(find "$qt_root" -name qmlimportscanner -type f | head -1)"
if [[ -z "$qmlimportscanner_bin" ]]; then
echo "::error::qmlimportscanner not found under $qt_root; cannot determine which Qt QML modules to bundle."
exit 1
fi
mapfile -t qml_modules < <(
"$qmlimportscanner_bin" -rootPath launcher/qml -importPath "$QT_QML_PATH" \
| grep -o '"relativePath": *"[^"]*"' | sed -E 's/.*"([^"]*)"$/\1/' | sort -u
)
if [[ ${#qml_modules[@]} -eq 0 ]]; then
echo "::error::qmlimportscanner reported no Qt QML modules for launcher/qml"
exit 1
fi
qml_plugin_libs=()
for m in "${qml_modules[@]}"; do
mkdir -p "$INSTALL_APPIMAGE_DIR/qml/$(dirname "$m")"
cp -a "$QT_QML_PATH/$m" "$INSTALL_APPIMAGE_DIR/qml/$m"
while IFS= read -r -d '' so; do qml_plugin_libs+=("$so"); done < <(find "$QT_QML_PATH/$m" -maxdepth 1 -name '*.so' -print0)
done

sharun lib4bin \
--hard-links \
--with-hooks \
--dst-dir "$INSTALL_APPIMAGE_DIR" \
"$INSTALL_APPIMAGE_DIR"/bin/* "$QT_PLUGIN_PATH"/*/*.so "${openssl_libs[@]}"
"$INSTALL_APPIMAGE_DIR"/bin/* "$QT_PLUGIN_PATH"/*/*.so "${qml_plugin_libs[@]}" "${openssl_libs[@]}"

cp ~/bin/AppImageUpdate.AppImage "$INSTALL_APPIMAGE_DIR"/bin/
# FIXME(@YongDo-Hyun): gamemode doesn't seem to be very portable with DBus. Find a way to make it work!
Expand All @@ -109,7 +137,11 @@ runs:
#disable OpenGL and Vulkan launcher features until https://github.com/VHSgunzo/sharun/issues/35
echo "LAUNCHER_DISABLE_GLVULKAN=1" > "$INSTALL_APPIMAGE_DIR"/.env
#makes the launcher use portals for file picking
echo "QT_QPA_PLATFORMTHEME=xdgdesktopportal" > "$INSTALL_APPIMAGE_DIR"/.env
echo "QT_QPA_PLATFORMTHEME=xdgdesktopportal" >> "$INSTALL_APPIMAGE_DIR"/.env
#points Qt at the QML modules copied in above (AppDir-relative; $APPDIR
#is exported by the AppImage runtime before AppRun/sharun ever runs)
echo "QML2_IMPORT_PATH=\$APPDIR/qml" >> "$INSTALL_APPIMAGE_DIR"/.env
echo "QML_IMPORT_PATH=\$APPDIR/qml" >> "$INSTALL_APPIMAGE_DIR"/.env
ln -s org.projecttick.MeshMC.metainfo.xml "$INSTALL_APPIMAGE_DIR"/share/metainfo/org.projecttick.MeshMC.appdata.xml
ln -s share/applications/org.projecttick.MeshMC.desktop "$INSTALL_APPIMAGE_DIR"
ln -s share/icons/hicolor/256x256/apps/org.projecttick.MeshMC.png "$INSTALL_APPIMAGE_DIR"
Expand Down Expand Up @@ -147,11 +179,37 @@ runs:
)
fi

# See the QML deployment comment in the AppImage step above: Qt's own
# QML modules live beside $QT_PLUGIN_PATH, not under it, and the
# portable tarball needs them too (launcher/MeshMC.in points Qt at
# the copy made here via QML2_IMPORT_PATH/QML_IMPORT_PATH).
qt_root="$(dirname "${QT_PLUGIN_PATH%/}")"
QT_QML_PATH="$qt_root/qml"
qmlimportscanner_bin="$(find "$qt_root" -name qmlimportscanner -type f | head -1)"
if [[ -z "$qmlimportscanner_bin" ]]; then
echo "::error::qmlimportscanner not found under $qt_root; cannot determine which Qt QML modules to bundle."
exit 1
fi
mapfile -t qml_modules < <(
"$qmlimportscanner_bin" -rootPath launcher/qml -importPath "$QT_QML_PATH" \
| grep -o '"relativePath": *"[^"]*"' | sed -E 's/.*"([^"]*)"$/\1/' | sort -u
)
if [[ ${#qml_modules[@]} -eq 0 ]]; then
echo "::error::qmlimportscanner reported no Qt QML modules for launcher/qml"
exit 1
fi
qml_plugin_libs=()
for m in "${qml_modules[@]}"; do
mkdir -p "$INSTALL_PORTABLE_DIR/qml/$(dirname "$m")"
cp -a "$QT_QML_PATH/$m" "$INSTALL_PORTABLE_DIR/qml/$m"
while IFS= read -r -d '' so; do qml_plugin_libs+=("$so"); done < <(find "$QT_QML_PATH/$m" -maxdepth 1 -name '*.so' -print0)
done

sharun lib4bin \
--with-hooks \
--hard-links \
--dst-dir "$INSTALL_PORTABLE_DIR" \
"$INSTALL_PORTABLE_DIR"/bin/* "$QT_PLUGIN_PATH"/*/*.so "${openssl_libs[@]}"
"$INSTALL_PORTABLE_DIR"/bin/* "$QT_PLUGIN_PATH"/*/*.so "${qml_plugin_libs[@]}" "${openssl_libs[@]}"

# FIXME(@YongDo-Hyun): gamemode doesn't seem to be very portable with DBus. Find a way to make it work!
find "$INSTALL_PORTABLE_DIR" -name '*gamemode*' -exec rm {} +
Expand Down
7 changes: 6 additions & 1 deletion .github/actions/setup-dependencies/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,12 @@ runs:
with:
aqtversion: "==3.1.*"
version: ${{ inputs.qt-version }}
modules: qtimageformats qtnetworkauth
# qtquick3d is the optional 3D cat companion's only extra Qt
# dependency (see launcher/qml/Cat/CMakeLists.txt); qtshadertools is
# listed alongside it because Quick3D bakes its shader variants
# through it at runtime, not only at build time, so it has to be
# present even though nothing here compiles a shader directly.
modules: qtimageformats qtnetworkauth qtquick3d qtshadertools
cache: ${{ inputs.build-type == 'Debug' }}

- name: Setup bundled OpenSSL
Expand Down
3 changes: 3 additions & 0 deletions .github/actions/setup-dependencies/windows/action.yml
Original file line number Diff line number Diff line change
Expand Up @@ -56,6 +56,9 @@ runs:
cmake:p
ninja:p
qt${{ inputs.qt-major }}-base:p
qt${{ inputs.qt-major }}-declarative:p
qt${{ inputs.qt-major }}-quick3d:p
qt${{ inputs.qt-major }}-shadertools:p
qt${{ inputs.qt-major }}-svg:p
qt${{ inputs.qt-major }}-imageformats:p
qt${{ inputs.qt-major }}-networkauth:p
Expand Down
46 changes: 46 additions & 0 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,11 @@ set(QT_VERSION_MAJOR 6)
# Still a cache variable so that scripts and CI invocations that pass
# -DMeshMC_QT_VERSION_MAJOR=5 fail loudly instead of quietly building Qt 6 when
# they asked for something else.
# The QML user interface is always built; this only picks which interface the
# launcher opens by default. MESHMC_QML_UI=1 or =0 in the environment overrides
# it at run time.
option(MeshMC_QML_UI "Open the QML user interface instead of the QtWidgets one by default (preview)" OFF)

set(MeshMC_QT_VERSION_MAJOR "6" CACHE STRING "Major Qt version to build against (6 only)")
set_property(CACHE MeshMC_QT_VERSION_MAJOR PROPERTY STRINGS "6")

Expand Down Expand Up @@ -210,6 +215,21 @@ endif()
message(STATUS "Building against Qt ${_projt_qt_version} (major version ${QT_VERSION_MAJOR})")
unset(_projt_qt_version)

# Qt Quick 3D, for the optional roaming cat companion (launcher/qml/Cat/) --
# never added to MeshMC_QT_COMPONENTS above: unlike everything there, the
# 6.4 floor must keep building without it, so it is looked for but not
# required. MeshMC_ENABLE_CAT defaults to whatever was found, and is the one
# switch that decides whether launcher/qml/CMakeLists.txt descends into
# Cat/ at all; turning it OFF by hand skips the cat even when Quick3D is
# present, but it can never turn ON what was not found.
find_package(Qt${QT_VERSION_MAJOR} OPTIONAL_COMPONENTS Quick3D)
option(MeshMC_ENABLE_CAT "Build the roaming 3D cat companion (needs Qt Quick 3D)" ${Qt${QT_VERSION_MAJOR}Quick3D_FOUND})
if(MeshMC_ENABLE_CAT AND NOT Qt${QT_VERSION_MAJOR}Quick3D_FOUND)
message(WARNING "MeshMC_ENABLE_CAT is ON but Qt Quick3D was not found; building without the cat.")
set(MeshMC_ENABLE_CAT OFF)
endif()
message(STATUS "Cat companion (Qt Quick3D): ${MeshMC_ENABLE_CAT}")

if(UNIX)
find_package(PkgConfig)
if(PkgConfig_FOUND)
Expand All @@ -226,6 +246,11 @@ include(QMakeQuery)
QUERY_QMAKE(QT_INSTALL_PLUGINS QT_PLUGINS_DIR)
QUERY_QMAKE(QT_INSTALL_LIBS QT_LIBS_DIR)
QUERY_QMAKE(QT_INSTALL_LIBEXECS QT_LIBEXECS_DIR)
# Where Qt's own QML modules (QtQuick, QtQuick.Controls, ...) live in the Qt
# installation used for the build. Needed at packaging time: our own QML
# modules are compiled into the launcher, but Qt's are not, and have to be
# deployed and pointed at explicitly (see launcher/CMakeLists.txt).
QUERY_QMAKE(QT_INSTALL_QML QT_QML_DIR)

# Map missing multi-config configurations to available ones.
# Monorepo libraries are built with single-config (Ninja), but MeshMC uses
Expand Down Expand Up @@ -509,6 +534,18 @@ if(UNIX AND APPLE)
set(PLUGIN_DEST_DIR "${MeshMC_Name}.app/Contents/MacOS")
set(RESOURCES_DEST_DIR "${MeshMC_Name}.app/Contents/Resources")
set(JARS_DEST_DIR "${MeshMC_Name}.app/Contents/Resources/jars")
# Where Qt's own QML modules land inside the bundle. Contents/Resources
# (rather than next to PLUGIN_DEST_DIR in Contents/MacOS) so it matches
# what qt.conf's QmlImports key below is written relative to.
set(QML_DEST_DIR "${MeshMC_Name}.app/Contents/Resources/qml")
# qt.conf's [Paths] entries are, on macOS, resolved relative to the
# bundle's Contents/ directory (verified empirically: a value of
# "Foo.app/Contents/MacOS" written into Contents/Resources/qt.conf came
# out as Contents/Foo.app/Contents/MacOS, one "Contents/" too many) --
# not relative to CMAKE_INSTALL_PREFIX like PLUGIN_DEST_DIR/QML_DEST_DIR
# (used for actual install() DESTINATION arguments) have to be.
set(QT_CONF_PLUGINS_DEST "MacOS")
set(QT_CONF_QML_DEST "Resources/qml")
set(BUNDLE_DEST_DIR ".")
set(MMCO_MODULES_DEST_DIR
"${MeshMC_Name}.app/Contents/Resources/mmcmodules")
Expand Down Expand Up @@ -622,6 +659,15 @@ elseif(WIN32)
set(PLUGIN_DEST_DIR ".")
set(FRAMEWORK_DEST_DIR ".")
set(RESOURCES_DEST_DIR ".")
# windeployqt's own default destination for the Qt QML modules it deploys
# (see the --qmldir call in launcher/CMakeLists.txt); qt.conf's
# QmlImports key below points here too.
set(QML_DEST_DIR "qml")
# On Windows qt.conf's [Paths] entries are relative to qt.conf's own
# directory (RESOURCES_DEST_DIR, "."), same as PLUGIN_DEST_DIR/QML_DEST_DIR
# already are -- no bundle-style adjustment needed here.
set(QT_CONF_PLUGINS_DEST "${PLUGIN_DEST_DIR}")
set(QT_CONF_QML_DEST "${QML_DEST_DIR}")
set(JARS_DEST_DIR "jars")
# Windows keeps the flat layout it has always used: .mmco files
# next to meshmc.exe under <install>/mmcmodules. Variable exists
Expand Down
2 changes: 2 additions & 0 deletions branding/win_install.nsi.in
Original file line number Diff line number Diff line change
Expand Up @@ -384,6 +384,7 @@ Section "@MeshMC_DisplayName@"
File /r "imageformats"
File /r "jars"
File /r "platforms"
File /r "qml"
File /r "styles"
File /nonfatal /r "tls"

Expand Down Expand Up @@ -485,6 +486,7 @@ Section "Uninstall"
RMDir /r $INSTDIR\imageformats
RMDir /r $INSTDIR\jars
RMDir /r $INSTDIR\platforms
RMDir /r $INSTDIR\qml
RMDir /r $INSTDIR\styles
RMDir /r $INSTDIR\tls

Expand Down
Loading
Loading