
The commit updates the help view in the llama.swiftui example to use a NavigationView and a Done button to dismiss the help view. The motivation for this is that without this change there is now way to dimiss the help view.
156 lines
5.2 KiB
Swift
156 lines
5.2 KiB
Swift
import SwiftUI
|
|
|
|
struct ContentView: View {
|
|
@StateObject var llamaState = LlamaState()
|
|
@State private var multiLineText = ""
|
|
@State private var showingHelp = false // To track if Help Sheet should be shown
|
|
|
|
var body: some View {
|
|
NavigationView {
|
|
VStack {
|
|
ScrollView(.vertical, showsIndicators: true) {
|
|
Text(llamaState.messageLog)
|
|
.font(.system(size: 12))
|
|
.frame(maxWidth: .infinity, alignment: .leading)
|
|
.padding()
|
|
.onTapGesture {
|
|
UIApplication.shared.sendAction(#selector(UIResponder.resignFirstResponder), to: nil, from: nil, for: nil)
|
|
}
|
|
}
|
|
|
|
TextEditor(text: $multiLineText)
|
|
.frame(height: 80)
|
|
.padding()
|
|
.border(Color.gray, width: 0.5)
|
|
|
|
HStack {
|
|
Button("Send") {
|
|
sendText()
|
|
}
|
|
|
|
Button("Bench") {
|
|
bench()
|
|
}
|
|
|
|
Button("Clear") {
|
|
clear()
|
|
}
|
|
|
|
Button("Copy") {
|
|
UIPasteboard.general.string = llamaState.messageLog
|
|
}
|
|
}
|
|
.buttonStyle(.bordered)
|
|
.padding()
|
|
|
|
NavigationLink(destination: DrawerView(llamaState: llamaState)) {
|
|
Text("View Models")
|
|
}
|
|
.padding()
|
|
|
|
}
|
|
.padding()
|
|
.navigationBarTitle("Model Settings", displayMode: .inline)
|
|
|
|
}
|
|
}
|
|
|
|
func sendText() {
|
|
Task {
|
|
await llamaState.complete(text: multiLineText)
|
|
multiLineText = ""
|
|
}
|
|
}
|
|
|
|
func bench() {
|
|
Task {
|
|
await llamaState.bench()
|
|
}
|
|
}
|
|
|
|
func clear() {
|
|
Task {
|
|
await llamaState.clear()
|
|
}
|
|
}
|
|
struct DrawerView: View {
|
|
|
|
@ObservedObject var llamaState: LlamaState
|
|
@State private var showingHelp = false
|
|
func delete(at offsets: IndexSet) {
|
|
offsets.forEach { offset in
|
|
let model = llamaState.downloadedModels[offset]
|
|
let fileURL = getDocumentsDirectory().appendingPathComponent(model.filename)
|
|
do {
|
|
try FileManager.default.removeItem(at: fileURL)
|
|
} catch {
|
|
print("Error deleting file: \(error)")
|
|
}
|
|
}
|
|
|
|
// Remove models from downloadedModels array
|
|
llamaState.downloadedModels.remove(atOffsets: offsets)
|
|
}
|
|
|
|
func getDocumentsDirectory() -> URL {
|
|
let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask)
|
|
return paths[0]
|
|
}
|
|
var body: some View {
|
|
List {
|
|
Section(header: Text("Download Models From Hugging Face")) {
|
|
HStack {
|
|
InputButton(llamaState: llamaState)
|
|
}
|
|
}
|
|
Section(header: Text("Downloaded Models")) {
|
|
ForEach(llamaState.downloadedModels) { model in
|
|
DownloadButton(llamaState: llamaState, modelName: model.name, modelUrl: model.url, filename: model.filename)
|
|
}
|
|
.onDelete(perform: delete)
|
|
}
|
|
Section(header: Text("Default Models")) {
|
|
ForEach(llamaState.undownloadedModels) { model in
|
|
DownloadButton(llamaState: llamaState, modelName: model.name, modelUrl: model.url, filename: model.filename)
|
|
}
|
|
}
|
|
|
|
}
|
|
.listStyle(GroupedListStyle())
|
|
.navigationBarTitle("Model Settings", displayMode: .inline).toolbar {
|
|
ToolbarItem(placement: .navigationBarTrailing) {
|
|
Button("Help") {
|
|
showingHelp = true
|
|
}
|
|
}
|
|
}.sheet(isPresented: $showingHelp) { // Sheet for help modal
|
|
NavigationView {
|
|
VStack(alignment: .leading) {
|
|
VStack(alignment: .leading) {
|
|
Text("1. Make sure the model is in GGUF Format")
|
|
.padding()
|
|
Text("2. Copy the download link of the quantized model")
|
|
.padding()
|
|
}
|
|
Spacer()
|
|
}
|
|
.navigationTitle("Help")
|
|
.navigationBarTitleDisplayMode(.inline)
|
|
.toolbar {
|
|
ToolbarItem(placement: .navigationBarTrailing) {
|
|
Button("Done") {
|
|
showingHelp = false
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
struct ContentView_Previews: PreviewProvider {
|
|
static var previews: some View {
|
|
ContentView()
|
|
}
|
|
}
|