Allow adding custom highlight widget to custom pages in option

This commit is contained in:
Denis Rouzaud 2018-02-02 22:46:07 -04:00
parent fe31c28257
commit 8d55cadeb7
4 changed files with 91 additions and 10 deletions

View File

@ -38,12 +38,24 @@ If an empty string is returned by this method the default QGIS options
help will be retrieved. help will be retrieved.
%End %End
public slots: public slots:
virtual void apply() = 0; virtual void apply() = 0;
%Docstring %Docstring
Called to permanently apply the settings shown in the options page (e.g. save them to Called to permanently apply the settings shown in the options page (e.g. save them to
QgsSettings objects). This is usually called when the options dialog is accepted. QgsSettings objects). This is usually called when the options dialog is accepted.
%End
protected:
void registerHighlightWidget( QgsOptionsDialogHighlightWidget *highlightWidget /Transfer/ );
%Docstring
Register a highlight widget to be used to search and highlight text in
options dialogs. This can be used to provide a custom implementation of
:py:class:`QgsOptionsDialogHighlightWidget`.
%End %End
}; };

View File

@ -47,7 +47,8 @@ from qgis.PyQt.QtGui import (QIcon,
from qgis.gui import (QgsDoubleSpinBox, from qgis.gui import (QgsDoubleSpinBox,
QgsSpinBox, QgsSpinBox,
QgsOptionsPageWidget) QgsOptionsPageWidget,
QgsOptionsDialogHighlightWidget)
from qgis.core import NULL, QgsApplication, QgsSettings from qgis.core import NULL, QgsApplication, QgsSettings
from qgis.utils import OverrideCursor from qgis.utils import OverrideCursor
@ -68,13 +69,15 @@ class ConfigOptionsPage(QgsOptionsPageWidget):
def __init__(self, parent): def __init__(self, parent):
super(ConfigOptionsPage, self).__init__(parent) super(ConfigOptionsPage, self).__init__(parent)
self.config_widget = ConfigDialog() self.config_widget = ConfigDialog(False)
layout = QHBoxLayout() layout = QHBoxLayout()
layout.setContentsMargins(0, 0, 0, 0) layout.setContentsMargins(0, 0, 0, 0)
layout.setMargin(0) layout.setMargin(0)
self.setLayout(layout) self.setLayout(layout)
layout.addWidget(self.config_widget) layout.addWidget(self.config_widget)
self.setObjectName('processingOptions') self.setObjectName('processingOptions')
self.highlightWidget = ProcessingTreeHighlight(self.config_widget)
self.registerHighlightWidget(self.highlightWidget)
def apply(self): def apply(self):
self.config_widget.accept() self.config_widget.accept()
@ -83,9 +86,24 @@ class ConfigOptionsPage(QgsOptionsPageWidget):
return 'processing/index.html' return 'processing/index.html'
class ProcessingTreeHighlight(QgsOptionsDialogHighlightWidget):
def __init__(self, config_dialog):
super(ProcessingTreeHighlight, self).__init__(config_dialog.tree)
self.config_dialog = config_dialog
def highlightText(self, text):
return self.config_dialog.textChanged(text)
def searchText(self, text):
return self.config_dialog.textChanged(text)
def reset(self):
self.config_dialog.textChanged('')
class ConfigDialog(BASE, WIDGET): class ConfigDialog(BASE, WIDGET):
def __init__(self): def __init__(self, showSearch=True):
super(ConfigDialog, self).__init__(None) super(ConfigDialog, self).__init__(None)
self.setupUi(self) self.setupUi(self)
@ -95,29 +113,36 @@ class ConfigDialog(BASE, WIDGET):
self.groupIcon.addPixmap(self.style().standardPixmap( self.groupIcon.addPixmap(self.style().standardPixmap(
QStyle.SP_DirOpenIcon), QIcon.Normal, QIcon.On) QStyle.SP_DirOpenIcon), QIcon.Normal, QIcon.On)
if hasattr(self.searchBox, 'setPlaceholderText'):
self.searchBox.setPlaceholderText(self.tr('Search...'))
self.model = QStandardItemModel() self.model = QStandardItemModel()
self.tree.setModel(self.model) self.tree.setModel(self.model)
self.delegate = SettingDelegate() self.delegate = SettingDelegate()
self.tree.setItemDelegateForColumn(1, self.delegate) self.tree.setItemDelegateForColumn(1, self.delegate)
self.searchBox.textChanged.connect(self.textChanged) if showSearch:
if hasattr(self.searchBox, 'setPlaceholderText'):
self.searchBox.setPlaceholderText(self.tr('Search...'))
self.searchBox.textChanged.connect(self.textChanged)
else:
self.searchBox.hide()
self.fillTree() self.fillTree()
self.saveMenus = False self.saveMenus = False
self.tree.expanded.connect(self.itemExpanded) self.tree.expanded.connect(self.itemExpanded)
def textChanged(self): def textChanged(self, text=None):
text = str(self.searchBox.text().lower()) if text is not None:
text = str(text.lower())
else:
text = str(self.searchBox.text().lower())
self._filterItem(self.model.invisibleRootItem(), text) self._filterItem(self.model.invisibleRootItem(), text)
if text: if text:
self.tree.expandAll() self.tree.expandAll()
return True
else: else:
self.tree.collapseAll() self.tree.collapseAll()
return False
def _filterItem(self, item, text): def _filterItem(self, item, text):
if item.hasChildren(): if item.hasChildren():

View File

@ -256,7 +256,25 @@ void QgsOptionsDialogBase::registerTextSearchWidgets()
{ {
Q_FOREACH ( QWidget *w, mOptStackedWidget->widget( i )->findChildren<QWidget *>() ) Q_FOREACH ( QWidget *w, mOptStackedWidget->widget( i )->findChildren<QWidget *>() )
{ {
QgsOptionsDialogHighlightWidget *shw = QgsOptionsDialogHighlightWidget::createWidget( w );
// get custom highlight widget in user added pages
QMap<QWidget *, QgsOptionsDialogHighlightWidget *> customHighlightWidgets = QMap<QWidget *, QgsOptionsDialogHighlightWidget *>();
QgsOptionsPageWidget *opw = qobject_cast<QgsOptionsPageWidget *>( mOptStackedWidget->widget( i ) );
if ( opw )
{
customHighlightWidgets = opw->registeredHighlightWidgets();
}
QgsOptionsDialogHighlightWidget *shw = nullptr;
// take custom if exists
if ( customHighlightWidgets.contains( w ) )
{
shw = customHighlightWidgets.value( w );
}
// try to construct one otherwise
if ( !shw || !shw->isValid() )
{
shw = QgsOptionsDialogHighlightWidget::createWidget( w );
}
if ( shw && shw->isValid() ) if ( shw && shw->isValid() )
{ {
QgsDebugMsgLevel( QString( "Registering: %1" ).arg( w->objectName() ), 4 ); QgsDebugMsgLevel( QString( "Registering: %1" ).arg( w->objectName() ), 4 );

View File

@ -19,6 +19,7 @@
#include <QListWidgetItem> #include <QListWidgetItem>
#include "qgis_gui.h" #include "qgis_gui.h"
#include "qgis.h" #include "qgis.h"
#include "qgsoptionsdialoghighlightwidget.h"
/** /**
* \ingroup gui * \ingroup gui
@ -51,6 +52,14 @@ class GUI_EXPORT QgsOptionsPageWidget : public QWidget
*/ */
virtual QString helpKey() const { return QString(); } virtual QString helpKey() const { return QString(); }
/**
* Returns the registered highlight widgets used to search and highlight text in
* options dialogs.
*/
QMap<QWidget *, QgsOptionsDialogHighlightWidget *> registeredHighlightWidgets() {return mHighlighWidgets;} SIP_SKIP
public slots: public slots:
/** /**
@ -59,6 +68,23 @@ class GUI_EXPORT QgsOptionsPageWidget : public QWidget
*/ */
virtual void apply() = 0; virtual void apply() = 0;
protected:
/**
* Register a highlight widget to be used to search and highlight text in
* options dialogs. This can be used to provide a custom implementation of
* QgsOptionsDialogHighlightWidget.
*/
void registerHighlightWidget( QgsOptionsDialogHighlightWidget *highlightWidget SIP_TRANSFER )
{
mHighlighWidgets.insert( highlightWidget->widget(), highlightWidget );
}
private:
QMap<QWidget *, QgsOptionsDialogHighlightWidget *> mHighlighWidgets = QMap<QWidget *, QgsOptionsDialogHighlightWidget *>();
}; };
/** /**