class PageProps(DP_Panel): name = _('Page') page_format = None desktop_bg = None page_fill = None border_flag = False def build(self): self.page_format = self.doc.methods.get_default_page_format() self.formats = [ _('Custom'), ] + uc2const.PAGE_FORMAT_NAMES self.pack((5, 10)) # --- hpanel = wal.HPanel(self) hpanel.pack((5, 5)) label = wal.Label(hpanel, _('Default page:')) hpanel.pack(label) hpanel.pack((5, 5)) self.page_combo = wal.Combolist(self, items=self.formats, onchange=self.page_combo_changed) index = 0 state = True if self.page_format[0] in uc2const.PAGE_FORMAT_NAMES: index = self.formats.index(self.page_format[0]) state = False self.page_combo.set_active(index) hpanel.pack(self.page_combo) hpanel.pack((15, 5)) self.orient_keeper = wal.HToggleKeeper(self, ORIENTS, ORIENTS_ICONS, ORIENTS_NAMES, on_change=self.orient_changed) self.orient_keeper.set_mode(self.page_format[2]) hpanel.pack(self.orient_keeper) self.pack(hpanel, fill=True) self.pack((5, 5)) # --- w, h = self.page_format[1] hpanel = wal.HPanel(self) dx = label.get_size()[0] + 10 hpanel.pack((dx, 5)) self.page_width = UnitSpin(self.app, hpanel, w, onchange=self.page_spin_changed) hpanel.pack(self.page_width) hpanel.pack(get_bmp(self, icons.CTX_W_ON_H), padding=5) self.page_height = UnitSpin(self.app, hpanel, h, onchange=self.page_spin_changed) hpanel.pack(self.page_height) hpanel.pack(StaticUnitLabel(self.app, hpanel), padding=5) self.page_width.set_enable(state) self.page_height.set_enable(state) self.pack(hpanel, fill=True) self.pack(wal.HLine(self), padding_all=5, fill=True) # --- hpanel = wal.HPanel(self) hpanel.pack((5, 5)) self.desktop_bg = self.doc.methods.get_desktop_bg() grid = wal.GridPanel(hpanel, 3, 3, 5, 5) grid.add_growable_col(2) grid.pack(wal.Label(hpanel, _('Desktop:'))) self.desktop_color_btn = wal.ColorButton(hpanel, self.desktop_bg) grid.pack(self.desktop_color_btn) grid.pack(CBMiniPalette(grid, onclick=self.desktop_color_btn.set_value)) self.page_fill = self.doc.methods.get_page_fill() if self.page_fill[0] == FILL_SOLID: color1 = self.page_fill[1] color2 = [1.0, 1.0, 1.0] else: color1 = self.page_fill[1][0] color2 = self.page_fill[1][1] grid.pack(wal.Label(hpanel, _('Page:'))) self.page_color1_btn = wal.ColorButton(hpanel, color1) grid.pack(self.page_color1_btn) grid.pack(CBMiniPalette(grid, onclick=self.page_color1_btn.set_value)) grid.pack((5, 5)) self.page_color2_btn = wal.ColorButton(hpanel, color2) grid.pack(self.page_color2_btn) self.colors2 = CBMiniPalette(grid, onclick=self.page_color2_btn.set_value) grid.pack(self.colors2) if not self.page_fill[0] == FILL_PATTERN: self.page_color2_btn.set_enable(False) self.colors2.set_enable(False) hpanel.pack(grid, fill=True) hpanel.pack((5, 5)) self.pack(hpanel, fill=True) # --- vpanel = wal.VPanel(self) if wal.IS_MSW: vpanel.pack((5, 5)) self.pattern_check = wal.Checkbox(vpanel, _('Use pattern for page fill'), self.page_fill[0] == FILL_PATTERN, onclick=self.pattern_check_changed) vpanel.pack(self.pattern_check, align_center=False) if wal.IS_MSW: vpanel.pack((5, 5)) self.border_flag = self.doc.methods.get_page_border() self.border_check = wal.Checkbox(vpanel, _('Show page border'), self.border_flag) vpanel.pack(self.border_check, align_center=False) self.pack(vpanel, fill=True, padding_all=5) def page_combo_changed(self): state = False if not self.page_combo.get_active(): state = True else: w, h = uc2const.PAGE_FORMATS[self.page_combo.get_active_value()] self.page_width.set_point_value(w) self.page_height.set_point_value(h) self.orient_keeper.set_mode(uc2const.PORTRAIT) self.page_width.set_enable(state) self.page_height.set_enable(state) def page_spin_changed(self): w = self.page_width.get_point_value() h = self.page_height.get_point_value() if w < h: mode = uc2const.PORTRAIT else: mode = uc2const.LANDSCAPE self.orient_keeper.set_mode(mode) def orient_changed(self, mode): w = self.page_width.get_point_value() h = self.page_height.get_point_value() w, h = h, w self.page_width.set_point_value(w) self.page_height.set_point_value(h) def pattern_check_changed(self): state = self.pattern_check.get_value() self.page_color2_btn.set_enable(state) self.colors2.set_enable(state) def save(self): page_format = [ self.page_combo.get_active_value(), [ self.page_width.get_point_value(), self.page_height.get_point_value(), ], self.orient_keeper.get_mode() ] if not self.page_format == page_format: self.api.set_default_page_format(page_format) desktop_bg = self.desktop_color_btn.get_value() if not self.desktop_bg == desktop_bg: self.api.set_desktop_bg(desktop_bg) color1 = self.page_color1_btn.get_value() if self.pattern_check.get_value(): color2 = self.page_color2_btn.get_value() page_fill = [FILL_PATTERN, [color1, color2]] else: page_fill = [FILL_SOLID, color1] if not self.page_fill == page_fill: self.api.set_page_fill(page_fill) border_flag = self.border_check.get_value() if not self.border_flag == border_flag: self.api.set_page_border(border_flag)
class RotateTransform(AbstractTransform): name = _('Rotation') def build(self): grid = wal.GridPanel(self, 1, 3, 2, 2) grid.pack(wal.Label(grid, _('Angle:'))) self.angle = AngleSpin(grid, val_range=(-360.0, 360.0), check_focus=True) grid.pack(self.angle) grid.pack(wal.Label(grid, u'°')) self.pack(grid, align_center=False, padding=5) self.pack(wal.Label(grid, _('Center:')), align_center=False, padding=5) grid = wal.GridPanel(self, 2, 3, 2, 2) grid.pack(get_bmp(grid, make_artid('h-sign'))) self.h_spin = UnitSpin(self.app, grid, can_be_negative=True) grid.pack(self.h_spin) grid.pack(UnitLabel(self.app, grid)) grid.pack(get_bmp(grid, make_artid('v-sign'))) self.v_spin = UnitSpin(self.app, grid, can_be_negative=True) grid.pack(self.v_spin) grid.pack(UnitLabel(self.app, grid)) self.pack(grid, align_center=False, padding_all=5) self.center = wal.Checkbox(self, _('Relative center'), onclick=self.on_click) self.pack(self.center, align_center=False, padding=5) self.active_widgets = [self.angle, self.center] self.on_click() def on_click(self): state = False if self.center.get_value(): state = True self.user_changes = True if self.callback: self.callback() self.v_spin.set_enable(state) self.h_spin.set_enable(state) def set_enable(self, state): if self.center.get_value(): self.v_spin.set_enable(state) self.h_spin.set_enable(state) else: self.user_changes = False AbstractTransform.set_enable(self, state) def update(self): if not self.app.insp.is_selection(): return if self.user_changes: return bbox = self.get_selection_bbox() w, h = self.get_selection_size() bp = self.doc_to_coords([ bbox[0] + w * (1.0 + self.orientation[0]) / 2.0, bbox[1] + h * (1.0 + self.orientation[1]) / 2.0 ]) self.h_spin.set_point_value(bp[0]) self.v_spin.set_point_value(bp[1]) def get_trafo(self): angle = self.angle.get_angle_value() center_x = self.h_spin.get_point_value() center_y = self.v_spin.get_point_value() center_x, center_y = self.coords_to_doc([center_x, center_y]) m21 = math.sin(angle) m11 = m22 = math.cos(angle) m12 = -m21 dx = center_x - m11 * center_x + m21 * center_y dy = center_y - m21 * center_x - m11 * center_y return [m11, m21, m12, m22, dx, dy]
class PagePlugin(CtxPlugin): name = 'PagePlugin' update_flag = False format = [] formats = None combo = None width_spin = None height_spin = None portrait = None landscape = None def __init__(self, app, parent): CtxPlugin.__init__(self, app, parent) events.connect(events.DOC_CHANGED, self.update) events.connect(events.DOC_MODIFIED, self.update) events.connect(events.PAGE_CHANGED, self.update) def build(self): self.formats = [ _('Custom'), ] + PAGE_FORMAT_NAMES self.combo = Combolist(self, items=self.formats, onchange=self.combo_changed) self.add(self.combo, 0, LEFT | CENTER, 2) self.add((3, 3)) self.width_spin = UnitSpin(self.app, self, onchange=self.width_spin_changed) self.add(self.width_spin, 0, LEFT | CENTER, 2) self.add(get_bmp(self, icons.CTX_W_ON_H), 0, LEFT | CENTER, 1) self.height_spin = UnitSpin(self.app, self, onchange=self.height_spin_changed) self.add(self.height_spin, 0, LEFT | CENTER, 2) self.add((2, 2)) self.portrait = ImageToggleButton(self, True, icons.CTX_PAGE_PORTRAIT, onchange=self.portrait_toggled, tooltip=ORIENTS_NAMES[0]) self.add(self.portrait, 0, LEFT | CENTER, 2) self.landscape = ImageToggleButton(self, False, icons.CTX_PAGE_LANDSCAPE, onchange=self.landscape_toggled, tooltip=ORIENTS_NAMES[1]) self.add(self.landscape, 0, LEFT | CENTER, 2) self.width_spin.set_enable(False) self.height_spin.set_enable(False) def update(self, *args): if self.insp.is_doc(): self.update_flag = True page_format = self.app.current_doc.active_page.page_format self.format = page_format width, height = page_format[1] if page_format[0] in PAGE_FORMAT_NAMES: self.combo.set_active(self.formats.index(page_format[0])) if page_format[2] == PORTRAIT: self.portrait.set_active(True) self.landscape.set_active(False) else: self.portrait.set_active(False) self.landscape.set_active(True) self.width_spin.set_point_value(width) self.height_spin.set_point_value(height) self.width_spin.set_enable(False) self.height_spin.set_enable(False) else: self.combo.set_active(self.formats.index(_('Custom'))) if page_format[2] == PORTRAIT: self.portrait.set_active(True) self.landscape.set_active(False) else: self.portrait.set_active(False) self.landscape.set_active(True) self.width_spin.set_point_value(width) self.height_spin.set_point_value(height) self.width_spin.set_enable(True) self.height_spin.set_enable(True) self.update_flag = False def combo_changed(self, *args): if self.update_flag: return if not self.format[0] == self.formats[self.combo.get_active()]: self.update_flag = True if self.formats[self.combo.get_active()] in PAGE_FORMAT_NAMES: w, h = PAGE_FORMATS[self.formats[self.combo.get_active()]] if self.portrait.get_active() and w > h: self.width_spin.set_point_value(w) self.height_spin.set_point_value(h) self.portrait.set_active(False) self.landscape.set_active(True) elif self.landscape.get_active() and w > h: self.width_spin.set_point_value(w) self.height_spin.set_point_value(h) elif self.portrait.get_active() and w < h: self.width_spin.set_point_value(w) self.height_spin.set_point_value(h) else: self.width_spin.set_point_value(h) self.height_spin.set_point_value(w) self.update_flag = False self.changes() def width_spin_changed(self, *args): if self.update_flag: return if not self.format[1][0] == self.width_spin.get_point_value(): self.update_flag = True w = self.width_spin.get_point_value() h = self.height_spin.get_point_value() if w > h and self.portrait.get_active(): self.portrait.set_active(False) self.landscape.set_active(True) elif w < h and self.landscape.get_active(): self.portrait.set_active(True) self.landscape.set_active(False) self.update_flag = False self.changes() def height_spin_changed(self, *args): if self.update_flag: return if not self.format[1][1] == self.height_spin.get_point_value(): self.update_flag = True w = self.width_spin.get_point_value() h = self.height_spin.get_point_value() if w > h and self.portrait.get_active(): self.portrait.set_active(False) self.landscape.set_active(True) elif w < h and self.landscape.get_active(): self.portrait.set_active(True) self.landscape.set_active(False) self.update_flag = False self.changes() def portrait_toggled(self, *args): if self.update_flag: return if self.portrait.get_active(): self.update_flag = True self.landscape.set_active(False) h = self.width_spin.get_point_value() w = self.height_spin.get_point_value() self.width_spin.set_point_value(w) self.height_spin.set_point_value(h) self.update_flag = False self.changes() else: self.update_flag = True self.portrait.set_active(True) self.update_flag = False def landscape_toggled(self, *args): if self.update_flag: return if self.landscape.get_active(): self.update_flag = True self.portrait.set_active(False) h = self.width_spin.get_point_value() w = self.height_spin.get_point_value() self.width_spin.set_point_value(w) self.height_spin.set_point_value(h) self.update_flag = False self.changes() else: self.update_flag = True self.landscape.set_active(True) self.update_flag = False def changes(self): new_format = [ self.formats[self.combo.get_active()], ] new_format += [(self.width_spin.get_point_value(), self.height_spin.get_point_value())] if self.portrait.get_active(): new_format += [ PORTRAIT, ] else: new_format += [ LANDSCAPE, ] self.app.current_doc.api.set_page_format(new_format)
class PagePlugin(CtxPlugin): name = 'PagePlugin' update_flag = False format = None formats = None combo = None width_spin = None height_spin = None portrait = None landscape = None def __init__(self, app, parent): CtxPlugin.__init__(self, app, parent) events.connect(events.DOC_CHANGED, self.update) events.connect(events.DOC_MODIFIED, self.update) events.connect(events.PAGE_CHANGED, self.update) def build(self): self.formats = [ _('Custom'), ] + PAGE_FORMAT_NAMES self.combo = Combolist(self, items=self.formats, onchange=self.combo_changed) self.pack(self.combo, padding_all=3) self.width_spin = UnitSpin(self.app, self, onchange=self.width_spin_changed) self.pack(self.width_spin) self.pack((3, 3)) self.pack(get_bmp(self, icons.CTX_W_ON_H)) self.height_spin = UnitSpin(self.app, self, onchange=self.height_spin_changed) self.pack(self.height_spin, padding_all=3) self.pack((2, 2)) self.portrait = ImageToggleButton(self, True, icons.CTX_PAGE_PORTRAIT, onchange=self.portrait_toggled, tooltip=ORIENTS_NAMES[0]) self.pack(self.portrait, padding=2) self.landscape = ImageToggleButton(self, False, icons.CTX_PAGE_LANDSCAPE, onchange=self.landscape_toggled, tooltip=ORIENTS_NAMES[1]) self.pack(self.landscape, padding=2) self.width_spin.set_enable(False) self.height_spin.set_enable(False) def update(self, *args): if self.insp.is_doc(): self.update_flag = True page_format = self.app.current_doc.active_page.page_format self.format = page_format width, height = page_format[1] if page_format[0] in PAGE_FORMAT_NAMES: self.combo.set_active(self.formats.index(page_format[0])) if page_format[2] == PORTRAIT: self.portrait.set_active(True) self.landscape.set_active(False) else: self.portrait.set_active(False) self.landscape.set_active(True) self.width_spin.set_point_value(width) self.height_spin.set_point_value(height) self.width_spin.set_enable(False) self.height_spin.set_enable(False) else: self.combo.set_active(self.formats.index(_('Custom'))) if page_format[2] == PORTRAIT: self.portrait.set_active(True) self.landscape.set_active(False) else: self.portrait.set_active(False) self.landscape.set_active(True) self.width_spin.set_point_value(width) self.height_spin.set_point_value(height) self.width_spin.set_enable(True) self.height_spin.set_enable(True) self.update_flag = False def combo_changed(self, *_args): if self.update_flag: return if not self.format[0] == self.formats[self.combo.get_active()]: self.update_flag = True if self.formats[self.combo.get_active()] in PAGE_FORMAT_NAMES: w, h = PAGE_FORMATS[self.formats[self.combo.get_active()]] if self.portrait.get_active() and w > h: self.width_spin.set_point_value(w) self.height_spin.set_point_value(h) self.portrait.set_active(False) self.landscape.set_active(True) elif self.landscape.get_active() and w > h: self.width_spin.set_point_value(w) self.height_spin.set_point_value(h) elif self.portrait.get_active() and w < h: self.width_spin.set_point_value(w) self.height_spin.set_point_value(h) else: self.width_spin.set_point_value(h) self.height_spin.set_point_value(w) self.update_flag = False self.changes() def width_spin_changed(self, *_args): if self.update_flag: return if not self.format[1][0] == self.width_spin.get_point_value(): self.update_flag = True w = self.width_spin.get_point_value() h = self.height_spin.get_point_value() if w > h and self.portrait.get_active(): self.portrait.set_active(False) self.landscape.set_active(True) elif w < h and self.landscape.get_active(): self.portrait.set_active(True) self.landscape.set_active(False) self.update_flag = False self.changes() def height_spin_changed(self, *_args): if self.update_flag: return if not self.format[1][1] == self.height_spin.get_point_value(): self.update_flag = True w = self.width_spin.get_point_value() h = self.height_spin.get_point_value() if w > h and self.portrait.get_active(): self.portrait.set_active(False) self.landscape.set_active(True) elif w < h and self.landscape.get_active(): self.portrait.set_active(True) self.landscape.set_active(False) self.update_flag = False self.changes() def portrait_toggled(self, *_args): if self.update_flag: return if self.portrait.get_active(): self.update_flag = True self.landscape.set_active(False) h = self.width_spin.get_point_value() w = self.height_spin.get_point_value() self.width_spin.set_point_value(w) self.height_spin.set_point_value(h) self.update_flag = False self.changes() else: self.update_flag = True self.portrait.set_active(True) self.update_flag = False def landscape_toggled(self, *_args): if self.update_flag: return if self.landscape.get_active(): self.update_flag = True self.portrait.set_active(False) h = self.width_spin.get_point_value() w = self.height_spin.get_point_value() self.width_spin.set_point_value(w) self.height_spin.set_point_value(h) self.update_flag = False self.changes() else: self.update_flag = True self.landscape.set_active(True) self.update_flag = False def changes(self): doc = self.app.current_doc new_format = [ self.formats[self.combo.get_active()], ] new_format += [(self.width_spin.get_point_value(), self.height_spin.get_point_value())] if self.portrait.get_active(): new_format += [ PORTRAIT, ] else: new_format += [ LANDSCAPE, ] current_page_format = deepcopy(doc.active_page.page_format) doc.api.set_page_format(new_format) pdict = PAGE_FORMATS_MORE if new_format[0] in pdict and current_page_format[0] in pdids and \ pdict[current_page_format[0]] != pdict[new_format[0]]: units, jump = pdict[new_format[0]] doc.api.set_doc_units(units) geom = doc.methods.get_grid_values()[:2] + [jump, jump] doc.api.set_grid_values(geom) config.obj_jump = jump doc.canvas.zoom_fit_to_page()
class PageProps(DP_Panel): name = _('Page') page_format = None desktop_bg = None page_fill = None border_flag = False def build(self): self.page_format = self.doc.methods.get_default_page_format() self.formats = [_('Custom'), ] + uc2const.PAGE_FORMAT_NAMES self.pack((5, 10)) #--- hpanel = wal.HPanel(self) hpanel.pack((5, 5)) label = wal.Label(hpanel, _('Default page:')) hpanel.pack(label) hpanel.pack((5, 5)) self.page_combo = wal.Combolist(self, items=self.formats, onchange=self.page_combo_changed) index = 0 state = True if self.page_format[0] in uc2const.PAGE_FORMAT_NAMES: index = self.formats.index(self.page_format[0]) state = False self.page_combo.set_active(index) hpanel.pack(self.page_combo) hpanel.pack((15, 5)) self.orient_keeper = wal.HToggleKeeper(self, ORIENTS, ORIENTS_ICONS, ORIENTS_NAMES, on_change=self.orient_changed) self.orient_keeper.set_mode(self.page_format[2]) hpanel.pack(self.orient_keeper) self.pack(hpanel, fill=True) self.pack((5, 5)) #--- w, h = self.page_format[1] hpanel = wal.HPanel(self) dx = label.get_size()[0] + 10 hpanel.pack((dx, 5)) self.page_width = UnitSpin(self.app, hpanel, w, onchange=self.page_spin_changed) hpanel.pack(self.page_width) hpanel.pack(get_bmp(self, icons.CTX_W_ON_H), padding=5) self.page_height = UnitSpin(self.app, hpanel, h, onchange=self.page_spin_changed) hpanel.pack(self.page_height) hpanel.pack(StaticUnitLabel(self.app, hpanel), padding=5) self.page_width.set_enable(state) self.page_height.set_enable(state) self.pack(hpanel, fill=True) self.pack(wal.HLine(self), padding_all=5, fill=True) #--- hpanel = wal.HPanel(self) hpanel.pack((5, 5)) self.desktop_bg = self.doc.methods.get_desktop_bg() grid = wal.GridPanel(hpanel, 3, 3, 5, 5) grid.add_growable_col(2) grid.pack(wal.Label(hpanel, _('Desktop:'))) self.desktop_color_btn = wal.ColorButton(hpanel, self.desktop_bg) grid.pack(self.desktop_color_btn) grid.pack(CBMiniPalette(grid, onclick=self.desktop_color_btn.set_value)) self.page_fill = self.doc.methods.get_page_fill() if self.page_fill[0] == FILL_SOLID: color1 = self.page_fill[1] color2 = [1.0, 1.0, 1.0] else: color1 = self.page_fill[1][0] color2 = self.page_fill[1][1] grid.pack(wal.Label(hpanel, _('Page:'))) self.page_color1_btn = wal.ColorButton(hpanel, color1) grid.pack(self.page_color1_btn) grid.pack(CBMiniPalette(grid, onclick=self.page_color1_btn.set_value)) grid.pack((5, 5)) self.page_color2_btn = wal.ColorButton(hpanel, color2) grid.pack(self.page_color2_btn) self.colors2 = CBMiniPalette(grid, onclick=self.page_color2_btn.set_value) grid.pack(self.colors2) if not self.page_fill[0] == FILL_PATTERN: self.page_color2_btn.set_enable(False) self.colors2.set_enable(False) hpanel.pack(grid, fill=True) hpanel.pack((5, 5)) self.pack(hpanel, fill=True) #--- vpanel = wal.VPanel(self) if wal.is_msw(): vpanel.pack((5, 5)) self.pattern_check = wal.Checkbox(vpanel, _('Use pattern for page fill'), self.page_fill[0] == FILL_PATTERN, onclick=self.pattern_check_changed) vpanel.pack(self.pattern_check, align_center=False) if wal.is_msw(): vpanel.pack((5, 5)) self.border_flag = self.doc.methods.get_page_border() self.border_check = wal.Checkbox(vpanel, _('Show page border'), self.border_flag) vpanel.pack(self.border_check, align_center=False) self.pack(vpanel, fill=True, padding_all=5) def page_combo_changed(self): state = False if not self.page_combo.get_active(): state = True else: w, h = uc2const.PAGE_FORMATS[self.page_combo.get_active_value()] self.page_width.set_point_value(w) self.page_height.set_point_value(h) self.orient_keeper.set_mode(uc2const.PORTRAIT) self.page_width.set_enable(state) self.page_height.set_enable(state) def page_spin_changed(self): w = self.page_width.get_point_value() h = self.page_height.get_point_value() if w < h: mode = uc2const.PORTRAIT else: mode = uc2const.LANDSCAPE self.orient_keeper.set_mode(mode) def orient_changed(self, mode): w = self.page_width.get_point_value() h = self.page_height.get_point_value() w, h = h, w self.page_width.set_point_value(w) self.page_height.set_point_value(h) def pattern_check_changed(self): state = self.pattern_check.get_value() self.page_color2_btn.set_enable(state) self.colors2.set_enable(state) def save(self): page_format = [self.page_combo.get_active_value(), [self.page_width.get_point_value(), self.page_height.get_point_value(), ], self.orient_keeper.get_mode()] if not self.page_format == page_format: self.api.set_default_page_format(page_format) desktop_bg = self.desktop_color_btn.get_value() if not self.desktop_bg == desktop_bg: self.api.set_desktop_bg(desktop_bg) color1 = self.page_color1_btn.get_value() if self.pattern_check.get_value(): color2 = self.page_color2_btn.get_value() page_fill = [FILL_PATTERN, [color1, color2]] else: page_fill = [FILL_SOLID, color1] if not self.page_fill == page_fill: self.api.set_page_fill(page_fill) border_flag = self.border_check.get_value() if not self.border_flag == border_flag: self.api.set_page_border(border_flag)
class RotateTransform(AbstractTransform): name = _('Rotation') def build(self): grid = wal.GridPanel(self, 1, 3, 2, 2) grid.pack(wal.Label(grid, _('Angle:'))) self.angle = AngleSpin(grid, val_range=(-360.0, 360.0), check_focus=True) grid.pack(self.angle) grid.pack(wal.Label(grid, _('degrees'))) self.pack(grid, align_center=False, padding=5) self.pack(wal.Label(grid, _('Center:')), align_center=False, padding=5) grid = wal.GridPanel(self, 2, 3, 2, 2) grid.pack(get_bmp(grid, make_artid('h-sign'))) self.h_spin = UnitSpin(self.app, grid, can_be_negative=True) grid.pack(self.h_spin) grid.pack(UnitLabel(self.app, grid)) grid.pack(get_bmp(grid, make_artid('v-sign'))) self.v_spin = UnitSpin(self.app, grid, can_be_negative=True) grid.pack(self.v_spin) grid.pack(UnitLabel(self.app, grid)) self.pack(grid, align_center=False, padding_all=5) self.center = wal.Checkbox(self, _('Relative center'), onclick=self.on_click) self.pack(self.center, align_center=False, padding=5) self.active_widgets = [self.angle, self.center] self.on_click() def on_click(self): state = False if self.center.get_value(): state = True self.user_changes = True if self.callback: self.callback() self.v_spin.set_enable(state) self.h_spin.set_enable(state) def set_enable(self, state): if self.center.get_value(): self.v_spin.set_enable(state) self.h_spin.set_enable(state) else: self.user_changes = False AbstractTransform.set_enable(self, state) def update(self): if not self.app.insp.is_selection():return if self.user_changes: return bbox = self.get_selection_bbox() w, h = self.get_selection_size() bp = self.doc_to_coords([bbox[0] + w * (1.0 + self.orientation[0]) / 2.0, bbox[1] + h * (1.0 + self.orientation[1]) / 2.0]) self.h_spin.set_point_value(bp[0]) self.v_spin.set_point_value(bp[1]) def get_trafo(self): angle = self.angle.get_angle_value() center_x = self.h_spin.get_point_value() center_y = self.v_spin.get_point_value() center_x, center_y = self.coords_to_doc([center_x, center_y]) m21 = math.sin(angle) m11 = m22 = math.cos(angle) m12 = -m21 dx = center_x - m11 * center_x + m21 * center_y; dy = center_y - m21 * center_x - m11 * center_y; return [m11, m21, m12, m22, dx, dy]