Sidebar layout: - Replace AdwNavigationSplitView with GtkPaned for a resizable sidebar with a persistent width stored in GSettings. - Apply navigation-sidebar CSS class to the content Stack only (not the ToolbarView) so both header bars share the same colour and height. - Override Adwaita's automatic paned-first-child header tint and gap via application-level CSS. - Remove the gap between the sidebar header and the first list item. - Add toggle-sidebar button and F9 shortcut; sidebar visibility and width are persisted across restarts. Loading indicator: - Replace the large AdwSpinner status page + header Stack with a small Gtk.Spinner (16×16) in the header Stack so the header height never changes during loading. Article row: - Add hexpand to title and excerpt labels so text reflows when the sidebar is resized. Content: - Inline CSS into the HTML template at load time (/*INJECT_CSS*/ placeholder) so WebKit does not need a custom URI scheme handler. - Fix max-width centering and padding for article body and header. - Fix embedded video/iframe auto-opening in browser by checking NavigationType::LinkClicked instead of is_user_gesture(). Content filters: - Add Preferences dialog with a TextView for content-rewrite rules stored in GSettings (content-filters key). - Rule format: "domain find replace [find replace …]" one per line. - Rules are applied to article HTML before display and reloaded on every refresh. Shortcuts: - Add Ctrl+W to close, Ctrl+Q to quit, F1 for keyboard shortcuts overlay, j/k and arrow-key navigation via a capture-phase controller so keys work regardless of which widget has focus. Misc: - Set window title to "FeedTheMonkey" (fixes Hyprland title bar). - Update About dialog website URL.
66 lines
2.6 KiB
Rust
66 lines
2.6 KiB
Rust
use std::path::PathBuf;
|
|
use std::process::Command;
|
|
|
|
fn main() {
|
|
let manifest_dir = PathBuf::from(std::env::var("CARGO_MANIFEST_DIR").unwrap());
|
|
let data_dir = manifest_dir.join("data");
|
|
let ui_dir = data_dir.join("ui");
|
|
let out_dir = PathBuf::from(std::env::var("OUT_DIR").unwrap());
|
|
|
|
// Compile all .blp files to .ui files
|
|
let blp_files: Vec<_> = std::fs::read_dir(&ui_dir)
|
|
.expect("data/ui/ directory not found")
|
|
.filter_map(|e| e.ok())
|
|
.map(|e| e.path())
|
|
.filter(|p| p.extension().map_or(false, |ext| ext == "blp"))
|
|
.collect();
|
|
|
|
for blp in &blp_files {
|
|
println!("cargo:rerun-if-changed={}", blp.display());
|
|
}
|
|
|
|
if !blp_files.is_empty() {
|
|
let status = Command::new("blueprint-compiler")
|
|
.arg("batch-compile")
|
|
.arg(&ui_dir)
|
|
.arg(&ui_dir)
|
|
.args(&blp_files)
|
|
.status()
|
|
.expect("failed to run blueprint-compiler — is it installed?");
|
|
assert!(status.success(), "blueprint-compiler failed");
|
|
}
|
|
|
|
// Compile GSettings schema into data/ so dev builds can find it
|
|
let schema_file = data_dir.join("net.jeena.FeedTheMonkey.gschema.xml");
|
|
println!("cargo:rerun-if-changed={}", schema_file.display());
|
|
let status = Command::new("glib-compile-schemas")
|
|
.arg(&data_dir)
|
|
.status()
|
|
.expect("failed to run glib-compile-schemas — is it installed?");
|
|
assert!(status.success(), "glib-compile-schemas failed");
|
|
println!("cargo:rustc-env=GSETTINGS_SCHEMA_DIR={}", data_dir.display());
|
|
|
|
// Compile GResource
|
|
let gresource_xml = data_dir.join("resources.gresource.xml");
|
|
println!("cargo:rerun-if-changed={}", gresource_xml.display());
|
|
|
|
// Watch HTML/CSS so changes trigger a resource rebuild
|
|
let html_dir = manifest_dir.join("html");
|
|
if let Ok(entries) = std::fs::read_dir(&html_dir) {
|
|
for entry in entries.filter_map(|e| e.ok()) {
|
|
println!("cargo:rerun-if-changed={}", entry.path().display());
|
|
}
|
|
}
|
|
|
|
let gresource_out = out_dir.join("feedthemonkey.gresource");
|
|
let status = Command::new("glib-compile-resources")
|
|
.arg(format!("--sourcedir={}", data_dir.display()))
|
|
.arg(format!("--sourcedir={}", manifest_dir.display()))
|
|
.arg(format!("--target={}", gresource_out.display()))
|
|
.arg(&gresource_xml)
|
|
.status()
|
|
.expect("failed to run glib-compile-resources — is it installed?");
|
|
assert!(status.success(), "glib-compile-resources failed");
|
|
|
|
println!("cargo:rustc-env=GRESOURCE_FILE={}", gresource_out.display());
|
|
}
|