akiyosi.goneovim/util/utils.go
2020-11-28 09:21:42 +09:00

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
}