Swift版 AppKit相当のフレームワークができたので、これまでReactフロントエンド / FastAPIバックエンドとして実装していた ZIKUU Mini用のAdmin Dashboardを Swift で書き換えることにしました。
まずはシステム情報を取得して表示する画面から着手。
比較のために React / FastAPI版の画面です。

Swiftで再実装したものがこれ。

MetricGaugeViewというViewのサブクラスを作って再利用可能にしました。
コードはこんな感じ。
// ~/workspace/AdminDashboard/Sources/AdminDashboard/MetricGaugeView.swift
import Application
import Core
/// A circular utilization gauge for percentage metrics.
final class MetricGaugeView: View {
var value: Double? {
didSet {
setNeedsDisplay()
}
}
var trackColor = GraphicsColor(
red: 0.87,
green: 0.89,
blue: 0.91
) {
didSet {
setNeedsDisplay()
}
}
var progressColor = GraphicsColor(
red: 0.25,
green: 0.49,
blue: 0.81
) {
didSet {
setNeedsDisplay()
}
}
var lineWidth: Float = 10 {
didSet {
setNeedsDisplay()
}
}
override init(frame: Rect) {
value = nil
super.init(frame: frame)
}
override init() {
value = nil
super.init()
}
override func draw(
_ dirtyRect: Rect,
in context: GraphicsContext
) {
let bounds = self.bounds
let diameter = min(
bounds.size.width,
bounds.size.height
)
guard diameter > 0 else {
return
}
let strokeWidth = min(
max(1, lineWidth),
diameter / 4
)
let radius = (diameter - strokeWidth) / 2 - 2
guard radius > 0 else {
return
}
let center = Point(
x: bounds.midX,
y: bounds.midY
)
context.saveGraphicsState()
defer {
context.restoreGraphicsState()
}
context.setLineWidth(strokeWidth)
context.setLineCapStyle(.round)
// MARK: Background Track
let track = BezierPath()
track.appendArc(
center: center,
radius: radius,
startAngle: -90,
endAngle: 270
)
context.setStrokeColor(trackColor)
context.stroke(track)
guard let value, value.isFinite else {
return
}
let percentage = min(
100,
max(0, value)
)
guard percentage > 0 else {
return
}
let startAngle: Float = -90
let endAngle = startAngle
+ Float(percentage / 100) * 360
let progress = BezierPath()
progress.appendArc(
center: center,
radius: radius,
startAngle: startAngle,
endAngle: endAngle
)
context.setStrokeColor(progressColor)
context.stroke(progress)
}
}
Swiftで書き直したバックエンドのAPIサーバーに、デスクトップアプリからアクセス構成にしています。
定期的にサーバーにポーリングする関係で、別のスレッドでAPIサーバーにアクセスするようにしました。そのため、フレームワークのApplicationのrunLoopの中で、スレッド処理をするように拡張しました。
早速、フレームワーク側を練ることができました。
「ZIKUU Mini – Admin DashboardをSwiftで再実装する」への1件のフィードバック