def __init__(self): GObject.GObject.__init__(self) from gui.application import get_app app = get_app() self.app = app self.set_spacing(widgets.SPACING_CRAMPED) self.set_border_width(widgets.SPACING_TIGHT) # GtkTreeView init docmodel = app.doc.model view = layers.RootStackTreeView(docmodel) self._treemodel = view.get_model() self._treeview = view # RootStackTreeView events view.current_layer_rename_requested += self._layer_properties_cb view.current_layer_changed += self._blink_current_layer_cb view.current_layer_menu_requested += self._popup_menu_cb # Drag and drop view.drag_began += self._view_drag_began_cb view.drag_ended += self._view_drag_ended_cb statusbar_cid = app.statusbar.get_context_id(self.STATUSBAR_CONTEXT) self._drag_statusbar_context_id = statusbar_cid # View scrolls view_scroll = Gtk.ScrolledWindow() view_scroll.set_shadow_type(Gtk.ShadowType.ETCHED_IN) vscroll_pol = Gtk.PolicyType.ALWAYS hscroll_pol = Gtk.PolicyType.AUTOMATIC view_scroll.set_policy(hscroll_pol, vscroll_pol) view_scroll.add(view) view_scroll.set_size_request(-1, 200) view_scroll.set_hexpand(True) view_scroll.set_vexpand(True) # Context menu ui_dir = os.path.dirname(os.path.abspath(__file__)) ui_path = os.path.join(ui_dir, "layerswindow.xml") self.app.ui_manager.add_ui_from_file(ui_path) menu = self.app.ui_manager.get_widget("/LayersWindowPopup") menu.set_title(_("Layer")) self.connect("popup-menu", self._popup_menu_cb) menu.attach_to_widget(self, None) self._menu = menu self._layer_specific_ui_mergeids = [] self._layer_specific_ui_class = None # Main layout grid grid = Gtk.Grid() grid.set_row_spacing(widgets.SPACING_TIGHT) grid.set_column_spacing(widgets.SPACING) row = -1 # Visibility set management row += 1 layer_view_ui = gui.layervis.LayerViewUI(docmodel) grid.attach(layer_view_ui.widget, 0, row, 6, 1) self._layer_view_ui = layer_view_ui # Mode dropdown row += 1 # ComboBox w/ list model (mode_num, label, sensitive, scale) modes = list(STACK_MODES + STANDARD_MODES) modes.remove(lib.mypaintlib.CombineSpectralWGM) modes.insert(0, lib.mypaintlib.CombineSpectralWGM) combo = layers.new_blend_mode_combo(modes, MODE_STRINGS) self._layer_mode_combo = combo grid.attach(combo, 0, row, 5, 1) # Opacity widgets adj = Gtk.Adjustment(lower=0, upper=100, step_increment=1, page_increment=10) sbut = Gtk.ScaleButton() sbut.set_adjustment(adj) sbut.remove(sbut.get_child()) sbut.set_hexpand(False) sbut.set_vexpand(False) label_text_widest = self.OPACITY_LABEL_TEXT_TEMPLATE % (100, ) label = Gtk.Label(label_text_widest) label.set_width_chars(len(label_text_widest)) # prog = Gtk.ProgressBar() # prog.set_show_text(False) sbut.add(label) self._opacity_scale_button = sbut # self._opacity_progress = prog self._opacity_label = label self._opacity_adj = adj grid.attach(sbut, 5, row, 1, 1) # Layer list and controls row += 1 layersbox = Gtk.VBox() style = layersbox.get_style_context() style.add_class(Gtk.STYLE_CLASS_LINKED) style = view_scroll.get_style_context() style.set_junction_sides(Gtk.JunctionSides.BOTTOM) list_tools = inline_toolbar(self.app, [ ("NewLayerGroupAbove", "mypaint-layer-group-new-symbolic"), ("NewPaintingLayerAbove", "mypaint-add-symbolic"), ("RemoveLayer", "mypaint-remove-symbolic"), ("RaiseLayerInStack", "mypaint-up-symbolic"), ("LowerLayerInStack", "mypaint-down-symbolic"), ("DuplicateLayer", None), ("MergeLayerDown", None), ]) style = list_tools.get_style_context() style.set_junction_sides(Gtk.JunctionSides.TOP) layersbox.pack_start(view_scroll, True, True, 0) layersbox.pack_start(list_tools, False, False, 0) layersbox.set_hexpand(True) layersbox.set_vexpand(True) grid.attach(layersbox, 0, row, 6, 1) # Background layer controls row += 1 show_bg_btn = Gtk.CheckButton() change_bg_act = self.app.find_action("BackgroundWindow") change_bg_btn = widgets.borderless_button(action=change_bg_act) show_bg_act = self.app.find_action("ShowBackgroundToggle") show_bg_btn.set_related_action(show_bg_act) grid.attach(show_bg_btn, 0, row, 5, 1) grid.attach(change_bg_btn, 5, row, 1, 1) # Pack self.pack_start(grid, False, True, 0) # Updates from the real layers tree (TODO: move to lib/layers.py) self._processing_model_updates = False self._opacity_adj.connect('value-changed', self._opacity_adj_changed_cb) self._layer_mode_combo.connect('changed', self._layer_mode_combo_changed_cb) rootstack = docmodel.layer_stack rootstack.layer_properties_changed += self._layer_propchange_cb rootstack.current_path_updated += self._current_path_updated_cb # Initial update self.connect("show", self._show_cb)
def _init_ui(self): # Dialog for editing dimensions (width, height, DPI) app = self.app buttons = (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT) self._size_dialog = windowing.Dialog( app, _("Frame Size"), app.drawWindow, buttons=buttons ) unit = _('px') height_label = self._new_key_label(_('Height:')) width_label = self._new_key_label(_('Width:')) dpi_label1 = self._new_key_label(_('Resolution:')) dpi_label2 = Gtk.Label(label=_('DPI')) dpi_label2.set_alignment(0.0, 0.5) dpi_label2.set_hexpand(False) dpi_label2.set_vexpand(False) dpi_label2.set_tooltip_text( _("Dots Per Inch (really Pixels Per Inch)") ) color_label = Gtk.Label(label=_('Color:')) color_label.set_alignment(0.0, 0.5) height_entry = Gtk.SpinButton( adjustment=self.height_adj, climb_rate=0.25, digits=0 ) height_entry.set_vexpand(False) height_entry.set_hexpand(True) self.height_adj.set_spin_button(height_entry) width_entry = Gtk.SpinButton( adjustment=self.width_adj, climb_rate=0.25, digits=0 ) width_entry.set_vexpand(False) width_entry.set_hexpand(True) self.width_adj.set_spin_button(width_entry) dpi_entry = Gtk.SpinButton( adjustment=self.dpi_adj, climb_rate=0.0, digits=0 ) dpi_entry.set_vexpand(False) dpi_entry.set_hexpand(True) color_button = Gtk.ColorButton() color_rgba = self.app.preferences.get("frame.color_rgba") color_rgba = [min(max(c, 0), 1) for c in color_rgba] color_gdk = uicolor.to_gdk_color(RGBColor(*color_rgba[0:3])) color_alpha = int(65535 * color_rgba[3]) color_button.set_color(color_gdk) color_button.set_use_alpha(True) color_button.set_alpha(color_alpha) color_button.set_title(_("Frame Color")) color_button.connect("color-set", self._color_set_cb) color_align = Gtk.Alignment.new(0, 0.5, 0, 0) color_align.add(color_button) size_grid = Gtk.Grid() size_grid.set_border_width(12) size_grid.set_row_spacing(6) size_grid.set_column_spacing(6) unit_combobox = Gtk.ComboBoxText() for unit in UnitAdjustment.CONVERT_UNITS.keys(): unit_combobox.append_text(unit) for i, key in enumerate(UnitAdjustment.CONVERT_UNITS): if key == _('px'): unit_combobox.set_active(i) unit_combobox.connect('changed', self.on_unit_changed) unit_combobox.set_hexpand(False) unit_combobox.set_vexpand(False) self._unit_combobox = unit_combobox row = 0 label = self._new_header_label(_("<b>Frame dimensions</b>")) label.set_margin_top(0) size_grid.attach(label, 0, row, 3, 1) row += 1 size_grid.attach(width_label, 0, row, 1, 1) size_grid.attach(width_entry, 1, row, 1, 1) size_grid.attach(unit_combobox, 2, row, 1, 1) row += 1 size_grid.attach(height_label, 0, row, 1, 1) size_grid.attach(height_entry, 1, row, 1, 1) row += 1 label = self._new_header_label(_("<b>Pixel density</b>")) size_grid.attach(label, 0, row, 3, 1) row += 1 size_grid.attach(dpi_label1, 0, row, 1, 1) size_grid.attach(dpi_entry, 1, row, 1, 1) size_grid.attach(dpi_label2, 2, row, 1, 1) # Options panel UI opts_table = Gtk.Table(3, 3) opts_table.set_border_width(3) xopts = Gtk.AttachOptions.FILL | Gtk.AttachOptions.EXPAND yopts = Gtk.AttachOptions.FILL xpad = ypad = 3 row = 0 size_button = Gtk.Button(label="<size-summary>") self._size_button = size_button size_button.connect("clicked", self._size_button_clicked_cb) opts_table.attach(size_button, 0, 2, row, row+1, xopts, yopts, xpad, ypad) row += 1 opts_table.attach(color_label, 0, 1, row, row+1, xopts, yopts, xpad, ypad) opts_table.attach(color_align, 1, 2, row, row+1, xopts, yopts, xpad, ypad) crop_layer_button = Gtk.Button(label=_('Set Frame to Layer')) crop_layer_button.set_tooltip_text(_("Set frame to the extents of " "the current layer")) crop_document_button = Gtk.Button(label=_('Set Frame to Document')) crop_document_button.set_tooltip_text(_("Set frame to the combination " "of all layers")) crop_layer_button.connect('clicked', self.crop_frame_cb, 'CropFrameToLayer') crop_document_button.connect('clicked', self.crop_frame_cb, 'CropFrameToDocument') trim_button = Gtk.Button() trim_action = self.app.find_action("TrimLayer") trim_button.set_related_action(trim_action) trim_button.set_label(_('Trim Layer to Frame')) trim_button.set_tooltip_text(_("Trim parts of the current layer " "which lie outside the frame")) self.enable_button = Gtk.CheckButton() frame_toggle_action = self.app.find_action("FrameToggle") self.enable_button.set_related_action(frame_toggle_action) self.enable_button.set_label(_('Enabled')) row += 1 opts_table.attach(self.enable_button, 1, 2, row, row+1, xopts, yopts, xpad, ypad) row += 1 opts_table.attach(crop_layer_button, 0, 2, row, row+1, xopts, yopts, xpad, ypad) row += 1 opts_table.attach(crop_document_button, 0, 2, row, row+1, xopts, yopts, xpad, ypad) row += 1 opts_table.attach(trim_button, 0, 2, row, row+1, xopts, yopts, xpad, ypad) content_area = self._size_dialog.get_content_area() content_area.pack_start(size_grid, True, True, 0) self._size_dialog.connect('response', self._size_dialog_response_cb) self.add(opts_table)
def _init_ui(self): app = self.app # Dialog for showing and editing the axis value directly buttons = (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT) dialog = gui.windowing.Dialog( app, C_( "symmetry axis options panel: " "axis position dialog: window title", u"X axis Position", ), app.drawWindow, buttons=buttons, ) dialog.connect('response', self._axis_pos_dialog_response_cb) grid = Gtk.Grid() grid.set_border_width(gui.widgets.SPACING_LOOSE) grid.set_column_spacing(gui.widgets.SPACING) grid.set_row_spacing(gui.widgets.SPACING) label = Gtk.Label(label=self._POSITION_LABEL_X_TEXT) label.set_hexpand(False) label.set_vexpand(False) grid.attach(label, 0, 0, 1, 1) entry = Gtk.SpinButton( adjustment=self._axis_pos_adj_x, climb_rate=0.25, digits=0 ) entry.set_hexpand(True) entry.set_vexpand(False) grid.attach(entry, 1, 0, 1, 1) dialog_content_box = dialog.get_content_area() dialog_content_box.pack_start(grid, True, True, 0) self._axis_pos_x_dialog = dialog # Dialog for showing and editing the axis value directly buttons = (Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT) dialog = gui.windowing.Dialog( app, C_( "symmetry axis options panel: " "axis position dialog: window title", u"Y axis Position", ), app.drawWindow, buttons=buttons, ) dialog.connect('response', self._axis_pos_dialog_response_cb) grid = Gtk.Grid() grid.set_border_width(gui.widgets.SPACING_LOOSE) grid.set_column_spacing(gui.widgets.SPACING) grid.set_row_spacing(gui.widgets.SPACING) label = Gtk.Label(label=self._POSITION_LABEL_Y_TEXT) label.set_hexpand(False) label.set_vexpand(False) grid.attach(label, 0, 0, 1, 1) entry = Gtk.SpinButton( adjustment=self._axis_pos_adj_y, climb_rate=0.25, digits=0 ) entry.set_hexpand(True) entry.set_vexpand(False) grid.attach(entry, 1, 0, 1, 1) dialog_content_box = dialog.get_content_area() dialog_content_box.pack_start(grid, True, True, 0) self._axis_pos_y_dialog = dialog # Layout grid row = 0 grid = Gtk.Grid() grid.set_border_width(gui.widgets.SPACING_CRAMPED) grid.set_row_spacing(gui.widgets.SPACING_CRAMPED) grid.set_column_spacing(gui.widgets.SPACING_CRAMPED) self.add(grid) row += 1 label = Gtk.Label(label=self._ALPHA_LABEL_TEXT) label.set_hexpand(False) label.set_halign(Gtk.Align.START) grid.attach(label, 0, row, 1, 1) scale = Gtk.Scale.new_with_range( orientation = Gtk.Orientation.HORIZONTAL, min = 0, max = 1, step = 0.1, ) scale.set_draw_value(False) line_alpha = self.app.preferences.get(_ALPHA_PREFS_KEY, _DEFAULT_ALPHA) scale.set_value(line_alpha) scale.set_hexpand(True) scale.set_vexpand(False) scale.connect("value-changed", self._scale_value_changed_cb) grid.attach(scale, 1, row, 1, 1) row += 1 store = Gtk.ListStore(int, str) sym_types = lib.tiledsurface.SYMMETRY_TYPES active_idx = 0 rootstack = self.app.doc.model.layer_stack starts_with_rotate = ( rootstack.symmetry_type in { lib.mypaintlib.SymmetryRotational, lib.mypaintlib.SymmetrySnowflake, } ) for i, sym_type in enumerate(sym_types): label = lib.tiledsurface.SYMMETRY_STRINGS.get(sym_type) store.append([sym_type, label]) if sym_type == rootstack.symmetry_type: active_idx = i self._symmetry_type_combo = Gtk.ComboBox() self._symmetry_type_combo.set_model(store) self._symmetry_type_combo.set_active(active_idx) self._symmetry_type_combo.set_hexpand(True) cell = Gtk.CellRendererText() self._symmetry_type_combo.pack_start(cell, True) self._symmetry_type_combo.add_attribute(cell, "text", 1) self._symmetry_type_combo.connect( 'changed', self._symmetry_type_combo_changed_cb ) label = Gtk.Label(label=self._SYMMETRY_TYPE_TEXT) label.set_hexpand(False) label.set_halign(Gtk.Align.START) grid.attach(label, 0, row, 1, 1) grid.attach(self._symmetry_type_combo, 1, row, 1, 1) row += 1 label = Gtk.Label(label=self._SYMMETRY_ROT_LINES_TEXT) label.set_hexpand(False) label.set_halign(Gtk.Align.START) self._axis_rot_sym_lines_entry = Gtk.SpinButton( adjustment=self._axis_rot_symmetry_lines, climb_rate=0.25 ) grid.attach(label, 0, row, 1, 1) grid.attach(self._axis_rot_sym_lines_entry, 1, row, 1, 1) row += 1 label = Gtk.Label(label=self._POSITION_LABEL_X_TEXT) label.set_hexpand(False) label.set_halign(Gtk.Align.START) button = Gtk.Button(label=self._POSITION_BUTTON_TEXT_INACTIVE) button.set_vexpand(False) button.connect("clicked", self._axis_pos_x_button_clicked_cb) button.set_hexpand(True) button.set_vexpand(False) grid.attach(label, 0, row, 1, 1) grid.attach(button, 1, row, 1, 1) self._axis_pos_x_button = button row += 1 label = Gtk.Label(label=self._POSITION_LABEL_Y_TEXT) label.set_hexpand(False) label.set_halign(Gtk.Align.START) button = Gtk.Button(label=self._POSITION_BUTTON_TEXT_INACTIVE) button.set_vexpand(False) button.connect("clicked", self._axis_pos_y_button_clicked_cb) button.set_hexpand(True) button.set_vexpand(False) grid.attach(label, 0, row, 1, 1) grid.attach(button, 1, row, 1, 1) self._axis_pos_y_button = button row += 1 button = Gtk.CheckButton() toggle_action = self.app.find_action("SymmetryActive") button.set_related_action(toggle_action) button.set_label(C_( "symmetry axis options panel: axis active checkbox", u'Enabled', )) button.set_hexpand(True) button.set_vexpand(False) grid.attach(button, 1, row, 2, 1) self._axis_active_button = button
def __init__(self): super(SizedVBoxToolWidget, self).__init__() from gui.application import get_app app = get_app() self.app = app self._main_tdw = app.doc.tdw self._model = app.doc.model self.tdw = tileddrawwidget.TiledDrawWidget( idle_redraw_priority=REDRAW_PRIORITY, ) self.tdw.set_model(self._model) self.tdw.zoom_min = 1 / 50.0 self.tdw.set_size_request(64, 64) self.pack_start(self.tdw, True, True, 0) self._cursor = None # Cursors for states self._cursor_move_here = app.cursors.get_icon_cursor( "mypaint-view-zoom-symbolic", cursor_name=gui.cursor.Name.ARROW, ) self._cursor_drag_ready = app.cursors.get_icon_cursor( "mypaint-view-pan-symbolic", cursor_name=gui.cursor.Name.HAND_OPEN, ) self._cursor_drag_active = app.cursors.get_icon_cursor( "mypaint-view-pan-symbolic", cursor_name=gui.cursor.Name.HAND_CLOSED, ) self._cursor_no_op = app.cursors.get_icon_cursor( None, cursor_name=gui.cursor.Name.ARROW, ) # Overlay shapes (used by the overlay) self.viewport_overlay_shapes = [] self.viewport_overlay_topleft = None self.viewport_is_rotated = False self.viewport_is_mirrored = False # TRANSLATORS: The preview panel shows where the "camera" of the # TRANSLATORS: main view is pointing. checkbtn = Gtk.CheckButton(label=_("Show Viewfinder")) checkbtn.set_active(self.show_viewfinder) self.pack_start(checkbtn, False, False, 0) checkbtn.connect("toggled", self._show_viewfinder_toggled_cb) self._overlay = VisibleAreaOverlay(self) self.tdw.display_overlays.append(self._overlay) if self.SUPPORTED_ZOOMLEVELS_ONLY: self._zoomlevel_values = [ 1.0 / 128, 1.5 / 128, 1.0 / 64, 1.5 / 64, 1.0 / 32, 1.5 / 32, 1.0 / 16, 1.0 / 8, 2.0 / 11, 0.25, 1.0 / 3, 0.50, 2.0 / 3, 1.0 ] self.tdw.zoom_min = 1.0 / 128 self.tdw.zoom_max = float(app.preferences.get('view.default_zoom', 1)) # Used for detection of potential effective bbox changes during # canvas modify events self._x_min = self._x_max = None self._y_min = self._y_max = None # Used for determining if a potential bbox change is a real one self._last_bbox = None # Watch various objects for updates docmodel = self._model layerstack = docmodel.layer_stack observed_events = { self._canvas_area_modified_cb: [ docmodel.canvas_area_modified, ], self._recreate_preview_transformation: [ layerstack.layer_inserted, layerstack.layer_deleted, ], } for observer_method, events in observed_events.items(): for event in events: event += observer_method # Watch the main model's frame for scale and zoom docmodel.frame_updated += self._frame_modified_cb docmodel.frame_enabled_changed += self._frame_modified_cb # Main controller observers, for updating our overlay self.app.doc.view_changed_observers.append(self._main_view_changed_cb) # Click and drag tracking self._zone = _EditZone.OUTSIDE self._drag_start = None self._button_pressed = None # Events for the preview widget self.tdw.add_events(Gdk.EventMask.BUTTON1_MOTION_MASK | Gdk.EventMask.SCROLL_MASK) preview_tdw_events = { # Clicks and drags "button-press-event": self._button_press_cb, "button-release-event": self._button_release_cb, "motion-notify-event": self._motion_notify_cb, "scroll-event": self._scroll_event_cb, "leave-notify-event": self._leave_notify_cb, # Handle resizes "size-allocate": self._recreate_preview_transformation, } for signal, callback in preview_tdw_events.items(): self.tdw.connect(signal, callback)
def __init__(self, parent, target): super(HCYMaskPropertiesDialog, self).__init__( title=C_( "HCY Gamut Mask Editor dialog: window title", u"Gamut Mask Editor", ), transient_for=parent, modal=True, destroy_with_parent=True, window_position=Gtk.WindowPosition.CENTER_ON_PARENT, buttons=( Gtk.STOCK_CANCEL, Gtk.ResponseType.REJECT, Gtk.STOCK_OK, Gtk.ResponseType.ACCEPT, ), ) self.target = target ed = HCYMaskEditorWheel() target_mgr = target.get_color_manager() prefs_ro = deepcopy(target_mgr.get_prefs()) datapath = target_mgr.get_data_path() ed_mgr = ColorManager(prefs=prefs_ro, datapath=datapath) ed.set_color_manager(ed_mgr) self.editor = ed ed.set_size_request(300, 300) ed.mask_toggle.set_active(True) self.mask_toggle_ctrl = Gtk.CheckButton( C_( "HCY Gamut Mask Editor dialog: mask-is-active checkbox", u"Active", ), use_underline=False, ) self.mask_toggle_ctrl.set_tooltip_text(ed.mask_toggle.get_tooltip()) ed.mask_observers.append(self.__mask_changed_cb) hbox = Gtk.HBox() hbox.set_spacing(3) # Sidebar buttonbox # On the right and packed to the top. This places its secondary # control, a mask toggle button, next to the "OK" button so it's less # likely to be missed. bbox = Gtk.VButtonBox() new_btn = self.__new_button = Gtk.Button(stock=Gtk.STOCK_NEW) load_btn = self.__load_button = Gtk.Button(stock=Gtk.STOCK_OPEN) save_btn = self.__save_button = Gtk.Button(stock=Gtk.STOCK_SAVE) clear_btn = self.__clear_button = Gtk.Button(stock=Gtk.STOCK_CLEAR) help_btn = self.__help_button = Gtk.LinkButton.new_with_label( uri = MASK_EDITOR_HELP_URI, label = C_( "HCY Mask Editor: action button labels", u"Help…", ), ) new_btn.set_tooltip_text(C_( "HCY Mask Editor: action button tooltips", u"Create mask from template."), ) load_btn.set_tooltip_text(C_( "HCY Mask Editor: action button tooltips", u"Load mask from a GIMP palette file."), ) save_btn.set_tooltip_text(C_( "HCY Mask Editor: action button tooltips", u"Save mask to a GIMP palette file."), ) clear_btn.set_tooltip_text(C_( "HCY Mask Editor: action button tooltips", u"Erase the mask."), ) help_btn.set_tooltip_text(C_( "HCY Mask Editor: action button tooltips", u"Open the online help for this dialog in a web browser."), ) new_btn.connect("clicked", self.__new_clicked) save_btn.connect("clicked", self.__save_clicked) load_btn.connect("clicked", self.__load_clicked) clear_btn.connect("clicked", self.__clear_clicked) bbox.pack_start(new_btn, True, True, 0) bbox.pack_start(load_btn, True, True, 0) bbox.pack_start(save_btn, True, True, 0) bbox.pack_start(clear_btn, True, True, 0) action_area = self.get_action_area() if isinstance(action_area, Gtk.ButtonBox): action_area.pack_start(help_btn, True, True, 0) action_area.set_child_secondary(help_btn, True) action_area.set_child_non_homogeneous(help_btn, True) bbox.pack_start(self.mask_toggle_ctrl, True, True, 0) bbox.set_child_secondary(self.mask_toggle_ctrl, True) else: bbox.pack_start(self.mask_toggle_ctrl, True, True, 0) bbox.pack_start(help_btn, True, True, 0) bbox.set_child_secondary(help_btn, True) bbox.set_layout(Gtk.ButtonBoxStyle.START) hbox.pack_start(ed, True, True, 0) hbox.pack_start(bbox, False, False, 0) hbox.set_border_width(9) self.vbox.pack_start(hbox, True, True, 0) self.connect("response", self.__response_cb) self.connect("show", self.__show_cb) for w in self.vbox: w.show_all()
def _init_ui(self): # Layout grid row = 0 grid = Gtk.Grid() grid.set_border_width(gui.widgets.SPACING_CRAMPED) grid.set_row_spacing(gui.widgets.SPACING_CRAMPED) grid.set_column_spacing(gui.widgets.SPACING_CRAMPED) self.add(grid) row += 1 label = Gtk.Label(label=self._ALPHA_LABEL_TEXT) label.set_hexpand(False) label.set_halign(Gtk.Align.START) grid.attach(label, 0, row, 1, 1) scale = InputSlider() scale.set_range(0, 1) scale.set_round_digits(1) scale.set_draw_value(False) line_alpha = self.app.preferences.get(_ALPHA_PREFS_KEY, _DEFAULT_ALPHA) scale.set_value(line_alpha) scale.set_hexpand(True) scale.set_vexpand(False) scale.scale.connect("value-changed", self._scale_value_changed_cb) grid.attach(scale, 1, row, 1, 1) row += 1 store = Gtk.ListStore(int, str) rootstack = self.app.doc.model.layer_stack for _type in lib.tiledsurface.SYMMETRY_TYPES: store.append([_type, lib.tiledsurface.SYMMETRY_STRINGS[_type]]) self._symmetry_type_combo = Gtk.ComboBox() self._symmetry_type_combo.set_model(store) self._symmetry_type_combo.set_active(rootstack.symmetry_type) self._symmetry_type_combo.set_hexpand(True) cell = Gtk.CellRendererText() self._symmetry_type_combo.pack_start(cell, True) self._symmetry_type_combo.add_attribute(cell, "text", 1) self._type_cb_id = self._symmetry_type_combo.connect( 'changed', self._symmetry_type_combo_changed_cb ) label = Gtk.Label(label=self._SYMMETRY_TYPE_TEXT) label.set_hexpand(False) label.set_halign(Gtk.Align.START) grid.attach(label, 0, row, 1, 1) grid.attach(self._symmetry_type_combo, 1, row, 1, 1) row += 1 label = Gtk.Label(label=self._SYMMETRY_ROT_LINES_TEXT) label.set_hexpand(False) label.set_halign(Gtk.Align.START) self._axis_sym_lines_entry = Gtk.SpinButton( adjustment=self._axis_symmetry_lines, climb_rate=0.25 ) self._update_num_lines_sensitivity(rootstack.symmetry_type) grid.attach(label, 0, row, 1, 1) grid.attach(self._axis_sym_lines_entry, 1, row, 1, 1) row += 1 label = Gtk.Label(label=self._POSITION_LABEL_X_TEXT) label.set_hexpand(False) label.set_halign(Gtk.Align.START) entry = Gtk.SpinButton( adjustment=self._axis_pos_adj_x, climb_rate=0.25, digits=0 ) entry.set_hexpand(True) entry.set_vexpand(False) grid.attach(label, 0, row, 1, 1) grid.attach(entry, 1, row, 1, 1) row += 1 label = Gtk.Label(label=self._POSITION_LABEL_Y_TEXT) label.set_hexpand(False) label.set_halign(Gtk.Align.START) entry = Gtk.SpinButton( adjustment=self._axis_pos_adj_y, climb_rate=0.25, digits=0 ) entry.set_hexpand(True) entry.set_vexpand(False) grid.attach(label, 0, row, 1, 1) grid.attach(entry, 1, row, 1, 1) row += 1 label = Gtk.Label() label.set_hexpand(False) label.set_halign(Gtk.Align.START) self._angle_label = label self._update_angle_label() grid.attach(label, 0, row, 1, 1) scale = InputSlider(self._axis_angle) scale.set_draw_value(False) scale.set_hexpand(True) scale.set_vexpand(False) grid.attach(scale, 1, row, 1, 1) row += 1 button = Gtk.CheckButton() toggle_action = self.app.find_action("SymmetryActive") button.set_related_action(toggle_action) button.set_label(C_( "symmetry axis options panel: axis active checkbox", u'Enabled', )) button.set_hexpand(True) button.set_vexpand(False) grid.attach(button, 1, row, 2, 1)
def _init_ui(self): height_label = self._new_key_label(_('Height:')) width_label = self._new_key_label(_('Width:')) dpi_label1 = self._new_key_label(_('Resolution:')) dpi_label2 = self._new_key_label(_('DPI')) dpi_label2.set_tooltip_text( _("Dots Per Inch (really Pixels Per Inch)")) color_label = self._new_key_label(_('Color:')) height_entry = Gtk.SpinButton(adjustment=self.height_adj, climb_rate=0.25, digits=0) height_entry.set_vexpand(False) height_entry.set_hexpand(True) self.height_adj.set_spin_button(height_entry) width_entry = Gtk.SpinButton(adjustment=self.width_adj, climb_rate=0.25, digits=0) width_entry.set_vexpand(False) width_entry.set_hexpand(True) self.width_adj.set_spin_button(width_entry) dpi_entry = Gtk.SpinButton(adjustment=self.dpi_adj, climb_rate=0.0, digits=0) dpi_entry.set_vexpand(False) dpi_entry.set_hexpand(True) color_button = Gtk.ColorButton() color_rgba = self.app.preferences.get("frame.color_rgba") color_rgba = [min(max(c, 0), 1) for c in color_rgba] color_gdk = uicolor.to_gdk_color(RGBColor(*color_rgba[0:3])) color_alpha = int(65535 * color_rgba[3]) color_button.set_color(color_gdk) color_button.set_use_alpha(True) color_button.set_alpha(color_alpha) color_button.set_title(_("Frame Color")) color_button.connect("color-set", self._color_set_cb) unit_combobox = Gtk.ComboBoxText() for unit in sorted(UnitAdjustment.CONVERT_UNITS.keys()): unit_combobox.append_text(_Unit.STRINGS[unit]) unit_combobox.set_active(_Unit.PX) unit_combobox.connect('changed', self.on_unit_changed) unit_combobox.set_hexpand(False) unit_combobox.set_vexpand(False) self._unit_combobox = unit_combobox # Options panel UI self.set_border_width(3) self.set_row_spacing(6) self.set_column_spacing(6) row = 0 self.enable_button = Gtk.CheckButton() frame_toggle_action = self.app.find_action("FrameToggle") self.enable_button.set_related_action(frame_toggle_action) self.enable_button.set_label(_('Enabled')) self.attach(self.enable_button, 0, row, 3, 1) row += 1 label = self._new_header_label(_("<b>Frame dimensions</b>")) self.attach(label, 0, row, 3, 1) row += 1 self.attach(width_entry, 1, row, 1, 1) self.attach(unit_combobox, 2, row, 1, 1) self.attach(width_label, 0, row, 1, 1) row += 1 self.attach(height_label, 0, row, 1, 1) self.attach(height_entry, 1, row, 1, 1) row += 1 self.attach(dpi_label1, 0, row, 1, 1) self.attach(dpi_entry, 1, row, 1, 1) self.attach(dpi_label2, 2, row, 1, 1) row += 1 self.attach(color_label, 0, row, 1, 1) self.attach(color_button, 1, row, 3, 1) crop_layer_button = Gtk.Button(label=_('Set Frame to Layer')) crop_layer_button.set_tooltip_text( _("Set frame to the extents of " "the current layer")) crop_document_button = Gtk.Button(label=_('Set Frame to Document')) crop_document_button.set_tooltip_text( _("Set frame to the combination " "of all layers")) crop_layer_button.connect('clicked', self.crop_frame_cb, 'CropFrameToLayer') crop_document_button.connect('clicked', self.crop_frame_cb, 'CropFrameToDocument') trim_button = Gtk.Button() trim_action = self.app.find_action("TrimLayer") trim_button.set_related_action(trim_action) trim_button.set_label(_('Trim Layer to Frame')) trim_button.set_tooltip_text( _("Trim parts of the current layer " "which lie outside the frame")) row += 1 self.attach(crop_layer_button, 0, row, 3, 1) row += 1 self.attach(crop_document_button, 0, row, 3, 1) row += 1 self.attach(trim_button, 0, row, 3, 1)