~ubuntu-branches/ubuntu/quantal/veromix/quantal

« back to all changes in this revision

Viewing changes to contents/code/InfoWidget.py

  • Committer: Package Import Robot
  • Author(s): Nik Lutz
  • Date: 2011-09-25 18:05:00 UTC
  • Revision ID: package-import@ubuntu.com-20110925180500-6ip433wcg3lda7dn
Tags: upstream-0.13.1
ImportĀ upstreamĀ versionĀ 0.13.1

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
# -*- coding: utf-8 -*-
 
2
# copyright 2009  Nik Lutz
 
3
#
 
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.
 
8
#
 
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.
 
13
#
 
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
 
17
# USA
 
18
 
 
19
from PyKDE4.plasma import Plasma
 
20
from PyQt4.QtCore import *
 
21
from PyQt4.QtGui import *
 
22
from PyKDE4.kdeui import *
 
23
 
 
24
from LabelSlider import LabelSlider
 
25
 
 
26
class SinkInfoWidget(Plasma.TabBar):
 
27
 
 
28
    def __init__(self, veromix, sink):
 
29
        QGraphicsWidget.__init__(self)
 
30
        self.veromix = veromix
 
31
        self.sink = sink
 
32
        self.text = ""
 
33
        self.textwidget = None
 
34
        self.INFO_ICON = "hwinfo"
 
35
        self.sliders = []
 
36
        self.init()
 
37
 
 
38
    def init(self):
 
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()
 
46
 
 
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)
 
56
 
 
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)
 
61
 
 
62
        self.settings_layout = QGraphicsLinearLayout(Qt.Horizontal)
 
63
        self.settings_layout.setContentsMargins(0,0,0,0)
 
64
 
 
65
        self.settings_widget = QGraphicsWidget()
 
66
        self.settings_widget.setLayout(self.settings_layout)
 
67
 
 
68
        #self.setLayout(self.layout)
 
69
 
 
70
    def create_channel_sliders(self):
 
71
        self.slider_layout = QGraphicsLinearLayout(Qt.Vertical)
 
72
        self.slider_layout.setContentsMargins(0,0,0,0)
 
73
 
 
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)
 
85
 
 
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)
 
90
 
 
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())
 
96
 
 
97
    def update_with_info(self, info):
 
98
        self.text = ""
 
99
        values = info.props.keys()
 
100
        values.sort()
 
101
        for key in values:
 
102
            self.text += "<b>" + key + ":</b> "+ info.props[key]+"<br/>"
 
103
        if self.textwidget:
 
104
            self.textwidget.setText(self.text)
 
105
        self.set_slider_values()
 
106
        self.updateOutputSwitcher()
 
107
 
 
108
    def on_change_switcher(self,boolean):
 
109
        if boolean:
 
110
            self.sink.pa.set_default_sink(self.sink.index )
 
111
 
 
112
    def updateOutputSwitcher(self):
 
113
        self.switcher.nativeWidget().setChecked(self.sink.pa_sink.props["isdefault"] == "True")
 
114
 
 
115
    def on_show_message(self):
 
116
        pass
 
117
        #if self.veromix.applet.isPopupShowing():
 
118
            #self.veromix.applet.hidePopup()
 
119
        #self.veromix.showMessage(KIcon(self.INFO_ICON), self.text)
 
120
 
 
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()
 
125
            if name != "None":
 
126
                self.sliders[i].setBoldText(name)
 
127
            self.sliders[i].setValueFromPulse(channels[i].getVolume())
 
128
 
 
129
    def on_slider_cb(self, value):
 
130
        vol = []
 
131
        for slider in self.sliders:
 
132
            vol.append(slider.value())
 
133
        self.sink.pa.set_sink_volume(self.sink.index, vol)
 
134
 
 
135
 
 
136
 
 
137
 
 
138
class SinkInputInfoWidget(SinkInfoWidget):
 
139
 
 
140
    def __init__(self, veromix, sink):
 
141
        self.kill_text = "Terminate this sink"
 
142
        self.veromix = veromix
 
143
        self.sink = sink
 
144
        SinkInfoWidget.__init__(self, veromix, sink)
 
145
        self.veromix.sinkOutputChanged.connect(self.updateOutputSwitcher)
 
146
 
 
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)
 
156
 
 
157
    def create_switcher(self):
 
158
        self.switcher = Plasma.ComboBox()
 
159
        self.switcher.activated.connect(self.on_change_switcher)
 
160
 
 
161
    def keys_for_string(self,  string, values, props):
 
162
        text = ""
 
163
        rem = []
 
164
        for key in values:
 
165
            if key.startswith(string):
 
166
                k =  key.replace(string, "").lstrip(".").replace(".", " ")
 
167
                text += "<b>" + k + ":</b> "+ props[key] +"<br/>"
 
168
                rem.append(key)
 
169
        for x in rem:
 
170
            del values[values.index(x)]
 
171
        return text
 
172
 
 
173
    def updateOutputSwitcher(self):
 
174
        if self.switcher :
 
175
            pass
 
176
        else:
 
177
            return 0
 
178
        self.switcher.clear()
 
179
        outputs =  self.veromix.get_sinkoutput_widgets()
 
180
        ## fill combobox
 
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()
 
190
 
 
191
    def on_change_switcher(self,event):
 
192
        if self.switcher.text() == self.kill_text:
 
193
            self.sink.sink_input_kill()
 
194
            return 0
 
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))
 
199
                return 0
 
200
 
 
201
    def on_slider_cb(self, value):
 
202
        vol = []
 
203
        for slider in self.sliders:
 
204
            vol.append(slider.value())
 
205
        self.sink.pa.set_sink_input_volume(self.sink.index, vol)