Show ping results in a modal dialog
This commit is contained in:
@@ -63,6 +63,9 @@ type ui struct {
|
|||||||
message string
|
message string
|
||||||
messageColor color.NRGBA
|
messageColor color.NRGBA
|
||||||
busy bool
|
busy bool
|
||||||
|
showModal bool
|
||||||
|
modalTitle string
|
||||||
|
modalBody string
|
||||||
|
|
||||||
async chan func()
|
async chan func()
|
||||||
|
|
||||||
@@ -76,6 +79,7 @@ type ui struct {
|
|||||||
testURLBtn widget.Clickable
|
testURLBtn widget.Clickable
|
||||||
addWGManualBtn widget.Clickable
|
addWGManualBtn widget.Clickable
|
||||||
addWGFileBtn widget.Clickable
|
addWGFileBtn widget.Clickable
|
||||||
|
closeModalBtn widget.Clickable
|
||||||
|
|
||||||
vlessConnectBtns []widget.Clickable
|
vlessConnectBtns []widget.Clickable
|
||||||
vlessDeleteBtns []widget.Clickable
|
vlessDeleteBtns []widget.Clickable
|
||||||
@@ -218,6 +222,9 @@ func (u *ui) handleClicks(gtx layout.Context) {
|
|||||||
for u.addWGFileBtn.Clicked(gtx) {
|
for u.addWGFileBtn.Clicked(gtx) {
|
||||||
u.addWireGuardFromFile()
|
u.addWireGuardFromFile()
|
||||||
}
|
}
|
||||||
|
for u.closeModalBtn.Clicked(gtx) {
|
||||||
|
u.hideModal()
|
||||||
|
}
|
||||||
|
|
||||||
for i := 0; i < minInt(len(u.configs.VLESS), len(u.vlessConnectBtns), len(u.vlessDeleteBtns), len(u.vlessPingBtns)); i++ {
|
for i := 0; i < minInt(len(u.configs.VLESS), len(u.vlessConnectBtns), len(u.vlessDeleteBtns), len(u.vlessPingBtns)); i++ {
|
||||||
for u.vlessConnectBtns[i].Clicked(gtx) {
|
for u.vlessConnectBtns[i].Clicked(gtx) {
|
||||||
@@ -245,7 +252,8 @@ func (u *ui) handleClicks(gtx layout.Context) {
|
|||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("сервер не найден")
|
return fmt.Errorf("сервер не найден")
|
||||||
}
|
}
|
||||||
return fmt.Errorf("пинг %.0f мс", latency)
|
u.showPingModal("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>", cfg.Name, latency)
|
||||||
|
return nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -538,7 +546,8 @@ func (u *ui) testURL() {
|
|||||||
if !ok {
|
if !ok {
|
||||||
return fmt.Errorf("сервер не найден")
|
return fmt.Errorf("сервер не найден")
|
||||||
}
|
}
|
||||||
return fmt.Errorf("пинг %.0f мс", latency)
|
u.showPingModal("<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD>", "<22><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> URL", latency)
|
||||||
|
return nil
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -564,10 +573,26 @@ func (u *ui) openLogs() {
|
|||||||
u.messageColor = successColor
|
u.messageColor = successColor
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u *ui) showPingModal(title, target string, latency float64) {
|
||||||
|
u.async <- func() {
|
||||||
|
u.modalTitle = title
|
||||||
|
u.modalBody = fmt.Sprintf("%s\n\n<><6E><EFBFBD><EFBFBD>: %.0f <20><>", target, latency)
|
||||||
|
u.showModal = true
|
||||||
|
u.window.Invalidate()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *ui) hideModal() {
|
||||||
|
u.showModal = false
|
||||||
|
u.modalTitle = ""
|
||||||
|
u.modalBody = ""
|
||||||
|
u.window.Invalidate()
|
||||||
|
}
|
||||||
|
|
||||||
func (u *ui) layout(gtx layout.Context) layout.Dimensions {
|
func (u *ui) layout(gtx layout.Context) layout.Dimensions {
|
||||||
fill(gtx, bgColor)
|
fill(gtx, bgColor)
|
||||||
|
|
||||||
return layout.UniformInset(unit.Dp(24)).Layout(gtx, func(gtx layout.Context) layout.Dimensions {
|
dims := layout.UniformInset(unit.Dp(24)).Layout(gtx, func(gtx layout.Context) layout.Dimensions {
|
||||||
return u.contentList.Layout(gtx, 1, func(gtx layout.Context, _ int) layout.Dimensions {
|
return u.contentList.Layout(gtx, 1, func(gtx layout.Context, _ int) layout.Dimensions {
|
||||||
return layout.Flex{Axis: layout.Vertical}.Layout(
|
return layout.Flex{Axis: layout.Vertical}.Layout(
|
||||||
gtx,
|
gtx,
|
||||||
@@ -579,6 +604,12 @@ func (u *ui) layout(gtx layout.Context) layout.Dimensions {
|
|||||||
)
|
)
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
||||||
|
if u.showModal {
|
||||||
|
u.layoutModal(gtx)
|
||||||
|
}
|
||||||
|
|
||||||
|
return dims
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *ui) layoutHeader(gtx layout.Context) layout.Dimensions {
|
func (u *ui) layoutHeader(gtx layout.Context) layout.Dimensions {
|
||||||
@@ -1014,6 +1045,41 @@ func (u *ui) card(gtx layout.Context, bg color.NRGBA, content layout.Widget) lay
|
|||||||
return dims
|
return dims
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (u *ui) layoutModal(gtx layout.Context) {
|
||||||
|
defer clip.Rect{Max: gtx.Constraints.Max}.Push(gtx.Ops).Pop()
|
||||||
|
paint.Fill(gtx.Ops, color.NRGBA{A: 160})
|
||||||
|
|
||||||
|
layout.Center.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
|
||||||
|
return layout.UniformInset(unit.Dp(24)).Layout(gtx, func(gtx layout.Context) layout.Dimensions {
|
||||||
|
return u.card(gtx, panelColor, func(gtx layout.Context) layout.Dimensions {
|
||||||
|
return layout.UniformInset(unit.Dp(24)).Layout(gtx, func(gtx layout.Context) layout.Dimensions {
|
||||||
|
gtx.Constraints.Max.X = minInt(gtx.Constraints.Max.X, gtx.Dp(unit.Dp(420)))
|
||||||
|
return layout.Flex{Axis: layout.Vertical}.Layout(
|
||||||
|
gtx,
|
||||||
|
layout.Rigid(func(gtx layout.Context) layout.Dimensions {
|
||||||
|
lbl := material.H5(u.theme, u.modalTitle)
|
||||||
|
lbl.Color = textColor
|
||||||
|
return lbl.Layout(gtx)
|
||||||
|
}),
|
||||||
|
layout.Rigid(spacerH(12)),
|
||||||
|
layout.Rigid(func(gtx layout.Context) layout.Dimensions {
|
||||||
|
lbl := material.Body1(u.theme, u.modalBody)
|
||||||
|
lbl.Color = mutedColor
|
||||||
|
return lbl.Layout(gtx)
|
||||||
|
}),
|
||||||
|
layout.Rigid(spacerH(20)),
|
||||||
|
layout.Rigid(func(gtx layout.Context) layout.Dimensions {
|
||||||
|
return layout.E.Layout(gtx, func(gtx layout.Context) layout.Dimensions {
|
||||||
|
return u.layoutButton(gtx, &u.closeModalBtn, "OK", accentSoftColor)
|
||||||
|
})
|
||||||
|
}),
|
||||||
|
)
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
func fill(gtx layout.Context, c color.NRGBA) {
|
func fill(gtx layout.Context, c color.NRGBA) {
|
||||||
defer clip.Rect{Max: gtx.Constraints.Max}.Push(gtx.Ops).Pop()
|
defer clip.Rect{Max: gtx.Constraints.Max}.Push(gtx.Ops).Pop()
|
||||||
paint.Fill(gtx.Ops, c)
|
paint.Fill(gtx.Ops, c)
|
||||||
|
|||||||
Reference in New Issue
Block a user