// Copyright 2025 WIT.COM Inc Licensed GPL 3.0 package cobol import ( "fmt" "time" "go.wit.com/lib/gui/shell" "go.wit.com/lib/protobuf/guipb" "go.wit.com/log" "google.golang.org/protobuf/proto" "google.golang.org/protobuf/types/known/anypb" "google.golang.org/protobuf/types/known/timestamppb" "google.golang.org/protobuf/types/known/wrapperspb" ) func PrintTable(pb *guipb.Table) { log.Info("print PB here") if pb.Grid == nil { log.Info("grid = nil") } else { log.Info("grid.Id =", pb.Grid.Id) } var h int = 0 var w int = 0 for _, name := range pb.Order { if addTableRow(pb, name, w) { log.Info("tree:row() COLUMN GOOD", pb.Title, name, w, h) h += 1 } else { log.Info("tree:row() COLOMN FAIL", pb.Title, name, w, h) } w += 1 } } func addTableRow(t *guipb.Table, name string, w int) bool { var h int = 0 for _, r := range t.StringRows { if name != r.Header.Name { // log.Info("skip string row:", r.Header.Name, "!=", name) continue } log.Info("tree: Add()ing to grid here", r.Header.Id, r.Header.Name, w, h) for i, v := range r.Vals { log.Info("String Row", i, w, v) } makeGridLabel(r.Header, w, h) h += 1 for _, v := range r.Widgets { log.Info("tree: Add()ing to grid here", v.Id, v.Name, w, h) makeGridLabel(v, w, h) h += 1 } return true } for _, r := range t.ButtonRows { if name != r.Header.Name { // log.Info("skip string row:", r.Header.Name, "!=", name) continue } log.Info("tree: Add()ing to grid here", r.Header.Id, r.Header.Name, w, h) for i, v := range r.Vals { log.Info("Button Row", i, v) } makeGridLabel(r.Header, w, h) h += 1 for _, v := range r.Widgets { log.Info("tree: Add()ing to grid here", v.Id, v.Name, w, h) makeGridLabel(v, w, h) h += 1 } return true } for _, r := range t.IntRows { if name != r.Header.Name { // log.Info("skip sint row:", r.Header.Name, "!=", name) continue } log.Info("tree: Add()ing to grid here", r.Header.Id, r.Header.Name, w, h) makeGridLabel(r.Header, w, h) h += 1 for _, v := range r.Widgets { vi, err := extractInt64(v.Val) if err != nil { log.Warn("int error", err) } v.Name = fmt.Sprintf("%d", vi) // log.Info("tree: Add()ing to grid here", v.Id, v.Name, w, h) makeGridLabel(v, w, h) h += 1 } return true } for _, r := range t.TimeRows { if name != r.Header.Name { // log.Info("skip sint row:", r.Header.Name, "!=", name) continue } // log.Info("tree: Add()ing to grid here", r.Header.Id, r.Header.Name, w, h) makeGridLabel(r.Header, w, h) h += 1 for _, widg := range r.Widgets { msg, err := anypb.UnmarshalNew(widg.Val, proto.UnmarshalOptions{}) if err != nil { log.Fatalf("failed to unmarshal: %v", err) } switch v := msg.(type) { case *timestamppb.Timestamp: // fmt.Println("Unpacked Timestamp:", shell.FormatDuration(time.Since(v.AsTime()))) widg.Name = shell.FormatDuration(time.Since(v.AsTime())) default: fmt.Println("Unknown type:", v) widg.Name = fmt.Sprintf("%v", v) } // log.Info("tree: Add()ing to grid here", widg.Id, widg.Name, w, h) makeGridLabel(widg, w, h) h += 1 } return true } return false } func makeGridLabel(pb *guipb.Widget, w int, h int) { log.Info("MAKE GRID LABEL", w, h, pb.Name) } func extractInt64(anyVal *anypb.Any) (int64, error) { val := &wrapperspb.Int64Value{} if err := anyVal.UnmarshalTo(val); err != nil { return 0, err } return val.Value, nil }