Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
105 commits
Select commit Hold shift + click to select a range
abb8f3a
fix(database): use named connection for game mutations
mohammedmk3900-rgb Oct 8, 2026
15529bf
fix(ui): load bundled sidebar icons from correct resource path
mohammedmk3900-rgb Oct 8, 2026
05a655f
fix(ui): load add-game icons from correct resource path
mohammedmk3900-rgb Oct 8, 2026
1ac5327
fix(model): use named database connection for launch options
mohammedmk3900-rgb Oct 8, 2026
eb761f7
fix(i18n): remove misleading product and cloud-backup labels
mohammedmk3900-rgb Oct 8, 2026
39a763f
feat(branding): adopt canonical VoidOne website mark
mohammedmk3900-rgb Oct 8, 2026
6915f36
fix(branding): register canonical VoidOne mark as app resource
mohammedmk3900-rgb Oct 8, 2026
6529202
fix(branding): use canonical VoidOne mark for application icon
mohammedmk3900-rgb Oct 8, 2026
939fc1f
fix(ui): use canonical VoidOne mark in game cards
mohammedmk3900-rgb Oct 8, 2026
33f63d5
fix(ui): use canonical VoidOne mark in sidebar
mohammedmk3900-rgb Oct 8, 2026
426e621
chore(build): remove unused branding path variable
mohammedmk3900-rgb Oct 8, 2026
e5a89ed
fix(branding): enable SVG support for canonical app mark
mohammedmk3900-rgb Oct 8, 2026
2e0a8d3
ui(beta.2): refine balanced dashboard layout
mohammedmk3900-rgb Oct 9, 2026
de3ddf1
ui(beta.2): show game icons with lightweight cards
mohammedmk3900-rgb Oct 9, 2026
fc26c8f
ui(beta.2): tighten sidebar spacing
mohammedmk3900-rgb Oct 9, 2026
82e2abf
ui(beta.2): prevent hero overlap at narrow widths
mohammedmk3900-rgb Oct 9, 2026
2381e04
Merge pull request #49 from VoidOne-App/ui/beta2-balanced-dashboard
mohammedmk3900-rgb Oct 9, 2026
e364fea
fix(database): include complete QSqlError type
mohammedmk3900-rgb Oct 10, 2026
8f9bd56
ui(beta.2): use the original VoidOne mark in the shell
mohammedmk3900-rgb Oct 10, 2026
93fb058
ui(beta.2): make the library empty state actionable
mohammedmk3900-rgb Oct 10, 2026
323e674
ui(beta.2): use the original mark in game details
mohammedmk3900-rgb Oct 10, 2026
5a533a5
ui(beta.2): align settings page with shared layout
mohammedmk3900-rgb Oct 10, 2026
d4ec31c
ui(beta.2): unify save backup accent colors
mohammedmk3900-rgb Oct 10, 2026
cfb9a09
fix(library): extract and cache executable icons
mohammedmk3900-rgb Oct 10, 2026
180af4a
feat(settings): polish save backup controls and folder picking
mohammedmk3900-rgb Oct 10, 2026
38dc6b8
feat(ui): organize settings into functional sections
mohammedmk3900-rgb Oct 10, 2026
d5b30cd
fix(ui): center compact navigation icons
mohammedmk3900-rgb Oct 10, 2026
fb75d46
fix(library): cache native Windows executable icons
mohammedmk3900-rgb Oct 10, 2026
0c2a642
build(windows): link shell icon extraction API
mohammedmk3900-rgb Oct 10, 2026
0b3d35f
fix(settings): keep backup form responsive and validate auto-save
mohammedmk3900-rgb Oct 10, 2026
d1109a4
fix(settings): clarify language scope
mohammedmk3900-rgb Oct 10, 2026
15f3a55
fix(settings): sync backup controls with manager state
mohammedmk3900-rgb Oct 10, 2026
74b810d
feat(settings): expose persisted backup paths
mohammedmk3900-rgb Oct 10, 2026
c5cf61d
feat(settings): persist backup preferences across restarts
mohammedmk3900-rgb Oct 10, 2026
788337c
feat(settings): restore saved backup paths on startup
mohammedmk3900-rgb Oct 10, 2026
cf8f310
fix(settings): confirm before replacing game saves
mohammedmk3900-rgb Oct 10, 2026
33a2fa3
build(core): link Qt Gui for icon cache
mohammedmk3900-rgb Oct 10, 2026
935aa01
chore(core): tidy icon cache includes
mohammedmk3900-rgb Oct 10, 2026
ab14202
polish(ui): add settings scrollbar and responsive copy
mohammedmk3900-rgb Oct 10, 2026
b9fdcbc
feat(settings): remember backup panel language
mohammedmk3900-rgb Oct 10, 2026
b4526e1
fix(settings): persist paths before backup actions
mohammedmk3900-rgb Oct 10, 2026
e0b99bf
feat(library): add real favorites and recently played filters
mohammedmk3900-rgb Oct 10, 2026
e1a1d74
feat(library): implement favorites and recent filters
mohammedmk3900-rgb Oct 10, 2026
7a82a41
redesign(library): make game cards gamer-first and icon-led
mohammedmk3900-rgb Oct 10, 2026
49807b2
redesign(ui): unify gamer-first home, library, and activity
mohammedmk3900-rgb Oct 10, 2026
2da3a6b
redesign(details): show the actual game icon in details
mohammedmk3900-rgb Oct 10, 2026
8870ccd
redesign(settings): group real preferences by purpose
mohammedmk3900-rgb Oct 10, 2026
1432afe
polish(add-game): make drag-and-drop target discoverable
mohammedmk3900-rgb Oct 10, 2026
53bd070
polish(library): surface real recent-play metadata
mohammedmk3900-rgb Oct 10, 2026
eb78f55
polish(ui): add timestamps to activity and organize settings
mohammedmk3900-rgb Oct 10, 2026
40a2e8b
polish(navigation): use product branding instead of placeholder initials
mohammedmk3900-rgb Oct 10, 2026
6ac49f2
fix(settings): correct section hierarchy
mohammedmk3900-rgb Oct 10, 2026
aba133e
polish(navigation): replace placeholder initials with VoidOne mark
mohammedmk3900-rgb Oct 10, 2026
6b76285
polish(navigation): add scroll affordances to game grids
mohammedmk3900-rgb Oct 10, 2026
4e0ecea
fix(launch): return the actual launch result
mohammedmk3900-rgb Oct 10, 2026
f8b6081
fix(launch): report failure instead of fake success
mohammedmk3900-rgb Oct 10, 2026
a4736fd
fix(ux): show the real result of game launch attempts
mohammedmk3900-rgb Oct 10, 2026
07b87fc
fix(details): report actual game launch results
mohammedmk3900-rgb Oct 10, 2026
9341395
fix(add-game): avoid selecting stale scan results
mohammedmk3900-rgb Oct 10, 2026
9181b2e
fix(details): open install folders with native file URLs
mohammedmk3900-rgb Oct 10, 2026
0daf18f
redesign(details): unify tabs and secondary actions with VoidOne theme
mohammedmk3900-rgb Oct 10, 2026
add1cba
polish(details): theme launch fields and secondary actions
mohammedmk3900-rgb Oct 10, 2026
d7c9a0c
feat(settings): remember sidebar and library view preferences
mohammedmk3900-rgb Oct 10, 2026
5071a40
chore(ui): stop packaging fake unused music and telemetry widgets
mohammedmk3900-rgb Oct 10, 2026
1b184f0
polish(add-game): style cancel action consistently
mohammedmk3900-rgb Oct 10, 2026
ee24d96
polish(shell): align local-first status with cyan brand
mohammedmk3900-rgb Oct 10, 2026
a24f44a
fix(layout): overlay empty states correctly on game grids
mohammedmk3900-rgb Oct 10, 2026
5921b36
fix(ui): guard initial page filter before search is ready
mohammedmk3900-rgb Oct 10, 2026
8738ece
feat(ux): add keyboard shortcuts for power users
mohammedmk3900-rgb Oct 10, 2026
a251cd5
fix(ux): use predictable numeric shortcut for settings
mohammedmk3900-rgb Oct 10, 2026
af76353
fix(beta.2): repair Qt resources and Steam game launching
mohammedmk3900-rgb Oct 10, 2026
2e3e798
fix(beta.2): repair Qt resources and Steam game launching
mohammedmk3900-rgb Oct 10, 2026
0bb9c29
fix(beta.2): repair Qt resources and Steam game launching
mohammedmk3900-rgb Oct 10, 2026
e990a4d
fix(beta.2): repair Qt resources and Steam game launching
mohammedmk3900-rgb Oct 10, 2026
4eca656
fix(beta.2): repair Qt resources and Steam game launching
mohammedmk3900-rgb Oct 10, 2026
1162ccb
fix(beta.2): repair Qt resources and Steam game launching
mohammedmk3900-rgb Oct 10, 2026
4b7e7c9
fix(beta.2): repair Qt resources and Steam game launching
mohammedmk3900-rgb Oct 10, 2026
df41bb8
fix(beta.2): repair Qt resources and Steam game launching
mohammedmk3900-rgb Oct 10, 2026
a388c0b
fix(beta.2): repair Qt resources and Steam game launching
mohammedmk3900-rgb Oct 10, 2026
6a7695c
fix(beta.2): repair Qt resources and Steam game launching
mohammedmk3900-rgb Oct 10, 2026
16a719e
fix(beta.2): update favorites without resetting the clicked card
mohammedmk3900-rgb Oct 10, 2026
8153e3d
feat(beta.2): expose safe game executable path editing
mohammedmk3900-rgb Oct 10, 2026
1fb4dd3
feat(beta.2): support editing game executable paths
mohammedmk3900-rgb Oct 10, 2026
5e7e450
feat(beta.2): add safe remove-by-id for path management
mohammedmk3900-rgb Oct 10, 2026
e4f5c7a
feat(beta.2): add safe remove-by-id for path management
mohammedmk3900-rgb Oct 10, 2026
18fe9f7
feat(beta.2): add visible app menu and game path manager
mohammedmk3900-rgb Oct 10, 2026
610d14e
fix(beta.2): make folder selection and executable naming reliable
mohammedmk3900-rgb Oct 10, 2026
af1dc1c
fix(beta.2): scan deeper for game executables in selected folders
mohammedmk3900-rgb Oct 10, 2026
2ec0660
fix(beta.2): validate folder picker results before scanning
mohammedmk3900-rgb Oct 10, 2026
9d01d76
fix(beta.2): use the qualified Qt Quick file dialog enum
mohammedmk3900-rgb Oct 10, 2026
73c06ce
feat(ui): add cyan gamepad SVG icon
mohammedmk3900-rgb Oct 10, 2026
89df9d8
feat(ui): add cyan play SVG icon
mohammedmk3900-rgb Oct 10, 2026
d4c1898
feat(ui): add cyan clock SVG icon
mohammedmk3900-rgb Oct 10, 2026
31f87fa
feat(ui): add cyan shield SVG icon
mohammedmk3900-rgb Oct 10, 2026
0685e32
feat(ui): add restrained animated ambient backdrop
mohammedmk3900-rgb Oct 10, 2026
9f4c9e2
feat(ui): add reusable animated SVG icon component
mohammedmk3900-rgb Oct 10, 2026
1fabee5
build(ui): package animated backdrop and SVG icon assets
mohammedmk3900-rgb Oct 10, 2026
789d1bb
feat(ui): integrate subtle animated ambient backdrop
mohammedmk3900-rgb Oct 10, 2026
be1bada
feat(ui): animate sidebar SVG icons on hover
mohammedmk3900-rgb Oct 10, 2026
b802971
feat(ui): add cyan favorites SVG icon
mohammedmk3900-rgb Oct 10, 2026
dcbc3c4
feat(ui): add cyan scan SVG icon
mohammedmk3900-rgb Oct 10, 2026
3500321
feat(ui): add cyan settings sliders SVG icon
mohammedmk3900-rgb Oct 10, 2026
1516343
feat(ui): add cyan accent spark SVG icon
mohammedmk3900-rgb Oct 10, 2026
d358df1
build(ui): package additional favorites, scan and settings SVGs
mohammedmk3900-rgb Oct 10, 2026
f7b7062
feat(ui): add smooth hover motion to game artwork
mohammedmk3900-rgb Oct 10, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 15 additions & 6 deletions CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -87,7 +87,7 @@ set(VOIDONE_VERSION_DISPLAY "${VOIDONE_VERSION_INPUT}")
configure_file("${CMAKE_CURRENT_SOURCE_DIR}/cmake/VoidOneVersion.h.in"
"${VOIDONE_GENERATED_DIR}/VoidOneVersion.h" @ONLY)

