NotifyPanel.py 6.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. """Undocumented Module"""
  2. __all__ = ['NotifyPanel']
  3. class NotifyPanel:
  4. """NotifyPanel class: this class contains methods for creating
  5. a panel to control direct/panda notify categories."""
  6. def __init__(self, directNotify, tl = None):
  7. """
  8. NotifyPanel class pops up a control panel to view/set
  9. notify levels for all available DIRECT and PANDA notify categories
  10. """
  11. # Make sure TK mainloop is running
  12. from direct.showbase.TkGlobal import Pmw, Toplevel, Frame, Label, Radiobutton
  13. from direct.showbase.TkGlobal import HORIZONTAL, X, W, NW, BOTH, LEFT, RIGHT, IntVar
  14. # To get severity levels
  15. from pandac.PandaModules import NSFatal, NSError, NSWarning, NSInfo
  16. from pandac.PandaModules import NSDebug, NSSpam
  17. if tl == None:
  18. tl = Toplevel()
  19. tl.title('Notify Controls')
  20. tl.geometry('300x400')
  21. # Init active category
  22. self.activeCategory = None
  23. # Create widgets
  24. mainFrame = Frame(tl)
  25. # Paned widget for dividing two halves
  26. framePane = Pmw.PanedWidget(mainFrame,
  27. orient = HORIZONTAL)
  28. categoryFrame = framePane.add('categories', size = 200)
  29. severityFrame = framePane.add('severities', size = 50)
  30. # Category frame
  31. # Assemble PANDA categories
  32. categories = self.getPandaCategoriesAsList()
  33. self.__categories = {}
  34. categoryNames = []
  35. for category in categories:
  36. name = category.getBasename()
  37. self.__categories[name] = category
  38. categoryNames.append(name)
  39. # Assemble DIRECT categories
  40. for name in directNotify.getCategories():
  41. category = directNotify.getCategory(name)
  42. self.__categories[name] = category
  43. categoryNames.append(name)
  44. # Sort resulting list of names
  45. categoryNames.sort()
  46. # Create a listbox
  47. self.categoryList = Pmw.ScrolledListBox(
  48. categoryFrame,
  49. labelpos = 'nw', label_text = 'Categories:',
  50. label_font=('MSSansSerif', 10, 'bold'),
  51. listbox_takefocus = 1,
  52. items = categoryNames,
  53. selectioncommand = self.setActivePandaCategory)
  54. self.categoryList.pack(expand = 1, fill = 'both')
  55. # Severity frame
  56. Label(severityFrame, text = 'Severity:',
  57. font=('MSSansSerif', 10, 'bold'),
  58. justify = RIGHT, anchor = W).pack(fill = X, padx = 5)
  59. self.severity = IntVar()
  60. self.severity.set(0)
  61. self.fatalSeverity = Radiobutton(severityFrame, text = 'Fatal',
  62. justify = 'left', anchor = 'w',
  63. value = NSFatal,
  64. variable = self.severity,
  65. command = self.setActiveSeverity)
  66. self.fatalSeverity.pack(fill = X)
  67. self.errorSeverity = Radiobutton(severityFrame, text = 'Error',
  68. justify = 'left', anchor = 'w',
  69. value = NSError,
  70. variable = self.severity,
  71. command = self.setActiveSeverity)
  72. self.errorSeverity.pack(fill = X)
  73. self.warningSeverity = Radiobutton(severityFrame, text = 'Warning',
  74. justify = 'left', anchor = 'w',
  75. value = NSWarning,
  76. variable = self.severity,
  77. command = self.setActiveSeverity)
  78. self.warningSeverity.pack(fill = X)
  79. self.infoSeverity = Radiobutton(severityFrame, text = 'Info',
  80. justify = 'left', anchor = 'w',
  81. value = NSInfo,
  82. variable = self.severity,
  83. command = self.setActiveSeverity)
  84. self.infoSeverity.pack(fill = X)
  85. self.debugSeverity = Radiobutton(severityFrame, text = 'Debug',
  86. justify = 'left', anchor = 'w',
  87. value = NSDebug,
  88. variable = self.severity,
  89. command = self.setActiveSeverity)
  90. self.debugSeverity.pack(fill = X)
  91. self.spamSeverity = Radiobutton(severityFrame, text = 'Spam',
  92. justify = 'left', anchor = 'w',
  93. value = NSSpam,
  94. variable = self.severity,
  95. command = self.setActiveSeverity)
  96. self.spamSeverity.pack(fill = X)
  97. # Pack frames
  98. framePane.pack(expand = 1, fill = 'both')
  99. mainFrame.pack(expand = 1, fill = 'both')
  100. # Get listbox
  101. listbox = self.categoryList.component('listbox')
  102. # Bind updates to arrow buttons
  103. listbox.bind('<KeyRelease-Up>', self.setActivePandaCategory)
  104. listbox.bind('<KeyRelease-Down>', self.setActivePandaCategory)
  105. # And grab focus (to allow keyboard navigation)
  106. listbox.focus_set()
  107. # And set active index (so keypresses will start with index 0)
  108. listbox.activate(0)
  109. # Select first item
  110. self.categoryList.select_set(0)
  111. self.setActivePandaCategory()
  112. def _getPandaCategories(self, category):
  113. categories = [category]
  114. for i in range(category.getNumChildren()):
  115. child = category.getChild(i)
  116. categories.append(self._getPandaCategories(child))
  117. return categories
  118. def getPandaCategories(self):
  119. from pandac.PandaModules import Notify
  120. topCategory = Notify.ptr().getTopCategory()
  121. return self._getPandaCategories(topCategory)
  122. def _getPandaCategoriesAsList(self, pc, list):
  123. import types
  124. for item in pc:
  125. if type(item) == types.ListType:
  126. self._getPandaCategoriesAsList(item, list)
  127. else:
  128. list.append(item)
  129. def getPandaCategoriesAsList(self):
  130. pc = self.getPandaCategories()
  131. pcList = []
  132. self._getPandaCategoriesAsList(pc, pcList)
  133. return pcList[1:]
  134. def setActivePandaCategory(self, event = None):
  135. categoryName = self.categoryList.getcurselection()[0]
  136. self.activeCategory = self.__categories.get(categoryName, None)
  137. if self.activeCategory:
  138. self.severity.set(self.activeCategory.getSeverity())
  139. def setActiveSeverity(self):
  140. if self.activeCategory:
  141. self.activeCategory.setSeverity(self.severity.get())