From 6093e701e151af96464b564e275db4664d828a82 Mon Sep 17 00:00:00 2001 From: tassaron Date: Wed, 7 Jun 2017 20:30:37 -0400 Subject: laying some foundations for new preset implementation --- mainwindow.py | 88 +++++++++++++++++++++++++++++++++----------------------- presetmanager.py | 70 ++++++++++++++++++++++++++++++++++++++++++++ presetmanager.ui | 17 ++++++----- 3 files changed, 132 insertions(+), 43 deletions(-) create mode 100644 presetmanager.py diff --git a/mainwindow.py b/mainwindow.py index 7ea1410..2c1a95a 100644 --- a/mainwindow.py +++ b/mainwindow.py @@ -2,7 +2,7 @@ from os.path import expanduser from queue import Queue from importlib import import_module from collections import OrderedDict -from PyQt4 import QtCore, QtGui +from PyQt4 import QtCore, QtGui, uic from PyQt4.QtCore import QSettings, Qt from PyQt4.QtGui import QDesktopServices, QMenu import sys @@ -16,6 +16,7 @@ import time import core import preview_thread import video_thread +from presetmanager import PresetManager from main import LoadDefaultSettings @@ -59,7 +60,7 @@ class MainWindow(QtCore.QObject): self.selectedComponents = [] self.lastAutosave = time.time() - # create data directory, load/create settings + # Create data directory, load/create settings self.dataDir = QDesktopServices.storageLocation( QDesktopServices.DataLocation) self.autosavePath = os.path.join(self.dataDir, 'autosave.avp') @@ -74,7 +75,13 @@ class MainWindow(QtCore.QObject): 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) self.previewWorker = preview_thread.Worker(self, self.previewQueue) @@ -86,7 +93,7 @@ class MainWindow(QtCore.QObject): self.timer.timeout.connect(self.processTask.emit) self.timer.start(500) - # begin decorating the window and connecting events + # Begin decorating the window and connecting events window.toolButton_selectAudioFile.clicked.connect( self.openInputFileDialog) @@ -145,6 +152,7 @@ class MainWindow(QtCore.QObject): os.path.dirname(os.path.realpath(__file__)), "background.png")) window.verticalLayout_previewWrapper.addWidget(self.previewWindow) + # Make component buttons self.modules = self.findComponents() self.compMenu = QMenu() for i, comp in enumerate(self.modules): @@ -153,12 +161,20 @@ class MainWindow(QtCore.QObject): lambda item=i: self.insertComponent(item)) self.window.pushButton_addComponent.setMenu(self.compMenu) + window.listWidget_componentList.clicked.connect( lambda _: self.changeComponentWidget()) self.window.pushButton_removeComponent.clicked.connect( lambda _: self.removeComponent()) + self.window.listWidget_componentList.setContextMenuPolicy( + QtCore.Qt.CustomContextMenu) + self.window.listWidget_componentList.connect( + self.window.listWidget_componentList, + QtCore.SIGNAL("customContextMenuRequested(QPoint)"), + self.componentContextMenu) + currentRes = str(self.settings.value('outputWidth'))+'x' + \ str(self.settings.value('outputHeight')) for i, res in enumerate(self.resolutions): @@ -174,11 +190,6 @@ class MainWindow(QtCore.QObject): self.window.pushButton_listMoveDown.clicked.connect( self.moveComponentDown) - '''self.window.pushButton_savePreset.clicked.connect( - self.openSavePresetDialog) - self.window.comboBox_openPreset.currentIndexChanged.connect( - self.openPreset)''' - # Configure the Projects Menu self.projectMenu = QMenu() action = self.projectMenu.addAction("New Project") @@ -200,14 +211,7 @@ class MainWindow(QtCore.QObject): self.openPresetManager ) - '''self.window.pushButton_saveAs.clicked.connect( - self.openSaveProjectDialog) - self.window.pushButton_saveProject.clicked.connect( - self.saveCurrentProject) - self.window.pushButton_openProject.clicked.connect( - self.openOpenProjectDialog)''' - - # show the window and load current project + # Show the window and load current project window.show() self.currentProject = self.settings.value("currentProject") if self.currentProject and os.path.exists(self.autosavePath) \ @@ -217,8 +221,9 @@ class MainWindow(QtCore.QObject): if self.currentProject and os.path.exists(self.autosavePath): ch = self.showMessage( - "Restore unsaved changes in project '%s'?" - % os.path.basename(self.currentProject)[:-4], True) + msg="Restore unsaved changes in project '%s'?" + % os.path.basename(self.currentProject)[:-4], + showCancel=True) if ch: os.remove(self.currentProject) os.rename(self.autosavePath, self.currentProject) @@ -325,7 +330,7 @@ class MainWindow(QtCore.QObject): self.selectedComponents) else: self.showMessage( - "You must select an audio file and output filename.") + msg="You must select an audio file and output filename.") def progressBarUpdated(self, value): self.window.progressBar_createVideo.setValue(value) @@ -480,10 +485,9 @@ class MainWindow(QtCore.QObject): self.window.stackedWidget.setCurrentIndex(row + 1) self.drawPreview() - # Preset manager for importing, exporting, renaming, - # and deleting presets. def openPresetManager(self): - return + '''Preset manager for importing, exporting, renaming, deleting''' + self.presetManager.show() def updateOpenPresetComboBox(self, component): self.window.comboBox_openPreset.clear() @@ -507,8 +511,8 @@ class MainWindow(QtCore.QObject): badName = True if badName: # some filesystems don't like bizarre characters - self.showMessage("Preset names must contain only letters, \ - numbers, and spaces.") + self.showMessage(msg="Preset names must contain only \ + letters, numbers, and spaces.") continue if OK and newName: index = self.window.listWidget_componentList.currentRow() @@ -529,8 +533,8 @@ class MainWindow(QtCore.QObject): filepath = os.path.join(dirname, filename) if os.path.exists(filepath): ch = self.showMessage( - "%s already exists! Overwrite it?" % filename, - True, QtGui.QMessageBox.Warning) + msg="%s already exists! Overwrite it?" % filename, + showCancel=True, icon=QtGui.QMessageBox.Warning) if not ch: return # remove old copies of the preset @@ -663,20 +667,20 @@ class MainWindow(QtCore.QObject): typ, value, _ = sys.exc_info() msg = '%s: %s' % (typ.__name__, value) self.showMessage( - "Project file '%s' is corrupted." % filepath, False, - QtGui.QMessageBox.Warning, msg) + msg="Project file '%s' is corrupted." % filepath, + showCancel=False, + icon=QtGui.QMessageBox.Warning, + detail=msg) except KeyError as e: # probably just an old version, still loadable print('project file missing value: %s' % e) - def showMessage( - self, string, showCancel=False, - icon=QtGui.QMessageBox.Information, detail=None): + def showMessage(self, **kwargs): msg = QtGui.QMessageBox() - msg.setIcon(icon) - msg.setText(string) - msg.setDetailedText(detail) - if showCancel: + msg.setText(kwargs['msg']) + 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( QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel) else: @@ -685,3 +689,15 @@ class MainWindow(QtCore.QObject): if ch == 1024: return True return False + + def componentContextMenu(self, QPos): + self.menu = QtGui.QMenu() + menuItem = self.menu.addAction("Save Preset") + self.connect(menuItem, QtCore.SIGNAL("triggered()"), self.openSavePresetDialog) + 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 new file mode 100644 index 0000000..cc6c482 --- /dev/null +++ b/presetmanager.py @@ -0,0 +1,70 @@ +from PyQt4 import QtGui +#import sys +import os + +class PresetManager(QtGui.QDialog): + def __init__(self, window, parent): + super().__init__() + self.parent = parent + self.presetDir = parent.presetDir + self.window = window + self.presets = self.findPresets() + + # create filter box and preset list + self.drawFilterList() + self.window.comboBox_filter.currentIndexChanged.connect( + lambda: self.drawPresetList(self.window.comboBox_filter.currentText()) + ) + self.drawPresetList('*') + + # make auto-completion for search bar + self.autocomplete = QtGui.QStringListModel() + completer = QtGui.QCompleter() + completer.setModel(self.autocomplete) + self.window.lineEdit_search.setCompleter(completer) + + def show(self): + presetNames = [] + for presetList in self.presets.values(): + for preset in presetList: + presetNames.append(preset[1]) + self.autocomplete.setStringList(presetNames) + self.presets = self.findPresets() + self.drawFilterList() + self.drawPresetList('*') + self.window.show() + + def findPresets(self): + parseList = [] + for dirpath, dirnames, filenames in os.walk(self.presetDir): + # anything without a subdirectory must be a preset folder + if dirnames: + continue + for preset in filenames: + compName = os.path.basename(os.path.dirname(dirpath)) + compVers = os.path.basename(dirpath) + try: + 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 \ + } + + def drawPresetList(self, filter): + self.window.listWidget_presets.clear() + for component, presets in self.presets.items(): + if filter != '*' and component != filter: + continue + for vers, preset in presets: + self.window.listWidget_presets.addItem('%s: %s' % (component, preset)) + + def drawFilterList(self): + self.window.comboBox_filter.clear() + self.window.comboBox_filter.addItem('*') + for component in self.presets: + self.window.comboBox_filter.addItem(component) diff --git a/presetmanager.ui b/presetmanager.ui index 7496169..610de91 100644 --- a/presetmanager.ui +++ b/presetmanager.ui @@ -17,14 +17,17 @@ - + + + + Search - + 200 @@ -38,7 +41,7 @@ - + 0 @@ -55,14 +58,14 @@ QLayout::SetMinimumSize - + Import - + Export @@ -82,14 +85,14 @@ - + Rename - + Delete -- cgit v1.2.3