erm/internal/app/darktile/gui/manipulator.go
2021-07-30 23:29:20 +01:00

118 lines
2.5 KiB
Go

package gui
import (
"github.com/hajimehoshi/ebiten/v2"
"github.com/liamg/darktile/internal/app/darktile/termutil"
)
type WindowManipulator struct {
g *GUI
title string
titleStack []string
}
func NewManipulator(g *GUI) *WindowManipulator {
return &WindowManipulator{
g: g,
}
}
func (m *WindowManipulator) ReportError(err error) {
m.g.ShowError(err.Error())
}
func (m *WindowManipulator) CellSizeInPixels() (int, int) {
size := m.g.fontManager.CharSize()
return size.X, size.Y
}
func (m *WindowManipulator) Position() (int, int) {
return ebiten.WindowPosition()
}
func (m *WindowManipulator) GetTitle() string {
return m.title
}
func (m *WindowManipulator) SetTitle(title string) {
m.title = title
ebiten.SetWindowTitle(m.title)
}
func (m *WindowManipulator) SaveTitleToStack() {
m.titleStack = append(m.titleStack, m.title)
}
func (m *WindowManipulator) RestoreTitleFromStack() {
if len(m.titleStack) == 0 {
m.SetTitle("")
}
title := m.titleStack[len(m.titleStack)-1]
m.titleStack = m.titleStack[:len(m.titleStack)-1]
m.SetTitle(title)
}
func (m *WindowManipulator) State() termutil.WindowState {
if ebiten.IsWindowMinimized() {
return termutil.StateMinimised
}
if ebiten.IsWindowMaximized() {
return termutil.StateMaximised
}
return termutil.StateNormal
}
func (m *WindowManipulator) Minimise() {
ebiten.MinimizeWindow()
}
func (m *WindowManipulator) Maximise() {
ebiten.MaximizeWindow()
}
func (m *WindowManipulator) Restore() {
ebiten.RestoreWindow()
}
func (m *WindowManipulator) SizeInPixels() (int, int) {
return m.g.size.X, m.g.size.Y
}
func (m *WindowManipulator) SizeInChars() (int, int) {
return int(m.g.terminal.GetActiveBuffer().ViewWidth()), int(m.g.terminal.GetActiveBuffer().ViewHeight())
}
func (m *WindowManipulator) ResizeInPixels(x int, y int) {
ebiten.SetWindowSize(x, y)
}
func (m *WindowManipulator) ResizeInChars(cols int, rows int) {
x := cols * m.g.fontManager.CharSize().X
y := rows * m.g.fontManager.CharSize().Y
ebiten.SetWindowSize(x, y)
}
func (m *WindowManipulator) ScreenSizeInPixels() (int, int) {
return ebiten.WindowSize()
}
func (m *WindowManipulator) ScreenSizeInChars() (int, int) {
w, h := ebiten.WindowSize()
return w / m.g.fontManager.CharSize().X, h / m.g.fontManager.CharSize().Y
}
func (m *WindowManipulator) Move(x, y int) {
ebiten.SetWindowPosition(x, y)
}
func (m *WindowManipulator) SetFullscreen(enabled bool) {
ebiten.SetFullscreen(enabled)
}
func (m *WindowManipulator) IsFullscreen() bool {
return ebiten.IsFullscreen()
}