main: add nav context menu, support closing open connections
This commit is contained in:
parent
7e5d17100d
commit
b45faa2e73
@ -108,6 +108,11 @@ func (ld *badgerLoadedDatabase) ExecQuery(query string, resultArea *vcl.TListVie
|
|||||||
vcl.ShowMessage("Badger doesn't support querying")
|
vcl.ShowMessage("Badger doesn't support querying")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ld *badgerLoadedDatabase) Close() {
|
||||||
|
_ = ld.db.Close()
|
||||||
|
ld.arena = nil
|
||||||
|
}
|
||||||
|
|
||||||
var _ loadedDatabase = &badgerLoadedDatabase{} // interface assertion
|
var _ loadedDatabase = &badgerLoadedDatabase{} // interface assertion
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -98,6 +98,11 @@ func (ld *boltLoadedDatabase) ExecQuery(query string, resultArea *vcl.TListView)
|
|||||||
vcl.ShowMessage("Bolt doesn't support querying")
|
vcl.ShowMessage("Bolt doesn't support querying")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ld *boltLoadedDatabase) Close() {
|
||||||
|
_ = ld.db.Close()
|
||||||
|
ld.arena = nil
|
||||||
|
}
|
||||||
|
|
||||||
var _ loadedDatabase = &boltLoadedDatabase{} // interface assertion
|
var _ loadedDatabase = &boltLoadedDatabase{} // interface assertion
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -33,3 +33,5 @@ func (n *noLoadedDatabase) NavChildren(ndata *navData) ([]string, error) {
|
|||||||
|
|
||||||
func (n *noLoadedDatabase) Keepalive(ndata *navData) {
|
func (n *noLoadedDatabase) Keepalive(ndata *navData) {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (n *noLoadedDatabase) Close() {}
|
||||||
|
@ -150,6 +150,11 @@ func (ld *redisLoadedDatabase) ExecQuery(query string, resultArea *vcl.TListView
|
|||||||
fmt.Printf("result\n%#v\n", ret)
|
fmt.Printf("result\n%#v\n", ret)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ld *redisLoadedDatabase) Close() {
|
||||||
|
_ = ld.db.Close()
|
||||||
|
ld.arena = nil
|
||||||
|
}
|
||||||
|
|
||||||
var _ loadedDatabase = &redisLoadedDatabase{} // interface assertion
|
var _ loadedDatabase = &redisLoadedDatabase{} // interface assertion
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -230,6 +230,11 @@ func (ld *sqliteLoadedDatabase) NavChildren(ndata *navData) ([]string, error) {
|
|||||||
return nil, fmt.Errorf("unknown nav path %#v", ndata.bucketPath)
|
return nil, fmt.Errorf("unknown nav path %#v", ndata.bucketPath)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (ld *sqliteLoadedDatabase) Close() {
|
||||||
|
_ = ld.db.Close()
|
||||||
|
ld.arena = nil
|
||||||
|
}
|
||||||
|
|
||||||
var _ loadedDatabase = &sqliteLoadedDatabase{} // interface assertion
|
var _ loadedDatabase = &sqliteLoadedDatabase{} // interface assertion
|
||||||
|
|
||||||
//
|
//
|
||||||
|
@ -13,6 +13,7 @@ type loadedDatabase interface {
|
|||||||
ExecQuery(query string, resultArea *vcl.TListView)
|
ExecQuery(query string, resultArea *vcl.TListView)
|
||||||
NavChildren(ndata *navData) ([]string, error)
|
NavChildren(ndata *navData) ([]string, error)
|
||||||
Keepalive(ndata *navData)
|
Keepalive(ndata *navData)
|
||||||
|
Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
// navData is the .Data() pointer for each TTreeNode in the left-hand tree.
|
// navData is the .Data() pointer for each TTreeNode in the left-hand tree.
|
||||||
|
58
main.go
58
main.go
@ -115,6 +115,7 @@ func (f *TMainForm) OnFormCreate(sender vcl.IObject) {
|
|||||||
f.Buckets.SetReadOnly(true) // prevent click to rename on nodes
|
f.Buckets.SetReadOnly(true) // prevent click to rename on nodes
|
||||||
f.Buckets.SetOnExpanding(f.OnNavExpanding)
|
f.Buckets.SetOnExpanding(f.OnNavExpanding)
|
||||||
f.Buckets.SetOnChange(f.OnNavChange)
|
f.Buckets.SetOnChange(f.OnNavChange)
|
||||||
|
f.Buckets.SetOnContextPopup(f.OnNavContextPopup)
|
||||||
|
|
||||||
hsplit := vcl.NewSplitter(f)
|
hsplit := vcl.NewSplitter(f)
|
||||||
hsplit.SetParent(f)
|
hsplit.SetParent(f)
|
||||||
@ -262,6 +263,63 @@ func (f *TMainForm) OnMnuFileExitClick(sender vcl.IObject) {
|
|||||||
f.Close()
|
f.Close()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (f *TMainForm) OnNavContextPopup(sender vcl.IObject, mousePos types.TPoint, handled *bool) {
|
||||||
|
*handled = true
|
||||||
|
|
||||||
|
curItem := f.Buckets.Selected()
|
||||||
|
if curItem == nil {
|
||||||
|
// Nothing is selected at all
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
mnu := vcl.NewPopupMenu(f.Buckets)
|
||||||
|
|
||||||
|
mnuRefresh := vcl.NewMenuItem(mnu)
|
||||||
|
mnuRefresh.SetCaption("Refresh")
|
||||||
|
mnuRefresh.SetOnClick(f.OnNavContextRefresh)
|
||||||
|
mnu.Items().Add(mnuRefresh)
|
||||||
|
|
||||||
|
// Check what custom actions the ndata->db itself wants to add
|
||||||
|
// ...
|
||||||
|
|
||||||
|
if curItem.Parent() == nil {
|
||||||
|
// Top-level item (database connection). Allow closing by right-click.
|
||||||
|
mnuSep := vcl.NewMenuItem(mnu)
|
||||||
|
mnuSep.SetCaption("-")
|
||||||
|
mnu.Items().Add(mnuSep)
|
||||||
|
|
||||||
|
mnuClose := vcl.NewMenuItem(mnu)
|
||||||
|
mnuClose.SetCaption("Close")
|
||||||
|
mnuClose.SetOnClick(f.OnNavContextClose)
|
||||||
|
mnu.Items().Add(mnuClose)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Show popup
|
||||||
|
mnu.Popup2()
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *TMainForm) OnNavContextRefresh(sender vcl.IObject) {
|
||||||
|
vcl.ShowMessage("TODO")
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *TMainForm) OnNavContextClose(sender vcl.IObject) {
|
||||||
|
curItem := f.Buckets.Selected()
|
||||||
|
if curItem == nil {
|
||||||
|
return // Nothing selected (shouldn't happen)
|
||||||
|
}
|
||||||
|
if curItem.Parent() != nil {
|
||||||
|
return // Selection is not top-level DB connection (shouldn't happen)
|
||||||
|
}
|
||||||
|
|
||||||
|
ndata := (*navData)(curItem.Data())
|
||||||
|
|
||||||
|
ndata.ld.Close()
|
||||||
|
curItem.Delete()
|
||||||
|
|
||||||
|
// n.b. This triggers OnNavChange, which will then re-render from noLoadedDatabase{}
|
||||||
|
}
|
||||||
|
|
||||||
func (f *TMainForm) OnQueryExecute(sender vcl.IObject) {
|
func (f *TMainForm) OnQueryExecute(sender vcl.IObject) {
|
||||||
// If query tab is not selected, switch to it, but do not exec
|
// If query tab is not selected, switch to it, but do not exec
|
||||||
if f.Tabs.ActivePageIndex() != 2 {
|
if f.Tabs.ActivePageIndex() != 2 {
|
||||||
|
Loading…
Reference in New Issue
Block a user