* feat: implement first class for translated widget
* feat: add further translated widget types
* refactor: replace usages of translate_qobject with appropriate classes
* refactor: remove wrapper classes
* refactor: remove unnecessary used of Translations.formatted
* refactor: remove further unnecessary format calls
* refactor: replace calls for Translations.formatted with calls to str.format and remove some unused code
* refactor: remove TranslatedString class
* refactor: replace translate_with_setter with direct calls to the setter
* ui: show more informative library error messages
* tests: add sqlite db migration tests
* tests: fix and refactor migration tests
* fix: apply db8 schema changes before repairing db6
* docs: add save file format change log
* chore: remove db version explanations from docstrings
* feat(ui): add language setting
* translations: implement remaining todos
* ui: show language names in settings instead of codes
* translations: add Dutch setting, anticipating #798
* feat: custom tag colors
* ui: minor ui polish
* ui: add confirmation for deleting colors
* ui: match tag_color_preview focused style
* ui: reduce spacing between color swatch groups
* ui!: change default behavior of secondary color
The secondary color now acts as only the text color by default, with the new `color_border` bool serving to optionally restore the previous text + colored border behavior.
* ui: adjust focused tag/color button styles
* fix: avoid namespace collision
* fix: make reserved namespace check case-insensitive
* ui: add namespace description + prompt
* fix: don't reset tag color if none are chosen
* refactor(ui): use form layout for build_color
* fix(ui): dynamically scale field title widget
* feat(ui): add additional tag shade colors
Add "burgundy", "dark-teal", and "dark_lavender" tag colors.
* fix: don't check for self in collision checks
* fix: update tag references on color update
* fix(ui): stop fields widgets expanding indefinitely
* fix(ui): don't update preview for non-selected badge toggles
* ui: optimize badge updating
NOTE: In theory this approach opens the doors for a visual state mismatch between the tags shown and the tags on the actual entry. The performance increase comes from the fact that `get_entry_full()` isn't called, which is the real bottleneck here.
* perf: optimize query methods
* fix(ui): expand usage of esc for closing modals
* chore: remove log statements
* refactor: use Qt enum in place of magic number
* ui: use enter key to save panel widgets
* feat(ui): recycle tag list in `TagSearchPanel`
* chore: address mypy warnings
* fix: order results from sql before limiting
* fix(ui): check for self.exclude before remaking sets
* fix(ui): only init tag manager and file ext manager once
* fix(ui:): remove redundant tag search panel updates
* update code comments and docstrings
* feat(ui): add tag view limit dropdown
* ensure disconnection of file_extension_panel.saved
* fix(ui): always reset tag search panel when opened
* feat: return parent tags in tag search
Known issue: this bypasses the tag_limit
* refactor: use consistant `datetime` imports
* refactor: sort by base tag name to improve performance
* fix: escape `&` when displaying tag names
* ui: show "create and add" tag with other results
* fix: optimize and fix tag result sorting
* feat(ui): allow tags in list to be selected and added by keyboard
* ui: use `esc` to reset search focus and/or close modal
* fix(ui): add pressed+focus styling to "create tag" button
* ui: use `esc` key to close `PanelWidget`
* ui: move disambiguation button to right side
* ui: expand clickable area of "-" tag button, improve styling
* ui: add "Ctrl+M" shortcut to open tag manager
* fix(ui): show "add tags" window title when accessing from home
* fix: move `path_strings` var inside `with` block
* refactor: move lambda to local function
* fix: catch `ParsingError` and return no results
* refactor: move `ParsingError` handling out to `QtDriver`
Reverts changes made to `test_search.py` and `enums.py`.
* chore: change version branch to "Pre-Release 1"
* docs: update docstring for JSON `open_library()`
Update method docstring with exact starting and ending versions now that they exist.
* docs: update README, CONTRIBUTING.md, & index.md
* docs: update roadmap
* docs: fix typo in README, change callout
* docs: update docs site with v9.5 features
* docs: remove warning from index.md
* implement copy/paste for fields and tags
* fix tests
* fixed badge refresh on pasting
* renamed translation field
* ignore duplicate tags on insert
* fixes
* break into several statements to satisfy tests
* chore: format with ruff
* fix: relink unlinked entry to existing entry without sql error (#720)
* edited and added db functions get_entry_full_by_path & merge_entries
* implemented edge case for entry existing on relinking
* added test for merge_entries
* fix: don't remove item while iterating over list
* fix: catch `FileNotFoundError` for unlinked raw files
* refactor: rename methods and variables in missing_files.py
* refactor: rename `missing_files_count` to `missing_file_entries_count`
---------
Co-authored-by: mashed5894 <mashed5894@gmail.com>