Commit 852b1a66 authored by Chaitanya's avatar Chaitanya
Browse files

WIP

parent 15b29172
Showing with 311 additions and 39 deletions
+311 -39
.onboarding {
defaultRenderer: onboarding
showSearchBar: false
showContextualBottomBar: false
showBottomBar: false
showTopBar: false
VStack {
alignment: center
background: #F6F5F5
Text {
text: "LETS GET STARTED"
font: 12 regular
textAlign: center
color: primary
padding: 50 20 0 20
}
Text {
text: "Where do you store your contacts?"
font: 30 light
textAlign: center
color: primary
padding: 20 20 0 20
}
Text {
text: "Choose the services you use most often to connect your data to the Wallet."
font: 12 semibold
textAlign: left
color: primary
padding: 20 20 0 20
}
Text {
text: "By importing your data to your wallet you take a first step to protect your privacy."
font: 12 semibold
textAlign: left
color: primary
padding: 10 20 0 20
}
SubView {
id: importerGrid
minHeight: 100
padding: 10 10 10 10
maxWidth: 300
view {
viewName: Importer
defaultRenderer: grid
background: #F6F5F5
editMode: true
[datasource = pod] {
query: "Importer"
sortProperty: dateModified
sortAscending: false
}
}
}
ActionButton {
systemName: "arrow.forward.circle.fill"
resizable: true
sizingMode: fit
padding: 0 0 50 0
color: #000000
maxWidth: 50
maxHeight: 50
onPress: openView {
viewName: "onboarding-progress"
items: {{importerGrid.selected}}
}
}
}
}
.onboarding-progress {
defaultRenderer: onboarding
showSearchBar: false
showContextualBottomBar: false
showBottomBar: false
showTopBar: false
VStack {
Subview {
}
VStack {
ForEach {
items: {{.items}}
ProgresssBar {
}
}
}
}
}
.onboarding-login {
defaultRenderer: onboarding
showSearchBar: false
showContextualBottomBar: false
showBottomBar: false
showTopBar: false
VStack {
alignment: center
background: #F6F5F5
Text {
text: "STEP 1"
font: 12 regular
textAlign: center
color: primary
padding: 50 20 0 20
}
Text {
text: "Connect Facebook"
font: 30 light
textAlign: center
color: primary
padding: 20 20 0 20
}
Image {
systemName: "applelogo"
resizable: true
sizingMode: fit
padding: 0 0 50 0
color: #000000
maxWidth: 20
maxHeight: 20
}
VStack {
margin: 0 20 0 20
alignment: leading
Text {
text: "Please provide your login and password to connect your facebook account."
font: 12 semibold
textAlign: left
color: primary
}
Text {
padding: 20 0 0 0
text: "Facebook login"
font: 12 semibold
textAlign: left
color: primary
}
Textfield {
hint: Street,
rows: 1
minHeight: 50
background: #ff0000
border: #DDD 1
}
Text {
padding: 20 0 0 0
text: "Password"
font: 12 semibold
textAlign: left
color: primary
}
Textfield {
hint: Street,
rows: 1
minHeight: 50
background: #ffFFFF
border: #DDD 1
}
}
ActionButton {
margin: 100 0 0 0
title: "LOGIN TO FACEBOOK"
systemName: "arrow.forward.circle.fill"
resizable: true
sizingMode: fit
padding: 0 0 50 0
color: #000000
maxWidth: 50
maxHeight: 50
onPress: openView {
viewName: "onboarding-login"
uids: {{.selected}}
}
}
}
}
......@@ -183,8 +183,12 @@ struct CVUAction_OpenView: CVUAction {
} else {
viewArguments = CVUViewArguments()
}
let db = sceneController.appController.databaseController
let resolver = CVUPropertyResolver(context: context, lookup: CVULookupController(), db: db, properties: vars)
let items: [ItemRecord] = resolver.items("uids")
sceneController.contextPaneVisible = false
sceneController.navigateToNewContext(viewName: viewName ?? resolver.string("viewName") ?? "customView",
inheritDatasource: resolver.bool("inheritDatasource", defaultValue: true),
......
......@@ -32,6 +32,7 @@ class SceneController: ObservableObject {
let config = ViewContext(viewName: "onboarding", rendererName: "onboarding", query: DatabaseQueryConfig())
let holder = ViewContextHolder(config)
let context = makeContext(forConfig: holder)
topMostContext = context
navigationController.viewControllers = [UIHostingController(rootView: SceneContentView(context: context))]
}
......
......@@ -13,34 +13,32 @@ struct CVU_ActionButton: View {
var nodeResolver: CVUUINodeResolver
@EnvironmentObject var sceneController: SceneController
var action: CVUAction? {
var action: CVUAction_OpenViewByName? {
guard let action = self.nodeResolver.propertyResolver.action(key: "onPress") else { return nil }
return action
return action as? CVUAction_OpenViewByName
}
func onPress() {
guard let actions = self.nodeResolver.propertyResolver.actions(key: "onPress") else { return }
for action in actions {
action.execute(sceneController: sceneController, context: nodeResolver.context)
}
var title: String? {
return action?.getString("title", nodeResolver.context, sceneController.topMostContext)
}
var title: String {
guard let action = self.action as? CVUAction_OpenViewByName,
let titleVal = action.vars["title"],
case let .constant(.string(title)) = titleVal else {
return ""
var image: UIImage? {
if let bundleImage = nodeResolver.propertyResolver.string("bundleImage") {
return UIImage(named: bundleImage)
}
else if let systemImage = nodeResolver.propertyResolver.string("systemName") {
return UIImage(systemName: systemImage)
}
return title
return nil
}
var viewArguments: CVUViewArguments? {
guard let action = self.action as? CVUAction_OpenViewByName,
let argsValue = action.vars["viewArguments"],
guard let argsValue = self.action?.vars["viewArguments"],
case let .subdefinition(args) = argsValue,
let currentItem = nodeResolver.context.currentItem else {
let currentItem = nodeResolver.context.currentItem
else {
return nil
}
......@@ -53,31 +51,34 @@ struct CVU_ActionButton: View {
@State var isShowing = false
var body: some View {
if let validAction = self.action as? CVUAction_OpenViewByName {
if let validAction = self.action {
Button(action: {
self.isShowing = true
}) {
Text(title)
.font(.subheadline)
.foregroundColor(.black)
if let title = self.title {
Text(title)
.font(.subheadline)
.foregroundColor(.black)
}
if let image = image {
Image(uiImage: image)
.renderingMode(.template)
.if(nodeResolver.propertyResolver.bool("resizable", defaultValue: false)) { $0.resizable() }
.if(nodeResolver.propertyResolver.sizingMode() == .fit) { $0.aspectRatio(contentMode: .fit) }
.font(nodeResolver.propertyResolver.font().font)
.foregroundColor(nodeResolver.propertyResolver.color()?.color ?? Color.blue)
}
}
.sheet(isPresented: $isShowing) {
if let viewContext = validAction.getViewContext(context: CVUContext(currentItem:nodeResolver.context.currentItem, viewName: validAction.viewName, rendererName: validAction.renderer, viewArguments: viewArguments)) {
if let viewContext = validAction.getViewContext(context: CVUContext(currentItem: nodeResolver.context.currentItem, viewName: validAction.viewName, rendererName: validAction.renderer, viewArguments: viewArguments)) {
BrowserView(context: viewContext)
} else {
Text("TODO: ActionPopupButton")
}
}
} else if let starAction = self.action as? CVUAction_Star {
Button(action: {
withAnimation {
starAction.execute(sceneController: sceneController, context: nodeResolver.context)
}
}) {
Image(systemName: (nodeResolver.context.currentItem?.propertyValue("starred")?.asBool() ?? false) == true ? "star.fill" : "star")
}
} else {
Text("TODO: CVU_ActionButton")
} else {
CVU_Button(nodeResolver: nodeResolver)
}
}
}
......@@ -17,9 +17,29 @@ struct CVU_Button: View {
}
}
var image: UIImage? {
if let bundleImage = nodeResolver.propertyResolver.string("bundleImage") {
return UIImage(named: bundleImage)
}
else if let systemImage = nodeResolver.propertyResolver.string("systemName") {
return UIImage(systemName: systemImage)
}
return nil
}
var body: some View {
Button(action: onPress) {
self.nodeResolver.childrenInForEach()
if let image = image {
Image(uiImage: image)
.renderingMode(.template)
.if(nodeResolver.propertyResolver.bool("resizable", defaultValue: false)) { $0.resizable() }
.if(nodeResolver.propertyResolver.sizingMode() == .fit) { $0.aspectRatio(contentMode: .fit) }
.font(nodeResolver.propertyResolver.font().font)
.foregroundColor(nodeResolver.propertyResolver.color()?.color ?? Color.blue)
}
}
.buttonStyle(Style())
}
......
......@@ -49,6 +49,8 @@ struct CVU_Image: View {
.renderingMode(.template)
.if(nodeResolver.propertyResolver.bool("resizable", defaultValue: false)) { $0.resizable() }
.if(nodeResolver.propertyResolver.sizingMode() == .fit) { $0.aspectRatio(contentMode: .fit) }
.font(nodeResolver.propertyResolver.font().font)
.frame(maxWidth: .infinity, maxHeight: .infinity)
}
else {
Image(systemName: "questionmark")
......
......@@ -82,11 +82,15 @@ struct CVU_SubView: View {
@ViewBuilder
var renderer: some View {
if let context = viewContext {
SceneContentView(context: context).renderer
} else {
Text("No renderer selected").bold().frame(maxWidth: .infinity, maxHeight: .infinity)
VStack {
if let context = viewContext {
SceneContentView(context: context).renderer
} else {
Text("No renderer selected").bold().frame(maxWidth: .infinity, maxHeight: .infinity)
}
}
.padding(nodeResolver.propertyResolver.padding)
.frame(maxWidth: nodeResolver.propertyResolver.maxWidth ?? .infinity, maxHeight: nodeResolver.propertyResolver.maxHeight ?? .infinity)
}
var body: some View {
......
......@@ -20,7 +20,7 @@ struct GridRendererView: View {
}
var backgroundColor: CVUColor {
viewContext.rendererDefinitionPropertyResolver.backgroundColor ?? CVUColor.system(.systemBackground)
viewContext.rendererDefinitionPropertyResolver.backgroundColor ?? viewContext.viewDefinitionPropertyResolver.backgroundColor ?? CVUColor.system(.systemBackground)
}
var isInEditMode: Bool {
......@@ -92,6 +92,10 @@ struct GridRendererView: View {
.padding(.top, 40)
Spacer()
}
if let footerDefinition = viewContext.viewDefinitionPropertyResolver.properties["footer"]?.getSubdefinition() {
viewContext.render(nodeDefinition: footerDefinition)
}
}
}
......
......@@ -14,7 +14,19 @@ struct OnboardingRendererView: View {
@EnvironmentObject var sceneController: SceneController
@ObservedObject var viewContext: ViewContextController
var nodeDefinition: CVUDefinitionContent? {
guard let viewName = viewContext.config.viewName else {
return nil
}
return viewContext.cvuController.viewDefinitionFor(viewName: viewName)
}
var body: some View {
Text("Onboarding some view")
if let nodeDefinition = self.nodeDefinition {
viewContext.render(nodeDefinition: nodeDefinition)
} else {
Text("No onboarding view defined")
}
}
}
......@@ -58,10 +58,14 @@ struct SceneContentView: View {
return context.viewDefinitionPropertyResolver.bool("showBottomBar") ?? true
}
var showSearchBar: Bool {
return context.viewDefinitionPropertyResolver.bool("showSearchBar") ?? true
}
var body: some View {
VStack(spacing: 0) {
renderer
if searchBarOpen {
if showSearchBar && searchBarOpen {
SearchView(context: context, isActive: $searchBarOpen)
} else {
......
......@@ -15,11 +15,21 @@ struct SceneView: View {
@GestureState var filterPanelGestureOffset: CGFloat = .zero
@GestureState var contextPaneGestureOffset: CGFloat = .zero
var showTopBar: Bool {
guard let context = sceneController.topMostContext else {
return true
}
return context.viewDefinitionPropertyResolver.bool("showTopBar") ?? true
}
var body: some View {
NavigationWrapperView(sceneController: sceneController) {
ZStack(alignment: .bottom) {
VStack(spacing: 0) {
TopBarView(sceneController: sceneController)
if (showTopBar) {
TopBarView(sceneController: sceneController)
}
NavigationHolder(controller: sceneController.navigationController)
.edgesIgnoringSafeArea(.bottom)
}
......
......@@ -80,6 +80,10 @@ class ViewContextController: ObservableObject {
isObservingQuery = false
}
func render(nodeDefinition: CVUDefinitionContent) -> some View {
return cvuController.render(cvuContext: getCVUContext(), nodeDefinition: nodeDefinition, lookup: lookupController, db: databaseController, blankIfNoDefinition: false)
}
/// Return a SwiftUI view for the given item based on it's CVU definition.
/// Set `overrideRenderer` if you want to render the item as though it is in a different renderer to the context (eg. "list" to get the list-specific appearance)
func render(item: ItemRecord, nodeDefinition: CVUDefinitionContent? = nil, viewArguments: CVUViewArguments? = nil, overrideRenderer: String? = nil, blankIfNoDefinition: Bool = false) -> some View {
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment