Skip to content

Commit cf4ee3b

Browse files
(fix: #9) Grayscale Selection When Not Focused (#16)
1 parent fad3087 commit cf4ee3b

File tree

3 files changed

+25
-1
lines changed

3 files changed

+25
-1
lines changed
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
//
2+
// NSColor+Greyscale.swift
3+
// CodeEditTextView
4+
//
5+
// Created by Khan Winter on 2/2/24.
6+
//
7+
8+
import AppKit
9+
10+
extension NSColor {
11+
var grayscale: NSColor {
12+
guard let color = self.usingColorSpace(.deviceRGB) else { return self }
13+
// linear relative weights for grayscale: https://en.wikipedia.org/wiki/Grayscale
14+
let gray = 0.299 * color.redComponent + 0.587 * color.greenComponent + 0.114 * color.blueComponent
15+
return NSColor(white: gray, alpha: color.alphaComponent)
16+
}
17+
}

Sources/CodeEditTextView/TextSelectionManager/TextSelectionManager.swift

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -269,7 +269,12 @@ public class TextSelectionManager: NSObject {
269269
/// - context: The context to draw in.
270270
private func drawSelectedRange(in rect: NSRect, for textSelection: TextSelection, context: CGContext) {
271271
context.saveGState()
272-
context.setFillColor(selectionBackgroundColor.cgColor)
272+
273+
let fillColor = (textView?.isFirstResponder ?? false)
274+
? selectionBackgroundColor.cgColor
275+
: selectionBackgroundColor.grayscale.cgColor
276+
277+
context.setFillColor(fillColor)
273278

274279
let fillRects = getFillRects(in: rect, for: textSelection)
275280

Sources/CodeEditTextView/TextView/TextView.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -314,12 +314,14 @@ public class TextView: NSView, NSTextContent {
314314
open override func becomeFirstResponder() -> Bool {
315315
isFirstResponder = true
316316
selectionManager.cursorTimer.resetTimer()
317+
needsDisplay = true
317318
return super.becomeFirstResponder()
318319
}
319320

320321
open override func resignFirstResponder() -> Bool {
321322
isFirstResponder = false
322323
selectionManager.removeCursors()
324+
needsDisplay = true
323325
return super.resignFirstResponder()
324326
}
325327

0 commit comments

Comments
 (0)