Local-first remote sync and cross-platform UI parity #2
@@ -2024,6 +2024,7 @@ func (u *ui) detailPanel(gtx layout.Context) layout.Dimensions {
|
||||
if u.shouldShowDesktopWorkingHeader() {
|
||||
return layout.Flex{Axis: layout.Vertical}.Layout(gtx,
|
||||
layout.Rigid(u.headerActions),
|
||||
layout.Rigid(u.desktopHeaderMenus),
|
||||
layout.Rigid(layout.Spacer{Height: unit.Dp(12)}.Layout),
|
||||
layout.Flexed(1, func(gtx layout.Context) layout.Dimensions {
|
||||
return u.detailPanelContent(gtx)
|
||||
|
||||
@@ -1312,6 +1312,9 @@ func (u *ui) primaryContent(gtx layout.Context) layout.Dimensions {
|
||||
case u.shouldUseLockedSinglePane():
|
||||
return u.detailPanel(gtx)
|
||||
case !u.shouldShowDetailPane():
|
||||
if !u.usesCompactViewport() {
|
||||
return u.desktopListOnlyContent(gtx)
|
||||
}
|
||||
return u.listPanel(gtx)
|
||||
case u.usesCompactViewport():
|
||||
return u.compactPrimaryContent(gtx)
|
||||
@@ -1368,6 +1371,21 @@ func (u *ui) widePrimaryContent(gtx layout.Context) layout.Dimensions {
|
||||
)
|
||||
}
|
||||
|
||||
func (u *ui) desktopListOnlyContent(gtx layout.Context) layout.Dimensions {
|
||||
return layout.Flex{Axis: layout.Vertical}.Layout(gtx,
|
||||
layout.Rigid(func(gtx layout.Context) layout.Dimensions {
|
||||
return card(gtx, func(gtx layout.Context) layout.Dimensions {
|
||||
return layout.Flex{Axis: layout.Vertical}.Layout(gtx,
|
||||
layout.Rigid(u.headerActions),
|
||||
layout.Rigid(u.desktopHeaderMenus),
|
||||
)
|
||||
})
|
||||
}),
|
||||
layout.Rigid(layout.Spacer{Height: unit.Dp(12)}.Layout),
|
||||
layout.Flexed(1, u.listPanel),
|
||||
)
|
||||
}
|
||||
|
||||
func (u *ui) syncDialogOverlay(gtx layout.Context) layout.Dimensions {
|
||||
if !u.syncDialogOpen {
|
||||
return layout.Dimensions{}
|
||||
|
||||
+18
-23
@@ -49,9 +49,6 @@ func (u *ui) headerActions(gtx layout.Context) layout.Dimensions {
|
||||
cluster.prepareCompactMenus(gtx, u)
|
||||
return layout.Dimensions{Size: image.Pt(gtx.Constraints.Max.X, rowDims.Size.Y)}
|
||||
}
|
||||
|
||||
cluster.drawOverlayMenus(gtx, u, headerlayout.DropdownSurface{ContainerWidth: gtx.Constraints.Max.X, LeftInset: 0, TopInset: 0})
|
||||
|
||||
return rowDims
|
||||
}
|
||||
|
||||
@@ -146,24 +143,7 @@ func (c *headerActionCluster) prepareCompactMenus(gtx layout.Context, u *ui) {
|
||||
}
|
||||
}
|
||||
|
||||
func (c headerActionCluster) drawOverlayMenus(gtx layout.Context, u *ui, surface headerlayout.DropdownSurface) {
|
||||
if c.ShowSyncMenu() {
|
||||
placement, menuCall := surface.Place(gtx, c.Metrics.SyncAnchor(), c.SyncMenu)
|
||||
u.maybeLogHeaderMenuPlacement("sync", surface, placement)
|
||||
stack := op.Offset(placement.Origin).Push(gtx.Ops)
|
||||
menuCall.Add(gtx.Ops)
|
||||
stack.Pop()
|
||||
}
|
||||
if c.ShowMainMenu() {
|
||||
placement, menuCall := surface.Place(gtx, c.Metrics.MainAnchor(), c.MainMenu)
|
||||
u.maybeLogHeaderMenuPlacement("main", surface, placement)
|
||||
stack := op.Offset(placement.Origin).Push(gtx.Ops)
|
||||
menuCall.Add(gtx.Ops)
|
||||
stack.Pop()
|
||||
}
|
||||
}
|
||||
|
||||
func (c headerActionCluster) layoutCompactMenuRow(gtx layout.Context) layout.Dimensions {
|
||||
func (c headerActionCluster) layoutMenuRow(gtx layout.Context) layout.Dimensions {
|
||||
menu := c.activeMenu()
|
||||
if menu == nil {
|
||||
return layout.Dimensions{}
|
||||
@@ -223,7 +203,7 @@ func (u *ui) phoneHeaderMenus(gtx layout.Context) layout.Dimensions {
|
||||
return layout.UniformInset(unit.Dp(16)).Layout(gtx, func(gtx layout.Context) layout.Dimensions {
|
||||
stack := op.Offset(image.Pt(0, max(0, u.phoneSyncMenuOrigin.Y-u.frameInsetPx))).Push(gtx.Ops)
|
||||
defer stack.Pop()
|
||||
dims := cluster.layoutCompactMenuRow(gtx)
|
||||
dims := cluster.layoutMenuRow(gtx)
|
||||
return layout.Dimensions{Size: image.Pt(gtx.Constraints.Max.X, max(dims.Size.Y, u.phoneSyncMenuOrigin.Y))}
|
||||
})
|
||||
}
|
||||
@@ -231,13 +211,28 @@ func (u *ui) phoneHeaderMenus(gtx layout.Context) layout.Dimensions {
|
||||
return layout.UniformInset(unit.Dp(16)).Layout(gtx, func(gtx layout.Context) layout.Dimensions {
|
||||
stack := op.Offset(image.Pt(0, max(0, u.phoneMainMenuOrigin.Y-u.frameInsetPx))).Push(gtx.Ops)
|
||||
defer stack.Pop()
|
||||
dims := cluster.layoutCompactMenuRow(gtx)
|
||||
dims := cluster.layoutMenuRow(gtx)
|
||||
return layout.Dimensions{Size: image.Pt(gtx.Constraints.Max.X, max(dims.Size.Y, u.phoneMainMenuOrigin.Y))}
|
||||
})
|
||||
}
|
||||
return layout.Dimensions{}
|
||||
}
|
||||
|
||||
func (u *ui) desktopHeaderMenus(gtx layout.Context) layout.Dimensions {
|
||||
if u.usesCompactViewport() || (!u.syncMenuOpen && !u.mainMenuOpen) {
|
||||
return layout.Dimensions{}
|
||||
}
|
||||
cluster := u.newHeaderActionCluster(gtx)
|
||||
dims := cluster.layoutMenuRow(gtx)
|
||||
if dims.Size.Y == 0 {
|
||||
return dims
|
||||
}
|
||||
return layout.Flex{Axis: layout.Vertical}.Layout(gtx,
|
||||
layout.Rigid(layout.Spacer{Height: unit.Dp(6)}.Layout),
|
||||
layout.Rigid(func(gtx layout.Context) layout.Dimensions { return dims }),
|
||||
)
|
||||
}
|
||||
|
||||
func (u *ui) syncMenuVisibleOnPhone() bool {
|
||||
return u.usesCompactViewport() && u.phoneSyncMenuVisible && u.syncMenuOpen
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user