From 87fcc576c57d7de72a4544d2039d368ca5a1c836 Mon Sep 17 00:00:00 2001 From: Shadowfacts Date: Sun, 27 Sep 2020 22:11:34 -0400 Subject: [PATCH] iOS: Add URL field and toolbar --- BrowserCore/NavigationManager.swift | 5 ++ Gemini-iOS/ContentView.swift | 86 ++++++++++++++++++++++++++++- 2 files changed, 89 insertions(+), 2 deletions(-) diff --git a/BrowserCore/NavigationManager.swift b/BrowserCore/NavigationManager.swift index fd1cc0f..f130b9a 100644 --- a/BrowserCore/NavigationManager.swift +++ b/BrowserCore/NavigationManager.swift @@ -23,6 +23,11 @@ public class NavigationManager: NSObject, ObservableObject { forwardStack = [] } + public func reload() { + let url = currentURL + currentURL = url + } + private func cannonicalizeURL(_ url: URL) -> URL { var components = URLComponents(url: url, resolvingAgainstBaseURL: false)! if components.scheme == "gemini" && components.port == 1965 { diff --git a/Gemini-iOS/ContentView.swift b/Gemini-iOS/ContentView.swift index ded0338..3a7181c 100644 --- a/Gemini-iOS/ContentView.swift +++ b/Gemini-iOS/ContentView.swift @@ -9,10 +9,92 @@ import SwiftUI import BrowserCore struct ContentView: View { - let navigator: NavigationManager + @ObservedObject private var navigator: NavigationManager + @State private var urlFieldContents: String + @State private var showPreferencesSheet = false + + init(navigator: NavigationManager) { + self.navigator = navigator + self._urlFieldContents = State(initialValue: navigator.currentURL.absoluteString) + } var body: some View { - BrowserView(navigator: navigator) + VStack(spacing: 0) { + urlBar + + barBorder + + Spacer() + BrowserView(navigator: navigator) + Spacer() + + barBorder + + bottomBar + } + .onReceive(navigator.$currentURL, perform: { (new) in + urlFieldContents = new.absoluteString + }) + .sheet(isPresented: $showPreferencesSheet, content: { + Text("Test") + }) + } + + private var barBorder: some View { + Rectangle() + .frame(height: 1) + .foregroundColor(Color(white: 0.75)) + } + + private var urlBar: some View { + TextField("URL", text: $urlFieldContents, onCommit: commitURL) + .keyboardType(.URL) + .textFieldStyle(RoundedBorderTextFieldStyle()) + .padding([.leading, .trailing, .bottom]) + } + + private var bottomBar: some View { + HStack { + Spacer() + + Button(action: navigator.back, label: { + Image(systemName: "arrow.left") + .font(.system(size: 24)) + }) + .disabled(navigator.backStack.isEmpty) + + Spacer() + + Button(action: navigator.forward, label: { + Image(systemName: "arrow.right") + .font(.system(size: 24)) + }) + .disabled(navigator.forwardStack.isEmpty) + + Spacer() + + Button(action: navigator.reload, label: { + Image(systemName: "arrow.clockwise") + .font(.system(size: 24)) + }) + + Spacer() + + Button(action: { + showPreferencesSheet = true + }, label: { + Image(systemName: "gear") + .font(.system(size: 24)) + }) + + Spacer() + } + .padding(.top, 4) + } + + private func commitURL() { + guard let url = URL(string: urlFieldContents) else { return } + navigator.changeURL(url) } }