def foreground(self, layer): scale = self.getScale() if not 0.0299 < scale < 0.9001: return positiveColor = NSColor.systemOrangeColor() negativeColor = NSColor.systemBlueColor() if hasattr(Glyphs, 'versionNumber') and Glyphs.versionNumber >= 3 : # GLYPHS 3 offset = layer.master.defaultAscender() else: # GLYPHS 2 offset = layer.master.ascender try: offset += int(Glyphs.defaults["com.mekkablue.KernIndicator.offset"]) except: pass # go through tab content glyph = layer.glyph() font = layer.font() if font: # sometimes font is empty, don't know why tab = font.currentTab tabView = tab.graphicView() layerCount = tabView.cachedLayerCount() if layerCount>1: viewPort = NSInsetRect(tab.viewPort,-20,-20) viewPort.origin.y -= offset*scale activePosition = tabView.activePosition() previousLayer = tabView.cachedGlyphAtIndex_(0) for i in range(1,layerCount): thisLayer = tabView.cachedGlyphAtIndex_(i) thisLayerPosition = tabView.cachedPositionAtIndex_(i) if NSPointInRect( thisLayerPosition, viewPort ) and type(thisLayer) != GSControlLayer and type(previousLayer) != GSControlLayer: previousMasterID = previousLayer.master.id thisMasterID = thisLayer.master.id if thisMasterID == previousMasterID: leftGlyph = previousLayer.glyph() rightGlyph = thisLayer.glyph() if leftGlyph and rightGlyph: kerningValue = font.kerningForFontMasterID_firstGlyph_secondGlyph_( thisMasterID, leftGlyph, rightGlyph ) if kerningValue and kerningValue < 10000: #notfound offsetVector = subtractPoints(thisLayerPosition, activePosition) textPoint = NSPoint( offsetVector.x/self.getScale() - 0.5*kerningValue, offsetVector.y/self.getScale() + offset ) if kerningValue < 0: self.drawTextAtPoint( str(int(kerningValue)), textPoint, fontColor=negativeColor, align="bottomcenter" ) else: self.drawTextAtPoint( str(int(kerningValue)), textPoint, fontColor=positiveColor, align="bottomcenter" ) previousLayer = thisLayer
def drawRect_(self, rect): """ we raw the background gradient and graph outline then clip the inner rect and draw the bars """ bounds = self.bounds() # get our view bounds insetBounds = NSInsetRect(bounds, 2, 2) # set the inside ortion r = NSBezierPath.bezierPathWithRect_( bounds) # create a new bezier rect self.grad.drawInBezierPath_angle_(r, 90.0) # and draw gradient in it self.borderColor.set() # set border to white NSBezierPath.setDefaultLineWidth_(1.0) # set line width for outline NSBezierPath.strokeRect_(bounds) # draw outline NSBezierPath.clipRect_(insetBounds) # set the clipping path insetBounds.size.height -= 2 # leave room at the top (purely my personal asthetic if self.dataQueue: barRect = NSRect() # init the rect # find out the max value so we can scale the graph maxB = max(max(self.dataQueue), self.minHeigth or 1) # disable anti-aliasing since it looks bad shouldAA = NSGraphicsContext.currentContext().shouldAntialias() NSGraphicsContext.currentContext().setShouldAntialias_(False) # draw each bar barRect.origin.x = insetBounds.size.width - self.lineWidth + 2 for sample in reversed(self.dataQueue): # set drawing color if sample >= self.limit: self.lineColorAboveLimit.set() else: self.lineColor.set() barRect.origin.y = insetBounds.origin.y barRect.size.width = self.lineWidth barRect.size.height = ( (int(sample) * insetBounds.size.height) / maxB) NSBezierPath.fillRect_(barRect) barRect.origin.x = barRect.origin.x - self.lineWidth - self.lineSpacing NSGraphicsContext.currentContext().setShouldAntialias_(shouldAA)
def drawWithFrame_inView_(self, frame, view): frame.origin.x -= 1 frame.size.width += 2 frame.origin.y -= 2 frame.size.height += 2 textFrame = NSInsetRect(frame, 2, 2) text = self.objectValue() color = getColorDefault("PyDEBackgroundColor", fallbackBackgroundColor) color.set() NSBezierPath.bezierPathWithRect_(frame).fill() if self.isHighlighted(): frame.origin.y += 1 frame.size.height -= 1 color = getColorDefault("PyDEHightLightColor", fallbackHightLightColor) color.set() NSBezierPath.bezierPathWithRect_(frame).fill() text.drawInRect_(textFrame)
def drawWithFrame_inView_(self, frame, view): color = self.objectValue() color.set() rect = NSInsetRect(frame, 2, 2) NSBezierPath.bezierPathWithRect_(rect).fill()
def makeDragImage(self): if self.delegate is None: return image = NSImage.alloc().initWithSize_(self.frame().size) image.lockFocus() frame = self.frame() frame.origin = NSZeroPoint rect = NSInsetRect(frame, 1.5, 1.5) if self.conferencing and not self.draggedOut: NSColor.selectedControlColor().colorWithAlphaComponent_(0.7).set() else: NSColor.whiteColor().colorWithAlphaComponent_(0.7).set() path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( rect, 5.0, 5.0) path.fill() if self.selected: path.setLineWidth_(3) NSColor.grayColor().set() else: path.setLineWidth_(1) NSColor.grayColor().set() path.stroke() NSColor.blackColor().set() point = NSMakePoint(8, NSMaxY(frame) - 20) uri = format_identity_to_string( self.delegate.sessionController.remoteIdentity, check_contact=False, format='compact') NSString.stringWithString_(uri).drawAtPoint_withAttributes_( point, NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.boldSystemFontOfSize_(12), NSFontAttributeName)) point = NSMakePoint(8, 6) if self.conferencing: NSString.stringWithString_( NSLocalizedString( "Drop outside to remove from conference", "Audio status label")).drawAtPoint_withAttributes_( point, NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(10), NSFontAttributeName)) else: audio_sessions = [ sess.hasStreamOfType("audio") for sess in NSApp.delegate().contactsWindowController. sessionControllersManager.sessionControllers ] if self.delegate.transferEnabled: text = NSLocalizedString( "Drop this over a session or contact", "Audio status label" ) if len(audio_sessions) > 1 else NSLocalizedString( "Drop this over a contact to transfer", "Audio status label") else: text = NSLocalizedString( "Drop this over a session to conference", "Audio status label") NSString.stringWithString_(text).drawAtPoint_withAttributes_( point, NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(10), NSFontAttributeName)) icon = NSImage.imageNamed_("NSEveryone") rect = frame s = icon.size() p = NSMakePoint( NSWidth(rect) - s.width - 8, rect.size.height - s.height - 8) r = NSMakeRect(0, 0, s.width, s.height) icon.drawAtPoint_fromRect_operation_fraction_(p, r, NSCompositeSourceOver, 0.5) image.unlockFocus() return image
def drawRect_(self, rect): rect = NSInsetRect(self.bounds(), 1.5, 1.5) if not self.conferencing: NSColor.whiteColor().set() path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( rect, 5.0, 5.0) path.fill() if self.conferencing: if self.draggedOut: NSColor.whiteColor().set() else: # bgcolor for conference area NSColor.colorWithDeviceRed_green_blue_alpha_( 196 / 255.0, 230 / 255.0, 254 / 255.0, 1.0).set() border = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( rect, 5.0, 5.0) border.setLineWidth_(1) border.fill() NSColor.grayColor().set() border.stroke() # hack: if we're the 1st item, draw the border around all conferenced boxes subviews = self.superview().subviews() if subviews.objectAtIndex_(0) == self: # first in conference list rect.size.height += 5 rect.origin.y -= 5 path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( rect, 5.0, 5.0) else: prev = None last = True for view in subviews: if prev == self: last = not view.conferencing break prev = view # last in conference list if last: rect.size.height += 5 path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( rect, 5.0, 5.0) else: rect.origin.y -= 5 rect.size.height += 10 path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( rect, 5.0, 5.0) if self.selected or self.highlighted: path.setLineWidth_(3) else: path.setLineWidth_(1) if self.highlighted: NSColor.orangeColor().set() else: NSColor.grayColor().set() if self.selected or self.highlighted: path.stroke() elif self.highlighted: path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( rect, 5.0, 5.0) path.setLineWidth_(3) NSColor.orangeColor().set() path.stroke() elif self.selected: path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( rect, 5.0, 5.0) path.setLineWidth_(3) NSColor.grayColor().set() path.stroke() else: path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( rect, 5.0, 5.0) path.setLineWidth_(1) NSColor.grayColor().set() path.stroke()
def drawPresenceIcon(self): status = 'offline' if type(self.contact) is BlinkMyselfConferenceContact: account = self.contact.account if account.enabled and account.presence.enabled: settings = SIPSimpleSettings() status = settings.presence_state.status.lower() elif type(self.contact) is BlinkConferenceContact: blink_contact = self.contact.presence_contact if not isinstance(blink_contact, BlinkPresenceContact): return if not blink_contact.contact.presence.subscribe: return status = presence_status_for_contact(blink_contact) elif type(self.contact) is BlinkHistoryViewerContact: blink_contact = self.contact.presence_contact if not isinstance(blink_contact, BlinkPresenceContact): return if not blink_contact.contact.presence.subscribe: return status = presence_status_for_contact(blink_contact) elif type(self.contact) is HistoryBlinkContact: blink_contact = self.contact.contact if not isinstance(blink_contact, BlinkPresenceContact): return if not blink_contact.contact.presence.subscribe: return status = presence_status_for_contact(blink_contact) elif isinstance(self.contact, BlinkPresenceContact): blink_contact = self.contact if not blink_contact.contact.presence.subscribe: return status = presence_status_for_contact(blink_contact) elif type(self.contact) is BonjourBlinkContact: account = BonjourAccount() if not account.presence.enabled: return blink_contact = self.contact status = presence_status_for_contact(blink_contact) elif type(self.contact) is SystemAddressBookBlinkContact: return elif type(self.contact) is LdapSearchResultContact: return elif type(self.contact) is SearchResultContact: return if not status: return try: icon = presence_status_icons[status] except KeyError: pass has_locations = None if isinstance(self.contact, (BlinkOnlineContact, BlinkPresenceContact)): try: has_locations = any(device['location'] for device in list( self.contact.presence_state['devices'].values()) if device['location'] is not None) except KeyError: pass frame = self.frame frame.origin.y -= 17 #if has_locations: # left = self.view.frame().size.width - 22 # self.drawIcon(self.locationIcon, left, self.frame.origin.y +14, 16, 16) # presence bar frame.size.width = 5 if type(self.contact) in (BlinkConferenceContact, BlinkMyselfConferenceContact): frame.size.height = 14 frame.origin.y += 15 frame.origin.x = self.view.frame().size.width - 6 rect = NSInsetRect(frame, 0, 0) if status == 'available': NSColor.greenColor().set() elif status == 'away': NSColor.yellowColor().set() elif status == 'busy': NSColor.redColor().set() else: NSColor.whiteColor().set() border = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( rect, 2.0, 2.0) border.setLineWidth_(0.08) border.fill() NSColor.blackColor().set() border.stroke() # sleep icon if isinstance(self.contact, (BlinkOnlineContact, BlinkPresenceContact)): if self.contact.presence_state['time_offset'] is not None: ctime = datetime.datetime.utcnow( ) + self.contact.presence_state['time_offset'] hour = int(ctime.strftime("%H")) if hour > 21 or hour < 7: left = self.view.frame().size.width - 26 self.drawIcon(self.nightIcon, left, self.frame.origin.y + 14, 16, 16)