backstack: reimplemented the backstack

This is a much cleaner implementation.
This commit is contained in:
Leon Mika 2022-08-14 09:16:28 +10:00
parent ec9ac34d26
commit 6c5787b271
3 changed files with 55 additions and 49 deletions

View file

@ -74,8 +74,9 @@ func (c *TableReadController) ScanTable(name string) tea.Cmd {
if err != nil {
return events.Error(err)
}
resultSet = c.tableService.Filter(resultSet, c.state.Filter())
return c.setResultSetAndFilter(resultSet, c.state.Filter())
return c.setResultSetAndFilter(resultSet, c.state.Filter(), true)
}
}
@ -88,32 +89,33 @@ func (c *TableReadController) PromptForQuery() tea.Cmd {
return c.runQuery(c.state.ResultSet().TableInfo, value, "", true)
}
/*
if value == "" {
return func() tea.Msg {
resultSet := c.state.ResultSet()
return c.doScan(context.Background(), resultSet, nil)
}
}
expr, err := queryexpr.Parse(value)
if err != nil {
return events.SetError(err)
}
return c.doIfNoneDirty(func() tea.Msg {
resultSet := c.state.ResultSet()
newResultSet, err := c.tableService.ScanOrQuery(context.Background(), resultSet.TableInfo, expr)
if err != nil {
return events.Error(err)
}
if err := c.workspaceService.PushSnapshot(resultSet, ""); err != nil {
log.Printf("cannot push snapshot: %v", err)
}
return c.setResultSetAndFilter(newResultSet, "")
})
*/
//if value == "" {
// return func() tea.Msg {
// resultSet := c.state.ResultSet()
// if err := c.workspaceService.PushSnapshot(resultSet, ""); err != nil {
// log.Printf("cannot push snapshot: %v", err)
// }
// return c.doScan(context.Background(), resultSet, nil)
// }
//}
//
//expr, err := queryexpr.Parse(value)
//if err != nil {
// return events.SetError(err)
//}
//
//return c.doIfNoneDirty(func() tea.Msg {
// resultSet := c.state.ResultSet()
// newResultSet, err := c.tableService.ScanOrQuery(context.Background(), resultSet.TableInfo, expr)
// if err != nil {
// return events.Error(err)
// }
//
// if err := c.workspaceService.PushSnapshot(resultSet, ""); err != nil {
// log.Printf("cannot push snapshot: %v", err)
// }
// return c.setResultSetAndFilter(newResultSet, "")
//})
},
}
}
@ -129,7 +131,8 @@ func (c *TableReadController) runQuery(tableInfo *models.TableInfo, query, newFi
if newFilter != "" {
newResultSet = c.tableService.Filter(newResultSet, newFilter)
}
return c.setResultSetAndFilter(newResultSet, newFilter)
return c.setResultSetAndFilter(newResultSet, newFilter, pushSnapshot)
}
expr, err := queryexpr.Parse(query)
@ -138,21 +141,15 @@ func (c *TableReadController) runQuery(tableInfo *models.TableInfo, query, newFi
}
return c.doIfNoneDirty(func() tea.Msg {
resultSet := c.state.ResultSet()
newResultSet, err := c.tableService.ScanOrQuery(context.Background(), tableInfo, expr)
if err != nil {
return events.Error(err)
}
if pushSnapshot {
if err := c.workspaceService.PushSnapshot(resultSet, c.state.Filter()); err != nil {
log.Printf("cannot push snapshot: %v", err)
}
}
if newFilter != "" {
newResultSet = c.tableService.Filter(newResultSet, newFilter)
}
return c.setResultSetAndFilter(newResultSet, newFilter)
return c.setResultSetAndFilter(newResultSet, newFilter, pushSnapshot)
})
}
@ -182,7 +179,7 @@ func (c *TableReadController) Rescan() tea.Cmd {
return func() tea.Msg {
return c.doIfNoneDirty(func() tea.Msg {
resultSet := c.state.ResultSet()
return c.doScan(context.Background(), resultSet, resultSet.Query)
return c.doScan(context.Background(), resultSet, resultSet.Query, true)
})
}
}
@ -222,19 +219,24 @@ func (c *TableReadController) ExportCSV(filename string) tea.Cmd {
}
}
func (c *TableReadController) doScan(ctx context.Context, resultSet *models.ResultSet, query models.Queryable) tea.Msg {
func (c *TableReadController) doScan(ctx context.Context, resultSet *models.ResultSet, query models.Queryable, pushBackstack bool) tea.Msg {
newResultSet, err := c.tableService.ScanOrQuery(ctx, resultSet.TableInfo, query)
if err != nil {
return events.Error(err)
}
c.workspaceService.PushSnapshot(resultSet, c.state.Filter())
newResultSet = c.tableService.Filter(newResultSet, c.state.Filter())
return c.setResultSetAndFilter(newResultSet, c.state.Filter())
return c.setResultSetAndFilter(newResultSet, c.state.Filter(), pushBackstack)
}
func (c *TableReadController) setResultSetAndFilter(resultSet *models.ResultSet, filter string) tea.Msg {
func (c *TableReadController) setResultSetAndFilter(resultSet *models.ResultSet, filter string, pushBackstack bool) tea.Msg {
if pushBackstack {
if err := c.workspaceService.PushSnapshot(resultSet, filter); err != nil {
log.Printf("cannot push snapshot: %v", err)
}
}
c.state.setResultSetAndFilter(resultSet, filter)
return c.state.buildNewResultSetMessage("")
}
@ -257,11 +259,9 @@ func (c *TableReadController) Filter() tea.Cmd {
OnDone: func(value string) tea.Cmd {
return func() tea.Msg {
resultSet := c.state.ResultSet()
c.workspaceService.PushSnapshot(resultSet, c.state.Filter())
newResultSet := c.tableService.Filter(resultSet, value)
return c.setResultSetAndFilter(newResultSet, value)
return c.setResultSetAndFilter(newResultSet, value, true)
}
},
}
@ -288,7 +288,7 @@ func (c *TableReadController) ViewBack() tea.Cmd {
log.Printf("backstack: setting filter to '%v'", viewSnapshot.Filter)
newResultSet := c.tableService.Filter(currentResultSet, viewSnapshot.Filter)
return c.setResultSetAndFilter(newResultSet, viewSnapshot.Filter)
return c.setResultSetAndFilter(newResultSet, viewSnapshot.Filter, false)
}
tableInfo := currentResultSet.TableInfo

View file

@ -400,7 +400,7 @@ func (twc *TableWriteController) NoisyTouchItem(idx int) tea.Cmd {
return events.Error(err)
}
return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query)
return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query, false)
}
},
}
@ -431,7 +431,7 @@ func (twc *TableWriteController) DeleteMarked() tea.Cmd {
return events.Error(err)
}
return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query)
return twc.tableReadControllers.doScan(ctx, resultSet, resultSet.Query, false)
}
},
}

View file

@ -47,9 +47,8 @@ func (s *ViewSnapshotService) PopSnapshot() (*serialisable.ViewSnapshot, error)
vs, err := s.store.Head()
if err != nil {
return nil, errors.Wrap(err, "cannot get snapshot head")
}
if vs == nil {
return vs, nil
} else if vs == nil || vs.BackLink == 0 {
return nil, nil
}
if err := s.store.SetAsHead(vs.BackLink); err != nil {
@ -59,5 +58,12 @@ func (s *ViewSnapshotService) PopSnapshot() (*serialisable.ViewSnapshot, error)
return nil, errors.Wrap(err, "cannot remove old ID")
}
vs, err = s.store.Head()
if err != nil {
return nil, errors.Wrap(err, "cannot get snapshot head")
} else if vs == nil || vs.BackLink == 0 {
return nil, nil
}
return vs, nil
}