Implement favorite plugins list; Better text search

This commit is contained in:
falkTX 2019-10-24 17:28:23 +02:00
parent e1021ae3a2
commit 30b7b26375
4 changed files with 130 additions and 40 deletions

Binary file not shown.

View File

@ -5,6 +5,7 @@
<file>16x16/application-exit.svgz</file>
<file>16x16/arrow-right.svgz</file>
<file>16x16/bookmarks.svgz</file>
<file>16x16/configure.svgz</file>
<file>16x16/dialog-cancel.svgz</file>
<file>16x16/dialog-error.svgz</file>

View File

@ -25,7 +25,7 @@
<x>0</x>
<y>0</y>
<width>164</width>
<height>268</height>
<height>254</height>
</rect>
</property>
<attribute name="label">
@ -253,40 +253,47 @@
</widget>
</item>
<item row="5" column="1">
<widget class="QCheckBox" name="ch_inline_display">
<property name="text">
<string>With Inline Display</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="ch_stereo">
<property name="text">
<string>Stereo only</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="ch_rtsafe">
<property name="text">
<string>Real-time safe only</string>
</property>
</widget>
</item>
<item row="4" column="1">
<widget class="QCheckBox" name="ch_gui">
<property name="text">
<string>With Custom GUI </string>
</property>
</widget>
</item>
<item row="3" column="1">
<item row="4" column="1">
<widget class="QCheckBox" name="ch_cv">
<property name="text">
<string>With CV Ports</string>
</property>
</widget>
</item>
<item row="2" column="1">
<widget class="QCheckBox" name="ch_rtsafe">
<property name="text">
<string>Real-time safe only</string>
</property>
</widget>
</item>
<item row="3" column="1">
<widget class="QCheckBox" name="ch_stereo">
<property name="text">
<string>Stereo only</string>
</property>
</widget>
</item>
<item row="6" column="1">
<widget class="QCheckBox" name="ch_inline_display">
<property name="text">
<string>With Inline Display</string>
</property>
</widget>
</item>
<item row="1" column="1">
<widget class="QCheckBox" name="ch_favorites">
<property name="text">
<string>Favorites only</string>
</property>
</widget>
</item>
</layout>
</widget>
</widget>
@ -758,6 +765,9 @@
<property name="wordWrap">
<bool>false</bool>
</property>
<attribute name="horizontalHeaderMinimumSectionSize">
<number>24</number>
</attribute>
<attribute name="horizontalHeaderStretchLastSection">
<bool>true</bool>
</attribute>
@ -770,6 +780,21 @@
<attribute name="verticalHeaderDefaultSectionSize">
<number>22</number>
</attribute>
<column>
<property name="text">
<string notr="true"/>
</property>
<property name="toolTip">
<string notr="true"/>
</property>
<property name="whatsThis">
<string notr="true"/>
</property>
<property name="icon">
<iconset resource="../resources.qrc">
<normaloff>:/16x16/bookmarks.svgz</normaloff>:/16x16/bookmarks.svgz</iconset>
</property>
</column>
<column>
<property name="text">
<string>Name</string>

View File

