Skip to content

Commit

Permalink
Move preference window handling and Bundle access to Kotlin
Browse files Browse the repository at this point in the history
  • Loading branch information
zsmb13 committed Oct 7, 2023
1 parent 80cd94c commit 00e2382
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 35 deletions.
27 changes: 8 additions & 19 deletions KotlinLogos/KotlinLogos/KotlinLogos.swift
Original file line number Diff line number Diff line change
Expand Up @@ -3,39 +3,28 @@ import Cocoa
import KotlinLogo

class KotlinLogosView : ScreenSaverView {

let kotlinScreenSaverView = KotlinScreenSaverViewKt.create()

override init?(frame: NSRect, isPreview: Bool) {
super.init(frame: frame, isPreview: isPreview)
let b = Bundle(for: type(of: self))
kotlinScreenSaverView.doInit(screenSaverView: self, isPreview: isPreview, bundle: b)
kotlinScreenSaverView.doInit(screenSaverView: self, isPreview: isPreview)
}

@available(*, unavailable)

required init?(coder decoder: NSCoder) {
fatalError("init(coder:) has not been implemented")
}

override func draw(_ rect: NSRect) {
super.draw(rect)

var r = rect
kotlinScreenSaverView.draw(rect: &r)
var mutableRect = rect
kotlinScreenSaverView.draw(rect: &mutableRect)
}

override func animateOneFrame() {
super.animateOneFrame()
kotlinScreenSaverView.animateOneFrame()
}

lazy var sheetController: NSWindowController = ConfigKt.prefController()

override var hasConfigureSheet: Bool {
return true
}

override var configureSheet: NSWindow? {
return sheetController.window
}
override var hasConfigureSheet: Bool { kotlinScreenSaverView.configureSheet != nil }
override var configureSheet: NSWindow? { kotlinScreenSaverView.configureSheet }
}
7 changes: 5 additions & 2 deletions src/nativeMain/kotlin/KotlinScreenSaverView.kt
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@

import kotlinx.cinterop.CPointer
import kotlinx.cinterop.ExperimentalForeignApi
import platform.AppKit.NSWindow
import platform.Foundation.NSBundle
import platform.Foundation.NSRect
import platform.ScreenSaver.ScreenSaverView
Expand All @@ -18,12 +19,14 @@ abstract class KotlinScreenSaverView {
protected var isPreview = false
private set

open fun init(screenSaverView: ScreenSaverView, isPreview: Boolean, bundle: NSBundle) {
open fun init(screenSaverView: ScreenSaverView, isPreview: Boolean) {
this.view = screenSaverView
this.bundle = bundle
this.bundle = NSBundle.bundleWithIdentifier("co.zsmb.KotlinLogos")!!
this.isPreview = isPreview
}

abstract fun draw(rect: CPointer<NSRect>)
abstract fun animateOneFrame()

open val configureSheet: NSWindow? = null
}
24 changes: 14 additions & 10 deletions src/nativeMain/kotlin/LogoScreenSaverView.kt
Original file line number Diff line number Diff line change
@@ -1,25 +1,30 @@
@file:OptIn(ExperimentalForeignApi::class)

import config.KotlinLogosPrefController
import config.Preferences
import kotlinx.cinterop.CPointer
import kotlinx.cinterop.ExperimentalForeignApi
import platform.Foundation.NSBundle
import platform.AppKit.NSWindow
import platform.Foundation.NSNotificationCenter
import platform.Foundation.NSRect
import platform.Foundation.NSUserDefaultsDidChangeNotification
import platform.ScreenSaver.ScreenSaverView
import util.Debouncer

class LogoScreenSaverView : KotlinScreenSaverView() {
private var logos: List<BouncingLogo> = emptyList()
private val preferencesController by lazy { KotlinLogosPrefController() }
override val configureSheet: NSWindow?
get() = preferencesController.window

override fun init(screenSaverView: ScreenSaverView, isPreview: Boolean, bundle: NSBundle) {
super.init(screenSaverView, isPreview, bundle)
override fun init(screenSaverView: ScreenSaverView, isPreview: Boolean) {
super.init(screenSaverView, isPreview)
screenSaverView.animationTimeInterval = 1 / 60.0
setupUserDefaultsObserver()
initLogos()
}

private var logos: List<BouncingLogo> = emptyList()

override fun draw(rect: CPointer<NSRect>) {
logos.forEach(BouncingLogo::draw)
}
Expand All @@ -29,6 +34,11 @@ class LogoScreenSaverView : KotlinScreenSaverView() {
view.setNeedsDisplayInRect(view.frame)
}

private fun initLogos() {
logos.forEach(BouncingLogo::dispose)
logos = List(Preferences.LOGO_COUNT) { BouncingLogo(view, bundle, imageSets[Preferences.LOGO_SET].images()) }
}

private val debouncer = Debouncer(delayMs = 500)

private fun setupUserDefaultsObserver() {
Expand All @@ -37,10 +47,4 @@ class LogoScreenSaverView : KotlinScreenSaverView() {
debouncer.execute { initLogos() }
}
}

private fun initLogos() {
logos.forEach(BouncingLogo::dispose)
logos = List(Preferences.LOGO_COUNT) { BouncingLogo(view, bundle, imageSets[Preferences.LOGO_SET].images()) }
}
}

4 changes: 0 additions & 4 deletions src/nativeMain/kotlin/config/Config.kt
Original file line number Diff line number Diff line change
Expand Up @@ -234,7 +234,3 @@ class KotlinLogosPrefController : NSWindowController, NSWindowDelegateProtocol {
window?.sheetParent?.endSheet(window!!)
}
}

fun prefController(): NSWindowController {
return KotlinLogosPrefController()
}

0 comments on commit 00e2382

Please sign in to comment.