From b50dbb40316f65b019d40a926c74c12aedce7f7a Mon Sep 17 00:00:00 2001 From: Lyubo Date: Wed, 29 May 2024 17:54:06 +0100 Subject: [PATCH] Add support for multiple sound files --- profileexecutor.py | 9 +++++++-- soundactioneditwnd.py | 34 +++++++++++++++++----------------- ui_soundactioneditwnd.py | 1 + 3 files changed, 25 insertions(+), 19 deletions(-) diff --git a/profileexecutor.py b/profileexecutor.py index 26e330a..df0cfee 100644 --- a/profileexecutor.py +++ b/profileexecutor.py @@ -4,6 +4,7 @@ import threading import os, pyaudio import shutil +import random import re from pocketsphinx import * from soundfiles import SoundFiles @@ -250,10 +251,14 @@ def stopCommand(self, p_cmdName): del self.m_cmdThreads[p_cmdName] def playSound(self, p_cmdName): - sound_file = './voicepacks/' + p_cmdName['pack'] + '/' + p_cmdName['cat'] + '/' + p_cmdName['file'] + # backwards compatibility with previous type + if isinstance(p_cmdName['file'], str): + selected_file = p_cmdName['file'] + elif isinstance(p_cmdName['file'], list): + selected_file = random.choice(p_cmdName['file']) + sound_file = './voicepacks/' + p_cmdName['pack'] + '/' + p_cmdName['cat'] + '/' + selected_file self.m_sound.play(sound_file) - def pressKey(self, w_key, w_type): if self.p_parent.m_config['noroot'] == 1: # xdotool has a different key mapping. translate old existing mappings of special keys diff --git a/soundactioneditwnd.py b/soundactioneditwnd.py index 7ff81a0..808b32e 100644 --- a/soundactioneditwnd.py +++ b/soundactioneditwnd.py @@ -17,7 +17,7 @@ def __init__(self, p_sounds, p_soundAction = None, p_parent = None): self.p_sounds = p_sounds self.selectedVoicepack = False self.selectedCategory = False - self.selectedFile = False + self.selectedFiles = [] self.ui.buttonOkay.clicked.connect(self.slotOK) self.ui.buttonCancel.clicked.connect(super().reject) @@ -29,7 +29,7 @@ def __init__(self, p_sounds, p_soundAction = None, p_parent = None): if not p_soundAction == None: self.selectedVoicepack = p_soundAction['pack'] self.selectedCategory = p_soundAction['cat'] - self.selectedFile = p_soundAction['file'] + self.selectedFiles = p_soundAction['file'] self.ui.buttonOkay.setEnabled(True) self.listVoicepacks_model = QStandardItemModel() @@ -53,7 +53,6 @@ def __init__(self, p_sounds, p_soundAction = None, p_parent = None): self.ui.filterCategories.textChanged.connect(self.populateCategories) self.ui.filterFiles.textChanged.connect(self.populateFiles) - self.populateCategories(False) self.populateFiles(False) @@ -70,17 +69,20 @@ def __init__(self, p_sounds, p_soundAction = None, p_parent = None): index = self.listCategories_model.indexFromItem(item[0]) self.ui.listCategories.setCurrentIndex(index) - if not self.selectedFile == False: - item = self.listFiles_model.findItems(self.selectedFile) - if len(item) > 0: - index = self.listFiles_model.indexFromItem(item[0]) - self.ui.listFiles.setCurrentIndex(index) - + if self.selectedFiles: + selection_model = self.ui.listFiles.selectionModel() + selection = QItemSelection() + for selectedFile in self.selectedFiles: + items = self.listFiles_model.findItems(selectedFile) + for item in items: + index = self.listFiles_model.indexFromItem(item) + selection.select(index, index) + selection_model.select(selection, QItemSelectionModel.Select) def slotOK(self): - self.m_soundAction = {'name': 'play sound', 'pack': self.selectedVoicepack, 'cat' : self.selectedCategory, 'file' : self.selectedFile} + self.m_soundAction = {'name': 'play sound', 'pack': self.selectedVoicepack, 'cat' : self.selectedCategory, 'file' : self.selectedFiles} super().accept() def slotCancel(self): @@ -102,11 +104,9 @@ def onCategorySelect(self): self.ui.buttonOkay.setEnabled(False) self.ui.buttonPlaySound.setEnabled(False) - def onFileSelect(self): - index = self.ui.listFiles.currentIndex() - itemText = index.data() - self.selectedFile = itemText + selected_indexes = self.ui.listFiles.selectedIndexes() + self.selectedFiles = [index.data() for index in selected_indexes] self.ui.buttonOkay.setEnabled(True) self.ui.buttonPlaySound.setEnabled(True) @@ -122,7 +122,7 @@ def populateCategories(self, reset = True): self.listCategories_model.removeRows( 0, self.listCategories_model.rowCount() ) self.listFiles_model.removeRows( 0, self.listFiles_model.rowCount() ) self.selectedCategory = False - self.selectedFile = False + self.selectedFiles = [] filter_categories = self.ui.filterCategories.toPlainText() if len(filter_categories) == 0: @@ -142,7 +142,7 @@ def populateFiles(self, reset = True): if reset == True: self.listFiles_model.removeRows( 0, self.listFiles_model.rowCount() ) - self.selectedFile = False + self.selectedFiles = [] filter_files = self.ui.filterFiles.toPlainText() if len(filter_files) == 0: @@ -157,7 +157,7 @@ def populateFiles(self, reset = True): self.listFiles_model.appendRow(item) def playSound(self): - sound_file = './voicepacks/' + self.selectedVoicepack + '/' + self.selectedCategory + '/' + self.selectedFile + sound_file = './voicepacks/' + self.selectedVoicepack + '/' + self.selectedCategory + '/' + self.selectedFiles[0] self.p_sounds.play(sound_file) def stopSound(self): diff --git a/ui_soundactioneditwnd.py b/ui_soundactioneditwnd.py index 50d2d35..9871821 100644 --- a/ui_soundactioneditwnd.py +++ b/ui_soundactioneditwnd.py @@ -27,6 +27,7 @@ def setupUi(self, SoundSelect): self.listFiles.setGeometry(QtCore.QRect(660, 90, 451, 231)) self.listFiles.setLocale(QtCore.QLocale(QtCore.QLocale.English, QtCore.QLocale.UnitedStates)) self.listFiles.setEditTriggers(QtWidgets.QAbstractItemView.NoEditTriggers) + self.listFiles.setSelectionMode(QtWidgets.QAbstractItemView.MultiSelection) self.listFiles.setProperty("showDropIndicator", False) self.listFiles.setAlternatingRowColors(True) self.listFiles.setObjectName("listFiles")