Skip to content

Commit

Permalink
Carousel works, scrolling once
Browse files Browse the repository at this point in the history
  • Loading branch information
Release-Candidate committed Apr 18, 2021
1 parent a810287 commit e7d14f2
Show file tree
Hide file tree
Showing 5 changed files with 112 additions and 96 deletions.
3 changes: 3 additions & 0 deletions Tzolkin.sln
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ Project("{F2A71F9B-5D33-465A-A702-920D77279786}") = "Tzolkin.iOS", "src\Tzolkin.
EndProjectSection
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "TestTzolkin", "tests\TestTzolkin\TestTzolkin.fsproj", "{CE7FBF66-014F-484E-9A1F-4C101C688708}"
ProjectSection(ProjectDependencies) = postProject
{6EE96C5C-3777-4E75-A69D-298668A430E1} = {6EE96C5C-3777-4E75-A69D-298668A430E1}
EndProjectSection
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "TzolkinDate", "src\TzolkinDate\TzolkinDate.fsproj", "{88DACF37-9259-4CAB-A3F7-5761CB35906E}"
EndProject
Expand Down
25 changes: 12 additions & 13 deletions src/Tzolkin/DateList.fs
Original file line number Diff line number Diff line change
Expand Up @@ -203,14 +203,8 @@ module DateList =
let tzolkinFilter (model: Model) dispatch =
getDateOrder model dispatch

let dateViewLayout = GridItemsLayout (ItemsLayoutOrientation.Vertical)


///
let dateView model dispatch =
dateViewLayout.Span <- 1
dateViewLayout.HorizontalItemSpacing <- 10.
dateViewLayout.VerticalItemSpacing <- 10.
View.StackLayout(
backgroundColor = backgroundBrown,
padding = Thickness 5.,
Expand All @@ -223,13 +217,18 @@ module DateList =
(tzolkinFilter model dispatch)
)

View.CollectionView(
ref = dateListView,
remainingItemsThreshold = 10,
remainingItemsThresholdReachedCommand = (
fun () -> dispatch NewDateViewItemsNeeded),
itemsLayout = dateViewLayout,
items = fillListViewFilter model
View.CarouselView(
ref = dateListView,
loop = false,
itemsLayout = View.CarouselVerticalItemsLayout (
itemSpacing = 0.0,
snapPointsType = SnapPointsType.Mandatory
),
//peekAreaInsets = Thickness (carouselHeight model /
// (setDateCarouselFactors model.IsLandscape)),
items = fillListViewFilter model
//positionChanged = (fun args -> dispatch <| FilterCarouselChanged args),
// position = 20
)
]
)
165 changes: 87 additions & 78 deletions src/Tzolkin/Definitions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -66,7 +66,7 @@ module Definitions =

/// The MVU model.
type Model =
{ DateList: list<DateTime>
{ DateList: DateTime list
Date: DateTime
ListDate: DateTime
ListTzolkinNumber: TzolkinNumber.T option
Expand All @@ -78,20 +78,20 @@ module Definitions =
ShowSystemAppInfo: bool
DateViewScrollDir: float }

let modelTzolkinDate model =
match model.ListTzolkinNumber, model.ListTzolkinGlyph with
| None, Some tz ->
{ TzolkinDate.Number = TzolkinNumber.T.TzolkinNumber 1
TzolkinDate.Glyph = tz }
| Some tz, None ->
{ TzolkinDate.Number = tz
TzolkinDate.Glyph = TzolkinGlyph.T.TzolkinGlyph 1 }
| Some tzn, Some tzg ->
{ TzolkinDate.Number = tzn
TzolkinDate.Glyph = tzg }
| _, _ ->
{ TzolkinDate.Number = TzolkinNumber.T.TzolkinNumber 1
TzolkinDate.Glyph = TzolkinGlyph.T.TzolkinGlyph 1 }
//let modelTzolkinDate model =
// match model.ListTzolkinNumber, model.ListTzolkinGlyph with
// | None, Some tz ->
// { TzolkinDate.Number = TzolkinNumber.T.TzolkinNumber 1
// TzolkinDate.Glyph = tz }
// | Some tz, None ->
// { TzolkinDate.Number = tz
// TzolkinDate.Glyph = TzolkinGlyph.T.TzolkinGlyph 1 }
// | Some tzn, Some tzg ->
// { TzolkinDate.Number = tzn
// TzolkinDate.Glyph = tzg }
// | _, _ ->
// { TzolkinDate.Number = TzolkinNumber.T.TzolkinNumber 1
// TzolkinDate.Glyph = TzolkinGlyph.T.TzolkinGlyph 1 }

let modelNumToInt model =
match model.ListTzolkinNumber with
Expand Down Expand Up @@ -137,14 +137,14 @@ module Definitions =
| SetOrientation of float * float
| ShowSystemAppInfo of bool
| CarouselChanged of PositionChangedEventArgs
| FilterCarouselChanged of PositionChangedEventArgs
| OpenURL of string
| HasScrolled of ItemsViewScrolledEventArgs
| NewDateViewItemsNeeded
| FilterCarouselHeight


// Widget references ===========================================================================
/// Instances of widgets needed to interact with.
let dateListView = ViewRef<CollectionView> ()
let dateListView = ViewRef<CustomCarouselView> () //ViewRef<CollectionView> ()
let dayPicker = ViewRef<Xamarin.Forms.Picker> ()
let monthPicker = ViewRef<Xamarin.Forms.Picker> ()
let yearPicker = ViewRef<Xamarin.Forms.Entry> ()
Expand All @@ -156,12 +156,13 @@ module Definitions =
|> Async.StartImmediate
Cmd.none

let cmdCollectionView =
let cmdDateListViewHeight =
Cmd.ofSub (fun dispatch ->
match dateListView.TryValue with
| None -> ()
| Some reference -> reference.Scrolled.Add (fun args -> dispatch <| HasScrolled args)
)
| Some reference -> reference.SizeChanged.Add (fun args ->
dispatch FilterCarouselHeight)
)