find_package(Qt6 6.11.2 REQUIRED COMPONENTS Core Gui Quick Sql Network)
find_package(Qt6 6.11.2 REQUIRED COMPONENTS Core Gui Quick Sql Network Svg)
if(VOIDONE_BUILD_TESTS)
find_package(Qt6 6.11.2 REQUIRED COMPONENTS Test)
endif()
Expand Down Expand Up @@ -144,7 +144,7 @@ target_include_directories(voidone_core PUBLIC
"${CMAKE_CURRENT_SOURCE_DIR}/src/core"
"${VOIDONE_GENERATED_DIR}"
)
target_link_libraries(voidone_core PUBLIC Qt6::Core Qt6::Sql Qt6::Network)
target_link_libraries(voidone_core PUBLIC Qt6::Core Qt6::Gui Qt6::Sql Qt6::Network)
target_precompile_headers(voidone_core PRIVATE <QObject> <QString> <QList> <memory> <vector> <string>)
voidone_apply_compile_policy(voidone_core)

Expand All @@ -169,23 +169,32 @@ qt_add_qml_module(VoidOne
src/ui/qml/SaveBackupView.qml
src/ui/qml/SidebarButton.qml
src/ui/qml/EnterpriseDialog.qml
src/ui/qml/MusicControllerWidget.qml
src/ui/qml/SystemTelemetryWidget.qml
src/ui/qml/AddGameDialog.qml
src/ui/qml/ActionButton.qml
src/ui/qml/GameDetailsDialog.qml
src/ui/qml/AmbientBackdrop.qml
src/ui/qml/AnimatedIcon.qml
RESOURCES
assets/branding/voidone-mark.svg
assets/ui/icons/home.svg
assets/ui/icons/library.svg
assets/ui/icons/activity.svg
assets/ui/icons/settings.svg
assets/ui/icons/add.svg
assets/ui/icons/folder.svg
assets/ui/icons/file.svg
assets/ui/icons/gamepad.svg
assets/ui/icons/play.svg
assets/ui/icons/clock.svg
assets/ui/icons/shield.svg
assets/ui/icons/heart.svg
assets/ui/icons/scan.svg
assets/ui/icons/sliders.svg
assets/ui/icons/spark.svg
)
target_link_libraries(VoidOne PRIVATE voidone_core Qt6::Gui Qt6::Quick)
target_link_libraries(VoidOne PRIVATE voidone_core Qt6::Gui Qt6::Quick Qt6::Svg)
if(WIN32)
target_link_libraries(VoidOne PRIVATE Dbghelp)
target_link_libraries(VoidOne PRIVATE Dbghelp Shell32)
endif()
voidone_apply_compile_policy(VoidOne)

