comparison orpg/tools/pluginui.py @ 28:ff154cf3350c ornery-orc

Traipse 'OpenRPG' {100203-00} Traipse is a distribution of OpenRPG that is designed to be easy to setup and go. Traipse also makes it easy for developers to work on code without fear of sacrifice. 'Ornery-Orc' continues the trend of 'Grumpy' and adds fixes to the code. 'Ornery-Orc's main goal is to offer more advanced features and enhance the productivity of the user. Update Summary (Stable) New Features: New Bookmarks Feature New 'boot' command to remote admin New confirmation window for sent nodes Miniatures Layer pop up box allows users to turn off Mini labels, from FlexiRPG New Zoom Mouse plugin added New Images added to Plugin UI Switching to Element Tree New Map efficiency, from FlexiRPG New Status Bar to Update Manager New TrueDebug Class in orpg_log (See documentation for usage) New Portable Mercurial New Tip of the Day, from Core and community New Reference Syntax added for custom PC sheets New Child Reference for gametree New Parent Reference for gametree New Gametree Recursion method, mapping, context sensitivity, and effeciency.. New Features node with bonus nodes and Node Referencing help added New Dieroller structure from Core New DieRoller portability for odd Dice New 7th Sea die roller; ie [7k3] = [7d10.takeHighest(3).open(10)] New 'Mythos' System die roller added New vs. die roller method for WoD; ie [3v3] = [3d10.vs(3)]. Included for Mythos roller also New Warhammer FRPG Die Roller (Special thanks to Puu-san for the support) New EZ_Tree Reference system. Push a button, Traipse the tree, get a reference (Beta!) New Grids act more like Spreadsheets in Use mode, with Auto Calc Fixes: Fix to allow for portability to an OpenSUSE linux OS Fix to mplay_client for Fedora and OpenSUSE Fix to Text based Server Fix to Remote Admin Commands Fix to Pretty Print, from Core Fix to Splitter Nodes not being created Fix to massive amounts of images loading, from Core Fix to Map from gametree not showing to all clients Fix to gametree about menus Fix to Password Manager check on startup Fix to PC Sheets from tool nodes. They now use the tabber_panel Fix to Whiteboard ID to prevent random line or text deleting. Fixes to Server, Remote Server, and Server GUI Fix to Update Manager; cleaner clode for saved repositories Fixes made to Settings Panel and now reactive settings when Ok is pressed Fixes to Alternity roller's attack roll. Uses a simple Tuple instead of a Splice Fix to Use panel of Forms and Tabbers. Now longer enters design mode Fix made Image Fetching. New fetching image and new failed image Fix to whiteboard ID's to prevent non updated clients from ruining the fix. default_manifest.xml renamed to default_upmana.xml
author sirebral
date Wed, 03 Feb 2010 22:16:49 -0600
parents 97265586402b
children
comparison
equal deleted inserted replaced
27:51428d30c59e 28:ff154cf3350c
1 from orpg.orpg_wx import * 1 from orpg.orpg_wx import *
2 from orpg.orpgCore import * 2 from orpg.orpgCore import *
3 import orpg.plugindb as plugindb 3 from orpg.plugindb import plugindb
4 from orpg.dirpath import dir_struct 4 from orpg.dirpath import dir_struct
5 5
6 sys.path.append(dir_struct["plugins"]) 6 #sys.path.append(dir_struct["plugins"])
7 7
8 class PluginFrame(wx.Frame): 8 class PluginFrame(wx.Frame):
9 def __init__(self, parent): 9 def __init__(self, parent):
10 wx.Frame.__init__(self, parent, wx.ID_ANY, "Plugin Control Panel") 10 wx.Frame.__init__(self, parent, wx.ID_ANY, "Plugin Control Panel")
11 self.panel = wx.Panel(self, wx.ID_ANY) 11 self.panel = wx.Panel(self, wx.ID_ANY)
12 self.plugindb = plugindb.PluginDB()
13 self.parent = parent 12 self.parent = parent
14 self.startplugs = self.plugindb.GetList("plugincontroller", "startup_plugins", []) 13 self.startplugs = plugindb.GetList("plugincontroller", "startup_plugins", [])
15 self.available_plugins = {} 14 self.available_plugins = {}
16 self.enabled_plugins = {} 15 self.enabled_plugins = {}
17 self.pluginNames = [] 16 self.pluginNames = []
18 self.SetMinSize((380, 480)) 17 self.SetMinSize((380, 480))
19 self._selectedPlugin = None 18 self._selectedPlugin = None
42 def __buildGUI(self): 41 def __buildGUI(self):
43 self.main_sizer = wx.BoxSizer(wx.VERTICAL) 42 self.main_sizer = wx.BoxSizer(wx.VERTICAL)
44 self.btn_sizer = wx.BoxSizer(wx.HORIZONTAL) 43 self.btn_sizer = wx.BoxSizer(wx.HORIZONTAL)
45 self.btn_sizer2 = wx.BoxSizer(wx.HORIZONTAL) 44 self.btn_sizer2 = wx.BoxSizer(wx.HORIZONTAL)
46 self.head_sizer = wx.BoxSizer(wx.HORIZONTAL) 45 self.head_sizer = wx.BoxSizer(wx.HORIZONTAL)
47 #pnl = wx.Panel(self.panel, wx.ID_ANY)
48 self.err_sizer = wx.BoxSizer(wx.VERTICAL) 46 self.err_sizer = wx.BoxSizer(wx.VERTICAL)
49 self.err_sizer.Add(self.head_sizer, 0, wx.EXPAND) 47 self.err_sizer.Add(self.head_sizer, 0, wx.EXPAND)
50 self.errorMessage = wx.StaticText(self.panel, wx.ID_ANY, "") 48 self.errorMessage = wx.StaticText(self.panel, wx.ID_ANY, "")
51 self.err_sizer.Add(self.errorMessage, 0, wx.EXPAND) 49 self.err_sizer.Add(self.errorMessage, 0, wx.EXPAND)
52 self.main_sizer.Add(self.err_sizer, 0, wx.EXPAND) 50 self.main_sizer.Add(self.err_sizer, 0, wx.EXPAND)
53 self.pluginList = wx.ListCtrl(self.panel, wx.ID_ANY, style=wx.LC_SINGLE_SEL|wx.LC_REPORT|wx.LC_HRULES|wx.LC_SORT_ASCENDING) 51 self.pluginList = wx.ListCtrl(self.panel, wx.ID_ANY,
54 self.pluginList.InsertColumn(1, "Name") 52 style=wx.LC_SINGLE_SEL|wx.LC_REPORT|wx.LC_HRULES|wx.LC_SORT_ASCENDING)
55 self.pluginList.InsertColumn(2, "Autostart") 53 self.pluginList.InsertColumn(0, "Name")
56 self.pluginList.InsertColumn(3, "Author") 54 self.pluginList.InsertColumn(1, "Author")
57 self.Bind(wx.EVT_LIST_ITEM_SELECTED, self._selectPlugin, self.pluginList) 55 self.Bind(wx.EVT_LIST_ITEM_SELECTED, self._selectPlugin, self.pluginList)
58 self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self._deselectPlugin, self.pluginList) 56 self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self._deselectPlugin, self.pluginList)
59 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self._togglePlugin, self.pluginList) 57 self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self._togglePlugin, self.pluginList)
60 self.Bind(wx.EVT_LIST_COL_CLICK, self._sort, self.pluginList) 58 self.Bind(wx.EVT_LIST_COL_CLICK, self._sort, self.pluginList)
61 self.main_sizer.Add(self.pluginList, 1, wx.EXPAND) 59 self.main_sizer.Add(self.pluginList, 1, wx.EXPAND)
88 self.__disablePluginBtns() 86 self.__disablePluginBtns()
89 87
90 self.main_sizer.Add(self.btn_sizer, 0, wx.EXPAND) 88 self.main_sizer.Add(self.btn_sizer, 0, wx.EXPAND)
91 self.main_sizer.Add(self.btn_sizer2, 0, wx.EXPAND) 89 self.main_sizer.Add(self.btn_sizer2, 0, wx.EXPAND)
92 90
91 # Create Book Mark Image List
92 self.pluginList.Bind(wx.EVT_LEFT_DOWN, self.on_hit)
93 self._imageList = wx.ImageList( 16, 16, False )
94 img = wx.Image(dir_struct["icon"]+"add_button.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap()
95 self._imageList.Add( img )
96 img = wx.Image(dir_struct["icon"]+"check_button.png", wx.BITMAP_TYPE_PNG).ConvertToBitmap()
97 self._imageList.Add( img )
98 self.pluginList.SetImageList( self._imageList, wx.IMAGE_LIST_SMALL )
99
100 def on_hit(self, evt):
101 pos = wx.Point( evt.GetX(), evt.GetY() )
102 (item, flag, sub) = self.pluginList.HitTestSubItem( pos )
103 ## Item == list[server], flag == (32 = 0 colum, 128 = else) ##
104 if flag == 32: self._autostart(item)
105 evt.Skip()
106
93 def __disablePluginBtns(self): 107 def __disablePluginBtns(self):
94 self.enableBtn.Disable() 108 self.enableBtn.Disable()
95 self.disableBtn.Disable() 109 self.disableBtn.Disable()
96 self.autostartBtn.Disable() 110 self.autostartBtn.Disable()
97 self.helpBtn.Disable() 111 self.helpBtn.Disable()
110 def __clearError(self): 124 def __clearError(self):
111 self.errorMessage.Label = "" 125 self.errorMessage.Label = ""
112 self.__doLayout() 126 self.__doLayout()
113 127
114 def __checkIdx(self, evt): 128 def __checkIdx(self, evt):
115 if isinstance(evt, int): 129 if isinstance(evt, int): return evt
116 return evt 130 elif self._selectedPlugin is not None: return self._selectedPlugin
117 elif self._selectedPlugin is not None:
118 return self._selectedPlugin
119 else: 131 else:
120 dlg = wx.MessageDialog(None, "You need to select a plugin before you can use this!", 'ERROR', wx.OK) 132 dlg = wx.MessageDialog(None,
133 "You need to select a plugin before you can use this!",
134 'ERROR', wx.OK)
121 dlg.ShowModal() 135 dlg.ShowModal()
122 dlg.Destroy() 136 dlg.Destroy()
123 return None 137 return None
124 138
125 def __impPlugin(self, pname): 139 def __impPlugin(self, pname):
126 try: 140 try:
127 if "plugins." + pname in sys.modules: 141 if "plugins." + pname in sys.modules:
128 del sys.modules["plugins." + pname]#to ensure that the newly-imported one will be used correctly. No, reload() is not a better way to do this. 142 del sys.modules["plugins." + pname]
143 #to ensure that the newly-imported one will be used correctly.
144 #No, reload() is not a better way to do this.
129 mod = __import__("plugins." + pname) 145 mod = __import__("plugins." + pname)
130 plugin = getattr(mod, pname) 146 plugin = getattr(mod, pname)
131 pdata = plugin.Plugin(self.plugindb, self.parent) 147 pdata = plugin.Plugin(plugindb, self.parent)
132 self.available_plugins[pdata.name] = [pname, pdata, pdata.author, pdata.help] 148 self.available_plugins[pdata.name] = [pname, pdata, pdata.author, pdata.help]
133 return plugin 149 return plugin
134 150
135 except Exception, e: 151 except Exception, e:
136 self.__error(e) 152 self.__error(e)
155 171
156 if info[0] in self.enabled_plugins: 172 if info[0] in self.enabled_plugins:
157 self.enableBtn.Disable() 173 self.enableBtn.Disable()
158 else: 174 else:
159 self.disableBtn.Disable() 175 self.disableBtn.Disable()
160 if self.pluginList.GetItem(self._selectedPlugin, 1).GetText() == "X": 176 if pname in self.startplugs:
161 self.autostartBtn.Label = "Disable Autostart" 177 self.autostartBtn.Label = "Disable Autostart"
162 178
163 self.__doLayout() 179 self.__doLayout()
164 self.pluginList.SetItemState(self._selectedPlugin, wx.LIST_STATE_SELECTED, wx.LIST_STATE_SELECTED) 180 self.pluginList.SetItemState(self._selectedPlugin,
181 wx.LIST_STATE_SELECTED,
182 wx.LIST_STATE_SELECTED)
165 183
166 def _deselectPlugin(self, evt): 184 def _deselectPlugin(self, evt):
167 self.__disablePluginBtns() 185 self.__disablePluginBtns()
168 self._selectedPlugin = None 186 self._selectedPlugin = None
169 187
170 def _togglePlugin(self, evt): 188 def _togglePlugin(self, evt):
171 idx = evt.GetIndex() 189 idx = evt.GetIndex()
172 pname = self.pluginList.GetItem(idx, 0).GetText() 190 pname = self.pluginList.GetItem(idx, 0).GetText()
173 info = self.available_plugins[pname] 191 info = self.available_plugins[pname]
174 192 if info[0] in self.enabled_plugins: self._disable(idx)
175 if info[0] in self.enabled_plugins: 193 else: self._enable(idx)
176 self._disable(idx)
177 else:
178 self._enable(idx)
179
180 self.pluginList.SetItemState(self._selectedPlugin, 0, wx.LIST_STATE_SELECTED) 194 self.pluginList.SetItemState(self._selectedPlugin, 0, wx.LIST_STATE_SELECTED)
181 195
182 def _enableAll(self, evt): 196 def _enableAll(self, evt):
183 for pname in self.available_plugins.iterkeys(): 197 for pname in self.available_plugins.iterkeys():
184 info = self.available_plugins[pname] 198 info = self.available_plugins[pname]
234 self.disableBtn.Disable() 248 self.disableBtn.Disable()
235 self.enableBtn.Enable() 249 self.enableBtn.Enable()
236 250
237 def _autostart(self, evt): 251 def _autostart(self, evt):
238 idx = self.__checkIdx(evt) 252 idx = self.__checkIdx(evt)
239 if idx is None: 253 if idx is None: return
240 return 254 pname = self.pluginList.GetItem(idx, 0).GetText()
241 if self.pluginList.GetItem(idx, 1).GetText() == "X": 255 info = self.available_plugins[pname]
256 if self.pluginList.GetItem(idx, 0).GetText() in self.startplugs:
242 self.startplugs.remove(self.pluginList.GetItem(idx, 0).GetText()) 257 self.startplugs.remove(self.pluginList.GetItem(idx, 0).GetText())
243 self.pluginList.SetStringItem(idx, 1, "") 258 self.pluginList.SetItemImage(idx, 0, 0)
244 self.autostartBtn.Label = "Autostart" 259 self.autostartBtn.Label = "Autostart"
260 if info[0] in self.enabled_plugins:
261 dlg = wx.MessageDialog(None, 'Disable Plugin Now?', 'Plugin Enabled',
262 wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
263 dlg.ShowModal()
264 if dlg.ShowModal() == wx.ID_YES: self._disable(evt)
245 else: 265 else:
246 self.startplugs.append(self.pluginList.GetItem(idx, 0).GetText()) 266 self.startplugs.append(self.pluginList.GetItem(idx, 0).GetText())
247 self.pluginList.SetStringItem(idx, 1, "X") 267 self.pluginList.SetItemImage(idx, 1, 0)
248 self.autostartBtn.Label = "Disable Autostart" 268 self.autostartBtn.Label = "Disable Autostart"
249 269 if info[0] not in self.enabled_plugins:
250 self.plugindb.SetList("plugincontroller", "startup_plugins", self.startplugs) 270 dlg = wx.MessageDialog(None, 'Enable Plugin Now?', 'Plugin Disabled',
271 wx.YES_NO | wx.NO_DEFAULT | wx.ICON_QUESTION)
272 if dlg.ShowModal() == wx.ID_YES: self._enable(evt)
273
274 plugindb.SetList("plugincontroller", "startup_plugins", self.startplugs)
251 self.__doLayout() 275 self.__doLayout()
252 276
253 def _help(self, evt): 277 def _help(self, evt):
254 if isinstance(evt, int): 278 if isinstance(evt, int): idx = evt
255 idx = evt 279 elif self._selectedPlugin is not None: idx = self._selectedPlugin
256 elif self._selectedPlugin is not None:
257 idx = self._selectedPlugin
258 else: 280 else:
259 dlg = wx.MessageDialog(None, "You need to select a plugin before you can use this!", 'ERROR', wx.OK) 281 dlg = wx.MessageDialog(None,
282 "You need to select a plugin before you can use this!",
283 'ERROR', wx.OK)
260 dlg.ShowModal() 284 dlg.ShowModal()
261 dlg.Destroy() 285 dlg.Destroy()
262 return 286 return
263 287
264 pname = self.pluginList.GetItem(idx, 0).GetText() 288 pname = self.pluginList.GetItem(idx, 0).GetText()
265 info = self.available_plugins[pname] 289 info = self.available_plugins[pname]
266
267 msg = "Author(s):\t" + info[2] + "\n\n" + info[3] 290 msg = "Author(s):\t" + info[2] + "\n\n" + info[3]
268
269 dlg = wx.MessageDialog(None, msg, 'Plugin Information: ' + pname, wx.OK) 291 dlg = wx.MessageDialog(None, msg, 'Plugin Information: ' + pname, wx.OK)
270 dlg.ShowModal() 292 dlg.ShowModal()
271 dlg.Destroy() 293 dlg.Destroy()
272 294
273 def _update(self, evt): 295 def _update(self, evt):
278 self.pluginList.DeleteAllItems() 300 self.pluginList.DeleteAllItems()
279 self.pluginNames = [] 301 self.pluginNames = []
280 302
281 list_of_plugin_dir = os.listdir(dir_struct["plugins"]) 303 list_of_plugin_dir = os.listdir(dir_struct["plugins"])
282 for p in list_of_plugin_dir: 304 for p in list_of_plugin_dir:
283 #print p[:2]; print p[-4:]
284 if p[:2].lower()=="xx" and p[-3:]==".py": 305 if p[:2].lower()=="xx" and p[-3:]==".py":
285 self.__impPlugin(p[:-3]) 306 self.__impPlugin(p[:-3])
286 elif p[:2].lower()=="xx" and p[-4:]==".pyc": 307 elif p[:2].lower()=="xx" and p[-4:]==".pyc":
287 self.__impPlugin(p[:-4]) 308 self.__impPlugin(p[:-4])
288 309
289 i = 0 310 i = 0
290 for plugname, info in self.available_plugins.iteritems(): 311 for plugname, info in self.available_plugins.iteritems():
291 self.pluginNames.append(plugname) 312 self.pluginNames.append(plugname)
292 idx = self.pluginList.InsertStringItem(self.pluginList.GetItemCount(), plugname) 313 idx = self.pluginList.InsertStringItem(self.pluginList.GetItemCount(), plugname)
293 self.pluginList.SetStringItem(idx, 2, info[2]) 314 self.pluginList.SetStringItem(idx, 1, info[2])
315 self.pluginList.SetItemImage(idx, 0, 0)
294 if plugname in self.startplugs: 316 if plugname in self.startplugs:
295 self.pluginList.SetStringItem(idx, 1, "X") 317 self.pluginList.SetItemImage(idx, 1, 0)
296 self._enable(idx) 318 self._enable(idx)
297 self.pluginList.SetItemData(idx, i) 319 self.pluginList.SetItemData(idx, i)
298 i += 1 320 i += 1
299 self.pluginList.SetColumnWidth(0, wx.LIST_AUTOSIZE) 321 self.pluginList.SetColumnWidth(0, wx.LIST_AUTOSIZE)
322 self.pluginList.SetColumnWidth(1, wx.LIST_AUTOSIZE)
300 self.__doLayout() 323 self.__doLayout()
301 self.__disablePluginBtns() 324 self.__disablePluginBtns()
302 325
303 def _close(self, evt): 326 def _close(self, evt):
304 self.Hide() 327 self.Hide()