def drawWithFrame_inView_(self, cellFrame: NSRect, view) -> None: # The data to display. try: label = self.objectValue.attrs['label'] icon = self.objectValue.attrs['icon'] except AttributeError: # Value is a simple string. label = self.objectValue icon = None if icon and icon.native: offset = 28.5 NSGraphicsContext.currentContext.saveGraphicsState() yOffset = cellFrame.origin.y if view.isFlipped: xform = NSAffineTransform.transform() xform.translateXBy(8, yBy=cellFrame.size.height) xform.scaleXBy(1.0, yBy=-1.0) xform.concat() yOffset = 0.5 - cellFrame.origin.y interpolation = NSGraphicsContext.currentContext.imageInterpolation NSGraphicsContext.currentContext.imageInterpolation = NSImageInterpolationHigh icon.native.drawInRect(NSRect(NSPoint(cellFrame.origin.x, yOffset), NSSize(16.0, 16.0)), fromRect=NSRect( NSPoint(0, 0), NSSize(icon.native.size.width, icon.native.size.height)), operation=NSCompositingOperationSourceOver, fraction=1.0) NSGraphicsContext.currentContext.imageInterpolation = interpolation NSGraphicsContext.currentContext.restoreGraphicsState() else: # No icon; just the text label offset = 5 if label: # Find the right color for the text if self.isHighlighted(): primaryColor = NSColor.alternateSelectedControlTextColor else: if False: primaryColor = NSColor.disabledControlTextColor else: primaryColor = NSColor.textColor textAttributes = NSMutableDictionary.alloc().init() textAttributes[NSForegroundColorAttributeName] = primaryColor textAttributes[NSFontAttributeName] = NSFont.systemFontOfSize(13) at(label).drawAtPoint(NSPoint(cellFrame.origin.x + offset, cellFrame.origin.y), withAttributes=textAttributes)
def tableView_viewForTableColumn_row_(self, table, column, row: int): data_row = self.interface.data[row] col_identifier = str(column.identifier) try: value = getattr(data_row, col_identifier) # if the value is a widget itself, just draw the widget! if isinstance(value, toga.Widget): return value._impl.native # Allow for an (icon, value) tuple as the simple case # for encoding an icon in a table cell. Otherwise, look # for an icon attribute. elif isinstance(value, tuple): icon_iface, value = value else: try: icon_iface = value.icon except AttributeError: icon_iface = None except AttributeError: # The accessor doesn't exist in the data. Use the missing value. try: value = self.interface.missing_value except ValueError as e: # There is no explicit missing value. Warn the user. message, value = e.args print(message.format(row, col_identifier)) icon_iface = None # If the value has an icon, get the _impl. # Icons are deferred resources, so we provide the factory. if icon_iface: icon = icon_iface.bind(self.interface.factory) else: icon = None # creates a NSTableCellView from interface-builder template (does not exist) # or reuses an existing view which is currently not needed for painting # returns None (nil) if both fails identifier = at('CellView_{}'.format(self.interface.id)) tcv = self.makeViewWithIdentifier(identifier, owner=self) if not tcv: # there is no existing view to reuse so create a new one tcv = TogaIconView.alloc().initWithFrame_( CGRectMake(0, 0, column.width, 16)) tcv.identifier = identifier tcv.setText(str(value)) if icon: tcv.setImage(icon.native) else: tcv.setImage(None) # Keep track of last visible view for row self._impl._view_for_row[data_row] = tcv return tcv
def _add_column(self, heading, accessor): column_identifier = at(accessor) self.column_identifiers[accessor] = column_identifier column = NSTableColumn.alloc().initWithIdentifier(column_identifier) self.table.addTableColumn(column) self.columns.append(column) column.headerCell.stringValue = heading
def outlineView_viewForTableColumn_item_(self, tree, column, item): col_identifier = str(column.identifier) try: value = getattr(item.attrs['node'], col_identifier) # if the value is a widget itself, just draw the widget! if isinstance(value, toga.Widget): return value._impl.native # Allow for an (icon, value) tuple as the simple case # for encoding an icon in a table cell. Otherwise, look # for an icon attribute. elif isinstance(value, tuple): icon_iface, value = value else: try: icon_iface = value.icon except AttributeError: icon_iface = None except AttributeError: # If the node doesn't have a property with the # accessor name, assume an empty string value. value = '' icon_iface = None # If the value has an icon, get the _impl. # Icons are deferred resources, so we provide the factory. if icon_iface: icon = icon_iface.bind(self.interface.factory) else: icon = None # creates a NSTableCellView from interface-builder template (does not exist) # or reuses an existing view which is currently not needed for painting # returns None (nil) if both fails identifier = at('CellView_{}'.format(self.interface.id)) tcv = self.makeViewWithIdentifier(identifier, owner=self) if not tcv: # there is no existing view to reuse so create a new one tcv = TogaIconView.alloc().initWithFrame_( CGRectMake(0, 0, column.width, 16)) tcv.identifier = identifier # Prevent tcv from being deallocated prematurely when no Python references # are left tcv.retain() tcv.autorelease() tcv.setText(str(value)) if icon: tcv.setImage(icon.native) else: tcv.setImage(None) return tcv
def create(self): # Create a tree view, and put it in a scroll view. # The scroll view is the _impl, because it's the outer container. self.native = NSScrollView.alloc().init() self.native.hasVerticalScroller = True self.native.hasHorizontalScroller = False self.native.autohidesScrollers = False self.native.borderType = NSBezelBorder # Create the Tree widget self.tree = TogaTree.alloc().init() self.tree.interface = self.interface self.tree._impl = self self.tree.columnAutoresizingStyle = NSTableViewColumnAutoresizingStyle.Uniform self.tree.usesAlternatingRowBackgroundColors = True self.tree.allowsMultipleSelection = self.interface.multiple_select # Create columns for the tree self.columns = [] # Cocoa identifies columns by an accessor; to avoid repeated # conversion from ObjC string to Python String, create the # ObjC string once and cache it. self.column_identifiers = {} for i, (heading, accessor) in enumerate( zip(self.interface.headings, self.interface._accessors)): column_identifier = at(accessor) self.column_identifiers[id(column_identifier)] = accessor column = NSTableColumn.alloc().initWithIdentifier( column_identifier) # column.editable = False column.minWidth = 16 # if self.interface.sorting: # sort_descriptor = NSSortDescriptor.sortDescriptorWithKey(column_identifier, ascending=True) # column.sortDescriptorPrototype = sort_descriptor self.tree.addTableColumn(column) self.columns.append(column) column.headerCell.stringValue = heading # Put the tree arrows in the first column. self.tree.outlineTableColumn = self.columns[0] self.tree.delegate = self.tree self.tree.dataSource = self.tree self.tree.target = self.tree self.tree.doubleAction = SEL('onDoubleClick:') # Embed the tree view in the scroll view self.native.documentView = self.tree # Add the layout constraints self.add_constraints()
def drawInteriorWithFrame_inView_(self, cellFrame: NSRect, view) -> None: # The data to display. icon = self.objectValue.attrs['icon'] title = self.objectValue.attrs['title'] subtitle = self.objectValue.attrs['subtitle'] if icon and icon.native: NSGraphicsContext.currentContext.saveGraphicsState() yOffset = cellFrame.origin.y if view.isFlipped: xform = NSAffineTransform.transform() xform.translateXBy(4, yBy=cellFrame.size.height) xform.scaleXBy(1.0, yBy=-1.0) xform.concat() yOffset = 0.5 - cellFrame.origin.y interpolation = NSGraphicsContext.currentContext.imageInterpolation NSGraphicsContext.currentContext.imageInterpolation = NSImageInterpolationHigh icon.native.drawInRect(NSRect( NSPoint(cellFrame.origin.x, yOffset + 4), NSSize(40.0, 40.0)), fromRect=NSRect( NSPoint(0, 0), NSSize(icon.native.size.width, icon.native.size.height)), operation=NSCompositingOperationSourceOver, fraction=1.0) NSGraphicsContext.currentContext.imageInterpolation = interpolation NSGraphicsContext.currentContext.restoreGraphicsState() else: path = NSBezierPath.bezierPathWithRect( NSRect(NSPoint(cellFrame.origin.x, cellFrame.origin.y + 4), NSSize(40.0, 40.0))) NSColor.grayColor.set() path.fill() if title: # Find the right color for the text if self.isHighlighted(): primaryColor = NSColor.alternateSelectedControlTextColor else: if False: primaryColor = NSColor.disabledControlTextColor else: primaryColor = NSColor.textColor textAttributes = NSMutableDictionary.alloc().init() textAttributes[NSForegroundColorAttributeName] = primaryColor textAttributes[NSFontAttributeName] = NSFont.systemFontOfSize(15) at(title).drawAtPoint(NSPoint(cellFrame.origin.x + 48, cellFrame.origin.y + 4), withAttributes=textAttributes) if subtitle: # Find the right color for the text if self.isHighlighted(): primaryColor = NSColor.alternateSelectedControlTextColor else: if False: primaryColor = NSColor.disabledControlTextColor else: primaryColor = NSColor.textColor textAttributes = NSMutableDictionary.alloc().init() textAttributes[NSForegroundColorAttributeName] = primaryColor textAttributes[NSFontAttributeName] = NSFont.systemFontOfSize(13) at(subtitle).drawAtPoint(NSPoint(cellFrame.origin.x + 48, cellFrame.origin.y + 24), withAttributes=textAttributes)
def tabView_didSelectTabViewItem_(self, view, item) -> None: index = at(item.identifier).longValue if self.interface.on_select: self.interface.on_select(self.interface, option=self.interface.content[index])