-
Notifications
You must be signed in to change notification settings - Fork 0
/
twins.go
100 lines (89 loc) · 2.29 KB
/
twins.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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
// Copyright (c) 2020, The GoKi Authors. All rights reserved.
// Use of this source code is governed by a BSD-style
// license that can be found in the LICENSE file.
package texteditor
import (
"goki.dev/gi/v2/gi"
"goki.dev/girl/styles"
"goki.dev/girl/units"
"goki.dev/ki/v2"
"goki.dev/mat32/v2"
)
// TwinEditors presents two side-by-side [Editor]s in [gi.Splits]
// that scroll in sync with each other.
type TwinEditors struct {
gi.Splits
// textbuf for A
BufA *Buf `json:"-" xml:"-"`
// textbuf for B
BufB *Buf `json:"-" xml:"-"`
}
func (te *TwinEditors) OnInit() {
te.Dim = mat32.X
te.Style(func(s *styles.Style) {
s.SetStretchMax()
})
te.OnWidgetAdded(func(w gi.Widget) {
switch w.PathFrom(te) {
case "text-a", "text-b":
w.Style(func(s *styles.Style) {
s.SetStretchMax()
s.SetMinPrefWidth(units.Ch(80))
s.SetMinPrefHeight(units.Em(40))
s.Font.Family = string(gi.Prefs.MonoFont)
})
}
})
}
// MakeBufs ensures that the Bufs are made, if nil
func (te *TwinEditors) MakeBufs() {
if te.BufA != nil {
return
}
te.BufA = NewBuf()
te.BufB = NewBuf()
}
// SetFiles sets files for each text buf
func (te *TwinEditors) SetFiles(fileA, fileB string, lineNos bool) {
te.MakeBufs()
te.BufA.Filename = gi.FileName(fileA)
te.BufA.Opts.LineNos = lineNos
te.BufA.Stat() // update markup
te.BufB.Filename = gi.FileName(fileB)
te.BufB.Opts.LineNos = lineNos
te.BufB.Stat() // update markup
}
func (te *TwinEditors) ConfigTexts() {
te.MakeBufs()
config := ki.Config{}
config.Add(EditorType, "text-a")
config.Add(EditorType, "text-b")
mods, updt := te.ConfigChildren(config)
if !mods {
updt = te.UpdateStart()
} else {
ae, be := te.Editors()
ae.SetBuf(te.BufA)
be.SetBuf(te.BufB)
// sync scrolling
// al.ScrollSig.Connect(te.This(), func(recv, send ki.Ki, sig int64, data any) {
// dm := mat32.Dims(sig)
// if dm == mat32.Y {
// bl.ScrollToPos(dm, data.(float32))
// }
// })
// bl.ScrollSig.Connect(te.This(), func(recv, send ki.Ki, sig int64, data any) {
// dm := mat32.Dims(sig)
// if dm == mat32.Y {
// al.ScrollToPos(dm, data.(float32))
// }
// })
}
te.UpdateEnd(updt)
}
// Editors returns the two text Editors
func (te *TwinEditors) Editors() (*Editor, *Editor) {
ae := te.Child(0).(*Editor)
be := te.Child(1).(*Editor)
return ae, be
}