saved preset titles, code clean-ups

componentList drag'n'drop disabled for now; will work on it in another branch
This commit is contained in:
tassaron 2017-06-08 16:50:48 -04:00
parent 6079c4fd24
commit bb1e54b31e
9 changed files with 170 additions and 108 deletions

View File

@ -70,7 +70,7 @@ class Component(__base__.Component):
return Image.new("RGBA", (width, height), (r, g, b, 255))
def loadPreset(self, pr, presetName=None):
self.currentPreset = presetName
self.currentPreset = presetName if presetName else pr['preset']
self.page.lineEdit_color1.setText('%s,%s,%s' % pr['color1'])
self.page.lineEdit_color2.setText('%s,%s,%s' % pr['color2'])
@ -85,6 +85,7 @@ class Component(__base__.Component):
def savePreset(self):
return {
'preset': self.currentPreset,
'color1': self.color1,
'color2': self.color2,
}

View File

@ -49,11 +49,12 @@ class Component(__base__.Component):
return frame
def loadPreset(self, pr, presetName=None):
self.currentPreset = presetName
self.currentPreset = presetName if presetName else pr['preset']
self.page.lineEdit_image.setText(pr['image'])
def savePreset(self):
return {
'preset': self.currentPreset,
'image': self.imagePath,
}

View File

@ -38,7 +38,7 @@ class Component(__base__.Component):
self.parent.drawPreview()
def loadPreset(self, pr, presetName=None):
self.currentPreset = presetName
self.currentPreset = presetName if presetName else pr['preset']
self.page.lineEdit_visColor.setText('%s,%s,%s' % pr['visColor'])
btnStyle = "QPushButton { background-color : %s; outline: none; }" \
% QColor(*pr['visColor']).name()
@ -47,6 +47,7 @@ class Component(__base__.Component):
def savePreset(self):
return {
'preset': self.currentPreset,
'layout': self.layout,
'visColor': self.visColor,
}

View File

@ -79,7 +79,7 @@ class Component(__base__.Component):
return x, self.yPosition
def loadPreset(self, pr, presetName=None):
self.currentPreset = presetName
self.currentPreset = presetName if presetName else pr['preset']
self.page.lineEdit_title.setText(pr['title'])
font = QFont()
font.fromString(pr['titleFont'])
@ -95,6 +95,7 @@ class Component(__base__.Component):
def savePreset(self):
return {
'preset': self.currentPreset,
'title': self.title,
'titleFont': self.titleFont.toString(),
'alignment': self.alignment,

View File

@ -129,12 +129,13 @@ class Component(__base__.Component):
return self.video.frame(frameNo)
def loadPreset(self, pr, presetName=None):
self.currentPreset = presetName
self.currentPreset = presetName if presetName else pr['preset']
self.page.lineEdit_video.setText(pr['video'])
self.page.checkBox_loop.setChecked(pr['loop'])
def savePreset(self):
return {
'preset': self.currentPreset,
'video': self.videoPath,
'loop': self.loopVideo,
}

58
core.py
View File

@ -6,29 +6,34 @@ from os.path import expanduser
import subprocess as sp
import numpy
from PIL import Image
import tempfile
#import tempfile
from shutil import rmtree
import atexit
#import atexit
import time
from collections import OrderedDict
import json
from importlib import import_module
from PyQt4.QtGui import QDesktopServices
class Core():
def __init__(self):
self.FFMPEG_BIN = self.findFfmpeg()
self.tempDir = os.path.join(
tempfile.gettempdir(), 'audio-visualizer-python-data')
if not os.path.exists(self.tempDir):
os.makedirs(self.tempDir)
atexit.register(self.deleteTempDir)
#self.tempDir = os.path.join(
# tempfile.gettempdir(), 'audio-visualizer-python-data')
#if not os.path.exists(self.tempDir):
# os.makedirs(self.tempDir)
#atexit.register(self.deleteTempDir)
self.dataDir = QDesktopServices.storageLocation(
QDesktopServices.DataLocation)
self.presetDir = os.path.join(self.dataDir, 'presets')
self.wd = os.path.dirname(os.path.realpath(__file__))
self.loadEncoderOptions()
self.modules = self.findComponents()
self.selectedComponents = []
self.selectedModules = []
def findComponents(self):
def findComponents():
@ -45,19 +50,40 @@ class Core():
for name in findComponents()]
def insertComponent(self, compPos, moduleIndex):
if compPos < 0:
compPos = len(self.selectedComponents) -1
self.selectedComponents.insert(
compPos,
self.modules[moduleIndex].Component())
return compPos #if compPos > -1 else len(self.selectedComponents)-1
self.modules[moduleIndex].Component()
)
self.selectedModules.insert(
compPos,
moduleIndex
)
return compPos
def moveComponent(self, startI, endI):
comp = self.selectedComponents.pop(startI)
i = self.selectedComponents.insert(endI, comp)
return i
self.selectedComponents.insert(endI, comp)
i = self.selectedModules.pop(startI)
self.selectedModules.insert(endI, i)
return endI
def updateComponent(self, i):
print('updating %s' % self.selectedComponents[i])
self.selectedComponents[i].update()
def moduleIndexFor(self, compIndex):
return self.selectedModules[compIndex]
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)
with open(filepath, 'w') as f:
f.write(Core.stringOrderedDict(saveValueStore))
def loadEncoderOptions(self):
file_path = os.path.join(self.wd, 'encoder-options.json')
with open(file_path) as json_file:
@ -139,11 +165,11 @@ class Core():
return completeAudioArray
def deleteTempDir(self):
try:
rmtree(self.tempDir)
except FileNotFoundError:
pass
#def deleteTempDir(self):
# try:
# rmtree(self.tempDir)
# except FileNotFoundError:
# pass
def cancel(self):
self.canceled = True

