wuttapos/docs/menus.rst
2024-07-09 21:57:39 -05:00

103 lines
2.9 KiB
ReStructuredText

=====
Menus
=====
The default POS screen uses a "master menu" control to draw all button
menus on the right half of the screen.
This area is further broken down into 4 quadrants, each of which is
managed by a "menu" control. These quadrants are:
* ``tenkey`` (top left)
* ``meta`` (top right)
* ``context`` (bottom left)
* ``suspend`` (bottom right)
.. warning::
These names will likely change, as well as (possibly) the overall
structure. Things are being documented as-is for now.
Custom Menus
------------
You may override any of the above quadrant menu controls by specifying
your preferred control in your config file.
Most typically you would override the ``context`` menu:
.. code-block:: ini
[wuttapos.menus]
context.spec = poser.menus.context:PoserContextMenu
Of course that is after you have defined ``PoserContextMenu`` which
should be a subclass of :class:`wuttapos.controls.menus.WuttaMenu`.
Dynamic Context Menu
--------------------
The default ``context`` menu is actually empty; all the more reason
you would want to override it as described in the previous section.
But this quadrant is special in that the POS expects that menu to be
"swapped out" dynamically based on user action.
The way this works is to invoke the POS command named ``context_menu``
and specify the "key" of the menu you wish to show. This is generally
wired up to a button, so clicking the button would show a certain
menu::
from wuttapos.controls.menus import WuttaMenu
class PoserContextMenu(WuttaMenu):
def build_controls(self):
return [
self.make_button_row([
self.make_button("SHOW STUFF",
bgcolor='yellow',
pos_cmd='context_menu',
pos_cmd_entry='stuff'),
]),
]
The above would show a menu whose key was ``stuff`` - so your config
must define the spec for this menu as well:
.. code-block:: ini
[wuttapos.menus]
stuff.spec = poser.menus.stuff:PoserStuffMenu
And that menu is conceptually no different than the ``context``
example above. It can show whichever buttons it needs, and it is
usually a good idea for some button(s) to load other menus. For
example this (``stuff`` menu) includes a "BACK" button to load the
original ``context`` menu::
from wuttapos.controls.menus import WuttaMenu
class PoserStuffMenu(WuttaMenu):
def build_controls(self):
return [
self.make_button_row([
self.make_button("VOID",
bgcolor='red',
pos_cmd='void_dwim'),
self.make_button("BACK",
bgcolor='yellow',
pos_cmd='context_menu',
pos_cmd_entry='context'),
]),
]