1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
|
from PyQt4 import QtGui
from collections import OrderedDict
import string
import os
import core
class PresetManager(QtGui.QDialog):
def __init__(self, window, parent):
super().__init__()
self.parent = parent
self.presetDir = os.path.join(self.parent.dataDir, 'presets')
self.window = window
self.findPresets()
self.lastFilter = '*'
# create filter box and preset list
self.drawFilterList()
self.window.comboBox_filter.currentIndexChanged.connect(
lambda: self.drawPresetList(self.window.comboBox_filter.currentText())
)
self.drawPresetList('*')
# make auto-completion for search bar
self.autocomplete = QtGui.QStringListModel()
completer = QtGui.QCompleter()
completer.setModel(self.autocomplete)
self.window.lineEdit_search.setCompleter(completer)
def show(self):
presetNames = []
for presetList in self.presets.values():
for preset in presetList:
presetNames.append(preset[1])
self.autocomplete.setStringList(presetNames)
self.findPresets()
self.drawFilterList()
self.drawPresetList('*')
self.window.show()
def findPresets(self):
parseList = []
for dirpath, dirnames, filenames in os.walk(self.presetDir):
# anything without a subdirectory must be a preset folder
if dirnames:
continue
for preset in filenames:
compName = os.path.basename(os.path.dirname(dirpath))
compVers = os.path.basename(dirpath)
try:
parseList.append((compName, int(compVers), preset))
except ValueError:
continue
self.presets =\
{
compName : \
[
(vers, preset) \
for name, vers, preset in parseList \
if name == compName \
] \
for compName, _, __ in parseList \
}
def drawPresetList(self, filter=None):
self.window.listWidget_presets.clear()
if filter:
self.lastFilter = str(filter)
else:
filter = str(self.lastFilter)
for component, presets in self.presets.items():
if filter != '*' and component != filter:
continue
for vers, preset in presets:
self.window.listWidget_presets.addItem('%s: %s' % (component, preset))
def drawFilterList(self):
self.window.comboBox_filter.clear()
self.window.comboBox_filter.addItem('*')
for component in self.presets:
self.window.comboBox_filter.addItem(component)
def openSavePresetDialog(self):
window = self.parent.window
if window.listWidget_componentList.currentRow() == -1:
return
while True:
dialog = QtGui.QInputDialog(
QtGui.QWidget(), 'Audio Visualizer', 'New Preset Name:')
dialog.setTextValue()
newName, OK = dialog.getText()
badName = False
for letter in newName:
if letter in string.punctuation:
badName = True
if badName:
# some filesystems don't like bizarre characters
self.parent.showMessage(msg=\
'''Preset names must contain only letters, numbers, and spaces.''')
continue
if OK and newName:
index = window.listWidget_componentList.currentRow()
if index != -1:
saveValueStore = \
self.parent.selectedComponents[index].savePreset()
componentName = str(self.parent.selectedComponents[index]).strip()
vers = self.parent.selectedComponents[index].version()
self.createPresetFile(
componentName, vers, saveValueStore, newName)
break
def createPresetFile(self, compName, vers, saveValueStore, filename):
dirname = os.path.join(self.presetDir, compName, str(vers))
if not os.path.exists(dirname):
os.makedirs(dirname)
filepath = os.path.join(dirname, filename)
if os.path.exists(filepath):
ch = self.parent.showMessage(
msg="%s already exists! Overwrite it?" % filename,
showCancel=True, icon=QtGui.QMessageBox.Warning)
if not ch:
return
with open(filepath, 'w') as f:
f.write(core.Core.stringOrderedDict(saveValueStore))
self.drawPresetList()
def openPreset(self, presetName):
index = self.parent.window.listWidget_componentList.currentRow()
if index == -1:
return
componentName = str(self.parent.selectedComponents[index]).strip()
version = self.parent.selectedComponents[index].version()
dirname = os.path.join(self.presetDir, componentName, str(version))
filepath = os.path.join(dirname, presetName)
if not os.path.exists(filepath):
return
with open(filepath, 'r') as f:
for line in f:
saveValueStore = dict(eval(line.strip()))
break
self.parent.selectedComponents[index].loadPreset(saveValueStore)
self.parent.drawPreview()
|