commit
1bb67d1513
|
@ -0,0 +1,51 @@
|
||||||
|
from cx_Freeze import setup, Executable
|
||||||
|
import sys
|
||||||
|
|
||||||
|
# Dependencies are automatically detected, but it might need
|
||||||
|
# fine tuning.
|
||||||
|
|
||||||
|
buildOptions = dict(
|
||||||
|
packages=[],
|
||||||
|
excludes=[
|
||||||
|
"apport",
|
||||||
|
"apt",
|
||||||
|
"curses",
|
||||||
|
"distutils",
|
||||||
|
"email",
|
||||||
|
"html",
|
||||||
|
"http",
|
||||||
|
"xmlrpc",
|
||||||
|
"nose"
|
||||||
|
],
|
||||||
|
include_files=[
|
||||||
|
"mainwindow.ui",
|
||||||
|
"presetmanager.ui",
|
||||||
|
"background.png",
|
||||||
|
"encoder-options.json",
|
||||||
|
"components/"
|
||||||
|
],
|
||||||
|
includes=[
|
||||||
|
'numpy.core._methods',
|
||||||
|
'numpy.lib.format'
|
||||||
|
]
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
base = 'Win32GUI' if sys.platform == 'win32' else None
|
||||||
|
|
||||||
|
executables = [
|
||||||
|
Executable(
|
||||||
|
'main.py',
|
||||||
|
base=base,
|
||||||
|
targetName='audio-visualizer-python'
|
||||||
|
)
|
||||||
|
]
|
||||||
|
|
||||||
|
|
||||||
|
setup(
|
||||||
|
name='audio-visualizer-python',
|
||||||
|
version='1.0',
|
||||||
|
description='GUI tool to render visualization videos of audio files',
|
||||||
|
options=dict(build_exe=buildOptions),
|
||||||
|
executables=executables
|
||||||
|
)
|
70
setup.py
70
setup.py
|
@ -1,51 +1,19 @@
|
||||||
from cx_Freeze import setup, Executable
|
+from setuptools import setup, find_packages
|
||||||
import sys
|
|
||||||
|
-# Dependencies are automatically detected, but it might need +setup(name='audio_visualizer_python',
|
||||||
# Dependencies are automatically detected, but it might need
|
-# fine tuning. + version='1.0',
|
||||||
# fine tuning.
|
-buildOptions = dict(packages = [], excludes = [ + description='a little GUI tool to render visualization \
|
||||||
|
- "apport", + videos of audio files',
|
||||||
buildOptions = dict(
|
- "apt", + license='MIT',
|
||||||
packages=[],
|
- "ctypes", + url='https://github.com/djfun/audio-visualizer-python',
|
||||||
excludes=[
|
- "curses", + packages=find_packages(),
|
||||||
"apport",
|
- "distutils", + package_data={
|
||||||
"apt",
|
- "email", + 'src': ['*'],
|
||||||
"curses",
|
- "html", + },
|
||||||
"distutils",
|
- "http", + install_requires=['pillow-simd', 'numpy', ''],
|
||||||
"email",
|
- "json", + entry_points={
|
||||||
"html",
|
- "xmlrpc", + 'gui_scripts': [
|
||||||
"http",
|
- "nose" + 'audio-visualizer-python = avpython.main:main'
|
||||||
"xmlrpc",
|
- ], include_files = ["main.ui"]) + ]
|
||||||
"nose"
|
- + }
|
||||||
],
|
-import sys + )
|
||||||
include_files=[
|
|
||||||
"mainwindow.ui",
|
|
||||||
"presetmanager.ui",
|
|
||||||
"background.png",
|
|
||||||
"encoder-options.json",
|
|
||||||
"components/"
|
|
||||||
],
|
|
||||||
includes=[
|
|
||||||
'numpy.core._methods',
|
|
||||||
'numpy.lib.format'
|
|
||||||
]
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
base = 'Win32GUI' if sys.platform == 'win32' else None
|
|
||||||
|
|
||||||
executables = [
|
|
||||||
Executable(
|
|
||||||
'main.py',
|
|
||||||
base=base,
|
|
||||||
targetName='audio-visualizer-python'
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
|
|
||||||
setup(
|
|
||||||
name='audio-visualizer-python',
|
|
||||||
version='1.0',
|
|
||||||
description='GUI tool to render visualization videos of audio files',
|
|
||||||
options=dict(build_exe=buildOptions),
|
|
||||||
executables=executables
|
|
||||||
)
|
|
Before Width: | Height: | Size: 44 KiB After Width: | Height: | Size: 44 KiB |
|
@ -22,9 +22,9 @@ class Command(QtCore.QObject):
|
||||||
self.parser = argparse.ArgumentParser(
|
self.parser = argparse.ArgumentParser(
|
||||||
description='Create a visualization for an audio file',
|
description='Create a visualization for an audio file',
|
||||||
epilog='EXAMPLE COMMAND: main.py myvideotemplate.avp '
|
epilog='EXAMPLE COMMAND: main.py myvideotemplate.avp '
|
||||||
'-i ~/Music/song.mp3 -o ~/video.mp4 '
|
'-i ~/Music/song.mp3 -o ~/video.mp4 '
|
||||||
'-c 0 image path=~/Pictures/thisWeeksPicture.jpg '
|
'-c 0 image path=~/Pictures/thisWeeksPicture.jpg '
|
||||||
'-c 1 video "preset=My Logo" -c 2 vis layout=classic')
|
'-c 1 video "preset=My Logo" -c 2 vis layout=classic')
|
||||||
self.parser.add_argument(
|
self.parser.add_argument(
|
||||||
'-i', '--input', metavar='SOUND',
|
'-i', '--input', metavar='SOUND',
|
||||||
help='input audio file')
|
help='input audio file')
|
||||||
|
@ -113,10 +113,11 @@ class Command(QtCore.QObject):
|
||||||
if name.capitalize() in compName:
|
if name.capitalize() in compName:
|
||||||
return compName
|
return compName
|
||||||
|
|
||||||
compFileNames = [ \
|
compFileNames = [
|
||||||
os.path.splitext(os.path.basename(
|
os.path.splitext(
|
||||||
mod.__file__))[0] \
|
os.path.basename(mod.__file__)
|
||||||
for mod in self.core.modules \
|
)[0]
|
||||||
|
for mod in self.core.modules
|
||||||
]
|
]
|
||||||
for i, compFileName in enumerate(compFileNames):
|
for i, compFileName in enumerate(compFileNames):
|
||||||
if name.lower() in compFileName:
|
if name.lower() in compFileName:
|
|
@ -1,4 +1,4 @@
|
||||||
from PyQt4 import QtGui, QtCore
|
from PyQt5 import QtGui, QtCore, QtWidgets
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
@ -89,8 +89,8 @@ class Component(QtCore.QObject):
|
||||||
and return this as an RGB string and QPushButton stylesheet.
|
and return this as an RGB string and QPushButton stylesheet.
|
||||||
In a subclass apply stylesheet to any color selection widgets
|
In a subclass apply stylesheet to any color selection widgets
|
||||||
'''
|
'''
|
||||||
dialog = QtGui.QColorDialog()
|
dialog = QtWidgets.QColorDialog()
|
||||||
dialog.setOption(QtGui.QColorDialog.ShowAlphaChannel, True)
|
dialog.setOption(QtWidgets.QColorDialog.ShowAlphaChannel, True)
|
||||||
color = dialog.getColor()
|
color = dialog.getColor()
|
||||||
if color.isValid():
|
if color.isValid():
|
||||||
RGBstring = '%s,%s,%s' % (
|
RGBstring = '%s,%s,%s' % (
|
|
@ -1,6 +1,6 @@
|
||||||
from PIL import Image, ImageDraw
|
from PIL import Image, ImageDraw
|
||||||
from PyQt4 import uic, QtGui, QtCore
|
from PyQt5 import uic, QtGui, QtCore, QtWidgets
|
||||||
from PyQt4.QtGui import QColor
|
from PyQt5.QtGui import QColor
|
||||||
from PIL.ImageQt import ImageQt
|
from PIL.ImageQt import ImageQt
|
||||||
import os
|
import os
|
||||||
from . import __base__
|
from . import __base__
|
|
@ -1,5 +1,5 @@
|
||||||
from PIL import Image, ImageDraw
|
from PIL import Image, ImageDraw
|
||||||
from PyQt4 import uic, QtGui, QtCore
|
from PyQt5 import uic, QtGui, QtCore, QtWidgets
|
||||||
import os
|
import os
|
||||||
from . import __base__
|
from . import __base__
|
||||||
|
|
||||||
|
@ -85,7 +85,7 @@ class Component(__base__.Component):
|
||||||
|
|
||||||
def pickImage(self):
|
def pickImage(self):
|
||||||
imgDir = self.settings.value("backgroundDir", os.path.expanduser("~"))
|
imgDir = self.settings.value("backgroundDir", os.path.expanduser("~"))
|
||||||
filename = QtGui.QFileDialog.getOpenFileName(
|
filename, _ = QtWidgets.QFileDialog.getOpenFileName(
|
||||||
self.page, "Choose Image", imgDir,
|
self.page, "Choose Image", imgDir,
|
||||||
"Image Files (%s)" % " ".join(self.imageFormats))
|
"Image Files (%s)" % " ".join(self.imageFormats))
|
||||||
if filename:
|
if filename:
|
|
@ -1,7 +1,7 @@
|
||||||
import numpy
|
import numpy
|
||||||
from PIL import Image, ImageDraw
|
from PIL import Image, ImageDraw
|
||||||
from PyQt4 import uic, QtGui, QtCore
|
from PyQt5 import uic, QtGui, QtCore, QtWidgets
|
||||||
from PyQt4.QtGui import QColor
|
from PyQt5.QtGui import QColor
|
||||||
import os
|
import os
|
||||||
from . import __base__
|
from . import __base__
|
||||||
import time
|
import time
|
|
@ -1,6 +1,6 @@
|
||||||
from PIL import Image, ImageDraw
|
from PIL import Image, ImageDraw
|
||||||
from PyQt4.QtGui import QPainter, QColor, QFont
|
from PyQt5.QtGui import QPainter, QColor, QFont
|
||||||
from PyQt4 import uic, QtGui, QtCore
|
from PyQt5 import uic, QtGui, QtCore, QtWidgets
|
||||||
from PIL.ImageQt import ImageQt
|
from PIL.ImageQt import ImageQt
|
||||||
import os
|
import os
|
||||||
import io
|
import io
|
||||||
|
@ -138,7 +138,7 @@ class Component(__base__.Component):
|
||||||
painter.drawText(x, y, self.title)
|
painter.drawText(x, y, self.title)
|
||||||
painter.end()
|
painter.end()
|
||||||
|
|
||||||
imBytes = image.bits().asstring(image.numBytes())
|
imBytes = image.bits().asstring(image.byteCount())
|
||||||
|
|
||||||
return Image.frombytes('RGBA', (width, height), imBytes)
|
return Image.frombytes('RGBA', (width, height), imBytes)
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
from PIL import Image, ImageDraw
|
from PIL import Image, ImageDraw
|
||||||
from PyQt4 import uic, QtGui, QtCore
|
from PyQt5 import uic, QtGui, QtCore, QtWidgets
|
||||||
import os
|
import os
|
||||||
import subprocess
|
import subprocess
|
||||||
import threading
|
import threading
|
||||||
|
@ -180,7 +180,7 @@ class Component(__base__.Component):
|
||||||
|
|
||||||
def pickVideo(self):
|
def pickVideo(self):
|
||||||
imgDir = self.settings.value("backgroundDir", os.path.expanduser("~"))
|
imgDir = self.settings.value("backgroundDir", os.path.expanduser("~"))
|
||||||
filename = QtGui.QFileDialog.getOpenFileName(
|
filename, _ = QtWidgets.QFileDialog.getOpenFileName(
|
||||||
self.page, "Choose Video",
|
self.page, "Choose Video",
|
||||||
imgDir, "Video Files (%s)" % " ".join(self.videoFormats)
|
imgDir, "Video Files (%s)" % " ".join(self.videoFormats)
|
||||||
)
|
)
|
|
@ -1,7 +1,7 @@
|
||||||
import sys
|
import sys
|
||||||
import io
|
import io
|
||||||
import os
|
import os
|
||||||
from PyQt4 import QtCore, QtGui, uic
|
from PyQt5 import QtCore, QtGui, uic
|
||||||
from os.path import expanduser
|
from os.path import expanduser
|
||||||
import subprocess as sp
|
import subprocess as sp
|
||||||
import numpy
|
import numpy
|
||||||
|
@ -11,7 +11,7 @@ import time
|
||||||
from collections import OrderedDict
|
from collections import OrderedDict
|
||||||
import json
|
import json
|
||||||
from importlib import import_module
|
from importlib import import_module
|
||||||
from PyQt4.QtGui import QDesktopServices
|
from PyQt5.QtCore import QStandardPaths
|
||||||
import string
|
import string
|
||||||
|
|
||||||
|
|
||||||
|
@ -19,8 +19,9 @@ class Core():
|
||||||
|
|
||||||
def __init__(self):
|
def __init__(self):
|
||||||
self.FFMPEG_BIN = self.findFfmpeg()
|
self.FFMPEG_BIN = self.findFfmpeg()
|
||||||
self.dataDir = QDesktopServices.storageLocation(
|
self.dataDir = QStandardPaths.writableLocation(
|
||||||
QDesktopServices.DataLocation)
|
QStandardPaths.AppConfigLocation
|
||||||
|
)
|
||||||
self.presetDir = os.path.join(self.dataDir, 'presets')
|
self.presetDir = os.path.join(self.dataDir, 'presets')
|
||||||
if getattr(sys, 'frozen', False):
|
if getattr(sys, 'frozen', False):
|
||||||
# frozen
|
# frozen
|
||||||
|
@ -178,8 +179,7 @@ class Core():
|
||||||
clearThis = False
|
clearThis = False
|
||||||
|
|
||||||
# add loaded named presets to savedPresets dict
|
# add loaded named presets to savedPresets dict
|
||||||
if 'preset' in preset and \
|
if 'preset' in preset and preset['preset'] is not None:
|
||||||
preset['preset'] is not None:
|
|
||||||
nam = preset['preset']
|
nam = preset['preset']
|
||||||
filepath2 = os.path.join(
|
filepath2 = os.path.join(
|
||||||
self.presetDir, name, str(vers), nam)
|
self.presetDir, name, str(vers), nam)
|
||||||
|
@ -200,8 +200,7 @@ class Core():
|
||||||
break
|
break
|
||||||
|
|
||||||
try:
|
try:
|
||||||
if 'preset' in preset and \
|
if 'preset' in preset and preset['preset'] is not None:
|
||||||
preset['preset'] is not None:
|
|
||||||
self.selectedComponents[i].loadPreset(
|
self.selectedComponents[i].loadPreset(
|
||||||
preset
|
preset
|
||||||
)
|
)
|
||||||
|
@ -331,8 +330,7 @@ class Core():
|
||||||
return False
|
return False
|
||||||
|
|
||||||
def createPresetFile(
|
def createPresetFile(
|
||||||
self, compName, vers, presetName,
|
self, compName, vers, presetName, saveValueStore, filepath=''):
|
||||||
saveValueStore, filepath=''):
|
|
||||||
'''Create a preset file (.avl) at filepath using args.
|
'''Create a preset file (.avl) at filepath using args.
|
||||||
Or if filepath is empty, create an internal preset using args'''
|
Or if filepath is empty, create an internal preset using args'''
|
||||||
if not filepath:
|
if not filepath:
|
|
@ -1,4 +1,4 @@
|
||||||
from PyQt4 import QtGui, uic
|
from PyQt5 import QtGui, uic, QtWidgets
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
|
|
||||||
|
@ -48,9 +48,9 @@ if __name__ == "__main__":
|
||||||
# normal gui launch
|
# normal gui launch
|
||||||
proj = None
|
proj = None
|
||||||
|
|
||||||
app = QtGui.QApplication(sys.argv)
|
app = QtWidgets.QApplication(sys.argv)
|
||||||
app.setApplicationName("audio-visualizer")
|
app.setApplicationName("audio-visualizer")
|
||||||
app.setOrganizationName("audio-visualizer")
|
# app.setOrganizationName("audio-visualizer")
|
||||||
|
|
||||||
if mode == 'cmd':
|
if mode == 'cmd':
|
||||||
from command import *
|
from command import *
|
||||||
|
@ -71,7 +71,7 @@ if __name__ == "__main__":
|
||||||
|
|
||||||
window = uic.loadUi(os.path.join(wd, "mainwindow.ui"))
|
window = uic.loadUi(os.path.join(wd, "mainwindow.ui"))
|
||||||
# window.adjustSize()
|
# window.adjustSize()
|
||||||
desc = QtGui.QDesktopWidget()
|
desc = QtWidgets.QDesktopWidget()
|
||||||
dpi = desc.physicalDpiX()
|
dpi = desc.physicalDpiX()
|
||||||
|
|
||||||
topMargin = 0 if (dpi == 96) else int(10 * (dpi / 96))
|
topMargin = 0 if (dpi == 96) else int(10 * (dpi / 96))
|
|
@ -1,7 +1,7 @@
|
||||||
from queue import Queue
|
from queue import Queue
|
||||||
from PyQt4 import QtCore, QtGui, uic
|
from PyQt5 import QtCore, QtGui, uic, QtWidgets
|
||||||
from PyQt4.QtCore import QSettings, Qt
|
from PyQt5.QtCore import QSettings, Qt
|
||||||
from PyQt4.QtGui import QMenu, QShortcut
|
from PyQt5.QtWidgets import QMenu, QShortcut
|
||||||
import sys
|
import sys
|
||||||
import os
|
import os
|
||||||
import signal
|
import signal
|
||||||
|
@ -15,11 +15,11 @@ from presetmanager import PresetManager
|
||||||
from main import LoadDefaultSettings
|
from main import LoadDefaultSettings
|
||||||
|
|
||||||
|
|
||||||
class PreviewWindow(QtGui.QLabel):
|
class PreviewWindow(QtWidgets.QLabel):
|
||||||
def __init__(self, parent, img):
|
def __init__(self, parent, img):
|
||||||
super(PreviewWindow, self).__init__()
|
super(PreviewWindow, self).__init__()
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
self.setFrameStyle(QtGui.QFrame.StyledPanel)
|
self.setFrameStyle(QtWidgets.QFrame.StyledPanel)
|
||||||
self.pixmap = QtGui.QPixmap(img)
|
self.pixmap = QtGui.QPixmap(img)
|
||||||
|
|
||||||
def paintEvent(self, event):
|
def paintEvent(self, event):
|
||||||
|
@ -39,14 +39,14 @@ class PreviewWindow(QtGui.QLabel):
|
||||||
self.repaint()
|
self.repaint()
|
||||||
|
|
||||||
|
|
||||||
class MainWindow(QtGui.QMainWindow):
|
class MainWindow(QtWidgets.QMainWindow):
|
||||||
|
|
||||||
newTask = QtCore.pyqtSignal(list)
|
newTask = QtCore.pyqtSignal(list)
|
||||||
processTask = QtCore.pyqtSignal()
|
processTask = QtCore.pyqtSignal()
|
||||||
videoTask = QtCore.pyqtSignal(str, str, list)
|
videoTask = QtCore.pyqtSignal(str, str, list)
|
||||||
|
|
||||||
def __init__(self, window, project):
|
def __init__(self, window, project):
|
||||||
QtGui.QMainWindow.__init__(self)
|
QtWidgets.QMainWindow.__init__(self)
|
||||||
|
|
||||||
# print('main thread id: {}'.format(QtCore.QThread.currentThreadId()))
|
# print('main thread id: {}'.format(QtCore.QThread.currentThreadId()))
|
||||||
self.window = window
|
self.window = window
|
||||||
|
@ -116,7 +116,6 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
codec = window.comboBox_videoCodec.itemText(i)
|
codec = window.comboBox_videoCodec.itemText(i)
|
||||||
if codec == self.settings.value('outputVideoCodec'):
|
if codec == self.settings.value('outputVideoCodec'):
|
||||||
window.comboBox_videoCodec.setCurrentIndex(i)
|
window.comboBox_videoCodec.setCurrentIndex(i)
|
||||||
#print(codec)
|
|
||||||
|
|
||||||
for i in range(window.comboBox_audioCodec.count()):
|
for i in range(window.comboBox_audioCodec.count()):
|
||||||
codec = window.comboBox_audioCodec.itemText(i)
|
codec = window.comboBox_audioCodec.itemText(i)
|
||||||
|
@ -146,10 +145,11 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
|
|
||||||
# Make component buttons
|
# Make component buttons
|
||||||
self.compMenu = QMenu()
|
self.compMenu = QMenu()
|
||||||
|
self.compActions = []
|
||||||
for i, comp in enumerate(self.core.modules):
|
for i, comp in enumerate(self.core.modules):
|
||||||
action = self.compMenu.addAction(comp.Component.__doc__)
|
action = self.compMenu.addAction(comp.Component.__doc__)
|
||||||
action.triggered[()].connect(
|
action.triggered.connect(
|
||||||
lambda item=i: self.core.insertComponent(0, item, self))
|
lambda _, item=i: self.core.insertComponent(0, item, self))
|
||||||
|
|
||||||
self.window.pushButton_addComponent.setMenu(self.compMenu)
|
self.window.pushButton_addComponent.setMenu(self.compMenu)
|
||||||
|
|
||||||
|
@ -160,12 +160,10 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
self.window.pushButton_removeComponent.clicked.connect(
|
self.window.pushButton_removeComponent.clicked.connect(
|
||||||
lambda _: self.removeComponent())
|
lambda _: self.removeComponent())
|
||||||
|
|
||||||
componentList.setContextMenuPolicy(
|
componentList.setContextMenuPolicy(QtCore.Qt.CustomContextMenu)
|
||||||
QtCore.Qt.CustomContextMenu)
|
componentList.customContextMenuRequested.connect(
|
||||||
componentList.connect(
|
self.componentContextMenu
|
||||||
componentList,
|
)
|
||||||
QtCore.SIGNAL("customContextMenuRequested(QPoint)"),
|
|
||||||
self.componentContextMenu)
|
|
||||||
|
|
||||||
currentRes = str(self.settings.value('outputWidth'))+'x' + \
|
currentRes = str(self.settings.value('outputWidth'))+'x' + \
|
||||||
str(self.settings.value('outputHeight'))
|
str(self.settings.value('outputHeight'))
|
||||||
|
@ -188,19 +186,19 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
self.projectMenu = QMenu()
|
self.projectMenu = QMenu()
|
||||||
self.window.menuButton_newProject = self.projectMenu.addAction(
|
self.window.menuButton_newProject = self.projectMenu.addAction(
|
||||||
"New Project")
|
"New Project")
|
||||||
self.window.menuButton_newProject.triggered[()].connect(
|
self.window.menuButton_newProject.triggered.connect(
|
||||||
self.createNewProject)
|
self.createNewProject)
|
||||||
|
|
||||||
self.window.menuButton_openProject = self.projectMenu.addAction(
|
self.window.menuButton_openProject = self.projectMenu.addAction(
|
||||||
"Open Project")
|
"Open Project")
|
||||||
self.window.menuButton_openProject.triggered[()].connect(
|
self.window.menuButton_openProject.triggered.connect(
|
||||||
self.openOpenProjectDialog)
|
self.openOpenProjectDialog)
|
||||||
|
|
||||||
action = self.projectMenu.addAction("Save Project")
|
action = self.projectMenu.addAction("Save Project")
|
||||||
action.triggered[()].connect(self.saveCurrentProject)
|
action.triggered.connect(self.saveCurrentProject)
|
||||||
|
|
||||||
action = self.projectMenu.addAction("Save Project As")
|
action = self.projectMenu.addAction("Save Project As")
|
||||||
action.triggered[()].connect(self.openSaveProjectDialog)
|
action.triggered.connect(self.openSaveProjectDialog)
|
||||||
|
|
||||||
self.window.pushButton_projects.setMenu(self.projectMenu)
|
self.window.pushButton_projects.setMenu(self.projectMenu)
|
||||||
|
|
||||||
|
@ -243,27 +241,38 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
self.drawPreview(True)
|
self.drawPreview(True)
|
||||||
|
|
||||||
# Setup Hotkeys
|
# Setup Hotkeys
|
||||||
QtGui.QShortcut("Ctrl+S", self.window, self.saveCurrentProject)
|
QtWidgets.QShortcut("Ctrl+S", self.window, self.saveCurrentProject)
|
||||||
QtGui.QShortcut("Ctrl+A", self.window, self.openSaveProjectDialog)
|
QtWidgets.QShortcut("Ctrl+A", self.window, self.openSaveProjectDialog)
|
||||||
QtGui.QShortcut("Ctrl+O", self.window, self.openOpenProjectDialog)
|
QtWidgets.QShortcut("Ctrl+O", self.window, self.openOpenProjectDialog)
|
||||||
QtGui.QShortcut("Ctrl+N", self.window, self.createNewProject)
|
QtWidgets.QShortcut("Ctrl+N", self.window, self.createNewProject)
|
||||||
|
|
||||||
QtGui.QShortcut("Ctrl+T", self.window, activated=lambda:
|
QtWidgets.QShortcut(
|
||||||
self.window.pushButton_addComponent.click())
|
"Ctrl+T", self.window,
|
||||||
QtGui.QShortcut("Ctrl+Space", self.window, activated=lambda:
|
activated=lambda: self.window.pushButton_addComponent.click()
|
||||||
self.window.listWidget_componentList.setFocus())
|
)
|
||||||
QtGui.QShortcut("Ctrl+Shift+S", self.window,
|
QtWidgets.QShortcut(
|
||||||
self.presetManager.openSavePresetDialog)
|
"Ctrl+Space", self.window,
|
||||||
QtGui.QShortcut("Ctrl+Shift+C", self.window,
|
activated=lambda: self.window.listWidget_componentList.setFocus()
|
||||||
self.presetManager.clearPreset)
|
)
|
||||||
|
QtWidgets.QShortcut(
|
||||||
|
"Ctrl+Shift+S", self.window,
|
||||||
|
self.presetManager.openSavePresetDialog
|
||||||
|
)
|
||||||
|
QtWidgets.QShortcut(
|
||||||
|
"Ctrl+Shift+C", self.window, self.presetManager.clearPreset
|
||||||
|
)
|
||||||
|
|
||||||
QtGui.QShortcut("Ctrl+Up", self.window,
|
QtWidgets.QShortcut(
|
||||||
activated=lambda: self.moveComponent(-1))
|
"Ctrl+Up", self.window,
|
||||||
QtGui.QShortcut("Ctrl+Down", self.window,
|
activated=lambda: self.moveComponent(-1)
|
||||||
activated=lambda: self.moveComponent(1))
|
)
|
||||||
QtGui.QShortcut("Ctrl+Home", self.window, self.moveComponentTop)
|
QtWidgets.QShortcut(
|
||||||
QtGui.QShortcut("Ctrl+End", self.window, self.moveComponentBottom)
|
"Ctrl+Down", self.window,
|
||||||
QtGui.QShortcut("Ctrl+r", self.window, self.removeComponent)
|
activated=lambda: self.moveComponent(1)
|
||||||
|
)
|
||||||
|
QtWidgets.QShortcut("Ctrl+Home", self.window, self.moveComponentTop)
|
||||||
|
QtWidgets.QShortcut("Ctrl+End", self.window, self.moveComponentBottom)
|
||||||
|
QtWidgets.QShortcut("Ctrl+r", self.window, self.removeComponent)
|
||||||
|
|
||||||
def cleanUp(self):
|
def cleanUp(self):
|
||||||
self.timer.stop()
|
self.timer.stop()
|
||||||
|
@ -283,7 +292,7 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
def updateComponentTitle(self, pos, presetStore=False):
|
def updateComponentTitle(self, pos, presetStore=False):
|
||||||
if type(presetStore) == dict:
|
if type(presetStore) == dict:
|
||||||
name = presetStore['preset']
|
name = presetStore['preset']
|
||||||
if name == None or name not in self.core.savedPresets:
|
if name is None or name not in self.core.savedPresets:
|
||||||
modified = False
|
modified = False
|
||||||
else:
|
else:
|
||||||
modified = (presetStore != self.core.savedPresets[name])
|
modified = (presetStore != self.core.savedPresets[name])
|
||||||
|
@ -365,21 +374,22 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
def openInputFileDialog(self):
|
def openInputFileDialog(self):
|
||||||
inputDir = self.settings.value("inputDir", os.path.expanduser("~"))
|
inputDir = self.settings.value("inputDir", os.path.expanduser("~"))
|
||||||
|
|
||||||
fileName = QtGui.QFileDialog.getOpenFileName(
|
fileName, _ = QtWidgets.QFileDialog.getOpenFileName(
|
||||||
self.window, "Open Audio File",
|
self.window, "Open Audio File",
|
||||||
inputDir, "Audio Files (%s)" % " ".join(self.core.audioFormats))
|
inputDir, "Audio Files (%s)" % " ".join(self.core.audioFormats))
|
||||||
|
|
||||||
if not fileName == "":
|
if fileName:
|
||||||
self.settings.setValue("inputDir", os.path.dirname(fileName))
|
self.settings.setValue("inputDir", os.path.dirname(fileName))
|
||||||
self.window.lineEdit_audioFile.setText(fileName)
|
self.window.lineEdit_audioFile.setText(fileName)
|
||||||
|
|
||||||
def openOutputFileDialog(self):
|
def openOutputFileDialog(self):
|
||||||
outputDir = self.settings.value("outputDir", os.path.expanduser("~"))
|
outputDir = self.settings.value("outputDir", os.path.expanduser("~"))
|
||||||
|
|
||||||
fileName = QtGui.QFileDialog.getSaveFileName(
|
fileName, _ = QtWidgets.QFileDialog.getSaveFileName(
|
||||||
self.window, "Set Output Video File",
|
self.window, "Set Output Video File",
|
||||||
outputDir,
|
outputDir,
|
||||||
"Video Files (%s);; All Files (*)" % " ".join(self.core.videoFormats))
|
"Video Files (%s);; All Files (*)" % " ".join(
|
||||||
|
self.core.videoFormats))
|
||||||
|
|
||||||
if not fileName == "":
|
if not fileName == "":
|
||||||
self.settings.setValue("outputDir", os.path.dirname(fileName))
|
self.settings.setValue("outputDir", os.path.dirname(fileName))
|
||||||
|
@ -550,13 +560,13 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
'''Drop event for the component listwidget'''
|
'''Drop event for the component listwidget'''
|
||||||
componentList = self.window.listWidget_componentList
|
componentList = self.window.listWidget_componentList
|
||||||
|
|
||||||
modelIndexes = [ \
|
modelIndexes = [
|
||||||
componentList.model().index(i) \
|
componentList.model().index(i)
|
||||||
for i in range(componentList.count()) \
|
for i in range(componentList.count())
|
||||||
]
|
]
|
||||||
rects = [ \
|
rects = [
|
||||||
componentList.visualRect(modelIndex) \
|
componentList.visualRect(modelIndex)
|
||||||
for modelIndex in modelIndexes \
|
for modelIndex in modelIndexes
|
||||||
]
|
]
|
||||||
|
|
||||||
rowPos = [rect.contains(event.pos()) for rect in rects]
|
rowPos = [rect.contains(event.pos()) for rect in rects]
|
||||||
|
@ -605,9 +615,10 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
if self.autosaveExists(identical=False):
|
if self.autosaveExists(identical=False):
|
||||||
ch = self.showMessage(
|
ch = self.showMessage(
|
||||||
msg="You have unsaved changes in project '%s'. "
|
msg="You have unsaved changes in project '%s'. "
|
||||||
"Save before %s?" % \
|
"Save before %s?" % (
|
||||||
(os.path.basename(self.currentProject)[:-4],
|
os.path.basename(self.currentProject)[:-4],
|
||||||
phrase),
|
phrase
|
||||||
|
),
|
||||||
showCancel=True)
|
showCancel=True)
|
||||||
if ch:
|
if ch:
|
||||||
success = self.saveProjectChanges()
|
success = self.saveProjectChanges()
|
||||||
|
@ -616,7 +627,7 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
os.remove(self.autosavePath)
|
os.remove(self.autosavePath)
|
||||||
|
|
||||||
def openSaveProjectDialog(self):
|
def openSaveProjectDialog(self):
|
||||||
filename = QtGui.QFileDialog.getSaveFileName(
|
filename, _ = QtWidgets.QFileDialog.getSaveFileName(
|
||||||
self.window, "Create Project File",
|
self.window, "Create Project File",
|
||||||
self.settings.value("projectDir"),
|
self.settings.value("projectDir"),
|
||||||
"Project Files (*.avp)")
|
"Project Files (*.avp)")
|
||||||
|
@ -631,7 +642,7 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
self.core.createProjectFile(filename)
|
self.core.createProjectFile(filename)
|
||||||
|
|
||||||
def openOpenProjectDialog(self):
|
def openOpenProjectDialog(self):
|
||||||
filename = QtGui.QFileDialog.getOpenFileName(
|
filename, _ = QtWidgets.QFileDialog.getOpenFileName(
|
||||||
self.window, "Open Project File",
|
self.window, "Open Project File",
|
||||||
self.settings.value("projectDir"),
|
self.settings.value("projectDir"),
|
||||||
"Project Files (*.avp)")
|
"Project Files (*.avp)")
|
||||||
|
@ -660,17 +671,19 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
|
|
||||||
def showMessage(self, **kwargs):
|
def showMessage(self, **kwargs):
|
||||||
parent = kwargs['parent'] if 'parent' in kwargs else self.window
|
parent = kwargs['parent'] if 'parent' in kwargs else self.window
|
||||||
msg = QtGui.QMessageBox(parent)
|
msg = QtWidgets.QMessageBox(parent)
|
||||||
msg.setModal(True)
|
msg.setModal(True)
|
||||||
msg.setText(kwargs['msg'])
|
msg.setText(kwargs['msg'])
|
||||||
msg.setIcon(
|
msg.setIcon(
|
||||||
kwargs['icon'] if 'icon' in kwargs else QtGui.QMessageBox.Information)
|
kwargs['icon']
|
||||||
|
if 'icon' in kwargs else QtWidgets.QMessageBox.Information
|
||||||
|
)
|
||||||
msg.setDetailedText(kwargs['detail'] if 'detail' in kwargs else None)
|
msg.setDetailedText(kwargs['detail'] if 'detail' in kwargs else None)
|
||||||
if 'showCancel'in kwargs and kwargs['showCancel']:
|
if 'showCancel'in kwargs and kwargs['showCancel']:
|
||||||
msg.setStandardButtons(
|
msg.setStandardButtons(
|
||||||
QtGui.QMessageBox.Ok | QtGui.QMessageBox.Cancel)
|
QtWidgets.QMessageBox.Ok | QtWidgets.QMessageBox.Cancel)
|
||||||
else:
|
else:
|
||||||
msg.setStandardButtons(QtGui.QMessageBox.Ok)
|
msg.setStandardButtons(QtWidgets.QMessageBox.Ok)
|
||||||
ch = msg.exec_()
|
ch = msg.exec_()
|
||||||
if ch == 1024:
|
if ch == 1024:
|
||||||
return True
|
return True
|
||||||
|
@ -690,7 +703,7 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
return
|
return
|
||||||
|
|
||||||
self.presetManager.findPresets()
|
self.presetManager.findPresets()
|
||||||
self.menu = QtGui.QMenu()
|
self.menu = QMenu()
|
||||||
menuItem = self.menu.addAction("Save Preset")
|
menuItem = self.menu.addAction("Save Preset")
|
||||||
menuItem.triggered.connect(
|
menuItem.triggered.connect(
|
||||||
self.presetManager.openSavePresetDialog
|
self.presetManager.openSavePresetDialog
|
||||||
|
@ -698,8 +711,10 @@ class MainWindow(QtGui.QMainWindow):
|
||||||
|
|
||||||
# submenu for opening presets
|
# submenu for opening presets
|
||||||
try:
|
try:
|
||||||
presets = self.presetManager.presets[str(self.core.selectedComponents[index])]
|
presets = self.presetManager.presets[
|
||||||
self.submenu = QtGui.QMenu("Open Preset")
|
str(self.core.selectedComponents[index])
|
||||||
|
]
|
||||||
|
self.submenu = QMenu("Open Preset")
|
||||||
self.menu.addMenu(self.submenu)
|
self.menu.addMenu(self.submenu)
|
||||||
|
|
||||||
for version, presetName in presets:
|
for version, presetName in presets:
|
|
@ -1,11 +1,11 @@
|
||||||
from PyQt4 import QtGui, QtCore
|
from PyQt5 import QtCore, QtWidgets
|
||||||
import string
|
import string
|
||||||
import os
|
import os
|
||||||
|
|
||||||
import core
|
import core
|
||||||
|
|
||||||
|
|
||||||
class PresetManager(QtGui.QDialog):
|
class PresetManager(QtWidgets.QDialog):
|
||||||
def __init__(self, window, parent):
|
def __init__(self, window, parent):
|
||||||
super().__init__(parent.window)
|
super().__init__(parent.window)
|
||||||
self.parent = parent
|
self.parent = parent
|
||||||
|
@ -52,8 +52,8 @@ class PresetManager(QtGui.QDialog):
|
||||||
)
|
)
|
||||||
|
|
||||||
# make auto-completion for search bar
|
# make auto-completion for search bar
|
||||||
self.autocomplete = QtGui.QStringListModel()
|
self.autocomplete = QtCore.QStringListModel()
|
||||||
completer = QtGui.QCompleter()
|
completer = QtWidgets.QCompleter()
|
||||||
completer.setModel(self.autocomplete)
|
completer.setModel(self.autocomplete)
|
||||||
self.window.lineEdit_search.setCompleter(completer)
|
self.window.lineEdit_search.setCompleter(completer)
|
||||||
self.window.lineEdit_search.textChanged.connect(
|
self.window.lineEdit_search.textChanged.connect(
|
||||||
|
@ -136,11 +136,11 @@ class PresetManager(QtGui.QDialog):
|
||||||
while True:
|
while True:
|
||||||
index = componentList.currentRow()
|
index = componentList.currentRow()
|
||||||
currentPreset = selectedComponents[index].currentPreset
|
currentPreset = selectedComponents[index].currentPreset
|
||||||
newName, OK = QtGui.QInputDialog.getText(
|
newName, OK = QtWidgets.QInputDialog.getText(
|
||||||
self.parent.window,
|
self.parent.window,
|
||||||
'Audio Visualizer',
|
'Audio Visualizer',
|
||||||
'New Preset Name:',
|
'New Preset Name:',
|
||||||
QtGui.QLineEdit.Normal,
|
QtWidgets.QLineEdit.Normal,
|
||||||
currentPreset
|
currentPreset
|
||||||
)
|
)
|
||||||
if OK:
|
if OK:
|
||||||
|
@ -175,7 +175,7 @@ class PresetManager(QtGui.QDialog):
|
||||||
msg="%s already exists! Overwrite it?" %
|
msg="%s already exists! Overwrite it?" %
|
||||||
os.path.basename(path),
|
os.path.basename(path),
|
||||||
showCancel=True,
|
showCancel=True,
|
||||||
icon=QtGui.QMessageBox.Warning,
|
icon=QtWidgets.QMessageBox.Warning,
|
||||||
parent=window)
|
parent=window)
|
||||||
if not ch:
|
if not ch:
|
||||||
# user clicked cancel
|
# user clicked cancel
|
||||||
|
@ -208,7 +208,7 @@ class PresetManager(QtGui.QDialog):
|
||||||
ch = self.parent.showMessage(
|
ch = self.parent.showMessage(
|
||||||
msg='Really delete %s?' % name,
|
msg='Really delete %s?' % name,
|
||||||
showCancel=True,
|
showCancel=True,
|
||||||
icon=QtGui.QMessageBox.Warning,
|
icon=QtWidgets.QMessageBox.Warning,
|
||||||
parent=self.window
|
parent=self.window
|
||||||
)
|
)
|
||||||
if not ch:
|
if not ch:
|
||||||
|
@ -235,11 +235,11 @@ class PresetManager(QtGui.QDialog):
|
||||||
|
|
||||||
while True:
|
while True:
|
||||||
index = presetList.currentRow()
|
index = presetList.currentRow()
|
||||||
newName, OK = QtGui.QInputDialog.getText(
|
newName, OK = QtWidgets.QInputDialog.getText(
|
||||||
self.window,
|
self.window,
|
||||||
'Preset Manager',
|
'Preset Manager',
|
||||||
'Rename Preset:',
|
'Rename Preset:',
|
||||||
QtGui.QLineEdit.Normal,
|
QtWidgets.QLineEdit.Normal,
|
||||||
self.presetRows[index][2]
|
self.presetRows[index][2]
|
||||||
)
|
)
|
||||||
if OK:
|
if OK:
|
||||||
|
@ -262,7 +262,7 @@ class PresetManager(QtGui.QDialog):
|
||||||
break
|
break
|
||||||
|
|
||||||
def openImportDialog(self):
|
def openImportDialog(self):
|
||||||
filename = QtGui.QFileDialog.getOpenFileName(
|
filename, _ = QtWidgets.QFileDialog.getOpenFileName(
|
||||||
self.window, "Import Preset File",
|
self.window, "Import Preset File",
|
||||||
self.settings.value("presetDir"),
|
self.settings.value("presetDir"),
|
||||||
"Preset Files (*.avl)")
|
"Preset Files (*.avl)")
|
||||||
|
@ -287,7 +287,7 @@ class PresetManager(QtGui.QDialog):
|
||||||
def openExportDialog(self):
|
def openExportDialog(self):
|
||||||
if not self.window.listWidget_presets.selectedItems():
|
if not self.window.listWidget_presets.selectedItems():
|
||||||
return
|
return
|
||||||
filename = QtGui.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)")
|
|
@ -1,5 +1,5 @@
|
||||||
from PyQt4 import QtCore, QtGui, uic
|
from PyQt5 import QtCore, QtGui, uic
|
||||||
from PyQt4.QtCore import pyqtSignal, pyqtSlot
|
from PyQt5.QtCore import pyqtSignal, pyqtSlot
|
||||||
from PIL import Image
|
from PIL import Image
|
||||||
from PIL.ImageQt import ImageQt
|
from PIL.ImageQt import ImageQt
|
||||||
import core
|
import core
|
||||||
|
@ -25,7 +25,7 @@ class Worker(QtCore.QObject):
|
||||||
self.background.paste(Image.open(os.path.join(
|
self.background.paste(Image.open(os.path.join(
|
||||||
self.core.wd, "background.png")))
|
self.core.wd, "background.png")))
|
||||||
|
|
||||||
@pyqtSlot(str, list)
|
@pyqtSlot(list)
|
||||||
def createPreviewImage(self, components):
|
def createPreviewImage(self, components):
|
||||||
dic = {
|
dic = {
|
||||||
"components": components,
|
"components": components,
|
|
@ -1,5 +1,5 @@
|
||||||
from PyQt4 import QtCore, QtGui, uic
|
from PyQt5 import QtCore, QtGui, uic
|
||||||
from PyQt4.QtCore import pyqtSignal, pyqtSlot
|
from PyQt5.QtCore import pyqtSignal, pyqtSlot
|
||||||
from PIL import Image, ImageDraw, ImageFont
|
from PIL import Image, ImageDraw, ImageFont
|
||||||
from PIL.ImageQt import ImageQt
|
from PIL.ImageQt import ImageQt
|
||||||
import core
|
import core
|
Reference in New Issue