~andrebask/cometsound/cometsound

« back to all changes in this revision

Viewing changes to src/View.py

  • Committer: andrebask
  • Date: 2012-06-27 19:20:51 UTC
  • Revision ID: git-v1:a9346d331f04adcb4cbc1b3913e8ca1ffc30e273
Fixes

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
1
##
2
 
#    Project: CometSound - A music player written in Python 
 
2
#    Project: CometSound - A music player written in Python
3
3
#    Author: Andrea Bernardini <andrebask@gmail.com>
4
4
#    Copyright: 2010-2012 Andrea Bernardini
5
5
#    License: GPL-2+
43
43
 
44
44
class View(gtk.Window):
45
45
    """Main GTK+ window"""
46
 
    
47
 
    formatDict = {'mp3': True, 'wma': True, 'ogg': True, 'flac': True, 
 
46
 
 
47
    formatDict = {'mp3': True, 'wma': True, 'ogg': True, 'flac': True,
48
48
                  'm4a': True, 'mp4': True, 'aac': True, 'wav': True,
49
49
                  'ape': True, 'mpc': True, 'wv': True}
50
 
        
 
50
 
51
51
    def __init__(self, model, control):
52
 
        
 
52
 
53
53
        gtk.Window.__init__(self)
54
54
        self.model = model
55
55
        self.control = control
56
56
        self.set_title('CometSound')
57
57
        self.control.registerView(self)
58
 
        
59
 
        
 
58
 
 
59
 
60
60
        # Create the toplevel window
61
61
        self.connect('destroy', lambda w: self.destroy())
62
62
        self.minwidth = 733 #int(self.get_screen().get_width() / 2.5)
71
71
            framepos = int(self.minwidth * 0.7)
72
72
            self.volume = 10
73
73
        self.set_size_request(self.minwidth, self.minheight)
74
 
        self.resize(self.width, self.height) 
 
74
        self.resize(self.width, self.height)
75
75
        self.set_position(gtk.WIN_POS_CENTER)
76
76
        self.connect('expose-event', self.storeSize)
77
77
        self.icon = gtk.Image()
79
79
        self.pix = self.icon.get_pixbuf().scale_simple(48, 48, gtk.gdk.INTERP_BILINEAR)
80
80
        self.set_icon(self.pix)
81
81
        self.tray = None
82
 
        
 
82
 
83
83
        self.createSlider()
84
 
        
 
84
 
85
85
        self.createPrimaryToolbar()
86
 
        
 
86
 
87
87
        self.setStatusIcon()
88
 
        
 
88
 
89
89
        self.columns = columns
90
90
        self.filesTree = FilesFrame(None, self.control, self.formatDict, self.columns)
91
91
        self.playlistFrame = PlaylistFrame(self.control)
92
 
        
 
92
 
93
93
        self.framebox.pack1(self.filesTree)
94
94
        self.framebox.pack2(self.playlistFrame, False, False)
95
95
        self.framebox.set_position(framepos)
100
100
        sbar = gtk.Statusbar()
101
101
        sbar.set_size_request(0,20)
102
102
        self.statusbar = sbar
103
 
        
104
 
        self.vbox.set_spacing(0)                             
 
103
 
 
104
        self.vbox.set_spacing(0)
105
105
        self.vbox.pack_start(self.menubar, False)
106
106
        self.vbox.pack_start(self.imageToolbar, False)
107
107
        self.vbox.pack_start(self.hbox, False)
109
109
        self.vbox.pack_start(sbar, False)
110
110
        self.vbox.pack_start(self.progressBar, False)
111
111
        self.show_all()
112
 
        
 
112
 
113
113
        if self.control.settings['scrobbler']:
114
114
            self.scrobblerButton.show()
115
115
        else:
116
 
            self.scrobblerButton.hide()        
117
 
        
 
116
            self.scrobblerButton.hide()
 
117
 
118
118
        self.progressBar.pulse()
119
119
        self.statusbar.push(0, 'Loading library...')
120
120
        gtkTrick()
122
122
        self.filesTree.treeview.grab_focus()
123
123
        self.statusbar.pop(0)
124
124
        self.vbox.remove(self.progressBar)
125
 
        
 
125
 
126
126
        try:
127
127
            if self.model.getAudioFileList()[1] != 'Group':
128
128
                self.control.refreshTree()
129
129
        except:
130
130
            print "filelist is a multiple selection"
131
 
        
 
131
 
132
132
        self.statusbar.set_size_request(0,14)
133
 
        
 
133
 
134
134
        if self.model.playlist != None:
135
135
            self.control.playStopSelected()
136
136
        try:
138
138
            self.changeView(None, None, self.control.settings['view'])
139
139
        except:
140
140
            pass
141
 
        
 
141
 
142
142
    def createPrimaryToolbar(self):
143
 
        """Builds the toolbar of menus and the section 
 
143
        """Builds the toolbar of menus and the section
144
144
            that shows the track informations"""
145
145
        self.vbox = gtk.VBox()
146
 
        self.add(self.vbox)       
147
 
        
 
146
        self.add(self.vbox)
 
147
 
148
148
        self.hbox = gtk.HBox()
149
149
        self.framebox = gtk.HPaned()
150
150
        # Create a UIManager instance
158
158
        actiongroup = gtk.ActionGroup('UIManagerExample')
159
159
        self.actiongroup = actiongroup
160
160
 
161
 
        
 
161
 
162
162
        # Create actions
163
163
        actiongroup.add_actions([('Quit', gtk.STOCK_QUIT, _('_Quit'), None, _('Quit the program'), self.quit),
164
164
                                 ('Open', gtk.STOCK_OPEN, _('_Open folder...'), None, _('Open media folder'), self.control.openFolder),
174
174
                                 ('Help', None, _('_Help')),
175
175
                                 ('About', gtk.STOCK_ABOUT, _('About CometSound'), None, _('About CometSound'), self.showAboutDialog)
176
176
                                 ])
177
 
        
 
177
 
178
178
        actions = self.control.readPlaylists()
179
179
        uilist = ''
180
180
        for act in actions:
190
190
        list.sort()
191
191
        uitogglelist = ''
192
192
        for label in list:
193
 
            uitogglelist = uitogglelist + '<menuitem action="%s"/>' % (label)    
194
 
        try: 
195
 
            viewNum = self.control.settings['view'] 
 
193
            uitogglelist = uitogglelist + '<menuitem action="%s"/>' % (label)
 
194
        try:
 
195
            viewNum = self.control.settings['view']
196
196
            a = viewNum + 5
197
 
        except: 
 
197
        except:
198
198
            self.control.settings['view'] = 0
199
199
            viewNum = 0
200
200
        actiongroup.add_radio_actions([('Tree View', None, _('File View'), None, _('File System visualization'), 0),
225
225
                                          <menu action="Playlists">
226
226
                                            <menuitem action="PlaylistsFolder"/>'''
227
227
                                            + uilist +
228
 
                                      ''' </menu>                                          
 
228
                                      ''' </menu>
229
229
                                          <menu action="Help">
230
230
                                            <menuitem action="About"/>
231
231
                                          </menu>
243
243
                                        </ui>''')
244
244
        self.actiongroup = actiongroup
245
245
        self.uimanager = uimanager
246
 
        
 
246
 
247
247
        # Create a MenuBar
248
248
        self.menubar = uimanager.get_widget('/MenuBar')
249
249
        toolbar = uimanager.get_widget('/ToolBar')
250
250
        imageToolbar = uimanager.get_widget('/ImageToolBar')
251
251
        #toolbar.set_size_request(170, 50)
252
 
        
 
252
 
253
253
        # Create an Image to show the album's cover
254
254
        self.image = AlbumImage()
255
255
        box = gtk.HBox()
258
258
        tv = gtk.ToolItem()
259
259
        tv.add(box)
260
260
        imageToolbar.insert(tv, 0)
261
 
        
 
261
 
262
262
        # Create a Label to show track info
263
263
        self.label = gtk.Label()
264
264
        self.label.set_justify(gtk.JUSTIFY_LEFT)
273
273
        tl.add(box)
274
274
        tl.set_expand(True)
275
275
        imageToolbar.insert(tl, 1)
276
 
                
 
276
 
277
277
        # Create a button to control player volume
278
278
        self.volumeButton = gtk.VolumeButton()
279
279
        self.volumeButton.set_value(self.volume)
281
281
        tv = gtk.ToolItem()
282
282
        tv.add(self.volumeButton)
283
283
        imageToolbar.insert(tv, 3)
284
 
        
 
284
 
285
285
        self.scrobblerButton = gtk.Button()
286
286
        self.scrobblerButton.set_relief(gtk.RELIEF_NONE)
287
 
        self.scrobblerButton.unset_flags(gtk.CAN_FOCUS) 
 
287
        self.scrobblerButton.unset_flags(gtk.CAN_FOCUS)
288
288
        sIcon = gtk.Image()
289
289
        sIcon.set_from_file("images/love.png")
290
290
        si = sIcon.get_pixbuf().scale_simple(28, 28, gtk.gdk.INTERP_BILINEAR)
295
295
        tv = gtk.ToolItem()
296
296
        tv.add(self.scrobblerButton)
297
297
        imageToolbar.insert(tv, 2)
298
 
        
 
298
 
299
299
        tl = gtk.ToolItem()
300
300
        tl.add(self.slider)
301
301
        tl.set_expand(True)
302
302
        toolbar.insert(tl, -1)
303
 
        
 
303
 
304
304
        tl = gtk.ToolItem()
305
305
        l = gtk.Label()
306
306
        l.set_size_request(19,0)
307
307
        tl.add(l)
308
308
        toolbar.insert(tl, 3)
309
 
        
 
309
 
310
310
        tl = gtk.ToolItem()
311
311
        l = gtk.Label()
312
312
        l.set_size_request(9,0)
313
313
        tl.add(l)
314
314
        toolbar.insert(tl, 0)
315
 
        
 
315
 
316
316
        tl = gtk.ToolItem()
317
317
        l = gtk.Label()
318
318
        l.set_size_request(12,0)
319
319
        tl.add(l)
320
320
        toolbar.insert(tl, -1)
321
 
        
 
321
 
322
322
        tl = gtk.ToolItem()
323
323
        l = gtk.Label()
324
324
        l.set_size_request(7,0)
325
325
        tl.add(l)
326
326
        imageToolbar.insert(tl, -1)
327
 
        
 
327
 
328
328
        self.imageToolbar = imageToolbar
329
329
        self.hbox.pack_start(toolbar, True)
330
 
    
 
330
 
331
331
    def updatePlaylistsMenu(self, newPlaylist):
332
332
        self.actiongroup.add_actions([(newPlaylist, None, newPlaylist, None, None, self.control.loadPlaylist)])
333
333
        merge_id = self.uimanager.new_merge_id()
334
334
        self.uimanager.add_ui(merge_id, 'ui/MenuBar/Playlists', newPlaylist, newPlaylist, gtk.UI_MANAGER_MENUITEM, False)
335
 
        
 
335
 
336
336
    def changeView(self, radioaction, current, value = None):
337
337
        self.filesTree.removeTagToolbar()
338
338
        self.filesTree.treeview.get_column(0).set_title(_('Name'))
345
345
            self.framebox.hide()
346
346
            self.statusbar.hide()
347
347
            self.set_size_request(self.minwidth - 100, 200)
348
 
            self.resize(self.minwidth - 100, 200) 
 
348
            self.resize(self.minwidth - 100, 200)
349
349
            self.set_resizable(False)
350
350
        elif value == 0:
351
351
            self.filesTree.setStore(self.filesTree.treeStore)
362
362
                self.resize(self.previousWidht, self.previousHeight)
363
363
                self.set_resizable(True)
364
364
        self.control.settings['view'] = value
365
 
            
 
365
 
366
366
    def createSlider(self):
367
367
        """Creates the slider to show the player progress"""
368
 
        
 
368
 
369
369
        self.adjustment = gtk.Adjustment(0.0, 0.00, 100.0, 0.1, 1.0, 1.0)
370
370
        hscale = gtk.HScale(self.adjustment)
371
371
        hscale.set_digits(2)
377
377
        hscale.connect('format-value', self.control.sliderFormat)
378
378
        self.slider = hscale
379
379
        self.slider.set_sensitive(False)
380
 
    
 
380
 
381
381
    def createButton(self, imageStock, tooltip, func, data = None):
382
382
        Icon = gtk.Image()
383
 
        Icon.set_from_stock(imageStock, gtk.ICON_SIZE_SMALL_TOOLBAR) 
 
383
        Icon.set_from_stock(imageStock, gtk.ICON_SIZE_SMALL_TOOLBAR)
384
384
        B = gtk.Button()
385
385
        B.add(Icon)
386
386
        B.set_tooltip_text(tooltip)
387
 
        B.connect("clicked", func, data)        
 
387
        B.connect("clicked", func, data)
388
388
        return B
389
 
    
 
389
 
390
390
    def setStatusIcon(self):
391
391
        """Builds the status icon"""
392
392
        pix = self.pix
393
393
        try:
394
394
            mode = self.control.settings['statusicon']
395
395
        except:
396
 
            mode = 0    
 
396
            mode = 0
397
397
        if self.tray != None:
398
398
            self.tray.set_visible(False)
399
 
        if mode != 2:    
 
399
        if mode != 2:
400
400
            self.tray = gtk.StatusIcon()
401
401
            pix = pix.scale_simple(20, 20, gtk.gdk.INTERP_BILINEAR)
402
402
            self.tray.set_from_pixbuf(pix)
403
 
            self.tray.connect('popup-menu', self.openMenu) 
404
 
            self.tray.connect('activate', self.minimize) 
405
 
            
 
403
            self.tray.connect('popup-menu', self.openMenu)
 
404
            self.tray.connect('activate', self.minimize)
 
405
 
406
406
        statusMenu = gtk.Menu()
407
407
        if self.control.settings['statusicon'] == 0:
408
408
            self.menulabel = gtk.MenuItem(self.label.get_text())
409
409
            statusMenu.append(self.menulabel)
410
 
            
 
410
 
411
411
            sep = gtk.SeparatorMenuItem()
412
412
            sep.show()
413
413
            statusMenu.append(sep)
414
 
        
 
414
 
415
415
        statusPlay = gtk.CheckMenuItem(_('Play'))
416
416
        statusPlay.set_active(self.control.playerThread.playing)
417
417
        statusPlay.show()
418
418
        statusMenu.append(statusPlay)
419
419
        statusPlay.connect('toggled', self.control.playStopSelected)
420
 
        self.statusPlay = statusPlay 
421
 
        
 
420
        self.statusPlay = statusPlay
 
421
 
422
422
        next = gtk.MenuItem(_('Next'))
423
423
        next.show()
424
424
        statusMenu.append(next)
425
425
        next.connect('activate', self.control.nextTrack)
426
 
        
 
426
 
427
427
        previous = gtk.MenuItem(_('Previous'))
428
428
        previous.show()
429
429
        statusMenu.append(previous)
430
430
        previous.connect('activate', self.control.previousTrack)
431
 
        
 
431
 
432
432
        quit = gtk.MenuItem(_('Quit'))
433
433
        quit.show()
434
434
        statusMenu.append(quit)
435
 
        quit.connect('activate', self.quit)    
436
 
        self.statusMenu = statusMenu    
437
 
    
438
 
    def openMenu(self, icon, event_button, event_time):  
439
 
        """Shows the status icon"""  
 
435
        quit.connect('activate', self.quit)
 
436
        self.statusMenu = statusMenu
 
437
 
 
438
    def openMenu(self, icon, event_button, event_time):
 
439
        """Shows the status icon"""
440
440
        if self.label.get_text() != '\n\n' and self.control.settings['statusicon'] == 0:
441
441
            self.statusMenu.remove(self.menulabel)
442
442
            self.menulabel = gtk.MenuItem(self.label.get_text())
447
447
            self.statusMenu.prepend(self.menulabel)
448
448
        self.statusMenu.popup(None, None, gtk.status_icon_position_menu,
449
449
                   event_button, event_time, self.tray)
450
 
            
 
450
 
451
451
    def minimize(self, obj = None):
452
452
        if self.get_visible():
453
453
            self.hide()
454
454
        else:
455
455
            self.show()
456
 
        
 
456
 
457
457
    def openPreferences(self, obj = None):
458
458
        try:
459
459
            p = PreferencesDialog(self.columns, self.control, self.control.settings)
460
460
        except:
461
461
            self.control.settings = defaultSettings
462
462
            p = PreferencesDialog(self.columns, self.control, defaultSettings)
463
 
            
 
463
 
464
464
    def openPlaylistFolder(self, widget, data=None):
465
465
        """Opens the folder of the saved playlists"""
466
466
        cacheDir = os.path.join(os.environ.get('HOME', None), ".cometsound")
468
468
        if not os.path.exists(dir):
469
469
            os.makedirs(dir)
470
470
        os.system('xdg-open %s' % dir)
471
 
    
 
471
 
472
472
    def savePlaylistDialog(self, widget, data=None):
473
473
        d = SavePlaylistDialog(self.control)
474
 
        
 
474
 
475
475
    def getFormatDict(self):
476
 
        return self.formatDict     
477
 
    
 
476
        return self.formatDict
 
477
 
478
478
    def setButtonPlay(self):
479
479
        """Sets the button to "play" during playing"""
480
480
        self.actiongroup.get_action('Play/Stop').set_stock_id(gtk.STOCK_MEDIA_PLAY)
481
 
        self.actiongroup.get_action('Play/Stop').set_tooltip(_('Play'))    
482
 
        
 
481
        self.actiongroup.get_action('Play/Stop').set_tooltip(_('Play'))
 
482
 
483
483
    def setButtonPause(self):
484
484
        """Sets the button to "pause" """
485
485
        self.actiongroup.get_action('Play/Stop').set_stock_id(gtk.STOCK_MEDIA_PAUSE)
486
486
        self.actiongroup.get_action('Play/Stop').set_tooltip(_('Pause'))
487
 
    
 
487
 
488
488
    def storeSize(self, widget, event):
489
489
        all = widget.get_allocation()
490
490
        self.width, self.height = all.width, all.height
491
 
    
 
491
 
492
492
    def showAboutDialog(self, o):
493
493
        ad = AboutDialog(self.icon, APP_VERSION)
494
 
        
495
 
            
 
494
 
 
495
 
496
496
    def quit(self, obj = None):
497
497
        self.destroy()
498
 
        
 
498
 
499
499
    def destroy(self):
500
500
        """Handles the program shutdown"""
501
501
        self.hide()
513
513
        if self.control.playerThread.isAlive():
514
514
            self.control.playerThread.terminate()
515
515
        gtk.main_quit()
516
 
        
 
 
b'\\ No newline at end of file'
 
516