From 9512df0be0b53f86b0ad435929236ede5dd7ee52 Mon Sep 17 00:00:00 2001 From: Matt Mascarenhas Date: Mon, 12 Apr 2021 17:56:30 +0100 Subject: [PATCH] cinera_search_pre.js: Default to the List View MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Also fix the 𝑛-ary Grid traversal PrevAscends case when the search page contains only one project at the top-level. --- cinera/cinera.c | 4 +- cinera/cinera_search_pre.js | 169 ++++++++++++++++++++++-------------- 2 files changed, 105 insertions(+), 68 deletions(-) diff --git a/cinera/cinera.c b/cinera/cinera.c index 805e7db..e803aa2 100644 --- a/cinera/cinera.c +++ b/cinera/cinera.c @@ -23,7 +23,7 @@ typedef struct version CINERA_APP_VERSION = { .Major = 0, .Minor = 8, - .Patch = 10 + .Patch = 11 }; #include // NOTE(matt): varargs @@ -13308,7 +13308,7 @@ SearchToBuffer(buffers *CollationBuffers, db_header_project *StoredP, project *P OpenNodeNewLine(B, &IndentationLevel, NODE_DIV, 0); AppendStringToBuffer(B, Wrap0(" class=\"cineraMenuItem view\">")); - AppendStringToBuffer(B, Wrap0("View: Grid")); + AppendStringToBuffer(B, Wrap0("View: List")); CloseNode(B, &IndentationLevel, NODE_DIV); OpenNodeNewLine(B, &IndentationLevel, NODE_DIV, 0); diff --git a/cinera/cinera_search_pre.js b/cinera/cinera_search_pre.js index 5cb3162..4eba9b1 100644 --- a/cinera/cinera_search_pre.js +++ b/cinera/cinera_search_pre.js @@ -673,7 +673,7 @@ var Nav = { GridRowGap: null, SortChronological: true, - ViewType: view_type.GRID, + ViewType: view_type.LIST, List: null, Grid: null, @@ -921,6 +921,25 @@ InitHelpKeys(HelpDocumentation) Nav.Controls.HelpKeys = Paragraph.querySelectorAll(".help_key"); } +function +InitView() +{ + // NOTE(matt): Nav.ViewType is initialised to view_type.LIST and InitNexus() leaves the List View visible + if(!StateBitIsSet(state_bit.VIEW_LIST)) + { + if(GridSizeIsSupported(Nav.GridSize)) + { + PickGridView(); + } + else + { + // NOTE(matt): Silently swap the state bits, leaving the default List View visible + ClearStateBit(state_bit.VIEW_GRID); + SetStateBit(state_bit.VIEW_LIST); + } + } +} + function SyncNavState() { @@ -931,31 +950,27 @@ SyncNavState() { if(StateBitIsSet(state_bit.DISABLE_ANIMATIONS)) { ToggleAnimations(); } if(StateBitIsSet(state_bit.SORT_REVERSED)) { Sort(true); } - - // Nav.ViewType is initialised to view_type.GRID, so we needn't do anything if the Nav.State is also on Grid - if(StateBitIsSet(state_bit.VIEW_LIST) || !GridSizeIsSupported(Nav.GridSize)) - { - ToggleView(); - } + InitView(); } else { Nav.Controls.Save.textContent = "Save Settings: ✘"; - // Nav.ViewType was initialised to view_type.GRID - if(!GridSizeIsSupported(Nav.GridSize)) + // Nav.ViewType was initialised to view_type.LIST + if(Nav.ViewType == view_type.GRID && GridSizeIsSupported(Nav.GridSize)) { - ToggleView(); + PickGridView(); } } } else { Nav.State = 0; - SetStateBit(state_bit.VIEW_GRID); // NOTE(matt): Nav.ViewType was initialised to view_type.GRID - if(!GridSizeIsSupported(Nav.GridSize)) + switch(Nav.ViewType) { - ToggleView(); + case view_type.LIST: SetStateBit(state_bit.VIEW_LIST); break + case view_type.GRID: SetStateBit(state_bit.VIEW_GRID); break } + InitView(); } } @@ -976,7 +991,11 @@ InitTraversalStack() if(Projects.length === 1) { // NOTE(matt): Automatically descend into the lone project - Level.Projects = Projects[0].querySelectorAll(":scope > .cineraIndexProject"); + var QueriedProjects = Projects[0].querySelectorAll(":scope > .cineraIndexProject"); + if(QueriedProjects.length > 0) + { + Level.Projects = QueriedProjects; + } Level.Entries = Projects[0].querySelectorAll(":scope > .cineraIndexEntries > div"); } else @@ -2861,13 +2880,18 @@ InitNexus() // NOTE(matt): We ResetButtonsContainerClone() anyway, but without cycling this classList Safari seems to do transitions // based on the wrong size grid + Nav.GridContainer.classList.add("hidden"); ResetButtonsContainerClone(); - Nav.GridContainer.classList.remove("hidden"); + + switch(Nav.ViewType) + { + case view_type.LIST: { Nav.List.classList.remove("hidden"); ScrollCondition = false; } break; + case view_type.GRID: { Nav.Grid.classList.remove("hidden"); ScrollCondition = true; } break; + } Nav.Nexus.classList.add("anim"); - ScrollCondition = true; // NOTE(matt): Variable in cinera_pre.js, we init with the Grid which is the view we want to auto-scroll if(CineraProps.IsMobile) { CineraProps.Orientation = GetRealOrientation(orientations.LANDSCAPE_LEFT, CineraProps.IsMobile); @@ -3412,76 +3436,89 @@ ScrollToWithOffset(Element, Offset) } function -ToggleView() +PickGridView() { - // NOTE(matt): While we only have two views, a toggle will suffice - clearTimeout(ScrollerFunction); - ScrollTicking = false; - if(Nav.ViewType == view_type.GRID) + if(GridSizeIsSupported(Nav.GridSize)) { - Nav.Controls.View.textContent = "View: List"; - Nav.ViewType = view_type.LIST; + Nav.Controls.View.textContent = "View: 𝑛-ary Grid"; + Nav.ViewType = view_type.GRID; if(MaintainingState()) { - ClearStateBit(state_bit.VIEW_GRID); - SetStateBit(state_bit.VIEW_LIST); + ClearStateBit(state_bit.VIEW_LIST); + SetStateBit(state_bit.VIEW_GRID); } if(!IsQuery()) { - Nav.List.classList.remove("hidden"); - Nav.GridContainer.classList.add("hidden"); - var LevelBundle = GetTraversalLevelBundle(); - if(LevelBundle.Generation > 1) + var TargetLevel = ComputeTargetLevelForViewport(); + EmptyTraversalStack(); + if(TargetLevel.Projects || TargetLevel.Entries) { - var Element; - if(LevelBundle.This.Entries !== null) - { - Element = GetScrollToElement(LevelBundle.This.Entries, Nav.SortChronological ? LevelBundle.This.HeadIndex : LevelBundle.This.TailIndex); - } - else if(LevelBundle.This.Projects !== null) - { - Element = GetScrollToElement(LevelBundle.This.Projects, Nav.SortChronological ? LevelBundle.This.HeadIndex : LevelBundle.This.TailIndex); - } - ScrollToWithOffset(Element, Nav.Controls.Header.offsetHeight); + var ProjectsStack = BuildProjectsStack(TargetLevel); + DeriveTraversalStack(ProjectsStack, TargetLevel); } + Nav.List.classList.add("hidden"); + Nav.GridContainer.classList.remove("hidden"); + + UpdateButtons(); + + ScrollToWithOffset(Nav.Controls.GridTraversal.Header, Nav.Controls.Header.offsetHeight); } + ScrollCondition = true; } else { - if(GridSizeIsSupported(Nav.GridSize)) + // TODO(matt): Inform user that grid view is unavailable + } +} + +function +PickListView() +{ + Nav.Controls.View.textContent = "View: List"; + Nav.ViewType = view_type.LIST; + if(MaintainingState()) + { + ClearStateBit(state_bit.VIEW_GRID); + SetStateBit(state_bit.VIEW_LIST); + } + + if(!IsQuery()) + { + Nav.List.classList.remove("hidden"); + Nav.GridContainer.classList.add("hidden"); + var LevelBundle = GetTraversalLevelBundle(); + if(LevelBundle.Generation > 1) { - Nav.Controls.View.textContent = "View: Grid"; - Nav.ViewType = view_type.GRID; - if(MaintainingState()) + var Element; + if(LevelBundle.This.Entries !== null) { - ClearStateBit(state_bit.VIEW_LIST); - SetStateBit(state_bit.VIEW_GRID); + Element = GetScrollToElement(LevelBundle.This.Entries, Nav.SortChronological ? LevelBundle.This.HeadIndex : LevelBundle.This.TailIndex); } - - if(!IsQuery()) + else if(LevelBundle.This.Projects !== null) { - var TargetLevel = ComputeTargetLevelForViewport(); - EmptyTraversalStack(); - if(TargetLevel.Projects || TargetLevel.Entries) - { - var ProjectsStack = BuildProjectsStack(TargetLevel); - DeriveTraversalStack(ProjectsStack, TargetLevel); - } - Nav.List.classList.add("hidden"); - Nav.GridContainer.classList.remove("hidden"); - - UpdateButtons(); - - ScrollToWithOffset(Nav.Controls.GridTraversal.Header, Nav.Controls.Header.offsetHeight); + Element = GetScrollToElement(LevelBundle.This.Projects, Nav.SortChronological ? LevelBundle.This.HeadIndex : LevelBundle.This.TailIndex); } - } - else - { - // TODO(matt): Inform user that grid view is unavailable + ScrollToWithOffset(Element, Nav.Controls.Header.offsetHeight); } } - ScrollCondition = Nav.ViewType == view_type.GRID; + ScrollCondition = false; +} + +function +ToggleView() +{ + // NOTE(matt): While we only have two views, a toggle will suffice. + clearTimeout(ScrollerFunction); + ScrollTicking = false; + if(Nav.ViewType == view_type.GRID) + { + PickListView(); + } + else + { + PickGridView(); + } } function @@ -3804,7 +3841,7 @@ ResizeFunction() } else if(Nav.ViewType == view_type.GRID) { - ToggleView(); + PickListView(); // TODO(matt): Inform user that we've switched to the list view } ScrollToWithOffset(Nav.Nexus, 0);