Expand Down
8 changes: 8 additions & 0 deletions assets/branding/voidone-mark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/ui/icons/clock.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/ui/icons/gamepad.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/ui/icons/heart.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/ui/icons/play.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/ui/icons/scan.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/ui/icons/shield.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/ui/icons/sliders.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
1 change: 1 addition & 0 deletions assets/ui/icons/spark.svg
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
23 changes: 14 additions & 9 deletions src/core/Database.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ bool prepareSchema(const QSqlDatabase &db)
"source TEXT NOT NULL DEFAULT 'Custom', "
"working_dir TEXT, launch_args TEXT, "
"play_seconds INTEGER NOT NULL DEFAULT 0, play_count INTEGER NOT NULL DEFAULT 0, "
"last_played INTEGER NOT NULL DEFAULT 0, favorite INTEGER NOT NULL DEFAULT 0, hidden INTEGER NOT NULL DEFAULT 0"
"last_played INTEGER NOT NULL DEFAULT 0, favorite INTEGER NOT NULL DEFAULT 0, hidden INTEGER NOT NULL DEFAULT 0, "
"steam_app_id INTEGER NOT NULL DEFAULT 0"
")")) {
qCritical() << "[Database] Schema creation failed:" << schema.lastError().text();
return false;
Expand All @@ -88,7 +89,8 @@ bool prepareSchema(const QSqlDatabase &db)
"ALTER TABLE games ADD COLUMN play_count INTEGER NOT NULL DEFAULT 0",
"ALTER TABLE games ADD COLUMN last_played INTEGER NOT NULL DEFAULT 0",
"ALTER TABLE games ADD COLUMN favorite INTEGER NOT NULL DEFAULT 0",
"ALTER TABLE games ADD COLUMN hidden INTEGER NOT NULL DEFAULT 0"
"ALTER TABLE games ADD COLUMN hidden INTEGER NOT NULL DEFAULT 0",
"ALTER TABLE games ADD COLUMN steam_app_id INTEGER NOT NULL DEFAULT 0"
};
for (const QString &migration : migrations) {
QSqlQuery migrate(db);
Expand Down Expand Up @@ -165,17 +167,18 @@ bool Database::addGame(const GameRecord &game)

QSqlQuery query(db);
query.prepare(
"INSERT INTO games (name, exe_path, icon_path, platform, source, working_dir, launch_args) "
"VALUES (:name, :exe_path, :icon_path, :platform, :source, :working_dir, :launch_args) "
"INSERT INTO games (name, exe_path, icon_path, platform, source, working_dir, launch_args, steam_app_id) "
"VALUES (:name, :exe_path, :icon_path, :platform, :source, :working_dir, :launch_args, :steam_app_id) "
"ON CONFLICT(exe_path) DO UPDATE SET "
"name=excluded.name, icon_path=excluded.icon_path, platform=excluded.platform, source=excluded.source, working_dir=excluded.working_dir, launch_args=excluded.launch_args");
"name=excluded.name, icon_path=excluded.icon_path, platform=excluded.platform, source=excluded.source, working_dir=excluded.working_dir, launch_args=excluded.launch_args, steam_app_id=excluded.steam_app_id");
query.bindValue(":name", game.name.trimmed());
query.bindValue(":exe_path", game.exePath.trimmed());
query.bindValue(":icon_path", game.iconPath.trimmed());
query.bindValue(":platform", game.platform.trimmed().isEmpty() ? QStringLiteral("Custom") : game.platform.trimmed());
query.bindValue(":source", game.source.trimmed().isEmpty() ? QStringLiteral("Custom") : game.source.trimmed());
query.bindValue(":working_dir", game.workingDir.trimmed().isEmpty() ? QFileInfo(game.exePath).absolutePath() : game.workingDir.trimmed());
query.bindValue(":launch_args", game.launchArgs);
query.bindValue(":steam_app_id", game.steamAppId);

