1
0
mirror of https://github.com/nicoverbruggen/phpmon.git synced 2026-03-29 16:10:08 +02:00

🏗 WIP: UI for searchable extensions

This commit is contained in:
2023-11-21 20:03:50 +01:00
parent 3b78ac43d7
commit f39732a0e6
5 changed files with 54 additions and 37 deletions

View File

@@ -215,6 +215,10 @@ class MainMenu: NSObject, NSWindowDelegate, NSMenuDelegate, PhpSwitcherDelegate
PhpVersionManagerWindowController.show() PhpVersionManagerWindowController.show()
} }
@objc func openPhpExtensionManager() {
PhpExtensionManagerWindowController.show()
}
@objc func openDonate() { @objc func openDonate() {
NSWorkspace.shared.open(Constants.Urls.DonationPage) NSWorkspace.shared.open(Constants.Urls.DonationPage)
} }

View File

@@ -152,6 +152,9 @@ extension StatusMenu {
NSMenuItem(title: "mi_php_version_manager".localized, NSMenuItem(title: "mi_php_version_manager".localized,
action: #selector(MainMenu.openPhpVersionManager), action: #selector(MainMenu.openPhpVersionManager),
keyEquivalent: "m"), keyEquivalent: "m"),
NSMenuItem(title: "mi_php_ext_manager".localized,
action: #selector(MainMenu.openPhpExtensionManager),
keyEquivalent: "e"),
NSMenuItem(title: "mi_php_config".localized, NSMenuItem(title: "mi_php_config".localized,
action: #selector(MainMenu.openActiveConfigFolder), action: #selector(MainMenu.openActiveConfigFolder),
keyEquivalent: "c"), keyEquivalent: "c"),
@@ -200,16 +203,6 @@ extension StatusMenu {
post: stats.post_max_size, post: stats.post_max_size,
upload: stats.upload_max_filesize) upload: stats.upload_max_filesize)
) )
// TODO: As soon as this does more than just edit memory limits, move this
/*
addItem(NSMenuItem.separator())
addItem(NSMenuItem(
title: "mi_manage_limits".localized,
action: #selector(MainMenu.openConfigGUI),
keyEquivalent: "l")
)
*/
} }
// MARK: - Extensions // MARK: - Extensions

View File

@@ -9,6 +9,23 @@
import Foundation import Foundation
import SwiftUI import SwiftUI
class BrewExtensionsObservable: ObservableObject {
@Published var extensions: [BrewPhpExtension] = [] {
didSet {
print(self.extensions)
}
}
public func loadExtensionData(for version: String) {
let tapFormulae = BrewTapFormulae.from(tap: "shivammathur/homebrew-extensions")
if let filteredTapFormulae = tapFormulae[version] {
self.extensions = filteredTapFormulae.sorted().map({ name in
return BrewPhpExtension(name: name, isInstalled: false)
})
}
}
}
// Temp model for UI purposes // Temp model for UI purposes
struct BrewPhpExtension { struct BrewPhpExtension {
let name: String let name: String
@@ -17,34 +34,33 @@ struct BrewPhpExtension {
struct PhpExtensionManagerView: View { struct PhpExtensionManagerView: View {
init() { init() {
let formulae = BrewTapFormulae.from(tap: "shivammathur/homebrew-extensions") self.searchText = ""
self.phpVersion = PhpEnvironments.shared.currentInstall!.version.short
self.manager.loadExtensionData(for: self.phpVersion)
}
if formulae.keys.contains(self.phpVersion) { @ObservedObject var manager = BrewExtensionsObservable()
let extensions = formulae[self.phpVersion]! @State var searchText: String
.sorted() @State var phpVersion: String {
.map({ name in didSet {
return BrewPhpExtension(name: name, isInstalled: false) self.manager.loadExtensionData(for: self.phpVersion)
}) print(self.manager.extensions)
self.extensions = extensions
} }
} }
@State var searchText: String = "" var filteredExtensions: [BrewPhpExtension] {
@State var extensions: [BrewPhpExtension] = [] guard !searchText.isEmpty else {
@State var phpVersion: String = "" return manager.extensions
}
return manager.extensions.filter { $0.name.contains(searchText) }
}
var body: some View { var body: some View {
VStack { VStack {
// header.padding(20) header.padding(20)
List(Array(extensions.enumerated()), id: \.1.name) { (index, pExtension) in List(Array(self.filteredExtensions.enumerated()), id: \.1.name) { (_, pExtension) in
listContent(for: pExtension) listContent(for: pExtension)
.listRowBackground(
index % 2 == 0
? Color.gray.opacity(0)
: Color.gray.opacity(0.08)
)
.padding(.vertical, 8) .padding(.vertical, 8)
.padding(.horizontal, 8) .padding(.horizontal, 8)
} }
@@ -79,6 +95,10 @@ struct PhpExtensionManagerView: View {
HStack(alignment: .center, spacing: 7.0) { HStack(alignment: .center, spacing: 7.0) {
VStack(alignment: .leading, spacing: 0) { VStack(alignment: .leading, spacing: 0) {
HStack { HStack {
Image(systemName: "puzzlepiece.extension")
.resizable()
.frame(width: 12, height: 12)
.foregroundColor(Color.blue)
Text(bExtension.name).bold() Text(bExtension.name).bold()
} }
} }

View File

@@ -14,7 +14,7 @@ class PhpExtensionManagerWindowController: PMWindowController {
// MARK: - Window Identifier // MARK: - Window Identifier
var view: PhpVersionManagerView! var view: PhpExtensionManagerView!
override var windowName: String { override var windowName: String {
return "PhpExtensionManager" return "PhpExtensionManager"
@@ -24,15 +24,12 @@ class PhpExtensionManagerWindowController: PMWindowController {
let windowController = Self() let windowController = Self()
windowController.window = NSWindow() windowController.window = NSWindow()
windowController.view = PhpVersionManagerView( windowController.view = PhpExtensionManagerView()
formulae: Brew.shared.formulae,
handler: BrewPhpFormulaeHandler()
)
guard let window = windowController.window else { return } guard let window = windowController.window else { return }
window.title = "" window.title = "phpextman.window.title".localized
window.styleMask = [.titled, .closable, .miniaturizable] window.styleMask = [.titled, .closable, .miniaturizable]
window.titlebarAppearsTransparent = true window.titlebarAppearsTransparent = false
window.delegate = delegate ?? windowController window.delegate = delegate ?? windowController
window.contentView = NSHostingView(rootView: windowController.view) window.contentView = NSHostingView(rootView: windowController.view)
window.setContentSize(NSSize(width: 600, height: 800)) window.setContentSize(NSSize(width: 600, height: 800))

View File

@@ -12,7 +12,9 @@
"mi_no_php_linked" = "No PHP version linked!"; "mi_no_php_linked" = "No PHP version linked!";
"mi_fix_php_link" = "Fix Automatically..."; "mi_fix_php_link" = "Fix Automatically...";
"mi_no_php_linked_explain" = "What's This?"; "mi_no_php_linked_explain" = "What's This?";
"mi_php_version_manager" = "PHP Version Manager...";
"mi_php_version_manager" = "Manage PHP Installations...";
"mi_php_ext_manager" = "Manage PHP Extensions...";
"mi_php_config_manager" = "PHP Configuration Editor..."; "mi_php_config_manager" = "PHP Configuration Editor...";
"mi_manage_limits" = "Manage Limits..."; "mi_manage_limits" = "Manage Limits...";
@@ -100,6 +102,7 @@
// PHPEXTMAN // PHPEXTMAN
"phpextman.window.title" = "Extensions";
"phpextman.description" = "**PHP Extension Manager** lets you manage different PHP extensions with a simple click of the button. Because Homebrew is used, extensions won't need to be compiled on the fly using `pecl`."; "phpextman.description" = "**PHP Extension Manager** lets you manage different PHP extensions with a simple click of the button. Because Homebrew is used, extensions won't need to be compiled on the fly using `pecl`.";
"phpextman.disclaimer" = "Certain extensions may require other dependencies to be installed, but generally speaking installing extensions should be much faster than installing PHP versions."; "phpextman.disclaimer" = "Certain extensions may require other dependencies to be installed, but generally speaking installing extensions should be much faster than installing PHP versions.";