예제 #1
0
    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
예제 #2
0
 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
예제 #3
0
 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
예제 #4
0
 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')
예제 #5
0
파일: KeyFile.py 프로젝트: DMJC/neveredit
 def getResource(self, key):
     bifFileSpec = self.keys[key]
     f = self.getBifFile(bifFileSpec)
     c = neverglobals.getResourceManager()\
         .interpretResourceContents(key,
                                    f.getResourceData(bifFileSpec[1]))
     return c
예제 #6
0
 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)
예제 #7
0
 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)
예제 #8
0
 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
예제 #9
0
 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)
예제 #10
0
 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
예제 #11
0
 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
예제 #12
0
파일: Module.py 프로젝트: DMJC/neveredit
 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'])
예제 #13
0
 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()
예제 #14
0
파일: MDLFile.py 프로젝트: DMJC/neveredit
    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)
예제 #15
0
 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
예제 #16
0
 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
예제 #17
0
 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()
예제 #18
0
 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)
예제 #19
0
 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()
예제 #20
0
 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
예제 #21
0
 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
예제 #22
0
    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)
예제 #23
0
파일: Palette.py 프로젝트: DMJC/neveredit
    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 = []
예제 #24
0
파일: Script.py 프로젝트: DMJC/neveredit
 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 = []
예제 #25
0
파일: Palette.py 프로젝트: DMJC/neveredit
 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
예제 #26
0
 def Destroy(self):
     neverglobals.getResourceManager().removeVisualChangeListener(self)
     GLWindow.Destroy(self)
예제 #27
0
 def handlePortraitButton(self, event):
     '''Callback for the portrait selection button'''
     portraits = neverglobals.getResourceManager().getPortraitNameList()
예제 #28
0
    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")
예제 #29
0
    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))
예제 #30
0
 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