show current playlist item using bold text
Stefan Schuermans

Stefan Schuermans commited on 2013-11-23 16:07:45
Showing 3 changed files, with 66 additions and 64 deletions.

... ...
@@ -1,6 +1,7 @@
1 1
 #! /usr/bin/env python
2 2
 
3 3
 import re
4
+import pango
4 5
 
5 6
 import time_fmt
6 7
 
... ...
@@ -40,11 +41,11 @@ class Playlist:
40 41
         self.entries.append({"type":     "normal",
41 42
                              "name":     name,
42 43
                              "duration": duration})
43
-        print("entry normal %s %f" % (self.entries[-1]["name"],
44
-                                      self.entries[-1]["duration"]))
44
+        #print("DEBUG playlist entry normal %s %f" %
45
+        #      (self.entries[-1]["name"], self.entries[-1]["duration"]))
45 46
       else:
46 47
         self.entries.append({"type": "stop"})
47
-        print("entry stop")
48
+        #print("DEBUG playlist entry stop")
48 49
     f.close()
49 50
 
50 51
   def update(self, store):
... ...
@@ -59,6 +60,6 @@ class Playlist:
59 60
       else:
60 61
         name = ""
61 62
         duration = "STOP"
62
-      store.append([idx, name, duration])
63
+      store.append([idx, pango.WEIGHT_NORMAL, name, duration])
63 64
       idx = idx + 1
64 65
 
... ...
@@ -24,10 +24,35 @@
24 24
                 <property name="visible">True</property>
25 25
                 <property name="can_focus">True</property>
26 26
                 <property name="model">PlaylistStore</property>
27
-                <signal name="cursor-changed" handler="onPlaylistClick" swapped="no"/>
28 27
                 <signal name="row-activated" handler="onPlaylistDblClick" swapped="no"/>
29 28
                 <child internal-child="selection">
30
-                  <object class="GtkTreeSelection" id="treeview-selection2"/>
29
+                  <object class="GtkTreeSelection" id="PlaylistViewSelection"/>
30
+                </child>
31
+                <child>
32
+                  <object class="GtkTreeViewColumn" id="PlaylistColumnName">
33
+                    <property name="title" translatable="yes">Name</property>
34
+                    <property name="sort_order">descending</property>
35
+                    <child>
36
+                      <object class="GtkCellRendererText" id="PlaylistCellRendererTextName"/>
37
+                      <attributes>
38
+                        <attribute name="text">2</attribute>
39
+                        <attribute name="weight">1</attribute>
40
+                      </attributes>
41
+                    </child>
42
+                  </object>
43
+                </child>
44
+                <child>
45
+                  <object class="GtkTreeViewColumn" id="PlaylistColumnDuration">
46
+                    <property name="title" translatable="yes">Duration</property>
47
+                    <child>
48
+                      <object class="GtkCellRendererText" id="PlaylistCellRendererTextDuration"/>
49
+                      <attributes>
50
+                        <attribute name="text">3</attribute>
51
+                        <attribute name="weight">1</attribute>
52
+                        <attribute name="foreground-rgba">0</attribute>
53
+                      </attributes>
54
+                    </child>
55
+                  </object>
31 56
                 </child>
32 57
               </object>
33 58
             </child>
... ...
@@ -285,28 +310,13 @@
285 310
     <columns>
286 311
       <!-- column-name EntryIdx -->
287 312
       <column type="guint"/>
313
+      <!-- column-name FontWeight -->
314
+      <column type="gint"/>
288 315
       <!-- column-name Name -->
289 316
       <column type="gchararray"/>
290
-      <!-- column-name Dauer -->
317
+      <!-- column-name Duration -->
291 318
       <column type="gchararray"/>
292 319
     </columns>
293
-    <data>
294
-      <row>
295
-        <col id="0">0</col>
296
-        <col id="1" translatable="yes">Erster Akt</col>
297
-        <col id="2" translatable="yes">1:00:00</col>
298
-      </row>
299
-      <row>
300
-        <col id="0">1</col>
301
-        <col id="1" translatable="yes">Zweiter Akt</col>
302
-        <col id="2" translatable="yes">23:42</col>
303
-      </row>
304
-      <row>
305
-        <col id="0">2</col>
306
-        <col id="1" translatable="yes">Weltuntergang</col>
307
-        <col id="2" translatable="yes">0.5</col>
308
-      </row>
309
-    </data>
310 320
   </object>
311 321
   <object class="GtkAdjustment" id="Position">
312 322
     <property name="upper">100</property>
... ...
@@ -3,6 +3,7 @@
3 3
 import os
4 4
 from gi.repository import Gtk
5 5
 import gobject
6
+import pango
6 7
 import time
7 8
 
8 9
 import playlist
... ...
@@ -25,10 +26,8 @@ class SyncGui:
25 26
     self.widBtnPause = self.builder.get_object("Pause")
26 27
     self.widBtnPlay = self.builder.get_object("Play")
27 28
     self.widStatus = self.builder.get_object("Status")
