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:
10
data/app.driftwood.Driftwood.desktop
Normal file
10
data/app.driftwood.Driftwood.desktop
Normal 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
|
||||
35
data/app.driftwood.Driftwood.gschema.xml
Normal file
35
data/app.driftwood.Driftwood.gschema.xml
Normal 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>
|
||||
6
data/resources.gresource.xml
Normal file
6
data/resources.gresource.xml
Normal 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
72
data/resources/style.css
Normal 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;
|
||||
}
|
||||
Reference in New Issue
Block a user