mirror of
https://github.com/akiyosi/goneovim.git
synced 2025-08-28 13:48:24 +02:00
293 lines
6.4 KiB
Go
293 lines
6.4 KiB
Go
package util
|
|
|
|
import (
|
|
"os/user"
|
|
"path/filepath"
|
|
"strings"
|
|
|
|
"github.com/therecipe/qt/core"
|
|
"github.com/therecipe/qt/gui"
|
|
"github.com/therecipe/qt/widgets"
|
|
)
|
|
|
|
// ReflectToInt converts interface{} to int
|
|
func ReflectToInt(iface interface{}) int {
|
|
i, ok := iface.(int64)
|
|
if ok {
|
|
return int(i)
|
|
}
|
|
j, ok := iface.(uint64)
|
|
if ok {
|
|
return int(j)
|
|
}
|
|
k, ok := iface.(int)
|
|
if ok {
|
|
return int(k)
|
|
}
|
|
l, ok := iface.(uint)
|
|
if ok {
|
|
return int(l)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// ReflectToFloat converts interface{} to float64
|
|
func ReflectToFloat(iface interface{}) float64 {
|
|
i, ok := iface.(float64)
|
|
if ok {
|
|
return i
|
|
}
|
|
u, ok := iface.(float32)
|
|
if ok {
|
|
return float64(u)
|
|
}
|
|
return 0
|
|
}
|
|
|
|
// IsZero determines if the value of interface{} is zero
|
|
func IsZero(d interface{}) bool {
|
|
if d == nil {
|
|
return false
|
|
}
|
|
switch a := d.(type) {
|
|
case int64:
|
|
if a == 0 {
|
|
return true
|
|
}
|
|
case uint64:
|
|
if a == 0 {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// IsTrue determines the truth of the value of interface{}
|
|
func IsTrue(d interface{}) bool {
|
|
if d == nil {
|
|
return false
|
|
}
|
|
switch a := d.(type) {
|
|
case int64:
|
|
if a == 1 {
|
|
return true
|
|
}
|
|
case uint64:
|
|
if a == 1 {
|
|
return true
|
|
}
|
|
}
|
|
return false
|
|
}
|
|
|
|
// SplitVimscript splits Vimscript read as a character string with line breaks and converts it to a list format character string
|
|
func SplitVimscript(s string) string {
|
|
if string(s[0]) == "\n" {
|
|
s = strings.TrimPrefix(s, string("\n"))
|
|
}
|
|
listLines := "["
|
|
lines := strings.Split(s, "\n")
|
|
for i, line := range lines {
|
|
listLines = listLines + `'` + line + `'`
|
|
if i == len(lines)-1 {
|
|
listLines = listLines + "]"
|
|
} else {
|
|
listLines = listLines + ","
|
|
}
|
|
}
|
|
|
|
return listLines
|
|
}
|
|
|
|
// DropShadow drops a shadow
|
|
func DropShadow(x, y, radius float64, alpha int) *widgets.QGraphicsDropShadowEffect {
|
|
shadow := widgets.NewQGraphicsDropShadowEffect(nil)
|
|
shadow.SetBlurRadius(radius)
|
|
shadow.SetColor(gui.NewQColor3(0, 0, 0, alpha))
|
|
shadow.SetOffset2(x, y)
|
|
|
|
return shadow
|
|
}
|
|
|
|
// NewHFlowLayout is a horizontal flow layout. See https://doc.qt.io/qt-5.9/qtwidgets-layouts-flowlayout-example.html
|
|
func NewHFlowLayout(spacing int, padding int, paddingTop int, rightIdex int, width int) *widgets.QLayout {
|
|
layout := widgets.NewQLayout2()
|
|
items := []*widgets.QLayoutItem{}
|
|
rect := core.NewQRect()
|
|
layout.ConnectSizeHint(func() *core.QSize {
|
|
size := core.NewQSize()
|
|
for _, item := range items {
|
|
size = size.ExpandedTo(item.MinimumSize())
|
|
}
|
|
return size
|
|
})
|
|
if width > 0 {
|
|
layout.ConnectMinimumSize(func() *core.QSize {
|
|
size := core.NewQSize()
|
|
for _, item := range items {
|
|
size = size.ExpandedTo(item.MinimumSize())
|
|
}
|
|
if size.Width() > width {
|
|
size.SetWidth(width)
|
|
}
|
|
// size.SetWidth(0)
|
|
return size
|
|
})
|
|
layout.ConnectMaximumSize(func() *core.QSize {
|
|
size := core.NewQSize()
|
|
for _, item := range items {
|
|
size = size.ExpandedTo(item.MinimumSize())
|
|
}
|
|
// size.SetWidth(width)
|
|
return size
|
|
})
|
|
}
|
|
layout.ConnectAddItem(func(item *widgets.QLayoutItem) {
|
|
items = append(items, item)
|
|
})
|
|
layout.ConnectSetGeometry(func(r *core.QRect) {
|
|
sizes := [][]int{}
|
|
maxWidth := 0
|
|
for _, item := range items {
|
|
sizeHint := item.SizeHint()
|
|
width := sizeHint.Width()
|
|
height := sizeHint.Height()
|
|
size := []int{width, height}
|
|
sizes = append(sizes, size)
|
|
if width > maxWidth {
|
|
maxWidth = width
|
|
}
|
|
}
|
|
y := 0
|
|
for i, item := range items {
|
|
size := sizes[i]
|
|
height := size[1]
|
|
rect.SetRect(0, y, maxWidth, height)
|
|
item.SetGeometry(rect)
|
|
y += height
|
|
}
|
|
})
|
|
layout.ConnectItemAt(func(index int) *widgets.QLayoutItem {
|
|
if index < len(items) {
|
|
return items[index]
|
|
}
|
|
return nil
|
|
})
|
|
layout.ConnectTakeAt(func(index int) *widgets.QLayoutItem {
|
|
if index < len(items) {
|
|
return items[index]
|
|
}
|
|
return nil
|
|
})
|
|
return layout
|
|
}
|
|
|
|
// NewVFlowLayout is a vertical flow layout. See https://doc.qt.io/qt-5.9/qtwidgets-layouts-flowlayout-example.html
|
|
func NewVFlowLayout(spacing int, padding int, paddingTop int, rightIdex int, width int) *widgets.QLayout {
|
|
layout := widgets.NewQLayout2()
|
|
items := []*widgets.QLayoutItem{}
|
|
rect := core.NewQRect()
|
|
layout.ConnectSizeHint(func() *core.QSize {
|
|
size := core.NewQSize()
|
|
for _, item := range items {
|
|
size = size.ExpandedTo(item.MinimumSize())
|
|
}
|
|
return size
|
|
})
|
|
if width > 0 {
|
|
layout.ConnectMinimumSize(func() *core.QSize {
|
|
size := core.NewQSize()
|
|
for _, item := range items {
|
|
size = size.ExpandedTo(item.MinimumSize())
|
|
}
|
|
if size.Width() > width {
|
|
size.SetWidth(width)
|
|
}
|
|
size.SetWidth(0)
|
|
return size
|
|
})
|
|
layout.ConnectMaximumSize(func() *core.QSize {
|
|
size := core.NewQSize()
|
|
for _, item := range items {
|
|
size = size.ExpandedTo(item.MinimumSize())
|
|
}
|
|
size.SetWidth(width)
|
|
return size
|
|
})
|
|
}
|
|
layout.ConnectAddItem(func(item *widgets.QLayoutItem) {
|
|
items = append(items, item)
|
|
})
|
|
layout.ConnectSetGeometry(func(r *core.QRect) {
|
|
x := padding
|
|
right := padding
|
|
sizes := [][]int{}
|
|
maxHeight := 0
|
|
totalWidth := r.Width()
|
|
for _, item := range items {
|
|
sizeHint := item.SizeHint()
|
|
width := sizeHint.Width()
|
|
height := sizeHint.Height()
|
|
size := []int{width, height}
|
|
sizes = append(sizes, size)
|
|
if height > maxHeight {
|
|
maxHeight = height
|
|
}
|
|
}
|
|
for i, item := range items {
|
|
size := sizes[i]
|
|
width := size[0]
|
|
height := size[1]
|
|
y := paddingTop
|
|
if height != maxHeight {
|
|
y = (maxHeight-height)/2 + paddingTop
|
|
}
|
|
|
|
if rightIdex > 0 && i >= rightIdex {
|
|
rect.SetRect(totalWidth-width-right, y, width, height)
|
|
item.SetGeometry(rect)
|
|
if width > 0 {
|
|
right += width + spacing
|
|
}
|
|
} else {
|
|
if x+width+padding > totalWidth {
|
|
width = totalWidth - x - padding
|
|
rect.SetRect(x, y, width, height)
|
|
item.SetGeometry(rect)
|
|
break
|
|
}
|
|
rect.SetRect(x, y, width, height)
|
|
item.SetGeometry(rect)
|
|
if width > 0 {
|
|
x += width + spacing
|
|
}
|
|
}
|
|
}
|
|
})
|
|
layout.ConnectItemAt(func(index int) *widgets.QLayoutItem {
|
|
if index < len(items) {
|
|
return items[index]
|
|
}
|
|
return nil
|
|
})
|
|
layout.ConnectTakeAt(func(index int) *widgets.QLayoutItem {
|
|
if index < len(items) {
|
|
return items[index]
|
|
}
|
|
return nil
|
|
})
|
|
return layout
|
|
}
|
|
|
|
// ExpandTildeToHomeDirectory is a function that expand '~' to absolute home directory path
|
|
func ExpandTildeToHomeDirectory(path string) (string, error) {
|
|
if len(path) == 0 || path[0] != '~' {
|
|
return path, nil
|
|
}
|
|
|
|
usr, err := user.Current()
|
|
if err != nil {
|
|
return "", err
|
|
}
|
|
return filepath.Join(usr.HomeDir, path[1:]), nil
|
|
}
|