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