def __init__(self, parent=None): super(RecentlyUsedSymbolWidget, self).__init__(parent) self.layout = QGridLayout() self.color = QColor(Qt.white) self._synchronizer = SymbolSynchronizer() self.recentSymbolsDict = {} self.widgetToSymbol = {} self.setMinimumHeight(40) self.setMaximumHeight(40) # initialize to 0 self.num_recent_symbols = 0 labelWidget = QLabel("None") self.layout.addWidget(labelWidget, 0, 0, Qt.AlignVCenter) self.recentSymbols = [labelWidget] self.setLayout(self.layout)
def __init__(self, parent = None): super(RecentlyUsedSymbolWidget, self).__init__(parent) self.layout = QGridLayout() self.color = QColor(Qt.white) self._synchronizer = SymbolSynchronizer() self.recentSymbolsDict = {} self.widgetToSymbol = {} self.setMinimumHeight(40) self.setMaximumHeight(40) labelWidget = QLabel("None"); self.layout.addWidget(labelWidget, 0, 0, Qt.AlignVCenter) self.recentSymbols = [labelWidget] self.setLayout(self.layout)
class RecentlyUsedSymbolWidget(QWidget): """ Container Widget for most recently used symbols symbol """ def __init__(self, parent=None): super(RecentlyUsedSymbolWidget, self).__init__(parent) self.layout = QGridLayout() self.color = QColor(Qt.white) self._synchronizer = SymbolSynchronizer() self.recentSymbolsDict = {} self.widgetToSymbol = {} self.setMinimumHeight(40) self.setMaximumHeight(40) # initialize to 0 self.num_recent_symbols = 0 labelWidget = QLabel("None") self.layout.addWidget(labelWidget, 0, 0, Qt.AlignVCenter) self.recentSymbols = [labelWidget] self.setLayout(self.layout) def clear(self): """ Removes all widgets and re-inializes the widget. """ for widget in self.recentSymbols: self.layout.removeWidget(widget) widget.setParent(None) self._synchronizer.unselect() labelWidget = QLabel("None") self.layout.addWidget(labelWidget, 0, 0, Qt.AlignVCenter) self.recentSymbols = [labelWidget] self.recentSymbolsDict = {} self.widgetToSymbol = {} def widget_clicked(self, widget): """ What happens when one of the widgets is clicked """ # make sure that we count clicks on widgets as well symbol = self.widgetToSymbol[widget] self.recentSymbolsDict[symbol] += 1 # synchronize with widget in symbol selector widget symbol.click_me() def insert_new_symbol(self, symbol): """ Insert new symbol into recently used symbols widget """ if not symbol: self._synchronizer.unselect() return # increase symbol use count by one or add new symbol if symbol in self.recentSymbolsDict: self.recentSymbolsDict[symbol] += 1 self.click_on_a_symbol_widget(symbol) else: # if we have more than MAX_RECENT_SYMBOLS symbols evict # the one with the lowest count if len(self.recentSymbolsDict) > self.num_recent_symbols - 1: self.purge_symbols() # adding it after evicting a previous one # makes sure we always keep the most recent item self.recentSymbolsDict[symbol] = 1 self.update_widget(symbol) def purge_symbols(self): """ Purges currently stored symbols so that their number agrees with the selected number of recent symbols. """ while len(self.recentSymbolsDict) > self.num_recent_symbols - 1: minKey = min(self.recentSymbolsDict.values()) keyDict = self.recentSymbolsDict.copy() for (key, val) in keyDict.items(): if val == minKey: del self.recentSymbolsDict[key] break def update_num_recent_symbols(self, newNum): """ Update the number of recently used symbols to keep in the widget. This function is called if the user changes this number in the preferences. NOTE: This function is also called initially to properly set up the widget. """ oldNum = self.num_recent_symbols self.num_recent_symbols = newNum # if the number of kept symbols was lowered, purge some # of the symbols if (newNum < oldNum): self.purge_symbols() self.update_widget(None) def update_widget(self, symbol): """ Update the widget, e.g. after adding/deleting a symbol. """ # remove previous symbols for widget in self.recentSymbols: self.layout.removeWidget(widget) widget.setParent(None) self.recentSymbols = [] # add new ones self.widgetToSymbol = {} for (index, item) in enumerate(self.recentSymbolsDict.keys()): widget = SymbolDisplayItem(item.get_content(), self._synchronizer) self.connect(widget, SIGNAL("widget_pressed"), self.widget_clicked) self.widgetToSymbol[widget] = item self.layout.addWidget(widget, 0, index, Qt.AlignVCenter) self.recentSymbols.append(widget) if symbol: self.click_on_a_symbol_widget(symbol) def click_on_a_symbol_widget(self, symbol): """ Clicks the widget corresponding to symbol. """ for (widget, widgetSymbol) in self.widgetToSymbol.items(): if widgetSymbol == symbol: widget.click_me()
def initialize_symbol_widget(self, knittingSymbols): """ Proxy for adding all the knitting symbols to the symbolWidget and connecting it to the symbol changed slot. NOTE: Unfortunately, the order of the connections below matters. Connect the symbolCategoryChooser only after it has been fully set up. Otherwise we get spurious selector widget switches until the chooser has established the correct order. """ symbolTracker = SymbolSynchronizer() self.connect(self.canvas, SIGNAL("activate_symbol"), self.activeSymbolWidget.active_symbol_changed) self.connect( self.canvas, SIGNAL("unactivate_symbol"), partial(self.activeSymbolWidget.active_symbol_changed, None)) self.connect(self.canvas, SIGNAL("activate_symbol"), self.recentlyUsedSymbolWidget.insert_new_symbol) self.connect( self.canvas, SIGNAL("unactivate_symbol"), partial(self.recentlyUsedSymbolWidget.insert_new_symbol, None)) self.connect(self.canvas, SIGNAL("activate_symbol"), self.set_project_dirty) self.connect(self.canvas, SIGNAL("unactivate_symbol"), self.set_project_dirty) # connection between clear button and the list of # recently used symbols self.connect(self.clearFrequentlyUsedSymbolsButton, SIGNAL("clicked()"), self.recentlyUsedSymbolWidget.clear) # the connection between canvas and symbolTracker has # to be bi-directional so the canvas can properly # undo/redo selections self.connect(symbolTracker, SIGNAL("synchronized_object_changed"), self.canvas.set_active_symbol) self.connect(self.canvas, SIGNAL("activate_symbol"), symbolTracker.select_plain) self.connect(self.canvas, SIGNAL("unactivate_symbol"), symbolTracker.unselect) (self.selectedSymbol, self.symbolSelector, self.symbolSelectorWidgets) = \ generate_symbolWidgets(knittingSymbols, self.symbolCategoryChooser, self.symbolSelectorLayout, symbolTracker) self.connect(self.symbolCategoryChooser, SIGNAL("currentIndexChanged(QString)"), self.update_symbol_widget) # this makes sure that the currently active symbol is unselected # when the users chooses a new category self.connect(self.symbolCategoryChooser, SIGNAL("currentIndexChanged(QString)"), partial(self.canvas.set_active_symbol, None)) # catch signals from custom symbol dialog in case a symbol # changed self.connect( self.manageSymbolsDialog, SIGNAL("symbol_added"), partial(self.refresh_symbol_widget_after_addition, symbolTracker)) self.connect( self.manageSymbolsDialog, SIGNAL("symbol_updated"), partial(self.refresh_symbol_widget_after_update, symbolTracker)) self.connect( self.manageSymbolsDialog, SIGNAL("symbol_deleted"), partial(self.refresh_symbol_widget_after_deletion, symbolTracker))
class RecentlyUsedSymbolWidget(QWidget): """ Container Widget for most recently used symbols symbol """ def __init__(self, parent = None): super(RecentlyUsedSymbolWidget, self).__init__(parent) self.layout = QGridLayout() self.color = QColor(Qt.white) self._synchronizer = SymbolSynchronizer() self.recentSymbolsDict = {} self.widgetToSymbol = {} self.setMinimumHeight(40) self.setMaximumHeight(40) labelWidget = QLabel("None"); self.layout.addWidget(labelWidget, 0, 0, Qt.AlignVCenter) self.recentSymbols = [labelWidget] self.setLayout(self.layout) def clear(self): """ Removes all widgets and re-inializes the widget. """ for widget in self.recentSymbols: self.layout.removeWidget(widget) widget.setParent(None) self._synchronizer.unselect() labelWidget = QLabel("None"); self.layout.addWidget(labelWidget, 0, 0, Qt.AlignVCenter) self.recentSymbols = [labelWidget] self.recentSymbolsDict = {} self.widgetToSymbol = {} def widget_clicked(self, widget): """ What happens when one of the widgets is clicked """ # make sure that we count clicks on widgets as well symbol = self.widgetToSymbol[widget] self.recentSymbolsDict[symbol] += 1 # synchronize with widget in symbol selector widget symbol.click_me() def insert_new_symbol(self, symbol): """ Insert new symbol into recently used symbols widget """ if not symbol: self._synchronizer.unselect() return # increase symbol use count by one or add new symbol if symbol in self.recentSymbolsDict: self.recentSymbolsDict[symbol] += 1 self.click_on_a_symbol_widget(symbol) else: # if we have more than MAX_RECENT_SYMBOLS symbols evict # the one with the lowest count if len(self.recentSymbolsDict) > MAX_RECENT_SYMBOLS-1: minKey = min(self.recentSymbolsDict.values()) keyDict = self.recentSymbolsDict.copy() for (key, val) in keyDict.items(): if val == minKey: del self.recentSymbolsDict[key] break # adding it after evicting a previous one # makes sure we always keep the most recent item self.recentSymbolsDict[symbol] = 1 self.update_widget(symbol) def update_widget(self, symbol): """ Update the widget, e.g. after adding/deleting a symbol. """ # remove previous symbols for widget in self.recentSymbols: self.layout.removeWidget(widget) widget.setParent(None) self.recentSymbols = [] # add new ones self.widgetToSymbol = {} for (index, item) in enumerate(self.recentSymbolsDict.keys()): widget = SymbolDisplayItem(item.get_content(), self._synchronizer) self.connect(widget, SIGNAL("widget_pressed"), self.widget_clicked) self.widgetToSymbol[widget] = item self.layout.addWidget(widget, 0, index, Qt.AlignVCenter) self.recentSymbols.append(widget) self.click_on_a_symbol_widget(symbol) def click_on_a_symbol_widget(self, symbol): """ Clicks the widget corresponding to symbol. """ for (widget, widgetSymbol) in self.widgetToSymbol.items(): if widgetSymbol == symbol: widget.click_me()