:mod:`curses.panel` --- A panel stack extension for curses
==========================================================

.. module:: curses.panel
   :synopsis: A panel stack extension that adds depth to  curses windows.
.. sectionauthor:: A.M. Kuchling <amk@amk.ca>


Panels are windows with the added feature of depth, so they can be stacked on
top of each other, and only the visible portions of each window will be
displayed.  Panels can be added, moved up or down in the stack, and removed.


.. _cursespanel-functions:

Functions
---------

The module :mod:`curses.panel` defines the following functions:


.. function:: bottom_panel()

   Returns the bottom panel in the panel stack.


.. function:: new_panel(win)

   Returns a panel object, associating it with the given window *win*. Be aware
   that you need to keep the returned panel object referenced explicitly.  If you
   don't, the panel object is garbage collected and removed from the panel stack.


.. function:: top_panel()

   Returns the top panel in the panel stack.


.. function:: update_panels()

   Updates the virtual screen after changes in the panel stack. This does not call
   :func:`curses.doupdate`, so you'll have to do this yourself.


.. _curses-panel-objects:

Panel Objects
-------------

Panel objects, as returned by :func:`new_panel` above, are windows with a
stacking order. There's always a window associated with a panel which determines
the content, while the panel methods are responsible for the window's depth in
the panel stack.

Panel objects have the following methods:


.. method:: Panel.above()

   Returns the panel above the current panel.


.. method:: Panel.below()

   Returns the panel below the current panel.


.. method:: Panel.bottom()

   Push the panel to the bottom of the stack.


.. method:: Panel.hidden()

   Returns true if the panel is hidden (not visible), false otherwise.


.. method:: Panel.hide()

   Hide the panel. This does not delete the object, it just makes the window on
   screen invisible.


.. method:: Panel.move(y, x)

   Move the panel to the screen coordinates ``(y, x)``.


.. method:: Panel.replace(win)

   Change the window associated with the panel to the window *win*.


.. method:: Panel.set_userptr(obj)

   Set the panel's user pointer to *obj*. This is used to associate an arbitrary
   piece of data with the panel, and can be any Python object.


.. method:: Panel.show()

   Display the panel (which might have been hidden).


.. method:: Panel.top()

   Push panel to the top of the stack.


.. method:: Panel.userptr()

   Returns the user pointer for the panel.  This might be any Python object.


.. method:: Panel.window()

   Returns the window object associated with the panel.

