class Colorbar(object): ''' Colorbar window ''' def __init__(self, parent=None, screenshot=None): ''' init colorbar @param parent: the transient parent for this window @param screenshot: a Screenshot object ''' self.screenshot = screenshot self.win = self.screenshot.window self.height = 36 self.width = 279 self.window = Window(window_type=gtk.WINDOW_POPUP, shadow_visible=False) self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) self.window.set_keep_above(True) self.window.set_transient_for(parent) self.window.set_decorated(False) #vbox = gtk.VBox(False, 0) self.box = gtk.HBox(False, 5) self.size_box = gtk.HBox(False, 5) self.dynamic_box = gtk.HBox() colorbox_align = gtk.Alignment() #colorbox_align.set(0.5, 0.5, 0, 0) colorbox_align.set(0, 0.5, 1, 0) colorbox_align.set_padding(2, 2, 11, 11) colorbox_align.add(self.box) self.window.window_frame.pack_start(colorbox_align, True, True) self.window.set_size_request(self.width, self.height) #self.window.set_size_request(-1, self.height) self.__size_button_dict = {} self.create_size_button("small", ACTION_SIZE_SMALL) self.create_size_button("normal", ACTION_SIZE_NORMAL) self.create_size_button("big", ACTION_SIZE_BIG) self.create_size_button("ellipse_fill", ACTION_SIZE_RECTANGLE_ELLIPSE_FILL) self.create_size_button("rect_fill", ACTION_SIZE_RECTANGLE_ELLIPSE_FILL) self._set_size_button_state("small", True) self.size_align = gtk.Alignment() #self.size_align.set(0.5,0.5,0,0) self.size_align.set(0, 0.5, 1, 0) self.size_align.add(self.size_box) #self.dynamic_box.pack_start(self.size_align) self.box.pack_start(self.dynamic_box) # font select self.font_box = gtk.HBox(False, 5) font_img = gtk.image_new_from_pixbuf(app_theme.get_pixbuf("action/text_normal.png").get_pixbuf()) self.font_spin = SpinBox(self.screenshot.font_size, 8, 72, 1) self.font_spin.connect("value-changed", self._font_size_changed) self.font_spin.value_entry.set_can_focus(False) self.font_box.pack_start(font_img) self.font_box.pack_start(self.font_spin) self.font_align = gtk.Alignment() self.font_align.set(0.5,0.5,0,0) self.font_align.add(self.font_box) # color select #self.color_select = gtk.EventBox() self.color_select = gtk.Image() pix = app_theme.get_pixbuf("color_big/red.png").get_pixbuf() self.color_select.set_from_pixbuf(pix) self.box.pack_start(self.color_select, False, False) # color button self.vbox = gtk.VBox(False, 2) self.above_hbox = gtk.HBox(False, 2) self.below_hbox = gtk.HBox(False, 2) self.color_map = { 'black' : "#000000", # 1-1 'gray_dark' : "#808080", # 1-2 'red' : "#FF0000", # 1-3 'yellow_dark' : "#FF9B00", # 1-4 'yellow' : "#FFFF00", # 1-5 'green' : "#B2E700", # 1-6 'green_dark' : "#008000", # 1-7 'wathet_dark' : "#008080", # 1-8 'white' : "#FFFFFF", # 2-1 'gray' : "#C0C0C0", # 2-2 'red_dark' : "#E2004E", # 2-3 'pink' : "#E2007A", # 2-4 'pink_dark' : "#800080", # 2-5 'blue_dark' : "#000080", # 2-6 'blue' : "#0085E1", # 2-7 'wathet' : "#009DE0"} # 2-8 self.create_color_button(self.above_hbox, "black") self.create_color_button(self.above_hbox, "gray_dark") self.create_color_button(self.above_hbox, "red") self.create_color_button(self.above_hbox, "yellow_dark") self.create_color_button(self.above_hbox, "yellow") self.create_color_button(self.above_hbox, "green") self.create_color_button(self.above_hbox, "green_dark") self.create_color_button(self.above_hbox, "wathet_dark") self.create_color_button(self.below_hbox, "white") self.create_color_button(self.below_hbox, "gray") self.create_color_button(self.below_hbox, "red_dark") self.create_color_button(self.below_hbox, "pink") self.create_color_button(self.below_hbox, "pink_dark") self.create_color_button(self.below_hbox, "blue_dark") self.create_color_button(self.below_hbox, "blue") self.create_color_button(self.below_hbox, "wathet") self.vbox.pack_start(self.above_hbox) self.vbox.pack_start(self.below_hbox) self.box.pack_start(self.vbox) def create_color_button(self, box, name): ''' create color button @param box: a gtk.HBox @param name: the button's name ''' button = ImageButton( app_theme.get_pixbuf("color/" + name + ".png"), app_theme.get_pixbuf("color/" + name + "_hover.png"), app_theme.get_pixbuf("color/" + name + "_hover.png")) button.connect('pressed', lambda w:self._color_button_pressed(name)) box.pack_start(button) def create_toggle_button(self, name): ''' create a togglebutton @param name: the button's name @return: a dtk.ui.ToggleButton ''' button = ToggleButton( app_theme.get_pixbuf("size/" + name + ".png"), app_theme.get_pixbuf("size/" + name + "_press.png"), app_theme.get_pixbuf("size/" + name + "_hover.png"), app_theme.get_pixbuf("size/" + name + "_press.png")) button.set_name(name) return button def create_size_button(self, name, index): ''' create size button @param name: the button's name @param index: the button's index in button list @return: a dtk.ui.ToggleButton ''' button = self.create_toggle_button(name) button.connect("pressed", self._size_button_pressed, index) #button.connect("toggled", self._size_button_toggled, name) button.connect("released", self._size_button_released) self.size_box.pack_start(button) self.__size_button_dict[name] = button return button def _font_size_changed(self, widget, value): '''font size changed, SpinBox changed callback''' self.screenshot.font_size = value if self.screenshot.show_text_window_flag: if not self.screenshot.text_window.set_font_size(value): #print value, self.screenshot.text_window.get_font_size() widget.set_value(self.screenshot.text_window.get_font_size()) self.win.refresh() def _color_button_pressed(self, name): ''' color button pressed callback''' pix = app_theme.get_pixbuf("color_big/" + name + ".png").get_pixbuf() self.color_select.set_from_pixbuf(pix) if self.screenshot is None: return self.screenshot.action_color = self.color_map[name] if self.screenshot.show_text_window_flag: self.screenshot.text_window.set_text_color(self.screenshot.action_color) self.win.refresh() def _size_button_pressed(self, widget, index): ''' size button pressed callback''' if self.screenshot is None: return self.screenshot.action_size = index for each in self.__size_button_dict: if self.__size_button_dict[each] == widget: continue else: self.__size_button_dict[each].set_active(False) def _size_button_released(self, widget): ''' size button release callback''' if not widget.get_active(): widget.set_active(True) def _set_size_button_state(self, name, state): ''' set size button state @param name: the button's name which will set @param state: the state to set, True or False ''' for each in self.__size_button_dict.keys(): if each == name: self.__size_button_dict[name].set_active(state) def show(self): ''' show the colorbar''' # action is text, show font size set if self.screenshot.action == ACTION_TEXT: self.window.set_size_request(self.width, self.height) self.window.resize(self.width, self.height) if self.size_align in self.dynamic_box.get_children(): self.dynamic_box.remove(self.size_align) if self.font_align not in self.dynamic_box.get_children(): self.dynamic_box.add(self.font_align) self.dynamic_box.show_all() # show draw size else: if self.font_align in self.dynamic_box.get_children(): self.dynamic_box.remove(self.font_align) if self.size_align not in self.dynamic_box.get_children(): self.dynamic_box.add(self.size_align) self.dynamic_box.show_all() # actin is rectangle or ellispe, show fill button # show rect fill button if self.screenshot.action == ACTION_RECTANGLE: self.window.set_size_request(self.width, self.height) self.window.resize(self.width, self.height) if self.__size_button_dict['rect_fill'] not in self.size_box.get_children(): self.size_box.pack_start(self.__size_button_dict['rect_fill']) if self.__size_button_dict['ellipse_fill'] in self.size_box.get_children(): self.size_box.remove(self.__size_button_dict['ellipse_fill']) if self.__size_button_dict['ellipse_fill'].get_active(): self.__size_button_dict['rect_fill'].pressed() self.__size_button_dict['rect_fill'].released() # show ellipse fill button elif self.screenshot.action == ACTION_ELLIPSE: self.window.set_size_request(self.width, self.height) self.window.resize(self.width, self.height) if self.__size_button_dict['ellipse_fill'] not in self.size_box.get_children(): self.size_box.pack_start(self.__size_button_dict['ellipse_fill']) if self.__size_button_dict['rect_fill'] in self.size_box.get_children(): self.size_box.remove(self.__size_button_dict['rect_fill']) if self.__size_button_dict['rect_fill'].get_active(): self.__size_button_dict['ellipse_fill'].pressed() self.__size_button_dict['ellipse_fill'].released() # don't show fill button else: self.window.set_size_request(self.width, self.height) self.window.resize(self.width, self.height) if self.__size_button_dict['rect_fill'] in self.size_box.get_children(): if self.__size_button_dict['rect_fill'].get_active(): self.__size_button_dict['small'].pressed() self.__size_button_dict['small'].released() self.size_box.remove(self.__size_button_dict['rect_fill']) if self.__size_button_dict['ellipse_fill'] in self.size_box.get_children(): if self.__size_button_dict['ellipse_fill'].get_active(): self.__size_button_dict['small'].pressed() self.__size_button_dict['small'].released() self.size_box.remove(self.__size_button_dict['ellipse_fill']) self.size_box.show_all() if not self.window.get_visible(): self.window.show_window() #print "colorbox:", self.box.allocation, self.window.allocation def hide(self): '''hide the toolbar''' if self.window.get_visible(): self.window.hide_all()
class Colorbar(): ''' Colorbar window ''' def __init__(self, parent=None, screenshot=None): ''' init colorbar @param parent: the transient parent for this window @param screenshot: a Screenshot object ''' self.screenshot = screenshot self.win = self.screenshot.window #padding_x = 5 #padding_y = 3 #icon_width = icon_height = 28 #self.width = 280 #color_num = 9 #self.height = icon_height + padding_y * 2 self.height = 36 self.width = 279 self.width_no_fill = 254 self.width_text = 259 self.window = Window(window_type=gtk.WINDOW_POPUP, shadow_visible=False) self.window.set_type_hint(gtk.gdk.WINDOW_TYPE_HINT_DIALOG) self.window.set_keep_above(True) self.window.set_transient_for(parent) self.window.set_decorated(False) #vbox = gtk.VBox(False, 0) self.box = gtk.HBox(False, 5) self.size_box = gtk.HBox(False, 5) self.dynamic_box = gtk.HBox() colorbox_align = gtk.Alignment() #colorbox_align.set(0.5, 0.5, 0, 0) colorbox_align.set(0, 0.5, 1, 0) colorbox_align.set_padding(2, 2, 11, 11) colorbox_align.add(self.box) self.window.window_frame.pack_start(colorbox_align, True, True) self.window.set_size_request(self.width, self.height) #self.window.set_size_request(-1, self.height) self.__size_button_dict = {} self.create_size_button("small", ACTION_SIZE_SMALL) self.create_size_button("normal", ACTION_SIZE_NORMAL) self.create_size_button("big", ACTION_SIZE_BIG) self.create_size_button("ellipse_fill", ACTION_SIZE_RECTANGLE_ELLIPSE_FILL) self.create_size_button("rect_fill", ACTION_SIZE_RECTANGLE_ELLIPSE_FILL) self._set_size_button_state("small", True) self.size_align = gtk.Alignment() #self.size_align.set(0.5,0.5,0,0) self.size_align.set(0, 0.5, 1, 0) self.size_align.add(self.size_box) #self.dynamic_box.pack_start(self.size_align) self.box.pack_start(self.dynamic_box) # font select self.font_box = gtk.HBox(False, 5) font_img = gtk.image_new_from_pixbuf( app_theme.get_pixbuf("action/text_normal.png").get_pixbuf()) self.font_spin = SpinBox(self.screenshot.font_size, 8, 72, 1) self.font_spin.connect("value-changed", self._font_size_changed) self.font_spin.value_entry.set_can_focus(False) self.font_box.pack_start(font_img) self.font_box.pack_start(self.font_spin) self.font_align = gtk.Alignment() self.font_align.set(0.5, 0.5, 0, 0) self.font_align.add(self.font_box) # color select #self.color_select = gtk.EventBox() self.color_select = gtk.Image() pix = app_theme.get_pixbuf("color_big/red.png").get_pixbuf() self.color_select.set_from_pixbuf(pix) self.box.pack_start(self.color_select, False, False) # color button self.vbox = gtk.VBox(False, 2) self.above_hbox = gtk.HBox(False, 2) self.below_hbox = gtk.HBox(False, 2) self.color_map = { 'black': "#000000", # 1-1 'gray_dark': "#808080", # 1-2 'red': "#FF0000", # 1-3 'yellow_dark': "#FF9B00", # 1-4 'yellow': "#FFFF00", # 1-5 'green': "#B2E700", # 1-6 'green_dark': "#008000", # 1-7 'wathet_dark': "#008080", # 1-8 'white': "#FFFFFF", # 2-1 'gray': "#C0C0C0", # 2-2 'red_dark': "#E2004E", # 2-3 'pink': "#E2007A", # 2-4 'pink_dark': "#800080", # 2-5 'blue_dark': "#000080", # 2-6 'blue': "#0085E1", # 2-7 'wathet': "#009DE0" } # 2-8 self.create_color_button(self.above_hbox, "black") self.create_color_button(self.above_hbox, "gray_dark") self.create_color_button(self.above_hbox, "red") self.create_color_button(self.above_hbox, "yellow_dark") self.create_color_button(self.above_hbox, "yellow") self.create_color_button(self.above_hbox, "green") self.create_color_button(self.above_hbox, "green_dark") self.create_color_button(self.above_hbox, "wathet_dark") self.create_color_button(self.below_hbox, "white") self.create_color_button(self.below_hbox, "gray") self.create_color_button(self.below_hbox, "red_dark") self.create_color_button(self.below_hbox, "pink") self.create_color_button(self.below_hbox, "pink_dark") self.create_color_button(self.below_hbox, "blue_dark") self.create_color_button(self.below_hbox, "blue") self.create_color_button(self.below_hbox, "wathet") self.vbox.pack_start(self.above_hbox) self.vbox.pack_start(self.below_hbox) self.box.pack_start(self.vbox) def create_color_button(self, box, name): ''' create color button @param box: a gtk.HBox @param name: the button's name ''' button = ImageButton( app_theme.get_pixbuf("color/" + name + ".png"), app_theme.get_pixbuf("color/" + name + "_hover.png"), app_theme.get_pixbuf("color/" + name + "_hover.png")) button.connect('pressed', lambda w: self._color_button_pressed(name)) box.pack_start(button) def create_toggle_button(self, name): ''' create a togglebutton @param name: the button's name @return: a dtk.ui.ToggleButton ''' button = ToggleButton( app_theme.get_pixbuf("size/" + name + ".png"), app_theme.get_pixbuf("size/" + name + "_press.png"), app_theme.get_pixbuf("size/" + name + "_hover.png"), app_theme.get_pixbuf("size/" + name + "_press.png")) button.set_name(name) return button def create_size_button(self, name, index): ''' create size button @param name: the button's name @param index: the button's index in button list @return: a dtk.ui.ToggleButton ''' button = self.create_toggle_button(name) button.connect("pressed", self._size_button_pressed, index) #button.connect("toggled", self._size_button_toggled, name) button.connect("released", self._size_button_released) self.size_box.pack_start(button) self.__size_button_dict[name] = button return button def _font_size_changed(self, widget, value): '''font size changed, SpinBox changed callback''' self.screenshot.font_size = value if self.screenshot.show_text_window_flag: if not self.screenshot.text_window.set_font_size(value): #print value, self.screenshot.text_window.get_font_size() widget.set_value(self.screenshot.text_window.get_font_size()) self.win.refresh() def _color_button_pressed(self, name): ''' color button pressed callback''' pix = app_theme.get_pixbuf("color_big/" + name + ".png").get_pixbuf() self.color_select.set_from_pixbuf(pix) if self.screenshot is None: return self.screenshot.action_color = self.color_map[name] if self.screenshot.show_text_window_flag: self.screenshot.text_window.set_text_color( self.screenshot.action_color) self.win.refresh() def _size_button_pressed(self, widget, index): ''' size button pressed callback''' if self.screenshot is None: return self.screenshot.action_size = index for each in self.__size_button_dict: if self.__size_button_dict[each] == widget: continue else: self.__size_button_dict[each].set_active(False) def _size_button_released(self, widget): ''' size button release callback''' if not widget.get_active(): widget.set_active(True) def _set_size_button_state(self, name, state): ''' set size button state @param name: the button's name which will set @param state: the state to set, True or False ''' for each in self.__size_button_dict.keys(): if each == name: self.__size_button_dict[name].set_active(state) def show(self): ''' show the colorbar''' # action is text, show font size set if self.screenshot.action == ACTION_TEXT: self.window.set_size_request(self.width_text, self.height) self.window.resize(self.width_text, self.height) if self.size_align in self.dynamic_box.get_children(): self.dynamic_box.remove(self.size_align) if self.font_align not in self.dynamic_box.get_children(): self.dynamic_box.add(self.font_align) # show draw size else: if self.font_align in self.dynamic_box.get_children(): self.dynamic_box.remove(self.font_align) if self.size_align not in self.dynamic_box.get_children(): self.dynamic_box.add(self.size_align) # actin is rectangle or ellispe, show fill button # show rect fill button if self.screenshot.action == ACTION_RECTANGLE: self.window.set_size_request(self.width, self.height) self.window.resize(self.width, self.height) if self.__size_button_dict[ 'rect_fill'] not in self.size_box.get_children(): self.size_box.pack_start( self.__size_button_dict['rect_fill']) if self.__size_button_dict[ 'ellipse_fill'] in self.size_box.get_children(): self.size_box.remove( self.__size_button_dict['ellipse_fill']) if self.__size_button_dict['ellipse_fill'].get_active(): self.__size_button_dict['rect_fill'].pressed() self.__size_button_dict['rect_fill'].released() # show ellipse fill button elif self.screenshot.action == ACTION_ELLIPSE: self.window.set_size_request(self.width, self.height) self.window.resize(self.width, self.height) if self.__size_button_dict[ 'ellipse_fill'] not in self.size_box.get_children(): self.size_box.pack_start( self.__size_button_dict['ellipse_fill']) if self.__size_button_dict[ 'rect_fill'] in self.size_box.get_children(): self.size_box.remove(self.__size_button_dict['rect_fill']) if self.__size_button_dict['rect_fill'].get_active(): self.__size_button_dict['ellipse_fill'].pressed() self.__size_button_dict['ellipse_fill'].released() # don't show fill button else: self.window.set_size_request(self.width_no_fill, self.height) self.window.resize(self.width_no_fill, self.height) if self.__size_button_dict[ 'rect_fill'] in self.size_box.get_children(): if self.__size_button_dict['rect_fill'].get_active(): self.__size_button_dict['small'].pressed() self.__size_button_dict['small'].released() self.size_box.remove(self.__size_button_dict['rect_fill']) if self.__size_button_dict[ 'ellipse_fill'] in self.size_box.get_children(): if self.__size_button_dict['ellipse_fill'].get_active(): self.__size_button_dict['small'].pressed() self.__size_button_dict['small'].released() self.size_box.remove( self.__size_button_dict['ellipse_fill']) if not self.window.get_visible(): self.window.show_window() #print "colorbox:", self.box.allocation, self.window.allocation def hide(self): '''hide the toolbar''' if self.window.get_visible(): self.window.hide_all()