# This file contains metadata for your plugin.

# This file should be included when you package your plugin.
# Mandatory items:

[general]
name=FilterMate
qgisMinimumVersion=3.22
qgisMaximumVersion=4.99
supportsQt6=yes
description=🚀 The ultimate spatial filtering plugin! Explore, filter & export vector data with lightning-fast performance on ANY data source. Full QGIS 4 / Qt6 support.
version=4.9.2
author=imagodata
email=simon.ducournau+filter_mate@gmail.com

about=🎯 FilterMate 4.9.2 - Your Swiss Army Knife for Spatial Data!

    Stop struggling with complex filters. FilterMate makes spatial queries intuitive, fast, and powerful.

    🌟 WHY FILTERMATE?
    ━━━━━━━━━━━━━━━━━
    ✓ Works with EVERYTHING: PostgreSQL, Spatialite, GeoPackage, Shapefiles, WFS...
    ✓ Lightning fast: 2-8× faster with 4 performance optimizers + smart caching
    ✓ Intuitive: Filter by clicking, drawing, or selecting - no SQL needed!
    ✓ Professional: Undo/Redo, Favorites, Dark Mode, 34 languages
    ✓ Shareable: Git-backed favorites sharing + REST API for automation

    🔥 KILLER FEATURES:
    ━━━━━━━━━━━━━━━━━━
    📍 Geometric filtering with buffer, intersection, containment...
    🔍 Smart entity search across any layer type
    ⭐ Save & share your favorite filter configurations with spatial context
    🤝 Publish favorites to git repos (private/team) with authcfg credentials
    🌐 REST API to drive FilterMate from external tools (X-API-Key auth)
    📦 One-click export to GeoPackage with embedded QGIS project (preserves group structure, styles & CRS)
    🎨 Beautiful UI that adapts to your QGIS theme
    ⚡ Filter chaining with dynamic buffer expressions

    💡 v4.9.2: Fix the GeoPackage layer that showed 0 features when re-filtered as a source after being filtered as a target (a closing parenthesis was lost while combining the new expression with the R-tree subset, invalid SQL accepted silently by OGR); with the combine option off, a new source filter now replaces the previous subset instead of being ANDed to it.
    💡 v4.9.1: Fix the filter refused on the first click on PostgreSQL selections of 100 000 features or more (materialized-view path called a missing facade method), fix after a project switch with the panel open ("wrapped C/C++ object of type QgsVectorLayer has been deleted" when the previous layer is gone) and a QGIS crash after a plugin reload followed by a project close (the panel is now removed and deleted on unload, so no feature-picker gather can outlive its layer); timing lines for the validate/reset steps of a layer change.
    💡 v4.9.0: Open another project with the panel open and it follows (four causes fixed and verified in QGIS 4.2), one stable FilterMate project row per project and no more duplicated favorites, PostgreSQL feature list without the server-side sort that fetched the whole table (13 s → 30 ms) and deferred while the canvas renders (no more 17 s freeze at project open), type-to-find in the layer combo, busy cursor and pressed button during tasks, plain-language error messages, accessible names, lighter zip, lint in CI, Qt6 enum guard.
    💡 v4.8.10: PostgreSQL buffer filters (ST_DWithin + source envelope prefilter on the target's GiST index: a roads + 20 m buffer cascade went from never finishing to 25 s for 16 layers), source-selection materialized view repaired, panel reloads on project switch whatever APP.AUTO_ACTIVATE, GeoPackage buffers applied once in QGIS (no convex hull), OGR buffer cached per task, 48 SQL templates restored.
    💡 v4.8.9: Measured performance release. GeoPackage spatial cascades use the R-tree of each target table (a 37-layer filter by the commune of Toulouse went from 371 s to under 3 s), PostgreSQL targets keep their GiST index with the centroid option (49.6 s to under 4 s), no double scan after a filter, canvas frozen for the whole task, no more localhost/IPv6 connection stall, fewer counts and repaints. Fix: filter with no target layer.
    💡 v4.8.8: Performance release. Multiple-selection list bounded by feature_picker_limit (sorted, server-side text search, Select All loads the full list) and one indexed lookup per click instead of a full-layer scan. Layer variables applied per layer in one batched write at project load. GEOS cascaded union, attribute-free source loading and immediate wake-up of interruptible Spatialite queries. Stale unsaved projects purged from the FilterMate database. INFO log level by default, timing lines (project_open, layer_change, task_filter) in filtermate.log.
    💡 v4.8.7: Consistent controls, button bars and panel backgrounds across dark, light and gray themes. Clearer Exploring titles and configuration text. Fix icon-theme synchronization errors and avoid repeated work during bulk layer removal and shutdown.
    💡 v4.8.6: QGIS 3/4 theme synchronization for existing profiles, readable dark-mode PNG icons and aligned filtering rows. Retains Qt5/Qt6 checkbox and mouse-event fixes.
    💡 v4.8.4: Fixed the checkbox primitive name (PE_IndicatorItemViewItemCheck) and mouse position handling across Qt5 and Qt6.
    💡 v4.8.3: Config log cleanup — the "Schema file not found" message logged on every config reload (config_schema.json was intentionally removed in a prior release) is now Info instead of Warning. Also closed out 2 live-testing reports as confirmed non-bugs (QGIS3-named settings path is QGIS 4.2's own behavior; "Adding layers" progress is QGIS-core, not FilterMate).
    💡 v4.8.2: 🚑 Second QGIS 4.x hotfix — v4.8.1's fix still crashed ("DockWidgetFeature has no attribute AllDockWidgetFeatures"): that convenience constant was deprecated in Qt 5.13 and fully removed in Qt6, not just rescoped. Now ORs the 3 individual flags it used to expand to.
    💡 v4.8.1: 🚑 Critical fix for QGIS 4.x — the dockwidget failed to load entirely ("QDockWidget has no attribute AllDockWidgetFeatures") because PyQt6's UI loader can't resolve the .ui file's features flag; now set programmatically instead. Also fixed BatchFilterAlgorithm.tr() crashing the Processing Toolbox entry. Found via real-world QGIS 4.2/Windows testing right after v4.8.0 shipped.
    💡 v4.8.0: 🎉 Full QGIS 4.2 / Qt6 support! Three sweeps across the whole codebase — QMetaType field-type migration, QtWidgets→QtGui relocations (QShortcut & co.), remaining flat-enum fixes — plus 2 AST regression guards to keep it that way. New: FilterMate algorithms now in the Processing Toolbox (batch-filter multiple layers with one expression).
    💡 v4.7.3: Stability + Qt6-readiness release. Fix crash on QGIS 4.0.1/Windows when the standalone sip package wasn't importable (unguarded top-level import in the dockwidget). Security — resolved all Bandit findings (asserts replaced with explicit raises, corrected nosec code for ElementTree import, documented exception-suppression guards). Qt6 readiness — qualified ~165 flat PyQt/PyQGIS enum accesses to their scoped form and dropped exec_() across 50 files, no Qt5 behavior change.
    💡 v4.7.2: Spatial filtering fixes (SpatiaLite source_srid staleness causing silent 0-feature filters, Custom Selection "all-features" mode no longer shadowed by a stale layer selection), export hardening (blocked export with no Exploring selection, SHP/batch warnings surfaced, GPKG styles embedded on reprojection + streaming, empty-layer streaming crash fixed, partial-file cleanup on failure/cancel, format registry consolidation, ~900 LOC dead export code removed), HIDPI display fix (combobox/input stuck at 20px on 4K/Retina/150%%+ scaling)
    💡 v4.7.1: Hardening release — export pipeline (12 fixes across SHP/CSV/GPKG/SpatiaLite/ZIP), spatialite cascade (drop GeomFromGPB wrap, preserve ST_* + EXISTS/NOT predicates), Qt main-thread marshalling for QGISFilterMateAccessor, REST API hardening (503 favorites, no input echo, 1 MiB body cap, api_key hash-at-rest), portable Git SHA-256 digest enforcement, favorites deep audit follow-through (37 findings, FavoritesSpatialHandler extraction, FavoritesError exception family), auto-zoom on filtered union, +200 tests (1493 ✅)

    📖 Full docs: https://imagodata.github.io/filter_mate

tracker=https://github.com/imagodata/filter_mate/issues
repository=https://github.com/imagodata/filter_mate
# End of mandatory metadata

# Recommended items: regexp

hasProcessingProvider=yes

changelog=v4.9.2 (2026-09-14): GeoPackage layer empty (0 features) when re-filtered as a source after being filtered as a target fixed (the subset combiners dropped a closing parenthesis of the R-tree subset, invalid SQL accepted silently by OGR); with the combine option off the new source filter replaces the previous subset instead of being ANDed to it (targets already did).
    v4.9.1 (2026-09-14): Filter refused on the first click and accepted on the second on PostgreSQL selections of 100 000 features or more (the materialized-view path called a facade method that does not exist) fixed; Python error after a project switch (RuntimeError on the deleted previous layer in the exploring and filtering controllers) fixed; QGIS access violation after a plugin reload followed by a project close fixed (the dock widget is removed and deleted on unload, no feature-picker gather outlives its layer); layer_change_validate / layer_change_reset timing lines.

# Tags are comma separated with spaces allowed
tags=python,filter,vector,layers,geofilter,search,postgis,ogr,spatialite,data,exploration,subset,export

homepage=https://imagodata.github.io/filter_mate/
category=Plugins
icon=icon.png
# experimental flag
experimental=False

# deprecated flag (applies to the whole plugin, not just a single version)
deprecated=False

# Since QGIS 3.8, a comma separated list of plugins to be installed
# (or upgraded) can be specified.
# Check the documentation for more information.
# plugin_dependencies=

Category of the plugin: Raster, Vector, Database or Web
#category=Database

# If the plugin can run on QGIS Server.
server=False
