Provided by: libnotcurses-core-dev_3.0.7+dfsg.1-1ubuntu5_amd64 bug

NAME

       notcurses_reel - high-level widget for hierarchical data

SYNOPSIS

       #include <notcurses/notcurses.h>

              #define NCREEL_OPTION_INFINITESCROLL 0x0001
              #define NCREEL_OPTION_CIRCULAR       0x0002

              struct ncreel;
              struct ncplane;
              struct nctablet;

              typedef struct ncreel_options {
                // notcurses can draw a border around the ncreel, and also
                // around the component tablets. inhibit borders by setting all
                // valid bits in the masks. partially inhibit borders by setting
                // individual bits in the masks. the appropriate attr and pair
                // values will be used to style the borders. focused and
                // non-focused tablets can have different styles. you can instead
                // draw your own borders, or forgo borders entirely.
                unsigned bordermask; // bitfield; 1s will not be drawn
                uint64_t borderchan; // attributes used for ncreel border
                unsigned tabletmask; // bitfield for tablet borders
                uint64_t tabletchan; // tablet border styling channel
                uint64_t focusedchan;// focused tablet border styling channel
                uint64_t flags;      // bitfield over NCREEL_OPTION_*
              } ncreel_options;

       struct ncreel* ncreel_create(struct ncplane* nc, const ncreel_options* popts);

       struct ncplane* ncreel_plane(struct ncreel* nr);

       typedef int (tabletcb)(struct nctablet t, bool cliptop);

       struct  nctablet* ncreel_add(struct ncreel* nr, struct nctablet* after, struct nctablet* before, tabletcb
       cb, void* opaque);

       int ncreel_tabletcount(const struct ncreel* nr);

       int ncreel_del(struct ncreel* nr, struct nctablet* t);

       int ncreel_redraw(struct ncreel* nr);

       struct nctablet* ncreel_focused(struct ncreel* nr);

       struct nctablet* ncreel_next(struct ncreel* nr);

       struct nctablet* ncreel_prev(struct ncreel* nr);

       bool ncreel_offer_input(struct ncreel* nr, const ncinput* ni);

       void ncreel_destroy(struct ncreel* nr);

       void* nctablet_userptr(struct nctablet* t);

       struct ncplane* nctablet_plane(struct nctablet* t);

DESCRIPTION

       An ncreel is a widget for display and manipulation of hierarchical data, intended to make  effective  use
       of  the  display area while supporting keyboards, mice, and haptic interfaces.  A series of nctablets are
       ordered on a virtual cylinder; the tablets can grow and shrink freely.  Moving among the tablets  "spins"
       the cylinder.  ncreels support optional borders around the reel and/or tablets.

       ncreel_redraw  arranges the tablets, invoking the tabletcb defined by each.  It will invoke the callbacks
       of only those tablets currently visible.  This function ought be called whenever the data within a tablet
       need be refreshed.  The return value of this callback is the number of lines drawn into the ncplane.  The
       tablet will be grown or shrunk as necessary to reflect this return value.

       Unless the reel is devoid of tablets, there is always a "focused" tablet (the first tablet  added  to  an
       empty  reel  becomes  focused).   The  focused  tablet  can  change  via ncreel_next and ncreel_prev.  If
       ncreel_del is called on the focused tablet, and at least one other tablet remains, some  tablet  receives
       the focus.

       Calling  functions which change the reel, including ncreel_next, ncreel_prev, ncreel_del, and ncreel_add,
       implicitly calls ncreel_redraw.  This behavior must not be relied upon, as it is likely to go away.

   LAYOUT
       When the user invokes ncreel_redraw, Notcurses can't assume it knows the size of any tablets--one or more
       might  have  changed  since the last draw.  Only after a callback does ncreel_redraw know how many rows a
       tablet will occupy.

       A redraw operation starts with the focused tablet.  Its callback is invoked with a plane as large as  the
       reel,  i.e.   the  focused tablet can occupy the entire reel, to the exclusion of any other tablets.  The
       focused tablet will be kept where it was, if possible; growth might force it to move.  There is  now  one
       tablet  locked into place, and zero, one, or two areas of empty space.  Tablets are successively lain out
       in these spaces until the reel is filled.

       In general, if the reel is not full, tablets will be drawn towards the top, but this ought not be  relied
       on.

   THE TABLET CALLBACK
       The tablet callback (of type tabletcb) is called with an ncplane and a bool.  The callback function ought
       not rely on the absolute position of the plane, as it might be moved.  The  bool  indicates  whether  the
       plane  ought  be  filled  in  from  the  bottom, or from the top (this is only meaningful if the plane is
       insufficiently large to contain all the tablet's available data).  The  callback  ought  not  resize  the
       plane  (it  will  be  resized following return).  The callback must return the number of rows used (it is
       perfectly valid to use zero rows), or a negative number if there was an error.

       Returning more rows than the plane has available is an error.

RETURN VALUES

       ncreel_focused, ncreel_prev, and ncreel_next all return the focused tablet, unless no tablets  exist,  in
       which case they return NULL.

       ncreel_add returns the newly-added nctablet.

BUGS

       I  can't decide whether to require the user to explicitly call ncreel_redraw.  Doing so means changes can
       be batched up without a redraw, but it also makes things more complicated for both me and the user.

SEE ALSO

       notcurses(3), notcurses_input(3), notcurses_plane(3)

AUTHORS

       nick black <nickblack@linux.com>.

                                                     v3.0.7                                    notcurses_reel(3)