project files save settings & out/in fields

This commit is contained in:
tassaron 2017-06-25 14:27:56 -04:00
parent 55423ca4aa
commit 675a06dd4c
6 changed files with 94 additions and 29 deletions

View File

@ -1,5 +1,4 @@
from PyQt4 import QtCore
from PyQt4.QtCore import QSettings
from PyQt5 import QtCore
import argparse
import os
import sys
@ -43,8 +42,7 @@ class Command(QtCore.QObject):
nargs='*', action='append')
self.args = self.parser.parse_args()
self.settings = QSettings(
os.path.join(self.dataDir, 'settings.ini'), QSettings.IniFormat)
self.settings = self.core.settings
LoadDefaultSettings(self)
if self.args.projpath:

View File

@ -83,12 +83,12 @@ class Component(__base__.Component):
}
def pickImage(self):
imgDir = self.settings.value("backgroundDir", os.path.expanduser("~"))
imgDir = self.settings.value("componentDir", os.path.expanduser("~"))
filename, _ = QtWidgets.QFileDialog.getOpenFileName(
self.page, "Choose Image", imgDir,
"Image Files (%s)" % " ".join(self.imageFormats))
if filename:
self.settings.setValue("backgroundDir", os.path.dirname(filename))
self.settings.setValue("componentDir", os.path.dirname(filename))
self.page.lineEdit_image.setText(filename)
self.update()

View File

@ -88,8 +88,8 @@ class Video:
self.parent.showMessage(
msg='%s couldn\'t be loaded. '
'This is a fatal error.' % os.path.basename(
self.videoPath
),
self.videoPath
),
detail=str(e)
)
self.parent.stopVideo()
@ -188,13 +188,13 @@ class Component(__base__.Component):
}
def pickVideo(self):
imgDir = self.settings.value("backgroundDir", os.path.expanduser("~"))
imgDir = self.settings.value("componentDir", os.path.expanduser("~"))
filename, _ = QtWidgets.QFileDialog.getOpenFileName(
self.page, "Choose Video",
imgDir, "Video Files (%s)" % " ".join(self.videoFormats)
)
if filename:
self.settings.setValue("backgroundDir", os.path.dirname(filename))
self.settings.setValue("componentDir", os.path.dirname(filename))
self.page.lineEdit_video.setText(filename)
self.update()

View File

