// добавить генерацию файлов с правилами в архив, добавить номера строк, что бы хоть как то ориентироваться и в жопу это package main import ( "fmt" "strings" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/widget" ) // widget.NewLabel(fmt.Sprintf("UFW\t%s\nNftables\t%s\nFirewalld\t%s\nIptables\t%s", server.Firewalls.Ufw, server.Firewalls.Nftables, server.Firewalls.Firewalld, server.Firewalls.Iptables)) func createFirewallTab(server outputStruct) *container.AppTabs { firewallTabs := container.NewAppTabs() firewallTabs.Append(container.NewTabItem("список фаерволов", createFirewallListTab(server))) firewallTabs.Append(container.NewTabItem("nft list ruleset", createNftListRuleset(server))) return firewallTabs } func createFirewallListTab(server outputStruct) *fyne.Container { firewalls := "" if server.Firewalls.Firewalld != "" { firewalls = firewalls + "firewalld" } if server.Firewalls.Nftables != "" { firewalls = firewalls + ", nftables" } if server.Firewalls.Ufw != "" { firewalls = firewalls + ", ufw" } tab := container.NewBorder( container.NewVBox( widget.NewSeparator(), widget.NewLabel(fmt.Sprintf("Активные службы фаерволов: %s", firewalls)), ), nil, nil, nil, ) return tab } func createNftListRuleset(server outputStruct) *fyne.Container { searchEntry := widget.NewEntry() searchEntry.SetPlaceHolder("Поиск ...") filteredEntries := server.NftRuleset.Lines list := widget.NewList( func() int { return len(filteredEntries) }, func() fyne.CanvasObject { return container.NewVBox( widget.NewLabel("fileName"), ) }, func(id widget.ListItemID, obj fyne.CanvasObject) { box := obj.(*fyne.Container) e := filteredEntries[id] fileName := box.Objects[0].(*widget.Label) fileName.SetText(e) fileName.Selectable = true }, ) searchEntry.OnChanged = func(text string) { if text == "" { filteredEntries = server.NftRuleset.Lines } else { var filtered []string lText := strings.ToLower(text) for _, elem := range server.NftRuleset.Lines { if strings.Contains(strings.ToLower(elem), lText) { filtered = append(filtered, elem) } } filteredEntries = filtered } list.Refresh() } // searchEntry.OnChanged = func(text string) { // if text == "" { // // Если поиск пустой - сбрасываем выделение // list.UnselectAll() // return // } // lText := strings.ToLower(text) // // Ищем первое вхождение // for index, elem := range server.NftRuleset.Lines { // if strings.Contains(strings.ToLower(elem), lText) { // // Выделяем найденный элемент // list.Select(index) // // Прокручиваем к нему // list.ScrollTo(index) // return // } // } // // Если ничего не найдено - сбрасываем выделение // list.UnselectAll() // } tab := container.NewBorder( container.NewVBox( searchEntry, widget.NewSeparator(), ), nil, nil, nil, container.NewScroll(list), ) return tab }