package ui import ( "fmt" "strconv" "fyne.io/fyne/v2" "fyne.io/fyne/v2/container" "fyne.io/fyne/v2/layout" "fyne.io/fyne/v2/theme" "fyne.io/fyne/v2/widget" "gitea.mmo.to/ppForge/ppforge/protocol" "gitea.mmo.to/ppForge/ppforge/protocolctl" ) // FieldEditor is a struct holding all elements of the field editor ui type FieldEditor struct { Representation *fyne.Container NameValue *widget.Entry DescValue *widget.Entry RegExValue *widget.Entry SizeLabel *widget.Label SizeValue *widget.Entry SizeInBits bool OptionalCheck *widget.Check PayloadCheck *widget.Check // to be filled with needed things Reference *protocol.Field Index int } // CreateFieldEditor initializes a new field editor ui for an editor and a protocol func CreateFieldEditor(ed *ProtocolEditor, index int, ref *protocol.Field) *FieldEditor { fc := &FieldEditor{} fc.Reference = ref fc.Index = index setfunc := func(s string) { bits := 0 if !fc.SizeInBits { bits, _ = strconv.Atoi(fc.SizeValue.Text) bits *= 8 } else { bits, _ = strconv.Atoi(fc.SizeValue.Text) } protocolctl.UpdateFieldByElement( ed.Reference, fc.Index, protocolctl.NewField( fc.NameValue.Text, fc.DescValue.Text, fc.RegExValue.Text, bits, nil, //TODO: implement subfields fc.OptionalCheck.Checked, fc.PayloadCheck.Checked, ), ) fmt.Printf("%s", protocolctl.ToJson(ed.Reference)) } fc.Representation = container.New(layout.NewFormLayout()) toolbar := widget.NewToolbar() toolbar.Append(widget.NewToolbarAction(theme.DeleteIcon(), func() { protocolctl.RemoveFieldByElement(ed.Reference, fc.Index) ed.Redraw() })) fc.Representation.Add(toolbar) addtool := widget.NewToolbar() addtool.Append(widget.NewToolbarSpacer()) addtool.Append(widget.NewToolbarAction(theme.ContentAddIcon(), func() { protocolctl.AddField(ed.Reference, fc.Index+1, protocolctl.NewEmptyField()) ed.Redraw() })) fc.Representation.Add(container.NewBorder(nil, nil, nil, addtool, widget.NewLabel("Field Values"))) fc.Representation.Add(widget.NewLabel("Name")) fc.NameValue = widget.NewEntry() fc.NameValue.OnChanged = setfunc fc.Representation.Add(fc.NameValue) fc.Representation.Add(widget.NewLabel("Description")) fc.DescValue = widget.NewEntry() fc.DescValue.MultiLine = true fc.DescValue.OnChanged = setfunc fc.DescValue.SetMinRowsVisible(3) fc.Representation.Add(fc.DescValue) fc.Representation.Add(widget.NewLabel("RegEx")) fc.RegExValue = widget.NewEntry() fc.RegExValue.OnChanged = setfunc fc.Representation.Add(fc.RegExValue) fc.SizeLabel = widget.NewLabel("Bytes") toggleBtn := widget.NewButton("T", func() { if fc.SizeInBits { fc.SizeLabel.SetText("Bytes") } else { fc.SizeLabel.SetText("Bits") } fc.SizeInBits = !fc.SizeInBits setfunc("") // bogus call to reflect the change }) fc.Representation.Add(container.NewHBox(toggleBtn, fc.SizeLabel)) fc.SizeValue = widget.NewEntry() fc.SizeValue.OnChanged = setfunc fc.Representation.Add(fc.SizeValue) fc.Representation.Add(widget.NewLabel("Settings")) fc.OptionalCheck = widget.NewCheck("Optional", func(b bool) { fc.Reference.Optional = b setfunc("") }) fc.PayloadCheck = widget.NewCheck("Payload", func(b bool) { fc.Reference.Payload = b setfunc("") }) fc.Representation.Add(container.NewHBox(fc.OptionalCheck, fc.PayloadCheck)) fc.NameValue.Text = fc.Reference.Name fc.DescValue.Text = fc.Reference.Desc fc.RegExValue.Text = fc.Reference.Regex fc.SizeValue.Text = strconv.Itoa(fc.Reference.Size) fc.SizeInBits = true fc.SizeLabel.SetText("Bits") fc.OptionalCheck.Checked = fc.Reference.Optional fc.PayloadCheck.Checked = fc.Reference.Payload fc.Representation.Refresh() return fc }