mirror of
https://github.com/CloverHackyColor/CloverBootloader.git
synced 2024-12-18 15:27:48 +01:00
a4c90606d1
HelmoHass themes repository (by LAbyOne) can be selected directly in the UI. Now the theme manager knows when a theme is out dated and show a dedicate icon when this happens. Now Clover.app can encode the git sha1 ... always with out git. Searching themes in the relative fields is now even more easy by tipying the name partially in case insensitive mode. builme now close the Terminal window when exit is selected (thanks to LAbyOne). Fixed a bug in the theme manager engine switching between repositories.
160 lines
5.4 KiB
Swift
160 lines
5.4 KiB
Swift
//
|
|
// ThemeView.swift
|
|
// ThemeManager
|
|
//
|
|
// Created by vector sigma on 07/01/2020.
|
|
// Copyright © 2020 vectorsigma. All rights reserved.
|
|
//
|
|
|
|
import Cocoa
|
|
import WebKit
|
|
|
|
class ThemeView: NSView, WebFrameLoadDelegate, WebUIDelegate {
|
|
var manager : ThemeManager
|
|
var imagePath : String?
|
|
var name : String
|
|
var author : String?
|
|
var info : String?
|
|
var row : Int
|
|
var isInstalled = false
|
|
var isUpToDate = true
|
|
|
|
public let webView: WebView = {
|
|
let wv = WebView(frame: NSMakeRect(0, 0, 147, 82))
|
|
wv.mainFrame.frameView.allowsScrolling = false
|
|
wv.drawsBackground = false
|
|
return wv
|
|
} ()
|
|
|
|
deinit {
|
|
self.webView.stopLoading(nil)
|
|
}
|
|
|
|
func webView(_ sender: WebView!, makeFirstResponder responder: NSResponder!) {
|
|
if self.row >= 0 {
|
|
self.manager.delegate?.sidebar.selectRowIndexes(IndexSet(integer: self.row),
|
|
byExtendingSelection: false)
|
|
}
|
|
}
|
|
|
|
// MARK: - designated initializer
|
|
init(manager: ThemeManager, name: String, row: Int) {
|
|
self.manager = manager
|
|
self.name = name
|
|
self.row = row
|
|
super.init(frame: NSMakeRect(0, 0, 147, 82))
|
|
self.setup()
|
|
self.load()
|
|
}
|
|
|
|
required init?(coder: NSCoder) {
|
|
fatalError("init(coder:) has not been implemented")
|
|
}
|
|
|
|
private func setup() {
|
|
self.addSubview(self.webView)
|
|
|
|
self.webView.translatesAutoresizingMaskIntoConstraints = false
|
|
let left = NSLayoutConstraint(item: self.webView,
|
|
attribute: .left,
|
|
relatedBy: .equal,
|
|
toItem: self,
|
|
attribute: .left,
|
|
multiplier: 1.0,
|
|
constant: 0.0)
|
|
let bottom = NSLayoutConstraint(item: self.webView,
|
|
attribute: .bottom,
|
|
relatedBy: .equal,
|
|
toItem: self,
|
|
attribute: .bottom,
|
|
multiplier: 1.0,
|
|
constant: 0.0)
|
|
let width = NSLayoutConstraint(item: self.webView,
|
|
attribute: .width,
|
|
relatedBy: .equal,
|
|
toItem: self,
|
|
attribute: .width,
|
|
multiplier: 1.0,
|
|
constant: 0.0)
|
|
let height = NSLayoutConstraint(item: self.webView,
|
|
attribute: .height,
|
|
relatedBy: .equal,
|
|
toItem: self,
|
|
attribute: .height,
|
|
multiplier: 1.0,
|
|
constant: 0.0)
|
|
self.addConstraints([left, bottom, height, width])
|
|
|
|
|
|
self.webView.uiDelegate = self
|
|
self.webView.frameLoadDelegate = self
|
|
}
|
|
|
|
func load() {
|
|
if self.manager.exist(theme: self.name) {
|
|
self.manager.getImageUrl(for: self.name, completion: { (ipath) in
|
|
if let path = ipath {
|
|
self.imagePath = path
|
|
} else {
|
|
DispatchQueue.main.async { [weak self] in
|
|
self?.load()
|
|
}
|
|
}
|
|
self.setInstalledStatus()
|
|
})
|
|
} else {
|
|
self.setInstalledStatus()
|
|
}
|
|
}
|
|
|
|
@objc func targetVolumeDidChange() {
|
|
self.setInstalledStatus()
|
|
}
|
|
|
|
func setInstalledStatus() {
|
|
var installPath = ""
|
|
if let vol = self.manager.delegate?.targetVolume {
|
|
installPath = vol.addPath("EFI/CLOVER/themes").addPath(self.name)
|
|
self.isInstalled = fm.fileExists(atPath: installPath)
|
|
if (self.imagePath == nil) {
|
|
if fm.fileExists(atPath: vol.addPath("EFI/CLOVER/themes").addPath(self.name).addPath("theme.svg")) {
|
|
self.imagePath = vol.addPath("EFI/CLOVER/themes").addPath(self.name).addPath("theme.svg")
|
|
self.setInstalledStatus()
|
|
} else if fm.fileExists(atPath: vol.addPath("EFI/CLOVER/themes").addPath(self.name).addPath("screenshot.png")) {
|
|
self.imagePath = vol.addPath("EFI/CLOVER/themes").addPath(self.name).addPath("screenshot.png")
|
|
self.setInstalledStatus()
|
|
}
|
|
}
|
|
}
|
|
|
|
if let path = self.imagePath {
|
|
if self.isInstalled {
|
|
self.isUpToDate = self.manager.isThemeUpToDate(at: installPath)
|
|
let icon = Bundle.main.path(forResource: self.isUpToDate ? "check" : "update", ofType: "png")
|
|
self.webView.mainFrame.loadHTMLString("""
|
|
<html>
|
|
<body>
|
|
<div align="center" style="position:relative; height: 100%; width: 100%; top:0;left 0;">
|
|
<img src="\(URL(fileURLWithPath: path))" style="width: 100% ; max-width: 128px;"/>
|
|
<img src="\(URL(fileURLWithPath: icon!))" style="position:absolute; top:8; left:8;"/>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
""", baseURL: Bundle.main.bundleURL)
|
|
} else {
|
|
self.isUpToDate = true
|
|
self.webView.mainFrame.loadHTMLString("""
|
|
<html>
|
|
<body>
|
|
<div align="center" style="position:relative; height: 100%; width: 100%; top:0;left 0;">
|
|
<img src="\(URL(fileURLWithPath: path))" style="width: 100% ; max-width: 128px;top:0;"/>
|
|
</div>
|
|
</body>
|
|
</html>
|
|
""", baseURL: Bundle.main.bundleURL)
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|