~kripkenstein/topshelf/main

« back to all changes in this revision

Viewing changes to topshelf.py

  • Committer: alon
  • Date: 2008-01-26 12:16:52 UTC
  • Revision ID: alon@dignity-20080126121652-uarcjxxo4lus5ea6
rudimentary resizing

Show diffs side-by-side

added added

removed removed

Lines of Context:
45
45
## Global utilities
46
46
 
47
47
def update_background(widget, backgroundtype, color, pixmap):
 
48
        # Needed for every widget on the panel
48
49
        widget.set_style(None)
49
50
        rc_style = gtk.RcStyle()
50
51
        widget.modify_style(rc_style)
65
66
                                type           = gtk.MESSAGE_WARNING)
66
67
 
67
68
        window.present() # Ensure we are on top, for our losing keep_above to not hide us
68
 
        window.set_keep_above(False)
 
69
        if window is not None:
 
70
                window.set_keep_above(False)
69
71
        result = dlg.run()
70
72
        dlg.destroy()
71
 
        window.set_keep_above(True)
 
73
        if window is not None:
 
74
                window.set_keep_above(True)
72
75
 
73
76
def popup_question(window, message):
74
77
        dlg = gtk.MessageDialog(parent         = window,
78
81
                                type           = gtk.MESSAGE_QUESTION)
79
82
 
80
83
        window.present() # Ensure we are on top, for our losing keep_above to not hide us
81
 
        window.set_keep_above(False)
 
84
        if window is not None:
 
85
                window.set_keep_above(False)
82
86
        result = dlg.run()
83
87
        dlg.destroy()
84
 
        window.set_keep_above(True)
 
88
        if window is not None:
 
89
                window.set_keep_above(True)
85
90
 
86
91
        if result == gtk.RESPONSE_YES:
87
92
                return True
218
223
        def __init__(self, applet, standalone_window=None):
219
224
                self.applet = applet
220
225
                self.applet.ts = self # Needed for standalone
221
 
                self.applet.connect("change_background", self.do_change_background)
 
226
 
 
227
                self.applet.set_flags(gnomeapplet.EXPAND_MAJOR) # TODO: Needed?
222
228
 
223
229
                self.standalone_window = standalone_window
224
230
 
225
231
                self.window = None
226
232
 
227
233
                self.pressed  = False
228
 
                self.resizing = False
229
 
 
230
 
                self.panel_pb     = gtk.gdk.pixbuf_new_from_file("/usr/share/pixmaps/topshelf-24.png")
231
 
                self.panel_off_pb = gtk.gdk.pixbuf_new_from_file("/usr/share/pixmaps/topshelf-24-off.png")
232
234
 
233
235
                self.panel_image = gtk.Image()
234
 
                self.panel_image.set_from_pixbuf(self.panel_pb)
235
236
                try:
236
 
                        self.panel_image.set_tooltip_text("TopShelf")
 
237
                        self.applet.set_tooltip_text("TopShelf")
237
238
                except AttributeError:
238
239
                        pass # No tooltips, not the end of the world. Only python-gtk2 2.12 has them, i.e., Gutsy and above
239
 
                self.eventbox = gtk.EventBox()
240
 
                self.eventbox.connect("button-press-event", self.do_button_press)
241
 
                self.eventbox.drag_dest_set(gtk.DEST_DEFAULT_ALL, [('text/uri-list', 0, 81)], gtk.gdk.ACTION_LINK)
242
 
                self.eventbox.connect("drag-data-received", self.do_drag_data_received)
243
 
                self.eventbox.connect("key-press-event", self.do_key_press)
 
240
                self.applet.connect("button_press_event", self.on_button_press)
 
241
                self.applet.drag_dest_set(gtk.DEST_DEFAULT_ALL, [('text/uri-list', 0, 81)], gtk.gdk.ACTION_LINK)
 
242
                self.applet.connect("drag_data_received", self.on_drag_data_received)
 
243
                self.applet.connect("key_press_event",    self.on_key_press)
 
244
                self.applet.connect("change_background",  self.on_change_background)
 
245
                self.applet.connect("change-size",        self.on_change_size)
