Guest User

Untitled

a guest
Dec 10th, 2017
92
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.83 KB | None | 0 0
  1. import os, sys
  2. from PySide import QtCore, QtGui
  3.  
  4. tags = {
  5. "Animals": [
  6. "Birds",
  7. "Various"
  8. ],
  9. "Brick": [
  10. "Blocks",
  11. "Special"
  12. ],
  13. "Manmade": [
  14. "Air Conditioners",
  15. "Audio Equipment"
  16. ],
  17. "Food": [
  18. "Fruit",
  19. "Grains and Seeds"
  20. ]
  21. }
  22.  
  23. class SearchProxyModel(QtGui.QSortFilterProxyModel):
  24. def __init__(self, parent=None):
  25. super(SearchProxyModel, self).__init__(parent)
  26. self.text = ''
  27.  
  28. # Recursive search
  29. def _accept_index(self, idx):
  30. if idx.isValid():
  31. text = idx.data(role=QtCore.Qt.DisplayRole).lower()
  32. condition = text.find(self.text) >= 0
  33.  
  34. if condition:
  35. return True
  36. for childnum in range(idx.model().rowCount(parent=idx)):
  37. if self._accept_index(idx.model().index(childnum, 0, parent=idx)):
  38. return True
  39. return False
  40.  
  41. def filterAcceptsRow(self, sourceRow, sourceParent):
  42. # Only first column in model for search
  43. idx = self.sourceModel().index(sourceRow, 0, sourceParent)
  44. return self._accept_index(idx)
  45.  
  46. def lessThan(self, left, right):
  47. leftData = self.sourceModel().data(left)
  48. rightData = self.sourceModel().data(right)
  49. return leftData < rightData
  50.  
  51.  
  52. class TagsBrowserWidget(QtGui.QWidget):
  53.  
  54. clickedTag = QtCore.Signal(list)
  55.  
  56. def __init__(self, parent=None):
  57. super(TagsBrowserWidget, self).__init__(parent)
  58. self.resize(300,500)
  59.  
  60. # controls
  61. self.ui_search = QtGui.QLineEdit()
  62. self.ui_search.setPlaceholderText('Search...')
  63.  
  64. self.tags_model = SearchProxyModel()
  65. self.tags_model.setSourceModel(QtGui.QStandardItemModel())
  66. self.tags_model.setDynamicSortFilter(True)
  67. self.tags_model.setFilterCaseSensitivity(QtCore.Qt.CaseInsensitive)
  68.  
  69. self.ui_tags = QtGui.QTreeView()
  70. self.ui_tags.setSortingEnabled(True)
  71. self.ui_tags.sortByColumn(0, QtCore.Qt.AscendingOrder)
  72. self.ui_tags.setEditTriggers(QtGui.QAbstractItemView.NoEditTriggers)
  73. self.ui_tags.setHeaderHidden(True)
  74. self.ui_tags.setRootIsDecorated(True)
  75. self.ui_tags.setUniformRowHeights(True)
  76. self.ui_tags.setModel(self.tags_model)
  77.  
  78. # layout
  79. main_layout = QtGui.QVBoxLayout()
  80. main_layout.addWidget(self.ui_search)
  81. main_layout.addWidget(self.ui_tags)
  82. self.setLayout(main_layout)
  83.  
  84. # signals
  85. self.ui_tags.doubleClicked.connect(self.tag_double_clicked)
  86. self.ui_search.textChanged.connect(self.search_text_changed)
  87.  
  88. # init
  89. self.create_model()
  90.  
  91. def create_model(self):
  92. model = self.ui_tags.model().sourceModel()
  93. self.populate_tree(tags, model.invisibleRootItem())
  94. self.ui_tags.sortByColumn(0, QtCore.Qt.AscendingOrder)
  95.  
  96.  
  97. def populate_tree(self, children, parent):
  98. for child in sorted(children):
  99. node = QtGui.QStandardItem(child)
  100. parent.appendRow(node)
  101.  
  102. if isinstance(children, dict):
  103. self.populate_tree(children[child], node)
  104.  
  105.  
  106. def tag_double_clicked(self, item):
  107. text = item.data(role=QtCore.Qt.DisplayRole)
  108. print [text]
  109. self.clickedTag.emit([text])
  110.  
  111.  
  112. def search_text_changed(self, text=None):
  113. regExp = QtCore.QRegExp(self.ui_search.text(), QtCore.Qt.CaseInsensitive, QtCore.QRegExp.FixedString)
  114.  
  115. self.tags_model.text = self.ui_search.text().lower()
  116. self.tags_model.setFilterRegExp(regExp)
  117.  
  118. if len(self.ui_search.text()) >= 1 and self.tags_model.rowCount() > 0:
  119. self.ui_tags.expandAll()
  120. else:
  121. self.ui_tags.collapseAll()
  122.  
  123.  
  124. def main():
  125. app = QtGui.QApplication(sys.argv)
  126. ex = TagsBrowserWidget()
  127. ex.show()
  128. sys.exit(app.exec_())
  129.  
  130.  
  131. if __name__ == '__main__':
  132. main()
Add Comment
Please, Sign In to add comment