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:
tassaron 2017-08-26 21:23:44 -04:00
parent 62e2ef18a3
commit 85d3b779d0
10 changed files with 77 additions and 64 deletions

View File

@ -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

View File

@ -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

View File

@ -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>

View File

@ -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)

View File

@ -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,
} }

View File

@ -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

View File

@ -60,3 +60,4 @@ class PreviewWindow(QtWidgets.QLabel):
icon='Critical', icon='Critical',
parent=self parent=self
) )
log.info('%', repr(self.parent))

View File

@ -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__":

View File

@ -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"

View File

@ -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)