From 0caf48919cbdaf338d5ef7c57568ff0c204b609f Mon Sep 17 00:00:00 2001 From: Keith Edmunds Date: Sun, 22 Aug 2021 09:53:54 +0100 Subject: [PATCH] Implement database search by artist Fixes #31 --- app/model.py | 8 ++++++ app/musicmuster.py | 19 +++++++++++-- app/ui/dlg_SearchDatabase.ui | 47 ++++++++++++++++++++++---------- app/ui/dlg_search_database_ui.py | 33 ++++++++++++++-------- 4 files changed, 77 insertions(+), 30 deletions(-) diff --git a/app/model.py b/app/model.py index d9ea5e4..9967891 100644 --- a/app/model.py +++ b/app/model.py @@ -574,6 +574,14 @@ class Tracks(Base): return q.all() + @staticmethod + def search_artists(session, text): + return ( + session.query(Tracks) + .filter(Tracks.artist.ilike(f"%{text}%")) + .order_by(Tracks.title) + ).all() + @staticmethod def search_titles(session, text): return ( diff --git a/app/musicmuster.py b/app/musicmuster.py index fcef020..bb3eeb1 100755 --- a/app/musicmuster.py +++ b/app/musicmuster.py @@ -744,12 +744,13 @@ class DbDialog(QDialog): self.session = session self.ui = Ui_Dialog() self.ui.setupUi(self) - self.ui.searchString.textEdited.connect(self.chars_typed) - self.ui.matchList.itemDoubleClicked.connect(self.double_click) self.ui.btnAdd.clicked.connect(self.add_selected) self.ui.btnAddClose.clicked.connect(self.add_selected_and_close) self.ui.btnClose.clicked.connect(self.close) + self.ui.matchList.itemDoubleClicked.connect(self.double_click) self.ui.matchList.itemSelectionChanged.connect(self.selection_changed) + self.ui.radioTitle.toggled.connect(self.radio_toggle) + self.ui.searchString.textEdited.connect(self.chars_typed) record = Settings.get_int(self.session, "dbdialog_width") width = record.f_int or 800 @@ -778,9 +779,21 @@ class DbDialog(QDialog): self.add_selected() self.close() + def radio_toggle(self): + """ + Handle switching between searching for artists and searching for + titles + """ + + # Logic is handled already in chars_typed(), so just call that. + self.chars_typed(self.ui.searchString.text()) + def chars_typed(self, s): if len(s) > 0: - matches = Tracks.search_titles(self.session, s) + if self.ui.radioTitle.isChecked(): + matches = Tracks.search_titles(self.session, s) + else: + matches = Tracks.search_artists(self.session, s) self.ui.matchList.clear() if matches: for track in matches: diff --git a/app/ui/dlg_SearchDatabase.ui b/app/ui/dlg_SearchDatabase.ui index 5f3088e..ba48dee 100644 --- a/app/ui/dlg_SearchDatabase.ui +++ b/app/ui/dlg_SearchDatabase.ui @@ -6,15 +6,15 @@ 0 0 - 383 - 270 + 584 + 377 Dialog - - + + @@ -28,26 +28,36 @@ - + - - - - - - - - + - + + + &Title + + + true + + + + + + + &Artist + + + + + Qt::Horizontal - 88 + 40 20 @@ -79,6 +89,13 @@ + + + + + + + diff --git a/app/ui/dlg_search_database_ui.py b/app/ui/dlg_search_database_ui.py index 465e0a1..d82b29c 100644 --- a/app/ui/dlg_search_database_ui.py +++ b/app/ui/dlg_search_database_ui.py @@ -1,6 +1,6 @@ # -*- coding: utf-8 -*- -# Form implementation generated from reading ui file 'app/ui/dlg_SearchDatabase.ui' +# Form implementation generated from reading ui file 'ui/dlg_SearchDatabase.ui' # # Created by: PyQt5 UI code generator 5.15.4 # @@ -14,9 +14,9 @@ from PyQt5 import QtCore, QtGui, QtWidgets class Ui_Dialog(object): def setupUi(self, Dialog): Dialog.setObjectName("Dialog") - Dialog.resize(383, 270) - self.verticalLayout = QtWidgets.QVBoxLayout(Dialog) - self.verticalLayout.setObjectName("verticalLayout") + Dialog.resize(584, 377) + self.gridLayout_2 = QtWidgets.QGridLayout(Dialog) + self.gridLayout_2.setObjectName("gridLayout_2") self.gridLayout = QtWidgets.QGridLayout() self.gridLayout.setObjectName("gridLayout") self.label = QtWidgets.QLabel(Dialog) @@ -25,17 +25,20 @@ class Ui_Dialog(object): self.searchString = QtWidgets.QLineEdit(Dialog) self.searchString.setObjectName("searchString") self.gridLayout.addWidget(self.searchString, 0, 1, 1, 1) - self.verticalLayout.addLayout(self.gridLayout) + self.gridLayout_2.addLayout(self.gridLayout, 0, 0, 1, 1) self.matchList = QtWidgets.QListWidget(Dialog) self.matchList.setObjectName("matchList") - self.verticalLayout.addWidget(self.matchList) - self.dbPath = QtWidgets.QLabel(Dialog) - self.dbPath.setText("") - self.dbPath.setObjectName("dbPath") - self.verticalLayout.addWidget(self.dbPath) + self.gridLayout_2.addWidget(self.matchList, 1, 0, 1, 1) self.horizontalLayout = QtWidgets.QHBoxLayout() self.horizontalLayout.setObjectName("horizontalLayout") - spacerItem = QtWidgets.QSpacerItem(88, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) + self.radioTitle = QtWidgets.QRadioButton(Dialog) + self.radioTitle.setChecked(True) + self.radioTitle.setObjectName("radioTitle") + self.horizontalLayout.addWidget(self.radioTitle) + self.radioArtist = QtWidgets.QRadioButton(Dialog) + self.radioArtist.setObjectName("radioArtist") + self.horizontalLayout.addWidget(self.radioArtist) + spacerItem = QtWidgets.QSpacerItem(40, 20, QtWidgets.QSizePolicy.Expanding, QtWidgets.QSizePolicy.Minimum) self.horizontalLayout.addItem(spacerItem) self.btnAdd = QtWidgets.QPushButton(Dialog) self.btnAdd.setDefault(True) @@ -47,7 +50,11 @@ class Ui_Dialog(object): self.btnClose = QtWidgets.QPushButton(Dialog) self.btnClose.setObjectName("btnClose") self.horizontalLayout.addWidget(self.btnClose) - self.verticalLayout.addLayout(self.horizontalLayout) + self.gridLayout_2.addLayout(self.horizontalLayout, 2, 0, 1, 1) + self.dbPath = QtWidgets.QLabel(Dialog) + self.dbPath.setText("") + self.dbPath.setObjectName("dbPath") + self.gridLayout_2.addWidget(self.dbPath, 3, 0, 1, 1) self.retranslateUi(Dialog) QtCore.QMetaObject.connectSlotsByName(Dialog) @@ -56,6 +63,8 @@ class Ui_Dialog(object): _translate = QtCore.QCoreApplication.translate Dialog.setWindowTitle(_translate("Dialog", "Dialog")) self.label.setText(_translate("Dialog", "Title:")) + self.radioTitle.setText(_translate("Dialog", "&Title")) + self.radioArtist.setText(_translate("Dialog", "&Artist")) self.btnAdd.setText(_translate("Dialog", "&Add")) self.btnAddClose.setText(_translate("Dialog", "A&dd and close")) self.btnClose.setText(_translate("Dialog", "&Close"))