Select paths instead of nodes, easier to use
[pysize.git] / pysize / ui / gtk / pysize_widget_menu.py
blob4601ea5091371b8e28f8a957015728a0cdf3c726
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 Guillaume Chazarain <guichaz@yahoo.fr>
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)
47 if event:
48 button = event.button
49 event_time = event.time
50 else:
51 button = 0
52 event_time = gtk.get_current_event_time()
53 menu.attach_to_widget(self, None)
54 menu.popup(None, None, None, button, event_time)
55 return True
57 def _menu_mouse_button(self, event):
58 if event.button == 3 and event.type == gtk.gdk.BUTTON_PRESS:
59 return self._pop_menu(event)
60 return False
62 def show_properties(self, nodes):
63 fullpaths = []
64 for node in nodes:
65 fullpaths.extend(node.get_fullpaths())
66 fullpaths.sort(key=compute_size.slow,reverse=True)
67 total_size = 0
68 text = ''
69 for path in fullpaths:
70 size = compute_size.slow(path)
71 total_size += size
72 if os.path.isdir(path) and path != '/':
73 path += '/'
74 text += '%s | %s\n' % (human_unit(size), path)
75 text += human_unit(total_size)
76 names = ','.join([node.get_name() for node in nodes])
77 dialog = gtk.Dialog('Properties for ' + names, None, 0,
78 (gtk.STOCK_CLOSE, gtk.RESPONSE_CLOSE))
79 label = gtk.Label(text)
80 label.set_selectable(True)
81 label.show()
82 dialog.vbox.add(label)
83 dialog.run()
84 dialog.destroy()