244
246
 
245
 
                self.eventbox.add(self.panel_image)
246
 
                self.applet.add(self.eventbox)
 
247
                self.applet.add(self.panel_image)
247
248
                self.applet.show_all()
248
249
 
249
250
                # full-path, position, short-filename, mime-type-icon, color, strikethrough
259
260
                        self.standalone_window.connect("configure-event", self.standalone_window_configure_event)
260
261
                        self.standalone_window.set_keep_above(True)
261
262
 
262
 
        # Events
263
 
 
264
 
        def do_change_background(self, applet, backgroundtype, color, pixmap):
265
 
                update_background(applet,        backgroundtype, color, pixmap)
266
 
                update_background(self.eventbox, backgroundtype, color, pixmap)
267
 
 
268
 
        def do_button_toggle(self, param1=None):
 
263
                self.size = self.applet.get_size()
 
264
                self.on_change_size(self.applet, self.size)
 
265
 
 
266
#               self.applet.get_parent().child_set_property(applet, "fill", True)
 
267
 
 
268
        # Init and setup
 
269
 
 
270
        def get_pixbufs(self, size):
 
271
                self.panel_pbs = []
 
272
                for pb_type in ["", "-off"]: # On, then off
 
273
                        # With help from the Deskbar applet. Thanks!
 
274
                        image_name = "/usr/share/pixmaps/topshelf-"
 
275
                        if size <= 32:
 
276
                                image_name += "24" + pb_type + ".png"
 
277
                                s = -1
 
278
                        else:
 
279
                                image_name += "svg" + pb_type + ".svg"
 
280
                                s = size-12
 
281
 
 
282
                        self.panel_pbs.append(gtk.gdk.pixbuf_new_from_file(image_name))
 
283
 
 
284
                for i in range(len(self.panel_pbs)):
 
285
                        self.panel_pbs[i] = self.panel_pbs[i].scale_simple(size, size, gtk.gdk.INTERP_HYPER)
 
286
 
 
287
        def set_image(self):
 
288
                if self.pressed:
 
289
                        self.panel_image.set_from_pixbuf(self.panel_pbs[0])
 
290
                else:           
 
291
                        self.panel_image.set_from_pixbuf(self.panel_pbs[1])
 
292
 
 
293
#               print "Setting image to want size", self.size
 
294
#               self.panel_image.set_size_request(self.size, self.size)
 
295
 
 
296
 
 
297
        # Events
 
298
 
 
299
        def on_change_background(self, applet, backgroundtype, color, pixmap):
 
300
                update_background(applet, backgroundtype, color, pixmap)
 
301
 
 
302
        def on_change_size(self, applet, size):
 
303
                print "Changing size to ", size
 
304
 
 
305
                f = open("/media/sda2/Bzr-external/topshelf/outt3", "w")
 
306
                f.write(str(applet) + "," + str(size) + "\r\n")
 
307
                f.close()
 
308
 
 
309
                self.get_pixbufs(size)
 
310
                self.applet.set_size_request(size, size)
 
311
                self.set_image()
 
312
 
 
313
                self.size = size
 
314
 
 
315
 
 
316
        # Events
 
317
 
 
318
        def on_button_toggle(self, param1=None):
269
319
                if not self.pressed:
270
320
                        self.show_window()
271
321
                else:
272
322
                        self.hide_window()
273
323
 
274
 
        def do_button_press(self, btn, event):
 
324
        def on_button_press(self, btn, event):
 
325
                print self.applet.get_size(), event.type, event.button
 
326
                self.on_change_size(self.applet, self.applet.get_size())
275
327
                if event.type == gtk.gdk.BUTTON_PRESS and event.button == 1:
276
 
                        if not self.resizing:
277
 
                                self.do_button_toggle()
278
 
                        else:
279
 
                                self.do_stop_resizing()
 
328
                        self.on_button_toggle()
 
329
                        self.set_image()
280
330
                elif event.type == gtk.gdk.BUTTON_PRESS and event.button == 3:
281
 
                        btn.emit_stop_by_name("button_press_event")
 