28
-    self.configPlaylistColumns()
29 29
     handlers = {
30 30
       "onDestroy":          self.onDestroy,
31
-      "onPlaylistClick":    self.onPlaylistClick,
32 31
       "onPlaylistDblClick": self.onPlaylistDblClick,
33 32
       "onNewPosition":      self.onNewPosition,
34 33
       "onPrevious":         self.onPrevious,
... ...
@@ -50,20 +49,9 @@ class SyncGui:
50 49
     self.stPosition = 0 # at begin of current entry
51 50
     self.stPlaying = False # not playing
52 51
     gobject.timeout_add(10, self.onTimer10ms)
53
-    self.updateDuration()
52
+    self.updateEntry()
54 53
     self.updateButtonVisibility()
55 54
 
56
-  def configPlaylistColumns(self):
57
-    """configure the columns of the playlist widget at program start"""
58
-    i = 1 # first column is index (not shown)
59
-    for title in ["Name", "Dauer"]:
60
-      column = Gtk.TreeViewColumn(title)
61
-      self.widPlaylistView.append_column(column)
62
-      cell = Gtk.CellRendererText()
63
-      column.pack_start(cell, False)
64
-      column.add_attribute(cell, "text", i)
65
-      i = i + 1
66
-
67 55
   def showPosition(self):
68 56
     """update the position texts next to the position slider"""
69 57
     # format current time and remaining time
... ...
@@ -104,6 +92,24 @@ class SyncGui:
104 92
     # update position of slider
105 93
     self.updatePosition()
106 94
 
95
+  def updateEntry(self):
96
+    """update current entry of playlist and duration, position, ..."""
97
+    # sanity check for entry index
98
+    if self.stEntryIdx < -1 or self.stEntryIdx >= len(self.playlist.entries):
99
+      self.stEntryIdx = -1
100
+    # make current entry bold, all others non-bold
101
+    def update(model, path, it, user_data):
102
+      (idx,) = model.get(it, 0)
103
+      if idx == self.stEntryIdx:
104
+        weight = pango.WEIGHT_BOLD
105
+      else:
106
+        weight = pango.WEIGHT_NORMAL
107
+      print("DEBUG sync_gui idx=%d weight=%d" % (idx, weight))
108
+      model.set(it, 1, weight)
109
+    self.widPlaylistStore.foreach(update, None)
110
+    # update duration, position, ...
111
+    self.updateDuration()
112
+
107 113
   def updateButtonVisibility(self):
108 114
     """update the visibility of the buttons based on if playing or not"""
109 115
     self.widBtnPause.set_visible(self.stPlaying)
... ...
@@ -113,21 +119,6 @@ class SyncGui:
113 119
     """window will be destroyed"""
114 120
     Gtk.main_quit()
115 121
 
116
-  def onPlaylistClick(self, widget):
117
-    """playlist entry has been clicked or selected"""
118
-    # get index of selected entry
119
-    idx = -1
120
-    sel = self.widPlaylistView.get_selection()
121
-    if sel is not None:
122
-      (model, it) = sel.get_selected()
123
-      if it is not None:
124
-        (idx, ) = model.get(it, 0)
125
-    print("DEBUG: playlist click idx=%d" % (idx))
126
-    # update playlist entry
127
-    self.stEntryIdx = idx
128
-    # update duration
129
-    self.updateDuration()
130
-
131 122
   def onPlaylistDblClick(self, widget, row, col):
132 123
     """playlist entry has been double-clicked"""
133 124
     # get index of selected entry
... ...
@@ -137,17 +128,17 @@ class SyncGui:
137 128
       (model, it) = sel.get_selected()
138 129
       if it is not None:
139 130
         (idx,) = model.get(it, 0)
140
-    print("DEBUG: playlist double-click idx=%d" % (idx))
131
+    print("DEBUG sync_gui playlist double-click idx=%d" % (idx))
141 132
     # update playlist entry
142 133
     self.stEntryIdx = idx
143
-    # update duration
144
-    self.updateDuration()
134
+    # update entry
135
+    self.updateEntry()
145 136
     # start playing
146 137
     # TODO
147 138
 
148 139
   def onNewPosition(self, widget, scroll, value):
149 140
     """slider has been moved to a new position"""
150
-    print("DEBUG: new position " + str(value));
141
+    print("DEBUG sync_gui new position " + str(value));
151 142
     # clamp position to valid range
152 143
     if value < 0:
153 144
       value = 0
... ...
@@ -160,15 +151,15 @@ class SyncGui:
160 151
 
161 152
   def onPrevious(self, widget):
162 153
     """previous button as been pressed"""
163
-    print("DEBUG: previous")
154
+    print("DEBUG sync_gui previous")
164 155
 
165 156
   def onBackward(self, widget):
166 157
     """backward button has been pressed"""
167
-    print("DEBUG: backward")
158
+    print("DEBUG sync_gui backward")
168 159
 
169 160
   def onStop(self, widget):
170 161
     """stop button has been pressed"""
171
-    print("DEBUG: stop")
162
+    print("DEBUG sync_gui stop")
172 163
     self.stPlaying = False
173 164
     self.stPosition = 0 # stop goes back to begin
174 165
     self.updatePosition()
... ...
@@ -176,24 +167,24 @@ class SyncGui:
176 167
 
177 168
   def onPause(self, widget):
178 169
     """pause button has been pressed"""
179
-    print("DEBUG: pause")
170
+    print("DEBUG sync_gui pause")
180 171
     self.stPlaying = False
181 172
     self.updateButtonVisibility()
182 173
 
183 174
   def onPlay(self, widget):
184 175
     """play button has been pressed"""
185
-    print("DEBUG: play")
176
+    print("DEBUG sync_gui play")
186 177
     self.stPlaying = True
187 178
     self.updatePosition()
188 179
     self.updateButtonVisibility()
189 180
 
190 181
   def onForward(self, widget):
191 182
     """forward button has been pressed"""
192
-    print("DEBUG: forward")
183
+    print("DEBUG sync_gui forward")
193 184
 
194 185
   def onNext(self, widget):
195 186
     """next button has been pressed"""
196
-    print("DEBUG: next")
187
+    print("DEBUG sync_gui next")
197 188
 
198 189
   def onTimer10ms(self):
199 190
     """timer callback, every 10ms"""
200 191