def actionPickSpeechSet(self): # Build an array of ButtonProgram instances for each # of the XML files in the button set directory. Collect # these arrays in buttonProgramArray: xmlFileNames = self.getAllSpeechSetXMLFileNames() if xmlFileNames is None: self.dialogService.showErrorMsg("No additional button sets are stored on your disk.") return None # Fill the following array with arrays of ButtonProgram: buttonProgramArrays = [] # Associate each ButtonProgram array with the file name # from which it was built: buttonProgramSetFiles = {} for xmlFileName in xmlFileNames: if xmlFileName == "default.xml": continue try: (buttonSettingTitle, buttonProgram) = ButtonSavior.retrieveFromFile(xmlFileName, ButtonProgram) buttonProgramArrays.append(buttonProgram) buttonSet = ButtonSet(buttonProgram, xmlFileName) buttonProgramSetFiles[buttonSet] = xmlFileName except ValueError as e: # Bad XML: rospy.logerr(` e `) return buttonSetSelector = ButtonSetPopupSelector(iter(buttonProgramArrays)) buttonSetSelected = buttonSetSelector.exec_() if buttonSetSelected == -1: self.dialogService.showErrorMsg("No button sets have been defined yet.") return if buttonSetSelected == 0: # User cancelled: return # Get the selected ButtonProgram array: buttonPrograms = buttonSetSelector.getCurrentlyShowingSet() self.replaceProgramButtons(buttonPrograms) # Update the disk file: # ***buttonSetBaseFilename = buttonProgramSetFiles[buttonPrograms]; buttonSetBaseFilename = None for buttonSet in buttonProgramSetFiles.keys(): if buttonSet.getButtonProgram() == buttonPrograms: buttonSetBaseFilename = buttonSet.getXMLFileName() break if buttonSetBaseFilename is not None: self.currentButtonSetFile = os.path.join(ButtonSavior.SPEECH_SET_DIR, buttonSetBaseFilename) # Copy this new XML file into default.xml, so that it will be # loaded next time the application starts: ButtonSavior.saveToFile( buttonPrograms, os.path.join(ButtonSavior.SPEECH_SET_DIR, "default.xml"), title="default.xml" )
def actionNewSpeechSet(self): # Get an iterator over all the current program# button UI widgets: programButtonIt = self.gui.programButtonIterator() # Get an array of ButtonProgram objects that are associated # with those buttons: buttonProgramArray = [] while True: try: buttonObj = programButtonIt.next() buttonLabel = buttonObj.text() try: buttonProgramArray.append(self.programs[buttonObj]) except KeyError: # Button was not programmed. Create an empty ButtonProgram: buttonProgramArray.append(ButtonProgram(buttonLabel, "", "Male", "festival")) except StopIteration: break # Save this array of programs as XML: makeNewFile = self.dialogService.newButtonSetOrUpdateCurrent() if makeNewFile == DialogService.ButtonSaveResult.CANCEL: return if makeNewFile == DialogService.ButtonSaveResult.NEW_SET: fileName = self.getNewSpeechSetName() ButtonSavior.saveToFile(buttonProgramArray, fileName, title=os.path.basename(fileName)) self.currentButtonSetFile = fileName buttonSetNum = self.getSpeechSetFromSpeechFileName(fileName) self.dialogService.showInfoMessage("New speech set %d created." % buttonSetNum) elif makeNewFile == DialogService.ButtonSaveResult.UPDATE_CURRENT: fileName = self.currentButtonSetFile ButtonSavior.saveToFile(buttonProgramArray, fileName, title=os.path.basename(fileName)) if os.path.basename(fileName) != "default.xml": buttonSetNum = self.getSpeechSetFromSpeechFileName(self.currentButtonSetFile) self.dialogService.showInfoMessage("Saved to speech button set %d." % buttonSetNum) else: self.dialogService.showInfoMessage("Saved to speech button set 'default.xml'") if os.path.basename(fileName) != "default.xml": try: shutil.copy(fileName, os.path.join(ButtonSavior.SPEECH_SET_DIR, "default.xml")) except: rospy.logerr("Could not copy new program XML file to default.xml.")
def test_writeOneButtonSetToFile(self): tmpFile = "/tmp/buttonSettingsThreeButtons.xml"; ButtonSavior.saveToFile([self.buttonSetting1, self.buttonSetting2, self.buttonSetting3], tmpFile, title="Household Set");