Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/smoot_toolbar.py
blob: b378a6ca9cf11208e1814ee125a2adda4263be0b (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
# Copyright 2007 Benjamin M. Schwartz
# Copyright 2011 Walter Bender
#
# This program is free software; you can redistribute it and/or modify
# it under the terms of the GNU General Public License as published by
# the Free Software Foundation; either version 2 of the License, or
# (at your option) any later version.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# GNU General Public License for more details.
#
# You should have received a copy of the GNU General Public License
# along with this program; if not, write to the Free Software
# Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA  02110-1301  USA

import gtk
from gettext import gettext as _

from sugar.graphics.combobox import ComboBox
from sugar.graphics.toolcombobox import ToolComboBox

METERS = 0
CENTIMETERS = 1
INCHES = 2
FEET = 3
YARDS = 4
CUSTOM = 5
UNITS = [_('meters'), _('centimeters'),
         # TRANS: English units of measure
         _('inches'), _('feet'), _('yards'),
         _('custom units')]
UNIT_DICTIONARY = {METERS: (_('meters'), 1.0),
                   CENTIMETERS: (_('centimeters'), 100.0),
                   INCHES: (_('inches'), 39.37),
                   FEET: (_('feet'), 3.28),
                   YARDS: (_('yards'), 1.09),
                   CUSTOM: (_('custom units'), None)}


def _label_factory(label, toolbar):
    ''' Factory for adding a label to a toolbar '''
    my_label = gtk.Label(label)
    my_label.set_line_wrap(True)
    my_label.show()
    _toolitem = gtk.ToolItem()
    _toolitem.add(my_label)
    toolbar.insert(_toolitem, -1)
    _toolitem.show()
    return my_label


def _combo_factory(combo_array, default, tooltip, callback, toolbar):
    '''Factory for making a toolbar combo box'''
    my_combo = ComboBox()
    if hasattr(my_combo, 'set_tooltip_text'):
        my_combo.set_tooltip_text(tooltip)

    my_combo.connect('changed', callback)

    for i, s in enumerate(combo_array):
        my_combo.append_item(i, s, None)

    toolbar.insert(ToolComboBox(my_combo), -1)

    my_combo.set_active(default)

    return my_combo


class SmootToolbar(gtk.Toolbar):
    ''' Defines a toolbar for specifying units of measure '''

    def __init__(self, parent):
        gtk.Toolbar.__init__(self)

        self._parent = parent
        self._unit_name = _('meters')
        # Conversion factor between meters and custom units
        self._unit_scale = 1.0

        label = _label_factory(_('Choose a unit of measure:'), self)
        label.show()

        self._unit_combo = _combo_factory(UNITS, METERS, _('select units'),
                                          self._unit_combo_cb, self)
        self._unit_combo.show()

        self._factor_label = _label_factory(' ', self)
        self._factor_label.show()

    def get_name(self):
        return self._unit_name

    def set_name(self, name):
        self._unit_name = name
        if hasattr(self._parent, 'fr'):
            self._parent.fr.set_label(
                _('Measured distance in %s') % (self._unit_name))
        if name == _('meters'):
            self._factor_label.set_label(' ')
        else:
            self._factor_label.set_label(_('%(20.2)f %(1)s per meter') % (
                    self._unit_scale, name))

    def get_scale(self):
        return self._unit_scale

    def set_scale(self, scale):
        if scale is None:
            if self._parent.current_distance > 0:
                self._unit_scale = (1.0 / self._parent.current_distance)
            else:
                self._unit_scale = 1.0
        else:
            self._unit_scale = scale

    def _unit_combo_cb(self, arg=None):
        ''' Read value of predefined conversion factors from combo box '''
        try:
            self.set_scale(
                UNIT_DICTIONARY[self._unit_combo.get_active()][1])
            self.set_name(
                UNIT_DICTIONARY[self._unit_combo.get_active()][0])
        except KeyError:
            pass