class HeaderEditDialog(QDialog): header_changed = pyqtSignal(str, list) def __init__(self, parent, columns): super().__init__(parent) self.columns = copy.deepcopy(columns) self.setupUi() def setupUi(self): self.resize(200, 400) self.vbox = QVBoxLayout(self) self.columnList = QListWidget(self) self.vbox.addWidget(self.columnList) self.columnList.setDragDropMode(QListWidget.InternalMove) self.columnList.setDefaultDropAction(Qt.MoveAction) self.columnList.setSelectionMode(QListWidget.ExtendedSelection) self.columnList.setAlternatingRowColors(True) self.columnList.installEventFilter(self) self.columnList.setObjectName("ColumnList") # self.columnList.setContextMenuPolicy(Qt.CustomContextMenu) # self.columnList.customContextMenuRequested.connect(self.open_menu) self.buttonBox = QDialogButtonBox( QDialogButtonBox.Ok | QDialogButtonBox.Cancel, self) self.vbox.addWidget(self.buttonBox) self.buttonBox.accepted.connect(self.accept) self.buttonBox.rejected.connect(self.reject) self.fill_column_list() def eventFilter(self, object, event): if event.type() == QEvent.KeyPress: if event.key() == Qt.Key_Space or event.key() == Qt.Key_Return: self.toggle_selected_columns() return True return False def fill_column_list(self): for column in self.columns: ColumnListItem(self.columnList, column) def accept(self): result = [] for i in range(self.columnList.count()): item = self.columnList.item(i) result.append(item.column) self.header_changed.emit('rearrange', result) self.done(0) def reject(self): self.done(0) def toggle_selected_columns(self): selected = self.columnList.selectedItems() for item in selected: value_now = item.data(Qt.CheckStateRole) item.setData(Qt.CheckStateRole, not value_now) self.columnList.reset( ) # @Improvement: is there a better way to update QListWidget? # def load_preset(self, action): # name = action.text() # self.result_future(('load', name)) # # def save_preset(self, action): # result = [] # for i in range(self.columnList.count()): # column list has to be generated here because if # item = self.columnList.item(i) # you rearrange and save, then what gets saved is # result.append(item.column) # the un-rearranged list from the table header # # name = action.text() # if action.property('new'): # self.result_future(('save new', (name, result))) # else: # self.result_future(('save', (name, result))) # def open_menu(self, position): # return # @TODO: implement header presets # menu = QMenu(self) # # load_menu = QMenu('Load preset', self) # save_menu = QMenu('Save preset as', self) # save_new_action = save_menu.addAction('New') # save_new_action.setProperty('new', True) # save_menu.addSeparator() # # presets = CONFIG.get_columns_presets() # for preset in presets: # load_menu.addAction(preset) # save_menu.addAction(preset) # # load_menu.triggered.connect(self.load_preset) # save_menu.triggered.connect(self.save_preset) # # menu.addMenu(load_menu) # menu.addMenu(save_menu) # # menu.popup(self.columnList.viewport().mapToGlobal(position)) def get_selected_items(self): result = [] selected = self.columnList.selectedIndexes() for index in selected: item = self.columnList.itemFromIndex(index) result.append(item) return result def enable_selected(self): selected = self.get_selected_items() for item in selected: item.setData(Qt.CheckStateRole, Qt.Checked) def disable_selected(self): selected = self.get_selected_items() for item in selected: item.setData(Qt.CheckStateRole, Qt.Unchecked)
class filterTabView(QTabWidget): def __init__(self, query, contentView, TAGS, KEYWORDS): super().__init__() self.query = query self.TAGS = TAGS self.KEYWORDS = KEYWORDS self.contentView = contentView self.initList() self.initUI() def initUI(self): self.tagsTab = QListWidget() for tag in self.TAGS: item = QListWidgetItem(tag) item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) item.setCheckState(QtCore.Qt.Unchecked) self.tagsTab.addItem(item) self.tagsTab.clicked.connect(self.tagsSelect) self.ratingTab = QListWidget() for word in ['1 star', '2 star', '3 star', '4 star', '5 star']: item = QListWidgetItem(word) item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) item.setCheckState(QtCore.Qt.Unchecked) self.ratingTab.addItem(item) self.ratingTab.clicked.connect(self.ratingSelect) self.keywordTab = QListWidget() for keyword in self.KEYWORDS: item = QListWidgetItem(keyword) item.setFlags(item.flags() | QtCore.Qt.ItemIsUserCheckable) item.setCheckState(QtCore.Qt.Unchecked) self.keywordTab.addItem(item) self.keywordTab.clicked.connect(self.keywordSelect) self.addTab(self.tagsTab, "Tags") self.addTab(self.ratingTab, "Rating") self.addTab(self.keywordTab, "Keyword") def initList(self): self.tagsList = [] self.ratingsList = [] self.keywordsList = [] def tagsSelect(self, point): item = point.data() if self.tagsTab.itemFromIndex(point).checkState() == 2: if item in self.tagsList: pass else: self.tagsList.append(item) if self.tagsTab.itemFromIndex(point).checkState() == 0: if item in self.tagsList: self.tagsList.remove(item) self.contentView.updateAllPage(self.tagsList, self.ratingsList, self.keywordsList) def ratingSelect(self, point): item = point.data() if self.ratingTab.itemFromIndex(point).checkState() == 2: if item in self.ratingsList: pass else: self.ratingsList.append(item) if self.ratingTab.itemFromIndex(point).checkState() == 0: if item in self.ratingsList: self.ratingsList.remove(item) self.contentView.updateAllPage(self.tagsList, self.ratingsList, self.keywordsList) def keywordSelect(self, point): item = point.data() if self.keywordTab.itemFromIndex(point).checkState() == 2: if item in self.keywordsList: pass else: self.keywordsList.append(item) if self.keywordTab.itemFromIndex(point).checkState() == 0: if item in self.keywordsList: self.keywordsList.remove(item) self.contentView.updateAllPage(self.tagsList, self.ratingsList, self.keywordsList)