Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Menu
Open sidebar
Memri
iOS client for Memri
Commits
852b1a66
Commit
852b1a66
authored
4 years ago
by
Chaitanya
Browse files
Options
Download
Email Patches
Plain Diff
WIP
parent
15b29172
Changes
12
Hide whitespace changes
Inline
Side-by-side
Showing
12 changed files
MemriApp/Assets/defaultCVU/named/onboarding.cvu
+206
-0
MemriApp/Assets/defaultCVU/named/onboarding.cvu
MemriApp/CVU/actions/CVUAction.swift
+4
-0
MemriApp/CVU/actions/CVUAction.swift
MemriApp/Controllers/SceneController.swift
+1
-0
MemriApp/Controllers/SceneController.swift
MemriApp/UI/CVUComponents/CVUElements/CVU_ActionButton.swift
+32
-31
MemriApp/UI/CVUComponents/CVUElements/CVU_ActionButton.swift
MemriApp/UI/CVUComponents/CVUElements/CVU_Button.swift
+20
-0
MemriApp/UI/CVUComponents/CVUElements/CVU_Button.swift
MemriApp/UI/CVUComponents/CVUElements/CVU_Image.swift
+2
-0
MemriApp/UI/CVUComponents/CVUElements/CVU_Image.swift
MemriApp/UI/CVUComponents/CVUElements/CVU_SubView.swift
+8
-4
MemriApp/UI/CVUComponents/CVUElements/CVU_SubView.swift
MemriApp/UI/Renderers/GridRenderer.swift
+5
-1
MemriApp/UI/Renderers/GridRenderer.swift
MemriApp/UI/Renderers/OnboardingRenderer.swift
+13
-1
MemriApp/UI/Renderers/OnboardingRenderer.swift
MemriApp/UI/SceneContentView.swift
+5
-1
MemriApp/UI/SceneContentView.swift
MemriApp/UI/SceneView.swift
+11
-1
MemriApp/UI/SceneView.swift
MemriApp/UI/ViewContextController.swift
+4
-0
MemriApp/UI/ViewContextController.swift
with
311 additions
and
39 deletions
+311
-39
MemriApp/Assets/defaultCVU/named/onboarding.cvu
0 → 100644
+
206
-
0
View file @
852b1a66
.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}}
}
}
}
}
This diff is collapsed.
Click to expand it.
MemriApp/CVU/actions/CVUAction.swift
+
4
-
0
View file @
852b1a66
...
...
@@ -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
),
...
...
This diff is collapsed.
Click to expand it.
MemriApp/Controllers/SceneController.swift
+
1
-
0
View file @
852b1a66
...
...
@@ -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
))]
}
...
...
This diff is collapsed.
Click to expand it.
MemriApp/UI/CVUComponents/CVUElements/CVU_ActionButton.swift
+
32
-
31
View file @
852b1a66
...
...
@@ -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
)
}
}
}
This diff is collapsed.
Click to expand it.
MemriApp/UI/CVUComponents/CVUElements/CVU_Button.swift
+
20
-
0
View file @
852b1a66
...
...
@@ -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
())
}
...
...
This diff is collapsed.
Click to expand it.
MemriApp/UI/CVUComponents/CVUElements/CVU_Image.swift
+
2
-
0
View file @
852b1a66
...
...
@@ -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"
)
...
...
This diff is collapsed.
Click to expand it.
MemriApp/UI/CVUComponents/CVUElements/CVU_SubView.swift
+
8
-
4
View file @
852b1a66
...
...
@@ -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
{
...
...
This diff is collapsed.
Click to expand it.
MemriApp/UI/Renderers/GridRenderer.swift
+
5
-
1
View file @
852b1a66
...
...
@@ -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
)
}
}
}
...
...
This diff is collapsed.
Click to expand it.
MemriApp/UI/Renderers/OnboardingRenderer.swift
+
13
-
1
View file @
852b1a66
...
...
@@ -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"
)
}
}
}
This diff is collapsed.
Click to expand it.
MemriApp/UI/SceneContentView.swift
+
5
-
1
View file @
852b1a66
...
...
@@ -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
{
...
...
This diff is collapsed.
Click to expand it.
MemriApp/UI/SceneView.swift
+
11
-
1
View file @
852b1a66
...
...
@@ -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
)
}
...
...
This diff is collapsed.
Click to expand it.
MemriApp/UI/ViewContextController.swift
+
4
-
0
View file @
852b1a66
...
...
@@ -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
{
...
...
This diff is collapsed.
Click to expand it.
Write
Preview
Supports
Markdown
0%
Try again
or
attach a new file
.
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment