HotKeyUI.py 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. import wx
  2. from wx.lib.scrolledpanel import ScrolledPanel
  3. class EditHotKeyDialog(wx.Dialog):
  4. def __init__(self, parent, id, title, key):
  5. wx.Dialog.__init__(self, parent, id, title, size=(250, 240))
  6. self.currKey = key
  7. self.panel = wx.Panel(self, -1)
  8. self.updateUI()
  9. vbox = wx.BoxSizer(wx.VERTICAL)
  10. vbox.Add(self.panel, 1, wx.EXPAND, 0)
  11. self.SetSizer(vbox)
  12. self.Layout()
  13. def updateUI(self):
  14. vbox = wx.BoxSizer(wx.VERTICAL)
  15. self.label = wx.StaticText(self.panel, label='')
  16. vbox.Add(self.label)
  17. self.modifierRadio = wx.RadioBox(self.panel, -1, "", choices=['None', 'Shift', 'Control'], majorDimension=1, style=wx.RA_SPECIFY_ROWS)
  18. self.modifierRadio.Bind(wx.EVT_RADIOBOX, self.onChangeModifier)
  19. vbox.Add(self.modifierRadio)
  20. itemPanel = wx.Panel(self.panel)
  21. hbox = wx.BoxSizer(wx.HORIZONTAL)
  22. keyList = ['']
  23. keyList.extend(base.direct.specialKeys)
  24. self.specialKeyCombo = wx.Choice(itemPanel, -1, choices=keyList)
  25. self.specialKeyCombo.Bind(wx.EVT_CHOICE, self.onChangeSpecialKey)
  26. self.keyEntry = wx.TextCtrl(itemPanel, -1, size=(30, 20))
  27. button = wx.Button(itemPanel, -1, 'Apply', size=(50, 20))
  28. button.Bind(wx.EVT_BUTTON, self.onApply)
  29. hbox.Add(self.specialKeyCombo)
  30. hbox.Add(self.keyEntry)
  31. hbox.Add(button)
  32. itemPanel.SetSizer(hbox)
  33. vbox.Add(itemPanel)
  34. self.panel.SetSizer(vbox)
  35. keyDesc = base.direct.hotKeyMap[self.currKey]
  36. self.label.SetLabel(keyDesc[0])
  37. if 'shift' in self.currKey:
  38. self.modifierRadio.SetStringSelection('Shift')
  39. self.specialKeyCombo.Enable(False)
  40. keyStr = self.currKey[len('shift-'):]
  41. elif 'control' in self.currKey:
  42. self.modifierRadio.SetStringSelection('Control')
  43. self.specialKeyCombo.Enable(False)
  44. keyStr = self.currKey[len('control-'):]
  45. else:
  46. self.modifierRadio.SetStringSelection('None')
  47. self.specialKeyCombo.Enable(True)
  48. keyStr = self.currKey
  49. if keyStr in base.direct.specialKeys:
  50. self.keyEntry.SetValue('')
  51. self.keyEntry.Enable(False)
  52. self.specialKeyCombo.SetStringSelection(keyStr)
  53. else:
  54. self.specialKeyCombo.SetStringSelection('')
  55. self.keyEntry.SetValue(keyStr)
  56. def onChangeModifier(self, evt):
  57. if evt.GetString() == 'None':
  58. self.specialKeyCombo.Enable(True)
  59. else:
  60. self.specialKeyCombo.SetStringSelection('')
  61. self.specialKeyCombo.Enable(False)
  62. self.keyEntry.Enable(True)
  63. def onChangeSpecialKey(self, evt):
  64. if evt.GetString() != '':
  65. self.keyEntry.SetValue('')
  66. self.keyEntry.Enable(False)
  67. else:
  68. self.keyEntry.Enable(True)
  69. def onApply(self, evt):
  70. modifier = self.modifierRadio.GetStringSelection()
  71. if modifier == 'Shift':
  72. prefix = 'shift-'
  73. elif modifier == 'Control':
  74. prefix = 'control-'
  75. else:
  76. prefix = ''
  77. specialKey = self.specialKeyCombo.GetStringSelection()
  78. if specialKey == '':
  79. newKeyStr= prefix + self.keyEntry.GetValue().lower()
  80. else:
  81. newKeyStr = specialKey
  82. if newKeyStr != self.currKey:
  83. if newKeyStr in list(base.direct.hotKeyMap.keys()):
  84. print('a hotkey is to be overridden with %s' % newKeyStr)
  85. oldKeyDesc = base.direct.hotKeyMap[newKeyStr]
  86. msg = 'The hotkey is already assigned to %s\n'%oldKeyDesc[0] +\
  87. 'Do you want to override this?'
  88. dialog = wx.MessageDialog(None, msg, 'Hot Key exists!',
  89. wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
  90. result = dialog.ShowModal()
  91. if result == wx.ID_YES:
  92. base.direct.hotKeyMap[newKeyStr] = base.direct.hotKeyMap[self.currKey]
  93. base.direct.hotKeyMap['__removed__' + newKeyStr] = oldKeyDesc
  94. del base.direct.hotKeyMap[self.currKey]
  95. else:
  96. base.direct.hotKeyMap[newKeyStr] = base.direct.hotKeyMap[self.currKey]
  97. del base.direct.hotKeyMap[self.currKey]
  98. self.Destroy()
  99. class HotKeyPanel(ScrolledPanel):
  100. def __init__(self, parent):
  101. ScrolledPanel.__init__(self, parent, -1)
  102. self.parent = parent
  103. self.updateUI()
  104. def updateUI(self):
  105. vbox = wx.BoxSizer(wx.VERTICAL)
  106. keys = list(base.direct.hotKeyMap.keys())
  107. keys.sort()
  108. for key in keys:
  109. keyDesc = base.direct.hotKeyMap[key]
  110. itemPanel = wx.Panel(self)
  111. sizer = wx.BoxSizer(wx.HORIZONTAL)
  112. space = wx.StaticText(itemPanel, label='', size=(10,20))
  113. hotKey = wx.StaticText(itemPanel, label=key, size=(100, 20))
  114. desc = wx.StaticText(itemPanel, label=keyDesc[0], size=(380, 20))
  115. button = wx.Button(itemPanel, -1, 'Edit', size=(40, 20))
  116. button.Bind(wx.EVT_BUTTON, lambda p0 = None, p1 = key: self.onEdit(p0, p1))
  117. sizer.Add(button)
  118. sizer.Add(space)
  119. sizer.Add(hotKey)
  120. sizer.Add(desc, 1, wx.EXPAND)
  121. itemPanel.SetSizer(sizer)
  122. vbox.Add(itemPanel)
  123. self.SetSizer(vbox)
  124. self.Layout()
  125. self.SetupScrolling(self, scroll_y=True, rate_y=20)
  126. self.parent.parent.updateMenu()
  127. def onEdit(self, evt, key):
  128. base.le.ui.bindKeyEvents(False)
  129. editUI = EditHotKeyDialog(self, -1, 'Edit Hot Key', key)
  130. editUI.ShowModal()
  131. editUI.Destroy()
  132. sizer = self.GetSizer()
  133. if sizer is not None:
  134. sizer.DeleteWindows()
  135. self.SetSizer(None)
  136. base.le.ui.bindKeyEvents(True)
  137. self.updateUI()
  138. class HotKeyUI(wx.Dialog):
  139. def __init__(self, parent, id, title):
  140. wx.Dialog.__init__(self, parent, id, title, size=(550, 500))
  141. self.parent = parent
  142. panel = HotKeyPanel(self)
  143. vbox = wx.BoxSizer(wx.VERTICAL)
  144. vbox.Add(panel, 1, wx.EXPAND, 0)
  145. self.SetSizer(vbox)
  146. self.Layout()