mirror of
https://github.com/shlomif/PySolFC.git
synced 2025-04-05 00:02:29 -04:00
Kivy/Android
- size of menu unified to 0.333 for landscape and 0.5 for portrait mode - added code to hopefully prevent black screen on resume - removed old outdated workarounds
This commit is contained in:
parent
2c48745781
commit
2017b4f23b
7 changed files with 60 additions and 74 deletions
|
@ -71,6 +71,15 @@ def get_platform():
|
|||
# =============================================================================
|
||||
|
||||
|
||||
def get_menu_size_hint():
|
||||
sh = (0.5, 1.0)
|
||||
if Window.size[0] < Window.size[1]:
|
||||
sh = (1.0, 1.0)
|
||||
return sh
|
||||
|
||||
# =============================================================================
|
||||
|
||||
|
||||
def get_screen_ori():
|
||||
if get_platform() == 'android':
|
||||
from jnius import autoclass
|
||||
|
@ -1040,7 +1049,7 @@ class LTopLevelContent(BoxLayout, LBase):
|
|||
def __init__(self, **kw):
|
||||
super(LTopLevelContent, self).__init__(**kw)
|
||||
|
||||
# beispiel zu canvas (hintergrund)
|
||||
# Macht die Hintergrundfarbe der TopLevel (Dialog-) Fenster.
|
||||
with self.canvas.before:
|
||||
Color(0.45, 0.5, 0.5, 1.0)
|
||||
self.rect = Rectangle(pos=self.pos, size=self.size)
|
||||
|
@ -1086,30 +1095,12 @@ class LTopLevel0(BoxLayout, LBase):
|
|||
super(LTopLevel0, self).__init__(
|
||||
orientation="vertical", **kw)
|
||||
|
||||
# self.canvas.add(Color(0, 1, 0, 0.4))
|
||||
# self.canvas.add(Rectangle(pos=(100, 100), size=(100, 100)))
|
||||
|
||||
self.size_hint = (0.5, 1.0)
|
||||
'''
|
||||
self.titleline = BoxLayout(
|
||||
orientation="horizontal", size_hint=[1.0, 0.15], **kw)
|
||||
self.button = Button(text="X", size_hint=[0.15, 1.0], **kw)
|
||||
if not title:
|
||||
title = '<>'
|
||||
self.title = Label(text=title, **kw)
|
||||
self.titleline.add_widget(self.title)
|
||||
self.titleline.add_widget(self.button)
|
||||
'''
|
||||
self.titleline = LTopLine(text=title, size_hint=[1.0, 0.15])
|
||||
self.title = title
|
||||
|
||||
# self.content = BoxLayout(orientation="vertical", **kw)
|
||||
self.titleline = LTopLine(text=title, size_hint=[1.0, 0.15])
|
||||
self.content = LTopLevelContent(orientation="vertical", **kw)
|
||||
self.add_widget(self.titleline)
|
||||
self.add_widget(self.content)
|
||||
'''
|
||||
self.button.bind(on_press=self.onClick)
|
||||
'''
|
||||
|
||||
self.titleline.bind(on_press=self.onClick)
|
||||
self.main.pushWork(self.title, self)
|
||||
|
||||
|
@ -1126,12 +1117,7 @@ class LTopLevel(BoxLayout, LBase):
|
|||
super(LTopLevel, self).__init__(
|
||||
orientation="vertical", **kw)
|
||||
|
||||
if ('size_hint' not in kw):
|
||||
self.size_hint = (0.5, 1.0)
|
||||
else:
|
||||
del kw['size_hint']
|
||||
self.titleline = LTopLine(text=title, size_hint=(1.0, 0.10))
|
||||
|
||||
self.content = LTopLevelContent(orientation="vertical", **kw)
|
||||
self.add_widget(self.titleline)
|
||||
self.add_widget(self.content)
|
||||
|
@ -1156,7 +1142,6 @@ class LTopLevel(BoxLayout, LBase):
|
|||
pass
|
||||
return ret
|
||||
|
||||
|
||||
# =============================================================================
|
||||
|
||||
|
||||
|
@ -1782,23 +1767,6 @@ class LApp(App):
|
|||
else:
|
||||
return False # delegate
|
||||
|
||||
def delayedRebuild(self, dt):
|
||||
logging.info("LApp: delayedRebuild")
|
||||
self.mainWindow.rebuildContainer()
|
||||
|
||||
def makeDelayedRebuild(self):
|
||||
def delayedRebuild(dt):
|
||||
# Clock.schedule_once(self.delayedRebuild, 0.01)
|
||||
Clock.schedule_once(self.delayedRebuild, 0.5)
|
||||
return delayedRebuild
|
||||
|
||||
def doSize(self, obj, val):
|
||||
mval = self.mainWindow.size
|
||||
if (val[0] != mval[0] and val[1] != mval[1]):
|
||||
logging.info("LApp: size changed %s - %s (%s)" % (obj, val, mval))
|
||||
Clock.schedule_once(self.makeDelayedRebuild(), 0.2)
|
||||
pass
|
||||
|
||||
def __init__(self, args):
|
||||
super(LApp, self).__init__()
|
||||
self.args = args
|
||||
|
@ -1835,7 +1803,6 @@ class LApp(App):
|
|||
Cache.append('LAppCache', 'mainApp', self, timeout=0)
|
||||
self.startCode = 0
|
||||
Window.bind(on_keyboard=self.key_input)
|
||||
Window.bind(size=self.doSize)
|
||||
|
||||
from pysollib.app import Application
|
||||
from pysollib.main import pysol_init
|
||||
|
@ -1962,6 +1929,17 @@ class LApp(App):
|
|||
# wieder falsch aufstellt. (woher kommt die und warum ist sie
|
||||
# oft falsch ?)
|
||||
|
||||
# Gelegentlich beobachtet: Schwarzer Bilschirm nach resume. Und
|
||||
# das bleibt dann so auf ewig. Aber die app läuft stabil. Die
|
||||
# einzige Interaktion mit der App ist über die Android buttons
|
||||
# für hintrgrund und resume. Diese funktioneren gemäss logcat
|
||||
# einwandfrei. Daher versuchen wir ... um den graphik context
|
||||
# wieder zu aktivieren/auszurichten:
|
||||
Clock.schedule_once(lambda dt: Window.update_viewport(), 2.0)
|
||||
# (Es gibt auch Beispiele in den kivy issues die nahelegen, dass
|
||||
# das nützlich sein könnte)
|
||||
|
||||
# Pause modus abschalten nach resume:
|
||||
if app.game.pause:
|
||||
Clock.schedule_once(self.makeEndPauseCmd(app), 3.0)
|
||||
|
||||
|
|
|
@ -207,6 +207,13 @@ class LMenuDialog(LMenuBase):
|
|||
self.window = window
|
||||
self.running = True
|
||||
|
||||
from pysollib.kivy.LApp import get_menu_size_hint
|
||||
|
||||
def updrule(obj, val):
|
||||
self.window.size_hint = get_menu_size_hint()
|
||||
updrule(0, 0)
|
||||
self.parent.bind(size=updrule)
|
||||
|
||||
if self.persist:
|
||||
self.dialogCache[title] = window
|
||||
|
||||
|
@ -241,7 +248,6 @@ class LMenuDialog(LMenuBase):
|
|||
class MainMenuDialog(LMenuDialog):
|
||||
|
||||
def __init__(self, menubar, parent, title, app, **kw):
|
||||
kw['size_hint'] = (0.2, 1)
|
||||
kw['persist'] = True
|
||||
super(MainMenuDialog, self).__init__(
|
||||
menubar, parent, title, app, **kw)
|
||||
|
@ -289,7 +295,6 @@ class MainMenuDialog(LMenuDialog):
|
|||
class FileMenuDialog(LMenuDialog):
|
||||
|
||||
def __init__(self, menubar, parent, title, app, **kw):
|
||||
kw['size_hint'] = (0.3, 1)
|
||||
super(FileMenuDialog, self).__init__(
|
||||
menubar, parent, title, app, **kw)
|
||||
|
||||
|
@ -358,7 +363,6 @@ class FileMenuDialog(LMenuDialog):
|
|||
class EditMenuDialog(LMenuDialog): # Tools
|
||||
|
||||
def __init__(self, menubar, parent, title, app, **kw):
|
||||
kw['size_hint'] = (0.2, 1)
|
||||
kw['persist'] = True
|
||||
super(EditMenuDialog, self).__init__(
|
||||
menubar, parent, title, app, **kw)
|
||||
|
@ -431,7 +435,6 @@ class EditMenuDialog(LMenuDialog): # Tools
|
|||
class GameMenuDialog(LMenuDialog):
|
||||
|
||||
def __init__(self, menubar, parent, title, app, **kw):
|
||||
kw['size_hint'] = (0.2, 1)
|
||||
kw['persist'] = True
|
||||
super(GameMenuDialog, self).__init__(
|
||||
menubar, parent, title, app, **kw)
|
||||
|
@ -502,7 +505,6 @@ class GameMenuDialog(LMenuDialog):
|
|||
class AssistMenuDialog(LMenuDialog):
|
||||
|
||||
def __init__(self, menubar, parent, title, app, **kw):
|
||||
kw['size_hint'] = (0.2, 1)
|
||||
kw['persist'] = True
|
||||
super(AssistMenuDialog, self).__init__(
|
||||
menubar, parent, title, app, **kw)
|
||||
|
@ -1279,7 +1281,6 @@ class LOptionsMenuGenerator(LTreeGenerator):
|
|||
class OptionsMenuDialog(LMenuDialog):
|
||||
|
||||
def __init__(self, menubar, parent, title, app, **kw):
|
||||
kw['size_hint'] = (0.5, 1)
|
||||
kw['persist'] = True
|
||||
super(OptionsMenuDialog, self).__init__(
|
||||
menubar, parent, title, app, **kw)
|
||||
|
@ -1295,7 +1296,6 @@ class OptionsMenuDialog(LMenuDialog):
|
|||
|
||||
class HelpMenuDialog(LMenuDialog):
|
||||
def __init__(self, menubar, parent, title, app, **kw):
|
||||
kw['size_hint'] = (0.3, 1)
|
||||
kw['persist'] = True
|
||||
super(HelpMenuDialog, self).__init__(menubar, parent, title, app, **kw)
|
||||
|
||||
|
|
|
@ -28,6 +28,7 @@ from pysollib.kivy.LApp import LScrollView
|
|||
from pysollib.kivy.LApp import LTopLevel
|
||||
from pysollib.kivy.LApp import LTreeNode
|
||||
from pysollib.kivy.LApp import LTreeRoot
|
||||
from pysollib.kivy.LApp import get_menu_size_hint
|
||||
from pysollib.kivy.selecttree import SelectDialogTreeData
|
||||
from pysollib.kivy.selecttree import SelectDialogTreeLeaf, SelectDialogTreeNode
|
||||
from pysollib.mygettext import _
|
||||
|
@ -382,7 +383,6 @@ class SelectGameDialog(object):
|
|||
def onClick(self, event):
|
||||
print('LTopLevel: onClick')
|
||||
SelectGameDialog.SingleInstance.parent.popWork('SelectGame')
|
||||
SelectGameDialog.SingleInstance.running = False
|
||||
|
||||
def selectCmd(self, gameid):
|
||||
self.app.menubar._mSelectGame(gameid)
|
||||
|
@ -394,31 +394,31 @@ class SelectGameDialog(object):
|
|||
self.app = app
|
||||
self.gameid = gameid
|
||||
self.random = None
|
||||
self.running = False
|
||||
self.window = None
|
||||
|
||||
# bestehenden Dialog rezyklieren.
|
||||
|
||||
si = SelectGameDialog.SingleInstance
|
||||
# if (si and si.running): return
|
||||
if (si and si.running):
|
||||
si.parent.popWork('SelectGame')
|
||||
si.running = False
|
||||
if si and si.parent.workStack.peek('SelectGame') is not None:
|
||||
parent.popWork('SelectGame')
|
||||
return
|
||||
if (si):
|
||||
si.parent.pushWork('SelectGame', si.window)
|
||||
si.running = True
|
||||
return
|
||||
|
||||
# neuen Dialog aufbauen.
|
||||
|
||||
window = LTopLevel(parent, title)
|
||||
window.titleline.bind(on_press=self.onClick)
|
||||
self.parent.pushWork('SelectGame', window)
|
||||
self.window = window
|
||||
self.running = True
|
||||
self.window = window = LTopLevel(parent, title)
|
||||
self.window.titleline.bind(on_press=self.onClick)
|
||||
|
||||
self.parent.pushWork('SelectGame', self.window)
|
||||
SelectGameDialog.SingleInstance = self
|
||||
|
||||
def updrule(obj, val):
|
||||
self.window.size_hint = get_menu_size_hint()
|
||||
updrule(0, 0)
|
||||
self.parent.bind(size=updrule)
|
||||
|
||||
# Asynchron laden.
|
||||
|
||||
def loaderCB(treeview, node):
|
||||
|
@ -477,7 +477,7 @@ class SelectGameDialog(object):
|
|||
tree,
|
||||
self.app.canvas,
|
||||
root_options=dict(text='Tree One'))
|
||||
tv.size_hint = 1, None
|
||||
tv.size_hint = (1, None)
|
||||
tv.hide_root = True
|
||||
tv.load_func = loaderCB
|
||||
tv.bind(minimum_height=tv.setter('height'))
|
||||
|
|
|
@ -692,7 +692,7 @@ class MfxCanvas(LImage):
|
|||
def psize(s):
|
||||
return "({:1.2f}, {:1.2f})".format(s[0], s[1])
|
||||
|
||||
logging.info('MfxCanvas: update_widget to: '+psize(size))
|
||||
# logging.info('MfxCanvas: update_widget to: '+psize(size))
|
||||
|
||||
# print('MfxCanvas: update_widget size=(%s, %s)' %
|
||||
# (self.size[0], self.size[1]))
|
||||
|
@ -701,7 +701,7 @@ class MfxCanvas(LImage):
|
|||
|
||||
# oldscale = self.scale
|
||||
newscale = self.scalefactor()
|
||||
logging.info('MfxCanvas: scale factor: {:1.2f})'.format(newscale))
|
||||
# logging.info('MfxCanvas: scale factor: {:1.2f})'.format(newscale))
|
||||
self.scale = newscale
|
||||
|
||||
# Anpassung Skalierung.
|
||||
|
@ -848,8 +848,8 @@ class MfxCanvas(LImage):
|
|||
else:
|
||||
lumi = LColorToLuminance(self._bg_color)
|
||||
|
||||
self._text_color = ("#000000", "#ffffff")[lumi < 0.5]
|
||||
print('average luminance =', lumi)
|
||||
self._text_color = ("#000000", "#ffffff")[lumi < 0.4]
|
||||
# print('average luminance =', lumi)
|
||||
|
||||
def setTile(self, image, stretch=0, save_aspect=0):
|
||||
|
||||
|
|
|
@ -128,9 +128,9 @@ class LPieChart(Widget):
|
|||
# *
|
||||
# ************************************************************************
|
||||
|
||||
|
||||
class SingleGame_StatsDialog(MfxDialog):
|
||||
def __init__(self, parent, title, app, player, gameid, **kw):
|
||||
kw['size_hint'] = (0.5, 1)
|
||||
self.app = app
|
||||
self.selected_game = None
|
||||
kw = self.initKw(kw)
|
||||
|
@ -142,8 +142,6 @@ class SingleGame_StatsDialog(MfxDialog):
|
|||
MfxDialog.__init__(self, parent, title, kw.resizable, kw.default)
|
||||
top_frame, bottom_frame = self.createFrames(kw)
|
||||
self.top_frame = top_frame
|
||||
|
||||
# self.createBitmaps(top_frame, kw)
|
||||
#
|
||||
self.player = player or _("Demo games")
|
||||
self.top.wm_minsize(200, 200)
|
||||
|
|
|
@ -68,6 +68,9 @@ def setTransient(window, parent, relx=None, rely=None, expose=1):
|
|||
return
|
||||
|
||||
|
||||
# ANM: werden ev. immer noch vom pysollib core benötigt/referenziert:
|
||||
# (intern in kivy bitte nicht direkt benutzen).
|
||||
|
||||
def makeToplevel(parent, title=None):
|
||||
print('tkutil: makeTopLevel')
|
||||
|
||||
|
|
|
@ -39,10 +39,11 @@ from kivy.uix.label import Label
|
|||
from pysollib.kivy.LApp import LBoxLayout
|
||||
from pysollib.kivy.LApp import LScrollView
|
||||
from pysollib.kivy.LApp import LTopLevel
|
||||
from pysollib.kivy.LApp import LTopLevel0
|
||||
from pysollib.kivy.LApp import get_menu_size_hint
|
||||
from pysollib.kivy.LImage import LImage
|
||||
from pysollib.kivy.tkcanvas import MfxCanvas
|
||||
from pysollib.kivy.tkutil import bind, unbind_destroy
|
||||
from pysollib.kivy.tkutil import makeToplevel
|
||||
from pysollib.mfxutil import KwStruct, kwdefault
|
||||
from pysollib.mygettext import _
|
||||
from pysollib.settings import WIN_SYSTEM
|
||||
|
@ -63,7 +64,13 @@ class MfxDialog: # ex. _ToplevelDialog
|
|||
self.timer = None
|
||||
self.buttons = []
|
||||
self.accel_keys = {}
|
||||
self.top = makeToplevel(parent, title=title)
|
||||
self.window = LTopLevel0(parent, title=title)
|
||||
self.top = self.window.content
|
||||
|
||||
def setSizeRule(obj, val):
|
||||
self.window.size_hint = get_menu_size_hint()
|
||||
self.parent.bind(size=setSizeRule)
|
||||
setSizeRule(0, 0)
|
||||
|
||||
def wmDeleteWindow(self, *event):
|
||||
self.status = 1
|
||||
|
|
Loading…
Add table
Reference in a new issue