Change app ID to com.outlay.app, add AppStream metadata, fix toast visibility
- Change app ID from io.github.outlay to com.outlay.app across all files - Add AppStream metainfo with full feature description, 16 screenshots, and v0.1.0 release - Update desktop file with expanded metadata (StartupNotify, SingleMainWindow) - Add summary and description fields to GSchema keys - Move toast overlay outside ScrolledWindow so notifications stay visible in viewport - Embed tray icon as ARGB pixmap data for reliable system tray display - Register hicolor icon theme path for taskbar icon on Wayland - Remove unused icon variants (old naming, web favicons, SVG, ICO, shadow) - Add screenshots to data/screenshots/ - Update build script with metainfo and screenshot bundling
3
.gitignore
vendored
@@ -23,6 +23,9 @@ linuxdeploy-plugin-*
|
||||
*.swo
|
||||
*~
|
||||
|
||||
# Trash
|
||||
.trash/
|
||||
|
||||
# OS
|
||||
.DS_Store
|
||||
Thumbs.db
|
||||
|
||||
BIN
data/screenshots/01.png
Normal file
|
After Width: | Height: | Size: 102 KiB |
BIN
data/screenshots/02.png
Normal file
|
After Width: | Height: | Size: 130 KiB |
BIN
data/screenshots/03.png
Normal file
|
After Width: | Height: | Size: 115 KiB |
BIN
data/screenshots/04.png
Normal file
|
After Width: | Height: | Size: 126 KiB |
BIN
data/screenshots/05.png
Normal file
|
After Width: | Height: | Size: 73 KiB |
BIN
data/screenshots/06.png
Normal file
|
After Width: | Height: | Size: 93 KiB |
BIN
data/screenshots/07.png
Normal file
|
After Width: | Height: | Size: 87 KiB |
BIN
data/screenshots/08.png
Normal file
|
After Width: | Height: | Size: 80 KiB |
BIN
data/screenshots/09.png
Normal file
|
After Width: | Height: | Size: 72 KiB |
BIN
data/screenshots/10.png
Normal file
|
After Width: | Height: | Size: 81 KiB |
BIN
data/screenshots/11.png
Normal file
|
After Width: | Height: | Size: 155 KiB |
BIN
data/screenshots/12.png
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
data/screenshots/13.png
Normal file
|
After Width: | Height: | Size: 106 KiB |
BIN
data/screenshots/14.png
Normal file
|
After Width: | Height: | Size: 89 KiB |
BIN
data/screenshots/15.png
Normal file
|
After Width: | Height: | Size: 91 KiB |
BIN
data/screenshots/16.png
Normal file
|
After Width: | Height: | Size: 39 KiB |
11
outlay-gtk/data/com.outlay.app.desktop
Normal file
@@ -0,0 +1,11 @@
|
||||
[Desktop Entry]
|
||||
Name=Outlay
|
||||
Comment=Personal income and expense tracker with budgets, charts, and multi-currency support
|
||||
Exec=outlay-gtk
|
||||
Icon=com.outlay.app
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=Office;Finance;GTK;
|
||||
Keywords=expense;budget;money;finance;income;tracker;currency;receipt;
|
||||
StartupNotify=true
|
||||
SingleMainWindow=true
|
||||
20
outlay-gtk/data/com.outlay.app.gschema.xml
Normal file
@@ -0,0 +1,20 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<schemalist gettext-domain="outlay">
|
||||
<schema id="com.outlay.app" path="/com/outlay/app/">
|
||||
<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>
|
||||
</schema>
|
||||
</schemalist>
|
||||
196
outlay-gtk/data/com.outlay.app.metainfo.xml
Normal file
@@ -0,0 +1,196 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<component type="desktop-application">
|
||||
<id>com.outlay.app</id>
|
||||
<metadata_license>CC0-1.0</metadata_license>
|
||||
<project_license>CC0-1.0</project_license>
|
||||
|
||||
<name>Outlay</name>
|
||||
<summary>Personal income and expense tracker with budgets, charts, and multi-currency support</summary>
|
||||
|
||||
<description>
|
||||
<p>
|
||||
Outlay is a native GTK4/libadwaita personal finance application for
|
||||
tracking income and expenses, managing budgets, and visualizing spending
|
||||
patterns. It stores everything locally in SQLite with no cloud dependency.
|
||||
</p>
|
||||
<p>Key features:</p>
|
||||
<ul>
|
||||
<li>Log expenses and income with category tagging and notes</li>
|
||||
<li>Multi-currency support with live exchange rate conversion</li>
|
||||
<li>Category-based budgets with threshold alerts and sparkline trends</li>
|
||||
<li>Recurring transactions with flexible scheduling (daily, weekly, monthly, yearly)</li>
|
||||
<li>Subscription tracking with pause, resume, and cost overview</li>
|
||||
<li>Interactive charts: donut breakdown, monthly bars, and smooth net trend lines</li>
|
||||
<li>Calendar heatmap view of daily spending</li>
|
||||
<li>Financial forecasting based on historical patterns</li>
|
||||
<li>Savings goals with progress tracking</li>
|
||||
<li>Credit card balance and payment tracking</li>
|
||||
<li>Wishlist with priority ranking and affordability estimates</li>
|
||||
<li>Spending anomaly detection and monthly insights</li>
|
||||
<li>Natural language transaction input</li>
|
||||
<li>Receipt OCR for automatic amount extraction</li>
|
||||
<li>Export to CSV, JSON, PDF, OFX, and QIF formats</li>
|
||||
<li>Import from CSV, JSON, OFX, QIF, and PDF bank statements</li>
|
||||
<li>Automatic and manual backup with restore</li>
|
||||
<li>System tray with quick-add actions</li>
|
||||
<li>Bill reminders and budget threshold notifications</li>
|
||||
<li>Achievement system for building financial habits</li>
|
||||
<li>Split transactions across multiple categories</li>
|
||||
<li>Transaction templates for frequent entries</li>
|
||||
</ul>
|
||||
</description>
|
||||
|
||||
<icon type="stock">com.outlay.app</icon>
|
||||
|
||||
<launchable type="desktop-id">com.outlay.app.desktop</launchable>
|
||||
|
||||
<developer id="com.outlay">
|
||||
<name>Outlay Contributors</name>
|
||||
</developer>
|
||||
|
||||
<url type="homepage">https://git.lashman.live/lashman/outlay</url>
|
||||
<url type="bugtracker">https://git.lashman.live/lashman/outlay/issues</url>
|
||||
<url type="vcs-browser">https://git.lashman.live/lashman/outlay</url>
|
||||
<url type="donation">https://ko-fi.com/lashman</url>
|
||||
<url type="contact">https://git.lashman.live/lashman/outlay/issues</url>
|
||||
<url type="contribute">https://git.lashman.live/lashman/outlay</url>
|
||||
|
||||
<update_contact>lashman@robotbrush.com</update_contact>
|
||||
|
||||
<screenshots>
|
||||
<screenshot type="default">
|
||||
<caption>Log view with numpad calculator for quick expense entry</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/01.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Transaction history with search, category filters, and daily totals</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/02.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Charts with donut category breakdown and monthly income vs expenses</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/03.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Budget tracking with sparkline trends, spending pace, and insights</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/04.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Savings goals with progress bars and monthly contribution targets</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/05.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Cash flow forecast with projected monthly balances</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/06.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Recurring transactions with next due dates and amounts</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/07.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Subscription management with monthly and yearly cost overview</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/08.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Wishlist with wanted items, prices, and purchase tracking</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/09.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Credit card tracking with balances, utilization, and payment details</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/10.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Insights with streaks, achievements, and monthly spending recap</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/11.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Settings for currency, appearance, and budget notifications</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/12.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Category management, auto-categorization rules, and transaction templates</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/13.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Export and import in CSV, JSON, QIF, OFX, and PDF formats</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/14.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Backup and restore with automatic scheduled backups</caption>
|
||||
<image type="source" width="902" height="1330">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/15.png</image>
|
||||
</screenshot>
|
||||
<screenshot>
|
||||
<caption>Quick Add popup for fast expense logging from the system tray</caption>
|
||||
<image type="source" width="461" height="650">https://git.lashman.live/lashman/outlay/raw/branch/main/data/screenshots/16.png</image>
|
||||
</screenshot>
|
||||
</screenshots>
|
||||
|
||||
<branding>
|
||||
<color type="primary" scheme_preference="light">#62a0ea</color>
|
||||
<color type="primary" scheme_preference="dark">#1a5fb4</color>
|
||||
</branding>
|
||||
|
||||
<categories>
|
||||
<category>Office</category>
|
||||
<category>Finance</category>
|
||||
<category>GTK</category>
|
||||
</categories>
|
||||
|
||||
<keywords>
|
||||
<keyword>Expense</keyword>
|
||||
<keyword>Income</keyword>
|
||||
<keyword>Budget</keyword>
|
||||
<keyword>Finance</keyword>
|
||||
<keyword>Money</keyword>
|
||||
<keyword>Currency</keyword>
|
||||
<keyword>Receipt</keyword>
|
||||
<keyword>Tracker</keyword>
|
||||
<keyword>Chart</keyword>
|
||||
<keyword>Subscription</keyword>
|
||||
</keywords>
|
||||
|
||||
<content_rating type="oars-1.1">
|
||||
<content_attribute id="social-info">mild</content_attribute>
|
||||
</content_rating>
|
||||
|
||||
<requires>
|
||||
<display_length compare="ge">360</display_length>
|
||||
</requires>
|
||||
|
||||
<recommends>
|
||||
<control>keyboard</control>
|
||||
<control>pointing</control>
|
||||
</recommends>
|
||||
|
||||
<supports>
|
||||
<internet>first-run</internet>
|
||||
</supports>
|
||||
|
||||
<provides>
|
||||
<binary>outlay-gtk</binary>
|
||||
</provides>
|
||||
|
||||
<translation type="gettext">com.outlay.app</translation>
|
||||
|
||||
<releases>
|
||||
<release version="0.1.0" date="2026-03-03" type="stable">
|
||||
<description>
|
||||
<p>Initial release of Outlay with core features:</p>
|
||||
<ul>
|
||||
<li>Expense and income logging with multi-currency support</li>
|
||||
<li>Category-based budgets with alerts and sparkline trends</li>
|
||||
<li>Recurring transactions and subscription management</li>
|
||||
<li>Interactive donut, bar, and net trend charts</li>
|
||||
<li>Calendar heatmap, forecast, goals, and wishlist views</li>
|
||||
<li>Credit card tracking with payment schedules</li>
|
||||
<li>Natural language input and receipt OCR</li>
|
||||
<li>Export to CSV, JSON, PDF, OFX, and QIF</li>
|
||||
<li>Import from CSV, JSON, OFX, QIF, and PDF statements</li>
|
||||
<li>Spending anomaly detection and monthly insights</li>
|
||||
<li>System tray integration with quick-add actions</li>
|
||||
<li>Automatic backup scheduling and restore</li>
|
||||
<li>Achievement system for financial habit building</li>
|
||||
</ul>
|
||||
</description>
|
||||
</release>
|
||||
</releases>
|
||||
</component>
|
||||
@@ -1,69 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.1/css/all.min.css">
|
||||
<style>
|
||||
* { margin: 0; padding: 0; box-sizing: border-box; }
|
||||
html, body { background: transparent; width: 100%; height: 100%; }
|
||||
body {
|
||||
background-image:
|
||||
linear-gradient(45deg, #ccc 25%, transparent 25%),
|
||||
linear-gradient(-45deg, #ccc 25%, transparent 25%),
|
||||
linear-gradient(45deg, transparent 75%, #ccc 75%),
|
||||
linear-gradient(-45deg, transparent 75%, #ccc 75%);
|
||||
background-size: 20px 20px;
|
||||
background-position: 0 0, 0 10px, 10px -10px, -10px 0;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
min-height: 100vh;
|
||||
}
|
||||
.icon-wrapper {
|
||||
padding: 50px;
|
||||
filter: drop-shadow(0 8px 14px rgba(26, 95, 180, 0.45));
|
||||
}
|
||||
.icon-container {
|
||||
width: 512px;
|
||||
height: 512px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
position: relative;
|
||||
overflow: hidden;
|
||||
/* GNOME-style rounded square - ~22% radius */
|
||||
border-radius: 22%;
|
||||
/* GNOME blue gradient - wider range for visible depth */
|
||||
background: linear-gradient(180deg, #62a0ea 0%, #1a5fb4 55%, #144a8a 100%);
|
||||
}
|
||||
/* Sharp top highlight + bottom shadow edges */
|
||||
.icon-container::before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
inset: 0;
|
||||
border-radius: 22%;
|
||||
border-top: 4px solid rgba(255,255,255,0.2);
|
||||
border-bottom: 40px solid rgba(0,0,0,0.12);
|
||||
border-left: none;
|
||||
border-right: none;
|
||||
pointer-events: none;
|
||||
z-index: 2;
|
||||
}
|
||||
.icon {
|
||||
font-size: 286px;
|
||||
line-height: 1;
|
||||
color: #ffffff;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
filter: drop-shadow(0 4px 8px rgba(0,0,0,0.2));
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="icon-wrapper">
|
||||
<div class="icon-container" id="icon-target">
|
||||
<i class="icon fa-solid fa-receipt"></i>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
||||
|
Before Width: | Height: | Size: 15 KiB |
|
Before Width: | Height: | Size: 84 KiB |
|
Before Width: | Height: | Size: 5.0 KiB |
|
Before Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 8.7 KiB After Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 679 B |
|
Before Width: | Height: | Size: 679 B After Width: | Height: | Size: 679 B |
|
Before Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 1.3 KiB After Width: | Height: | Size: 1.3 KiB |
|
Before Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 22 KiB After Width: | Height: | Size: 22 KiB |
|
Before Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1.4 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 2.8 KiB After Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 65 KiB After Width: | Height: | Size: 65 KiB |
|
Before Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 3.3 KiB |
|
Before Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 6.2 KiB After Width: | Height: | Size: 6.2 KiB |
@@ -1,21 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128" width="128" height="128">
|
||||
<defs>
|
||||
<linearGradient id="bg" x1="0" y1="0" x2="0" y2="1">
|
||||
<stop offset="0%" stop-color="#3584e4"/>
|
||||
<stop offset="100%" stop-color="#1a73e8"/>
|
||||
</linearGradient>
|
||||
</defs>
|
||||
<!-- Background circle -->
|
||||
<circle cx="64" cy="64" r="60" fill="url(#bg)"/>
|
||||
<!-- Wallet body -->
|
||||
<rect x="24" y="38" width="72" height="52" rx="8" fill="#ffffff" opacity="0.95"/>
|
||||
<!-- Wallet flap -->
|
||||
<path d="M24 50 Q24 38 36 38 L88 38 Q96 38 96 46 L96 50 Z" fill="#e8e8e8"/>
|
||||
<!-- Coin circle -->
|
||||
<circle cx="82" cy="64" r="14" fill="#f5c211" stroke="#e0a800" stroke-width="2"/>
|
||||
<!-- Dollar sign on coin -->
|
||||
<text x="82" y="70" font-family="sans-serif" font-size="18" font-weight="bold" fill="#8b6914" text-anchor="middle">$</text>
|
||||
<!-- Arrow out (expense indicator) -->
|
||||
<path d="M40 64 L54 54 L54 58 L66 58 L66 70 L54 70 L54 74 Z" fill="#2ec27e" opacity="0.9"/>
|
||||
</svg>
|
||||
|
Before Width: | Height: | Size: 1015 B |
BIN
outlay-gtk/data/icons/tray-icon-32x32.argb
Normal file
BIN
outlay-gtk/data/icons/tray-icon-48x48.argb
Normal file
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 7.8 KiB |
|
Before Width: | Height: | Size: 10 KiB |
|
Before Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 685 B |
|
Before Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 2.8 KiB |
|
Before Width: | Height: | Size: 4.2 KiB |
|
Before Width: | Height: | Size: 5.6 KiB |
@@ -1,9 +0,0 @@
|
||||
[Desktop Entry]
|
||||
Name=Outlay
|
||||
Comment=Personal income and expense logger
|
||||
Exec=outlay-gtk
|
||||
Icon=io.github.outlay
|
||||
Terminal=false
|
||||
Type=Application
|
||||
Categories=Office;Finance;
|
||||
Keywords=expense;budget;money;finance;income;
|
||||
@@ -1,14 +0,0 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<schemalist>
|
||||
<schema id="io.github.outlay" path="/io/github/outlay/">
|
||||
<key name="window-width" type="i">
|
||||
<default>900</default>
|
||||
</key>
|
||||
<key name="window-height" type="i">
|
||||
<default>600</default>
|
||||
</key>
|
||||
<key name="window-maximized" type="b">
|
||||
<default>false</default>
|
||||
</key>
|
||||
</schema>
|
||||
</schemalist>
|
||||
@@ -1634,8 +1634,7 @@ impl LogView {
|
||||
inner.append(&recent_group);
|
||||
|
||||
clamp.set_child(Some(&inner));
|
||||
toast_overlay.set_child(Some(&clamp));
|
||||
container.append(&toast_overlay);
|
||||
container.append(&clamp);
|
||||
|
||||
LogView {
|
||||
container,
|
||||
|
||||
@@ -28,7 +28,7 @@ use gtk::glib;
|
||||
use outlay_core::db::Database;
|
||||
use std::rc::Rc;
|
||||
|
||||
const APP_ID: &str = "io.github.outlay";
|
||||
const APP_ID: &str = "com.outlay.app";
|
||||
|
||||
fn main() {
|
||||
let app = Application::builder()
|
||||
@@ -100,6 +100,25 @@ fn build_ui(app: &Application) {
|
||||
load_css();
|
||||
icon_theme::setup_themed_icons();
|
||||
|
||||
// Register app icon for the hicolor theme so it works for window + tray
|
||||
{
|
||||
let display = gtk::gdk::Display::default().expect("Could not get display");
|
||||
let theme = gtk::IconTheme::for_display(&display);
|
||||
let exe_path = std::env::current_exe().unwrap_or_default();
|
||||
let exe_dir = exe_path.parent().unwrap_or(std::path::Path::new("."));
|
||||
let candidates = [
|
||||
exe_dir.join("../../outlay-gtk/data/icons"),
|
||||
exe_dir.join("../share/icons"),
|
||||
];
|
||||
for candidate in &candidates {
|
||||
if candidate.exists() {
|
||||
theme.add_search_path(candidate);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
gtk::Window::set_default_icon_name("com.outlay.app");
|
||||
|
||||
let data_dir = glib::user_data_dir().join("outlay");
|
||||
std::fs::create_dir_all(&data_dir).expect("Failed to create data directory");
|
||||
let db_path = data_dir.join("outlay.db");
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
use ksni::menu::StandardItem;
|
||||
use ksni::{Category, ToolTip, Tray, TrayMethods};
|
||||
use std::path::PathBuf;
|
||||
use ksni::{Category, Icon, ToolTip, Tray, TrayMethods};
|
||||
use std::sync::mpsc;
|
||||
|
||||
pub enum TrayCommand {
|
||||
@@ -11,9 +10,11 @@ pub enum TrayCommand {
|
||||
Quit,
|
||||
}
|
||||
|
||||
static TRAY_ICON_32: &[u8] = include_bytes!("../data/icons/tray-icon-32x32.argb");
|
||||
static TRAY_ICON_48: &[u8] = include_bytes!("../data/icons/tray-icon-48x48.argb");
|
||||
|
||||
struct OutlayTray {
|
||||
sender: mpsc::Sender<TrayCommand>,
|
||||
icon_theme_path: String,
|
||||
}
|
||||
|
||||
impl Tray for OutlayTray {
|
||||
@@ -26,11 +27,22 @@ impl Tray for OutlayTray {
|
||||
}
|
||||
|
||||
fn icon_name(&self) -> String {
|
||||
"io.github.outlay".into()
|
||||
String::new()
|
||||
}
|
||||
|
||||
fn icon_theme_path(&self) -> String {
|
||||
self.icon_theme_path.clone()
|
||||
fn icon_pixmap(&self) -> Vec<Icon> {
|
||||
vec![
|
||||
Icon {
|
||||
width: 32,
|
||||
height: 32,
|
||||
data: TRAY_ICON_32.to_vec(),
|
||||
},
|
||||
Icon {
|
||||
width: 48,
|
||||
height: 48,
|
||||
data: TRAY_ICON_48.to_vec(),
|
||||
},
|
||||
]
|
||||
}
|
||||
|
||||
fn category(&self) -> Category {
|
||||
@@ -98,34 +110,8 @@ impl Tray for OutlayTray {
|
||||
}
|
||||
}
|
||||
|
||||
fn find_icon_theme_path() -> String {
|
||||
let exe_path = std::env::current_exe().unwrap_or_default();
|
||||
let exe_dir = exe_path.parent().unwrap_or(std::path::Path::new("."));
|
||||
|
||||
let candidates = [
|
||||
exe_dir.join("../../outlay-gtk/data/icons"),
|
||||
exe_dir.join("../share/icons"),
|
||||
PathBuf::from("/usr/share/icons"),
|
||||
];
|
||||
|
||||
for candidate in &candidates {
|
||||
if candidate.exists() {
|
||||
if let Ok(resolved) = candidate.canonicalize() {
|
||||
return resolved.to_string_lossy().into_owned();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
String::new()
|
||||
}
|
||||
|
||||
pub fn spawn_tray(sender: mpsc::Sender<TrayCommand>) {
|
||||
let icon_theme_path = find_icon_theme_path();
|
||||
|
||||
let tray = OutlayTray {
|
||||
sender,
|
||||
icon_theme_path,
|
||||
};
|
||||
let tray = OutlayTray { sender };
|
||||
|
||||
std::thread::spawn(move || {
|
||||
let rt = tokio::runtime::Builder::new_current_thread()
|
||||
|
||||
@@ -89,7 +89,8 @@ impl MainWindow {
|
||||
.hscrollbar_policy(gtk::PolicyType::Never)
|
||||
.child(&log_view.container)
|
||||
.build();
|
||||
content_stack.add_named(&log_scroll, Some("log"));
|
||||
log_view.toast_overlay.set_child(Some(&log_scroll));
|
||||
content_stack.add_named(&log_view.toast_overlay, Some("log"));
|
||||
|
||||
// History view
|
||||
let history_view = HistoryView::new(db.clone());
|
||||
|
||||
@@ -13,7 +13,6 @@ echo "==> Creating AppDir structure..."
|
||||
rm -rf AppDir
|
||||
mkdir -p AppDir/usr/bin
|
||||
mkdir -p AppDir/usr/share/applications
|
||||
mkdir -p AppDir/usr/share/icons/hicolor/scalable/apps
|
||||
mkdir -p AppDir/usr/share/glib-2.0/schemas
|
||||
mkdir -p AppDir/usr/share/fonts/truetype/liberation
|
||||
|
||||
@@ -21,19 +20,29 @@ mkdir -p AppDir/usr/share/fonts/truetype/liberation
|
||||
cp target/release/outlay-gtk AppDir/usr/bin/
|
||||
|
||||
# Copy desktop file
|
||||
cp outlay-gtk/data/io.github.outlay.desktop AppDir/
|
||||
cp outlay-gtk/data/io.github.outlay.desktop AppDir/usr/share/applications/
|
||||
cp outlay-gtk/data/com.outlay.app.desktop AppDir/
|
||||
cp outlay-gtk/data/com.outlay.app.desktop AppDir/usr/share/applications/
|
||||
|
||||
# Copy app icon
|
||||
cp outlay-gtk/data/icons/hicolor/scalable/apps/io.github.outlay.svg AppDir/usr/share/icons/hicolor/scalable/apps/
|
||||
# Copy app icons (all hicolor sizes)
|
||||
for size_dir in outlay-gtk/data/icons/hicolor/*/apps; do
|
||||
size=$(basename "$(dirname "$size_dir")")
|
||||
mkdir -p "AppDir/usr/share/icons/hicolor/$size/apps"
|
||||
cp "$size_dir"/com.outlay.app.* "AppDir/usr/share/icons/hicolor/$size/apps/" 2>/dev/null || true
|
||||
done
|
||||
|
||||
# Copy Tabler action icons
|
||||
mkdir -p AppDir/usr/share/icons/hicolor/scalable/actions
|
||||
cp outlay-gtk/data/icons/hicolor/scalable/actions/outlay-*.svg AppDir/usr/share/icons/hicolor/scalable/actions/
|
||||
cp outlay-gtk/data/icons/hicolor/scalable/actions/tabler-*.svg AppDir/usr/share/icons/hicolor/scalable/actions/
|
||||
|
||||
# Copy metainfo and screenshots
|
||||
mkdir -p AppDir/usr/share/metainfo
|
||||
cp outlay-gtk/data/com.outlay.app.metainfo.xml AppDir/usr/share/metainfo/
|
||||
mkdir -p AppDir/usr/share/screenshots
|
||||
cp data/screenshots/*.png AppDir/usr/share/screenshots/
|
||||
|
||||
# Copy GSettings schema
|
||||
cp outlay-gtk/data/io.github.outlay.gschema.xml AppDir/usr/share/glib-2.0/schemas/
|
||||
cp outlay-gtk/data/com.outlay.app.gschema.xml AppDir/usr/share/glib-2.0/schemas/
|
||||
glib-compile-schemas AppDir/usr/share/glib-2.0/schemas/
|
||||
|
||||
# Bundle Liberation Sans fonts (needed for PDF report generation)
|
||||
@@ -102,8 +111,8 @@ export DEPLOY_GTK_VERSION=4
|
||||
--appdir AppDir \
|
||||
--plugin gtk \
|
||||
--output appimage \
|
||||
--desktop-file AppDir/io.github.outlay.desktop \
|
||||
--icon-file AppDir/usr/share/icons/hicolor/scalable/apps/io.github.outlay.svg
|
||||
--desktop-file AppDir/com.outlay.app.desktop \
|
||||
--icon-file AppDir/usr/share/icons/hicolor/256x256/apps/com.outlay.app.png
|
||||
|
||||
echo "==> Done! AppImage created."
|
||||
ls -lh Outlay-*.AppImage 2>/dev/null || echo "Note: Output filename may vary."
|
||||
|
||||