Implement Driftwood AppImage manager - Phases 1 and 2

Phase 1 - Application scaffolding:
- GTK4/libadwaita application window with AdwNavigationView
- GSettings-backed window state persistence
- GResource-compiled CSS and schema
- Library view with grid/list toggle, search, sorting, filtering
- Detail view with file info, desktop integration controls
- Preferences window with scan directories, theme, behavior settings
- CLI with list, scan, integrate, remove, clean, inspect commands
- AppImage discovery, metadata extraction, desktop integration
- Orphaned desktop entry detection and cleanup
- AppImage packaging script

Phase 2 - Intelligence layer:
- Database schema v2 with migration for status tracking columns
- FUSE detection engine (libfuse2/3, fusermount, /dev/fuse, AppImageLauncher)
- Wayland awareness engine (session type, toolkit detection, XWayland)
- Update info parsing from AppImage ELF sections (.upd_info)
- GitHub/GitLab Releases API integration for update checking
- Update download with progress tracking and atomic apply
- Launch wrapper with FUSE auto-detection and usage tracking
- Duplicate and multi-version detection with recommendations
- Dashboard with system health, library stats, disk usage
- Update check dialog (single and batch)
- Duplicate resolution dialog
- Status badges on library cards and detail view
- Extended CLI: status, check-updates, duplicates, launch commands

49 tests passing across all modules.
This commit is contained in:
lashman
2026-02-26 23:04:27 +02:00
parent 588b1b1525
commit fa28955919
33 changed files with 10401 additions and 0 deletions

View File

@@ -0,0 +1,10 @@
[Desktop Entry]
Name=Driftwood
Comment=Modern AppImage manager for GNOME desktops
Exec=driftwood
Icon=app.driftwood.Driftwood
Terminal=false
Type=Application
Categories=System;PackageManager;GTK;
Keywords=AppImage;Application;Manager;Package;
StartupNotify=true

View File

@@ -0,0 +1,35 @@
<?xml version="1.0" encoding="UTF-8"?>
<schemalist gettext-domain="driftwood">
<schema id="app.driftwood.Driftwood" path="/app/driftwood/Driftwood/">
<key name="window-width" type="i">
<default>900</default>
<summary>Window width</summary>
<description>The width of the main application window.</description>
</key>
<key name="window-height" type="i">
<default>600</default>
<summary>Window height</summary>
<description>The height of the main application window.</description>
</key>
<key name="window-maximized" type="b">
<default>false</default>
<summary>Window maximized</summary>
<description>Whether the main application window is maximized.</description>
</key>
<key name="scan-directories" type="as">
<default>['~/Applications', '~/Downloads']</default>
<summary>Scan directories</summary>
<description>Directories to scan for AppImage files.</description>
</key>
<key name="view-mode" type="s">
<default>'grid'</default>
<summary>Library view mode</summary>
<description>The library view mode: grid or list.</description>
</key>
<key name="color-scheme" type="s">
<default>'default'</default>
<summary>Color scheme</summary>
<description>Application color scheme: default (follow system), force-light, or force-dark.</description>
</key>
</schema>
</schemalist>

View File

@@ -0,0 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<gresources>
<gresource prefix="/app/driftwood/Driftwood">
<file alias="style.css">resources/style.css</file>
</gresource>
</gresources>

72
data/resources/style.css Normal file
View File

@@ -0,0 +1,72 @@
/* Status badges */
.status-badge {
border-radius: 8px;
padding: 2px 8px;
font-size: 8pt;
font-weight: 600;
}
.status-badge.success {
background: @success_bg_color;
color: @success_fg_color;
}
.status-badge.warning {
background: @warning_bg_color;
color: @warning_fg_color;
}
.status-badge.error {
background: @error_bg_color;
color: @error_fg_color;
}
.status-badge.info {
background: @accent_bg_color;
color: @accent_fg_color;
}
.status-badge.neutral {
background: @card_shade_color;
color: @window_fg_color;
}
/* App cards in grid view */
.app-card {
padding: 12px;
border-radius: 12px;
background: @card_bg_color;
transition: background 150ms ease;
}
.app-card:hover {
background: @headerbar_shade_color;
}
.app-card-name {
font-weight: 600;
font-size: 10pt;
}
.app-card-version {
font-size: 8pt;
opacity: 0.7;
}
/* Badge row in app cards */
.badge-row {
margin-top: 4px;
}
/* Detail view headings */
.heading {
font-weight: 700;
font-size: 11pt;
opacity: 0.8;
}
/* Monospace text for paths and hashes */
.monospace {
font-family: monospace;
font-size: 9pt;
}