if (!query.exec()) {
qWarning() << "[Database] Insert/update failed:" << query.lastError().text();
Expand All @@ -202,10 +205,10 @@ bool Database::addGamesBatch(const QVector<GameRecord> &games)

QSqlQuery query(db);
query.prepare(
"INSERT INTO games (name, exe_path, icon_path, platform, source, working_dir, launch_args) "
"VALUES (:name, :exe_path, :icon_path, :platform, :source, :working_dir, :launch_args) "
"INSERT INTO games (name, exe_path, icon_path, platform, source, working_dir, launch_args, steam_app_id) "
"VALUES (:name, :exe_path, :icon_path, :platform, :source, :working_dir, :launch_args, :steam_app_id) "
"ON CONFLICT(exe_path) DO UPDATE SET "
"name=excluded.name, icon_path=excluded.icon_path, platform=excluded.platform, source=excluded.source, working_dir=excluded.working_dir, launch_args=excluded.launch_args");
"name=excluded.name, icon_path=excluded.icon_path, platform=excluded.platform, source=excluded.source, working_dir=excluded.working_dir, launch_args=excluded.launch_args, steam_app_id=excluded.steam_app_id");

for (const auto &game : games) {
if (game.name.trimmed().isEmpty() || game.exePath.trimmed().isEmpty()) {
Expand All @@ -221,6 +224,7 @@ bool Database::addGamesBatch(const QVector<GameRecord> &games)
query.bindValue(":source", game.source.trimmed().isEmpty() ? QStringLiteral("Custom") : game.source.trimmed());
query.bindValue(":working_dir", game.workingDir.trimmed().isEmpty() ? QFileInfo(game.exePath).absolutePath() : game.workingDir.trimmed());
query.bindValue(":launch_args", game.launchArgs);
query.bindValue(":steam_app_id", game.steamAppId);
if (!query.exec()) {
qWarning() << "[Database] Batch insert/update failed:" << query.lastError().text();
db.rollback();
Expand All @@ -246,7 +250,7 @@ QVector<GameRecord> Database::getAllGames()
}

QSqlQuery query(db);
if (!query.exec("SELECT id, name, exe_path, icon_path, platform, source, working_dir, launch_args, play_seconds, play_count, last_played, favorite, hidden FROM games ORDER BY favorite DESC, name COLLATE NOCASE ASC")) {
if (!query.exec("SELECT id, name, exe_path, icon_path, platform, source, working_dir, launch_args, play_seconds, play_count, last_played, favorite, hidden, steam_app_id FROM games ORDER BY favorite DESC, name COLLATE NOCASE ASC")) {
qWarning() << "[Database] Query failed:" << query.lastError().text();
return games;
}
Expand All @@ -266,6 +270,7 @@ QVector<GameRecord> Database::getAllGames()
rec.lastPlayed = query.value(10).toLongLong();
rec.favorite = query.value(11).toInt() != 0;
rec.hidden = query.value(12).toInt() != 0;
rec.steamAppId = query.value(13).toInt();
games.append(rec);
}
return games;
Expand Down
1 change: 1 addition & 0 deletions src/core/Database.h
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@ struct GameRecord {
QString source;
QString workingDir;
QString launchArgs;
int steamAppId = 0;
qint64 playSeconds = 0;
int playCount = 0;
qint64 lastPlayed = 0;
Expand Down
Loading
Loading