PresentationApp/main.go
lordwelch 73bbf9b01a moving away from GLFW mostly
switching to a list of lists
qml is way out of sync
need to figure out how much the signals need to be changed
and the best way to update the preview text for the qml
2017-02-05 13:57:50 -07:00

252 lines
4.5 KiB
Go

// PresentationApp project main.go
//go:generate genqrc qml
package main
import (
"fmt"
"image/color"
"os"
"github.com/go-gl/glfw/v3.1/glfw"
"gopkg.in/gographics/imagick.v2/imagick"
"gopkg.in/qml.v1"
)
type Bool bool
type Cell struct {
fnt Font
image Image
index, collectionIndex int
qmlObject qml.Object
text string
textVisible Bool
}
type collection []*Cell
type Font struct {
color color.RGBA
name string
outline Bool
outlineColor color.RGBA
outlineSize, size, x, y float64
}
type Image struct {
img *imagick.MagickWand
imgSource string
qmlImage qml.Object
}
type qmlVar struct {
FontList string
Verses string
VerseOrder string
//Img string
}
type service []collection
var (
currentService service
err error
path string
slides collection
)
func main() {
if err = qml.Run(run); err != nil {
fmt.Fprintf(os.Stderr, "error: %v\n", err)
os.Exit(1)
}
glfw.Terminate()
}
func run() error {
engine = qml.NewEngine()
QML = &qmlVar{}
path = "qrc:///qml"
imagick.Initialize()
findFonts()
engine.Context().SetVar("go", QML)
engine.AddImageProvider("images", imgProvider)
err = qmlWindows()
if err != nil {
return err
}
currentService.Init(1)
//signals for whole qml
setSignals()
//image is ready for imageprovider
imgready = true
displayImg = DisplayWindow.Root().ObjectByName("image1")
serviceObject = serviceQml.Create(engine.Context())
serviceObject.Set("parent", MainWindow.ObjectByName("data1"))
serviceObject.Call("addCollection")
//edtQmlShow()
qml.RunMain(glInit)
MainWindow.Wait()
slides.destroy()
imagick.Terminate()
return nil
}
func (sv service) Init(int num) {
if num <= 0 {
num = 1
}
for index := 0; index < num; index++ {
if sv == nil {
sv.add("")
}
}
}
func (sv service) add(string name) {
var (
sl collection
int i = len(sv)
)
if len(name) <= 0 {
name = "Song: " + fmt.Sprint(i)
}
sl.init()
sv = append(sv, sl)
//?serviceObj.Call(addCollection, name, 1)
}
func (sv service) remove(i int) {
sv[i].destroy()
copy(sv[i:], sv[i+1:])
sv[len(sv)-1] = nil // or the zero value of T
sv = sv[:len(sv)-1]
}
func (sv service) destroy() {
for i := len(sv); i > 0; i-- {
sv.remove(i - 1)
}
}
func (sl collection) init(int num) {
if num <= 0 {
num = 1
}
for index := 0; index < num; index++ {
if sl == nil {
sl.add("")
}
}
}
//Adds a new cell
func (sl collection) add(string text) {
var (
cl Cell
int i = len(sl)
)
if len(name) <= 0 {
name = "Slide" + fmt.Sprint(i)
}
cl.Init()
//keep the pointer/dereference (i'm not sure which it is)
//problems occur otherwise
//*sl = append(*sl, &cl)
sl = append(sl, &cl)
//seperate image object in QML
cl.image.qmlImage.Set("source", fmt.Sprintf("image://images/cell;%d", cl.index))
cl.setSignal()
//give QML the text
}
//(slide) remove copied from github.com/golang/go/wiki/SliceTricks
func (sl collection) remove(i int) {
cl := sl[i]
cl.text = ""
cl.image.qmlImage.Destroy()
cl.qmlObject.Destroy()
cl.image.img.Destroy()
MainWindow.ObjectByName("gridRect").Set("count", MainWindow.ObjectByName("gridRect").Int("count")-1)
cl.index = -1
copy(sl[i:], sl[i+1:])
sl[len(sl)-1] = nil // or the zero value of T
sl = sl[:len(sl)-1]
//*sl, (*sl)[len((*sl))-1] = append((*sl)[:i], (*sl)[i+1:]...), nil
}
func (sl collection) destroy() {
for i := len(sl); i > 0; i-- {
sl.remove(i - 1)
}
}
func (cl *Cell) Init() {
cl.text = `hello this is text`
cl.index = -1
cl.fnt.color, cl.fnt.outlineColor = color.RGBA{0, 0, 0, 1}, color.RGBA{1, 1, 1, 1}
cl.fnt.name = "none"
cl.fnt.outline = false
cl.fnt.outlineSize = 1
cl.fnt.size = 35
cl.fnt.x, cl.fnt.y = 10, 30
cl.qmlObject = cellQml.Create(engine.Context())
cl.image.qmlImage = imgQml.Create(engine.Context())
//load image
cl.image.img = imagick.NewMagickWand()
cl.image.img.ReadImage("logo:")
}
func (cl *Cell) Select() {
selectedCell = cl.index
cl.qmlObject.ObjectByName("cellMouse").Call("selected")
}
/*func (cl *Cell) Texture() glbase.Texture {
fmt.Println("index: ", cl.index, " ", cl.img.tex)
fmt.Println("error tex:", gl.GetError())
if cl.img.tex == 0 {
cl.img.tex = newTexture(*cl.getImage(monWidth, monHeight))
fmt.Println("new texture", cl.img.tex)
}
return cl.img.tex
}*/
//not really needed
func (cl Cell) String() string {
return fmt.Sprintf("Index: %d \nText: %s\n", cl.index, cl.text)
}
func (bl *Bool) Flip() {
*bl = !*bl
}