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 toXML(self):

        domOneButtonProgramRoot = ButtonSavior.createXMLElement(ButtonSavior.BUTTON_PROGRAM_TAG)

        domOneButtonProgramRoot.append(
            ButtonSavior.createXMLElement(ButtonSavior.BUTTON_LABEL_TAG, content=self.buttonLabel)
        )
        domOneButtonProgramRoot.append(
            ButtonSavior.createXMLElement(ButtonSavior.BUTTON_TEXT_TO_SAY_TAG, content=self.textToSay)
        )
        domOneButtonProgramRoot.append(
            ButtonSavior.createXMLElement(ButtonSavior.BUTTON_VOICE_TAG, content=self.activeVoice)
        )
        domOneButtonProgramRoot.append(
            ButtonSavior.createXMLElement(ButtonSavior.BUTTON_TTS_ENGINE, content=self.ttsEngine)
        )
        domOneButtonProgramRoot.append(
            ButtonSavior.createXMLElement(ButtonSavior.BUTTON_PLAY_ONCE, content=str(self.playOnce))
        )
        return domOneButtonProgramRoot
 def installDefaultSpeechSet(self):
     defaultPath = os.path.join(ButtonSavior.SPEECH_SET_DIR, "default.xml")
     if not os.path.exists(defaultPath):
         return
     (buttonSetTitle, buttonPrograms) = ButtonSavior.retrieveFromFile(defaultPath, ButtonProgram)
     self.replaceProgramButtons(buttonPrograms)
 def test_writeOneButtonSetToFile(self):
     tmpFile = "/tmp/buttonSettingsThreeButtons.xml";
     ButtonSavior.saveToFile([self.buttonSetting1, self.buttonSetting2, self.buttonSetting3], 
                             tmpFile, 
                             title="Household Set");