@ -30,6 +30,10 @@ class Core():
# unfrozen
self.wd = os.path.dirname(os.path.realpath(__file__))
self.componentsPath = os.path.join(self.wd, 'components')
self.settings = QtCore.QSettings(
os.path.join(self.dataDir, 'settings.ini'),
QtCore.QSettings.IniFormat
)
self.loadEncoderOptions()
self.videoFormats = Core.appendUppercase([
@ -169,13 +173,23 @@ class Core():
its own showMessage(**kwargs) method for displaying errors.
'''
if not os.path.exists(filepath):
loader.showMessage(msg='Project file not found')
loader.showMessage(msg='Project file not found.')
return
errcode, data = self.parseAvFile(filepath)
if errcode == 0:
try:
for i, tup in enumerate(data['Components']):
if hasattr(loader, 'window'):
for pair in data['WindowFields']:
widget, value = pair.split('=', 1)
widget = eval('loader.window.%s' % widget)
widget.setText(value.strip())
for pair in data['Settings']:
key, value = pair.split('=', 1)
self.settings.setValue(key, value.strip())
for tup in data['Components']:
name, vers, preset = tup
clearThis = False
modified = False
@ -213,7 +227,7 @@ class Core():
preset['preset']
)
except KeyError as e:
print('%s missing value %s' % (
print('%s missing value: %s' % (
self.selectedComponents[i], e)
)
@ -221,23 +235,26 @@ class Core():
self.clearPreset(i)
if hasattr(loader, 'updateComponentTitle'):
loader.updateComponentTitle(i, modified)
except:
errcode = 1
data = sys.exc_info()
if errcode == 1:
typ, value, _ = data
if typ.__name__ == KeyError:
typ, value, tb = data
if typ.__name__ == 'KeyError':
# probably just an old version, still loadable
print('file missing value: %s' % value)
return
if hasattr(loader, 'createNewProject'):
loader.createNewProject()
msg = '%s: %s' % (typ.__name__, value)
import traceback
msg = '%s: %s\n\nTraceback:\n' % (typ.__name__, value)
msg += "\n".join(traceback.format_tb(tb))
loader.showMessage(
msg="Project file '%s' is corrupted." % filepath,
showCancel=False,
icon=QtGui.QMessageBox.Warning,
icon='Warning',
detail=msg)
def parseAvFile(self, filepath):
@ -250,7 +267,11 @@ class Core():
with open(filepath, 'r') as f:
def parseLine(line):
'''Decides if a file line is a section header'''
validSections = ('Components')
validSections = (
'Components',
'Settings',
'WindowFields'
)
line = line.strip()
newSection = ''
@ -283,6 +304,8 @@ class Core():
lastCompPreset
))
i = 0
elif line and section:
data[section].append(line)
return 0, data
except:
return 1, sys.exc_info()
@ -354,8 +377,22 @@ class Core():
f.write('%s\n' % str(vers))
f.write(Core.presetToString(saveValueStore))
def createProjectFile(self, filepath):
def createProjectFile(self, filepath, window=None):
'''Create a project file (.avp) using the current program state'''
forbiddenSettingsKeys = [
'currentProject',
'outputAudioBitrate',
'outputAudioCodec',
'outputContainer',
'outputFormat',
'outputFrameRate',
'outputHeight',
'outputPreset',
'outputVideoBitrate',
'outputVideoCodec',
'outputVideoFormat',
'outputWidth',
]
try:
if not filepath.endswith(".avp"):
filepath += '.avp'
@ -363,12 +400,28 @@ class Core():
os.remove(filepath)
with open(filepath, 'w') as f:
print('creating %s' % filepath)
f.write('[Components]\n')
for comp in self.selectedComponents:
saveValueStore = comp.savePreset()
f.write('%s\n' % str(comp))
f.write('%s\n' % str(comp.version()))
f.write('%s\n' % Core.presetToString(saveValueStore))
f.write('[Settings]\n')
for key in self.settings.allKeys():
if key not in forbiddenSettingsKeys:
f.write('%s=%s\n' % (key, self.settings.value(key)))
if window:
f.write('[WindowFields]\n')
f.write(
'lineEdit_audioFile=%s\n'
'lineEdit_outputFile=%s\n' % (
window.lineEdit_audioFile.text(),
window.lineEdit_outputFile.text()
)
)
return True
except:
return False

View File

@ -1,6 +1,5 @@
from queue import Queue
from PyQt5 import QtCore, QtGui, uic, QtWidgets
from PyQt5.QtCore import QSettings, Qt
from PyQt5.QtWidgets import QMenu, QShortcut
import sys
import os
@ -27,7 +26,9 @@ class PreviewWindow(QtWidgets.QLabel):
painter = QtGui.QPainter(self)
point = QtCore.QPoint(0, 0)
scaledPix = self.pixmap.scaled(
size, Qt.KeepAspectRatio, transformMode=Qt.SmoothTransformation)
size,
QtCore.Qt.KeepAspectRatio,
transformMode=QtCore.Qt.SmoothTransformation)
# start painting the label from left upper corner
point.setX((size.width() - scaledPix.width())/2)
@ -59,8 +60,7 @@ class MainWindow(QtWidgets.QMainWindow):
# Create data directory, load/create settings
self.dataDir = self.core.dataDir
self.autosavePath = os.path.join(self.dataDir, 'autosave.avp')
self.settings = QSettings(
os.path.join(self.dataDir, 'settings.ini'), QSettings.IniFormat)
self.settings = self.core.settings
LoadDefaultSettings(self)
self.presetManager = PresetManager(
uic.loadUi(
@ -94,6 +94,13 @@ class MainWindow(QtWidgets.QMainWindow):
window.toolButton_selectOutputFile.clicked.connect(
self.openOutputFileDialog)
def changedField():
self.autosave()
self.updateWindowTitle()
window.lineEdit_audioFile.textChanged.connect(changedField)
window.lineEdit_outputFile.textChanged.connect(changedField)
window.progressBar_createVideo.setValue(0)
window.pushButton_createVideo.clicked.connect(
@ -359,7 +366,7 @@ class MainWindow(QtWidgets.QMainWindow):
if os.path.exists(self.autosavePath):
os.remove(self.autosavePath)
elif force or time.time() - self.lastAutosave >= 0.1:
self.core.createProjectFile(self.autosavePath)
self.core.createProjectFile(self.autosavePath, self.window)
self.lastAutosave = time.time()
def autosaveExists(self, identical=True):
@ -625,6 +632,13 @@ class MainWindow(QtWidgets.QMainWindow):
for widget in self.pages:
self.window.stackedWidget.removeWidget(widget)
self.pages = []
for field in (
self.window.lineEdit_audioFile,
self.window.lineEdit_outputFile
):
field.blockSignals(True)
field.setText('')
field.blockSignals(False)
@disableWhenEncoding
def createNewProject(self):
@ -637,7 +651,7 @@ class MainWindow(QtWidgets.QMainWindow):
def saveCurrentProject(self):
if self.currentProject:
self.core.createProjectFile(self.currentProject)
self.core.createProjectFile(self.currentProject, self.window)
self.updateWindowTitle()
else:
self.openSaveProjectDialog()
@ -670,7 +684,7 @@ class MainWindow(QtWidgets.QMainWindow):
self.settings.setValue("projectDir", os.path.dirname(filename))
self.settings.setValue("currentProject", filename)
self.currentProject = filename
self.core.createProjectFile(filename)
self.core.createProjectFile(filename, self.window)
self.updateWindowTitle()
@disableWhenEncoding
@ -707,7 +721,7 @@ class MainWindow(QtWidgets.QMainWindow):
msg.setModal(True)
msg.setText(kwargs['msg'])
msg.setIcon(
kwargs['icon']
eval('QtWidgets.QMessageBox.%s' % kwargs['icon'])
if 'icon' in kwargs else QtWidgets.QMessageBox.Information
)
msg.setDetailedText(kwargs['detail'] if 'detail' in kwargs else None)

View File

@ -176,7 +176,7 @@ class PresetManager(QtWidgets.QDialog):
msg="%s already exists! Overwrite it?" %
os.path.basename(path),
showCancel=True,
icon=QtWidgets.QMessageBox.Warning,
icon='Warning',
parent=window)
if not ch:
# user clicked cancel
@ -209,7 +209,7 @@ class PresetManager(QtWidgets.QDialog):
ch = self.parent.showMessage(
msg='Really delete %s?' % name,
showCancel=True,
icon=QtWidgets.QMessageBox.Warning,
icon='Warning',
parent=self.window
)
if not ch: