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

View File

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

View File

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

View File

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

View File

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