1
# -*- coding: utf-8 -*-
2
# copyright 2009 Nik Lutz
4
# This program is free software; you can redistribute it and/or modify
5
# it under the terms of the GNU General Public License as published by
6
# the Free Software Foundation; either version 3 of the License, or
7
# (at your option) any later version.
9
# This program is distributed in the hope that it will be useful,
10
# but WITHOUT ANY WARRANTY; without even the implied warranty of
11
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12
# GNU General Public License for more details.
14
# You should have received a copy of the GNU General Public License
15
# along with this library; if not, write to the Free Software
16
# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
19
from PyKDE4.plasma import Plasma
20
from PyQt4.QtCore import *
21
from PyQt4.QtGui import *
22
from PyKDE4.kdeui import *
24
from LabelSlider import LabelSlider
26
class SinkInfoWidget(Plasma.TabBar):
28
def __init__(self, veromix, sink):
29
QGraphicsWidget.__init__(self)
30
self.veromix = veromix
33
self.textwidget = None
34
self.INFO_ICON = "hwinfo"
39
self.textwidget = Plasma.TextBrowser()
40
self.textwidget.setText("<b>Info</b>")
41
self.init_arrangement()
42
self.create_text_area()
43
self.create_switcher()
44
self.create_channel_sliders()
45
self.compose_arrangement()
47
def compose_arrangement(self):
48
self.settings_layout.addItem(self.switcher)
49
self.settings_layout.addStretch()
50
self.settings_layout.addItem(self.button)
51
#self.layout.addItem(self.settings_widget)
52
#self.layout.addItem(self.slider_widget)
53
self.addTab("Pan", self.slider_widget)
54
self.addTab("Settings", self.settings_widget)
55
self.addTab("Info", self.textwidget)
57
def init_arrangement(self):
58
#self.layout = QGraphicsLinearLayout(Qt.Vertical)
59
#self.layout.setContentsMargins(42,0,42,0)
60
self.layout().setContentsMargins(42,0,42,0)
62
self.settings_layout = QGraphicsLinearLayout(Qt.Horizontal)
63
self.settings_layout.setContentsMargins(0,0,0,0)
65
self.settings_widget = QGraphicsWidget()
66
self.settings_widget.setLayout(self.settings_layout)
68
#self.setLayout(self.layout)
70
def create_channel_sliders(self):
71
self.slider_layout = QGraphicsLinearLayout(Qt.Vertical)
72
self.slider_layout.setContentsMargins(0,0,0,0)
74
self.slider_widget = QGraphicsWidget()
75
self.slider_widget.setLayout(self.slider_layout)
76
for channel in self.sink.pa_sink.getChannels():
77
slider = LabelSlider()
78
slider.setOrientation(Qt.Horizontal)
79
slider.setBoldText(channel.getName())
80
slider.setValue(channel.getVolume())
81
slider.setMaximum(100)
82
slider.volumeChanged.connect(self.on_slider_cb)
83
self.sliders.append(slider)
84
self.slider_layout.addItem(slider)
86
def create_text_area(self):
87
self.button = Plasma.PushButton()
88
self.button.setIcon(KIcon(self.INFO_ICON))
89
self.button.clicked.connect(self.on_show_message)
91
def create_switcher(self):
92
self.switcher = Plasma.CheckBox()
93
self.switcher.toggled.connect(self.on_change_switcher)
94
self.switcher.setText("Default")
95
self.switcher.setMinimumSize(self.switcher.preferredSize())
97
def update_with_info(self, info):
99
values = info.props.keys()
102
self.text += "<b>" + key + ":</b> "+ info.props[key]+"<br/>"
104
self.textwidget.setText(self.text)
105
self.set_slider_values()
106
self.updateOutputSwitcher()
108
def on_change_switcher(self,boolean):
110
self.sink.pa.set_default_sink(self.sink.index )
112
def updateOutputSwitcher(self):
113
self.switcher.nativeWidget().setChecked(self.sink.pa_sink.props["isdefault"] == "True")
115
def on_show_message(self):
117
#if self.veromix.applet.isPopupShowing():
118
#self.veromix.applet.hidePopup()
119
#self.veromix.showMessage(KIcon(self.INFO_ICON), self.text)
121
def set_slider_values(self):
122
channels = self.sink.pa_sink.getChannels()
123
for i in range(0,len(channels)):
124
name = channels[i].getName()
126
self.sliders[i].setBoldText(name)
127
self.sliders[i].setValueFromPulse(channels[i].getVolume())
129
def on_slider_cb(self, value):
131
for slider in self.sliders:
132
vol.append(slider.value())
133
self.sink.pa.set_sink_volume(self.sink.index, vol)
138
class SinkInputInfoWidget(SinkInfoWidget):
140
def __init__(self, veromix, sink):
141
self.kill_text = "Terminate this sink"
142
self.veromix = veromix
144
SinkInfoWidget.__init__(self, veromix, sink)
145
self.veromix.sinkOutputChanged.connect(self.updateOutputSwitcher)
147
def compose_arrangement(self):
148
self.settings_layout.addStretch()
149
self.settings_layout.addItem(self.switcher)
150
self.settings_layout.addItem(self.button)
151
#self.layout.addItem(self.settings_widget)
152
#self.layout.addItem(self.slider_widget)
153
self.addTab("Pan", self.slider_widget)
154
self.addTab("Settings", self.settings_widget)
155
self.addTab("Info", self.textwidget)
157
def create_switcher(self):
158
self.switcher = Plasma.ComboBox()
159
self.switcher.activated.connect(self.on_change_switcher)
161
def keys_for_string(self, string, values, props):
165
if key.startswith(string):
166
k = key.replace(string, "").lstrip(".").replace(".", " ")
167
text += "<b>" + k + ":</b> "+ props[key] +"<br/>"
170
del values[values.index(x)]
173
def updateOutputSwitcher(self):
178
self.switcher.clear()
179
outputs = self.veromix.get_sinkoutput_widgets()
181
for output in outputs:
182
self.switcher.addItem(output.app)
183
self.switcher.addItem(self.kill_text)
184
## set current selection
185
for output in outputs:
186
if int(output.index) == int(self.sink.getOutputIndex()) :
187
self.switcher.nativeWidget().setCurrentIndex(self.veromix.get_sinkoutput_widgets().index(output))
188
self.switcher.setMinimumSize(self.switcher.preferredSize())
189
#self.switcher.adjustSize()
191
def on_change_switcher(self,event):
192
if self.switcher.text() == self.kill_text:
193
self.sink.sink_input_kill()
195
# search ouputs for text, and move sink_input
196
for output in self.veromix.get_sinkoutput_widgets():
197
if self.switcher.text() == output.app:
198
self.sink.pa.move_sink_input(self.sink.index, int(output.index))
201
def on_slider_cb(self, value):
203
for slider in self.sliders:
204
vol.append(slider.value())
205
self.sink.pa.set_sink_input_volume(self.sink.index, vol)