/
SelectInterfaceWidget.go
72 lines (58 loc) · 1.84 KB
/
SelectInterfaceWidget.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
package main
import (
"strings"
"github.com/google/gopacket/pcap"
"github.com/therecipe/qt/core"
"github.com/therecipe/qt/gui"
"github.com/therecipe/qt/widgets"
)
func NewSelectInterfaceWidget(parent widgets.QWidget_ITF, callback func(string, bool)) error {
window := widgets.NewQWidget(parent, core.Qt__Window)
window.SetWindowTitle("Choose network interface")
layout := NewTopAlignLayout()
usePromisc := widgets.NewQCheckBox2("Use promiscuous mode", nil)
layout.AddWidget(usePromisc, 0, 0)
itfLabel := NewLabel("Interface:")
layout.AddWidget(itfLabel, 0, 0)
interfaces := widgets.NewQTreeView(nil)
standardModel := NewProperSortModel(interfaces)
standardModel.SetHorizontalHeaderLabels([]string{"Interface Name", "IP addresses"})
rootNode := standardModel.InvisibleRootItem()
devs, err := pcap.FindAllDevs()
if err != nil {
return err
}
for _, dev := range devs {
if len(dev.Addresses) < 1 {
println("skip", dev.Name)
continue
}
var addrStringBuilder strings.Builder
for _, addr := range dev.Addresses {
addrStringBuilder.WriteString(addr.IP.String())
addrStringBuilder.WriteString(", ")
}
rootNode.AppendRow([]*gui.QStandardItem{
NewStringItem(dev.Name),
// Remove trailing comma
NewStringItem(addrStringBuilder.String()[:addrStringBuilder.Len()-2]),
})
}
interfaces.SetModel(standardModel)
interfaces.SetSelectionMode(1)
layout.AddWidget(interfaces, 0, 0)
okButton := widgets.NewQPushButton2("Capture", nil)
layout.AddWidget(okButton, 0, 0)
okButton.ConnectReleased(func() {
if len(interfaces.SelectedIndexes()) < 1 {
return
}
useInterface := standardModel.Item(interfaces.SelectedIndexes()[0].Row(), 0).Data(0).ToString()
promisc := usePromisc.CheckState() == core.Qt__Checked
window.Close()
callback(useInterface, promisc)
})
window.SetLayout(layout)
window.Show()
return nil
}