plug-ins: in spyrogimp, add option to save path
This is backported from the gimp 3 master branch. Replace the checkbox of two saving options (keep layer, or redraw on last active layer), with a combo box that has a third option for saving the pattern as a path.
This commit is contained in:
@ -42,6 +42,7 @@ pdb = gimp.pdb
|
|||||||
|
|
||||||
two_pi, half_pi = 2 * pi, pi / 2
|
two_pi, half_pi = 2 * pi, pi / 2
|
||||||
layer_name = _("Spyro Layer")
|
layer_name = _("Spyro Layer")
|
||||||
|
path_name = _("Spyro Path")
|
||||||
|
|
||||||
# "Enums"
|
# "Enums"
|
||||||
GEAR_NOTATION, TOY_KIT_NOTATION, VISUAL_NOTATION = range(3) # Pattern notations
|
GEAR_NOTATION, TOY_KIT_NOTATION, VISUAL_NOTATION = range(3) # Pattern notations
|
||||||
@ -49,6 +50,14 @@ GEAR_NOTATION, TOY_KIT_NOTATION, VISUAL_NOTATION = range(3) # Pattern nota
|
|||||||
# Mapping of pattern notation to the corresponding tab in the pattern notation notebook.
|
# Mapping of pattern notation to the corresponding tab in the pattern notation notebook.
|
||||||
pattern_notation_page = {}
|
pattern_notation_page = {}
|
||||||
|
|
||||||
|
# Save options of the dialog
|
||||||
|
SAVE_AS_NEW_LAYER, SAVE_BY_REDRAW, SAVE_AS_PATH = range(3)
|
||||||
|
save_options = [
|
||||||
|
_("Save\nas New Layer"),
|
||||||
|
_("Redraw on\nActive layer"),
|
||||||
|
_("Save\nas Path")
|
||||||
|
]
|
||||||
|
|
||||||
ring_teeth = [96, 144, 105, 150]
|
ring_teeth = [96, 144, 105, 150]
|
||||||
|
|
||||||
# Moving gear. Each gear is a pair of (#teeth, #holes)
|
# Moving gear. Each gear is a pair of (#teeth, #holes)
|
||||||
@ -589,6 +598,25 @@ class StrokePaintTool(AbstractStrokeTool):
|
|||||||
pdb.gimp_context_set_paint_method(self.paint_method)
|
pdb.gimp_context_set_paint_method(self.paint_method)
|
||||||
|
|
||||||
|
|
||||||
|
class SaveToPathTool():
|
||||||
|
""" This tool cannot be chosen by the user from the tools menu.
|
||||||
|
We dont add this to the list of tools. """
|
||||||
|
|
||||||
|
def __init__(self, img):
|
||||||
|
self.path = pdb.gimp_vectors_new(img, path_name)
|
||||||
|
pdb.gimp_image_add_vectors(img, self.path, 0)
|
||||||
|
|
||||||
|
def draw(self, layer, strokes, color=None):
|
||||||
|
# We need to multiply every point by 3, because we are creating a path,
|
||||||
|
# where each point has two additional control points.
|
||||||
|
control_points = []
|
||||||
|
for i, k in zip(strokes[0::2], strokes[1::2]):
|
||||||
|
control_points += [i, k] * 3
|
||||||
|
|
||||||
|
sid = pdb.gimp_vectors_stroke_new_from_points(self.path, 0, len(control_points),
|
||||||
|
control_points, False)
|
||||||
|
|
||||||
|
|
||||||
tools = [
|
tools = [
|
||||||
PreviewTool(),
|
PreviewTool(),
|
||||||
StrokePaintTool(_("PaintBrush"), "gimp-paintbrush"),
|
StrokePaintTool(_("PaintBrush"), "gimp-paintbrush"),
|
||||||
@ -667,8 +695,8 @@ class PatternParameters:
|
|||||||
if not hasattr(self, 'long_gradient'):
|
if not hasattr(self, 'long_gradient'):
|
||||||
self.long_gradient = False
|
self.long_gradient = False
|
||||||
|
|
||||||
if not hasattr(self, 'keep_separate_layer'):
|
if not hasattr(self, 'save_option'):
|
||||||
self.keep_separate_layer = True
|
self.save_option = SAVE_AS_NEW_LAYER
|
||||||
|
|
||||||
def kit_max_hole_number(self):
|
def kit_max_hole_number(self):
|
||||||
return wheel[self.kit_moving_gear_index][1]
|
return wheel[self.kit_moving_gear_index][1]
|
||||||
@ -1011,9 +1039,11 @@ class DrawingEngine:
|
|||||||
|
|
||||||
# Methods for incremental drawing.
|
# Methods for incremental drawing.
|
||||||
|
|
||||||
def draw_next_chunk(self, layer, fetch_next_drawing=True):
|
def draw_next_chunk(self, layer, fetch_next_drawing=True, tool=None):
|
||||||
stroke_chunk, color = self.next_chunk(fetch_next_drawing)
|
stroke_chunk, color = self.next_chunk(fetch_next_drawing)
|
||||||
tools[self.p.tool_index].draw(layer, stroke_chunk, color)
|
if not tool:
|
||||||
|
tool = tools[self.p.tool_index]
|
||||||
|
tool.draw(layer, stroke_chunk, color)
|
||||||
return len(stroke_chunk)
|
return len(stroke_chunk)
|
||||||
|
|
||||||
def set_strokes(self):
|
def set_strokes(self):
|
||||||
@ -1628,15 +1658,15 @@ class SpyroWindow(gtk.Window):
|
|||||||
add_button_to_box(hbox, _("_Cancel"), self.cancel_window)
|
add_button_to_box(hbox, _("_Cancel"), self.cancel_window)
|
||||||
self.ok_btn = add_button_to_box(hbox, _("_OK"), self.ok_window)
|
self.ok_btn = add_button_to_box(hbox, _("_OK"), self.ok_window)
|
||||||
|
|
||||||
self.keep_separate_layer_checkbox = gtk.CheckButton(_("Keep\nLayer"))
|
self.save_option_combo = gtk.combo_box_new_text()
|
||||||
self.keep_separate_layer_checkbox.set_tooltip_text(
|
for txt in save_options:
|
||||||
_("If checked, then once OK is pressed, the spyro layer is kept, and the plugin exits quickly. "
|
self.save_option_combo.append_text(txt)
|
||||||
"If unchecked, the spyro layer is deleted, and the pattern is redrawn on the layer that was "
|
self.save_option_combo.set_tooltip_text(
|
||||||
"active when the plugin was launched.")
|
_("Choose whether to save as new layer, redraw on last active layer, or save to path")
|
||||||
)
|
)
|
||||||
hbox.add(self.keep_separate_layer_checkbox)
|
hbox.add(self.save_option_combo)
|
||||||
self.keep_separate_layer_checkbox.show()
|
self.save_option_combo.show()
|
||||||
self.keep_separate_layer_checkbox.connect("toggled", self.keep_separate_layer_checkbox_changed)
|
self.save_option_combo.connect("changed", self.save_option_changed)
|
||||||
|
|
||||||
return hbox
|
return hbox
|
||||||
|
|
||||||
@ -1731,7 +1761,7 @@ class SpyroWindow(gtk.Window):
|
|||||||
|
|
||||||
shelf_parameters(self.p)
|
shelf_parameters(self.p)
|
||||||
|
|
||||||
if self.p.keep_separate_layer:
|
if self.p.save_option == SAVE_AS_NEW_LAYER:
|
||||||
if self.spyro_layer in self.img.layers:
|
if self.spyro_layer in self.img.layers:
|
||||||
self.img.active_layer = self.spyro_layer
|
self.img.active_layer = self.spyro_layer
|
||||||
|
|
||||||
@ -1760,7 +1790,7 @@ class SpyroWindow(gtk.Window):
|
|||||||
|
|
||||||
self.drawing_layer = self.active_layer
|
self.drawing_layer = self.active_layer
|
||||||
|
|
||||||
def draw_full():
|
def draw_full(tool):
|
||||||
self.progress_start()
|
self.progress_start()
|
||||||
yield True
|
yield True
|
||||||
|
|
||||||
@ -1770,7 +1800,7 @@ class SpyroWindow(gtk.Window):
|
|||||||
|
|
||||||
while self.engine.has_more_strokes():
|
while self.engine.has_more_strokes():
|
||||||
yield True
|
yield True
|
||||||
self.draw_next_chunk(undo_group=False)
|
self.draw_next_chunk(undo_group=False, tool=tool)
|
||||||
|
|
||||||
self.img.undo_group_end()
|
self.img.undo_group_end()
|
||||||
|
|
||||||
@ -1779,7 +1809,8 @@ class SpyroWindow(gtk.Window):
|
|||||||
gtk.main_quit()
|
gtk.main_quit()
|
||||||
yield False
|
yield False
|
||||||
|
|
||||||
task = draw_full()
|
tool = SaveToPathTool(self.img) if self.p.save_option == SAVE_AS_PATH else None
|
||||||
|
task = draw_full(tool)
|
||||||
gobject.idle_add(task.next)
|
gobject.idle_add(task.next)
|
||||||
|
|
||||||
def cancel_window(self, widget, what=None):
|
def cancel_window(self, widget, what=None):
|
||||||
@ -1828,7 +1859,7 @@ class SpyroWindow(gtk.Window):
|
|||||||
self.margin_adj.set_value(self.p.margin_pixels)
|
self.margin_adj.set_value(self.p.margin_pixels)
|
||||||
self.tool_combo.set_active(self.p.tool_index)
|
self.tool_combo.set_active(self.p.tool_index)
|
||||||
self.long_gradient_checkbox.set_active(self.p.long_gradient)
|
self.long_gradient_checkbox.set_active(self.p.long_gradient)
|
||||||
self.keep_separate_layer_checkbox.set_active(self.p.keep_separate_layer)
|
self.save_option_combo.set_active(self.p.save_option)
|
||||||
|
|
||||||
def reset_params(self, widget):
|
def reset_params(self, widget):
|
||||||
self.engine.p = self.p = PatternParameters()
|
self.engine.p = self.p = PatternParameters()
|
||||||
@ -1999,8 +2030,8 @@ class SpyroWindow(gtk.Window):
|
|||||||
self.p.long_gradient = val.get_active()
|
self.p.long_gradient = val.get_active()
|
||||||
self.redraw()
|
self.redraw()
|
||||||
|
|
||||||
def keep_separate_layer_checkbox_changed(self, val):
|
def save_option_changed(self, val):
|
||||||
self.p.keep_separate_layer = self.keep_separate_layer_checkbox.get_active()
|
self.p.save_option = self.save_option_combo.get_active()
|
||||||
|
|
||||||
# Progress bar of plugin window.
|
# Progress bar of plugin window.
|
||||||
|
|
||||||
@ -2023,14 +2054,14 @@ class SpyroWindow(gtk.Window):
|
|||||||
|
|
||||||
# Incremental drawing.
|
# Incremental drawing.
|
||||||
|
|
||||||
def draw_next_chunk(self, undo_group=True):
|
def draw_next_chunk(self, undo_group=True, tool=None):
|
||||||
""" Incremental drawing """
|
""" Incremental drawing """
|
||||||
|
|
||||||
t = time.time()
|
t = time.time()
|
||||||
|
|
||||||
if undo_group:
|
if undo_group:
|
||||||
self.img.undo_group_start()
|
self.img.undo_group_start()
|
||||||
chunk_size = self.engine.draw_next_chunk(self.drawing_layer)
|
chunk_size = self.engine.draw_next_chunk(self.drawing_layer, tool=tool)
|
||||||
if undo_group:
|
if undo_group:
|
||||||
self.img.undo_group_end()
|
self.img.undo_group_end()
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user