Mercurial > traipse
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() |