def __on_size_allocated_cb(self): if not self.__cut_grips is None: return (a, b, img_w, img_h) = self.imgs['orig'][1].getbbox() orig_alloc = self.__original_img_widgets['viewport'].get_allocation() (orig_alloc_w, orig_alloc_h) = (orig_alloc.width, orig_alloc.height) factor_w = (float(orig_alloc_w) / img_w) factor_h = (float(orig_alloc_h) / img_h) factor = min(factor_w, factor_h) if factor > 1.0: factor = 1.0 target_size = (int(factor * img_w), int(factor * img_h)) copy = self.imgs['orig'][1].copy() self.imgs['resized'] = (factor, copy.resize(target_size, PIL.Image.BILINEAR)) self.__cut_grips = ImgGripHandler( [self.imgs['resized'], self.imgs['orig']], self.__original_img_widgets['scrolledwindow'], self.__original_img_widgets['eventbox'], self.__original_img_widgets['img']) self.__cut_grips.visible = False self.__cut_grips.connect("grip-moved", self.__on_grip_moved_cb) self.__redraw_result()
def __on_size_allocated_cb(self): if not self.__cut_grips is None: return (a, b, img_w, img_h) = self.imgs['orig'][1].getbbox() orig_alloc = self.__original_img_widgets['viewport'].get_allocation() (orig_alloc_w, orig_alloc_h) = (orig_alloc.width, orig_alloc.height) factor_w = (float(orig_alloc_w) / img_w) factor_h = (float(orig_alloc_h) / img_h) factor = min(factor_w, factor_h) if factor > 1.0: factor = 1.0 target_size = (int(factor * img_w), int(factor * img_h)) copy = self.imgs['orig'][1].copy() self.imgs['resized'] = (factor, copy.resize( target_size, Image.BILINEAR)) self.__cut_grips = ImgGripHandler( [self.imgs['resized'], self.imgs['orig']], self.__original_img_widgets['scrolledwindow'], self.__original_img_widgets['eventbox'], self.__original_img_widgets['img']) self.__cut_grips.visible = False self.__cut_grips.connect("grip-moved", self.__on_grip_moved_cb) self.__redraw_result()
class PageEditingDialog(object): def __init__(self, main_window, page): self.page = page widget_tree = load_uifile("pageeditingdialog.glade") self.__dialog = widget_tree.get_object("dialogPageEditing") self.__dialog.set_transient_for(main_window.window) self.__original_img_widgets = { 'img' : widget_tree.get_object("imageOriginal"), 'scrolledwindow' : widget_tree.get_object("scrolledwindowOriginal"), 'eventbox' : widget_tree.get_object("eventboxOriginal"), 'viewport' : widget_tree.get_object("viewportOriginal") } self.__result_img_widget = widget_tree.get_object("imageResult") self.__buttons = { 'cutting' : widget_tree.get_object("togglebuttonCutting"), 'rotate' : { 'clockwise' : (widget_tree.get_object("buttonRotateClockwise"), 90), 'counter_clockwise' : \ (widget_tree.get_object("buttonRotateCounterClockwise"), -90), } } self.__cut_grips = None self.__original_img_widgets['viewport'].connect("size-allocate", lambda widget, size: GObject.idle_add(self.__on_size_allocated_cb)) self.__buttons['cutting'].connect("toggled", lambda widget: GObject.idle_add(self.__on_cutting_button_toggled_cb)) self.__buttons['rotate']['clockwise'][0].connect("clicked", lambda widget: \ GObject.idle_add(self.__on_rotate_activated_cb, widget)) self.__buttons['rotate']['counter_clockwise'][0].connect("clicked", lambda widget: \ GObject.idle_add(self.__on_rotate_activated_cb, widget)) self.page = page self.imgs = { 'orig' : (1.0, self.page.img) } self.__changes = [] def __on_size_allocated_cb(self): if not self.__cut_grips is None: return (a, b, img_w, img_h) = self.imgs['orig'][1].getbbox() orig_alloc = self.__original_img_widgets['viewport'].get_allocation() (orig_alloc_w, orig_alloc_h) = (orig_alloc.width, orig_alloc.height) factor_w = (float(orig_alloc_w) / img_w) factor_h = (float(orig_alloc_h) / img_h) factor = min(factor_w, factor_h) if factor > 1.0: factor = 1.0 target_size = (int(factor * img_w), int(factor * img_h)) copy = self.imgs['orig'][1].copy() self.imgs['resized'] = (factor, copy.resize( target_size, Image.BILINEAR)) self.__cut_grips = ImgGripHandler( [self.imgs['resized'], self.imgs['orig']], self.__original_img_widgets['scrolledwindow'], self.__original_img_widgets['eventbox'], self.__original_img_widgets['img']) self.__cut_grips.visible = False self.__cut_grips.connect("grip-moved", self.__on_grip_moved_cb) self.__redraw_result() def __on_cutting_button_toggled_cb(self): self.__cut_grips.visible = self.__buttons['cutting'].get_active() if not self.__cut_grips.visible: PageCuttingAction.remove_from_action_queue(self.__changes) self.__redraw_result() else: self.__on_grip_moved_cb(self.__cut_grips) def __on_grip_moved_cb(self, grips): cut = self.__cut_grips.get_coords() action = PageCuttingAction(cut) action.add_to_action_queue(self.__changes) self.__redraw_result() def __on_rotate_activated_cb(self, widget): for (button, angle) in self.__buttons['rotate'].values(): if button == widget: break assert(button != None) print "Adding action rotation of %d degrees" % angle rotation = PageRotationAction(angle) rotation.add_to_action_queue(self.__changes) self.__redraw_result() def __redraw_result(self): (scale, img) = self.imgs['resized'] for action in self.__changes: img = action.do(img, scale) img = image2pixbuf(img) self.__result_img_widget.set_from_pixbuf(img) def get_changes(self): resp_id = self.__dialog.run() self.__dialog.destroy() if resp_id == 1: # cancel print "Image editing cancelled by user" return [] return self.__changes
class PageEditingDialog(object): def __init__(self, main_window, page): self.page = page widget_tree = load_uifile("pageeditingdialog.glade") self.__dialog = widget_tree.get_object("dialogPageEditing") self.__dialog.set_transient_for(main_window.window) self.__original_img_widgets = { 'img': widget_tree.get_object("imageOriginal"), 'scrolledwindow': widget_tree.get_object("scrolledwindowOriginal"), 'eventbox': widget_tree.get_object("eventboxOriginal"), 'viewport': widget_tree.get_object("viewportOriginal") } self.__result_img_widget = widget_tree.get_object("imageResult") self.__buttons = { 'cutting': widget_tree.get_object("togglebuttonCutting"), 'rotate': { 'clockwise': (widget_tree.get_object("buttonRotateClockwise"), 90), 'counter_clockwise': (widget_tree.get_object("buttonRotateCounterClockwise"), -90), } } self.__cut_grips = None self.__original_img_widgets['viewport'].connect( "size-allocate", lambda widget, size: GObject.idle_add(self.__on_size_allocated_cb)) self.__buttons['cutting'].connect( "toggled", lambda widget: GObject.idle_add( self.__on_cutting_button_toggled_cb)) self.__buttons['rotate']['clockwise'][0].connect( "clicked", lambda widget: GObject.idle_add(self.__on_rotate_activated_cb, widget)) self.__buttons['rotate']['counter_clockwise'][0].connect( "clicked", lambda widget: GObject.idle_add(self.__on_rotate_activated_cb, widget)) self.page = page self.imgs = { 'orig': (1.0, self.page.img) } self.__changes = [] def __on_size_allocated_cb(self): if not self.__cut_grips is None: return (a, b, img_w, img_h) = self.imgs['orig'][1].getbbox() orig_alloc = self.__original_img_widgets['viewport'].get_allocation() (orig_alloc_w, orig_alloc_h) = (orig_alloc.width, orig_alloc.height) factor_w = (float(orig_alloc_w) / img_w) factor_h = (float(orig_alloc_h) / img_h) factor = min(factor_w, factor_h) if factor > 1.0: factor = 1.0 target_size = (int(factor * img_w), int(factor * img_h)) copy = self.imgs['orig'][1].copy() self.imgs['resized'] = (factor, copy.resize(target_size, PIL.Image.BILINEAR)) self.__cut_grips = ImgGripHandler( [self.imgs['resized'], self.imgs['orig']], self.__original_img_widgets['scrolledwindow'], self.__original_img_widgets['eventbox'], self.__original_img_widgets['img']) self.__cut_grips.visible = False self.__cut_grips.connect("grip-moved", self.__on_grip_moved_cb) self.__redraw_result() def __on_cutting_button_toggled_cb(self): self.__cut_grips.visible = self.__buttons['cutting'].get_active() if not self.__cut_grips.visible: PageCuttingAction.remove_from_action_queue(self.__changes) self.__redraw_result() else: self.__on_grip_moved_cb(self.__cut_grips) def __on_grip_moved_cb(self, grips): cut = self.__cut_grips.get_coords() action = PageCuttingAction(cut) action.add_to_action_queue(self.__changes) self.__redraw_result() def __on_rotate_activated_cb(self, widget): for (button, angle) in self.__buttons['rotate'].values(): if button == widget: break assert(button is not None) logger.info("Adding action rotation of %d degrees" % angle) rotation = PageRotationAction(angle) rotation.add_to_action_queue(self.__changes) self.__redraw_result() def __redraw_result(self): (scale, img) = self.imgs['resized'] for action in self.__changes: img = action.do(img, scale) img = image2pixbuf(img) self.__result_img_widget.set_from_pixbuf(img) def get_changes(self): resp_id = self.__dialog.run() self.__dialog.destroy() if resp_id == 1: # cancel logger.info("Image editing cancelled by user") return [] return self.__changes