diff options
author | Aneesh Dogra <lionaneesh@gmail.com> | 2013-01-08 15:00:04 (GMT) |
---|---|---|
committer | Aneesh Dogra <lionaneesh@gmail.com> | 2013-01-08 15:00:04 (GMT) |
commit | c7bef7c1d2d5462c1c80c63cd3534abb42d35276 (patch) | |
tree | 505965b0678a334bf294dcb7c577a4c1c237b84f | |
parent | ff4a9004cd60d99280b9422e316ce0400c5ae28e (diff) |
Add cutom ruler toolbar in the Gtk3 version. [Ported from the Gtk2 branch.]
-rw-r--r-- | RulerActivity.py | 54 | ||||
-rw-r--r-- | show_rulers.py | 58 |
2 files changed, 108 insertions, 4 deletions
diff --git a/RulerActivity.py b/RulerActivity.py index 7479753..48cf868 100644 --- a/RulerActivity.py +++ b/RulerActivity.py @@ -1,6 +1,7 @@ # Copyright (c) 2007 Mitchell N. Charity # Copyright (c) 2009-2012 Walter Bender # Copyright (c) 2012 Flavio Danesse +# Copyright (c) 2013 Aneesh Dogra <lionaneesh@gmail.com> # # This file is part of Ruler. # @@ -167,6 +168,37 @@ class RulerActivity(activity.Activity): tooltip=_('Checker'), group=self.rulers) + self.wrapper = Gtk.ToolItem() + self.wrapper2 = Gtk.ToolItem() + self.wrapper3 = Gtk.ToolItem() + self.custom_unit_entry = Gtk.Entry() + self.txt1 = Gtk.Label() + self.txt1.set_text(_('1 custom unit equals ')) + self.txt2 = Gtk.Label() + # TRANS: mm is for Milli Meters + self.txt2.set_text(_(' mm.')) + self.wrapper.add(self.txt1) + self.wrapper2.add(self.custom_unit_entry) + self.wrapper3.add(self.txt2) + self.wrapper.show_all() + self.wrapper2.show_all() + self.wrapper3.show_all() + separator = Gtk.SeparatorToolItem() + separator.props.draw = True + separator.set_expand(False) + separator.show() + toolbar_box.toolbar.insert(separator, -1) + custom_units_toolbox = ToolbarBox() + custom_units_toolbox.toolbar.insert(self.wrapper, -1) + custom_units_toolbox.toolbar.insert(self.wrapper2, -1) + custom_units_toolbox.toolbar.insert(self.wrapper3, -1) + custom_units_toolbox.show() + self.custom_units_button = ToolbarButton(icon_name='view-source', + page=custom_units_toolbox) + toolbar_box.toolbar.insert(self.custom_units_button, -1) + self.custom_unit_entry.connect('changed', self.custom_unit_change_cb) + self.custom_units_button.show() + if not self.known_dpi: separator = Gtk.SeparatorToolItem() separator.show() @@ -211,19 +243,39 @@ class RulerActivity(activity.Activity): self._rulers_cb() self.rulers.set_active(True) + if 'custom_unit' in self.metadata: + self.custom_unit_entry.set_text(str(self.metadata['custom_unit'])) + else: # set the default + self.custom_unit_entry.set_text("25.4") + # # Button callbacks # def _rulers_cb(self, button=None): if self._ready: + self.custom_units_button.set_sensitive(True) self._current = self._r self._canvas.add_a_ruler(self._current) _logger.debug('selecting ruler') self.metadata['ruler'] = 'ruler' return False + def custom_unit_change_cb(self, widget): + try: + new = float(widget.get_text()) + if new > 7: # less than 7 results in overlapping. + self._canvas.add_a_ruler(self._r) + self._r.custom_unit_in_mm = new + self._r.draw_custom_ruler(self._r.custom_unit_in_mm) + self.metadata['custom_unit'] = new + except ValueError: + if widget.get_text() != '': + widget.set_text('25.4') + self.metadata['custom_unit'] = 25.4 + def _grids_cb(self, button=None): if self._ready: + self.custom_units_button.set_sensitive(False) if self._grids_mode == "cm": self._current = self._gcm if hasattr(self, 'grids'): @@ -241,6 +293,7 @@ class RulerActivity(activity.Activity): def _angles_cb(self, button=None): if self._ready: + self.custom_units_button.set_sensitive(False) if self._angles_mode == "90": self._current = self._a90 if hasattr(self, 'angles'): @@ -258,6 +311,7 @@ class RulerActivity(activity.Activity): def _checker_cb(self, button=None): if self._ready: + self.custom_units_button.set_sensitive(False) self._current = self._c self._canvas.add_a_ruler(self._current) _logger.debug('selecting checker') diff --git a/show_rulers.py b/show_rulers.py index a4d5857..c784bb2 100644 --- a/show_rulers.py +++ b/show_rulers.py @@ -1,5 +1,6 @@ # Copyright 2007 Mitchell N. Charity # Copyright 2009 Walter Bender +# Copyright 2013 Aneesh Dogra <lionaneesh@gmail.com> # # This file is part of Ruler. # @@ -29,9 +30,15 @@ class ScreenOfRulers(): self.font_bold = font_bold self.w = w self.h = h + self.custom_unit_in_mm = 24.5 # precise upto 2 decimal places self.hw = get_hardware() + self.offset_of_xo_side_from_screen = 0 + self.dpi = 0 + self.c = None def draw(self, c, dpi): + self.c = c + self.dpi = dpi set_background_color(c, self.w, self.h) nw, nh = dimensions_mm(dpi, self.w, self.h) @@ -42,8 +49,8 @@ class ScreenOfRulers(): # Only calculate offsets if on an OLPC XO-1, 1.5, 1.75 # Not applicable to XO 3.0 if self.hw[0:2] == 'xo' and dpi in [200, 201]: - offset_of_xo_side_from_screen = mm(dpi, -38.5) - c.move_to(offset_of_xo_side_from_screen, mm(dpi, 65)) + self.offset_of_xo_side_from_screen = mm(dpi, -38.5) + c.move_to(self.offset_of_xo_side_from_screen, mm(dpi, 65)) self.draw_cm_ruler(c, dpi, 180) c.save() @@ -55,11 +62,13 @@ class ScreenOfRulers(): offset_of_molding_from_screen = mm(dpi, -0.4) c.move_to(offset_of_molding_from_screen, mm(dpi, 95)) self.draw_cm_ruler(c, dpi, 150) + self.draw_custom_ruler(self.custom_unit_in_mm, int(nw / 10 * 10)) else: - offset_of_xo_side_from_screen = mm(dpi, 0) - c.move_to(offset_of_xo_side_from_screen, mm(dpi, 65)) + self.offset_of_xo_side_from_screen = mm(dpi, 0) + c.move_to(self.offset_of_xo_side_from_screen, mm(dpi, 65)) self.draw_cm_ruler(c, dpi, int(nw / 10 * 10)) + self.draw_custom_ruler(self.custom_unit_in_mm, int(nw / 10 * 10)) def draw_ruler_pair(self, c, dpi, y): c.move_to(mm(dpi, 10), y) @@ -89,6 +98,47 @@ class ScreenOfRulers(): c.restore() + # units_per_mm is precise upto 2 decimal places + def draw_custom_ruler(self, units_per_mm, width=130): + if not self.c: + return + + self.c.set_source_rgb(255, 255, 255) + self.c.rectangle(0, mm(self.dpi, 85), + width, mm(self.dpi, 85) + 10) + self.c.fill() + self.c.set_source_rgb(0, 0, 0) + + self.c.move_to(self.offset_of_xo_side_from_screen, mm(self.dpi, 85)) + self.c.save() + self.c.set_line_cap(cairo.LINE_CAP_SQUARE) + self.c.translate(*self.c.get_current_point()) + + self.c.set_line_width(5) + self.c.move_to(0, 0) + self.c.line_to(mm(self.dpi, width), 0) + for x in [mm(self.dpi, xm / 100) for xm in xrange(0, (width+1) * 100, + int(units_per_mm * 100))]: + self.c.move_to(x, 0) + self.c.rel_line_to(0, mm(self.dpi, -3)) + self.c.stroke() + pt_list = [x / int(units_per_mm * 100) for x in \ + range(0, (width + 1) * 100, int(units_per_mm * 100))] + coord_list = [mm(self.dpi, xm / 100) for xm in range(0, (width + 1) * 100, + int(units_per_mm * 100))] + for a in range(0, len(coord_list)): + xm = pt_list[a] + x = coord_list[a] + n = xm + self.c.move_to(x, mm(self.dpi, -4)) + write(self.c, "%d" % n, self.font_bold, mm(self.dpi, 2.5), centered=True) + + self.c.move_to(mm(self.dpi, 1.5), mm(self.dpi, -4)) + write(self.c, "unit", self.font_bold, mm(self.dpi, 2)) + + self.c.restore() + + def draw_cm_ruler(self, c, dpi, width=130): c.save() c.set_line_cap(cairo.LINE_CAP_SQUARE) |