Source code for direct.tkpanels.NotifyPanel

"""Contains the NotifyPanel class."""

__all__ = ['NotifyPanel']


[docs]class NotifyPanel: """NotifyPanel class: this class contains methods for creating a panel to control direct/panda notify categories."""
[docs] def __init__(self, directNotify, tl = None): """ NotifyPanel class pops up a control panel to view/set notify levels for all available DIRECT and PANDA notify categories """ # Make sure TK mainloop is running from direct.showbase.TkGlobal import Pmw, Toplevel, Frame, Label, Radiobutton from direct.showbase.TkGlobal import HORIZONTAL, X, W, NW, BOTH, LEFT, RIGHT, IntVar # To get severity levels from panda3d.core import NSFatal, NSError, NSWarning, NSInfo, NSDebug, NSSpam if tl is None: tl = Toplevel() tl.title('Notify Controls') tl.geometry('300x400') # Init active category self.activeCategory = None # Create widgets mainFrame = Frame(tl) # Paned widget for dividing two halves framePane = Pmw.PanedWidget(mainFrame, orient = HORIZONTAL) categoryFrame = framePane.add('categories', size = 200) severityFrame = framePane.add('severities', size = 50) # Category frame # Assemble PANDA categories categories = self.getPandaCategoriesAsList() self.__categories = {} categoryNames = [] for category in categories: name = category.getBasename() self.__categories[name] = category categoryNames.append(name) # Assemble DIRECT categories for name in directNotify.getCategories(): category = directNotify.getCategory(name) self.__categories[name] = category categoryNames.append(name) # Sort resulting list of names categoryNames.sort() # Create a listbox self.categoryList = Pmw.ScrolledListBox( categoryFrame, labelpos = 'nw', label_text = 'Categories:', label_font=('MSSansSerif', 10, 'bold'), listbox_takefocus = 1, items = categoryNames, selectioncommand = self.setActivePandaCategory) self.categoryList.pack(expand = 1, fill = 'both') # Severity frame Label(severityFrame, text = 'Severity:', font=('MSSansSerif', 10, 'bold'), justify = RIGHT, anchor = W).pack(fill = X, padx = 5) self.severity = IntVar() self.severity.set(0) self.fatalSeverity = Radiobutton(severityFrame, text = 'Fatal', justify = 'left', anchor = 'w', value = NSFatal, variable = self.severity, command = self.setActiveSeverity) self.fatalSeverity.pack(fill = X) self.errorSeverity = Radiobutton(severityFrame, text = 'Error', justify = 'left', anchor = 'w', value = NSError, variable = self.severity, command = self.setActiveSeverity) self.errorSeverity.pack(fill = X) self.warningSeverity = Radiobutton(severityFrame, text = 'Warning', justify = 'left', anchor = 'w', value = NSWarning, variable = self.severity, command = self.setActiveSeverity) self.warningSeverity.pack(fill = X) self.infoSeverity = Radiobutton(severityFrame, text = 'Info', justify = 'left', anchor = 'w', value = NSInfo, variable = self.severity, command = self.setActiveSeverity) self.infoSeverity.pack(fill = X) self.debugSeverity = Radiobutton(severityFrame, text = 'Debug', justify = 'left', anchor = 'w', value = NSDebug, variable = self.severity, command = self.setActiveSeverity) self.debugSeverity.pack(fill = X) self.spamSeverity = Radiobutton(severityFrame, text = 'Spam', justify = 'left', anchor = 'w', value = NSSpam, variable = self.severity, command = self.setActiveSeverity) self.spamSeverity.pack(fill = X) # Pack frames framePane.pack(expand = 1, fill = 'both') mainFrame.pack(expand = 1, fill = 'both') # Get listbox listbox = self.categoryList.component('listbox') # Bind updates to arrow buttons listbox.bind('<KeyRelease-Up>', self.setActivePandaCategory) listbox.bind('<KeyRelease-Down>', self.setActivePandaCategory) # And grab focus (to allow keyboard navigation) listbox.focus_set() # And set active index (so keypresses will start with index 0) listbox.activate(0) # Select first item self.categoryList.select_set(0) self.setActivePandaCategory()
def _getPandaCategories(self, category): categories = [category] for i in range(category.getNumChildren()): child = category.getChild(i) categories.append(self._getPandaCategories(child)) return categories
[docs] def getPandaCategories(self): from panda3d.core import Notify topCategory = Notify.ptr().getTopCategory() return self._getPandaCategories(topCategory)
def _getPandaCategoriesAsList(self, pc, list): for item in pc: if isinstance(item, list): self._getPandaCategoriesAsList(item, list) else: list.append(item)
[docs] def getPandaCategoriesAsList(self): pc = self.getPandaCategories() pcList = [] self._getPandaCategoriesAsList(pc, pcList) return pcList[1:]
[docs] def setActivePandaCategory(self, event = None): categoryName = self.categoryList.getcurselection()[0] self.activeCategory = self.__categories.get(categoryName, None) if self.activeCategory: self.severity.set(self.activeCategory.getSeverity())
[docs] def setActiveSeverity(self): if self.activeCategory: self.activeCategory.setSeverity(self.severity.get())