View File

@ -3,7 +3,7 @@ from queue import Queue
from collections import OrderedDict
from PyQt4 import QtCore, QtGui, uic
from PyQt4.QtCore import QSettings, Qt
from PyQt4.QtGui import QDesktopServices, QMenu
from PyQt4.QtGui import QMenu
import sys
import os
import signal
@ -55,12 +55,11 @@ class MainWindow(QtCore.QObject):
self.core = core.Core()
self.pages = [] # widgets of component settings
self.componentRows = {} # QListWidgetItems
self.componentRows = [] # (moduleIndex, QListWidgetItem) tuples
self.lastAutosave = time.time()
# Create data directory, load/create settings
self.dataDir = QDesktopServices.storageLocation(
QDesktopServices.DataLocation)
self.dataDir = self.core.dataDir
self.presetManager = PresetManager(
uic.loadUi(
os.path.join(os.path.dirname(os.path.realpath(__file__)),
@ -73,7 +72,7 @@ class MainWindow(QtCore.QObject):
if not os.path.exists(self.dataDir):
os.makedirs(self.dataDir)
for neededDirectory in (
self.presetManager.presetDir, self.settings.value("projectDir")):
self.core.presetDir, self.settings.value("projectDir")):
if not os.path.exists(neededDirectory):
os.mkdir(neededDirectory)
@ -90,6 +89,8 @@ class MainWindow(QtCore.QObject):
self.timer.start(500)
# Begin decorating the window and connecting events
componentList = self.window.listWidget_componentList
window.toolButton_selectAudioFile.clicked.connect(
self.openInputFileDialog)
@ -120,7 +121,7 @@ class MainWindow(QtCore.QObject):
codec = window.comboBox_videoCodec.itemText(i)
if codec == self.settings.value('outputVideoCodec'):
window.comboBox_videoCodec.setCurrentIndex(i)
print(codec)
#print(codec)
for i in range(window.comboBox_audioCodec.count()):
codec = window.comboBox_audioCodec.itemText(i)
@ -157,17 +158,17 @@ class MainWindow(QtCore.QObject):
self.window.pushButton_addComponent.setMenu(self.compMenu)
self.window.listWidget_componentList.dropEvent = self.componentMoved
self.window.listWidget_componentList.clicked.connect(
componentList.dropEvent = self.componentListChanged
componentList.clicked.connect(
lambda _: self.changeComponentWidget())
self.window.pushButton_removeComponent.clicked.connect(
lambda _: self.removeComponent())
self.window.listWidget_componentList.setContextMenuPolicy(
componentList.setContextMenuPolicy(
QtCore.Qt.CustomContextMenu)
self.window.listWidget_componentList.connect(
self.window.listWidget_componentList,
componentList.connect(
componentList,
QtCore.SIGNAL("customContextMenuRequested(QPoint)"),
self.componentContextMenu)
@ -182,9 +183,11 @@ class MainWindow(QtCore.QObject):
self.updateResolution)
self.window.pushButton_listMoveUp.clicked.connect(
self.moveComponentUp)
#self.window.pushButton_listMoveDown.clicked.connect(
# self.moveComponentDown)
lambda: self.moveComponent(-1)
)
self.window.pushButton_listMoveDown.clicked.connect(
lambda: self.moveComponent(1)
)
# Configure the Projects Menu
self.projectMenu = QMenu()
@ -210,8 +213,7 @@ class MainWindow(QtCore.QObject):
# Show the window and load current project
window.show()
self.currentProject = self.settings.value("currentProject")
if self.currentProject and os.path.exists(self.autosavePath) \
and filecmp.cmp(self.autosavePath, self.currentProject):
if self.autosaveExists():
# delete autosave if it's identical to the project
os.remove(self.autosavePath)
@ -235,6 +237,14 @@ class MainWindow(QtCore.QObject):
self.previewThread.wait()
self.autosave()
def updateComponentTitle(self, pos):
if pos < 0:
pos = len(self.core.selectedComponents)-1
title = str(self.core.selectedComponents[pos])
if self.core.selectedComponents[pos].currentPreset:
title += ' - %s' % self.core.selectedComponents[pos].currentPreset
self.window.listWidget_componentList.item(pos).setText(title)
def updateCodecs(self):
containerWidget = self.window.comboBox_videoContainer
vCodecWidget = self.window.comboBox_videoCodec
@ -270,12 +280,20 @@ class MainWindow(QtCore.QObject):
self.settings.setValue('outputAudioBitrate', currentAudioBitrate)
def autosave(self):
if time.time() - self.lastAutosave >= 2.0:
if not self.currentProject:
if os.path.exists(self.autosavePath):
os.remove(self.autosavePath)
elif time.time() - self.lastAutosave >= 2.0:
self.createProjectFile(self.autosavePath)
self.lastAutosave = time.time()
def autosaveExists(self):
if self.currentProject and os.path.exists(self.autosavePath) \
and filecmp.cmp(self.autosavePath, self.currentProject):
return True
else:
return False
def openInputFileDialog(self):
inputDir = self.settings.value("inputDir", expanduser("~"))
@ -393,88 +411,94 @@ class MainWindow(QtCore.QObject):
def insertComponent(self, moduleIndex, compPos=0):
componentList = self.window.listWidget_componentList
stackedWidget = self.window.stackedWidget
if compPos < 0:
compPos = componentList.count()
index = self.core.insertComponent(
compPos, moduleIndex)
row = componentList.insertItem(
index,
self.core.selectedComponents[index].__doc__)
self.componentRows[index] = componentList.row(row)
self.componentRows.insert(compPos, (moduleIndex, row))
componentList.setCurrentRow(index)
self.pages.insert(index, self.core.selectedComponents[index].widget(self))
self.window.stackedWidget.insertWidget(index, self.pages[index])
self.window.stackedWidget.setCurrentIndex(index)
stackedWidget.insertWidget(index, self.pages[index])
stackedWidget.setCurrentIndex(index)
self.core.updateComponent(index)
def removeComponent(self):
for selected in self.window.listWidget_componentList.selectedItems():
index = self.window.listWidget_componentList.row(selected)
componentList = self.window.listWidget_componentList
for selected in componentList.selectedItems():
index = componentList.row(selected)
self.window.stackedWidget.removeWidget(self.pages[index])
self.window.listWidget_componentList.takeItem(index)
componentList.takeItem(index)
self.componentRows.pop(index)
self.core.selectedComponents.pop(index)
self.pages.pop(index)
self.changeComponentWidget()
self.drawPreview()
def moveComponent(self, change):
'''Moves a component relatively from its current position'''
componentList = self.window.listWidget_componentList
stackedWidget = self.window.stackedWidget
row = componentList.currentRow()
newRow = row + change
if newRow > -1 and newRow < componentList.count():
self.core.moveComponent(row, newRow)
# update widgets
page = self.pages.pop(row)
self.pages.insert(newRow, page)
item = componentList.takeItem(row)
newItem = componentList.insertItem(newRow, item)
widget = stackedWidget.removeWidget(page)
stackedWidget.insertWidget(newRow, page)
componentList.setCurrentRow(newRow)
stackedWidget.setCurrentIndex(newRow)
self.componentRows.pop(row)
self.componentRows.insert(newRow, (self.core.moduleIndexFor(row), newItem))
self.drawPreview()
def componentListChanged(self, *args):
'''Update all our tracking variables to match the widget'''
pass
def changeComponentWidget(self):
selected = self.window.listWidget_componentList.selectedItems()
if selected:
index = self.window.listWidget_componentList.row(selected[0])
self.window.stackedWidget.setCurrentIndex(index)
def moveComponentUp(self):
row = self.window.listWidget_componentList.currentRow()
if row > 0:
self.core.moveComponent(row, row - 1)
page = self.pages.pop(row)
self.pages.insert(row - 1, page)
# update widgets
componentList = self.window.listWidget_componentList
stackedWidget = self.window.stackedWidget
item = componentList.takeItem(row)
componentList.insertItem(row - 1, item)
widget = stackedWidget.removeWidget(page)
stackedWidget.insertWidget(row - 1, page)
componentList.setCurrentRow(row - 1)
stackedWidget.setCurrentIndex(row - 1)
self.drawPreview()
'''
def moveComponentDown(self):
row = self.window.listWidget_componentList.currentRow()
if row != -1 and row < len(self.pages)+1:
module = self.selectedComponents[row]
self.selectedComponents.pop(row)
self.selectedComponents.insert(row + 1, module)
page = self.pages[row]
self.pages.pop(row)
self.pages.insert(row + 1, page)
item = self.window.listWidget_componentList.takeItem(row)
self.window.listWidget_componentList.insertItem(row + 1, item)
widget = self.window.stackedWidget.removeWidget(page)
self.window.stackedWidget.insertWidget(row + 1, page)
self.window.listWidget_componentList.setCurrentRow(row + 1)
self.window.stackedWidget.setCurrentIndex(row + 1)
self.drawPreview()
'''
def componentMoved(self, event):
widget = self.window.listWidget_componentList
for i in range(widget.count()):
pass
#print(widget.item(i) == self.componentRows[i])
def openPresetManager(self):
'''Preset manager for importing, exporting, renaming, deleting'''
self.presetManager.show()
def createNewProject(self):
self.currentProject = None
def clear(self):
'''Get a blank slate'''
self.core.selectedComponents = []
self.window.listWidget_componentList.clear()
for widget in self.pages:
self.window.stackedWidget.removeWidget(widget)
self.pages = []
def createNewProject(self):
if self.autosaveExists():
ch = self.showMessage(
msg="You have unsaved changes in project '%s'. "
"Save before starting a new project?"
% os.path.basename(self.currentProject)[:-4],
showCancel=True)
if ch:
self.saveCurrentProject()
self.clear()
self.currentProject = None
self.settings.setValue("currentProject", None)
self.drawPreview()
@ -496,6 +520,8 @@ class MainWindow(QtCore.QObject):
def createProjectFile(self, filepath):
if not filepath.endswith(".avp"):
filepath += '.avp'
if os.path.exists(filepath):
os.remove(filepath)
with open(filepath, 'w') as f:
print('creating %s' % filepath)
f.write('[Components]\n')
@ -520,7 +546,7 @@ class MainWindow(QtCore.QObject):
if not filepath or not os.path.exists(filepath) \
or not filepath.endswith('.avp'):
return
self.createNewProject()
self.clear()
self.currentProject = filepath
self.settings.setValue("currentProject", filepath)
self.settings.setValue("projectDir", os.path.dirname(filepath))
@ -558,6 +584,7 @@ class MainWindow(QtCore.QObject):
saveValueStore = dict(eval(line))
self.core.selectedComponents[-1].loadPreset(
saveValueStore)
self.updateComponentTitle(-1)
i = 0
except (IndexError, ValueError, NameError, SyntaxError,
AttributeError, TypeError) as e:

View File

@ -188,7 +188,7 @@
<bool>true</bool>
</property>
<property name="dragEnabled">
<bool>true</bool>
<bool>false</bool>
</property>
<property name="dragDropOverwriteMode">
<bool>false</bool>

View File

@ -10,7 +10,8 @@ class PresetManager(QtGui.QDialog):
def __init__(self, window, parent):
super().__init__()
self.parent = parent
self.presetDir = os.path.join(self.parent.dataDir, 'presets')
self.core = self.parent.core
self.presetDir = self.core.presetDir
self.window = window
self.findPresets()
self.lastFilter = '*'
@ -83,11 +84,14 @@ class PresetManager(QtGui.QDialog):
def openSavePresetDialog(self):
window = self.parent.window
if window.listWidget_componentList.currentRow() == -1:
self.selectedComponents = self.parent.core.selectedComponents
componentList = window.listWidget_componentList
if componentList.currentRow() == -1:
return
while True:
index = window.listWidget_componentList.currentRow()
currentPreset = self.parent.selectedComponents[index].currentPreset
index = componentList.currentRow()
currentPreset = self.selectedComponents[index].currentPreset
newName, OK = QtGui.QInputDialog.getText(
self.parent.window,
'Audio Visualizer',
@ -109,35 +113,34 @@ class PresetManager(QtGui.QDialog):
if newName:
if index != -1:
saveValueStore = \
self.parent.selectedComponents[index].savePreset()
componentName = str(self.parent.selectedComponents[index]).strip()
vers = self.parent.selectedComponents[index].version()
self.selectedComponents[index].savePreset()
componentName = str(self.selectedComponents[index]).strip()
vers = self.selectedComponents[index].version()
self.createPresetFile(
componentName, vers, saveValueStore, newName)
self.parent.selectedComponents[index].currentPreset = newName
self.selectedComponents[index].currentPreset = 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):
path = os.path.join(self.presetDir, compName, str(vers), filename)
if os.path.exists(path):
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.core.createPresetFile(compName, vers, saveValueStore, filename)
self.drawPresetList()
def openPreset(self, presetName):
index = self.parent.window.listWidget_componentList.currentRow()
componentList = self.parent.window.listWidget_componentList
selectedComponents = self.parent.core.selectedComponents
index = componentList.currentRow()
if index == -1:
return
componentName = str(self.parent.selectedComponents[index]).strip()
version = self.parent.selectedComponents[index].version()
componentName = str(selectedComponents[index]).strip()
version = selectedComponents[index].version()
dirname = os.path.join(self.presetDir, componentName, str(version))
filepath = os.path.join(dirname, presetName)
if not os.path.exists(filepath):
@ -146,9 +149,10 @@ class PresetManager(QtGui.QDialog):
for line in f:
saveValueStore = dict(eval(line.strip()))
break
self.parent.selectedComponents[index].loadPreset(
selectedComponents[index].loadPreset(
saveValueStore,
presetName
)
self.parent.updateComponentTitle(index)
self.parent.drawPreview()