Skip to content

Release v1.4.0 - Frame slider, easing previews, and stability fixes#82

Merged
timlinux merged 19 commits intomainfrom
v1.4
Mar 9, 2026
Merged

Release v1.4.0 - Frame slider, easing previews, and stability fixes#82
timlinux merged 19 commits intomainfrom
v1.4

Conversation

@timlinux
Copy link
Owner

@timlinux timlinux commented Mar 7, 2026

Summary

This PR includes all changes for the v1.4.0 release:

  • Frame slider control - New slider and spinbox to preview specific frames with live easing dot synchronization
  • Improved easing preview UI - Theme-aware colors (Kartoza branding), smoother animations, bouncing dot indicator
  • Total frames display - Shows frame count after slider, calculated correctly for all modes (fixed extent, planar, sphere)
  • Stability fixes - Fixed SIGSEGV crash in preview rendering, fixed dialog freeze issues
  • Developer experience - Nix flake improvements, neovim integration, crash handler options in start scripts
  • Dependency handling - Improved fallback UI when multimedia libraries are unavailable

Key Changes

  1. Frame Preview Slider (e09443e, 2f1d668, b7ecf1e)

    • Live frame scrubbing with spinbox sync
    • Preview renders only on slider release (not during drag)
    • Dynamic frame count calculation based on animation mode
  2. Easing Preview Enhancements (bad08b8)

    • Kartoza green branding colors
    • Dark/light theme detection
    • Smooth dot animation on easing curves
  3. Crash & Freeze Fixes (a448b2d)

    • Replaced functools.partial() with class methods for task callbacks
    • SingleShot timer pattern prevents event pile-up
    • Signal cleanup prevents callback accumulation
  4. Developer Tooling (fe8cee8, 814e41a, 962f0b6)

    • Nix flake with pyrightconfig.json generation
    • Neovim keybindings and LSP support
    • Crash handler options (gdb/catchsegv) in start scripts

timlinux added 19 commits March 6, 2026 00:05
- Add .exrc with which-key shortcuts under <leader>p for:
  - QGIS commands, testing, code quality, documentation
  - Debugging (DAP), utilities, git, packaging, profiling
- Add .nvim.lua with project-specific LSP, formatting, linting config
  - Pyright configured with QGIS Python paths
  - conform.nvim formatting (black, isort)
  - nvim-lint integration (flake8, mypy)
  - DAP debugpy configuration with QGIS attach support
- Update flake.nix with nix run convenience commands:
  - test, format, lint, checks, docs-serve, docs-build
  - package, security, clean, profile
- Update .nvim-setup.sh with improved output and keybinding hints
- Update .gitignore for dev workflow artifacts
- Replace default.nix with flake.nix (use flake in .envrc)
- Fix isinstance() bug in easing_preview.py (was missing second argument)
- Combine Preview and Chart tabs into single widget with animated dot
  moving along the easing curve for better visualization
- Change Kartoza footer links from buttons to simple HTML hyperlinks
- Move Kartoza footer above the button box
- Add light/dark theme awareness to easing preview, LCD numbers,
  text edits, preview areas, and tooltips using palette() colors
- Make easing controls horizontal (checkbox + combo side by side)
  to save vertical space
- Add horizontal slider next to compact frame spinbox for easier scrubbing
- Slider and spinbox stay synced bidirectionally
- Restore timer-based easing dot animation that was accidentally removed
- Connect frame controls to update slider range when total frames changes
- Connect slider to spinbox for live value updates during drag
- Render frame preview only when slider is released (not during drag)
- Calculate max frames dynamically based on mode:
  - Fixed extent: uses extent_frames_spin value
  - Sphere/planar: fps × (travel_duration + hover_duration) × feature_count
- Connect all relevant signals to update frame range automatically
Also have a DRY implementation for total frame count.
- Replace functools.partial() with class method for task callbacks
  to fix SIGSEGV crash in partial_vectorcall
- Add signal disconnection when cancelling preview tasks to prevent
  callback accumulation
- Change easing animation timer to singleShot pattern to prevent
  event pile-up that caused dialog to become unresponsive
- Add position caching in easing dot updates to reduce pyqtgraph overhead
- Use cached slider maximum values instead of recalculating on each update
- Add crash handler options (gdb/catchsegv) to start scripts for debugging
- Add httpx to requirements-dev.txt (required by admin.py)
- Apply Black formatting to all Python files
- Apply isort import sorting
- Add extend_skip to isort config for local development
- Add typer to requirements-dev.txt (required by admin.py CLI)
- Pin Black to 25.x in CI to match local version
- Keep comprehensive dependabot.yml from v1.4 with pip ecosystem
- Add github-actions grouping from main
- Keep full QGIS dev environment flake.nix from v1.4
- Add E402 to flake8 ignore (module-level imports after code)
- Replace bare except with except StopIteration
- Remove unused imports (QHBoxLayout, QLabel, QSizePolicy, etc.)
- Add noqa comments to __init__.py module re-exports
- Fix QGISAPP variable scope issue in test utilities
- Replace os.system shell command with safe glob/os.remove for cache cleanup
- Update bandit config to skip acceptable low/medium severity issues
- Document rationale for each skipped security check
- Remove actions/setup-python to avoid GLIBC version mismatch
- Use container's native Python3 instead
- Install python3-pip in container
- Use --break-system-packages for pip in container
@timlinux timlinux merged commit 9eb4449 into main Mar 9, 2026
6 checks passed
@timlinux timlinux deleted the v1.4 branch March 9, 2026 00:44
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant