|
|
@@ -3,11 +3,6 @@ import AppKit
|
|
|
import UniformTypeIdentifiers
|
|
|
|
|
|
struct LauncherRootView: View {
|
|
|
- enum Page: Hashable {
|
|
|
- case apps
|
|
|
- case widgets
|
|
|
- }
|
|
|
-
|
|
|
enum LayoutMode {
|
|
|
case grid
|
|
|
case panel
|
|
|
@@ -22,14 +17,10 @@ struct LauncherRootView: View {
|
|
|
@State private var draggedAppID: UUID?
|
|
|
@State private var lastDropDestinationAppID: UUID?
|
|
|
@State private var layoutMode: LayoutMode = .grid
|
|
|
- @State private var activePage: Page = .apps
|
|
|
- @State private var selectedWidgetAppID: UUID?
|
|
|
@AppStorage("customLauncherAppsData") private var customAppsData = ""
|
|
|
@AppStorage("launcherAppOrderData") private var appOrderData = ""
|
|
|
@AppStorage("pinnedTileIDsData") private var pinnedTileIDsData = ""
|
|
|
|
|
|
- @AppStorage("widgetAppIDsData") private var widgetAppIDsData = ""
|
|
|
-
|
|
|
private var apps: [LauncherApp] {
|
|
|
LauncherApp.sampleApps + customApps + [LauncherApp.createNewTile]
|
|
|
}
|
|
|
@@ -88,16 +79,9 @@ struct LauncherRootView: View {
|
|
|
SearchHeader(
|
|
|
query: $query,
|
|
|
isPanelMode: layoutMode == .panel,
|
|
|
- activePage: activePage,
|
|
|
onToggleLayout: {
|
|
|
layoutMode = layoutMode == .grid ? .panel : .grid
|
|
|
},
|
|
|
- onOpenWidgets: {
|
|
|
- activePage = .widgets
|
|
|
- },
|
|
|
- onOpenApps: {
|
|
|
- activePage = .apps
|
|
|
- },
|
|
|
onOpenPremium: {
|
|
|
showingPremiumScreen = true
|
|
|
},
|
|
|
@@ -116,16 +100,7 @@ struct LauncherRootView: View {
|
|
|
.padding(.bottom, 8)
|
|
|
.zIndex(1)
|
|
|
|
|
|
- switch activePage {
|
|
|
- case .apps:
|
|
|
- appsPage
|
|
|
- case .widgets:
|
|
|
- WidgetsRootView(
|
|
|
- apps: orderedApps.filter { !$0.isCreateNew },
|
|
|
- selectedAppID: $selectedWidgetAppID,
|
|
|
- widgetLibraryIDsData: $widgetAppIDsData
|
|
|
- )
|
|
|
- }
|
|
|
+ appsPage
|
|
|
}
|
|
|
.padding(.horizontal, 10)
|
|
|
.padding(.bottom, 8)
|
|
|
@@ -159,10 +134,10 @@ struct LauncherRootView: View {
|
|
|
queue: .main
|
|
|
) { notification in
|
|
|
let id = notification.userInfo?["appID"] as? UUID
|
|
|
- if let id {
|
|
|
- selectedWidgetAppID = id
|
|
|
- }
|
|
|
- activePage = .widgets
|
|
|
+ WidgetsWindowManager.shared.open(
|
|
|
+ apps: orderedApps.filter { !$0.isCreateNew },
|
|
|
+ selectedAppID: id
|
|
|
+ )
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -402,10 +377,7 @@ private struct TileReorderDropDelegate: DropDelegate {
|
|
|
private struct SearchHeader: View {
|
|
|
@Binding var query: String
|
|
|
let isPanelMode: Bool
|
|
|
- let activePage: LauncherRootView.Page
|
|
|
let onToggleLayout: () -> Void
|
|
|
- let onOpenWidgets: () -> Void
|
|
|
- let onOpenApps: () -> Void
|
|
|
let onOpenPremium: () -> Void
|
|
|
let onOpenGoogle: () -> Void
|
|
|
|
|
|
@@ -437,28 +409,10 @@ private struct SearchHeader: View {
|
|
|
}
|
|
|
.buttonStyle(.plain)
|
|
|
|
|
|
- Button(action: {
|
|
|
- if activePage == .apps {
|
|
|
- onOpenWidgets()
|
|
|
- } else {
|
|
|
- onOpenApps()
|
|
|
- }
|
|
|
- }) {
|
|
|
- Image(systemName: activePage == .apps ? "widget.small" : "square.grid.2x2")
|
|
|
- }
|
|
|
- .buttonStyle(.plain)
|
|
|
-
|
|
|
Menu {
|
|
|
Button("Clear Search") {
|
|
|
query = ""
|
|
|
}
|
|
|
- Button(activePage == .apps ? "Open Widgets" : "Open Apps") {
|
|
|
- if activePage == .apps {
|
|
|
- onOpenWidgets()
|
|
|
- } else {
|
|
|
- onOpenApps()
|
|
|
- }
|
|
|
- }
|
|
|
Button("Open Premium") {
|
|
|
onOpenPremium()
|
|
|
}
|
|
|
@@ -791,21 +745,3 @@ private struct HideMenuIndicatorIfAvailable: ViewModifier {
|
|
|
#Preview {
|
|
|
LauncherRootView()
|
|
|
}
|
|
|
-
|
|
|
-private struct VisualEffectBlur: NSViewRepresentable {
|
|
|
- let material: NSVisualEffectView.Material
|
|
|
- let blendingMode: NSVisualEffectView.BlendingMode
|
|
|
-
|
|
|
- func makeNSView(context: Context) -> NSVisualEffectView {
|
|
|
- let view = NSVisualEffectView()
|
|
|
- view.state = .active
|
|
|
- view.material = material
|
|
|
- view.blendingMode = blendingMode
|
|
|
- return view
|
|
|
- }
|
|
|
-
|
|
|
- func updateNSView(_ nsView: NSVisualEffectView, context: Context) {
|
|
|
- nsView.material = material
|
|
|
- nsView.blendingMode = blendingMode
|
|
|
- }
|
|
|
-}
|