Fix double spacing
[pysize.git] / pysize / ui / gtk / pysize_widget_menu.py
blobe0fb44dc119059141f3d3ad34a992731499d0766
1 # This program is free software; you can redistribute it and/or modify
2 # it under the terms of the GNU General Public License as published by
3 # the Free Software Foundation; either version 2 of the License, or
4 # (at your option) any later version.
6 # This program is distributed in the hope that it will be useful,
7 # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 # GNU Library General Public License for more details.
11 # You should have received a copy of the GNU General Public License
12 # along with this program; if not, write to the Free Software
13 # Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
15 # See the COPYING file for license information.
17 # Copyright (c) 2006, 2007, 2008 Guillaume Chazarain <guichaz@gmail.com>
19 import os
20 import pygtk
21 pygtk.require('2.0')
22 import gtk
23 assert gtk.pygtk_version >= (2, 8)
25 from pysize.core import compute_size
26 from pysize.ui.utils import human_unit
28 class PysizeWidget_Menu(object):
29 def __init__(self, options, args):
30 self.connect('popup-menu', type(self)._pop_menu)
31 self.connect('button-press-event', type(self)._menu_mouse_button)
33 @staticmethod
34 def _add_menu_item(menu, name, action):
35 item = gtk.MenuItem(name)
36 item.connect('activate', action)
37 item.show()
38 menu.append(item)
40 def _pop_menu(self, event=None):
41 if self.cursor_node:
42 menu = gtk.Menu()
44 props = lambda item: self.show_properties(self.get_selected_nodes())
45 self._add_menu_item(menu, 'Show properties...', props)
46 dele = lambda item: self.schedule_delete(self.get_selected_nodes())
47 self._add_menu_item(menu, 'Schedule for deletion', dele)
48 browse = lambda item: self.handle_double_click(self.cursor_node)
49 self._add_menu_item(menu, 'Browse', browse)
51 if event:
52 button = event.button
53 event_time = event.time
54 else:
55 button = 0
56 event_time = gtk.get_current_event_time()
57 menu.attach_to_widget(self, None)
58 menu.popup(None, None, None, button, event_time)
59 return True
61 def _menu_mouse_button(self, event):
62 if event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS:
63 return self._pop_menu(event)
64 return False
66 def show_properties(self, nodes):
67 fullpaths = []
68 for node in nodes:
69 fullpaths.extend(node.get_fullpaths())
70 fullpaths.sort(key=compute_size.slow, reverse=True)
71 total_size = 0
72 text = ''
73 for path in fullpaths:
74 size = compute_size.slow(path)
75 total_size += size
76 if os.path.isdir(path) and path != '/':
77 path += '/'
78 text += '%s | %s\n' % (human_unit(size), path)
79 text += human_unit(total_size)
80 names = ','.join([node.get_name() for node in nodes])
81 dialog = gtk.Dialog('Properties for ' + names, None, 0,
82 (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
83 label = gtk.Label(text)
84 label.set_selectable(True)
85 label.show()
86 scroll = gtk.ScrolledWindow()
87 scroll.add_with_viewport(label)
88 scroll.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC)
89 scroll.show()
90 dialog.vbox.add(scroll)
91 dialog.set_default_size(400, 500)
92 dialog.run()
93 dialog.destroy()