From 292d21c20372634f4d0cabf43611d0e50386bc4c Mon Sep 17 00:00:00 2001 From: tassaron Date: Wed, 7 Jun 2017 23:22:55 -0400 Subject: added submenu for opening presets, moved code --- components/__base__.py | 6 ++- components/color.py | 3 +- components/image.py | 5 +- components/original.py | 3 +- components/text.py | 3 +- components/video.py | 5 +- mainwindow.py | 138 +++++++++++++------------------------------------ presetmanager.py | 98 ++++++++++++++++++++++++++++++----- 8 files changed, 140 insertions(+), 121 deletions(-) diff --git a/components/__base__.py b/components/__base__.py index 4fdf31f..b95edf4 100644 --- a/components/__base__.py +++ b/components/__base__.py @@ -2,6 +2,9 @@ from PyQt4 import QtGui class Component: + def __init__(self): + self.currentPreset = None + def __str__(self): return self.__doc__ @@ -72,7 +75,8 @@ class Component: image = Image.new("RGBA", (width, height), (0,0,0,0)) return image - def loadPreset(self, presetDict): + def loadPreset(self, presetDict, presetName=None): + self.currentPreset = presetName # update widgets using a preset dict def savePreset(self): diff --git a/components/color.py b/components/color.py index b050fbd..b13f54e 100644 --- a/components/color.py +++ b/components/color.py @@ -69,7 +69,8 @@ class Component(__base__.Component): r, g, b = self.color1 return Image.new("RGBA", (width, height), (r, g, b, 255)) - def loadPreset(self, pr): + def loadPreset(self, pr, presetName=None): + self.currentPreset = presetName self.page.lineEdit_color1.setText('%s,%s,%s' % pr['color1']) self.page.lineEdit_color2.setText('%s,%s,%s' % pr['color2']) diff --git a/components/image.py b/components/image.py index f9a92ca..6ccddb6 100644 --- a/components/image.py +++ b/components/image.py @@ -48,7 +48,8 @@ class Component(__base__.Component): frame.paste(image) return frame - def loadPreset(self, pr): + def loadPreset(self, pr, presetName=None): + self.currentPreset = presetName self.page.lineEdit_image.setText(pr['image']) def savePreset(self): @@ -60,7 +61,7 @@ class Component(__base__.Component): imgDir = self.settings.value("backgroundDir", os.path.expanduser("~")) filename = QtGui.QFileDialog.getOpenFileName( self.page, "Choose Image", imgDir, "Image Files (*.jpg *.png)") - if filename: + if filename: self.settings.setValue("backgroundDir", os.path.dirname(filename)) self.page.lineEdit_image.setText(filename) self.update() diff --git a/components/original.py b/components/original.py index 4d0e83b..a2059d1 100644 --- a/components/original.py +++ b/components/original.py @@ -37,7 +37,8 @@ class Component(__base__.Component): self.visColor = self.RGBFromString(self.page.lineEdit_visColor.text()) self.parent.drawPreview() - def loadPreset(self, pr): + def loadPreset(self, pr, presetName=None): + self.currentPreset = presetName self.page.lineEdit_visColor.setText('%s,%s,%s' % pr['visColor']) btnStyle = "QPushButton { background-color : %s; outline: none; }" \ % QColor(*pr['visColor']).name() diff --git a/components/text.py b/components/text.py index 6cdc0dd..1725a41 100644 --- a/components/text.py +++ b/components/text.py @@ -78,7 +78,8 @@ class Component(__base__.Component): x = self.xPosition - offset return x, self.yPosition - def loadPreset(self, pr): + def loadPreset(self, pr, presetName=None): + self.currentPreset = presetName self.page.lineEdit_title.setText(pr['title']) font = QFont() font.fromString(pr['titleFont']) diff --git a/components/video.py b/components/video.py index f086cc0..e636224 100644 --- a/components/video.py +++ b/components/video.py @@ -128,7 +128,8 @@ class Component(__base__.Component): def frameRender(self, moduleNo, arrayNo, frameNo): return self.video.frame(frameNo) - def loadPreset(self, pr): + def loadPreset(self, pr, presetName=None): + self.currentPreset = presetName self.page.lineEdit_video.setText(pr['video']) self.page.checkBox_loop.setChecked(pr['loop']) @@ -144,7 +145,7 @@ class Component(__base__.Component): self.page, "Choose Video", imgDir, "Video Files (*.mp4 *.mov)" ) - if filename: + if filename: self.settings.setValue("backgroundDir", os.path.dirname(filename)) self.page.lineEdit_video.setText(filename) self.update() diff --git a/mainwindow.py b/mainwindow.py index 2c1a95a..883d475 100644 --- a/mainwindow.py +++ b/mainwindow.py @@ -6,9 +6,7 @@ from PyQt4 import QtCore, QtGui, uic from PyQt4.QtCore import QSettings, Qt from PyQt4.QtGui import QDesktopServices, QMenu import sys -import io import os -import string import signal import filecmp import time @@ -63,24 +61,22 @@ class MainWindow(QtCore.QObject): # Create data directory, load/create settings self.dataDir = QDesktopServices.storageLocation( QDesktopServices.DataLocation) + self.presetManager = PresetManager( + uic.loadUi( + os.path.join(os.path.dirname(os.path.realpath(__file__)), + 'presetmanager.ui')), + self) self.autosavePath = os.path.join(self.dataDir, 'autosave.avp') - self.presetDir = os.path.join(self.dataDir, 'presets') self.settings = QSettings( os.path.join(self.dataDir, 'settings.ini'), QSettings.IniFormat) LoadDefaultSettings(self) if not os.path.exists(self.dataDir): os.makedirs(self.dataDir) for neededDirectory in ( - self.presetDir, self.settings.value("projectDir")): + self.presetManager.presetDir, self.settings.value("projectDir")): if not os.path.exists(neededDirectory): os.mkdir(neededDirectory) - self.presetManager = PresetManager( - uic.loadUi( - os.path.join(os.path.dirname(os.path.realpath(__file__)), - 'presetmanager.ui')), - self) - # Make queues/timers for the preview thread self.previewQueue = Queue() self.previewThread = QtCore.QThread(self) @@ -140,7 +136,7 @@ class MainWindow(QtCore.QObject): ) vBitrate = int(self.settings.value('outputVideoBitrate')) - aBitrate = int(self.settings.value('outputAudioBitrate')[:-1]) + aBitrate = int(self.settings.value('outputAudioBitrate')) window.spinBox_vBitrate.setValue(vBitrate) window.spinBox_aBitrate.setValue(aBitrate) @@ -420,7 +416,6 @@ class MainWindow(QtCore.QObject): self.window.stackedWidget.addWidget(self.pages[-1]) self.window.stackedWidget.setCurrentIndex(index) self.selectedComponents[-1].update() - '''self.updateOpenPresetComboBox(self.selectedComponents[-1])''' def insertComponent(self, moduleIndex): self.selectedComponents.insert( @@ -432,7 +427,6 @@ class MainWindow(QtCore.QObject): self.window.stackedWidget.insertWidget(0, self.pages[0]) self.window.stackedWidget.setCurrentIndex(0) self.selectedComponents[0].update() - '''self.updateOpenPresetComboBox(self.selectedComponents[0])''' def removeComponent(self): for selected in self.window.listWidget_componentList.selectedItems(): @@ -449,7 +443,6 @@ class MainWindow(QtCore.QObject): if selected: index = self.window.listWidget_componentList.row(selected[0]) self.window.stackedWidget.setCurrentIndex(index) - '''self.updateOpenPresetComboBox(self.selectedComponents[index])''' def moveComponentUp(self): row = self.window.listWidget_componentList.currentRow() @@ -489,87 +482,6 @@ class MainWindow(QtCore.QObject): '''Preset manager for importing, exporting, renaming, deleting''' self.presetManager.show() - def updateOpenPresetComboBox(self, component): - self.window.comboBox_openPreset.clear() - self.window.comboBox_openPreset.addItem("Component Presets") - destination = os.path.join( - self.presetDir, str(component).strip(), str(component.version())) - if not os.path.exists(destination): - os.makedirs(destination) - for f in os.listdir(destination): - self.window.comboBox_openPreset.addItem(f) - - def openSavePresetDialog(self): - if self.window.listWidget_componentList.currentRow() == -1: - return - while True: - newName, OK = QtGui.QInputDialog.getText( - QtGui.QWidget(), 'Audio Visualizer', 'New Preset Name:') - badName = False - for letter in newName: - if letter in string.punctuation: - badName = True - if badName: - # some filesystems don't like bizarre characters - self.showMessage(msg="Preset names must contain only \ - letters, numbers, and spaces.") - continue - if OK and newName: - index = self.window.listWidget_componentList.currentRow() - if index != -1: - saveValueStore = \ - self.selectedComponents[index].savePreset() - componentName = str(self.selectedComponents[index]).strip() - vers = self.selectedComponents[index].version() - self.createPresetFile( - componentName, vers, saveValueStore, newName) - break - - def createPresetFile( - self, componentName, version, saveValueStore, filename): - dirname = os.path.join(self.presetDir, componentName, str(version)) - if not os.path.exists(dirname): - os.makedirs(dirname) - filepath = os.path.join(dirname, filename) - if os.path.exists(filepath): - ch = self.showMessage( - msg="%s already exists! Overwrite it?" % filename, - showCancel=True, icon=QtGui.QMessageBox.Warning) - if not ch: - return - # remove old copies of the preset - for i in range(0, self.window.comboBox_openPreset.count()): - if self.window.comboBox_openPreset.itemText(i) == filename: - self.window.comboBox_openPreset.removeItem(i) - with open(filepath, 'w') as f: - f.write(core.Core.stringOrderedDict(saveValueStore)) - self.window.comboBox_openPreset.addItem(filename) - self.window.comboBox_openPreset.setCurrentIndex( - self.window.comboBox_openPreset.count()-1) - - def openPreset(self): - if self.window.comboBox_openPreset.currentIndex() < 1: - return - index = self.window.listWidget_componentList.currentRow() - if index == -1: - return - filename = self.window.comboBox_openPreset.itemText( - self.window.comboBox_openPreset.currentIndex()) - componentName = str(self.selectedComponents[index]).strip() - version = self.selectedComponents[index].version() - dirname = os.path.join(self.presetDir, componentName, str(version)) - filepath = os.path.join(dirname, filename) - if not os.path.exists(filepath): - self.window.comboBox_openPreset.removeItem( - self.window.comboBox_openPreset.currentIndex()) - return - with open(filepath, 'r') as f: - for line in f: - saveValueStore = dict(eval(line.strip())) - break - self.selectedComponents[index].loadPreset(saveValueStore) - self.drawPreview() - def createNewProject(self): self.currentProject = None self.selectedComponents = [] @@ -678,7 +590,8 @@ class MainWindow(QtCore.QObject): def showMessage(self, **kwargs): msg = QtGui.QMessageBox() msg.setText(kwargs['msg']) - msg.setIcon(kwargs['icon'] if 'icon' in kwargs else QtGui.QMessageBox.Information) + msg.setIcon( + kwargs['icon'] if 'icon' in kwargs else QtGui.QMessageBox.Information) msg.setDetailedText(kwargs['detail'] if 'detail' in kwargs else None) if 'showCancel'in kwargs and kwargs['showCancel']: msg.setStandardButtons( @@ -691,13 +604,36 @@ class MainWindow(QtCore.QObject): return False def componentContextMenu(self, QPos): + '''Appears when right-clicking a component in the list''' + if not self.window.listWidget_componentList.selectedItems(): + return + + self.presetManager.findPresets() self.menu = QtGui.QMenu() menuItem = self.menu.addAction("Save Preset") - self.connect(menuItem, QtCore.SIGNAL("triggered()"), self.openSavePresetDialog) + self.connect( + menuItem, + QtCore.SIGNAL("triggered()"), + self.presetManager.openSavePresetDialog + ) + + # submenu for opening presets + index = self.window.listWidget_componentList.currentRow() + try: + presets = self.presetManager.presets[str(self.selectedComponents[index])] + self.submenu = QtGui.QMenu("Open Preset") + self.menu.addMenu(self.submenu) + + for version, presetName in presets: + menuItem = self.submenu.addAction(presetName) + self.connect( + menuItem, + QtCore.SIGNAL("triggered()"), + lambda presetName=presetName: + self.presetManager.openPreset(presetName) + ) + except KeyError as e: + print(e) parentPosition = self.window.listWidget_componentList.mapToGlobal(QtCore.QPoint(0, 0)) self.menu.move(parentPosition + QPos) self.menu.show() - - def menuItemClicked(self): - currentItemName=str(self.window.listWidget_componentList.currentItem().text() ) - print(currentItemName) diff --git a/presetmanager.py b/presetmanager.py index cc6c482..f67dbb9 100644 --- a/presetmanager.py +++ b/presetmanager.py @@ -1,14 +1,19 @@ from PyQt4 import QtGui -#import sys +from collections import OrderedDict +import string import os +import core + + class PresetManager(QtGui.QDialog): def __init__(self, window, parent): super().__init__() self.parent = parent - self.presetDir = parent.presetDir + self.presetDir = os.path.join(self.parent.dataDir, 'presets') self.window = window - self.presets = self.findPresets() + self.findPresets() + self.lastFilter = '*' # create filter box and preset list self.drawFilterList() @@ -29,7 +34,7 @@ class PresetManager(QtGui.QDialog): for preset in presetList: presetNames.append(preset[1]) self.autocomplete.setStringList(presetNames) - self.presets = self.findPresets() + self.findPresets() self.drawFilterList() self.drawPresetList('*') self.window.show() @@ -47,16 +52,23 @@ class PresetManager(QtGui.QDialog): parseList.append((compName, int(compVers), preset)) except ValueError: continue - return { compName : \ - [ (vers, preset) \ - for name, vers, preset in parseList \ - if name == compName \ - ] \ - for compName, _, __ in parseList \ - } + self.presets =\ + { + compName : \ + [ + (vers, preset) \ + for name, vers, preset in parseList \ + if name == compName \ + ] \ + for compName, _, __ in parseList \ + } - def drawPresetList(self, filter): + def drawPresetList(self, filter=None): self.window.listWidget_presets.clear() + if filter: + self.lastFilter = str(filter) + else: + filter = str(self.lastFilter) for component, presets in self.presets.items(): if filter != '*' and component != filter: continue @@ -68,3 +80,65 @@ class PresetManager(QtGui.QDialog): self.window.comboBox_filter.addItem('*') for component in self.presets: self.window.comboBox_filter.addItem(component) + + def openSavePresetDialog(self): + window = self.parent.window + if window.listWidget_componentList.currentRow() == -1: + return + while True: + dialog = QtGui.QInputDialog( + QtGui.QWidget(), 'Audio Visualizer', 'New Preset Name:') + dialog.setTextValue() + newName, OK = dialog.getText() + badName = False + for letter in newName: + if letter in string.punctuation: + badName = True + if badName: + # some filesystems don't like bizarre characters + self.parent.showMessage(msg=\ +'''Preset names must contain only letters, numbers, and spaces.''') + continue + if OK and newName: + index = window.listWidget_componentList.currentRow() + if index != -1: + saveValueStore = \ + self.parent.selectedComponents[index].savePreset() + componentName = str(self.parent.selectedComponents[index]).strip() + vers = self.parent.selectedComponents[index].version() + self.createPresetFile( + componentName, vers, saveValueStore, newName) + break + + def createPresetFile(self, compName, vers, saveValueStore, filename): + dirname = os.path.join(self.presetDir, compName, str(vers)) + if not os.path.exists(dirname): + os.makedirs(dirname) + filepath = os.path.join(dirname, filename) + if os.path.exists(filepath): + ch = self.parent.showMessage( + msg="%s already exists! Overwrite it?" % filename, + showCancel=True, icon=QtGui.QMessageBox.Warning) + if not ch: + return + with open(filepath, 'w') as f: + f.write(core.Core.stringOrderedDict(saveValueStore)) + self.drawPresetList() + + def openPreset(self, presetName): + index = self.parent.window.listWidget_componentList.currentRow() + if index == -1: + return + componentName = str(self.parent.selectedComponents[index]).strip() + version = self.parent.selectedComponents[index].version() + dirname = os.path.join(self.presetDir, componentName, str(version)) + filepath = os.path.join(dirname, presetName) + if not os.path.exists(filepath): + return + with open(filepath, 'r') as f: + for line in f: + saveValueStore = dict(eval(line.strip())) + break + self.parent.selectedComponents[index].loadPreset(saveValueStore) + self.parent.drawPreview() + -- cgit v1.2.3