fixed too-large Color sizes, fixed a redoing bug, rm pointless things
and now Ctrl+Alt+Shift+A gives a bunch of debug info
This commit is contained in:
parent
62e2ef18a3
commit
85d3b779d0
|
@ -41,10 +41,8 @@ class ComponentMetaclass(type(QtCore.QObject)):
|
||||||
def renderWrapper(self, *args, **kwargs):
|
def renderWrapper(self, *args, **kwargs):
|
||||||
try:
|
try:
|
||||||
log.verbose(
|
log.verbose(
|
||||||
'### %s #%s renders%s frame %s###',
|
'### %s #%s renders a preview frame ###',
|
||||||
self.__class__.name, str(self.compPos),
|
self.__class__.name, str(self.compPos),
|
||||||
'' if args else ' a preview',
|
|
||||||
'' if not args else '%s ' % args[0],
|
|
||||||
)
|
)
|
||||||
return func(self, *args, **kwargs)
|
return func(self, *args, **kwargs)
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
|
@ -198,8 +196,8 @@ class ComponentMetaclass(type(QtCore.QObject)):
|
||||||
'names', # Class methods
|
'names', # Class methods
|
||||||
'error', 'audio', 'properties', # Properties
|
'error', 'audio', 'properties', # Properties
|
||||||
'preFrameRender', 'previewRender',
|
'preFrameRender', 'previewRender',
|
||||||
'frameRender', 'command',
|
'loadPreset', 'command',
|
||||||
'loadPreset', 'update', 'widget',
|
'update', 'widget',
|
||||||
)
|
)
|
||||||
|
|
||||||
# Auto-decorate methods
|
# Auto-decorate methods
|
||||||
|
@ -212,7 +210,7 @@ class ComponentMetaclass(type(QtCore.QObject)):
|
||||||
attrs[key] = property(attrs[key])
|
attrs[key] = property(attrs[key])
|
||||||
elif key == 'command':
|
elif key == 'command':
|
||||||
attrs[key] = cls.commandWrapper(attrs[key])
|
attrs[key] = cls.commandWrapper(attrs[key])
|
||||||
elif key in ('previewRender', 'frameRender'):
|
elif key == 'previewRender':
|
||||||
attrs[key] = cls.renderWrapper(attrs[key])
|
attrs[key] = cls.renderWrapper(attrs[key])
|
||||||
elif key == 'preFrameRender':
|
elif key == 'preFrameRender':
|
||||||
attrs[key] = cls.initializationWrapper(attrs[key])
|
attrs[key] = cls.initializationWrapper(attrs[key])
|
||||||
|
@ -298,16 +296,19 @@ class Component(QtCore.QObject, metaclass=ComponentMetaclass):
|
||||||
return self.__class__.name
|
return self.__class__.name
|
||||||
|
|
||||||
def __repr__(self):
|
def __repr__(self):
|
||||||
|
import pprint
|
||||||
try:
|
try:
|
||||||
preset = self.savePreset()
|
preset = self.savePreset()
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
preset = '%s occurred while saving preset' % str(e)
|
preset = '%s occurred while saving preset' % str(e)
|
||||||
|
|
||||||
return (
|
return (
|
||||||
'Component(%s, %s, Core)\n'
|
'Component(module %s, pos %s) (%s)\n'
|
||||||
'Name: %s v%s\n Preset: %s' % (
|
'Name: %s v%s\nPreset: %s' % (
|
||||||
self.moduleIndex, self.compPos,
|
self.moduleIndex, self.compPos,
|
||||||
self.__class__.name, str(self.__class__.version), preset
|
object.__repr__(self),
|
||||||
|
self.__class__.name, str(self.__class__.version),
|
||||||
|
pprint.pformat(preset)
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@ -886,12 +887,11 @@ class ComponentUpdate(QtWidgets.QUndoCommand):
|
||||||
def redo(self):
|
def redo(self):
|
||||||
if self.undone:
|
if self.undone:
|
||||||
log.debug('Redoing component update')
|
log.debug('Redoing component update')
|
||||||
self.parent.oldAttrs = self.relativeWidgetValsAfterUndo
|
self.parent.oldAttrs = self.relativeWidgetValsAfterUndo
|
||||||
self.setWidgetValues(self.modifiedVals)
|
self.setWidgetValues(self.modifiedVals)
|
||||||
self.parent.update(auto=True)
|
self.parent.update(auto=True)
|
||||||
self.parent.oldAttrs = None
|
self.parent.oldAttrs = None
|
||||||
else:
|
if not self.undone:
|
||||||
self.parent.setAttrs(self.modifiedVals)
|
|
||||||
self.relativeWidgetValsAfterRedo = {
|
self.relativeWidgetValsAfterRedo = {
|
||||||
attr: copy(getattr(self.parent, attr))
|
attr: copy(getattr(self.parent, attr))
|
||||||
for attr in self.parent._relativeWidgets
|
for attr in self.parent._relativeWidgets
|
||||||
|
|
|
@ -102,7 +102,7 @@ class Component(Component):
|
||||||
# Return a solid image at x, y
|
# Return a solid image at x, y
|
||||||
if self.fillType == 0:
|
if self.fillType == 0:
|
||||||
frame = BlankFrame(width, height)
|
frame = BlankFrame(width, height)
|
||||||
image = Image.new("RGBA", shapeSize, (r, g, b, 255))
|
image = FloodFrame(self.sizeWidth, self.sizeHeight, (r, g, b, 255))
|
||||||
frame.paste(image, box=(self.x, self.y))
|
frame.paste(image, box=(self.x, self.y))
|
||||||
return frame
|
return frame
|
||||||
|
|
||||||
|
|
|
@ -204,7 +204,7 @@
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>999999999</number>
|
<number>19200</number>
|
||||||
</property>
|
</property>
|
||||||
<property name="value">
|
<property name="value">
|
||||||
<number>0</number>
|
<number>0</number>
|
||||||
|
@ -239,7 +239,7 @@
|
||||||
</size>
|
</size>
|
||||||
</property>
|
</property>
|
||||||
<property name="maximum">
|
<property name="maximum">
|
||||||
<number>999999999</number>
|
<number>10800</number>
|
||||||
</property>
|
</property>
|
||||||
</widget>
|
</widget>
|
||||||
</item>
|
</item>
|
||||||
|
|
|
@ -2,10 +2,13 @@ from PIL import ImageEnhance, ImageFilter, ImageChops
|
||||||
from PyQt5.QtGui import QColor, QFont
|
from PyQt5.QtGui import QColor, QFont
|
||||||
from PyQt5 import QtGui, QtCore, QtWidgets
|
from PyQt5 import QtGui, QtCore, QtWidgets
|
||||||
import os
|
import os
|
||||||
|
import logging
|
||||||
|
|
||||||
from component import Component
|
from component import Component
|
||||||
from toolkit.frame import FramePainter, PaintColor
|
from toolkit.frame import FramePainter, PaintColor
|
||||||
|
|
||||||
|
log = logging.getLogger('AVP.Components.Text')
|
||||||
|
|
||||||
|
|
||||||
class Component(Component):
|
class Component(Component):
|
||||||
name = 'Title Text'
|
name = 'Title Text'
|
||||||
|
@ -76,16 +79,15 @@ class Component(Component):
|
||||||
def getXY(self):
|
def getXY(self):
|
||||||
'''Returns true x, y after considering alignment settings'''
|
'''Returns true x, y after considering alignment settings'''
|
||||||
fm = QtGui.QFontMetrics(self.titleFont)
|
fm = QtGui.QFontMetrics(self.titleFont)
|
||||||
if self.alignment == 0: # Left
|
x = self.pixelValForAttr('xPosition')
|
||||||
x = int(self.xPosition)
|
|
||||||
|
|
||||||
if self.alignment == 1: # Middle
|
if self.alignment == 1: # Middle
|
||||||
offset = int(fm.width(self.title)/2)
|
offset = int(fm.width(self.title)/2)
|
||||||
x = self.xPosition - offset
|
x -= offset
|
||||||
|
|
||||||
if self.alignment == 2: # Right
|
if self.alignment == 2: # Right
|
||||||
offset = fm.width(self.title)
|
offset = fm.width(self.title)
|
||||||
x = self.xPosition - offset
|
x -= offset
|
||||||
|
|
||||||
return x, self.yPosition
|
return x, self.yPosition
|
||||||
|
|
||||||
def loadPreset(self, pr, *args):
|
def loadPreset(self, pr, *args):
|
||||||
|
@ -137,6 +139,7 @@ class Component(Component):
|
||||||
|
|
||||||
image = FramePainter(width, height)
|
image = FramePainter(width, height)
|
||||||
x, y = self.getXY()
|
x, y = self.getXY()
|
||||||
|
log.debug('Text position translates to %s, %s', x, y)
|
||||||
if self.stroke > 0:
|
if self.stroke > 0:
|
||||||
outliner = QtGui.QPainterPathStroker()
|
outliner = QtGui.QPainterPathStroker()
|
||||||
outliner.setWidth(self.stroke)
|
outliner.setWidth(self.stroke)
|
||||||
|
|
|
@ -14,7 +14,7 @@ import toolkit
|
||||||
|
|
||||||
log = logging.getLogger('AVP.Core')
|
log = logging.getLogger('AVP.Core')
|
||||||
STDOUT_LOGLVL = logging.VERBOSE
|
STDOUT_LOGLVL = logging.VERBOSE
|
||||||
FILE_LOGLVL = logging.VERBOSE
|
FILE_LOGLVL = logging.DEBUG
|
||||||
|
|
||||||
|
|
||||||
class Core:
|
class Core:
|
||||||
|
@ -32,6 +32,11 @@ class Core:
|
||||||
self.savedPresets = {} # copies of presets to detect modification
|
self.savedPresets = {} # copies of presets to detect modification
|
||||||
self.openingProject = False
|
self.openingProject = False
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return "\n=~=~=~=\n".join(
|
||||||
|
[repr(comp) for comp in self.selectedComponents]
|
||||||
|
)
|
||||||
|
|
||||||
def importComponents(self):
|
def importComponents(self):
|
||||||
def findComponents():
|
def findComponents():
|
||||||
for f in os.listdir(Core.componentsPath):
|
for f in os.listdir(Core.componentsPath):
|
||||||
|
@ -482,7 +487,6 @@ class Core:
|
||||||
'854x480',
|
'854x480',
|
||||||
],
|
],
|
||||||
'FFMPEG_BIN': findFfmpeg(),
|
'FFMPEG_BIN': findFfmpeg(),
|
||||||
'windowHasFocus': False,
|
|
||||||
'canceled': False,
|
'canceled': False,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,6 +11,7 @@ from queue import Queue
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import signal
|
import signal
|
||||||
|
import atexit
|
||||||
import filecmp
|
import filecmp
|
||||||
import time
|
import time
|
||||||
import logging
|
import logging
|
||||||
|
@ -49,18 +50,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
self.window = window
|
self.window = window
|
||||||
self.core = Core()
|
self.core = Core()
|
||||||
Core.mode = 'GUI'
|
Core.mode = 'GUI'
|
||||||
|
|
||||||
# Find settings created by Core object
|
|
||||||
self.dataDir = Core.dataDir
|
|
||||||
self.presetDir = Core.presetDir
|
|
||||||
self.autosavePath = os.path.join(self.dataDir, 'autosave.avp')
|
|
||||||
self.settings = Core.settings
|
|
||||||
|
|
||||||
# Create stack of undoable user actions
|
|
||||||
self.undoStack = QtWidgets.QUndoStack(self)
|
|
||||||
undoLimit = self.settings.value("pref_undoLimit")
|
|
||||||
self.undoStack.setUndoLimit(undoLimit)
|
|
||||||
|
|
||||||
# widgets of component settings
|
# widgets of component settings
|
||||||
self.pages = []
|
self.pages = []
|
||||||
self.lastAutosave = time.time()
|
self.lastAutosave = time.time()
|
||||||
|
@ -69,6 +58,22 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
self.autosaveCooldown = 0.2
|
self.autosaveCooldown = 0.2
|
||||||
self.encoding = False
|
self.encoding = False
|
||||||
|
|
||||||
|
# Find settings created by Core object
|
||||||
|
self.dataDir = Core.dataDir
|
||||||
|
self.presetDir = Core.presetDir
|
||||||
|
self.autosavePath = os.path.join(self.dataDir, 'autosave.avp')
|
||||||
|
self.settings = Core.settings
|
||||||
|
|
||||||
|
# Register clean-up functions
|
||||||
|
signal.signal(signal.SIGINT, self.terminate)
|
||||||
|
atexit.register(self.cleanUp)
|
||||||
|
|
||||||
|
# Create stack of undoable user actions
|
||||||
|
self.undoStack = QtWidgets.QUndoStack(self)
|
||||||
|
undoLimit = self.settings.value("pref_undoLimit")
|
||||||
|
self.undoStack.setUndoLimit(undoLimit)
|
||||||
|
|
||||||
|
# Create Preset Manager
|
||||||
self.presetManager = PresetManager(
|
self.presetManager = PresetManager(
|
||||||
uic.loadUi(
|
uic.loadUi(
|
||||||
os.path.join(Core.wd, 'gui', 'presetmanager.ui')), self)
|
os.path.join(Core.wd, 'gui', 'presetmanager.ui')), self)
|
||||||
|
@ -97,7 +102,6 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
self.timer.start(timeout)
|
self.timer.start(timeout)
|
||||||
|
|
||||||
# Begin decorating the window and connecting events
|
# Begin decorating the window and connecting events
|
||||||
self.window.installEventFilter(self)
|
|
||||||
componentList = self.window.listWidget_componentList
|
componentList = self.window.listWidget_componentList
|
||||||
|
|
||||||
style = window.pushButton_undo.style()
|
style = window.pushButton_undo.style()
|
||||||
|
@ -391,24 +395,41 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
activated=lambda: self.moveComponent('bottom')
|
activated=lambda: self.moveComponent('bottom')
|
||||||
)
|
)
|
||||||
|
|
||||||
# Debug Hotkeys
|
|
||||||
QtWidgets.QShortcut(
|
QtWidgets.QShortcut(
|
||||||
"Ctrl+Alt+Shift+R", self.window, self.drawPreview
|
"Ctrl+Shift+F", self.window, self.showFfmpegCommand
|
||||||
)
|
)
|
||||||
QtWidgets.QShortcut(
|
QtWidgets.QShortcut(
|
||||||
"Ctrl+Alt+Shift+F", self.window, self.showFfmpegCommand
|
"Ctrl+Shift+U", self.window, self.showUndoStack
|
||||||
)
|
)
|
||||||
QtWidgets.QShortcut(
|
|
||||||
"Ctrl+Alt+Shift+U", self.window, self.showUndoStack
|
if log.isEnabledFor(logging.DEBUG):
|
||||||
|
QtWidgets.QShortcut(
|
||||||
|
"Ctrl+Alt+Shift+R", self.window, self.drawPreview
|
||||||
|
)
|
||||||
|
QtWidgets.QShortcut(
|
||||||
|
"Ctrl+Alt+Shift+A", self.window, lambda: log.debug(repr(self))
|
||||||
|
)
|
||||||
|
|
||||||
|
def __repr__(self):
|
||||||
|
return (
|
||||||
|
'\n%s\n'
|
||||||
|
'#####\n'
|
||||||
|
'Preview thread is %s\n' % (
|
||||||
|
repr(self.core),
|
||||||
|
'live' if self.previewThread.isRunning() else 'dead',
|
||||||
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
@QtCore.pyqtSlot()
|
|
||||||
def cleanUp(self, *args):
|
def cleanUp(self, *args):
|
||||||
log.info('Ending the preview thread')
|
log.info('Ending the preview thread')
|
||||||
self.timer.stop()
|
self.timer.stop()
|
||||||
self.previewThread.quit()
|
self.previewThread.quit()
|
||||||
self.previewThread.wait()
|
self.previewThread.wait()
|
||||||
|
|
||||||
|
def terminate(self, *args):
|
||||||
|
self.cleanUp()
|
||||||
|
sys.exit(0)
|
||||||
|
|
||||||
@disableWhenOpeningProject
|
@disableWhenOpeningProject
|
||||||
def updateWindowTitle(self):
|
def updateWindowTitle(self):
|
||||||
appName = 'Audio Visualizer'
|
appName = 'Audio Visualizer'
|
||||||
|
@ -542,7 +563,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
return True
|
return True
|
||||||
except FileNotFoundError:
|
except FileNotFoundError:
|
||||||
log.error(
|
log.error(
|
||||||
'Project file couldn\'t be located:', self.currentProject)
|
'Project file couldn\'t be located: %s', self.currentProject)
|
||||||
return identical
|
return identical
|
||||||
return False
|
return False
|
||||||
|
|
||||||
|
@ -639,6 +660,7 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
detail=detail,
|
detail=detail,
|
||||||
icon='Critical',
|
icon='Critical',
|
||||||
)
|
)
|
||||||
|
log.info('%s', repr(self))
|
||||||
|
|
||||||
def changeEncodingStatus(self, status):
|
def changeEncodingStatus(self, status):
|
||||||
self.encoding = status
|
self.encoding = status
|
||||||
|
@ -1017,12 +1039,3 @@ class MainWindow(QtWidgets.QMainWindow):
|
||||||
|
|
||||||
self.menu.move(parentPosition + QPos)
|
self.menu.move(parentPosition + QPos)
|
||||||
self.menu.show()
|
self.menu.show()
|
||||||
|
|
||||||
def eventFilter(self, object, event):
|
|
||||||
if event.type() == QtCore.QEvent.WindowActivate \
|
|
||||||
or event.type() == QtCore.QEvent.FocusIn:
|
|
||||||
Core.windowHasFocus = True
|
|
||||||
elif event.type() == QtCore.QEvent.WindowDeactivate \
|
|
||||||
or event.type() == QtCore.QEvent.FocusOut:
|
|
||||||
Core.windowHasFocus = False
|
|
||||||
return False
|
|
||||||
|
|
|
@ -60,3 +60,4 @@ class PreviewWindow(QtWidgets.QLabel):
|
||||||
icon='Critical',
|
icon='Critical',
|
||||||
parent=self
|
parent=self
|
||||||
)
|
)
|
||||||
|
log.info('%', repr(self.parent))
|
||||||
|
|
|
@ -36,8 +36,6 @@ def main():
|
||||||
|
|
||||||
elif mode == 'GUI':
|
elif mode == 'GUI':
|
||||||
from gui.mainwindow import MainWindow
|
from gui.mainwindow import MainWindow
|
||||||
import atexit
|
|
||||||
import signal
|
|
||||||
|
|
||||||
window = uic.loadUi(os.path.join(wd, "gui", "mainwindow.ui"))
|
window = uic.loadUi(os.path.join(wd, "gui", "mainwindow.ui"))
|
||||||
# window.adjustSize()
|
# window.adjustSize()
|
||||||
|
@ -56,9 +54,6 @@ def main():
|
||||||
log.debug("Finished creating main window")
|
log.debug("Finished creating main window")
|
||||||
window.raise_()
|
window.raise_()
|
||||||
|
|
||||||
signal.signal(signal.SIGINT, main.cleanUp)
|
|
||||||
atexit.register(main.cleanUp)
|
|
||||||
|
|
||||||
sys.exit(app.exec_())
|
sys.exit(app.exec_())
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|
|
@ -157,7 +157,7 @@ def findFfmpeg():
|
||||||
['ffmpeg', '-version'], stderr=f
|
['ffmpeg', '-version'], stderr=f
|
||||||
)
|
)
|
||||||
return "ffmpeg"
|
return "ffmpeg"
|
||||||
except subprocess.CalledProcessError:
|
except (subprocess.CalledProcessError, FileNotFoundError):
|
||||||
return "avconv"
|
return "avconv"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -21,7 +21,6 @@ class FramePainter(QtGui.QPainter):
|
||||||
Pillow image with finalize()
|
Pillow image with finalize()
|
||||||
'''
|
'''
|
||||||
def __init__(self, width, height):
|
def __init__(self, width, height):
|
||||||
log.verbose('Creating new FramePainter')
|
|
||||||
image = BlankFrame(width, height)
|
image = BlankFrame(width, height)
|
||||||
self.image = QtGui.QImage(ImageQt(image))
|
self.image = QtGui.QImage(ImageQt(image))
|
||||||
super().__init__(self.image)
|
super().__init__(self.image)
|
||||||
|
@ -78,8 +77,6 @@ def defaultSize(framefunc):
|
||||||
|
|
||||||
|
|
||||||
def FloodFrame(width, height, RgbaTuple):
|
def FloodFrame(width, height, RgbaTuple):
|
||||||
log.verbose('Creating new %s*%s %s flood frame' % (
|
|
||||||
width, height, RgbaTuple))
|
|
||||||
return Image.new("RGBA", (width, height), RgbaTuple)
|
return Image.new("RGBA", (width, height), RgbaTuple)
|
||||||
|
|
||||||
|
|
||||||
|
|
Reference in New Issue