@ -24,7 +24,7 @@ from subprocess import Popen, PIPE
from PyQt5.QtCore import pyqtSignal, pyqtSlot, Qt, QEventLoop, QThread, QSettings
from PyQt5.QtGui import QPixmap
from PyQt5.QtWidgets import QApplication, QDialog, QDialogButtonBox, QTableWidgetItem
from PyQt5.QtWidgets import QApplication, QDialog, QDialogButtonBox, QHeaderView, QTableWidgetItem
# ---------------------------------------------------------------------------------------------------------------------
# Imports (Custom)
@ -1380,10 +1380,11 @@ class PluginRefreshW(QDialog):
# Plugin Database Dialog
class PluginDatabaseW(QDialog):
TABLEWIDGET_ITEM_NAME = 0
TABLEWIDGET_ITEM_LABEL = 1
TABLEWIDGET_ITEM_MAKER = 2
TABLEWIDGET_ITEM_BINARY = 3
TABLEWIDGET_ITEM_FAVORITE = 0
TABLEWIDGET_ITEM_NAME = 1
TABLEWIDGET_ITEM_LABEL = 2
TABLEWIDGET_ITEM_MAKER = 3
TABLEWIDGET_ITEM_BINARY = 4
def __init__(self, parent, host):
QDialog.__init__(self, parent)
@ -1402,6 +1403,8 @@ class PluginDatabaseW(QDialog):
self.fLastTableIndex = 0
self.fRetPlugin = None
self.fRealParent = parent
self.fFavoritePlugins = []
self.fFavoritePluginsChanged = False
self.fTrYes = self.tr("Yes")
self.fTrNo = self.tr("No")
@ -1468,7 +1471,8 @@ class PluginDatabaseW(QDialog):
self.ui.b_clear_filters.clicked.connect(self.slot_clearFilters)
self.ui.lineEdit.textChanged.connect(self.slot_checkFilters)
self.ui.tableWidget.currentCellChanged.connect(self.slot_checkPlugin)
self.ui.tableWidget.cellDoubleClicked.connect(self.slot_addPlugin)
self.ui.tableWidget.cellClicked.connect(self.slot_cellClicked)
self.ui.tableWidget.cellDoubleClicked.connect(self.slot_cellDoubleClicked)
self.ui.ch_internal.clicked.connect(self.slot_checkFilters)
self.ui.ch_ladspa.clicked.connect(self.slot_checkFilters)
@ -1485,6 +1489,7 @@ class PluginDatabaseW(QDialog):
self.ui.ch_native.clicked.connect(self.slot_checkFilters)
self.ui.ch_bridged.clicked.connect(self.slot_checkFilters)
self.ui.ch_bridged_wine.clicked.connect(self.slot_checkFilters)
self.ui.ch_favorites.clicked.connect(self.slot_checkFilters)
self.ui.ch_rtsafe.clicked.connect(self.slot_checkFilters)
self.ui.ch_cv.clicked.connect(self.slot_checkFilters)
self.ui.ch_gui.clicked.connect(self.slot_checkFilters)
@ -1499,10 +1504,34 @@ class PluginDatabaseW(QDialog):
# --------------------------------------------------------------------------------------------------------
@pyqtSlot(int, int)
def slot_cellClicked(self, row, column):
if column == self.TABLEWIDGET_ITEM_FAVORITE:
widget = self.ui.tableWidget.item(row, self.TABLEWIDGET_ITEM_FAVORITE)
plugin = self.ui.tableWidget.item(row, self.TABLEWIDGET_ITEM_NAME).data(Qt.UserRole+1)
plugin = self._createFavoritePluginDict(plugin)
if widget.checkState() == Qt.Checked:
if not plugin in self.fFavoritePlugins:
self.fFavoritePlugins.append(plugin)
self.fFavoritePluginsChanged = True
else:
try:
self.fFavoritePlugins.remove(plugin)
self.fFavoritePluginsChanged = True
except ValueError:
pass
@pyqtSlot(int, int)
def slot_cellDoubleClicked(self, row, column):
if column != self.TABLEWIDGET_ITEM_FAVORITE:
self.slot_addPlugin()
@pyqtSlot()
def slot_addPlugin(self):
if self.ui.tableWidget.currentRow() >= 0:
self.fRetPlugin = self.ui.tableWidget.item(self.ui.tableWidget.currentRow(), 0).data(Qt.UserRole+1)
self.fRetPlugin = self.ui.tableWidget.item(self.ui.tableWidget.currentRow(),
self.TABLEWIDGET_ITEM_NAME).data(Qt.UserRole+1)
self.accept()
else:
self.reject()
@ -1511,7 +1540,8 @@ class PluginDatabaseW(QDialog):
def slot_checkPlugin(self, row):
if row >= 0:
self.ui.b_add.setEnabled(True)
plugin = self.ui.tableWidget.item(self.ui.tableWidget.currentRow(), 0).data(Qt.UserRole+1)
plugin = self.ui.tableWidget.item(self.ui.tableWidget.currentRow(),
self.TABLEWIDGET_ITEM_NAME).data(Qt.UserRole+1)
isSynth = bool(plugin['hints'] & PLUGIN_IS_SYNTH)
isEffect = bool(plugin['audio.ins'] > 0 < plugin['audio.outs'] and not isSynth)
@ -1610,6 +1640,7 @@ class PluginDatabaseW(QDialog):
self.ui.ch_bridged.setChecked(False)
self.ui.ch_bridged_wine.setChecked(False)
self.ui.ch_favorites.setChecked(False)
self.ui.ch_rtsafe.setChecked(False)
self.ui.ch_stereo.setChecked(False)
self.ui.ch_cv.setChecked(False)
@ -1621,6 +1652,8 @@ class PluginDatabaseW(QDialog):
if self.ui.ch_au.isEnabled():
self.ui.ch_au.setChecked(True)
self.ui.lineEdit.clear()
self.blockSignals(False)
self._checkFilters()
@ -1631,7 +1664,7 @@ class PluginDatabaseW(QDialog):
def slot_saveSettings(self):
settings = QSettings("falkTX", "CarlaDatabase2")
settings.setValue("PluginDatabase/Geometry", self.saveGeometry())
settings.setValue("PluginDatabase/TableGeometry_5", self.ui.tableWidget.horizontalHeader().saveState())
settings.setValue("PluginDatabase/TableGeometry_6", self.ui.tableWidget.horizontalHeader().saveState())
settings.setValue("PluginDatabase/ShowEffects", self.ui.ch_effects.isChecked())
settings.setValue("PluginDatabase/ShowInstruments", self.ui.ch_instruments.isChecked())
settings.setValue("PluginDatabase/ShowMIDI", self.ui.ch_midi.isChecked())
@ -1647,6 +1680,7 @@ class PluginDatabaseW(QDialog):
settings.setValue("PluginDatabase/ShowNative", self.ui.ch_native.isChecked())
settings.setValue("PluginDatabase/ShowBridged", self.ui.ch_bridged.isChecked())
settings.setValue("PluginDatabase/ShowBridgedWine", self.ui.ch_bridged_wine.isChecked())
settings.setValue("PluginDatabase/ShowFavorites", self.ui.ch_favorites.isChecked())
settings.setValue("PluginDatabase/ShowRtSafe", self.ui.ch_rtsafe.isChecked())
settings.setValue("PluginDatabase/ShowHasCV", self.ui.ch_cv.isChecked())
settings.setValue("PluginDatabase/ShowHasGUI", self.ui.ch_gui.isChecked())
@ -1654,10 +1688,16 @@ class PluginDatabaseW(QDialog):
settings.setValue("PluginDatabase/ShowStereoOnly", self.ui.ch_stereo.isChecked())
settings.setValue("PluginDatabase/SearchText", self.ui.lineEdit.text())
if self.fFavoritePluginsChanged:
settings.setValue("PluginDatabase/Favorites", self.fFavoritePlugins)
# --------------------------------------------------------------------------------------------------------
def loadSettings(self):
settings = QSettings("falkTX", "CarlaDatabase2")
self.fFavoritePlugins = settings.value("PluginDatabase/Favorites", [], type=list)
self.fFavoritePluginsChanged = False
self.restoreGeometry(settings.value("PluginDatabase/Geometry", b""))
self.ui.ch_effects.setChecked(settings.value("PluginDatabase/ShowEffects", True, type=bool))
self.ui.ch_instruments.setChecked(settings.value("PluginDatabase/ShowInstruments", True, type=bool))
@ -1674,6 +1714,7 @@ class PluginDatabaseW(QDialog):
self.ui.ch_native.setChecked(settings.value("PluginDatabase/ShowNative", True, type=bool))
self.ui.ch_bridged.setChecked(settings.value("PluginDatabase/ShowBridged", True, type=bool))
self.ui.ch_bridged_wine.setChecked(settings.value("PluginDatabase/ShowBridgedWine", True, type=bool))
self.ui.ch_favorites.setChecked(settings.value("PluginDatabase/ShowFavorites", False, type=bool))
self.ui.ch_rtsafe.setChecked(settings.value("PluginDatabase/ShowRtSafe", False, type=bool))
self.ui.ch_cv.setChecked(settings.value("PluginDatabase/ShowHasCV", False, type=bool))
self.ui.ch_gui.setChecked(settings.value("PluginDatabase/ShowHasGUI", False, type=bool))
@ -1681,14 +1722,30 @@ class PluginDatabaseW(QDialog):
self.ui.ch_stereo.setChecked(settings.value("PluginDatabase/ShowStereoOnly", False, type=bool))
self.ui.lineEdit.setText(settings.value("PluginDatabase/SearchText", "", type=str))
tableGeometry = settings.value("PluginDatabase/TableGeometry_5")
tableGeometry = settings.value("PluginDatabase/TableGeometry_6")
horizontalHeader = self.ui.tableWidget.horizontalHeader()
if tableGeometry:
self.ui.tableWidget.horizontalHeader().restoreState(tableGeometry)
horizontalHeader.restoreState(tableGeometry)
else:
self.ui.tableWidget.sortByColumn(0, Qt.AscendingOrder)
horizontalHeader.setSectionResizeMode(self.TABLEWIDGET_ITEM_FAVORITE, QHeaderView.Fixed)
self.ui.tableWidget.setColumnWidth(self.TABLEWIDGET_ITEM_FAVORITE, 24)
self.ui.tableWidget.setColumnWidth(self.TABLEWIDGET_ITEM_NAME, 250)
self.ui.tableWidget.setColumnWidth(self.TABLEWIDGET_ITEM_LABEL, 200)
self.ui.tableWidget.setColumnWidth(self.TABLEWIDGET_ITEM_MAKER, 150)
self.ui.tableWidget.sortByColumn(self.TABLEWIDGET_ITEM_NAME, Qt.AscendingOrder)
# --------------------------------------------------------------------------------------------------------
def _createFavoritePluginDict(self, plugin):
return {
'name' : plugin['name'],
'build' : plugin['build'],
'type' : plugin['type'],
'filename': plugin['filename'],
'label' : plugin['label'],
'uniqueId': plugin['uniqueId'],
}
def _checkFilters(self):
text = self.ui.lineEdit.text().lower()
@ -1710,6 +1767,7 @@ class PluginDatabaseW(QDialog):
hideBridged = not self.ui.ch_bridged.isChecked()
hideBridgedWine = not self.ui.ch_bridged_wine.isChecked()
hideNonFavs = self.ui.ch_favorites.isChecked()
hideNonRtSafe = self.ui.ch_rtsafe.isChecked()
hideNonCV = self.ui.ch_cv.isChecked()
hideNonGui = self.ui.ch_gui.isChecked()
@ -1729,8 +1787,8 @@ class PluginDatabaseW(QDialog):
rowCount = self.ui.tableWidget.rowCount()
for i in range(self.fLastTableIndex):
plugin = self.ui.tableWidget.item(i, 0).data(Qt.UserRole+1)
ptext = self.ui.tableWidget.item(i, 0).data(Qt.UserRole+2)
plugin = self.ui.tableWidget.item(i, self.TABLEWIDGET_ITEM_NAME).data(Qt.UserRole+1)
ptext = self.ui.tableWidget.item(i, self.TABLEWIDGET_ITEM_NAME).data(Qt.UserRole+2)
aIns = plugin['audio.ins']
aOuts = plugin['audio.outs']
cvIns = plugin['cv.ins']
@ -1794,7 +1852,9 @@ class PluginDatabaseW(QDialog):
self.ui.tableWidget.hideRow(i)
elif hideNonStereo and not isStereo:
self.ui.tableWidget.hideRow(i)
elif text and text not in ptext:
elif text and not all(t in ptext for t in text.strip().split(' ')):
self.ui.tableWidget.hideRow(i)
elif hideNonFavs and self._createFavoritePluginDict(plugin) not in self.fFavoritePlugins:
self.ui.tableWidget.hideRow(i)
else:
self.ui.tableWidget.showRow(i)
@ -1809,13 +1869,17 @@ class PluginDatabaseW(QDialog):
index = self.fLastTableIndex
favItem = QTableWidgetItem()
favItem.setCheckState(Qt.Checked if self._createFavoritePluginDict(plugin) in self.fFavoritePlugins else Qt.Unchecked)
pluginText = (plugin['name']+plugin['label']+plugin['maker']+plugin['filename']).lower()
self.ui.tableWidget.setItem(index, self.TABLEWIDGET_ITEM_FAVORITE, favItem)
self.ui.tableWidget.setItem(index, self.TABLEWIDGET_ITEM_NAME, QTableWidgetItem(plugin['name']))
self.ui.tableWidget.setItem(index, self.TABLEWIDGET_ITEM_LABEL, QTableWidgetItem(plugin['label']))
self.ui.tableWidget.setItem(index, self.TABLEWIDGET_ITEM_MAKER, QTableWidgetItem(plugin['maker']))
self.ui.tableWidget.setItem(index, self.TABLEWIDGET_ITEM_BINARY, QTableWidgetItem(os.path.basename(plugin['filename'])))
self.ui.tableWidget.item(index, 0).setData(Qt.UserRole+1, plugin)
self.ui.tableWidget.item(index, 0).setData(Qt.UserRole+2, pluginText)
self.ui.tableWidget.item(index, self.TABLEWIDGET_ITEM_NAME).setData(Qt.UserRole+1, plugin)
self.ui.tableWidget.item(index, self.TABLEWIDGET_ITEM_NAME).setData(Qt.UserRole+2, pluginText)
self.fLastTableIndex += 1