2020-05-28 19:26:55 +00:00
|
|
|
|
package primitives
|
|
|
|
|
|
2020-06-07 07:06:13 +00:00
|
|
|
|
import (
|
|
|
|
|
"github.com/diamondburned/cchat-gtk/internal/gts"
|
|
|
|
|
"github.com/gotk3/gotk3/gdk"
|
|
|
|
|
"github.com/gotk3/gotk3/glib"
|
|
|
|
|
"github.com/gotk3/gotk3/gtk"
|
|
|
|
|
)
|
2020-05-28 19:26:55 +00:00
|
|
|
|
|
2020-06-13 07:29:32 +00:00
|
|
|
|
type Namer interface {
|
|
|
|
|
SetName(string)
|
|
|
|
|
GetName() (string, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func GetName(namer Namer) string {
|
|
|
|
|
nm, _ := namer.GetName()
|
|
|
|
|
return nm
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func EachChildren(w interface{ GetChildren() *glib.List }, fn func(i int, v interface{}) bool) {
|
|
|
|
|
var cursor int = -1
|
|
|
|
|
for ptr := w.GetChildren(); ptr != nil; ptr = ptr.Next() {
|
|
|
|
|
cursor++
|
|
|
|
|
|
|
|
|
|
if fn(cursor, ptr.Data()) {
|
|
|
|
|
return
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type DragSortable interface {
|
|
|
|
|
DragSourceSet(gdk.ModifierType, []gtk.TargetEntry, gdk.DragAction)
|
|
|
|
|
DragDestSet(gtk.DestDefaults, []gtk.TargetEntry, gdk.DragAction)
|
|
|
|
|
GetAllocation() *gtk.Allocation
|
|
|
|
|
Connector
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BindDragSortable(ds DragSortable, target, id string, fn func(id, target string)) {
|
|
|
|
|
var dragEntries = []gtk.TargetEntry{NewTargetEntry(target)}
|
|
|
|
|
var dragAtom = gdk.GdkAtomIntern(target, true)
|
|
|
|
|
|
|
|
|
|
// Drag source so you can drag the button away.
|
|
|
|
|
ds.DragSourceSet(gdk.BUTTON1_MASK, dragEntries, gdk.ACTION_MOVE)
|
|
|
|
|
|
|
|
|
|
// Drag destination so you can drag the button here.
|
|
|
|
|
ds.DragDestSet(gtk.DEST_DEFAULT_ALL, dragEntries, gdk.ACTION_MOVE)
|
|
|
|
|
|
|
|
|
|
ds.Connect("drag-data-get",
|
|
|
|
|
// TODO change ToggleButton.
|
|
|
|
|
func(ds DragSortable, ctx *gdk.DragContext, data *gtk.SelectionData) {
|
|
|
|
|
// Set the index-in-bytes.
|
|
|
|
|
data.SetData(dragAtom, []byte(id))
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
ds.Connect("drag-data-received",
|
|
|
|
|
func(ds DragSortable, ctx *gdk.DragContext, x, y uint, data *gtk.SelectionData) {
|
|
|
|
|
// Receive the incoming row's ID and call MoveSession.
|
|
|
|
|
fn(id, string(data.GetData()))
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
ds.Connect("drag-begin",
|
|
|
|
|
func(ds DragSortable, ctx *gdk.DragContext) {
|
|
|
|
|
gtk.DragSetIconName(ctx, "user-available-symbolic", 0, 0)
|
|
|
|
|
},
|
|
|
|
|
)
|
|
|
|
|
}
|
|
|
|
|
|
2020-05-28 19:26:55 +00:00
|
|
|
|
type StyleContexter interface {
|
|
|
|
|
GetStyleContext() (*gtk.StyleContext, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func AddClass(styleCtx StyleContexter, classes ...string) {
|
|
|
|
|
var style, _ = styleCtx.GetStyleContext()
|
|
|
|
|
for _, class := range classes {
|
|
|
|
|
style.AddClass(class)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Bin interface {
|
|
|
|
|
GetChild() (gtk.IWidget, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var _ Bin = (*gtk.Bin)(nil)
|
|
|
|
|
|
|
|
|
|
func BinLeftAlignLabel(bin Bin) {
|
|
|
|
|
widget, _ := bin.GetChild()
|
2020-06-04 23:00:41 +00:00
|
|
|
|
widget.(interface{ SetHAlign(gtk.Align) }).SetHAlign(gtk.ALIGN_START)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewButtonIcon(icon string) *gtk.Image {
|
|
|
|
|
img, _ := gtk.ImageNewFromIconName(icon, gtk.ICON_SIZE_BUTTON)
|
|
|
|
|
return img
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func NewImageIconPx(icon string, sizepx int) *gtk.Image {
|
|
|
|
|
img, _ := gtk.ImageNew()
|
|
|
|
|
SetImageIcon(img, icon, sizepx)
|
|
|
|
|
return img
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func SetImageIcon(img *gtk.Image, icon string, sizepx int) {
|
|
|
|
|
img.SetProperty("icon-name", icon)
|
|
|
|
|
img.SetProperty("pixel-size", sizepx)
|
|
|
|
|
img.SetSizeRequest(sizepx, sizepx)
|
2020-05-28 19:26:55 +00:00
|
|
|
|
}
|
2020-06-07 04:27:28 +00:00
|
|
|
|
|
2020-06-07 07:06:13 +00:00
|
|
|
|
func AppendMenuItems(menu interface{ Append(gtk.IMenuItem) }, items []*gtk.MenuItem) {
|
2020-06-07 04:27:28 +00:00
|
|
|
|
for _, item := range items {
|
2020-06-07 07:06:13 +00:00
|
|
|
|
menu.Append(item)
|
2020-06-07 04:27:28 +00:00
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2020-06-13 07:29:32 +00:00
|
|
|
|
func HiddenMenuItem(label string, fn interface{}) *gtk.MenuItem {
|
2020-06-07 04:27:28 +00:00
|
|
|
|
mb, _ := gtk.MenuItemNewWithLabel(label)
|
|
|
|
|
mb.Connect("activate", fn)
|
|
|
|
|
return mb
|
|
|
|
|
}
|
2020-06-07 07:06:13 +00:00
|
|
|
|
|
2020-06-13 07:29:32 +00:00
|
|
|
|
func MenuItem(label string, fn interface{}) *gtk.MenuItem {
|
2020-06-07 07:06:13 +00:00
|
|
|
|
menuitem := HiddenMenuItem(label, fn)
|
|
|
|
|
menuitem.Show()
|
|
|
|
|
return menuitem
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
type Connector interface {
|
|
|
|
|
Connect(string, interface{}, ...interface{}) (glib.SignalHandle, error)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func BindMenu(menu *gtk.Menu, connector Connector) {
|
|
|
|
|
connector.Connect("event", func(_ *gtk.ToggleButton, ev *gdk.Event) {
|
|
|
|
|
if gts.EventIsRightClick(ev) {
|
|
|
|
|
menu.PopupAtPointer(ev)
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
}
|
2020-06-13 07:29:32 +00:00
|
|
|
|
|
|
|
|
|
func NewTargetEntry(target string) gtk.TargetEntry {
|
|
|
|
|
e, _ := gtk.TargetEntryNew(target, gtk.TARGET_SAME_APP, 0)
|
|
|
|
|
return *e
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// func
|