// Widget related ==============================================================================

Expand Down Expand Up @@ -253,7 +254,8 @@ module Definitions =
| None -> ()
| Some textEntry -> textEntry.Text <- ""


let setDateCarouselFactors isL =
if isL then 2.35 else 2.15

// Update ======================================================================================

Expand All @@ -267,8 +269,8 @@ module Definitions =
ListDate = model.Date
ListTzolkinGlyph = Some tzolkin.Glyph
ListTzolkinNumber = Some tzolkin.Number
DateList = dateListTzolkin 20 tzolkin model.Date },
cmdCollectionView
DateList = dateListTzolkin 50 tzolkin model.Date },
cmdDateListViewHeight

| SetDate date -> { model with
Date = date
Expand All @@ -277,61 +279,61 @@ module Definitions =
| SetListNumber newNum ->
match newNum, model.ListTzolkinGlyph with
| 0, None -> { model with ListTzolkinNumber = None
DateList = [ for i in [-20 .. 20] ->
DateList = [ for i in [-50 .. 50] ->
model.Date + TimeSpan.FromDays (float i)] },
Cmd.none

| _, None ->
{ model with
ListTzolkinNumber = Some <| TzolkinNumber.T.TzolkinNumber newNum
DateList = numListTzolkin
20
50
(TzolkinNumber.T.TzolkinNumber newNum)
model.Date },
Cmd.none

| 0, Some glyph ->
{ model with
ListTzolkinNumber = None
DateList = glyphListTzolkin 20 glyph model.Date },
DateList = glyphListTzolkin 50 glyph model.Date },
Cmd.none

| _, Some glyph ->
{ model with
ListTzolkinNumber = Some <| TzolkinNumber.T.TzolkinNumber newNum
DateList = dateListTzolkin
20
50
(TzolkinDate.create (TzolkinNumber.T.TzolkinNumber newNum) glyph)
model.Date },
Cmd.none

| SetListGlyph newGlyph ->
match newGlyph, model.ListTzolkinNumber with
| 0, None -> { model with ListTzolkinGlyph = None
DateList = [ for i in [-20 .. 20] ->
DateList = [ for i in [-50 .. 50] ->
model.Date + TimeSpan.FromDays (float i)] },
Cmd.none

| _, None ->
{ model with
ListTzolkinGlyph = Some <| TzolkinGlyph.T.TzolkinGlyph newGlyph
DateList = glyphListTzolkin
20
50
(TzolkinGlyph.T.TzolkinGlyph newGlyph)
model.Date },
Cmd.none

| 0, Some number ->
{ model with
ListTzolkinGlyph = None
DateList = numListTzolkin 20 number model.Date },
DateList = numListTzolkin 50 number model.Date },
Cmd.none

| _, Some number ->
{ model with
ListTzolkinGlyph = Some <| TzolkinGlyph.T.TzolkinGlyph newGlyph
DateList = dateListTzolkin
20
50
(TzolkinDate.create number (TzolkinGlyph.T.TzolkinGlyph newGlyph))
model.Date },
Cmd.none
Expand Down Expand Up @@ -396,55 +398,62 @@ module Definitions =

| OpenURL url -> model, cmdOpenUrl url

| HasScrolled arg ->
{ model with DateViewScrollDir = if arg.VerticalDelta > 0. then 1. else -1. }, Cmd.none
//| HasScrolled arg ->
// { model with DateViewScrollDir = if arg.VerticalDelta > 0. then 1. else -1. }, Cmd.none

| NewDateViewItemsNeeded ->
//let oldListDate = model.ListDate
//let newDate = oldListDate + TimeSpan.FromDays (260. * model.DateViewScrollDir * 20.)
| FilterCarouselChanged args ->
let dir = if args.CurrentPosition - args.PreviousPosition > 0 then 1 else -1
let oldListDate = model.ListDate
let newDate = oldListDate + TimeSpan.FromDays (260. * model.DateViewScrollDir * 20.)
//Trace.TraceInformation (sprintf "XXXX NEED MORE!!! XX %s new: %s"
// (oldListDate.ToLongDateString ())
// (newDate.ToString ())
// )
//match model.ListTzolkinGlyph, model.ListTzolkinNumber with
//| None, None ->
// { model with
// ListDate = oldListDate + TimeSpan.FromDays (model.DateViewScrollDir * 20.)
// DateList = [ for i in [-20 .. 20] ->
// oldListDate + TimeSpan.FromDays (
// model.DateViewScrollDir * 20. + float i)] },
// Cmd.none

//| Some glyph, None ->
// { model with
// ListDate = oldListDate + TimeSpan.FromDays (20. * model.DateViewScrollDir * 20.)
// DateList = glyphListTzolkin
// 20
// glyph
// (oldListDate + TimeSpan.FromDays (
// 20. * model.DateViewScrollDir * 20.) ) },
// Cmd.none

//| None, Some number ->
// { model with
// ListDate = oldListDate + TimeSpan.FromDays (13. * model.DateViewScrollDir * 20.)
// DateList = numListTzolkin
// 20
// number
// (oldListDate + TimeSpan.FromDays (
// 13. * model.DateViewScrollDir * 20.) ) },
// Cmd.none


//| Some glyph, Some number ->
// { model with
// ListDate = oldListDate + TimeSpan.FromDays (260. * model.DateViewScrollDir * 20.)
// DateList = dateListTzolkin
// 20
// (TzolkinDate.create number glyph)
// (oldListDate + TimeSpan.FromDays (
// 260. * model.DateViewScrollDir * 20.) ) },
// Cmd.none

model, Cmd.none
match model.ListTzolkinGlyph, model.ListTzolkinNumber with
| None, None ->
{ model with
ListDate = oldListDate + TimeSpan.FromDays (float dir)
DateList = [ for i in [-50 .. 50] ->
oldListDate + TimeSpan.FromDays (float (dir + i) )] },
Cmd.none

| Some glyph, None ->
{ model with
ListDate = oldListDate + TimeSpan.FromDays (20. * (float dir))
DateList = glyphListTzolkin
50
glyph
(oldListDate + TimeSpan.FromDays (20. * (float dir) ) ) },
Cmd.none

| None, Some number ->
{ model with
ListDate = oldListDate + TimeSpan.FromDays (13. * (float dir))
DateList = numListTzolkin
50
number
(oldListDate + TimeSpan.FromDays (13. * (float dir) ) ) },
Cmd.none


| Some glyph, Some number ->
{ model with
ListDate = oldListDate + TimeSpan.FromDays (260. * (float dir))
DateList = dateListTzolkin
50
(TzolkinDate.create number glyph)
(oldListDate + TimeSpan.FromDays (260. * (float dir) ) ) },
Cmd.none

//model, Cmd.none

| FilterCarouselHeight ->
match dateListView.TryValue with
| None -> model, Cmd.none
| Some carousel ->
//Trace.TraceInformation (sprintf "height + scrollto: %f" (carousel.Height) )
carousel.PeekAreaInsets <- Thickness (carousel.Height /
(setDateCarouselFactors model.IsLandscape))
carousel.ScrollTo (index = 50, position = ScrollToPosition.MakeVisible, animate = true)
model, Cmd.none

7 changes: 6 additions & 1 deletion src/Tzolkin/Style.fs
Original file line number Diff line number Diff line change
Expand Up @@ -65,11 +65,16 @@ module Style =
else
StackOrientation.Horizontal



let setDateHeightCarouselFactors isL =
if isL then 2.35 * 0.275 else 2.15 * 0.347

// Pages ===================================================================

let tabBackgroundColor = backgroundBrownDark

let tabForegroundColor = Color.Black //Color.FromHex "#8B2A02"
let tabForegroundColor = Color.Black

// Glyph Descriptions ======================================================

Expand Down
8 changes: 4 additions & 4 deletions src/Tzolkin/Tzolkin.fs
Original file line number Diff line number Diff line change
Expand Up @@ -44,10 +44,10 @@ module TzolkinApp =
//Application.Current.RequestedThemeChanged.Add (fun args ->
// dispatch (Msg.SetAppTheme args.RequestedTheme))

//Application.Current.RequestedThemeChanged.AddHandler (
// EventHandler<AppThemeChangedEventArgs>
// (fun _ args -> dispatch (Msg.SetAppTheme args.RequestedTheme))
//)
//Application.Current.RequestedThemeChanged.AddHandler (
// EventHandler<AppThemeChangedEventArgs>
// (fun _ args -> dispatch (Msg.SetAppTheme args.RequestedTheme))
//)

let runner =
program
Expand Down

0 comments on commit e7d14f2

Please sign in to comment.