Skip to content

Instantly share code, notes, and snippets.

@typesupply
Created June 28, 2019 00:57
Show Gist options
  • Select an option

  • Save typesupply/c77947ef5c6a5ca241bd0bcb0da20ff2 to your computer and use it in GitHub Desktop.

Select an option

Save typesupply/c77947ef5c6a5ca241bd0bcb0da20ff2 to your computer and use it in GitHub Desktop.
from objc import python_method
from AppKit import *
import Quartz
import vanilla
class LayerTestView(vanilla.Group):
def __init__(self, posSize):
super(LayerTestView, self).__init__(posSize)
view = self.getNSView()
view.setWantsLayer_(True)
view.layer().setBackgroundColor_(NSColor.yellowColor().CGColor())
color = NSColor.colorWithCalibratedRed_green_blue_alpha_(1, 0, 0, 0.75).CGColor()
self.redLayer = CAShapeLayer.layer()
self.redLayer.setFillColor_(color)
view.layer().addSublayer_(self.redLayer)
color = NSColor.colorWithCalibratedRed_green_blue_alpha_(0, 1, 0, 0.75).CGColor()
self.greenLayer = CAShapeLayer.layer()
self.greenLayer.setFillColor_(color)
view.layer().addSublayer_(self.greenLayer)
blurFilter = CIFilter.filterWithName_("CIGaussianBlur")
blurFilter.setName_("blur")
blurFilter.setValue_forKey_(10, "inputRadius")
self.greenLayer.setFilters_([blurFilter])
color = NSColor.colorWithCalibratedRed_green_blue_alpha_(0, 0, 1, 0.75).CGColor()
self.blueLayer = CAShapeLayer.layer()
self.blueLayer.setFillColor_(color)
view.layer().addSublayer_(self.blueLayer)
color = NSColor.colorWithCalibratedRed_green_blue_alpha_(0, 0, 0, 0.25).CGColor()
text = NSAttributedString.alloc().initWithString_attributes_(
"HELLO",
{
NSFontAttributeName : NSFont.boldSystemFontOfSize_(75),
NSForegroundColorAttributeName : color,
}
)
w, h = text.size()
self.textLayer = CATextLayer.layer()
self.textLayer.setBounds_(((0, 0), (w, h)))
self.textLayer.setAllowsFontSubpixelQuantization_(True)
self.textLayer.setPosition_((200, 200))
self.textLayer.setString_(text)
self.textLayer.setAlignmentMode_(Quartz.kCAAlignmentCenter)
self.textLayer.setShadowOffset_((5, -5))
self.textLayer.setShadowRadius_(2.0)
self.textLayer.setShadowOpacity_(1.0)
self.textLayer.setShadowColor_(NSColor.whiteColor().CGColor())
view.layer().addSublayer_(self.textLayer)
# Red Layer
def setRedPosSize(self, posSize):
x, y, w, h = posSize
path = Quartz.CGPathCreateWithRect(((x, y), (w, h)), None)
self.redLayer.setPath_(path)
# Green Layer
def setGreenPosSize(self, posSize):
x, y, w, h = posSize
path = Quartz.CGPathCreateWithRect(((x, y), (w, h)), None)
self.greenLayer.setPath_(path)
self.greenLayer.setNeedsDisplay()
def setGreenBlurRadius(self, radius):
self.greenLayer.setValue_forKeyPath_(radius, "filters.blur.inputRadius")
# Blue Layer
def setBluePosSize(self, posSize):
x, y, w, h = posSize
path = Quartz.CGPathCreateWithRect(((x, y), (w, h)), None)
self.blueLayer.setPath_(path)
class Test(object):
def __init__(self):
self.redPosSize = (100, 100, 100, 100)
self.greenPosSize = (150, 150, 100, 100)
self.bluePosSize = (200, 200, 100, 100)
self.w = vanilla.Window((0, 0))
self.w.view = LayerTestView("auto")
self.w.redSlider = vanilla.Slider("auto", minValue=-100, maxValue=200, value=0, callback=self.redSliderCallback)
self.w.greenSlider = vanilla.Slider("auto", minValue=0, maxValue=20, value=10, callback=self.greenSliderCallback)
self.w.blueSlider = vanilla.Slider("auto", minValue=-200, maxValue=100, value=0, callback=self.blueSliderCallback)
self.w.view.setRedPosSize(self.redPosSize)
self.w.view.setGreenPosSize((150, 150, 100, 100))
self.w.view.setBluePosSize((200, 200, 100, 100))
rules = [
# Horizontal
"H:|[view(==400)]|",
"H:|-[redSlider]-|",
"H:|-[greenSlider]-|",
"H:|-[blueSlider]-|",
# Vertical
"V:|"
"[view(==400)]"
"-[redSlider]"
"-[greenSlider]"
"-[blueSlider]"
"-|"
]
self.w.addAutoPosSizeRules(rules)
self.w.open()
def redSliderCallback(self, sender):
value = sender.get()
x, y, w, h = self.redPosSize
x += value
self.w.view.setRedPosSize((x, y, w, h))
def greenSliderCallback(self, sender):
value = sender.get()
self.w.view.setGreenBlurRadius(value)
def blueSliderCallback(self, sender):
value = sender.get()
x, y, w, h = self.bluePosSize
y += value
self.w.view.setBluePosSize((x, y, w, h))
Test()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment