73bbf9b01a
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
252 lines
4.5 KiB
Go
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
|
|
}
|