class KeywordsEditor(QtWidgets.QWidget): def __init__(self, *arg, **kw): super(KeywordsEditor, self).__init__(*arg, **kw) self.config_store = QtWidgets.QApplication.instance().config_store self.league_table = defaultdict(int) for keyword, score in eval( self.config_store.get('descriptive', 'keywords', '{}')).items(): self.league_table[keyword] = score layout = QtWidgets.QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) self.setLayout(layout) # line edit box self.edit = SingleLineEdit(spell_check=True) layout.addWidget(self.edit) # favourites drop down self.favourites = ComboBox() self.update_favourites() self.favourites.setFixedWidth(self.favourites.title_width()) self.favourites.currentIndexChanged.connect(self.add_favourite) layout.addWidget(self.favourites) # adopt child widget methods and signals self.get_value = self.edit.get_value self.set_value = self.edit.set_value self.set_multiple = self.edit.set_multiple self.is_multiple = self.edit.is_multiple self.editingFinished = self.edit.editingFinished def update_favourites(self): self.favourites.clear() self.favourites.addItem(self.tr('<favourites>')) keywords = list(self.league_table.keys()) keywords.sort(key=lambda x: self.league_table[x], reverse=True) # limit size of league_table by deleting lowest scoring if len(keywords) > 100: threshold = self.league_table[keywords[100]] for keyword in keywords: if self.league_table[keyword] <= threshold: del self.league_table[keyword] # select highest scoring for drop down list keywords = keywords[:20] keywords.sort(key=lambda x: x.lower()) for keyword in keywords: self.favourites.addItem(keyword) self.favourites.set_dropdown_width() def update_league_table(self, images): for image in images: value = list( filter(lambda x: not x.startswith('flickr:photo_id'), image.metadata.keywords or [])) if not value: continue for keyword in self.league_table: self.league_table[keyword] = max( self.league_table[keyword] - 1, -5) for keyword in value: self.league_table[keyword] = min( self.league_table[keyword] + 10, 1000) self.config_store.set('descriptive', 'keywords', six.text_type(dict(self.league_table))) self.update_favourites() @QtCore.pyqtSlot(int) @catch_all def add_favourite(self, idx): if idx <= 0: return self.favourites.setCurrentIndex(0) new_value = self.favourites.itemText(idx) current_value = self.get_value() if current_value: new_value = current_value + '; ' + new_value self.set_value(new_value) self.editingFinished.emit()
class KeywordsEditor(QtWidgets.QWidget): def __init__(self, **kw): super(KeywordsEditor, self).__init__() self.config_store = QtWidgets.QApplication.instance().config_store self.league_table = {} for keyword, score in self.config_store.get('descriptive', 'keywords', {}).items(): if isinstance(score, int): # old style keyword list self.league_table[keyword] = date.min.isoformat(), score // 50 else: # new style keyword list self.league_table[keyword] = score layout = QtWidgets.QHBoxLayout() layout.setContentsMargins(0, 0, 0, 0) self.setLayout(layout) # line edit box self.edit = SingleLineEdit(**kw) layout.addWidget(self.edit) # favourites drop down self.favourites = ComboBox() self.favourites.addItem(translate('DescriptiveTab', '<favourites>')) self.favourites.setFixedWidth( self.favourites.minimumSizeHint().width()) self.update_favourites() self.favourites.currentIndexChanged.connect(self.add_favourite) layout.addWidget(self.favourites) # adopt child widget methods and signals self.get_value = self.edit.get_value self.set_value = self.edit.set_value self.set_multiple = self.edit.set_multiple self.is_multiple = self.edit.is_multiple self.editingFinished = self.edit.editingFinished def update_favourites(self): self.favourites.clear() self.favourites.addItem(translate('DescriptiveTab', '<favourites>')) keywords = list(self.league_table.keys()) keywords.sort(key=lambda x: self.league_table[x], reverse=True) # limit size of league_table by deleting lowest scoring if len(keywords) > 100: threshold = self.league_table[keywords[100]] for keyword in keywords: if self.league_table[keyword] <= threshold: del self.league_table[keyword] # select highest scoring for drop down list keywords = keywords[:20] keywords.sort(key=lambda x: x.lower()) for keyword in keywords: self.favourites.addItem(keyword) self.favourites.set_dropdown_width() def update_league_table(self, images): today = date.today().isoformat() for image in images: value = list( filter(lambda x: not x.startswith('flickr:photo_id'), image.metadata.keywords or [])) if not value: continue for keyword in value: if keyword not in self.league_table: self.league_table[keyword] = today, 1 elif self.league_table[keyword][0] != today: self.league_table[keyword] = ( today, self.league_table[keyword][1] + 1) self.config_store.set('descriptive', 'keywords', self.league_table) self.update_favourites() @QtSlot(int) @catch_all def add_favourite(self, idx): if idx <= 0: return self.favourites.setCurrentIndex(0) new_value = self.favourites.itemText(idx) current_value = self.get_value() if current_value: new_value = current_value + '; ' + new_value self.set_value(new_value) self.editingFinished.emit()