89 lines
2.4 KiB
Python
89 lines
2.4 KiB
Python
|
'''
|
||
|
Monitor module
|
||
|
==============
|
||
|
|
||
|
The Monitor module is a toolbar that shows the activity of your current
|
||
|
application :
|
||
|
|
||
|
* FPS
|
||
|
* Graph of input events
|
||
|
|
||
|
Usage
|
||
|
-----
|
||
|
|
||
|
For normal module usage, please see the :mod:`~kivy.modules` documentation.
|
||
|
|
||
|
'''
|
||
|
|
||
|
__all__ = ('start', 'stop')
|
||
|
|
||
|
from kivy.uix.label import Label
|
||
|
from kivy.graphics import Rectangle, Color
|
||
|
from kivy.clock import Clock
|
||
|
from functools import partial
|
||
|
|
||
|
_statsinput = 0
|
||
|
_maxinput = -1
|
||
|
|
||
|
|
||
|
def update_fps(ctx, *largs):
|
||
|
ctx.label.text = 'FPS: %f' % Clock.get_fps()
|
||
|
ctx.rectangle.texture = ctx.label.texture
|
||
|
ctx.rectangle.size = ctx.label.texture_size
|
||
|
|
||
|
|
||
|
def update_stats(win, ctx, *largs):
|
||
|
global _statsinput
|
||
|
ctx.stats = ctx.stats[1:] + [_statsinput]
|
||
|
_statsinput = 0
|
||
|
m = max(1., _maxinput)
|
||
|
for i, x in enumerate(ctx.stats):
|
||
|
ctx.statsr[i].size = (4, ctx.stats[i] / m * 20)
|
||
|
ctx.statsr[i].pos = (win.width - 64 * 4 + i * 4, win.height - 25)
|
||
|
|
||
|
|
||
|
def _update_monitor_canvas(win, ctx, *largs):
|
||
|
with win.canvas.after:
|
||
|
ctx.overlay.pos = (0, win.height - 25)
|
||
|
ctx.overlay.size = (win.width, 25)
|
||
|
ctx.rectangle.pos = (5, win.height - 20)
|
||
|
|
||
|
|
||
|
class StatsInput(object):
|
||
|
def process(self, events):
|
||
|
global _statsinput, _maxinput
|
||
|
_statsinput += len(events)
|
||
|
if _statsinput > _maxinput:
|
||
|
_maxinput = float(_statsinput)
|
||
|
return events
|
||
|
|
||
|
|
||
|
def start(win, ctx):
|
||
|
# late import to avoid breaking module loading
|
||
|
from kivy.input.postproc import kivy_postproc_modules
|
||
|
kivy_postproc_modules['fps'] = StatsInput()
|
||
|
global _ctx
|
||
|
ctx.label = Label(text='FPS: 0.0')
|
||
|
ctx.inputstats = 0
|
||
|
ctx.stats = []
|
||
|
ctx.statsr = []
|
||
|
with win.canvas.after:
|
||
|
ctx.color = Color(1, 0, 0, .5)
|
||
|
ctx.overlay = Rectangle(pos=(0, win.height - 25),
|
||
|
size=(win.width, 25))
|
||
|
ctx.color = Color(1, 1, 1)
|
||
|
ctx.rectangle = Rectangle(pos=(5, win.height - 20))
|
||
|
ctx.color = Color(1, 1, 1, .5)
|
||
|
for i in range(64):
|
||
|
ctx.stats.append(0)
|
||
|
ctx.statsr.append(
|
||
|
Rectangle(pos=(win.width - 64 * 4 + i * 4, win.height - 25),
|
||
|
size=(4, 0)))
|
||
|
win.bind(size=partial(_update_monitor_canvas, win, ctx))
|
||
|
Clock.schedule_interval(partial(update_fps, ctx), .5)
|
||
|
Clock.schedule_interval(partial(update_stats, win, ctx), 1 / 60.)
|
||
|
|
||
|
|
||
|
def stop(win, ctx):
|
||
|
win.canvas.remove(ctx.label)
|