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.remotePartyObject, 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 session 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 session label") if len(audio_sessions) > 1 else NSLocalizedString("Drop this over a contact to transfer", "Audio session label") else: text = NSLocalizedString("Drop this over a session to conference", "Audio session 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
class ConferenceFileCell(NSTextFieldCell): conference_file = None nameAttrs = NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(12.0), NSFontAttributeName) nameAttrs_highlighted = NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(12.0), NSFontAttributeName, NSColor.whiteColor(), NSForegroundColorAttributeName) infoAttrs = NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(NSFont.labelFontSize()-1), NSFontAttributeName, NSColor.grayColor(), NSForegroundColorAttributeName) infoAttrs_highlighted = NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(NSFont.labelFontSize()-1), NSFontAttributeName, NSColor.whiteColor(), NSForegroundColorAttributeName) def drawingRectForBounds_(self, rect): return rect @objc.python_method def cellSize(self): if self.conference_file is None: return objc.super(ConferenceFileCell, self).cellSize() return NSMakeSize(100, 30) def drawWithFrame_inView_(self, frame, view): if self.conference_file is None: tmp = frame return objc.super(ConferenceFileCell, self).drawWithFrame_inView_(tmp, view) self.drawIcon(self.conference_file.icon, 2, frame.origin.y+3, 28, 28) # 1st line: file name frame.origin.x = 35 frame.origin.y += 2 attrs = self.nameAttrs if not self.isHighlighted() else self.nameAttrs_highlighted self.conference_file.name.drawAtPoint_withAttributes_(frame.origin, attrs) # 2nd line: file sender point = frame.origin point.y += 15 attrs = self.infoAttrs if not self.isHighlighted() else self.infoAttrs_highlighted self.conference_file.sender.drawAtPoint_withAttributes_(point, attrs) @objc.python_method def drawIcon(self, icon, origin_x, origin_y, size_x, size_y): size = icon.size() rect = NSMakeRect(0, 0, size.width, size.height) trect = NSMakeRect(origin_x, origin_y, (size_y/size.height) * size.width, size_x) icon.drawInRect_fromRect_operation_fraction_respectFlipped_hints_(trect, rect, NSCompositeSourceOver, 1.0, True, None)
def refreshLibrary(self): if not self.history: return settings = SIPSimpleSettings() own_icon_path = settings.presence_state.icon selected_icon = None def md5sum(filename): md5 = hashlib.md5() with open(filename, 'rb') as f: for chunk in iter(lambda: f.read(128 * md5.block_size), b''): md5.update(chunk) return md5.hexdigest() if os.path.exists(self.storage_folder): files = os.listdir(self.storage_folder) else: files = [] array = NSMutableArray.array() knownFiles = set() for item in self.contentArrayController.arrangedObjects(): knownFiles.add(str(item.objectForKey_("path"))) seen_md5sum = {} i = 0 for f in files: if not f.startswith('user_icon') and not f.startswith( 'photo') and f != 'default_user_icon.tiff': continue p = os.path.normpath(self.storage_folder + "/" + f) if p not in knownFiles: photos_folder = unicodedata.normalize('NFC', self.storage_folder) filename = os.path.join(photos_folder, f) checksum = md5sum(filename) try: seen_md5sum[filename] except KeyError: seen_md5sum[filename] = checksum image = NSImage.alloc().initWithContentsOfFile_(p) if not image: continue item = NSDictionary.dictionaryWithObjectsAndKeys_( image, "picture", p, "path") array.addObject_(item) if own_icon_path is not None and filename == str( own_icon_path): selected_icon = i i += 1 if array.count() > 0: self.contentArrayController.addObjects_(array) if selected_icon is not None: self.libraryCollectionView.setSelectionIndexes_( NSIndexSet.indexSetWithIndex_(selected_icon))
def paramsDictionary(self): self.fCutoff = min(self.fCutoff, self.sampleRate/2.) return NSDictionary.dictionaryWithObjectsAndKeys_( self.mean, BLWN_MEAN_KEY, self.var, BLWN_VAR_KEY, self.fCutoff, BLWN_FREQ_KEY, self.nPoles, BLWN_NPOLES_KEY, self.sampleRate, BLWN_SAMPLE_RATE_KEY, self.length, BLWN_LENGTH_KEY, pickle.dumps(self.rSource.get_state()[:3]), BLWN_RANDOM_STATE_KEY, numpy.__version__, 'numpyVersion', None)
def refreshLibrary(self): if not self.history: return settings = SIPSimpleSettings() own_icon_path = settings.presence_state.icon selected_icon = None def md5sum(filename): md5 = hashlib.md5() with open(filename,'rb') as f: for chunk in iter(lambda: f.read(128*md5.block_size), b''): md5.update(chunk) return md5.hexdigest() if os.path.exists(self.storage_folder): files = os.listdir(self.storage_folder) else: files = [] array = NSMutableArray.array() knownFiles = set() for item in self.contentArrayController.arrangedObjects(): knownFiles.add(unicode(item.objectForKey_("path"))) seen_md5sum = {} i = 0 for f in files: if not f.startswith('user_icon') and not f.startswith('photo') and f != 'default_user_icon.tiff': continue p = os.path.normpath(self.storage_folder + "/" + f) if p not in knownFiles: photos_folder = unicodedata.normalize('NFC', self.storage_folder) filename = os.path.join(photos_folder, f) checksum = md5sum(filename) try: seen_md5sum[filename] except KeyError: seen_md5sum[filename] = checksum image = NSImage.alloc().initWithContentsOfFile_(p) if not image: continue item = NSDictionary.dictionaryWithObjectsAndKeys_(image, "picture", p, "path") array.addObject_(item) if own_icon_path is not None and filename == unicode(own_icon_path): selected_icon = i i += 1 if array.count() > 0: self.contentArrayController.addObjects_(array) if selected_icon is not None: self.libraryCollectionView.setSelectionIndexes_(NSIndexSet.indexSetWithIndex_(selected_icon))
def renderDailyEntries(self, results): getFirstContactMatchingURI = NSApp.delegate().contactsWindowController.getFirstContactMatchingURI self.dayly_entries = NSMutableArray.array() for result in results: contact = getFirstContactMatchingURI(result[2], exact_match=True) if contact: remote_uri = '%s <%s>' % (contact.name, result[2]) else: remote_uri = result[2] entry = NSDictionary.dictionaryWithObjectsAndKeys_(result[1], "local_uri", remote_uri, "remote_uri", result[2], "remote_uri_sql", result[0], 'date', result[3], 'type') self.dayly_entries.addObject_(entry) self.dayly_entries.sortUsingDescriptors_(self.indexTable.sortDescriptors()) self.indexTable.reloadData() if self.search_uris and not self.dayly_entries: self.contactTable.deselectAll_(True)
class SMSSplitView(NSSplitView): text = None attributes = NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(NSFont.labelFontSize() - 1), NSFontAttributeName, NSColor.darkGrayColor(), NSForegroundColorAttributeName) def setText_(self, text): self.text = NSString.stringWithString_(text) self.setNeedsDisplay_(True) def dividerThickness(self): return NSFont.labelFontSize() + 1 def drawDividerInRect_(self, rect): NSSplitView.drawDividerInRect_(self, rect) if self.text: point = NSMakePoint( NSMaxX(rect) - self.text.sizeWithAttributes_(self.attributes).width - 10, rect.origin.y) self.text.drawAtPoint_withAttributes_(point, self.attributes)
def drawRect_(self, rect): r = self.bounds() r.size.width -= 0.5 r.size.height += 4 if self.draggedOut: NSColor.colorWithDeviceWhite_alpha_(0.4, 1.0).set() path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_(r, 5, 5) path.fill() else: if self == self.switcher.activeItem(): NSColor.controlColor().set() else: NSColor.colorWithDeviceWhite_alpha_(0.6, 1.0).set() path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_(r, 5, 5) path.fill() NSColor.colorWithDeviceRed_green_blue_alpha_(0.3, 0.3, 0.3, 1.0).set() path.stroke() if self.badgeLabel and not self.mouseInside and not self.busyIndicator and not self.composing: # draw the number in redbadge indicator gradient = NSGradient.alloc().initWithStartingColor_endingColor_( NSColor.colorWithDeviceRed_green_blue_alpha_(0.9, 0.2, 0.2, 1), NSColor.colorWithDeviceRed_green_blue_alpha_(1.0, 0.2, 0.2, 1)) size = self.badgeLabel.size() size.width += 4 if size.width < 12: size.width = 12 bez = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_(NSMakeRect(3, 5, size.width, 12), 6, 6) gradient.drawInBezierPath_angle_(bez, 90+45) self.badgeLabel.drawInRect_(NSMakeRect(3, 5, size.width, 12)) if not self.mouseInside and not self.busyIndicator and self.composing: rect = NSZeroRect.copy() rect.size = self.composeIcon.size() self.composeIcon.drawAtPoint_fromRect_operation_fraction_(NSMakePoint(1, 3), rect, NSCompositeSourceOver, 1) if not self.busyIndicator and self.screen_sharing_active: rect = NSZeroRect.copy() rect.size = self.screenIcon.size() self.screenIcon.drawAtPoint_fromRect_operation_fraction_(NSMakePoint(17, 3), rect, NSCompositeSourceOver, 1) if not self.draggedOut: shadow = NSShadow.alloc().init() shadow.setShadowOffset_(NSMakeSize(0, -1)) if self == self.switcher.activeItem(): shadow.setShadowColor_(NSColor.whiteColor()) else: shadow.setShadowColor_(NSColor.colorWithDeviceWhite_alpha_(0.7, 1.0)) para = NSParagraphStyle.defaultParagraphStyle().mutableCopy() para.setLineBreakMode_(NSLineBreakByTruncatingTail) para.setAlignment_(NSCenterTextAlignment) attribs = NSDictionary.dictionaryWithObjectsAndKeys_(NSFont.systemFontOfSize_(11), NSFontAttributeName, shadow, NSShadowAttributeName, para, NSParagraphStyleAttributeName) rect = self.bounds() rect.origin.y -= 3 rect.origin.x += 20 rect.origin.x = rect.origin.x + 12 if self.screen_sharing_active else rect.origin.x rect.size.width -= 46 rect.size.width = rect.size.width - 12 if self.screen_sharing_active else rect.size.width self.label.drawInRect_withAttributes_(rect, attribs)
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): r = self.bounds() r.size.width -= 0.5 r.size.height += 4 if self.draggedOut: NSColor.colorWithDeviceWhite_alpha_(0.4, 1.0).set() path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( r, 5, 5) path.fill() else: if self == self.switcher.activeItem(): NSColor.controlColor().set() else: NSColor.colorWithDeviceWhite_alpha_(0.6, 1.0).set() path = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( r, 5, 5) path.fill() NSColor.colorWithDeviceRed_green_blue_alpha_(0.3, 0.3, 0.3, 1.0).set() path.stroke() if self.badgeLabel and not self.mouseInside and not self.busyIndicator and not self.composing: # draw the number in redbadge indicator gradient = NSGradient.alloc().initWithStartingColor_endingColor_( NSColor.colorWithDeviceRed_green_blue_alpha_(0.9, 0.2, 0.2, 1), NSColor.colorWithDeviceRed_green_blue_alpha_(1.0, 0.2, 0.2, 1)) size = self.badgeLabel.size() size.width += 4 if size.width < 12: size.width = 12 bez = NSBezierPath.bezierPathWithRoundedRect_xRadius_yRadius_( NSMakeRect(3, 5, size.width, 12), 6, 6) gradient.drawInBezierPath_angle_(bez, 90 + 45) self.badgeLabel.drawInRect_(NSMakeRect(3, 5, size.width, 12)) if not self.mouseInside and not self.busyIndicator and self.composing: rect = NSZeroRect.copy() rect.size = self.composeIcon.size() self.composeIcon.drawAtPoint_fromRect_operation_fraction_( NSMakePoint(1, 3), rect, NSCompositeSourceOver, 1) if not self.busyIndicator and self.screen_sharing_active: rect = NSZeroRect.copy() rect.size = self.screenIcon.size() self.screenIcon.drawAtPoint_fromRect_operation_fraction_( NSMakePoint(17, 3), rect, NSCompositeSourceOver, 1) if not self.draggedOut: shadow = NSShadow.alloc().init() shadow.setShadowOffset_(NSMakeSize(0, -1)) if self == self.switcher.activeItem(): shadow.setShadowColor_(NSColor.whiteColor()) else: shadow.setShadowColor_( NSColor.colorWithDeviceWhite_alpha_(0.7, 1.0)) para = NSParagraphStyle.defaultParagraphStyle().mutableCopy() para.setLineBreakMode_(NSLineBreakByTruncatingTail) para.setAlignment_(NSCenterTextAlignment) attribs = NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(11), NSFontAttributeName, shadow, NSShadowAttributeName, para, NSParagraphStyleAttributeName) rect = self.bounds() rect.origin.y -= 3 rect.origin.x += 20 rect.origin.x = rect.origin.x + 12 if self.screen_sharing_active else rect.origin.x rect.size.width -= 46 rect.size.width = rect.size.width - 12 if self.screen_sharing_active else rect.size.width self.label.drawInRect_withAttributes_(rect, attribs)
class ContactCell(NSTextFieldCell): contact = None view = None frame = None audioIcon = NSImage.imageNamed_("audio_16") audioHoldIcon = NSImage.imageNamed_("paused_16") chatIcon = NSImage.imageNamed_("pencil_16") screenIcon = NSImage.imageNamed_("display_16") locationIcon = NSImage.imageNamed_("location") nightIcon = NSImage.imageNamed_("moon") style = NSParagraphStyle.defaultParagraphStyle().mutableCopy() style.setLineBreakMode_(NSLineBreakByTruncatingTail) firstLineAttributes = NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(12.0), NSFontAttributeName, style, NSParagraphStyleAttributeName) firstLineAttributes_highlighted = NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(12.0), NSFontAttributeName, NSColor.whiteColor(), NSForegroundColorAttributeName, style, NSParagraphStyleAttributeName) secondLineAttributes = NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(NSFont.labelFontSize() - 1), NSFontAttributeName, NSColor.grayColor(), NSForegroundColorAttributeName, style, NSParagraphStyleAttributeName) secondLineAttributes_highlighted = NSDictionary.dictionaryWithObjectsAndKeys_( NSFont.systemFontOfSize_(NSFont.labelFontSize() - 1), NSFontAttributeName, NSColor.whiteColor(), NSForegroundColorAttributeName, style, NSParagraphStyleAttributeName) def setContact_(self, contact): self.contact = contact def setMessageIcon_(self, icon): self.messageIcon = icon def drawingRectForBounds_(self, rect): return rect def cellSize(self): if self.contact is None: return objc.super(ContactCell, self).cellSize() return NSMakeSize(100, 30) def drawWithFrame_inView_(self, frame, view): if self.contact is None: return objc.super(ContactCell, self).drawWithFrame_inView_(frame, view) self.frame = frame self.view = view try: icon = self.contact.avatar.icon self.drawIcon(icon, 2, self.frame.origin.y + 3, 28, 28) self.drawActiveMedia() self.drawFirstLine() self.drawSecondLine() self.drawPresenceIcon() except Exception: pass @objc.python_method def drawFirstLine(self): frame = self.frame frame.origin.x = 35 frame.origin.y += 2 rect = NSMakeRect(frame.origin.x, frame.origin.y, frame.size.width - 10, frame.size.height) attrs = self.firstLineAttributes if not self.isHighlighted( ) else self.firstLineAttributes_highlighted self.stringValue().drawInRect_withAttributes_(rect, attrs) @objc.python_method def drawSecondLine(self): frame = self.frame frame.origin.y += 15 if self.contact.detail: rect = NSMakeRect(frame.origin.x, frame.origin.y, frame.size.width - 25, frame.size.height) attrs = self.secondLineAttributes if not self.isHighlighted( ) else self.secondLineAttributes_highlighted self.contact.detail.drawInRect_withAttributes_(rect, attrs) @objc.python_method def drawActiveMedia(self): if type(self.contact) not in (BlinkConferenceContact, BlinkMyselfConferenceContact): return padding = 16 left = self.frame.size.width - 8 if 'audio-onhold' in self.contact.active_media: left = left - padding self.drawIcon(self.audioHoldIcon, left, self.frame.origin.y + 14, 16, 16) elif 'audio' in self.contact.active_media: left = left - padding self.drawIcon(self.audioIcon, left, self.frame.origin.y + 14, 16, 16) if 'message' in self.contact.active_media: left = left - padding self.drawIcon(self.chatIcon, left, self.frame.origin.y + 14, 16, 16) if 'screen' in self.contact.active_media: left = left - padding - 2 self.drawIcon(self.screenIcon, left, self.frame.origin.y + 14, 16, 16) @objc.python_method 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) @objc.python_method def drawIcon(self, icon, origin_x, origin_y, size_x, size_y): size = icon.size() if not size or not size.height: return rect = NSMakeRect(0, 0, size.width, size.height) trect = NSMakeRect(origin_x, origin_y, (size_y / size.height) * size.width, size_x) icon.drawInRect_fromRect_operation_fraction_respectFlipped_hints_( trect, rect, NSCompositeSourceOver, 1.0, True, None)