| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147 | package guiimport (	"embed"	"image/color"	"os"	"fyne.io/fyne/v2"	"fyne.io/fyne/v2/app"	"fyne.io/fyne/v2/container"	"fyne.io/fyne/v2/theme"	"fyne.io/fyne/v2/widget"	"github.com/agnivade/levenshtein"	"github.com/gravitl/netmaker/logger"	"github.com/gravitl/netmaker/netclient/functions"	"github.com/gravitl/netmaker/netclient/gui/components"	"github.com/gravitl/netmaker/netclient/gui/components/views"	"github.com/gravitl/netmaker/netclient/ncutils")//go:embed nm-logo-sm.pngvar logoContent embed.FS// Run - run's the netclient GUIfunc Run(networks []string) error {	defer func() {		if r := recover(); r != nil {			logger.Log(0, "No monitor detected, please use CLI commands; use -help for more info.")		}	}()	a := app.New()	window := a.NewWindow("Netclient - " + ncutils.Version)	img, err := logoContent.ReadFile("nm-logo-sm.png")	if err != nil {		logger.Log(0, "failed to read logo", err.Error())		return err	}	window.SetIcon(&fyne.StaticResource{StaticName: "Netmaker logo", StaticContent: img})	window.Resize(fyne.NewSize(600, 450))	networkView := container.NewVScroll(views.GetNetworksView(networks))	networkView.SetMinSize(fyne.NewSize(400, 300))	views.SetView(views.Networks, networkView)	netDetailsViews := container.NewVScroll(views.GetSingleNetworkView(""))	netDetailsViews.SetMinSize(fyne.NewSize(400, 300))	views.SetView(views.NetDetails, netDetailsViews)	window.SetFixedSize(false)	searchBar := widget.NewEntry()	searchBar.PlaceHolder = "Search a Network ..."	searchBar.TextStyle = fyne.TextStyle{		Italic: true,	}	searchBar.OnChanged = func(text string) {		if text == "" {			networkView = container.NewVScroll(views.GetNetworksView(networks))			networkView.SetMinSize(fyne.NewSize(400, 300))			views.RefreshComponent(views.Networks, networkView)			views.ShowView(views.Networks)			return		}		opts := []string{}		for _, n := range networks {			r := levenshtein.ComputeDistance(text, n)			if r <= 2 {				opts = append(opts, n)			}		}		// fmt.Println(opts)		networkView = container.NewVScroll(views.GetNetworksView(opts))		networkView.SetMinSize(fyne.NewSize(400, 300))		views.RefreshComponent(views.Networks, networkView)		views.ShowView(views.Networks)		opts = nil	}	toolbar := container.NewCenter(widget.NewToolbar(		components.NewToolbarLabelButton("Networks", theme.HomeIcon(), func() {			searchBar.Show()			views.ShowView(views.Networks)			views.ClearNotification()		}, components.Blue_color),		components.NewToolbarLabelButton("Join new", theme.ContentAddIcon(), func() {			searchBar.Hide()			views.ShowView(views.Join)		}, components.Gravitl_color),		components.NewToolbarLabelButton("Uninstall", theme.ErrorIcon(), func() {			searchBar.Hide()			confirmView := views.GetConfirmation("Confirm Netclient uninstall?", func() {				views.ShowView(views.Networks)			}, func() {				views.LoadingNotify()				err := functions.Uninstall()				if err != nil {					views.ErrorNotify("Failed to uninstall: \n" + err.Error())				} else {					views.SuccessNotify("Uninstalled Netclient!")				}				networks, err := ncutils.GetSystemNetworks()				if err != nil {					networks = []string{}				}				views.RefreshComponent(views.Networks, views.GetNetworksView(networks))				views.ShowView(views.Networks)			})			views.RefreshComponent(views.Confirm, confirmView)			views.ShowView(views.Confirm)		}, components.Red_color),		components.NewToolbarLabelButton("Close", theme.ContentClearIcon(), func() {			os.Exit(0)		}, components.Purple_color),	))	joinView := views.GetJoinView()	views.SetView(views.Join, joinView)	confirmView := views.GetConfirmation("", func() {}, func() {})	views.SetView(views.Confirm, confirmView)	views.ShowView(views.Networks)	initialNotification := views.GenerateNotification("", color.Transparent)	views.SetView(views.Notify, initialNotification)	views.CurrentContent = container.NewVBox()	views.CurrentContent.Add(container.NewGridWithRows(		2,		toolbar,		searchBar,	))	views.CurrentContent.Add(views.GetView(views.Networks))	views.CurrentContent.Add(views.GetView(views.NetDetails))	views.CurrentContent.Add(views.GetView(views.Notify))	views.CurrentContent.Add(views.GetView(views.Join))	window.SetContent(views.CurrentContent)	window.ShowAndRun()	return nil}
 |