repeated errors don't cause repeated windows
This commit is contained in:
parent
d25dee6afc
commit
661526b073
|
@ -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:
|
||||||
|
|
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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):
|
||||||
|
|
15
src/core.py
15
src/core.py
|
@ -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):
|
||||||
|
|
|
@ -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()
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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):
|
||||||
|
|
Reference in New Issue