repeated errors don't cause repeated windows

This commit is contained in:
tassaron 2017-07-25 17:44:59 -04:00
parent d25dee6afc
commit 661526b073
7 changed files with 63 additions and 45 deletions

View File

@ -17,7 +17,7 @@ class ComponentMetaclass(type(QtCore.QObject)):
def initializationWrapper(self, *args, **kwargs): def initializationWrapper(self, *args, **kwargs):
try: try:
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
except: except Exception:
try: try:
raise ComponentInitError(self, 'initialization process') raise ComponentInitError(self, 'initialization process')
except ComponentError: except ComponentError:
@ -28,7 +28,7 @@ class ComponentMetaclass(type(QtCore.QObject)):
def renderWrapper(self, *args, **kwargs): def renderWrapper(self, *args, **kwargs):
try: try:
return func(self, *args, **kwargs) return func(self, *args, **kwargs)
except: except Exception:
from toolkit.frame import BlankFrame from toolkit.frame import BlankFrame
try: try:
raise ComponentError(self, 'renderer') raise ComponentError(self, 'renderer')
@ -398,8 +398,19 @@ class Component(QtCore.QObject, metaclass=ComponentMetaclass):
class ComponentException(RuntimeError): class ComponentException(RuntimeError):
'''A base class for component errors''' '''A base class for component errors'''
_prevErrors = []
def __init__(self, caller, name, immediate): def __init__(self, caller, name, immediate):
print('ComponentError by %s: %s' % (caller.name, name))
super().__init__() super().__init__()
if len(ComponentException._prevErrors) > 1:
ComponentException._prevErrors.pop()
ComponentException._prevErrors.insert(0, name)
if name in ComponentException._prevErrors[1:]:
# Don't create multiple windows for repeated messages
return
from toolkit import formatTraceback from toolkit import formatTraceback
import sys import sys
if sys.exc_info()[0] is not None: if sys.exc_info()[0] is not None:

View File

@ -1,7 +1,6 @@
from PyQt5 import QtGui, QtCore, QtWidgets from PyQt5 import QtGui, QtCore, QtWidgets
import os import os
from core import Core
from component import Component from component import Component
from toolkit.frame import BlankFrame from toolkit.frame import BlankFrame

View File

@ -6,8 +6,7 @@ import subprocess
import threading import threading
from queue import PriorityQueue from queue import PriorityQueue
from core import Core from component import Component
from component import Component, ComponentError
from toolkit.frame import BlankFrame from toolkit.frame import BlankFrame
from toolkit.ffmpeg import testAudioStream from toolkit.ffmpeg import testAudioStream
from toolkit import openPipe, checkOutput from toolkit import openPipe, checkOutput
@ -155,6 +154,7 @@ class Component(Component):
return frame return frame
def properties(self): def properties(self):
# TODO: Disallow selecting the same video you're exporting to
props = [] props = []
if not self.videoPath or self.badVideo \ if not self.videoPath or self.badVideo \
or not os.path.exists(self.videoPath): or not os.path.exists(self.videoPath):

View File

@ -215,7 +215,7 @@ class Core:
if hasattr(loader, 'updateComponentTitle'): if hasattr(loader, 'updateComponentTitle'):
loader.updateComponentTitle(i, modified) loader.updateComponentTitle(i, modified)
except: except Exception:
errcode = 1 errcode = 1
data = sys.exc_info() data = sys.exc_info()
@ -237,9 +237,10 @@ class Core:
self.openingProject = False self.openingProject = False
def parseAvFile(self, filepath): def parseAvFile(self, filepath):
'''Parses an avp (project) or avl (preset package) file. '''
Returns dictionary with section names as the keys, each one Parses an avp (project) or avl (preset package) file.
contains a list of tuples: (compName, version, compPresetDict) Returns dictionary with section names as the keys, each one
contains a list of tuples: (compName, version, compPresetDict)
''' '''
validSections = ( validSections = (
'Components', 'Components',
@ -287,7 +288,7 @@ class Core:
data[section].append((key, value.strip())) data[section].append((key, value.strip()))
return 0, data return 0, data
except: except Exception:
return 1, sys.exc_info() return 1, sys.exc_info()
def importPreset(self, filepath): def importPreset(self, filepath):
@ -332,7 +333,7 @@ class Core:
exportPath exportPath
) )
return True return True
except: except Exception:
return False return False
def createPresetFile( def createPresetFile(
@ -397,7 +398,7 @@ class Core:
) )
) )
return True return True
except: except Exception:
return False return False
def newVideoWorker(self, loader, audioFile, outputPath): def newVideoWorker(self, loader, audioFile, outputPath):

View File

@ -314,7 +314,7 @@ class MainWindow(QtWidgets.QMainWindow):
['ffmpeg', '-version'], stderr=f ['ffmpeg', '-version'], stderr=f
) )
goodVersion = str(ffmpegVers).split()[2].startswith('3') goodVersion = str(ffmpegVers).split()[2].startswith('3')
except: except Exception:
goodVersion = False goodVersion = False
else: else:
goodVersion = True goodVersion = True
@ -381,7 +381,7 @@ class MainWindow(QtWidgets.QMainWindow):
) )
@QtCore.pyqtSlot() @QtCore.pyqtSlot()
def cleanUp(self): def cleanUp(self, *args):
self.timer.stop() self.timer.stop()
self.previewThread.quit() self.previewThread.quit()
self.previewThread.wait() self.previewThread.wait()