331
#                       btn.emit_stop_by_name("button_press_event") # TODO: Once this was needed
282
332
                        propxml="""
283
333
                                <popup name="button3">
284
334
                                <menuitem name="Item 3" verb="Help"  label="_Help" pixtype="stock" pixname="gtk-help"/>
285
335
                                <menuitem name="Item 4" verb="About" label="_About" pixtype="stock" pixname="gtk-about"/>
286
336
                                </popup>"""
287
 
                        verbs = [("About", self.do_about),
288
 
                                 ("Help",  self.do_help)  ]
 
337
                        verbs = [("About", self.on_about),
 
338
                                 ("Help",  self.on_help)  ]
289
339
                        self.applet.setup_menu(propxml, verbs, None)
290
340
 
291
 
        def do_files_button_press(self, btn, event):
 
341
        def on_files_button_press(self, btn, event):
292
342
                if event.button == 3:
293
343
                        model, iters = self.get_selected()
294
344
                        if len(iters) > 0:
318
368
 
319
369
                        self.pickle()
320
370
 
321
 
        def do_cursor_change(self, param1):
 
371
        def on_cursor_change(self, param1):
322
372
                model, iters = self.get_selected()
323
373
                for iter in iters:
324
374
                        self.check_file(iter)
325
375
 
326
376
        # Actions
327
377
 
328
 
        def do_about(self, param1=None, param2=None):
329
 
                self.window.set_keep_above(False) # So we are not concealed!
 
378
        def on_about(self, param1=None, param2=None):
 
379
                if self.window is not None:
 
380
                        self.window.set_keep_above(False) # So we are not concealed!
330
381
 
331
382
                logo_pb = gtk.gdk.pixbuf_new_from_file("/usr/share/pixmaps/topshelf-64.png")
332
383
 
346
397
                dlg.run()
347
398
                dlg.destroy()
348
399
 
349
 
                self.window.set_keep_above(True)
 
400
                if self.window is not None:
 
401
                        self.window.set_keep_above(True)
350
402
 
351
403
                return False
352
404
 
353
 
        def do_open(self, param1=None, param2=None, param3=None):
 
405
        def on_open(self, param1=None, param2=None, param3=None):
354
406
                model, iters = self.get_selected()
355
407
                # TODO: open them all in one command (good for xmms etc.). Sadly gnome-open doesn't allow multiple files...
356
408
                for iter in iters:
364
416
 
365
417
                return False
366
418
 
367
 
        def do_open_folder(self, param1=None, param2=None, param3=None):
 
419
        def on_open_folder(self, param1=None, param2=None, param3=None):
368
420
                model, iters = self.get_selected()
369
421
                for iter in iters:
370
422
                        self.check_file(iter) # Update color depending on existence of file. Not needed if a thread does this!
377
429
 
378
430
                return False
379
431
 
380
 
        def do_move_up(self, param1=None):
 
432
        def on_move_up(self, param1=None):
381
433
                model, iters = self.get_selected()
382
434
                for iter in iters:
383
435
                        old_val = model.get(iter, 1)[0]
386
438
 
387
439
                return False
388
440
 
389
 
        def do_move_down(self, param1=None):
 
441
        def on_move_down(self, param1=None):
390
442
                model, iters = self.get_selected()
391
443
                for iter in iters:
392
444
                        old_val = model.get(iter, 1)[0]
395
447
 
396
448
                return False
397
449
 
398
 
        def do_add(self, wgt):
 
450
        def on_add(self, wgt):
399
451
                self.window.set_keep_above(False) # So we are not concealed
