mirror of
https://github.com/kovidgoyal/calibre.git
synced 2025-07-09 03:04:10 -04:00
Allow searching for plugins by name in the install plugins dialog
Merge branch 'master' of https://github.com/tamasmajor/calibre
This commit is contained in:
commit
54c6e0e0cd
@ -14,11 +14,13 @@ from PyQt4.Qt import (Qt, QUrl, QFrame, QVBoxLayout, QLabel, QBrush, QTextEdit,
|
|||||||
QAbstractTableModel, QVariant, QTableView, QModelIndex,
|
QAbstractTableModel, QVariant, QTableView, QModelIndex,
|
||||||
QSortFilterProxyModel, QAction, QIcon, QDialog,
|
QSortFilterProxyModel, QAction, QIcon, QDialog,
|
||||||
QFont, QPixmap, QSize)
|
QFont, QPixmap, QSize)
|
||||||
|
from PyQt4.QtGui import QLineEdit
|
||||||
|
|
||||||
from calibre import browser, prints
|
from calibre import browser, prints
|
||||||
from calibre.constants import numeric_version, iswindows, isosx, DEBUG
|
from calibre.constants import numeric_version, iswindows, isosx, DEBUG
|
||||||
from calibre.customize.ui import (initialized_plugins, is_disabled, remove_plugin,
|
from calibre.customize.ui import (
|
||||||
add_plugin, enable_plugin, disable_plugin,
|
initialized_plugins, is_disabled, remove_plugin, add_plugin, enable_plugin, disable_plugin,
|
||||||
NameConflict, has_external_plugins)
|
NameConflict, has_external_plugins)
|
||||||
from calibre.gui2 import error_dialog, question_dialog, info_dialog, NONE, open_url, gprefs
|
from calibre.gui2 import error_dialog, question_dialog, info_dialog, NONE, open_url, gprefs
|
||||||
from calibre.gui2.preferences.plugins import ConfigWidget
|
from calibre.gui2.preferences.plugins import ConfigWidget
|
||||||
from calibre.utils.date import UNDEFINED_DATE, format_date
|
from calibre.utils.date import UNDEFINED_DATE, format_date
|
||||||
@ -105,6 +107,7 @@ def get_installed_plugin_status(display_plugin):
|
|||||||
|
|
||||||
|
|
||||||
class ImageTitleLayout(QHBoxLayout):
|
class ImageTitleLayout(QHBoxLayout):
|
||||||
|
|
||||||
'''
|
'''
|
||||||
A reusable layout widget displaying an image followed by a title
|
A reusable layout widget displaying an image followed by a title
|
||||||
'''
|
'''
|
||||||
@ -130,6 +133,7 @@ class ImageTitleLayout(QHBoxLayout):
|
|||||||
|
|
||||||
|
|
||||||
class SizePersistedDialog(QDialog):
|
class SizePersistedDialog(QDialog):
|
||||||
|
|
||||||
'''
|
'''
|
||||||
This dialog is a base class for any dialogs that want their size/position
|
This dialog is a base class for any dialogs that want their size/position
|
||||||
restored when they are next opened.
|
restored when they are next opened.
|
||||||
@ -176,6 +180,7 @@ class VersionHistoryDialog(SizePersistedDialog):
|
|||||||
|
|
||||||
|
|
||||||
class PluginFilterComboBox(QComboBox):
|
class PluginFilterComboBox(QComboBox):
|
||||||
|
|
||||||
def __init__(self, parent):
|
def __init__(self, parent):
|
||||||
QComboBox.__init__(self, parent)
|
QComboBox.__init__(self, parent)
|
||||||
items = [_('All'), _('Installed'), _('Update available'), _('Not installed')]
|
items = [_('All'), _('Installed'), _('Update available'), _('Not installed')]
|
||||||
@ -208,6 +213,10 @@ class DisplayPlugin(object):
|
|||||||
def is_installed(self):
|
def is_installed(self):
|
||||||
return self.installed_version is not None
|
return self.installed_version is not None
|
||||||
|
|
||||||
|
def name_matches_filter(self, filter_text):
|
||||||
|
# filter_text is already lowercase @set_filter_text
|
||||||
|
return filter_text in icu_lower(self.name) # case-insensitive filtering
|
||||||
|
|
||||||
def is_upgrade_available(self):
|
def is_upgrade_available(self):
|
||||||
return self.is_installed() and (self.installed_version < self.available_version
|
return self.is_installed() and (self.installed_version < self.available_version
|
||||||
or self.is_deprecated)
|
or self.is_deprecated)
|
||||||
@ -233,24 +242,29 @@ class DisplayPluginSortFilterModel(QSortFilterProxyModel):
|
|||||||
self.setSortRole(Qt.UserRole)
|
self.setSortRole(Qt.UserRole)
|
||||||
self.setSortCaseSensitivity(Qt.CaseInsensitive)
|
self.setSortCaseSensitivity(Qt.CaseInsensitive)
|
||||||
self.filter_criteria = FILTER_ALL
|
self.filter_criteria = FILTER_ALL
|
||||||
|
self.filter_text = ""
|
||||||
|
|
||||||
def filterAcceptsRow(self, sourceRow, sourceParent):
|
def filterAcceptsRow(self, sourceRow, sourceParent):
|
||||||
index = self.sourceModel().index(sourceRow, 0, sourceParent)
|
index = self.sourceModel().index(sourceRow, 0, sourceParent)
|
||||||
display_plugin = self.sourceModel().display_plugins[index.row()]
|
display_plugin = self.sourceModel().display_plugins[index.row()]
|
||||||
if self.filter_criteria == FILTER_ALL:
|
if self.filter_criteria == FILTER_ALL:
|
||||||
return not (display_plugin.is_deprecated and not display_plugin.is_installed())
|
return not (display_plugin.is_deprecated and not display_plugin.is_installed()) and display_plugin.name_matches_filter(self.filter_text)
|
||||||
if self.filter_criteria == FILTER_INSTALLED:
|
if self.filter_criteria == FILTER_INSTALLED:
|
||||||
return display_plugin.is_installed()
|
return display_plugin.is_installed() and display_plugin.name_matches_filter(self.filter_text)
|
||||||
if self.filter_criteria == FILTER_UPDATE_AVAILABLE:
|
if self.filter_criteria == FILTER_UPDATE_AVAILABLE:
|
||||||
return display_plugin.is_upgrade_available()
|
return display_plugin.is_upgrade_available() and display_plugin.name_matches_filter(self.filter_text)
|
||||||
if self.filter_criteria == FILTER_NOT_INSTALLED:
|
if self.filter_criteria == FILTER_NOT_INSTALLED:
|
||||||
return not display_plugin.is_installed() and not display_plugin.is_deprecated
|
return not display_plugin.is_installed() and not display_plugin.is_deprecated and display_plugin.name_matches_filter(self.filter_text)
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def set_filter_criteria(self, filter_value):
|
def set_filter_criteria(self, filter_value):
|
||||||
self.filter_criteria = filter_value
|
self.filter_criteria = filter_value
|
||||||
self.invalidateFilter()
|
self.invalidateFilter()
|
||||||
|
|
||||||
|
def set_filter_text(self, filter_text_value):
|
||||||
|
self.filter_text = icu_lower(unicode(filter_text_value))
|
||||||
|
self.invalidateFilter()
|
||||||
|
|
||||||
|
|
||||||
class DisplayPluginModel(QAbstractTableModel):
|
class DisplayPluginModel(QAbstractTableModel):
|
||||||
|
|
||||||
@ -456,6 +470,14 @@ class PluginUpdaterDialog(SizePersistedDialog):
|
|||||||
header_layout.addWidget(self.filter_combo)
|
header_layout.addWidget(self.filter_combo)
|
||||||
header_layout.addStretch(10)
|
header_layout.addStretch(10)
|
||||||
|
|
||||||
|
# filter plugins by name
|
||||||
|
header_layout.addWidget(QLabel(_('Filter by name')+':', self))
|
||||||
|
self.filter_by_name_lineedit = QLineEdit(self)
|
||||||
|
self.filter_by_name_lineedit.setText("")
|
||||||
|
self.filter_by_name_lineedit.textChanged.connect(self._filter_name_lineedit_changed)
|
||||||
|
|
||||||
|
header_layout.addWidget(self.filter_by_name_lineedit)
|
||||||
|
|
||||||
self.plugin_view = QTableView(self)
|
self.plugin_view = QTableView(self)
|
||||||
self.plugin_view.horizontalHeader().setStretchLastSection(True)
|
self.plugin_view.horizontalHeader().setStretchLastSection(True)
|
||||||
self.plugin_view.setSelectionBehavior(QAbstractItemView.SelectRows)
|
self.plugin_view.setSelectionBehavior(QAbstractItemView.SelectRows)
|
||||||
@ -601,6 +623,7 @@ class PluginUpdaterDialog(SizePersistedDialog):
|
|||||||
self.plugin_view.setFocus()
|
self.plugin_view.setFocus()
|
||||||
|
|
||||||
def _filter_combo_changed(self, idx):
|
def _filter_combo_changed(self, idx):
|
||||||
|
self.filter_by_name_lineedit.setText("") # clear the name filter text when a different group was selected
|
||||||
self.proxy_model.set_filter_criteria(idx)
|
self.proxy_model.set_filter_criteria(idx)
|
||||||
if idx == FILTER_NOT_INSTALLED:
|
if idx == FILTER_NOT_INSTALLED:
|
||||||
self.plugin_view.sortByColumn(5, Qt.DescendingOrder)
|
self.plugin_view.sortByColumn(5, Qt.DescendingOrder)
|
||||||
@ -608,6 +631,9 @@ class PluginUpdaterDialog(SizePersistedDialog):
|
|||||||
self.plugin_view.sortByColumn(0, Qt.AscendingOrder)
|
self.plugin_view.sortByColumn(0, Qt.AscendingOrder)
|
||||||
self._select_and_focus_view()
|
self._select_and_focus_view()
|
||||||
|
|
||||||
|
def _filter_name_lineedit_changed(self, text):
|
||||||
|
self.proxy_model.set_filter_text(text) # set the filter text for filterAcceptsRow
|
||||||
|
|
||||||
def _forum_label_activated(self):
|
def _forum_label_activated(self):
|
||||||
if self.forum_link:
|
if self.forum_link:
|
||||||
open_url(QUrl(self.forum_link))
|
open_url(QUrl(self.forum_link))
|
||||||
|
Loading…
x
Reference in New Issue
Block a user