| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221 |
- package mobile
- import (
- "fyne.io/fyne/v2"
- "fyne.io/fyne/v2/container"
- "fyne.io/fyne/v2/internal/cache"
- "fyne.io/fyne/v2/internal/driver/common"
- "fyne.io/fyne/v2/layout"
- "fyne.io/fyne/v2/theme"
- "fyne.io/fyne/v2/widget"
- )
- type window struct {
- common.Window
- title string
- visible bool
- onClosed func()
- onCloseIntercepted func()
- isChild bool
- clipboard fyne.Clipboard
- canvas *mobileCanvas
- icon fyne.Resource
- menu *fyne.MainMenu
- }
- func (w *window) Title() string {
- return w.title
- }
- func (w *window) SetTitle(title string) {
- w.title = title
- }
- func (w *window) FullScreen() bool {
- return true
- }
- func (w *window) SetFullScreen(bool) {
- // no-op
- }
- func (w *window) Resize(size fyne.Size) {
- w.Canvas().(*mobileCanvas).Resize(size)
- }
- func (w *window) RequestFocus() {
- // no-op - we cannot change which window is focused
- }
- func (w *window) FixedSize() bool {
- return true
- }
- func (w *window) SetFixedSize(bool) {
- // no-op - all windows are fixed size
- }
- func (w *window) CenterOnScreen() {
- // no-op
- }
- func (w *window) Padded() bool {
- return w.canvas.padded
- }
- func (w *window) SetPadded(padded bool) {
- w.canvas.padded = padded
- }
- func (w *window) Icon() fyne.Resource {
- if w.icon == nil {
- return fyne.CurrentApp().Icon()
- }
- return w.icon
- }
- func (w *window) SetIcon(icon fyne.Resource) {
- w.icon = icon
- }
- func (w *window) SetMaster() {
- // no-op on mobile
- }
- func (w *window) MainMenu() *fyne.MainMenu {
- return w.menu
- }
- func (w *window) SetMainMenu(menu *fyne.MainMenu) {
- w.menu = menu
- }
- func (w *window) SetOnClosed(callback func()) {
- w.onClosed = callback
- }
- func (w *window) SetCloseIntercept(callback func()) {
- w.onCloseIntercepted = callback
- }
- func (w *window) Show() {
- menu := fyne.CurrentApp().Driver().(*mobileDriver).findMenu(w)
- menuButton := w.newMenuButton(menu)
- if menu == nil {
- menuButton.Hide()
- }
- if w.isChild {
- exit := widget.NewButtonWithIcon("", theme.CancelIcon(), func() {
- w.tryClose()
- })
- title := widget.NewLabel(w.title)
- title.Alignment = fyne.TextAlignCenter
- w.canvas.setWindowHead(container.NewHBox(menuButton,
- layout.NewSpacer(), title, layout.NewSpacer(), exit))
- w.canvas.Resize(w.canvas.size)
- } else {
- w.canvas.setWindowHead(container.NewHBox(menuButton))
- }
- w.visible = true
- if w.Content() != nil {
- w.Content().Refresh()
- w.Content().Show()
- }
- }
- func (w *window) Hide() {
- w.visible = false
- if w.Content() != nil {
- w.Content().Hide()
- }
- }
- func (w *window) tryClose() {
- if w.onCloseIntercepted != nil {
- w.QueueEvent(w.onCloseIntercepted)
- return
- }
- w.Close()
- }
- func (w *window) Close() {
- d := fyne.CurrentApp().Driver().(*mobileDriver)
- pos := -1
- for i, win := range d.windows {
- if win == w {
- pos = i
- }
- }
- if pos != -1 {
- d.windows = append(d.windows[:pos], d.windows[pos+1:]...)
- }
- cache.RangeTexturesFor(w.canvas, func(obj fyne.CanvasObject) {
- w.canvas.Painter().Free(obj)
- })
- w.canvas.WalkTrees(nil, func(node *common.RenderCacheNode) {
- if wid, ok := node.Obj().(fyne.Widget); ok {
- cache.DestroyRenderer(wid)
- }
- })
- w.QueueEvent(func() {
- cache.CleanCanvas(w.canvas)
- })
- // Call this in a go routine, because this function could be called
- // inside a button which callback would be queued in this event queue
- // and it will lead to a deadlock if this is performed in the same go
- // routine.
- go w.DestroyEventQueue()
- if w.onClosed != nil {
- w.onClosed()
- }
- }
- func (w *window) ShowAndRun() {
- w.Show()
- fyne.CurrentApp().Driver().Run()
- }
- func (w *window) Content() fyne.CanvasObject {
- return w.canvas.Content()
- }
- func (w *window) SetContent(content fyne.CanvasObject) {
- w.canvas.SetContent(content)
- }
- func (w *window) Canvas() fyne.Canvas {
- return w.canvas
- }
- func (w *window) Clipboard() fyne.Clipboard {
- if w.clipboard == nil {
- w.clipboard = &mobileClipboard{}
- }
- return w.clipboard
- }
- func (w *window) RunWithContext(f func()) {
- // ctx, _ = e.DrawContext.(gl.Context)
- f()
- }
- func (w *window) RescaleContext() {
- // TODO
- }
- func (w *window) Context() interface{} {
- return fyne.CurrentApp().Driver().(*mobileDriver).glctx
- }
|