View File

@ -211,10 +211,9 @@ class PresetManager(QtWidgets.QDialog):
self.parent.drawPreview() self.parent.drawPreview()
def openDeletePresetDialog(self): def openDeletePresetDialog(self):
selected = self.window.listWidget_presets.selectedItems() row = self.getPresetRow()
if not selected: if row == -1:
return return
row = self.window.listWidget_presets.row(selected[0])
comp, vers, name = self.presetRows[row] comp, vers, name = self.presetRows[row]
ch = self.parent.showMessage( ch = self.parent.showMessage(
msg='Really delete %s?' % name, msg='Really delete %s?' % name,
@ -242,32 +241,40 @@ class PresetManager(QtWidgets.QDialog):
'numbers, and spaces.', 'numbers, and spaces.',
parent=window if window else self.window) parent=window if window else self.window)
def getPresetRow(self):
row = self.window.listWidget_presets.currentRow()
if row > -1:
return row
# check if component selected in MainWindow has preset loaded
componentList = self.parent.window.listWidget_componentList
compIndex = componentList.currentRow()
if compIndex == -1:
return compIndex
preset = self.core.selectedComponents[compIndex].currentPreset
if preset is None:
return -1
else:
rowTuple = (
self.core.selectedComponents[compIndex].name,
self.core.selectedComponents[compIndex].version,
preset
)
for i, tup in enumerate(self.presetRows):
if rowTuple == tup:
index = i
break
else:
return -1
return index
def openRenamePresetDialog(self): def openRenamePresetDialog(self):
# TODO: maintain consistency by changing this to call createNewPreset() # TODO: maintain consistency by changing this to call createNewPreset()
presetList = self.window.listWidget_presets presetList = self.window.listWidget_presets
index = presetList.currentRow() index = self.getPresetRow()
if index == -1: if index == -1:
# check if component selected in MainWindow has preset loaded return
componentList = self.parent.window.listWidget_componentList
compIndex = componentList.currentRow()
if compIndex == -1:
return
preset = self.core.selectedComponents[compIndex].currentPreset
if preset is None:
return
else:
rowTuple = (
self.core.selectedComponents[compIndex].name,
self.core.selectedComponents[compIndex].version,
preset
)
for i, tup in enumerate(self.presetRows):
if rowTuple == tup:
index = i
break
else:
return
while True: while True:
newName, OK = QtWidgets.QInputDialog.getText( newName, OK = QtWidgets.QInputDialog.getText(
@ -326,14 +333,14 @@ class PresetManager(QtWidgets.QDialog):
self.settings.setValue("presetDir", os.path.dirname(filename)) self.settings.setValue("presetDir", os.path.dirname(filename))
def openExportDialog(self): def openExportDialog(self):
if not self.window.listWidget_presets.selectedItems(): index = self.getPresetRow()
if index == -1:
return return
filename, _ = QtWidgets.QFileDialog.getSaveFileName( filename, _ = QtWidgets.QFileDialog.getSaveFileName(
self.window, "Export Preset", self.window, "Export Preset",
self.settings.value("presetDir"), self.settings.value("presetDir"),
"Preset Files (*.avl)") "Preset Files (*.avl)")
if filename: if filename:
index = self.window.listWidget_presets.currentRow()
comp, vers, name = self.presetRows[index] comp, vers, name = self.presetRows[index]
if not self.core.exportPreset(filename, comp, vers, name): if not self.core.exportPreset(filename, comp, vers, name):
self.parent.showMessage( self.parent.showMessage(

View File

@ -225,7 +225,7 @@ class Worker(QtCore.QObject):
self.renderThreads = [] self.renderThreads = []
try: try:
numCpus = len(os.sched_getaffinity(0)) numCpus = len(os.sched_getaffinity(0))
except: except Exception:
numCpus = os.cpu_count() numCpus = os.cpu_count()
for i in range(2 if numCpus <= 2 else 3): for i in range(2 if numCpus <= 2 else 3):
@ -268,7 +268,7 @@ class Worker(QtCore.QObject):
try: try:
self.out_pipe.stdin.write(frameBuffer[audioI].tobytes()) self.out_pipe.stdin.write(frameBuffer[audioI].tobytes())
self.previewQueue.put([audioI, frameBuffer.pop(audioI)]) self.previewQueue.put([audioI, frameBuffer.pop(audioI)])
except: except Exception:
break break
# increase progress bar value # increase progress bar value
@ -293,7 +293,7 @@ class Worker(QtCore.QObject):
print("Export Canceled") print("Export Canceled")
try: try:
os.remove(self.outputFile) os.remove(self.outputFile)
except: except Exception:
pass pass
self.progressBarUpdate.emit(0) self.progressBarUpdate.emit(0)
self.progressBarSetText.emit('Export Canceled') self.progressBarSetText.emit('Export Canceled')
@ -333,7 +333,7 @@ class Worker(QtCore.QObject):
try: try:
self.out_pipe.send_signal(signal.SIGINT) self.out_pipe.send_signal(signal.SIGINT)
except: except Exception:
pass pass
def reset(self): def reset(self):