Layer.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. from gi.repository import Gtk, GLib
  2. class Layer:
  3. def __init__(self, base, name, on_change):
  4. self.mask = []
  5. self.tools = []
  6. self.tool_map = {}
  7. self.name = name
  8. self.enabled = True
  9. self.selected_tool = 0
  10. self.editable = not base
  11. self.tool_box = Gtk.FlowBox()
  12. self.tool_stack = Gtk.Stack()
  13. self.layer_changed = on_change
  14. def add_tool(self, tool):
  15. self.tool_box.add(tool.tool_button)
  16. self.tool_stack.add(tool.widget)
  17. self.tool_map[tool.tool_button] = tool
  18. tool.tool_button.connect("clicked", self.on_tool_button_clicked)
  19. tool.connect_on_change(self.on_tool_change)
  20. self.tools += [tool,]
  21. def on_tool_change(self, tool, prop):
  22. self.layer_changed(self)
  23. def on_tool_button_clicked(self, sender):
  24. if(sender.get_active()):
  25. self.tool_stack.set_visible_child(self.tool_map[sender].widget)
  26. for key in self.tool_map:
  27. if(key != sender):
  28. key.set_active(False)
  29. elif(self.tool_stack.get_visible_child() == self.tool_map[sender].widget):
  30. sender.set_active(True)
  31. def get_layer_dict(self):
  32. layerDict = {}
  33. # Get tool values
  34. toolDict = {}
  35. for tool in self.tools:
  36. toolDict[tool.id] = tool.get_properties_as_dict()
  37. layerDict["tools"] = toolDict
  38. layerDict["name"] = self.name
  39. layerDict["mask"] = self.mask
  40. layerDict["enabled"] = self.enabled
  41. return layerDict
  42. def set_from_layer_dict(self, dict):
  43. # Load Tool Data
  44. for tool in self.tools:
  45. if(tool.id in dict["tools"]):
  46. GLib.idle_add(tool.load_properties, dict["tools"][tool.id])
  47. # The base layer only has tools.
  48. if(self.editable):
  49. # Load Mask Vectors
  50. self.mask = dict["mask"]
  51. # Load Layer Name
  52. self.name = dict["name"]
  53. # Load Enabled State
  54. self.enabled = dict["enabled"]
  55. def render_layer(self, baseImage, image, callback=None):
  56. # We are passed a base image (original)
  57. # Make a copy of this to pass through the tools
  58. layer = baseImage.copy()
  59. # Base layer needs no mask processing
  60. if(not self.editable):
  61. ntools = len(self.tools)
  62. count = 1
  63. for tool in self.tools:
  64. if (callback != None):
  65. # For showing progress
  66. callback(tool.name, ntools, count - 1)
  67. # Call the tool's image processing function
  68. layer = tool.on_update(layer)
  69. count += 1
  70. ## Here we would blend with the mask
  71. image = layer
  72. return image