* [feat] can now add a new tag from the tag library panel
* [feat] can remove tags from the tag library panel
[fix] library panel updates tag list when a new tag is create
* [test] added test for library->remove_tag
* [fix] type error
* removed redundant lambda
Co-authored-by: VasigaranAndAngel <72515046+VasigaranAndAngel@users.noreply.github.com>
* fix: tags with a reserved id could be edited or removed, now they cannot.
* fix: when a tag is removed or edited the preivew panel will update to reflect the changes
Co-authored-by: Sean Krueger <skrueger2270@gmail.com>
* fix: mypy check
* fix: aliases and subtags not being removed from DB when tag they reference was removed.
* feat: added a confirmation message box when removing tags.
* fix: mypy
---------
Co-authored-by: VasigaranAndAngel <72515046+VasigaranAndAngel@users.noreply.github.com>
Co-authored-by: Sean Krueger <skrueger2270@gmail.com>
* fix: bug where preview_panel tag was out of date compared to tag in database after edits where made using the tagDatabasePanel
* fix: changes made in the preview panel are saved to the database
* feat: Drag and drop files in and out of TagStudio (#153)
* Ability to drop local files in to TagStudio to add to library
* Added renaming option to drop import
* Improved readability and switched to pathLib
* format
* Apply suggestions from code review
Co-authored-by: yed podtrzitko <yedpodtrzitko@users.noreply.github.com>
* Revert Change
* Update tagstudio/src/qt/modals/drop_import.py
Co-authored-by: yed podtrzitko <yedpodtrzitko@users.noreply.github.com>
* Added support for folders
* formatting
* Progress bars added
* Added Ability to Drag out of window
* f
* format
* Ability to drop local files in to TagStudio to add to library
* Added renaming option to drop import
* Improved readability and switched to pathLib
* format
* Apply suggestions from code review
Co-authored-by: yed podtrzitko <yedpodtrzitko@users.noreply.github.com>
* Revert Change
* Update tagstudio/src/qt/modals/drop_import.py
Co-authored-by: yed podtrzitko <yedpodtrzitko@users.noreply.github.com>
* Added support for folders
* formatting
* Progress bars added
* Added Ability to Drag out of window
* f
* format
* format
* formatting and refactor
* format again
* formatting for mypy
* convert lambda to func for clarity
* mypy fixes
* fixed dragout only worked on selected
* Refactor typo, Add license
* Reformat QMessageBox
* Disable drops when no library is open
Co-authored-by: Sean Krueger <skrueger2270@gmail.com>
* Rebased onto SQL migration
* Updated logic to based on selected grid_idx instead of selected ids
* Add newly dragged-in files to SQL database
* Fix buttons being inconsistant across platforms
* Fix ruff formatting
* Rename "override" button to "overwrite"
---------
Co-authored-by: yed podtrzitko <yedpodtrzitko@users.noreply.github.com>
Co-authored-by: Travis Abendshien <lvnvtravis@gmail.com>
Co-authored-by: Sean Krueger <skrueger2270@gmail.com>
* refactor: Update dialog and simplify drop import logic
* Handle Qt events for main window in ts_qt.py
* Replace magic values with enums
* Match import duplicate file dialog to delete missing entry dialog
* Remove excessive progess widgets
* Add docstrings and logging
* refactor: add function for common ProgressWidget use
Extracts the create_progress_bar function from drop_import to the
ProgressWidget class. Instead of creating a ProgressWidget,
FunctionIterator, and CustomRunnable every time a thread-safe progress
widget is needed, the from_iterable function in ProgressWidget now
handles all of that.
---------
Co-authored-by: Creepler13 <denis.schlichting03@gmail.com>
Co-authored-by: yed podtrzitko <yedpodtrzitko@users.noreply.github.com>
Co-authored-by: Travis Abendshien <lvnvtravis@gmail.com>
* add files
* fix: term was parsing ANDList instead of ORList
* make mypy happy
* ruff format
* add missing todo
* add more constraint types
* add parent property to AST
* add BaseVisitor class
* make mypy happy
* add __init__.py
* Revert "make mypy happy"
This reverts commit 926d0dd2e79d06203e84e2f83c06c7fe5b33de23.
* refactoring and fixes
* rudimentary search field integration
* fix: check for None properly
* fix: Entries without Tags are now searchable
* make mypy happy
* Revert "fix: Entries without Tags are now searchable"
This reverts commit 19b40af7480b0c068b81b642b51536a9ec96d030.
* fix: changed joins to outerjoins and added missing outerjoin
* use query lang instead of tag_id FIlterState
* add todos
* fix: remove uncecessary line that broke search when searching for exact name
* fix tag search
* refactoring
* fix: path now uses GLOB operator for proper GLOBs
* refactoring: remove FilterState.id and implement Library.get_entry_full as replacement
* fix: use default value notation instead of if None statement in __post_init__
* remove obsolete Search Mode UI and related code
* ruff fixes
* remove obsolete tests
* fix: item_thumb didn't query entries correctly
* fix: search_library now correctly returns the number of *unique* entries
* make mypy happy
* implement NOT
* remove obsolete filename search
* remove summary as it is not applicable anymore
* finish refactoring of FilterState
* implement special:untagged
* fix: make mypy happy
* Revert changes to search_tags in favor of changes from #604
* fix: also port test changes
* fix: remove unneccessary import
* fix: remove unused dataclass
* fix: AND now works correctly with tags
* simplify structure of parsed AST
* add performance logging
* perf: Improve performance of search by reducing number of required joins from 4 to 1
* perf: double NOT is now optimized out of the AST
* fix: bug where pages would show less than the configured number of entries
* Revert "add performance logging"
This reverts commit c3c7d7546d.
* fix: tag_id search was broken
* somewhat adapt the existing autocompletion to this PR
* perf: Use Relational Division Queries to improve Query Execution Time
* fix: raise Exception so as to not fail silently
* fix: Parser bug broke parentheses
* little bit of clean up
* remove unnecessary comment
* add library for testing search
* feat: add basic tests
* fix: and queries containing just one tag were broken
* chore: remove debug code
* feat: more tests
* refactor: more consistent name for variable
Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com>
* fix: ruff check complaint over double import
---------
Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com>
* port fixes from json branch
* fix: correctly pass grid_idx in autofill macro
* fix(BUILD_URL macro): only add url if url was successfully built
* fix(AUTOFILL macro): error when trying to add tag with name that already exists
* fix: test was wrongly renaming sidecar file
* Added a check to see if the library is loaded in filter_items
* Returned check to see if there is an engine
---------
Co-authored-by: gred <gred25@yandex.ru>
* feat(ui): add PagedPanel widget
* feat(ui): add MigrationModal widget
* feat: add basic json to sql conversion
* fix: chose `poolclass` based on file or memory db
* feat: migrate tag colors from json to sql
* feat: migrate entry fields from json to sql
- fix: tag name column no longer has unique constraint
- fix: tags are referenced by id in db queries
- fix: tag_search_panel no longer queries db on initialization; does not regress to empty search window when shown
- fix: tag name search no longer uses library grid FilterState object
- fix: tag name search now respects tag limit
* set default `is_new` case
* fix: limit correct tag query
* feat: migrate tag aliases and subtags from json to sql
* add migration timer
* fix(tests): fix broken tests
* rename methods, add docstrings
* revert tag id search, split tag name search
* fix: use correct type in sidecar macro
* tests: add json migration tests
* fix: drop leading dot from json extensions
* add special characters to json db test
* tests: add file path and entry field parity checks
* fix(ui): tag manager no longer starts empty
* fix: read old windows paths as posix
Addresses #298
* tests: add posix + windows paths to json library
* tests: add subtag, alias, and shorthand parity tests
* tests: ensure no none values in parity checks
* tests: add tag color test, use tag id in tag tests
* tests: fix and optimize tests
* tests: add discrepancy tracker
* refactor: reduce duplicate UI code
* fix: load non-sequential entry ids
* fix(ui): sort tags in the preview panel
* tests(fix): prioritize `None` check over equality
* fix(tests): fix multi "same tag field type" tests
* ui: increase height of migration modal
* feat: add progress bar to migration ui
* fix(ui): sql values update earlier
* refactor: use `get_color_from_str` in test
* refactor: migrate tags before aliases and subtags
* remove unused assertion
* refactor: use `json_migration_req` flag
* feat: Audio Playback
Add the ability to play audio files.
Add a slider to seek through an audio file.
Add play/pause and mute/unmute buttons for audio files.
Note: This is a continuation of a mistakenly closed PR:
Ref: https://github.com/TagStudioDev/TagStudio/pull/529
While redoing the changes, I made a couple of improvements.
When the end of the track is reached, the pause button will
swap to the play button and allow the track to be replayed.
Here is the original feature request:
Ref: https://github.com/TagStudioDev/TagStudio/issues/450
* fix: prevent autoplay on new track when paused
* refactor: Add MediaPlayer base class.
Added a MediaPlayer base class per some suggestions
in the PR comments. Hopefully this reduces duplicate code
between the audio/video player in the future.
* refactor: add controls to base MediaPlayer class
Move media controls from the AudioPlayer widget
to the MediaPlayer base class. This removes the need
for a separate AudioPlayer class, and allows the
video player to reuse the media controls.
* fix: position_label update with slider
Update the position_label when the slider is moving.
* fix: replace platform dependent time formatting
Replace the use of `-` in the time format since this
is not availabile on all platforms.
Update initial `position_label` value to '0:00'.
* fix(ui): display loading icon before rendered thumb
* fix: skip out of range thumbs
* fix: optimize library refreshing
* fix(ui): tag colors show correct names
* fix(ui): ensure inner field containers are deleted
* fix(ui): don't show default preview label text
* fix: catch all missing file thumbs; clean up logs
* fix: mypy error in ts_qt
* fix: mypy error in file_opener due to conflicting types
* fix: remove unnecessary type ignores
* refix type ignore comments
* partially revert "refix type ignore comments" due to being implemented in #608
This changes the behavior of the tag name inside `BuildTagPanel` for newly created tags:
* The default "New Tag" name is now automatically highlighted
* Blank tag names (including spaces) are no longer allowed to be created
* NOTE: This does not change the tag name column rules in the db, nor does it necessarily need to
***
* [Feature Request]: Make the create tag panel have empty tag name field
* [Feature Request]: Make the create tag panel have empty tag name field
* Revert "[Feature Request]: Make the create tag panel have empty tag name field"
This reverts commit f9c7f5d889.
* [Feature Request]: Make the create tag panel have empty tag name field
* Revert "[Feature Request]: Make the create tag panel have empty tag name field"
This reverts commit e5df3e0f15.
* Update .gitignore
* Updated as per disscussion in issue #591 (DRAFT
* Updated as per disscussion in issue #591 (DRAFT
* Added formatting
* Updated code as per discussion is #592
* Updated code as per discussion is #592 (again)
* Fixed spacing
* Add placeholder text to name field.
Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com>
* Use universal red color for red border.
Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com>
* fix: add `src.core.palette` imports
---------
Co-authored-by: Travis Abendshien <46939827+CyanVoxel@users.noreply.github.com>
* feat: add autocomplete for mediatype, filetype, path, tag, and tag_id searches
* fix: address issues brought up in review
* fix: fix mypy issue
* fix: fix mypy issues for real this time