Skip to content

Commit

Permalink
ux: use native dialog by default, allow multiple folders with Shift
Browse files Browse the repository at this point in the history
  • Loading branch information
yedpodtrzitko committed Nov 24, 2024
1 parent 2c4b6fb commit e3cdd19
Show file tree
Hide file tree
Showing 2 changed files with 15 additions and 10 deletions.
23 changes: 14 additions & 9 deletions tagstudio/src/qt/widgets/library_dirs.py
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@
from PySide6.QtCore import Qt
from PySide6.QtWidgets import (
QAbstractItemView,
QApplication,
QCheckBox,
QFileDialog,
QHBoxLayout,
Expand Down Expand Up @@ -87,24 +88,28 @@ def create_panel(self):
# add a button which will open a library folder dialog
button = QPushButton("Add Folder")
button.setCursor(Qt.CursorShape.PointingHandCursor)
button.clicked.connect(self.add_folders)
button.clicked.connect(self.add_folders_callback)
self.root_layout.addWidget(button)

def add_folders(self):
"""Open QT dialog to select a folder to add into library."""
def add_folders_callback(self):
"""Open QT dialog to select a folder to add into library.
Allow multiple folders selection when holding Shift
"""
if not self.library.storage_path:
logger.info("add_folder: no library open")
# no library open, dont do anything
return

dialog = QFileDialog(self)
dialog.setFileMode(QFileDialog.FileMode.Directory)
dialog.setOption(QFileDialog.Option.DontUseNativeDialog)
dialog.setOption(QFileDialog.Option.ShowDirsOnly)
# Enable multiple selection
selection_mode = QAbstractItemView.SelectionMode.ExtendedSelection
dialog.findChildren(QListView)[0].setSelectionMode(selection_mode) # type: ignore
dialog.findChildren(QTreeView)[0].setSelectionMode(selection_mode) # type: ignore

mods = QApplication.keyboardModifiers()
if mods & Qt.KeyboardModifier.ShiftModifier:
dialog.setOption(QFileDialog.Option.DontUseNativeDialog)
selection_mode = QAbstractItemView.SelectionMode.ExtendedSelection
dialog.findChildren(QListView)[0].setSelectionMode(selection_mode) # type: ignore
dialog.findChildren(QTreeView)[0].setSelectionMode(selection_mode) # type: ignore

if dialog.exec() == QFileDialog.DialogCode.Accepted:
selected_dirs = dialog.selectedFiles()
Expand Down
2 changes: 1 addition & 1 deletion tagstudio/tests/qt/test_library_dirs_widget.py
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ def test_widget_select_folders(qt_driver):
mock_files.return_value = return_items

# When
widget.add_folders()
widget.add_folders_callback()

# Then
assert set(return_items).issubset({x.path for x in qt_driver.lib.get_folders()})

0 comments on commit e3cdd19

Please sign in to comment.