From 16917d2a04d25864005516c2def556f5f118b878 Mon Sep 17 00:00:00 2001 From: Pietro Gagliardi Date: Wed, 9 Sep 2015 20:13:14 -0400 Subject: [PATCH] More OS X uiArea work. Started investigating the functionality of NSScroller, because I have a feeling I'm going to have to write my own NSScrollView clone. --- macarea/alt/scrollertest.swift | 148 +++++++++++++++++++++++++++++++++ macarea/area.m | 12 ++- macarea/draw.m | 2 + 3 files changed, 161 insertions(+), 1 deletion(-) create mode 100644 macarea/alt/scrollertest.swift diff --git a/macarea/alt/scrollertest.swift b/macarea/alt/scrollertest.swift new file mode 100644 index 00000000..721cab4d --- /dev/null +++ b/macarea/alt/scrollertest.swift @@ -0,0 +1,148 @@ +// 9 september 2015 +// from misctestprogs/scratcmac.swift 17 august 2015 +import Cocoa + +var keepAliveMainwin: NSWindow? = nil +var pprogram: AnyObject? = nil + +class intrinsicSizeScrollbar : NSScroller { + // notes: default intrinsic size is (-1,-1) + override var intrinsicContentSize: NSSize { + get { + var s = super.intrinsicContentSize + s.height = NSScroller.scrollerWidthForControlSize( + self.controlSize, + scrollerStyle: self.scrollerStyle) + return s + } + } +} + +class program : NSObject { + private var nhspinb: NSTextField + private var nvspinb: NSTextField + private var scrollbar: NSScroller + + init(_ contentView: NSView) { + self.nhspinb = newTextField() + self.nvspinb = newTextField() + + var ss = NSScroller.preferredScrollerStyle() + var ccs = NSScroller.scrollerWidthForControlSize( + NSControlSize.RegularControlSize, + scrollerStyle: ss) + self.scrollbar = intrinsicSizeScrollbar(frame: NSMakeRect(0, 0, ccs * 5, ccs)) + self.scrollbar.scrollerStyle = ss + self.scrollbar.knobStyle = NSScrollerKnobStyle.Default + self.scrollbar.controlTint = NSControlTint.DefaultControlTint + self.scrollbar.controlSize = NSControlSize.RegularControlSize +//TODO self.scrollbar.arrowPosition = NSScrollArrowPosition.ScrollerArrowsDefaultSetting + self.scrollbar.translatesAutoresizingMaskIntoConstraints = false + + contentView.addSubview(self.nhspinb) + contentView.addSubview(self.nvspinb) + contentView.addSubview(self.scrollbar) + + var views: [String: NSView] = [ + "nhspinb": nhspinb, + "nvspinb": nvspinb, + "scrollbar": scrollbar, + ] + addConstraint(contentView, "V:|-[nhspinb]-[scrollbar]-|", views) + addConstraint(contentView, "V:|-[nvspinb]-[scrollbar]-|", views) + addConstraint(contentView, "H:|-[nhspinb]-[nvspinb]-|", views) + addConstraint(contentView, "H:|-[scrollbar]-|", views) + } +} + +class intrinsicWidthTextField : NSTextField { + override var intrinsicContentSize: NSSize { + get { + var s = super.intrinsicContentSize + s.width = 96 + return s + } + } +} + +func newTextField() -> NSTextField { + var tf: NSTextField + var cell: NSTextFieldCell + + tf = intrinsicWidthTextField(frame: NSZeroRect) + tf.selectable = true + tf.font = NSFont.systemFontOfSize(NSFont.systemFontSizeForControlSize(NSControlSize.RegularControlSize)) + tf.bordered = false + tf.bezelStyle = NSTextFieldBezelStyle.SquareBezel + tf.bezeled = true + cell = tf.cell() as! NSTextFieldCell + cell.lineBreakMode = NSLineBreakMode.ByClipping + cell.scrollable = true + tf.translatesAutoresizingMaskIntoConstraints = false + return tf +} + +func newLabel(text: String) -> NSTextField { + var tf: NSTextField + var cell: NSTextFieldCell + + tf = NSTextField(frame: NSZeroRect) + tf.stringValue = text + tf.editable = false + tf.selectable = false + tf.drawsBackground = false + tf.font = NSFont.systemFontOfSize(NSFont.systemFontSizeForControlSize(NSControlSize.RegularControlSize)) + tf.bordered = false + tf.bezelStyle = NSTextFieldBezelStyle.SquareBezel + tf.bezeled = false + cell = tf.cell() as! NSTextFieldCell + cell.lineBreakMode = NSLineBreakMode.ByClipping + cell.scrollable = true + tf.translatesAutoresizingMaskIntoConstraints = false + return tf +} + +func appLaunched() { + var mainwin = NSWindow( + contentRect: NSMakeRect(0, 0, 320, 240), + styleMask: (NSTitledWindowMask | NSClosableWindowMask | NSMiniaturizableWindowMask | NSResizableWindowMask), + backing: NSBackingStoreType.Buffered, + defer: true) + var contentView = mainwin.contentView as! NSView + + pprogram = program(contentView) + + mainwin.cascadeTopLeftFromPoint(NSMakePoint(20, 20)) + mainwin.makeKeyAndOrderFront(mainwin) + keepAliveMainwin = mainwin +} + +func addConstraint(view: NSView, constraint: String, views: [String: NSView]) { + var constraints = NSLayoutConstraint.constraintsWithVisualFormat( + constraint, + options: NSLayoutFormatOptions(0), + metrics: nil, + views: views) + view.addConstraints(constraints) +} + +class appDelegate : NSObject, NSApplicationDelegate { + func applicationDidFinishLaunching(note: NSNotification) { + appLaunched() + } + + func applicationShouldTerminateAfterLastWindowClosed(app: NSApplication) -> Bool { + return true + } +} + +func main() { + var app = NSApplication.sharedApplication() + app.setActivationPolicy(NSApplicationActivationPolicy.Regular) + // NSApplication.delegate is weak; if we don't use the temporary variable, the delegate will die before it's used + var delegate = appDelegate() + app.delegate = delegate + app.run() +} + +main() diff --git a/macarea/area.m b/macarea/area.m index f15edbdf..6987ccbc 100644 --- a/macarea/area.m +++ b/macarea/area.m @@ -65,6 +65,13 @@ struct uiArea { return YES; } +// see http://stackoverflow.com/questions/11318987/black-background-when-overriding-drawrect-in-uiscrollview (for iOS but same idea) +// TODO there has to be a better way to set this; how does OS X do it for its default clip view? +/*- (BOOL)isOpaque +{ + return NO; +}*/ + @end @implementation areaDocumentView @@ -92,7 +99,10 @@ uiArea *newArea(uiAreaHandler *ah) [a->view setContentView:a->clipView]; [a->view setDocumentView:a->documentView]; - // TODO set up scoll view + // TODO set up scroll view + // for some reason, without this line, NSLayoutConstraints complains about internal limits being exceeded + [a->view setDrawsBackground:YES]; +//TODO [a->view setBackgroundColor:[NSColor controlColor]]; // set initial state // TODO do this on other platforms? diff --git a/macarea/draw.m b/macarea/draw.m index 97dc37f2..db8f5ba8 100644 --- a/macarea/draw.m +++ b/macarea/draw.m @@ -1,6 +1,8 @@ // 6 september 2015 #include "area.h" +// TODO some pixel thick lines aren't actually pixel thick + struct uiDrawContext { CGContextRef c;