400
452
                chooser = gtk.FileChooserDialog("Select a file to add to TopShelf:",
401
453
                                                self.window,
422
474
 
423
475
                return False
424
476
 
425
 
        def do_remove(self, wgt=None):
 
477
        def on_remove(self, wgt=None):
426
478
                model, iters = self.get_selected()
427
479
                if len(iters) > 0:
428
480
                        if popup_question(self.window,
440
492
 
441
493
                return False
442
494
 
443
 
        def do_drag_data_received(self, widget, drag_context, x, y, selection_data, info, timestamp):
 
495
        def on_drag_data_received(self, widget, drag_context, x, y, selection_data, info, timestamp):
444
496
                uris = selection_data.data.strip().split()
445
497
                for uri in uris:
446
498
                        filename = urllib.url2pathname(uri)
447
499
                        self.add_file(filename)
448
500
 
449
 
        def do_package(self, param1=None):
 
501
        def on_package(self, param1=None):
450
502
                if self.get_n_files() == 0:
451
503
                        return
452
504
 
478
530
 
479
531
                return False
480
532
 
481
 
        def do_help(self, param1=None, param2=None, param3=None):
 
533
        def on_help(self, param1=None, param2=None, param3=None):
482
534
                self.hide_window()
483
535
                ret = subprocess.call(HELP_APP + " '" + HELP_FILE + "'", shell=True)
484
536
                if ret != 0:
486
538
 
487
539
                return False
488
540
 
489
 
        def do_key_press(self, widget, event):
 
541
        def on_key_press(self, widget, event):
490
542
                if event.keyval == 65307:
491
543
                        self.hide_window()
492
544
                elif event.keyval == 65535:
493
 
                        self.do_remove()
 
545
                        self.on_remove()
494
546
                elif event.keyval == 65474:
495
547
                        self.check_all_files()
496
548
 
547
599
                if self.window is None:
548
600
                        self.create_window()
549
601
 
550
 
                if not self.resizing:
551
 
                        self.panel_image.set_from_pixbuf(self.panel_off_pb)
552
602
                self.pressed = True
553
603
 
554
604
                # These four commands - present, keep-above, present, position - are very odd. But they work, in THIS order.
569
619
                while gtk.events_pending():
570
620
                        gtk.main_iteration() # Ensure the hide actually happens before we show e.g. Help windows
571
621
 
572
 
                self.panel_image.set_from_pixbuf(self.panel_pb)
573
622
                self.pressed = False
574
623
 
575
624
                return True # Stop delete events
581
630
                self.window.connect("delete-event",       self.hide_window)
582
631
                self.window.connect("window-state-event", self.window_state_event)
583
632
                self.window.connect("configure-event",    self.configure_event)
584
 
                self.window.connect("key-press-event",    self.do_key_press)
 
633
                self.window.connect("key-press-event",    self.on_key_press)
585
634
 
586
635
                self.window.set_keep_above(True)
587
636
                self.window.resize(self.persistent_data.get('w'), self.persistent_data.get('h'))
588
637
 
589
638
                self.window.drag_dest_set(gtk.DEST_DEFAULT_ALL, [('text/uri-list', 0, 81)], gtk.gdk.ACTION_LINK)
590
 
                self.window.connect("drag-data-received", self.do_drag_data_received)
 
639
                self.window.connect("drag-data-received", self.on_drag_data_received)
591
640
 
592
641
                # Main view
593
642
 
603
652
 
604
653
                col.clicked() # Set default sort
605
654
 
606
 
                self.treeview.connect("row-activated" ,     self.do_open)
607
 
                self.treeview.connect("cursor-changed",     self.do_cursor_change)
608
 
                self.treeview.connect("button-press-event", self.do_files_button_press)
 
655
                self.treeview.connect("row-activated" ,     self.on_open)
 
656
                self.treeview.connect("cursor-changed",     self.on_cursor_change)
 
657
                self.treeview.connect("button-press-event", self.on_files_button_press)
609
658
 
610
659
                scrolled_window = gtk.ScrolledWindow()
611
660
                scrolled_window.add(self.treeview)
615
664
 
616
665
                toolbar = gtk.Toolbar()
617
666
 
618
 
                self.add_stock_button    (toolbar, gtk.STOCK_OPEN,                            self.do_open       , "Open file")
619
 
                self.add_altstock_button (toolbar, gtk.STOCK_DIRECTORY,      "Open Folder",   self.do_open_folder, "Open folder containing file")
620
 
                toolbar.add(gtk.SeparatorToolItem())
621
 
                self.add_stock_button    (toolbar, gtk.STOCK_GO_UP,                           self.do_move_up    , "Move file up in order")
622
 
                self.add_stock_button    (toolbar, gtk.STOCK_GO_DOWN,                         self.do_move_down  , "Move file down in order")
623
 
                toolbar.add(gtk.SeparatorToolItem())
624
 
                self.add_stock_button    (toolbar, gtk.STOCK_ADD,                             self.do_add        , "Add a file to the list")
625
 
                self.add_stock_button    (toolbar, gtk.STOCK_REMOVE,                          self.do_remove     , "Remove file from the list")
626
 
                toolbar.add(gtk.SeparatorToolItem())
627
 
                self.add_stock_button    (toolbar, gtk.STOCK_HELP,                            self.do_help       , "Show help")
628
 
                self.add_stock_button    (toolbar, gtk.STOCK_ABOUT,                           self.do_about      , "About TopShelf")
629
 
#               self.add_pixbuf_button   (toolbar, guess_mime_icon("a.zip"), "Package Files", self.do_package)
 
667
                self.add_stock_button    (toolbar, gtk.STOCK_OPEN,                            self.on_open       , "Open file")
 
668
                self.add_altstock_button (toolbar, gtk.STOCK_DIRECTORY,      "Open Folder",   self.on_open_folder, "Open folder containing file")
 
669
                toolbar.add(gtk.SeparatorToolItem())
 
670
                self.add_stock_button    (toolbar, gtk.STOCK_GO_UP,                           self.on_move_up    , "Move file up in order")
 
671
                self.add_stock_button    (toolbar, gtk.STOCK_GO_DOWN,                         self.on_move_down  , "Move file down in order")
 
672
                toolbar.add(gtk.SeparatorToolItem())
 
673
                self.add_stock_button    (toolbar, gtk.STOCK_ADD,                             self.on_add        , "Add a file to the list")
 
674
                self.add_stock_button    (toolbar, gtk.STOCK_REMOVE,                          self.on_remove     , "Remove file from the list")
 
675
                toolbar.add(gtk.SeparatorToolItem())
 
676
                self.add_stock_button    (toolbar, gtk.STOCK_HELP,                            self.on_help       , "Show help")
 
677
                self.add_stock_button    (toolbar, gtk.STOCK_ABOUT,                           self.on_about      , "About TopShelf")
 
678
#               self.add_pixbuf_button   (toolbar, guess_mime_icon("a.zip"), "Package Files", self.on_package)
630
679
 
631
680
                # Main vbox
632
681
 
641
690
                # Popup menu
642
691
 
643
692
                self.popup_menu = gtk.Menu()
644
 
                self.add_menuitem   (self.popup_menu, gtk.STOCK_OPEN,                     self.do_open)
645
 
                self.add_altmenuitem(self.popup_menu, gtk.STOCK_DIRECTORY, "Open Folder", self.do_open_folder)
646
 
                self.popup_menu.add(gtk.SeparatorMenuItem())
647
 
                self.add_menuitem   (self.popup_menu, gtk.STOCK_GO_UP,                    self.do_move_up)
648
 
                self.add_menuitem   (self.popup_menu, gtk.STOCK_GO_DOWN,                  self.do_move_down)
649
 
                self.popup_menu.add(gtk.SeparatorMenuItem())
650
 
                self.add_menuitem   (self.popup_menu, gtk.STOCK_REMOVE,                   self.do_remove)
 
693
                self.add_menuitem   (self.popup_menu, gtk.STOCK_OPEN,                     self.on_open)
 
694
                self.add_altmenuitem(self.popup_menu, gtk.STOCK_DIRECTORY, "Open Folder", self.on_open_folder)
 
695
                self.popup_menu.add(gtk.SeparatorMenuItem())
 
696
                self.add_menuitem   (self.popup_menu, gtk.STOCK_GO_UP,                    self.on_move_up)
 
697
                self.add_menuitem   (self.popup_menu, gtk.STOCK_GO_DOWN,                  self.on_move_down)
 
698
                self.popup_menu.add(gtk.SeparatorMenuItem())
 
699
                self.add_menuitem   (self.popup_menu, gtk.STOCK_REMOVE,                   self.on_remove)
651
700
                self.popup_menu.show_all()
652
701
 
653
702
                # Finalize main window