cchat-gtk/internal/ui/service/session/serverpane/serverpane.go

65 lines
1.2 KiB
Go

package serverpane
import (
"github.com/gotk3/gotk3/gtk"
)
// Paned replaces gtk.Paned or gtk.Box to allow an optional second pane.
type Paned struct {
gtk.IWidget
Box *gtk.Box
orien gtk.Orientation
w1 gtk.IWidget
w2 gtk.IWidget
}
// NewPaned creates a new empty pane.
func NewPaned(w1 gtk.IWidget, o gtk.Orientation) *Paned {
// box holds either paned or w1.
box, _ := gtk.BoxNew(gtk.ORIENTATION_HORIZONTAL, 0)
box.PackStart(w1, true, true, 0)
return &Paned{
IWidget: box,
Box: box,
orien: o,
w1: w1,
}
}
func (p *Paned) Destroy() {
p.Box.Destroy()
*p = Paned{}
}
func (p *Paned) Show() {
p.Box.Show()
}
// AddSide adds a side widget. If a second widget is already added, then it is
// removed from the pane.
func (p *Paned) AddSide(w gtk.IWidget) {
if p.w2 != nil {
p.Box.Remove(p.w2)
}
p.w2 = w
p.Box.PackStart(p.w2, true, true, 0)
p.Box.SetChildPacking(p.w1, false, false, 0, gtk.PACK_START)
}
// Remove removes either w1 or w2. If neither matches, then nothing is done.
func (p *Paned) Remove(w gtk.IWidget) {
switch w {
case p.w1:
panic("p.w1 must not be removed")
case p.w2:
p.Box.Remove(p.w2)
p.w2 = nil
p.Box.SetChildPacking(p.w1, true, true, 0, gtk.PACK_START)
}
}