def __init__(self, parent): GLWindow.__init__(self, parent) Progressor.__init__(self) self.zoom = 20 self.maxZoom = 600 self.players = {} self.area = None self.placeables = None self.doors = None self.creatures = None self.waypoints = None self.lock = threading.Lock() self.highlight = None self.beingDragged = None self.beingPainted = None self.selected = [] self.mode = ToolPalette.SELECTION_TOOL self.textBoxes = {} self.highlightBox = None self.fps = 0.0 self.showFPS = False self.quadTreeRoot = None self.holdZ = 0 self.lastX = 0 self.lastY = 0 self.Zmax = 0 wx.EVT_RIGHT_DOWN(self, self.OnRightMouseDown) neverglobals.getResourceManager().addVisualChangeListener(self) self.toPreprocess = None
def getModel(self, copy=False): if not copy and self.model: return self.model twoda = neverglobals.getResourceManager()\ .getResourceByName('placeables.2da') index = self['Appearance'] self.modelName = twoda.getEntry(index, 'ModelName').lower() + '.mdl' model = neverglobals.getResourceManager()\ .getResourceByName(self.modelName,copy) if not copy: self.model = model return model
def setString(self, str, langID=0, gender=0): index = langID * 2 + gender s = None if self.strref != -1: if not neverglobals.getResourceManager(): logger.error('no resource manager in CExoLocString') return else: s = neverglobals.getResourceManager().getDialogString( self.strref) if s != str: self.locStrings[index] = str
def getPortrait(self, size): if self['Portrait']: name = self['Portrait'].lower() + size + '.tga' return neverglobals.getResourceManager().getResourceByName(name) twoda = neverglobals.getResourceManager()\ .getResourceByName('portraits.2da') baseResRef = twoda.getEntry(self['PortraitId'], 'BaseResRef') if not baseResRef or baseResRef == '****': return None return neverglobals.getResourceManager()\ .getResourceByName('po_' + baseResRef.lower() + size + '.tga')
def getResource(self, key): bifFileSpec = self.keys[key] f = self.getBifFile(bifFileSpec) c = neverglobals.getResourceManager()\ .interpretResourceContents(key, f.getResourceData(bifFileSpec[1])) return c
def addScript(self,s): ''' Add a Script object to the editor @param s: the script object to add ''' if not self.selectScript(s.getName()): s.setNWNDir(neverglobals.getResourceManager().getAppDir()) if self.module: s.setModule(self.module.getFileName()) self.scripts.append(s) editor = self.makeEditor() editor.SetText(s.getData()) editor.ConvertEOLs(stc.STC_EOL_LF) self.editors.append(editor) self.notebook.AddPage(editor,s.getName()[:-4]) self.notebook.SetSelection(len(self.scripts)-1) self.scriptTable[s.getName()] = (s,len(self.scripts)-1) self.chooseCurrentScript() self.clearOutput() editor.SetModEventMask(wx.stc.STC_MOD_INSERTTEXT| wx.stc.STC_MOD_DELETETEXT| wx.stc.STC_PERFORMED_USER) wx.stc.EVT_STC_CHANGE(editor, editor.GetId(), self.OnFileChanged) self.compileButton.Enable(True) self.closeButton.Enable(True) if self.helpviewer: self.helpButton.Enable(True)
def getPortrait(self, size): """Get this object's portrait (usually a PIL Image object). @param size: this size of the portrait to return, see BW documentation for possible single character values.""" portraitIndex = self.getPropertyValue('PortraitId') return neverglobals.getResourceManager()\ .getPortraitByIndex(portraitIndex,size)
def getModel(self,copy=False): # index to 'waypoint.2da', RESREF column if not copy and self.model: return self.model twoda = neverglobals.getResourceManager()\ .getResourceByName('waypoint.2da') index = self['Appearance'] #print(index) if not index: index = 1 # only influes on apearence in the toolset, not in game self.modelName = twoda.getEntry(index,'RESREF').lower() + '.mdl' #print('MODELNAME : '+self.modelName) model = neverglobals.getResourceManager()\ .getResourceByName(self.modelName,copy) if not copy: self.model = model return model
def cleanPropPage(self): '''Clean up the prop page, removing all labels and controls.''' for l in self.propLabels: self.propGrid.Detach(l) l.Destroy() for l in self.lines: self.propGrid.Detach(l) l.Destroy() for c, p in self.propControls.values(): self.propGrid.Detach(c.control) c.control.Destroy() self.propControls = {} self.propLabels = [] self.lines = [] #self.propGrid.AddGrowableCol(1) neverglobals.getResourceManager().removeResourceListChangeListener( self)
def getModel(self,copy=False): if not copy and self.model: return self.model twoda = neverglobals.getResourceManager()\ .getResourceByName('appearance.2da') index = self['Appearance_Type'] t = twoda.getEntry(index,'MODELTYPE') if t != 'P': self.modelName = twoda.getEntry(index,'RACE').lower() + '.mdl' model = neverglobals.getResourceManager()\ .getResourceByName(self.modelName,copy) if not copy: self.model = model return model else: #print 'not handling player model files yet' self.modelName = '' return None
def getEntryContents(self,entry): """get the contents of an entry as interpreted by the ResourceManager. This will not re-read them if they've already been read.""" if not entry.contents: raw = self.getRawEntryContents(entry) c = neverglobals.getResourceManager()\ .interpretResourceContents((entry.name,entry.type),raw) entry.contents = c return entry.contents
def updateAreaList(self): ''' rebuild area list from the contents of the ERF file ''' # first get all the area names, and check if areas have all 3 parts: ARE, GIC and GIT areKeys = neverglobals.getResourceManager().getKeysWithExtensions( 'ARE') gitKeys = neverglobals.getResourceManager().getKeysWithExtensions( 'GIT') gicKeys = neverglobals.getResourceManager().getKeysWithExtensions( 'GIC') areaNames = [] gitNames = [] gicNames = [] for a in areKeys: areaNames.append(a[0]) for a in gitKeys: gitNames.append(a[0]) for a in gicKeys: gicNames.append(a[0]) for a in areaNames: try: tmp1 = gitNames.index(a) tmp2 = gicNames.index(a) except ValueError: logger.warning( '''area file without a GIC or a GIT part : %s - not including it in Mod_AreaList''' % a) areaNames.remove(a) # sets the new Mod_Area_list newAreaList = [] for a in areaNames: s = GFFStruct() s.add('Area_Name', a, 'ResRef') newAreaList.append(s) self.setProperty("Mod_Area_list", newAreaList) self.needSave = True # check if Mod_Entry_Area is a present area try: map(lambda x: x.strip('\0'), areaNames).index(self['Mod_Entry_Area']) except KeyError: logger.warning( '''Module starting point set in non-existant area : "%s" - please change Mod_Entry_Area value''' % self['Mod_Entry_Area'])
def playButtonHit_soundset(self): soundset_name = self.twoda.getEntry(self.sound_list.GetSelection(),'RESREF') soundset_name = soundset_name.lower() soundset = neverglobals.getResourceManager().getRawResourceByName(\ soundset_name + '.ssf') ssf = SoundSetFile.SoundSetFile() ssf.fromFile(StringIO(soundset)) sound_name = ssf.getEntryData(1)[0] # now, let's get the sound file, at least sound_resource = neverglobals.getResourceManager().getRawResourceByName(sound_name+'.wav') # check if we have a bmu file if sound_resource[0:3]=='BMU': sound_resource = sound_resource[8:] self.SoundType = 'BMU' else: self.SoundType = 'WAV' self.SoundObject = StringIO(sound_resource) self.hasChanged = False self.playSound()
def meshHeaderFromFile(self, mdlFile): f = mdlFile.file f.seek(8, 1) self.faceArray = MDLFile.arrayFromFile(f) values = dataHandler.readFromFile('<ffffffffffffffffffffIIII', f) self.boundingBox = Numeric.array([values[0:3], values[3:6]]) self.alpha = 1.0 #changeable via controller self.radius = values[6] self.centreOfMass = values[7:10] self.diffuseColour = list(values[10:13]) self.ambientColour = list(values[13:16]) self.specularColour = list(values[16:19]) (self.shininess, self.shadowFlag, self.beamingFlag, self.renderFlag, self.transparencyHint) = values[19:24] f.seek(4, 1) self.texture0name = f.read(64) self.texture0name = self.texture0name[:self.texture0name.find('\0')] r = neverglobals.getResourceManager() if self.texture0name and self.texture0name != 'NULL': self.texture0 = r.getResourceByName(self.texture0name.lower() + '.tga') self.texture1name = f.read(64) self.texture1name = self.texture1name[:self.texture1name.find('\0')] if self.texture1name and self.texture1name != 'NULL': self.texture1 = r.getResourceByName(self.texture1name.lower() + '.tga') self.texture2name = f.read(64) self.texture2name = self.texture2name[:self.texture2name.find('\0')] if self.texture2name and self.texture2name != 'NULL': self.texture2 = r.getResourceByName(self.texture2name.lower() + '.tga') self.texture3name = f.read(64) self.texture3name = self.texture3name[:self.texture3name.find('\0')] if self.texture3name and self.texture3name != 'NULL': self.texture3 = r.getResourceByName(self.texture3name.lower() + '.tga') self.tileFade = dataHandler.readUIntFile(f) f.seek(24, 1) self.vertexIndexCountArray = MDLFile.arrayFromFile(f) self.rawVertexOffsetArray = MDLFile.arrayFromFile(f) f.seek(8, 1) self.triangleMode = dataHandler.readUByteFile(f) f.seek(7, 1) self.vertexDataRawPointer = dataHandler.readUIntFile(f) self.vertexCount = dataHandler.readUWordFile(f) self.textureCount = dataHandler.readUWordFile(f) self.texture0VertexDataPointer = dataHandler.readUIntFile(f) self.texture1VertexDataPointer = dataHandler.readUIntFile(f) self.texture2VertexDataPointer = dataHandler.readUIntFile(f) self.texture3VertexDataPointer = dataHandler.readUIntFile(f) self.vertexNormalDataPointer = dataHandler.readUIntFile(f) self.processMeshData(mdlFile)
def getResRefList(self, typeSpec, prop): keys = neverglobals.getResourceManager().getDirKeysWithExtensions( typeSpec[1]) keyList = [''] #can leave empty keyList.extend([x[0].strip('\0') for x in keys]) selection = prop.getValue() try: index = keyList.index(selection) except ValueError: keyList.append(selection) index = len(keyList) - 1 return keyList, index
def getModel(self, copy=False): if not copy and self.model: return self.model index = self['Appearance'] if index > 0: twoda = neverglobals.getResourceManager()\ .getResourceByName('doortypes.2da') self.modelName = twoda.getEntry(index, 'Model').lower() + '.mdl' model = neverglobals.getResourceManager()\ .getResourceByName(self.modelName,copy) else: index = self['GenericType'] twoda = neverglobals.getResourceManager()\ .getResourceByName('genericdoors.2da') self.modelName = twoda.getEntry(index, 'ModelName').lower() + '.mdl' model = neverglobals.getResourceManager()\ .getResourceByName(self.modelName,copy) if not copy: self.model = model return model
def playButtonHit_ambient(self): sound_name = self.twoda.getEntry(self.sound_list.GetSelection(),'Resource') sound_name = sound_name.lower() sndfile_name = '' ambient_sounds = [x.split('.')[0].lower() for x in\ neverglobals.getResourceManager().getAmbSoundFileNames()] try: sound_idx = ambient_sounds.index(sound_name) sndfile_name = neverglobals.getResourceManager().getAmbSoundFileNames()[sound_idx] except ValueError: logger.warning("the requested file %s doesn't exist on this NWN installation",\ sndfile_name) sndfile_name = '' self.SoundObject = None self.SoundType = None self.hasChanged = False if sndfile_name: self.SoundObject = open(os.path.join(neverglobals.getResourceManager().getAppDir(),\ 'ambient',sndfile_name),'rb') self.SoundType = 'WAV' self.hasChanged = False self.playSound()
def getStringAndIndex(self, langID, gender): index = langID * 2 + gender if index in self.locStrings: return (self.locStrings[index], index) elif self.strref != -1: if not neverglobals.getResourceManager(): logger.error('no resource manager in CExoLocString') return ('', -1) else: s = neverglobals.getResourceManager().getDialogString( self.strref) if s != None: return (s, -1) else: logger.error('error, Invalid Strref in CExoLocString') return ('', -1) else: #print string.join (['error, no string for language', # `index`, # 'in CExoLocString for embedded strings', # `self.locStrings` # ]) return ('', -1)
def playButtonHit_music(self): # get the resource name of the sound we want to play sound_resource = self.twoda.getEntry(self.sound_list.GetSelection(),'Resource') sound_resource = sound_resource.lower() sound_files = [x.split('.')[0].lower()\ for x in neverglobals.getResourceManager().getBMUFileNames()] try: i = sound_files.index(sound_resource) bmu_name = neverglobals.getResourceManager().getBMUFileNames()[i] print(bmu_name) except ValueError: # The file does not exist on this nwn install dir logger.warning("the requested file %s doesn't exist on this NWN installation",\ sound_resource+".bmu") bmu_name = '' if bmu_name: # a bit harsh : will only take a part of the file (temporary) bmu_file = open(os.path.join(neverglobals.getResourceManager().getAppDir(),\ 'music',bmu_name),'rb') data = bmu_file.read()[8:] self.SoundObject = StringIO(data) self.SoundType = 'BMU' self.hasChanged = False self.playSound()
def __init__(self, prop, propWindow,choices,twodaName): wx.BoxSizer.__init__(self,wx.HORIZONTAL) self.play_button = wx.Button(propWindow,-1,_('play')) self.sound_list = wx.Choice(propWindow,-1,choices=choices) self.twodaName = twodaName self.twoda = neverglobals.getResourceManager().getResourceByName(twodaName) self.parent = propWindow self.Add(self.sound_list) self.Add(self.play_button) wx.EVT_CHOICE(propWindow,self.sound_list.GetId(),self.soundChanged) wx.EVT_BUTTON(propWindow,self.play_button.GetId(),self.playButtonHit) self.SoundType = None self.SoundObject = None self.hasChanged = False self.firstTime = True
def getCustomChoiceList(self, typeSpec, prop): tags = [] if typeSpec[1] == "Creature_Tags": module = neverglobals.getResourceManager().module if module: for ctags in [ d['creatures'] for d in module.getTags()['areas'].values() ]: tags.extend(ctags) selection = prop.getValue() try: index = tags.index(selection) except ValueError: tags.append(selection) index = len(tags) - 1 return tags, index
def OnNew(self,event): if not self.module: raise UnitializedError,"Script Editor has no Module Assigned in OnNew" dlg = NewScriptDialog(self,"New Script") val = dlg.ShowModal() if val: val = val[:16] if not self.selectScript(val): script = Script(val + '.nss','') script.setModule(self.module.getFileName()) script.setNWNDir(neverglobals.getResourceManager().getAppDir()) self.module.addScript(script) self.addScript(script) self.updateScriptChoice() addEvent = ScriptAddEvent(self.GetId(),script) self.GetEventHandler().AddPendingEvent(addEvent) self.setFileChanged(True)
def __init__(self, nodeStruct, bptype): self.bptype = bptype self.blueprint = None if nodeStruct.hasEntry( 'STRREF') and nodeStruct['STRREF'] != 0xffffffff: self.name = neverglobals.getResourceManager()\ .getDialogString(nodeStruct['STRREF']) elif nodeStruct.hasEntry('NAME'): self.name = nodeStruct['NAME'] elif nodeStruct.hasEntry('DELETE_ME'): self.name = nodeStruct['DELETE_ME'] if nodeStruct.hasEntry('TYPE'): self.type = nodeStruct['TYPE'] else: self.type = 0 if nodeStruct.hasEntry('ID'): self.nodeID = nodeStruct['ID'] else: self.nodeID = -1 if nodeStruct.hasEntry('RESREF'): self.resref = nodeStruct['RESREF'] else: self.resref = None if nodeStruct.hasEntry('CR'): self.challengeRating = nodeStruct['CR'] self.faction = nodeStruct['FACTION'] else: self.challengeRating = -1.0 self.faction = '' if nodeStruct.hasEntry('LIST'): self.children = [ TreeNode(s, self.bptype) for s in nodeStruct['LIST'] ] else: self.children = []
def init_nwscript_keywords(cls): nwscript = str(neverglobals.getResourceManager()\ .getResourceByName('nwscript.nss')) comment = [] for line in nwscript.split('\r\n'): if not line.strip(): comment = [] elif line.strip()[:2] == '//': comment.append(line.strip()[2:]) else: parens = line.find('(') if parens != -1: comment.append(line) keyword = line[:parens].split()[-1].strip() cls.nwscript_keywords[keyword] = string.join(comment,'\n') comment = [] else: eq = line.find('=') if eq != -1: keyword = line[:eq].split()[-1].strip() cls.nwscript_keywords[keyword] = line comment = []
def getBlueprint(self): if not self.resref: return None if self.blueprint: return self.blueprint if self.bptype != 'Store': resname = string.join( [self.resref.strip('\0'), '.UT', self.bptype[0]], '') else: resname = string.join([self.resref.strip('\0'), '.UTM'], '') gffroot = neverglobals.getResourceManager()\ .getResourceByName(resname).getRoot() if self.bptype == 'Creature': self.blueprint = CreatureBP(gffroot) elif self.bptype == 'Door': self.blueprint = DoorBP(gffroot) elif self.bptype == 'Item': self.blueprint = ItemBP(gffroot) elif self.bptype == 'Trigger': raise NotImplementedError("no trigger blueprints yet") #self.blueprint = TriggerBP(gffroot) elif self.bptype == 'Sound': raise NotImplementedError("no sound blueprints yet") #self.blueprint = SoundBP(gffroot) elif self.bptype == 'Encounter': raise NotImplementedError("no encounter blueprints yet") #self.blueprint = EncounterBP(gffroot) elif self.bptype == 'Placeable': self.blueprint = PlaceableBP(gffroot) elif self.bptype == 'Store': raise NotImplementedError("no store blueprints yet") #self.blueprint = StoreBP(gffroot) elif self.bptype == 'Waypoint': #raise NotImplementedError("no waypoint blueprints yet") self.blueprint = WayPointBP(gffroot) return self.blueprint
def Destroy(self): neverglobals.getResourceManager().removeVisualChangeListener(self) GLWindow.Destroy(self)
def handlePortraitButton(self, event): '''Callback for the portrait selection button''' portraits = neverglobals.getResourceManager().getPortraitNameList()
def makePropsForItem(self, item, observer=None): '''Make all property controls for a given item. The item must be implementing the NeverData interface.''' logger.debug("making props for " + ` item `) self.cleanPropPage() neverglobals.getResourceManager().addResourceListChangeListener(self) self.changeObserver = observer first = True minWidth = 0 self.item = item for p in item: if p.getValue() == None: logger.debug('empty prop for "' + p.getName() + '"') continue if p.getName() == 'Mod_Hak': item.removeProperty(p.getName()) else: (label, propControl) = self.makeControlForProp(p, self) control = propControl.control if control: # add here specific notification cases spec = p.getSpec() if len(spec) > 1: if p.getSpec()[1] == 'FactionName': propControl.addPropertyChangeListener( self.mainAppWindow) if control: logger.debug("made control for " + p.getName()) self.propControls[control.GetId()] = (propControl, p) if first: line = wx.StaticLine(self, -1, style=wx.LI_HORIZONTAL) self.propGrid.Add(line, pos=(0, 0), span=(1, 3), flag=wx.EXPAND) self.lines.append(line) first = False r = 2 * len(self.propControls) self.propGrid.Add(label, pos=(r, 0), flag=wx.ALIGN_LEFT | wx.LEFT, border=10) self.propLabels.append(label) self.propGrid.Add(control, pos=(r, 2), flag=wx.ALIGN_RIGHT | wx.RIGHT, border=10) line = wx.StaticLine(self, -1, style=wx.LI_HORIZONTAL) self.propGrid.Add(line, pos=(r + 1, 0), span=(1, 3), flag=wx.EXPAND) self.lines.append(line) elif not p.getSpec()[0] == 'Hidden': print 'Error: unhandled prop type', p.getSpec() if label: label.Destroy() if control: width = control.GetSize()[0] + label.GetSize()[0] + 10 if width > minWidth: minWidth = width self.propsChanged = False self.propGrid.AddGrowableCol(0) self.propGrid.Layout() #self.propGrid.SetVirtualSizeHints(self) self.FitInside() logger.debug("done making props")
def makeControlForProp(self, prop, parent): '''Make a wxWindows control for the given NWN property and add it to the given parent wxWindow.''' control = None typeSpec = prop.getSpec() type = typeSpec[0] if type == 'CExoLocString': control = CExoLocStringControl(typeSpec, prop, self, self.defaultlang) elif type == 'CExoString': if len(typeSpec) > 1: if typeSpec[1] != 'FactionName': control = self.makeCustomChoiceControl( typeSpec, prop, parent) else: control = wx.TextCtrl(parent,-1,prop.getValue(),wx.DefaultPosition,\ (250,24),style=wx.TE_PROCESS_ENTER) wx.EVT_TEXT_ENTER(self, control.GetId(), self.controlUsed) else: control = wx.TextCtrl(parent, -1, prop.getValue(), wx.DefaultPosition, (250, 24)) wx.EVT_TEXT(self, control.GetId(), self.controlUsed) # self.Bind(wx.EVT_TEXT,self,self.controlUsed,id=control.GetId()) elif type == 'Percentage': control = wx.SpinCtrl(parent, -1) control.SetRange(0, 100) control.SetValue(prop.getValue()) wx.EVT_SPINCTRL(self, control.GetId(), self.controlUsed) #control.SetTickFreq(5,0) elif type == 'Boolean': control = wx.CheckBox(parent, -1, '') control.SetValue(prop.getValue()) wx.EVT_CHECKBOX(self, control.GetId(), self.controlUsed) elif type == 'Integer': min = 0 max = 100 if len(typeSpec) > 1: maxMin = typeSpec[1].split('-') min = int(maxMin[0]) max = int(maxMin[1]) control = wx.SpinCtrl(parent, -1) control.SetRange(min, max) try: control.SetValue(prop.getValue()) except OverflowError: # I got that with some factions that have 0xFFFFFFFF as parents # and as they shouldn't be edited anyway.. control.SetValue(-1) control.Disable() wx.EVT_SPINCTRL(self, control.GetId(), self.controlUsed) wx.EVT_TEXT(self, control.GetId(), self.controlUsed) elif type == "ResRef": control = self.makeResRefControl(typeSpec, prop, parent) elif type == "BGRColour": blue = prop.getValue() >> 16 green = (prop.getValue() >> 8) & (0xff) red = prop.getValue() & (0xff) control = GenButton(parent, -1, '', wx.DefaultPosition, wx.Size(40, 40)) control.SetBezelWidth(0) control.SetForegroundColour(wx.Colour(red, green, blue)) control.SetBackgroundColour(wx.Colour(red, green, blue)) wx.EVT_BUTTON(self, control.GetId(), self.handleColourButton) elif type == "List": if typeSpec[1] == 'HAKs': control = HAKListControl(prop, parent) elif typeSpec[1] == 'Vars': control = VarListControl(prop, parent) elif type == "CheckList": choices = [] # if typeSpec[1] == 'HAKs': # choices = [x['Mod_Hak'].lower() # for x in prop.getValue()] # choices.extend([x.split('.')[0].lower() for x in # neverglobals.getResourceManager().getHAKFileNames() # if x.split('.')[0].lower() not in choices]) control = wx.CheckListBox(parent, -1, wx.DefaultPosition, (200, 200), choices) for i in range(len(choices)): control.Check(i, False) # for n in prop.getValue(): # control.Check(choices.index(n['Mod_Hak'].lower())) wx.EVT_CHECKLISTBOX(self, control.GetId(), self.controlUsed) elif type == '2daIndex': twoda = neverglobals.getResourceManager().getResourceByName( typeSpec[1]) choices = [] col = typeSpec[2] if typeSpec[3] == 'strref': for i in xrange(twoda.getRowCount()): entry = 'invalid' try: entry = neverglobals.getResourceManager().\ getDialogString(int(twoda.getEntry(i,col))) except ValueError: if len(typeSpec) > 4: entry = twoda.getEntry(i, typeSpec[4]) choices.append(entry) else: choices = [ twoda.getEntry(i, col) for i in xrange(twoda.getRowCount()) ] if typeSpec[1] in [ 'ambientmusic.2da', 'ambientsound.2da', 'soundset.2da' ]: # may be used for other 2das in the future control = SoundControl(prop, parent, choices, typeSpec[1]) else: control = wx.Choice(parent, -1, choices=[cleanstr(s) for s in choices]) control.SetSelection(prop.getValue()) elif type == 'Portrait': p = neverglobals.getResourceManager().getPortraitByIndex( prop.getValue(), 's') if p: control = wx.BitmapButton(parent, -1, WxUtils.bitmapFromImage(p)) wx.EVT_BUTTON(self, control.GetId(), self.handlePortraitButton) else: logger.error('unknown portrait index:' + str(prop.getValue())) import Image, ImageDraw, ImageFont image = Image.new("1", (32, 64)) font = ImageFont.load_default() draw = ImageDraw.Draw(image) draw.text((3, 3), "portrait not found", font=font) control = wx.BitmapButton(parent, -1, WxUtils.bitmapFromImage(image)) wx.EVT_BUTTON(self, control.GetId(), self.handlePortraitButton) if control: label = wx.StaticText(self, -1, prop.getName().split('.')[-1]) else: label = None return (label, PropControl(control))
def applyPropControlValues(self, item): '''This method reads back in the values of currently displayed property controls and updates the actual module file to reflect these values.''' if not self.propsChanged: return False logger.debug('applying prop control values') for propControl in self.propControls.values(): control = propControl[0].control prop = propControl[1] typeSpec = prop.getSpec() pName = typeSpec[0] if pName == 'CExoLocString': control.applyPropControlValue() elif pName == 'CExoString': if len(typeSpec) > 1: prop.setValue(control.GetStringSelection()) else: prop.setValue(control.GetValue()) elif pName == 'Percentage': prop.setValue(control.GetValue()) elif pName == 'Boolean': prop.setValue(int(control.GetValue())) elif pName == 'Integer': prop.setValue(int(control.GetValue())) elif pName == 'BGRColour': c = control.GetBackgroundColour() prop.setValue((c.Blue() << 16) | (c.Green() << 8) | c.Red()) elif pName == 'ResRef': prop.setValue(control.GetValue()) elif pName == 'Script': s = control.getScript(prop.getName()) prop.setValue(s.replace('\n', '\r\n')) elif pName == 'List': type = prop.getSpec()[1] sel_list = [] if type == 'HAKs': haknames = control.GetStringSelections() for hakFileName in haknames: s = GFFStruct() s.add('Mod_Hak', hakFileName, 'CExoString') logger.info(repr(s) + " " + s['Mod_Hak']) sel_list.append(s) elif type == 'Vars': sel_list = control.GetData() prop.setValue(sel_list) elif pName == 'CheckList': type = prop.getSpec()[1] checkedList = [] # if type == 'HAKs': # for i in range(control.GetCount()): # if control.IsChecked(i): # hakFileName = control.GetString(i) # s = GFFStruct() # s.add('Mod_Hak',hakFileName, "CExoString") # print s,s['Mod_Hak'] # checkedList.append(s) prop.setValue(checkedList) elif pName == '2daIndex': prop.setValue(int(control.GetSelection())) elif pName == 'Hidden' or pName == 'Portrait': pass else: print _('error, unknown prop type:'), pName item.setProperty(prop.getName(), prop.getValue()) if self.visualChanged: self.item.forceModelReload() neverglobals.getResourceManager().visualChanged(self.item) tmp = self.propsChanged self.propsChanged = False self.visualChanged = False return tmp