mirror of
https://gitee.com/konyshe/goodlink.git
synced 2025-12-24 08:13:00 +08:00
u
This commit is contained in:
233
main_windows.go
233
main_windows.go
@@ -3,18 +3,8 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"gogo"
|
||||
"log"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"goodlink/config"
|
||||
"goodlink/pro"
|
||||
_ "goodlink/pro"
|
||||
"goodlink/theme"
|
||||
"goodlink/tools"
|
||||
"goodlink/ui2"
|
||||
|
||||
_ "embed"
|
||||
@@ -22,170 +12,19 @@ import (
|
||||
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/app"
|
||||
"fyne.io/fyne/v2/container"
|
||||
"fyne.io/fyne/v2/driver/desktop"
|
||||
"fyne.io/fyne/v2/layout"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
"github.com/atotto/clipboard"
|
||||
)
|
||||
|
||||
var (
|
||||
m_local_ip string
|
||||
m_remote_addr string
|
||||
key_box *fyne.Container
|
||||
myWindow fyne.Window
|
||||
m_start_mg sync.WaitGroup
|
||||
m_start_lock sync.Mutex
|
||||
start_button *widget.Button
|
||||
radio *widget.RadioGroup
|
||||
keyValidated *widget.Entry
|
||||
localUI *ui2.LocalUI
|
||||
remoteUI *ui2.RemoteUI
|
||||
key_create_button *widget.Button
|
||||
key_paste_button *widget.Button
|
||||
start_button_activity *widget.Activity
|
||||
log_view *ui2.LogLabel
|
||||
start_button_stats int
|
||||
)
|
||||
|
||||
const (
|
||||
M_APP_TITLE = "GoodLink"
|
||||
)
|
||||
|
||||
func LogInit(log_view *ui2.LogLabel) {
|
||||
gogo.Log().RegistInfo(func(content string) {
|
||||
ui2.SetLogLabel(content)
|
||||
log.Println(content)
|
||||
})
|
||||
gogo.Log().RegistDebug(func(content string) {
|
||||
ui2.SetLogLabel(content)
|
||||
})
|
||||
gogo.Log().RegistError(func(content string) {
|
||||
ui2.SetLogLabel(content)
|
||||
fyne.LogError("error: ", errors.New(content))
|
||||
})
|
||||
}
|
||||
|
||||
func start_button_click_1(content string) {
|
||||
start_button.Disable()
|
||||
radio.Disable()
|
||||
keyValidated.Disable()
|
||||
localUI.Disable()
|
||||
key_create_button.Disable()
|
||||
key_paste_button.Disable()
|
||||
start_button_activity.Start()
|
||||
start_button_activity.Show()
|
||||
log_view.SetText(content)
|
||||
start_button_stats = 1
|
||||
}
|
||||
|
||||
func start_button_click_0() {
|
||||
radio.Enable()
|
||||
keyValidated.Enable()
|
||||
localUI.Enable()
|
||||
key_create_button.Enable()
|
||||
key_paste_button.Enable()
|
||||
start_button_activity.Stop()
|
||||
start_button_activity.Hide()
|
||||
}
|
||||
|
||||
func start_button_click() {
|
||||
m_start_lock.Lock()
|
||||
defer m_start_lock.Unlock()
|
||||
|
||||
var err error
|
||||
var remote_addr string
|
||||
var local_addr string
|
||||
|
||||
//先对需要填写的数据进行校验
|
||||
switch start_button_stats {
|
||||
case 0:
|
||||
if len(keyValidated.Text) < 16 {
|
||||
ui2.SetLogLabel("请输入或点击生成连接密钥!")
|
||||
return
|
||||
}
|
||||
switch radio.Selected {
|
||||
case "Local":
|
||||
if local_addr, err = localUI.GetLocalAddr(); err != nil {
|
||||
ui2.SetLogLabel(err.Error())
|
||||
return
|
||||
}
|
||||
case "Remote":
|
||||
if remote_addr, err = remoteUI.GetRemoteAddr(); err != nil {
|
||||
ui2.SetLogLabel(err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
log.Println(local_addr)
|
||||
|
||||
configByte, _ := json.Marshal(&config.ConfigInfo{
|
||||
WorkType: radio.Selected,
|
||||
TunKey: keyValidated.Text,
|
||||
ConnType: localUI.GetConnType2(),
|
||||
LocalIP: localUI.GetLocalIP(),
|
||||
LocalPort: localUI.GetLocalPort(),
|
||||
RemoteType: remoteUI.GetRemoteType(),
|
||||
RemoteIP: remoteUI.GetRemoteIP(),
|
||||
RemotePort: remoteUI.GetRemotePort(),
|
||||
})
|
||||
log.Println(string(configByte))
|
||||
gogo.Utils().FileDel("goodlink.json")
|
||||
gogo.Utils().FileAppend("goodlink.json", configByte)
|
||||
}
|
||||
|
||||
switch start_button_stats {
|
||||
case 0:
|
||||
start_button_click_1("正在启动...")
|
||||
|
||||
go func() {
|
||||
time.Sleep(time.Second * 1)
|
||||
start_button.Enable()
|
||||
|
||||
for start_button_stats == 1 {
|
||||
if pro.GetLocalStats() == 2 {
|
||||
log_view.SetText("连接成功")
|
||||
break
|
||||
}
|
||||
time.Sleep(time.Millisecond * 200)
|
||||
}
|
||||
}()
|
||||
|
||||
switch radio.Selected {
|
||||
case "Local":
|
||||
m_start_mg.Add(1)
|
||||
go func() {
|
||||
defer m_start_mg.Done()
|
||||
if err := pro.RunLocal(localUI.GetConnType(), remote_addr, keyValidated.Text); err != nil {
|
||||
ui2.SetLogLabel(err.Error())
|
||||
start_button_stats = 0
|
||||
return
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
case 1:
|
||||
start_button.Disable()
|
||||
log_view.SetText("正在停止...")
|
||||
start_button_stats = 0
|
||||
|
||||
switch radio.Selected {
|
||||
case "Local":
|
||||
go func() {
|
||||
pro.StopLocal()
|
||||
m_start_mg.Wait()
|
||||
start_button_click_0()
|
||||
}()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func main() {
|
||||
myApp := app.New()
|
||||
myApp.Settings().SetTheme(&theme.MyTheme{})
|
||||
icon, _ := fyne.LoadResourceFromPath("./theme/favicon.png")
|
||||
myApp.SetIcon(icon)
|
||||
myWindow = myApp.NewWindow(M_APP_TITLE)
|
||||
myWindow := myApp.NewWindow(M_APP_TITLE)
|
||||
|
||||
if desk, ok := myApp.(desktop.App); ok {
|
||||
m := fyne.NewMenu(M_APP_TITLE,
|
||||
@@ -195,75 +34,9 @@ func main() {
|
||||
desk.SetSystemTrayMenu(m)
|
||||
}
|
||||
|
||||
var configInfo config.ConfigInfo
|
||||
json.Unmarshal(gogo.Utils().FileReadAll("goodlink.json"), &configInfo)
|
||||
log.Println(configInfo)
|
||||
main_ui := ui2.GetMainUI(&myWindow)
|
||||
|
||||
keyValidated = widget.NewEntry()
|
||||
keyValidated.SetPlaceHolder("自定义16-24字节长度")
|
||||
if len(configInfo.TunKey) > 0 {
|
||||
keyValidated.SetText(configInfo.TunKey)
|
||||
}
|
||||
|
||||
key_create_button = widget.NewButton("生成密钥", func() {
|
||||
keyValidated.SetText(tools.RandomString(24))
|
||||
})
|
||||
key_copy_button := widget.NewButton("复制密钥", func() {
|
||||
clipboard.WriteAll(keyValidated.Text)
|
||||
})
|
||||
key_paste_button = widget.NewButton("粘贴密钥", func() {
|
||||
if s, err := clipboard.ReadAll(); err == nil {
|
||||
keyValidated.SetText(s)
|
||||
}
|
||||
})
|
||||
|
||||
localUI = ui2.NewLocalUI(&myWindow, &configInfo)
|
||||
localUI_Container := localUI.GetContainer()
|
||||
|
||||
remoteUI = ui2.NewRemoteUI(&myWindow, &configInfo)
|
||||
remoteUI_Container := remoteUI.GetContainer()
|
||||
|
||||
radio = widget.NewRadioGroup([]string{"Remote", "Local"}, nil)
|
||||
radio.Horizontal = true
|
||||
radio.OnChanged = func(value string) {
|
||||
switch value {
|
||||
case "Remote":
|
||||
localUI_Container.Hide()
|
||||
remoteUI_Container.Show()
|
||||
case "Local":
|
||||
remoteUI_Container.Hide()
|
||||
localUI_Container.Show()
|
||||
default:
|
||||
radio.SetSelected("Local")
|
||||
}
|
||||
}
|
||||
if len(configInfo.WorkType) > 0 {
|
||||
radio.SetSelected(configInfo.WorkType)
|
||||
} else {
|
||||
radio.SetSelected("Local")
|
||||
}
|
||||
|
||||
log_view = ui2.NewLogLabel("等待启动")
|
||||
LogInit(log_view)
|
||||
|
||||
start_button_stats = 0
|
||||
start_button_activity = widget.NewActivity()
|
||||
start_button = widget.NewButton("点击启动", start_button_click)
|
||||
start_button.Importance = widget.HighImportance
|
||||
start_button.Resize(fyne.NewSize(100, 40))
|
||||
start_button.Disable()
|
||||
go func() {
|
||||
pro.Init("", "", 0)
|
||||
start_button.Enable()
|
||||
}()
|
||||
|
||||
myWindow.SetContent(container.New(layout.NewVBoxLayout(),
|
||||
container.New(layout.NewFormLayout(), widget.NewRichTextWithText("工作端侧: "), radio),
|
||||
container.New(layout.NewFormLayout(), widget.NewRichTextWithText("连接密钥: "), keyValidated),
|
||||
container.NewGridWithColumns(3, key_create_button, key_copy_button, key_paste_button),
|
||||
localUI_Container, remoteUI_Container,
|
||||
container.New(layout.NewFormLayout(), widget.NewRichTextWithText("当前状态: "), log_view),
|
||||
container.NewStack(start_button, start_button_activity)))
|
||||
myWindow.SetContent(main_ui)
|
||||
|
||||
myWindow.SetCloseIntercept(func() {
|
||||
myWindow.Hide()
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//go:build windows
|
||||
|
||||
package ui2
|
||||
|
||||
import (
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//go:build windows
|
||||
|
||||
package ui2
|
||||
|
||||
import (
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//go:build windows
|
||||
|
||||
package ui2
|
||||
|
||||
import (
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//go:build windows
|
||||
|
||||
package ui2
|
||||
|
||||
import (
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
//go:build windows
|
||||
|
||||
package ui2
|
||||
|
||||
import (
|
||||
|
||||
249
ui2/ui.go
Normal file
249
ui2/ui.go
Normal file
@@ -0,0 +1,249 @@
|
||||
//go:build windows
|
||||
|
||||
package ui2
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"errors"
|
||||
"gogo"
|
||||
"log"
|
||||
"sync"
|
||||
"time"
|
||||
|
||||
"goodlink/config"
|
||||
"goodlink/pro"
|
||||
_ "goodlink/pro"
|
||||
"goodlink/tools"
|
||||
|
||||
_ "embed"
|
||||
_ "net/http/pprof"
|
||||
|
||||
"fyne.io/fyne/v2"
|
||||
"fyne.io/fyne/v2/container"
|
||||
"fyne.io/fyne/v2/layout"
|
||||
"fyne.io/fyne/v2/widget"
|
||||
"github.com/atotto/clipboard"
|
||||
)
|
||||
|
||||
var (
|
||||
m_local_ip string
|
||||
m_remote_addr string
|
||||
key_box *fyne.Container
|
||||
myWindow fyne.Window
|
||||
m_start_mg sync.WaitGroup
|
||||
m_start_lock sync.Mutex
|
||||
start_button *widget.Button
|
||||
radio *widget.RadioGroup
|
||||
keyValidated *widget.Entry
|
||||
localUI *LocalUI
|
||||
remoteUI *RemoteUI
|
||||
key_create_button *widget.Button
|
||||
key_paste_button *widget.Button
|
||||
start_button_activity *widget.Activity
|
||||
log_view *LogLabel
|
||||
start_button_stats int
|
||||
)
|
||||
|
||||
const (
|
||||
M_APP_TITLE = "GoodLink"
|
||||
)
|
||||
|
||||
func LogInit(log_view *LogLabel) {
|
||||
gogo.Log().RegistInfo(func(content string) {
|
||||
SetLogLabel(content)
|
||||
log.Println(content)
|
||||
})
|
||||
gogo.Log().RegistDebug(func(content string) {
|
||||
SetLogLabel(content)
|
||||
})
|
||||
gogo.Log().RegistError(func(content string) {
|
||||
SetLogLabel(content)
|
||||
fyne.LogError("error: ", errors.New(content))
|
||||
})
|
||||
}
|
||||
|
||||
func start_button_click_1(content string) {
|
||||
start_button.Disable()
|
||||
radio.Disable()
|
||||
keyValidated.Disable()
|
||||
localUI.Disable()
|
||||
key_create_button.Disable()
|
||||
key_paste_button.Disable()
|
||||
start_button_activity.Start()
|
||||
start_button_activity.Show()
|
||||
log_view.SetText(content)
|
||||
start_button_stats = 1
|
||||
}
|
||||
|
||||
func start_button_click_0() {
|
||||
radio.Enable()
|
||||
keyValidated.Enable()
|
||||
localUI.Enable()
|
||||
key_create_button.Enable()
|
||||
key_paste_button.Enable()
|
||||
start_button_activity.Stop()
|
||||
start_button_activity.Hide()
|
||||
}
|
||||
|
||||
func start_button_click() {
|
||||
m_start_lock.Lock()
|
||||
defer m_start_lock.Unlock()
|
||||
|
||||
var err error
|
||||
var remote_addr string
|
||||
var local_addr string
|
||||
|
||||
//先对需要填写的数据进行校验
|
||||
switch start_button_stats {
|
||||
case 0:
|
||||
if len(keyValidated.Text) < 16 {
|
||||
SetLogLabel("请输入或点击生成连接密钥!")
|
||||
return
|
||||
}
|
||||
switch radio.Selected {
|
||||
case "Local":
|
||||
if local_addr, err = localUI.GetLocalAddr(); err != nil {
|
||||
SetLogLabel(err.Error())
|
||||
return
|
||||
}
|
||||
case "Remote":
|
||||
if remote_addr, err = remoteUI.GetRemoteAddr(); err != nil {
|
||||
SetLogLabel(err.Error())
|
||||
return
|
||||
}
|
||||
}
|
||||
|
||||
log.Println(local_addr)
|
||||
|
||||
configByte, _ := json.Marshal(&config.ConfigInfo{
|
||||
WorkType: radio.Selected,
|
||||
TunKey: keyValidated.Text,
|
||||
ConnType: localUI.GetConnType2(),
|
||||
LocalIP: localUI.GetLocalIP(),
|
||||
LocalPort: localUI.GetLocalPort(),
|
||||
RemoteType: remoteUI.GetRemoteType(),
|
||||
RemoteIP: remoteUI.GetRemoteIP(),
|
||||
RemotePort: remoteUI.GetRemotePort(),
|
||||
})
|
||||
log.Println(string(configByte))
|
||||
gogo.Utils().FileDel("goodlink.json")
|
||||
gogo.Utils().FileAppend("goodlink.json", configByte)
|
||||
}
|
||||
|
||||
switch start_button_stats {
|
||||
case 0:
|
||||
start_button_click_1("正在启动...")
|
||||
|
||||
go func() {
|
||||
time.Sleep(time.Second * 1)
|
||||
start_button.Enable()
|
||||
|
||||
for start_button_stats == 1 {
|
||||
if pro.GetLocalStats() == 2 {
|
||||
log_view.SetText("连接成功")
|
||||
break
|
||||
}
|
||||
time.Sleep(time.Millisecond * 200)
|
||||
}
|
||||
}()
|
||||
|
||||
switch radio.Selected {
|
||||
case "Local":
|
||||
m_start_mg.Add(1)
|
||||
go func() {
|
||||
defer m_start_mg.Done()
|
||||
if err := pro.RunLocal(localUI.GetConnType(), remote_addr, keyValidated.Text); err != nil {
|
||||
SetLogLabel(err.Error())
|
||||
start_button_stats = 0
|
||||
return
|
||||
}
|
||||
}()
|
||||
}
|
||||
|
||||
case 1:
|
||||
start_button.Disable()
|
||||
log_view.SetText("正在停止...")
|
||||
start_button_stats = 0
|
||||
|
||||
switch radio.Selected {
|
||||
case "Local":
|
||||
go func() {
|
||||
pro.StopLocal()
|
||||
m_start_mg.Wait()
|
||||
start_button_click_0()
|
||||
}()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func GetMainUI(myWindow *fyne.Window) *fyne.Container {
|
||||
var configInfo config.ConfigInfo
|
||||
json.Unmarshal(gogo.Utils().FileReadAll("goodlink.json"), &configInfo)
|
||||
log.Println(configInfo)
|
||||
|
||||
keyValidated = widget.NewEntry()
|
||||
keyValidated.SetPlaceHolder("自定义16-24字节长度")
|
||||
if len(configInfo.TunKey) > 0 {
|
||||
keyValidated.SetText(configInfo.TunKey)
|
||||
}
|
||||
|
||||
key_create_button = widget.NewButton("生成密钥", func() {
|
||||
keyValidated.SetText(tools.RandomString(24))
|
||||
})
|
||||
key_copy_button := widget.NewButton("复制密钥", func() {
|
||||
clipboard.WriteAll(keyValidated.Text)
|
||||
})
|
||||
key_paste_button = widget.NewButton("粘贴密钥", func() {
|
||||
if s, err := clipboard.ReadAll(); err == nil {
|
||||
keyValidated.SetText(s)
|
||||
}
|
||||
})
|
||||
|
||||
localUI = NewLocalUI(myWindow, &configInfo)
|
||||
localUI_Container := localUI.GetContainer()
|
||||
|
||||
remoteUI = NewRemoteUI(myWindow, &configInfo)
|
||||
remoteUI_Container := remoteUI.GetContainer()
|
||||
|
||||
radio = widget.NewRadioGroup([]string{"Remote", "Local"}, nil)
|
||||
radio.Horizontal = true
|
||||
radio.OnChanged = func(value string) {
|
||||
switch value {
|
||||
case "Remote":
|
||||
localUI_Container.Hide()
|
||||
remoteUI_Container.Show()
|
||||
case "Local":
|
||||
remoteUI_Container.Hide()
|
||||
localUI_Container.Show()
|
||||
default:
|
||||
radio.SetSelected("Local")
|
||||
}
|
||||
}
|
||||
if len(configInfo.WorkType) > 0 {
|
||||
radio.SetSelected(configInfo.WorkType)
|
||||
} else {
|
||||
radio.SetSelected("Local")
|
||||
}
|
||||
|
||||
log_view = NewLogLabel("等待启动")
|
||||
LogInit(log_view)
|
||||
|
||||
start_button_stats = 0
|
||||
start_button_activity = widget.NewActivity()
|
||||
start_button = widget.NewButton("点击启动", start_button_click)
|
||||
start_button.Importance = widget.HighImportance
|
||||
start_button.Resize(fyne.NewSize(100, 40))
|
||||
start_button.Disable()
|
||||
go func() {
|
||||
pro.Init("", "", 0)
|
||||
start_button.Enable()
|
||||
}()
|
||||
|
||||
return container.New(layout.NewVBoxLayout(),
|
||||
container.New(layout.NewFormLayout(), widget.NewRichTextWithText("工作端侧: "), radio),
|
||||
container.New(layout.NewFormLayout(), widget.NewRichTextWithText("连接密钥: "), keyValidated),
|
||||
container.NewGridWithColumns(3, key_create_button, key_copy_button, key_paste_button),
|
||||
localUI_Container, remoteUI_Container,
|
||||
container.New(layout.NewFormLayout(), widget.NewRichTextWithText("当前状态: "), log_view),
|
||||
container.NewStack(start_button, start_button_activity))
|
||||
}
|
||||
Reference in New Issue
Block a user