set_sensitive() on Back and Forward when needed
[pysize.git] / pysize / ui / gtk / pysize_window.py
blob4fa0f3f23e9c8b6479939c55789be299f7f41c51
1 import os
2 import pygtk
3 pygtk.require('2.0')
4 import gtk
5 assert gtk.pygtk_version >= (2, 8)
6 import gobject
7 import pango
8 import time
10 from pysize.ui.gtk.gazpacho_loader.loader import ObjectBuilder
12 from pysize.ui.gtk.pysize_widget import PysizeWidget
13 from pysize.ui.utils import human_unit
14 from pysize.core.compute_size import size_observable
15 from pysize.core import history
17 def hover_changed(main_widget, hover_node, status_bar):
18 status_bar.pop(0)
19 node = hover_node or main_widget.tree.root
20 label = human_unit(node.size) + ' | ' + node.get_fullname()
21 status_bar.push(0, label)
23 def size_observer(progress_bar):
24 now = time.time()
25 if now - size_observer.last_pulse > 0.04:
26 size_observer.last_pulse = now
27 gobject.idle_add(lambda: progress_bar.pulse())
28 size_observer.last_pulse = time.time()
30 def hide_pbar(progress_bar, visible):
31 if visible:
32 progress_bar.show()
33 else:
34 progress_bar.hide()
36 def update_action(zoom_fit_action, main_widget):
37 zoom_fit_action.set_sensitive(main_widget.options.min_size != 'auto')
39 def update_title(window, main_widget):
40 root = main_widget.tree.root
41 window.set_title('Pysize - %s | %s' %
42 (human_unit(root.size), root.get_name()))
44 def update_back_action(back_action, next_insertion_index, history):
45 back_action.set_sensitive(next_insertion_index > 1)
47 def update_forward_action(forward_action, next_insertion_index, history):
48 forward_action.set_sensitive(next_insertion_index < len(history))
50 class PysizeWindow(object):
51 def __init__(self, options, args):
52 create_widget = lambda **unused_kwargs: PysizeWidget(options, args)
53 glade_filename = os.path.join(os.path.dirname(__file__),
54 'main_window.glade')
55 builder = ObjectBuilder(glade_filename,
56 custom = {'pysize_widget': create_widget})
58 main_widget = builder.get_widget('main_widget')
59 status_bar = builder.get_widget('status_bar')
60 main_widget.connect('hover_changed', hover_changed, status_bar)
62 progress_bar = builder.get_widget('progress_bar')
63 size_observable.add_observer(lambda: size_observer(progress_bar))
64 pbar_hider = lambda w, building: hide_pbar(progress_bar, building)
65 main_widget.connect('building-tree-state-changed', pbar_hider)
67 max_depth = builder.get_widget('max_depth')
68 spin_init = lambda w: max_depth.set_value(main_widget.options.max_depth)
69 main_widget.connect('realize', spin_init)
71 ui_manager = builder.get_widget('uimanager')
72 zoom_fit_action = ui_manager.get_action('ui/toolbar/ZoomFit')
73 action_updater = lambda w, building: update_action(zoom_fit_action, w)
74 main_widget.connect('building-tree-state-changed', action_updater)
76 back_action = ui_manager.get_action('ui/toolbar/Back')
77 back_action.set_sensitive(False)
78 update_back = lambda n, h: update_back_action(back_action, n, h)
79 history.history_observable.add_observer(update_back)
81 forward_action = ui_manager.get_action('ui/toolbar/Forward')
82 forward_action.set_sensitive(False)
83 update_forw = lambda n, h: update_forward_action(forward_action, n, h)
84 history.history_observable.add_observer(update_forw)
86 toolbar = builder.get_widget('toolbar')
87 toolbar_remaining = builder.get_widget('toolbar_remaining')
88 toolbar_remaining.unparent()
89 tool_item = gtk.ToolItem()
90 tool_item.add(toolbar_remaining)
91 toolbar.insert(tool_item, -1)
93 callbacks = {
94 'quit_action': lambda w: gtk.main_quit(),
95 'refresh_tree_action': lambda w: main_widget.refresh_tree(),
96 'zoom_fit_action': lambda w: main_widget.zoom_fit(),
97 'zoom_in_action': lambda w: main_widget.zoom_in(),
98 'zoom_out_action': lambda w: main_widget.zoom_out(),
99 'parent_directory_action': lambda w: main_widget.parent_directory(),
100 'open_action': lambda w: main_widget.open(),
101 'back_action': lambda w: main_widget.move_history(history.back),
102 'forw_action': lambda w: main_widget.move_history(history.forward),
103 'max_depth_changed': main_widget.max_depth_changed
105 builder.signal_autoconnect(callbacks)
107 window = builder.get_widget('main_window')
108 title_updater = lambda w, tree: update_title(window, main_widget)
109 main_widget.connect('building-tree-state-changed', title_updater)
110 window.show_all()