made searchedit conform to our standards

This commit is contained in:
Andreas Preikschat 2013-03-01 11:39:38 +01:00
parent 1ef6cde4e4
commit daed497a9e

View File

@ -47,34 +47,33 @@ class SearchEdit(QtGui.QLineEdit):
Constructor.
"""
QtGui.QLineEdit.__init__(self, parent)
self._currentSearchType = -1
self.clearButton = QtGui.QToolButton(self)
self.clearButton.setIcon(build_icon(u':/system/clear_shortcut.png'))
self.clearButton.setCursor(QtCore.Qt.ArrowCursor)
self.clearButton.setStyleSheet(
u'QToolButton { border: none; padding: 0px; }')
self.clearButton.resize(18, 18)
self.clearButton.hide()
QtCore.QObject.connect(self.clearButton, QtCore.SIGNAL(u'clicked()'), self._onClearButtonClicked)
QtCore.QObject.connect(self, QtCore.SIGNAL(u'textChanged(const QString&)'), self._onSearchEditTextChanged)
self._updateStyleSheet()
self._current_search_type = -1
self.clear_button = QtGui.QToolButton(self)
self.clear_button.setIcon(build_icon(u':/system/clear_shortcut.png'))
self.clear_button.setCursor(QtCore.Qt.ArrowCursor)
self.clear_button.setStyleSheet(u'QToolButton { border: none; padding: 0px; }')
self.clear_button.resize(18, 18)
self.clear_button.hide()
QtCore.QObject.connect(self.clear_button, QtCore.SIGNAL(u'clicked()'), self._on_clear_button_clicked)
QtCore.QObject.connect(self, QtCore.SIGNAL(u'textChanged(const QString&)'), self._on_search_edit_text_changed)
self._update_style_sheet()
self.setAcceptDrops(False)
def _updateStyleSheet(self):
def _update_style_sheet(self):
"""
Internal method to update the stylesheet depending on which widgets are
available and visible.
Internal method to update the stylesheet depending on which widgets are available and visible.
"""
frameWidth = self.style().pixelMetric(QtGui.QStyle.PM_DefaultFrameWidth)
rightPadding = self.clearButton.width() + frameWidth
if hasattr(self, u'menuButton'):
leftPadding = self.menuButton.width()
self.setStyleSheet(u'QLineEdit { padding-left: %spx; padding-right: %spx; } ' % (leftPadding, rightPadding))
frame_width = self.style().pixelMetric(QtGui.QStyle.PM_DefaultFrameWidth)
right_padding = self.clear_button.width() + frame_width
if hasattr(self, u'menu_button'):
left_padding = self.menu_button.width()
stylesheet = u'QLineEdit { padding-left: %spx; padding-right: %spx; } ' % (left_padding, right_padding)
else:
self.setStyleSheet(u'QLineEdit { padding-right: %spx; } ' % rightPadding)
stylesheet = u'QLineEdit { padding-right: %spx; } ' % right_padding
self.setStyleSheet(stylesheet)
msz = self.minimumSizeHint()
self.setMinimumSize(max(msz.width(), self.clearButton.width() + (frameWidth * 2) + 2),
max(msz.height(), self.clearButton.height() + (frameWidth * 2) + 2))
self.setMinimumSize(max(msz.width(), self.clear_button.width() + (frame_width * 2) + 2),
max(msz.height(), self.clear_button.height() + (frame_width * 2) + 2))
def resizeEvent(self, event):
"""
@ -83,19 +82,19 @@ class SearchEdit(QtGui.QLineEdit):
``event``
The event that happened.
"""
size = self.clearButton.size()
frameWidth = self.style().pixelMetric(QtGui.QStyle.PM_DefaultFrameWidth)
self.clearButton.move(self.rect().right() - frameWidth - size.width(),
size = self.clear_button.size()
frame_width = self.style().pixelMetric(QtGui.QStyle.PM_DefaultFrameWidth)
self.clear_button.move(self.rect().right() - frame_width - size.width(),
(self.rect().bottom() + 1 - size.height()) / 2)
if hasattr(self, u'menuButton'):
size = self.menuButton.size()
self.menuButton.move(self.rect().left() + frameWidth + 2, (self.rect().bottom() + 1 - size.height()) / 2)
if hasattr(self, u'menu_button'):
size = self.menu_button.size()
self.menu_button.move(self.rect().left() + frame_width + 2, (self.rect().bottom() + 1 - size.height()) / 2)
def currentSearchType(self):
"""
Readonly property to return the current search type.
"""
return self._currentSearchType
return self._current_search_type
def setCurrentSearchType(self, identifier):
"""
@ -104,30 +103,28 @@ class SearchEdit(QtGui.QLineEdit):
``identifier``
The search type identifier (int).
"""
menu = self.menuButton.menu()
menu = self.menu_button.menu()
for action in menu.actions():
if identifier == action.data():
# setPlaceholderText has been implemented in Qt 4.7 and in at
# least PyQt 4.9 (I am not sure, if it was implemented in
# PyQt 4.8).
# setPlaceholderText has been implemented in Qt 4.7 and in at least PyQt 4.9 (I am not sure, if it was
# implemented in PyQt 4.8).
try:
self.setPlaceholderText(action.placeholderText)
self.setPlaceholderText(action.placeholder_text)
except AttributeError:
pass
self.menuButton.setDefaultAction(action)
self._currentSearchType = identifier
self.menu_button.setDefaultAction(action)
self._current_search_type = identifier
self.emit(QtCore.SIGNAL(u'searchTypeChanged(int)'), identifier)
return True
def setSearchTypes(self, items):
"""
A list of tuples to be used in the search type menu. The first item in
the list will be preselected as the default.
A list of tuples to be used in the search type menu. The first item in the list will be preselected as the
default.
``items``
The list of tuples to use. The tuples should contain an integer
identifier, an icon (QIcon instance or string) and a title for the
item in the menu. In short, they should look like this::
The list of tuples to use. The tuples should contain an integer identifier, an icon (QIcon instance or
string) and a title for the item in the menu. In short, they should look like this::
(<identifier>, <icon>, <title>, <place holder text>)
@ -142,63 +139,58 @@ class SearchEdit(QtGui.QLineEdit):
menu = QtGui.QMenu(self)
first = None
for identifier, icon, title, placeholder in items:
action = create_widget_action(menu, text=title, icon=icon,
data=identifier, triggers=self._onMenuActionTriggered)
action.placeholderText = placeholder
action = create_widget_action(
menu, text=title, icon=icon, data=identifier, triggers=self._onMenuActionTriggered)
action.placeholder_text = placeholder
if first is None:
first = action
self._currentSearchType = identifier
if not hasattr(self, u'menuButton'):
self.menuButton = QtGui.QToolButton(self)
self.menuButton.setIcon(build_icon(u':/system/clear_shortcut.png'))
self.menuButton.setCursor(QtCore.Qt.ArrowCursor)
self.menuButton.setPopupMode(QtGui.QToolButton.InstantPopup)
self.menuButton.setStyleSheet(
u'QToolButton { border: none; padding: 0px 10px 0px 0px; }')
self.menuButton.resize(QtCore.QSize(28, 18))
self.menuButton.setMenu(menu)
self.menuButton.setDefaultAction(first)
self.menuButton.show()
self._updateStyleSheet()
self._current_search_type = identifier
if not hasattr(self, u'menu_button'):
self.menu_button = QtGui.QToolButton(self)
self.menu_button.setIcon(build_icon(u':/system/clear_shortcut.png'))
self.menu_button.setCursor(QtCore.Qt.ArrowCursor)
self.menu_button.setPopupMode(QtGui.QToolButton.InstantPopup)
self.menu_button.setStyleSheet(u'QToolButton { border: none; padding: 0px 10px 0px 0px; }')
self.menu_button.resize(QtCore.QSize(28, 18))
self.menu_button.setMenu(menu)
self.menu_button.setDefaultAction(first)
self.menu_button.show()
self._update_style_sheet()
def _onSearchEditTextChanged(self, text):
def _on_search_edit_text_changed(self, text):
"""
Internally implemented slot to react to when the text in the line edit
has changed so that we can show or hide the clear button.
Internally implemented slot to react to when the text in the line edit has changed so that we can show or hide
the clear button.
``text``
A :class:`~PyQt4.QtCore.QString` instance which represents the text
in the line edit.
A :class:`~PyQt4.QtCore.QString` instance which represents the text in the line edit.
"""
self.clearButton.setVisible(bool(text))
self.clear_button.setVisible(bool(text))
def _onClearButtonClicked(self):
def _on_clear_button_clicked(self):
"""
Internally implemented slot to react to the clear button being clicked
to clear the line edit. Once it has cleared the line edit, it emits the
``cleared()`` signal so that an application can react to the clearing
of the line edit.
Internally implemented slot to react to the clear button being clicked to clear the line edit. Once it has
cleared the line edit, it emits the ``cleared()`` signal so that an application can react to the clearing of the
line edit.
"""
self.clear()
self.emit(QtCore.SIGNAL(u'cleared()'))
def _onMenuActionTriggered(self):
"""
Internally implemented slot to react to the select of one of the search
types in the menu. Once it has set the correct action on the button,
and set the current search type (using the list of identifiers provided
by the developer), the ``searchTypeChanged(int)`` signal is emitted
with the identifier.
Internally implemented slot to react to the select of one of the search types in the menu. Once it has set the
correct action on the button, and set the current search type (using the list of identifiers provided by the
developer), the ``searchTypeChanged(int)`` signal is emitted with the identifier.
"""
sender = self.sender()
for action in self.menuButton.menu().actions():
for action in self.menu_button.menu().actions():
action.setChecked(False)
self.menuButton.setDefaultAction(sender)
self._currentSearchType = sender.data()
# setPlaceholderText has been implemented in Qt 4.7 and in at least
self.menu_button.setDefaultAction(sender)
self._current_search_type = sender.data()
# setplaceholder_text has been implemented in Qt 4.7 and in at least
# PyQt 4.9 (I am not sure, if it was implemented in PyQt 4.8).
try:
self.setPlaceholderText(self.menuButton.defaultAction().placeholderText)
self.setPlaceholderText(self.menu_button.defaultAction().placeholder_text)
except AttributeError:
pass
self.emit(QtCore.SIGNAL(u'searchTypeChanged(int)'), self._currentSearchType)
self.emit(QtCore.SIGNAL(u'searchTypeChanged(int)'), self._current_search_type)