feat: v0.2.1 — Player controls polish, screenshot capture, quit shortcut

v0.2.0 introduced Player mode with floating controls, auto-hide UI,
PiP, fullscreen, JKL shuttle, speed selector, captions, and cut-clip.

v0.2.1 builds on that with extensive UI polish and new features:

Player Controls Polish:
- Enlarged center playback icons (Play 48, Rewind/FF 36) with filled SVGs
- Moved Cut Clip scissors into center group with hidden cut-before button
- Narrowed floating panel from 70% to 60% width
- Custom-styled volume slider matching seek bar (linear-gradient fill)
- Pure opacity fade animation (0.35s) replacing slide-in
- Tinted panel background (rgba(53,54,80,0.75)) visible on black canvas
- Drop shadow on center transport controls
- Scissors buttons dimmed via color (not opacity) with single-property transitions
- ScissorsLineDashed icon for cut-before variant
- Timestamps in single seek row (time | bar | duration) with sans-serif font
- Milliseconds shown at smaller size, revealed on hover

Screenshot Capture (S / Shift+S):
- Canvas compositing at native video resolution with optional caption burn-in
- Caption rendering matches CSS preview (font, background, outline, word highlight)
- New Rust save_screenshot command using existing filename pattern
- Output: {title} - {ms}ms-screenshot.png
- crossorigin=anonymous on video element for untainted canvas

Other:
- Q keyboard shortcut to quit via Tauri process plugin
- formatTimeParts() utility for split timestamp rendering
- Updated About dialog shortcuts list
- Version bump to 0.2.1

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
2026-09-23 05:30:45 -04:00
parent 619fe59dbe
commit c1de18715e
18 changed files with 629 additions and 66 deletions

2
src-tauri/Cargo.lock generated
View File

@@ -1281,7 +1281,7 @@ dependencies = [
[[package]]
name = "gui-video-clipper"
version = "0.2.0"
version = "0.2.1"
dependencies = [
"axum",
"dirs",

View File

@@ -1,6 +1,6 @@
[package]
name = "gui-video-clipper"
version = "0.2.0"
version = "0.2.1"
description = "A macOS GUI app for clipping online videos"
authors = ["cottongin"]
edition = "2021"

View File

@@ -1,6 +1,7 @@
use crate::models::{ExportConfig, ExportScope};
use crate::services::clip_exporter;
use serde::Serialize;
use std::path::Path;
use tauri::ipc::Channel;
#[derive(Clone, Serialize)]
@@ -26,6 +27,30 @@ pub enum ExportEvent {
},
}
#[tauri::command]
pub fn save_screenshot(
output_dir: String,
video_title: String,
timestamp_label: String,
png_data: Vec<u8>,
) -> Result<String, String> {
let expanded_dir = clip_exporter::expand_tilde_path(&output_dir);
let dir_path = Path::new(&expanded_dir);
if !dir_path.exists() {
std::fs::create_dir_all(dir_path)
.map_err(|e| format!("Failed to create output directory: {e}"))?;
}
let path = clip_exporter::generate_output_path(
&expanded_dir,
&video_title,
&format!("{}-screenshot", timestamp_label),
"png",
);
std::fs::write(&path, &png_data)
.map_err(|e| format!("Failed to write screenshot: {e}"))?;
Ok(path)
}
#[tauri::command]
pub async fn export_clips(
config: ExportConfig,

View File

@@ -168,6 +168,7 @@ pub fn run() {
media_analysis::check_embedded_subtitles,
media_analysis::list_system_fonts,
export::export_clips,
export::save_screenshot,
cache::load_cached_analysis,
cache::save_analysis_to_cache,
cache::clear_video_cache,

View File

@@ -1,7 +1,7 @@
{
"$schema": "https://schema.tauri.app/config/2",
"productName": "GUI Video Clipper",
"version": "0.2.0",
"version": "0.2.1",
"identifier": "xyz.cottongin.gui-video-clipper",
"build": {
"beforeDevCommand": "npm run dev",