131 lines
3.3 KiB
Go
131 lines
3.3 KiB
Go
package main
|
|
|
|
import (
|
|
"fmt"
|
|
|
|
"github.com/redis/go-redis/v9"
|
|
"github.com/ying32/govcl/vcl"
|
|
"github.com/ying32/govcl/vcl/types"
|
|
)
|
|
|
|
type TRedisConnectionDialogResult = *redis.Options
|
|
|
|
type TRedisConnectionDialog struct {
|
|
*vcl.TForm
|
|
|
|
Address *vcl.TEdit
|
|
Port *vcl.TSpinEdit
|
|
Password *vcl.TEdit
|
|
IsResp3Protocol *vcl.TCheckBox
|
|
ConnectBtn *vcl.TButton
|
|
|
|
// CustomReturn must be set by the caller to a *redis.Options variable.
|
|
CustomReturn *TRedisConnectionDialogResult // nil = no CustomReturn/cancelled dialog
|
|
}
|
|
|
|
func (f *TRedisConnectionDialog) OnFormCreate(sender vcl.IObject) {
|
|
|
|
f.SetCaption("Connect to Redis...")
|
|
f.ScreenCenter()
|
|
f.SetWidth(320)
|
|
f.SetHeight(160)
|
|
|
|
// row 1
|
|
|
|
row1 := vcl_row(f, 1)
|
|
|
|
lblAddress := vcl.NewLabel(row1)
|
|
lblAddress.SetParent(row1)
|
|
lblAddress.SetCaption("Address:")
|
|
lblAddress.SetAlign(types.AlLeft)
|
|
lblAddress.SetLayout(types.TlCenter)
|
|
lblAddress.SetLeft(1)
|
|
lblAddress.BorderSpacing().SetAround(MY_SPACING)
|
|
|
|
f.Address = vcl.NewEdit(row1)
|
|
f.Address.SetParent(row1)
|
|
f.Address.SetAlign(types.AlClient) // grow AlLeft)
|
|
f.Address.SetWidth(MY_WIDTH)
|
|
f.Address.SetLeft(2)
|
|
f.Address.SetText("127.0.0.1")
|
|
f.Address.BorderSpacing().SetAround(MY_SPACING)
|
|
|
|
lblPort := vcl.NewLabel(row1)
|
|
lblPort.SetParent(row1)
|
|
lblPort.SetCaption(":")
|
|
lblPort.SetAlign(types.AlRight)
|
|
lblPort.SetLayout(types.TlCenter)
|
|
lblPort.SetLeft(0)
|
|
lblPort.SetAutoSize(true)
|
|
lblPort.BorderSpacing().SetAround(MY_SPACING)
|
|
|
|
f.Port = vcl.NewSpinEdit(row1)
|
|
f.Port.SetParent(row1)
|
|
f.Port.SetMinValue(1)
|
|
f.Port.SetMaxValue(65535)
|
|
f.Port.SetValue(6379) // Redis default port
|
|
f.Port.SetAlign(types.AlRight)
|
|
f.Port.SetLeft(1000)
|
|
f.Port.BorderSpacing().SetAround(MY_SPACING)
|
|
|
|
// row 2
|
|
|
|
row2 := vcl_row(f, 2)
|
|
|
|
lblPassword := vcl.NewLabel(row2)
|
|
lblPassword.SetParent(row2)
|
|
lblPassword.SetCaption("Password:")
|
|
lblPassword.SetAlign(types.AlLeft)
|
|
lblPassword.SetLayout(types.TlCenter)
|
|
lblPassword.SetLeft(1)
|
|
lblPassword.BorderSpacing().SetAround(MY_SPACING)
|
|
|
|
f.Password = vcl.NewEdit(row2)
|
|
f.Password.SetParent(row2)
|
|
f.Password.SetAlign(types.AlClient) // grow
|
|
f.Password.SetLeft(2)
|
|
f.Password.SetWidth(MY_WIDTH)
|
|
f.Password.SetPasswordChar(uint16('*'))
|
|
f.Password.BorderSpacing().SetAround(MY_SPACING)
|
|
|
|
// row 3
|
|
|
|
f.IsResp3Protocol = vcl.NewCheckBox(f)
|
|
f.IsResp3Protocol.SetParent(f)
|
|
f.IsResp3Protocol.SetCaption("Use RESP v3 protocol")
|
|
f.IsResp3Protocol.SetChecked(true)
|
|
f.IsResp3Protocol.SetAlign(types.AlTop)
|
|
f.IsResp3Protocol.SetTop(3)
|
|
f.IsResp3Protocol.BorderSpacing().SetAround(MY_SPACING)
|
|
|
|
// buttons
|
|
|
|
row4 := vcl_row(f, 4)
|
|
row4.SetAlign(types.AlBottom)
|
|
|
|
f.ConnectBtn = vcl.NewButton(row4)
|
|
f.ConnectBtn.SetParent(row4)
|
|
f.ConnectBtn.SetAlign(types.AlRight)
|
|
f.ConnectBtn.SetCaption("Connect")
|
|
f.ConnectBtn.SetOnClick(f.OnConnectBtnClick)
|
|
}
|
|
|
|
func (f *TRedisConnectionDialog) OnConnectBtnClick(sender vcl.IObject) {
|
|
|
|
ret := &redis.Options{
|
|
Addr: fmt.Sprintf("%s:%d", f.Address.Text(), f.Port.Value()),
|
|
Password: f.Password.Text(),
|
|
DB: 0, // Start off with default DB, but, we will browse them ourselves
|
|
Protocol: 2, // RESP2
|
|
}
|
|
|
|
if f.IsResp3Protocol.Checked() {
|
|
ret.Protocol = 3 // RESP3
|
|
}
|
|
|
|
// Success.
|
|
// Fill in target pointer and close dialog with "MrOk" sentinel
|
|
*f.CustomReturn = ret
|
|
f.SetModalResult(types.MrOk)
|
|
}
|