1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 450 451 452 453 454 455 456 457 458 459 460 461 462 463 464 465 466 467 468 469 470 471 472 473 474 475 476 477 478 479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 509 510 511 512 513 514 515 516 517 518 519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536 537 538 539 540 541 542 543 544 545 546 547 548 549 550 551 552 553 554 555 556 557 558 559 560 561 562 563 564 565 566 567 568 569 570 571 572 573 574 575 576 577 578 579 580 581 582 583 584 585 586 587 588 589 590 591 592 593 594 595 596 597 598 599 600 601 602 603 604 605 606 607 608 609 610 611 612 613 614 615 616 617 618 619 620 621 622 623 624 625 626 627 628 629 630 631 632 633 634 635 636 637 638 639 640 641 642 643 644 645 646 647 648 649 650 651 652 653 654 655 656 657 658 659 660 661 662 663 664 665 666 667 668 669 670 671 672 673 674 675 676 677 678 679 680 681 682 683 684 685 686 687 688 689 690 691 692 693 694 695 696 697 698 699 700 701 702 703 704 705 706 707 708 709 710 711 712 713 714 715 716 717 718 719 720 721 722 723 724 725 726 727 728 729 730 731 732 733 734 735 736 737 738 739 740 741 742
|
.. _ZWidget:
ZWidget
=======
ZWidget is the base class of all widgets in Tui Widgets.
It defines the common state and behavior of widgets.
Applications typically use derived classes as visual elements.
Applications can define custom widgets be defining classes that inherit from ZWidget.
Size, Position and Visibility
-----------------------------
The root widget of a widget tree needs to be connected to a :cpp:class:`Tui::ZTerminal` instance using the
:cpp:func:`~void Tui::ZTerminal::setMainWidget(ZWidget *w)` function.
Its position is fixed to cover the terminal.
All other widgets have a parent widget and have a position relative to the parent.
The position specifies the top-left cell the widget starts in.
The widget then expands to the right and down as specified by its width and height.
If a widget is placed outside of its parent the parts that don't overlap with the parent are not visible.
They are clipped.
The widget has a visible property (:cpp:func:`~bool Tui::ZWidget::isLocallyVisible() const`,
:cpp:func:`~void Tui::ZWidget::setVisible(bool v)`)
that determines if it is rendered and is considered for input.
If the parent of a widget is not visible the widget itself is not rendered too.
The visible property describes the state if the parent is visible.
If determine the state that includes the visibility of all parents a widget can be queried for its effective visibility
using :cpp:func:`~bool Tui::ZWidget::isVisible() const`.
All child widgets that share a parent are organised into a stacking order.
When Widgets overlap the widget lower in this order is covered by the widget higher in the stacking order.
Widgets that are newly added to a parent at placed on top of other widgets with the same stacking layer.
The stacking layer(:cpp:func:`~void Tui::ZWidget::setStackingLayer(int layer)`,
:cpp:func:`~int Tui::ZWidget::stackingLayer() const`) allows defining bands in the stacking that can be managed
independently.
For example to place popup menus or dialogs above normal user interface elements.
Points can be mapped from relative to a given widget to relative to the terminal and back using
:cpp:func:`~QPoint Tui::ZWidget::mapFromTerminal(const QPoint &pos)` and
:cpp:func:`~QPoint Tui::ZWidget::mapToTerminal(const QPoint &pos)`.
Layout and Margins
------------------
Widgets can have margins.
The margin of a widget defined how much whitespace should be placed around the contents of if.
Not all widget classes support marging.
Often it is convinient to have the placement of widgets in a parent automated.
This allows exact placement to automatically adapt to changes to the size of the widget and avoids doing position
calculations manually or adhoc in the code using the widgets.
This automated placement is done by so called "layouts".
Layouts like :cpp:class:`Tui::ZHBoxLayout` and
:cpp:class:`Tui::ZVBoxLayout` are classes derived from :cpp:class:`Tui::ZLayout`.
Each widget can have one top level layout set using :cpp:func:`~void Tui::ZWidget::setLayout(ZLayout *l)`.
Then child widgets can be added to that layout (or one of its nested layouts) using layout specific functions.
To customized the layout the functions :cpp:func:`~void Tui::ZWidget::setMaximumSize(QSize s)`,
:cpp:func:`~void Tui::ZWidget::setMinimumSize(QSize s)`,
:cpp:func:`~void Tui::ZWidget::setFixedSize(QSize s)`,
:cpp:func:`~void Tui::ZWidget::setSizePolicyH(Tui::SizePolicy policy)` and
:cpp:func:`~void Tui::ZWidget::setSizePolicyV(Tui::SizePolicy policy)` can be used.
They allow specifing how the available space is allocated to the widgets.
Focus
-----
Keyboard input and paste events are processed by the widget that currently has focus.
Focus is a per terminal property.
The focus can be placed on a widget by calling
:cpp:func:`setFocus() <void Tui::ZWidget::setFocus(Tui::FocusReason reason)>`.
In a :ref:`window <ZWindow>`, focus can be switched by the user using :kbd:`Tab` and :kbd:`Shift+Tab`.
This cycles through visible and enabled widgets that have a
:cpp:func:`focus policy <void Tui::ZWidget::setFocusPolicy(Tui::FocusPolicy policy)>` that allows for keyboard focusing.
:cpp:class:`Tui::ZRoot` implements switching focus between windows using :kbd:`F6` and :kbd:`Shift+F6`.
Focus order can be setup using :cpp:func:`~void Tui::ZWidget::setFocusOrder(int order)`.
For widgets with the same focus order value, focus follows the stacking order from bottom to top.
In addition to using the keyboard to move in the focus among the focus order the functions
:cpp:func:`ZWidget *Tui::ZWidget::placeFocus(bool last)`,
:cpp:func:`ZWidget *Tui::ZWidget::nextFocusable()` and
:cpp:func:`ZWidget *Tui::ZWidget::prevFocusable()`
can be used for focus management.
Widgets optionally can act as focus containers.
This modifies how focus inside such widgets is handled.
For widgets that act as windows the focus container mode :cpp:enumerator:`Tui::FocusContainerMode::Cycle` can be used
to restrict focus changes by :kbd:`Tab`/:kbd:`Shift+Tab` and via
:cpp:func:`ZWidget *Tui::ZWidget::nextFocusable()`/:cpp:func:`ZWidget *Tui::ZWidget::prevFocusable()` from moving the
focus outside of the widget.
If the last focusable widget inside the widget marked with the mode was focused last the next widget to focus will
be the first focusable widget in the container.
Reverse focus movement works respectivly.
To restrict the scope of the effects of the focus order property the focus container mode
:cpp:enumerator:`Tui::FocusContainerMode::SubOrdering` can be used.
..
TODO: say more about sub ordering mode?
Widgets can be enabled, that is ready for user interaction, or disabled.
Similarily to how visibility works, enabled is a local setting but only is effective when the parent is also effecivly
enabled.
Sometimes a widget needs to override focus handling and temporarily route all keyboard input to itself.
This can be achieved by initiation of a keyboard grab using :cpp:func:`~void Tui::ZWidget::grabKeyboard()`.
Terminal
--------
Widgets only fully work in conjunction with a terminal represented by a :cpp:class:`Tui::ZTerminal` instance.
A widget is connected to a terminal if itself is the main widget of a terminal or one of its ancestors is the main
widget of a terminal.
Fully functional focus handling depends on the terminal, although unconnected widgets keep a note on calling
:cpp:func:`setFocus() <void Tui::ZWidget::setFocus(Tui::FocusReason reason = Tui::OtherFocusReason)>`, as a fallback
for the special case that a widget tree is constructed before setting the terminal's main widget.
Apart from this minimal support, focus, keyboard grabs, cursor configuration and even text measuring are not available
without a terminal.
Usage of widgets
----------------
Generally a widget is created with a parent as a constructor parameter and then either manually placed using
:cpp:func:`~void Tui::ZWidget::setGeometry(const QRect &geometry)` or placed using a layout.
TODO example
The colors used in the widgets that are part of Tui Widgets are taken from a palette associated with the widget or one
of its parents.
In some situations the colors can also be influenced by the palette class set on a widget or one of its parents.
When using widgets in a window focus order if determined by :cpp:func:`void Tui::ZWidget::setFocusOrder(int order)`,
where widgets with the same focus order are reached in order of their z-order from bottom (smaller values) to
top (larger values).
Defining custom widgets
-----------------------
While Tui Widgets provides a set of useful widgets for common tasks, there are often situations where a custom
widget is a good way to realize a part of the user interface.
Custom widgets are created by subclassing ZWidget.
The widget behavior can then be customized by overriding virtual functions.
To customize rendering of the widget override :cpp:func:`~void Tui::ZWidget::paintEvent(Tui::ZPaintEvent *event)`.
To customize input handling override :cpp:func:`~void Tui::ZWidget::keyEvent(Tui::ZKeyEvent *event)` and
:cpp:func:`~void Tui::ZWidget::pasteEvent(Tui::ZPasteEvent *event)`.
Also set the :cpp:func:`focus policy <void Tui::ZWidget::setFocusPolicy(Tui::FocusPolicy policy)>` to receive input.
To customize reactions to changes in widget state use
:cpp:func:`~void Tui::ZWidget::focusInEvent(Tui::ZFocusEvent *event)`,
:cpp:func:`~void Tui::ZWidget::focusOutEvent(Tui::ZFocusEvent *event)`,
:cpp:func:`~void Tui::ZWidget::moveEvent(Tui::ZMoveEvent *event)` and
:cpp:func:`~void Tui::ZWidget::resizeEvent(Tui::ZResizeEvent *event)` .
Further customization is available using
:cpp:func:`~virtual QObject *Tui::ZWidget::facet(const QMetaObject &metaObject) const`,
:cpp:func:`~virtual QSize Tui::ZWidget::sizeHint() const` and
:cpp:func:`~virtual QSize Tui::ZWidget::minimumSizeHint() const`.
It is often useful to setup
:cpp:func:`~void Tui::ZWidget::setPaletteClass(QStringList classes)`,
:cpp:func:`~void Tui::ZWidget::setContentsMargins(QMargins m)`,
:cpp:func:`~void Tui::ZWidget::setMinimumSize(QSize s)`,
:cpp:func:`~void Tui::ZWidget::setMaximumSize(QSize s)`,
:cpp:func:`~void Tui::ZWidget::setFixedSize(QSize s)`,
:cpp:func:`~void Tui::ZWidget::setFocusMode(FocusContainerMode mode)`,
:cpp:func:`~void Tui::ZWidget::setFocusPolicy(Tui::FocusPolicy policy)`,
:cpp:func:`~void Tui::ZWidget::setSizePolicyH(Tui::SizePolicy policy)`,
:cpp:func:`~void Tui::ZWidget::setSizePolicyV(Tui::SizePolicy policy)` and
:cpp:func:`~void Tui::ZWidget::setStackingLayer(int layer)`
to a widget specific default in the widget constructor, but these are genereally reserved for customization by the
widget user after construction.
ZWidget
-------
.. cpp:class:: Tui::ZWidget : public QObject
This class is neither copyable nor movable. It does not define comparison operators.
**Constructors**
:cpp:func:`Tui::ZWidget::ZWidget(ZWidget *parent = nullptr) <void Tui::ZWidget::ZWidget(ZWidget *parent = nullptr)>`
**Functions**
| :cpp:func:`void addPaletteClass(const QString &clazz)`
| :cpp:func:`ZCommandManager *commandManager() const`
| :cpp:func:`QMargins contentsMargins() const`
| :cpp:func:`QRect contentsRect() const`
| :cpp:func:`CursorStyle cursorStyle() const`
| :cpp:func:`QSize effectiveMinimumSize() const`
| :cpp:func:`QSize effectiveSizeHint() const`
| :cpp:func:`ZCommandManager *ensureCommandManager()`
| :cpp:func:`virtual QObject *facet(const QMetaObject &metaObject) const`
| :cpp:func:`template<typename T> T *findFacet() const`
| :cpp:func:`bool focus() const`
| :cpp:func:`FocusContainerMode focusMode() const`
| :cpp:func:`int focusOrder() const`
| :cpp:func:`Tui::FocusPolicy focusPolicy() const`
| :cpp:func:`QRect geometry() const`
| :cpp:func:`ZColor getColor(const ZImplicitSymbol &x)`
| :cpp:func:`void grabKeyboard()`
| :cpp:func:`void grabKeyboard(Private::ZMoFunc<void(QEvent*)> handler)`
| :cpp:func:`bool isAncestorOf(const ZWidget *child) const`
| :cpp:func:`bool isEnabled() const`
| :cpp:func:`bool isEnabledTo(const ZWidget *ancestor) const`
| :cpp:func:`bool isInFocusPath() const`
| :cpp:func:`bool isLocallyEnabled() const`
| :cpp:func:`bool isLocallyVisible() const`
| :cpp:func:`bool isVisible() const`
| :cpp:func:`bool isVisibleTo(const ZWidget *ancestor) const`
| :cpp:func:`ZLayout *layout() const`
| :cpp:func:`virtual QRect layoutArea() const`
| :cpp:func:`void lower()`
| :cpp:func:`QPoint mapFromTerminal(const QPoint &pos)`
| :cpp:func:`QPoint mapToTerminal(const QPoint &pos)`
| :cpp:func:`QSize maximumSize() const`
| :cpp:func:`QSize minimumSize() const`
| :cpp:func:`virtual QSize minimumSizeHint() const`
| :cpp:func:`ZWidget const *nextFocusable() const`
| :cpp:func:`ZWidget *nextFocusable()`
| :cpp:func:`const ZPalette &palette() const`
| :cpp:func:`QStringList paletteClass() const`
| :cpp:func:`ZWidget *parentWidget() const`
| :cpp:func:`const ZWidget *placeFocus(bool last = false) const`
| :cpp:func:`ZWidget *placeFocus(bool last = false)`
| :cpp:func:`ZWidget const *prevFocusable() const`
| :cpp:func:`ZWidget *prevFocusable()`
| :cpp:func:`void raise()`
| :cpp:func:`QRect rect() const`
| :cpp:func:`void releaseKeyboard()`
| :cpp:func:`void removePaletteClass(const QString &clazz)`
| :cpp:func:`void resetCursorColor()`
| :cpp:func:`virtual ZWidget *resolveSizeHintChain()`
| :cpp:func:`int stackingLayer() const`
| :cpp:func:`void stackUnder(ZWidget *w)`
| :cpp:func:`void setCommandManager(ZCommandManager *cmd)`
| :cpp:func:`void setContentsMargins(QMargins m)`
| :cpp:func:`void setCursorColor(int r, int b, int g)`
| :cpp:func:`void setCursorStyle(CursorStyle style)`
| :cpp:func:`void setEnabled(bool e)`
| :cpp:func:`void setFixedSize(QSize s)`
| :cpp:func:`void setFixedSize(int w, int h)`
| :cpp:func:`void setFocus(Tui::FocusReason reason = Tui::OtherFocusReason)`
| :cpp:func:`void setFocusMode(FocusContainerMode mode)`
| :cpp:func:`void setFocusOrder(int order)`
| :cpp:func:`void setFocusPolicy(Tui::FocusPolicy policy)`
| :cpp:func:`void setGeometry(const QRect &geometry)`
| :cpp:func:`void setLayout(ZLayout *l)`
| :cpp:func:`void setMaximumSize(QSize s)`
| :cpp:func:`void setMaximumSize(int w, int h)`
| :cpp:func:`void setMinimumSize(QSize s)`
| :cpp:func:`void setMinimumSize(int w, int h)`
| :cpp:func:`void setPalette(const ZPalette &pal)`
| :cpp:func:`void setPaletteClass(QStringList classes)`
| :cpp:func:`void setParent(ZWidget *newParent)`
| :cpp:func:`void setSizePolicyH(Tui::SizePolicy policy)`
| :cpp:func:`void setSizePolicyV(Tui::SizePolicy policy)`
| :cpp:func:`void setStackingLayer(int layer)`
| :cpp:func:`void setVisible(bool v)`
| :cpp:func:`void showCursor(QPoint position)`
| :cpp:func:`virtual QSize sizeHint() const`
| :cpp:func:`Tui::SizePolicy sizePolicyH() const`
| :cpp:func:`Tui::SizePolicy sizePolicyV() const`
| :cpp:func:`ZTerminal *terminal() const`
| :cpp:func:`void update()`
| :cpp:func:`void updateGeometry()`
**Protected Functions**
| :cpp:func:`void focusInEvent(Tui::ZFocusEvent *event)`
| :cpp:func:`void focusOutEvent(Tui::ZFocusEvent *event)`
| :cpp:func:`void keyEvent(Tui::ZKeyEvent *event)`
| :cpp:func:`void moveEvent(Tui::ZMoveEvent *event)`
| :cpp:func:`void paintEvent(Tui::ZPaintEvent *event)`
| :cpp:func:`void pasteEvent(Tui::ZPasteEvent *event)`
| :cpp:func:`void resizeEvent(Tui::ZResizeEvent *event)`
Members
-------
.. cpp:namespace:: Tui::ZWidget
.. cpp:function:: explicit ZWidget(ZWidget *parent = nullptr)
The constructed widget uses ``parent`` as its parent.
.. cpp:function:: ZWidget *parentWidget() const
Returns the QObject parent if it is a widget or :cpp:expr:`nullptr` otherwise.
.. cpp:function:: void setParent(ZWidget *newParent)
Sets the QObject parent to ``parent``, updating Tui Widgets bookkeeping as well.
sends QEvent::ParentAboutToChange
adjusts focus
Always use ZWidget::setParent instead of QObject::setParent. Otherwise events are not generated and various
widget and terminal state is not correctly updated.
.. cpp:function:: QRect geometry() const
.. cpp:function:: void setGeometry(const QRect &geometry)
The geometry of a widget represents the position relative to its parent widget and its size.
.. cpp:function:: QRect rect() const
Returns a QRect representing the whole widget in local coordinates.
That is it starts at (0, 0) and has the same width and height as :cpp:func:`~QRect Tui::ZWidget::geometry() const`.
.. cpp:function:: QRect contentsRect() const
Returns a QRect representing the part of the widget inside the margins in local coordinates.
.. cpp:function:: bool isEnabled() const
.. cpp:function:: bool isLocallyEnabled() const
.. cpp:function:: void setEnabled(bool e)
The enabled state describes if a widget is accepting user interaction.
Commonly widgets that are disabled (i.e. not enabled) have a visible difference to their enabled state.
Tui Widgets does not send either :cpp:func:`Tui::ZEventType::key()` or :cpp:func:`Tui::ZEventType::paste()`
events to disabled widgets.
A widget is enabled if itself and all its parents are enabled.
The local enabled state of the widget is availabe by calling ``isLocallyEnabled`` and can be changed by
``setEnabled``.
``setEnabled`` only directly effects the state returned by ``isEnabled`` if the parent widget's effectivly enabled
state (the return value of ``isEnabled``) was already :cpp:expr:`true`.
Only changes to the effective enabled state trigger an event.
The event sent is :ref:`QEvent::EnabledChange <qevent_enablechanged>`.
If a change in the effective enabled state of a focused widget results in it beeing disabled, it looses its focus
and the focus is either moved to the next focusable widget or if no such widget exists the focus is removed.
.. cpp:function:: bool isVisible() const
.. cpp:function:: bool isLocallyVisible() const
.. cpp:function:: void setVisible(bool v)
The visiblity of a widget describes if the widget is rendered.
Even if a widget is visible according to this property it can still be occluded by a widget higher in the stacking
order or be in a position that is not visible to the user.
A widget is visible if itself and all its parents are visible.
The local visibility state of the widget is availabe by calling ``isLocallyVisible`` and can be changed by
``setVisibile``.
``setVisible`` only directly effects the state returned by ``isVisible`` if the parent widget was already visible.
Changing the local visibility state can trigger two kinds of events.
Changes in the local visibility state trigger the events :ref:`QEvent::ShowToParent <qevent_showtoparent>` and
:ref:`QEvent::HideToParent <qevent_hidetoparent>`.
Changes to the effective visibility state (the return value of ``isVisible``) result in delivery of the events
:cpp:func:`Tui::ZEventType::show()` and :cpp:func:`Tui::ZEventType::hide()`.
If a change in the effective visibility state of a focused widget results in it beeing no longer visible, it looses
its focus and the focus is either moved to the next focusable widget or if no such widget exists the focus is removed.
.. cpp:function:: void setStackingLayer(int layer)
.. cpp:function:: int stackingLayer() const
The z-order of widgets is organized into stacking layers.
Stacking layers with higher number are higher.
In each stacking layer widgets can be moved using :cpp:func:`~void Tui::ZWidget::raise()`,
:cpp:func:`~void Tui::ZWidget::lower()` and :cpp:func:`~void Tui::ZWidget::stackUnder(ZWidget *w)`.
But these functions can not move a widget outside of its stacking layer.
When moving a widget to a different stacking layer it is always placed as the top most widget of the new
stacking layer.
.. cpp:function:: void raise()
Move the widget to the top of its stacking layer.
.. cpp:function:: void lower()
Move the widget to the bottom of its stacking layer.
.. cpp:function:: void stackUnder(ZWidget *w)
Adjust z-order of the widget to be just below ``w``.
Does not move the widget from its stacking layer.
.. cpp:function:: QSize minimumSize() const
.. cpp:function:: void setMinimumSize(QSize s)
.. cpp:function:: void setMinimumSize(int w, int h)
.. cpp:function:: QSize maximumSize() const
.. cpp:function:: void setMaximumSize(QSize s)
.. cpp:function:: void setMaximumSize(int w, int h)
.. cpp:function:: void setFixedSize(QSize s)
.. cpp:function:: void setFixedSize(int w, int h)
The minimum and maximum size represent contraints for layouting.
``setFixedSize`` is just a short form for setting maximum and minimum size to the same value.
Direct usage of :cpp:func:`~void Tui::ZWidget::setGeometry(const QRect &geometry)` is not constrained by these
properties.
.. cpp:function:: Tui::SizePolicy sizePolicyH() const
.. cpp:function:: void setSizePolicyH(Tui::SizePolicy policy)
.. cpp:function:: Tui::SizePolicy sizePolicyV() const
.. cpp:function:: void setSizePolicyV(Tui::SizePolicy policy)
The size policy of an widget is used by layouts to determine how space is allocated to the widget.
See :cpp:enum:`Tui::SizePolicy` for details.
.. rst-class:: tw-virtual
.. cpp:function:: QSize sizeHint() const
Returns the calculated size of the widget.
This is used by the layout system when placing the widget.
When implementing widgets, override this to return the preferred size of the widget.
The meaning depends on the set :cpp:enum:`size policy <Tui::SizePolicy>`.
.. rst-class:: tw-virtual
.. cpp:function:: QSize minimumSizeHint() const
Returns the calculated minimum size of the widget.
.. cpp:function:: QSize effectiveSizeHint() const
.. cpp:function:: QSize effectiveMinimumSize() const
.. rst-class:: tw-virtual
.. cpp:function:: QRect layoutArea() const
Returns a QRect describing the area in the widget that should be used for layouts to place the child widgets.
.. cpp:function:: ZLayout *layout() const
.. cpp:function:: void setLayout(ZLayout *l)
The layout of a widget allows automatically placing child widgets in the widget's layout area.
If a layout is set it will control the size request of the widget based on the size requests of the widgets in
the layout.
See also: :ref:`ZLayout`
.. cpp:function:: void showCursor(QPoint position)
Place the terminal cursor to widget relative position ``position`` if possible.
Placing the cursor is possible if:
* If this widget has focus and the keyboard focus is not grabbed, or the widget is the grabbing widget
* The cursor is inside the clipping region of the widget and all its parent widgets.
This function can only be used while handling the :cpp:func:`void paintEvent(Tui::ZPaintEvent *event)`
because the cursor position is reset at the start of each rendering cycle.
.. cpp:function:: CursorStyle cursorStyle() const
.. cpp:function:: void setCursorStyle(CursorStyle style)
The cursor style used to display the cursor in this widget.
Support of this depends on the terminal's capabilities.
.. cpp:function:: void resetCursorColor()
.. cpp:function:: void setCursorColor(int r, int b, int g)
The color used to display the cursor in this widget.
Support of this depends on the terminal's capabilities.
The range for ``r``, ``g``, ``b`` for setting a cursor color is 0 - 255.
A special value of :cpp:expr:`(-1, -1, -1)` represents using the terminal default cursor color.
.. cpp:function:: ZTerminal *terminal() const
Returns the terminal this widget is connected to.
.. cpp:function:: void update()
Requests the widget to be redrawn.
When creating a custom widget the implementation must call this function whenever the the visible contents of the
widget changes.
It should never be needed to call this when just using a widget.
.. cpp:function:: void updateGeometry()
Requests the layouts containing the widgets to be updated.
When creating a custom widget the implementation must call this function whenever properties that influence the
layout of this widget or its direct children change.
It should never be needed to call this when just using a widget.
.. cpp:function:: void setFocus(Tui::FocusReason reason = Tui::OtherFocusReason)
Requests focus for the widget.
.. cpp:function:: void setFocusPolicy(Tui::FocusPolicy policy)
.. cpp:function:: Tui::FocusPolicy focusPolicy() const
The focus policy determines how this widget can gain focus.
If the focus policy contains
:cpp:enumerator:`Tui::TabFocus` the widget is focusable by keyboard navigation (i.e. using :kbd:`Tab` etc).
:cpp:enumerator:`Tui::StrongFocus` includes :cpp:enumerator:`Tui::TabFocus`.
.. cpp:function:: void setFocusMode(FocusContainerMode mode)
.. cpp:function:: FocusContainerMode focusMode() const
See :cpp:enum:`Tui::FocusContainerMode` for details.
.. cpp:function:: void setFocusOrder(int order)
.. cpp:function:: int focusOrder() const
Defines the ordering of the widget in the focus order.
Higher values yield a later position in the focus order.
If two widgets in the same focus container have the same focus order, their relative z-order is used to determine
focus order.
.. cpp:function:: QMargins contentsMargins() const
.. cpp:function:: void setContentsMargins(QMargins m)
Margins allow to add empty space around the contents of a widget.
.. cpp:function:: const ZPalette &palette() const
.. cpp:function:: void setPalette(const ZPalette &pal)
A widgets palette sets or modifies the palette colors for a widget and its decendents.
Usually the root of the widget tree needs a palette that sets up all the standard colors for an application.
This is usually done by using :cpp:class:`Tui::ZRoot` as root widget.
Other widgets don't need to have a palette set, but it can be useful to set a palette for changing colors of
specific widgets. In that case the usual way is to retrieve the palette, set some overriding color definitions and
set the resulting palette on the widget.
See :ref:`ZPalette` for details.
.. cpp:function:: ZColor getColor(const ZImplicitSymbol &x)
Get a specific palette color named by ``x``.
If the color is not properly defined this function will just return red as an error indicator.
Many colors are only defined for widgets that are contained in windows.
This internally uses :cpp:func:`ZColor Tui::ZPalette::getColor(ZWidget *targetWidget, ZImplicitSymbol x)`.
.. cpp:function:: QStringList paletteClass() const
.. cpp:function:: void setPaletteClass(QStringList classes)
.. cpp:function:: void addPaletteClass(const QString &clazz)
.. cpp:function:: void removePaletteClass(const QString &clazz)
The list of palette classes modifies which colors are active from the palette.
.. cpp:function:: void grabKeyboard()
.. cpp:function:: void grabKeyboard(Private::ZMoFunc<void(QEvent*)> handler)
.. cpp:function:: void releaseKeyboard()
The keyboard grab allows to temporarily override keyboard focus and redirect input to this widget or to a
dedicated event handling closure.
.. cpp:function:: bool isAncestorOf(const ZWidget *child) const
Returns ``true`` if ``child`` is an ancestor of this widget.
If the widget is passed as ``child`` it returns :cpp:expr:`true` too.
.. cpp:function:: bool isEnabledTo(const ZWidget *ancestor) const
Returns :cpp:expr:`true` if all widgets on the path from the widget to ``ancestor`` (excluding ``ancestor``, but
including the widget) are locally enabled.
.. cpp:function:: bool isVisibleTo(const ZWidget *ancestor) const
Returns :cpp:expr:`true` if all widgets on the path from the widget to ``ancestor`` (excluding ``ancestor``, but
including the widget) are locally visible.
.. cpp:function:: bool focus() const
Returns :cpp:expr:`true` if the widget has focus.
.. cpp:function:: bool isInFocusPath() const
Returns :cpp:expr:`true` if the widget or any of its descendants has focus.
.. cpp:function:: QPoint mapFromTerminal(const QPoint &pos)
.. cpp:function:: QPoint mapToTerminal(const QPoint &pos)
Map the point ``pos`` between local coordinates and terminal coordinates.
.. cpp:function:: ZWidget const *prevFocusable() const
.. cpp:function:: ZWidget *prevFocusable()
.. cpp:function:: ZWidget const *nextFocusable() const
.. cpp:function:: ZWidget *nextFocusable()
Returns the next/previous widget in the focus order or :cpp:expr:`nullptr` if no such widget exists.
.. cpp:function:: const ZWidget *placeFocus(bool last = false) const
.. cpp:function:: ZWidget *placeFocus(bool last = false)
Returns the first/last widget in the widget and its decendents that can take focus or :cpp:expr:`nullptr` of no such widget exists.
.. rst-class:: tw-virtual
.. cpp:function:: ZWidget *resolveSizeHintChain()
Applications can override this function to customize which widgets are considered linked by chained layouts for
layout cycles.
The base implementation considers widgets to be linked to their parent if the parent has a layout set.
Application should only need to override this if they implement automatic widget layouting without using layouts.
.. cpp:function:: void setCommandManager(ZCommandManager *cmd)
.. cpp:function:: ZCommandManager *commandManager() const
The command manager associated with the widget is responsible for connection command and command notifiers.
.. cpp:function:: ZCommandManager *ensureCommandManager()
If no command manager is associated with the widget, sets a new :cpp:class:`ZCommandManager` instance.
It then returns the existing or newly created command manager.
.. rst-class:: tw-virtual
.. cpp:function:: QObject *facet(const QMetaObject &metaObject) const
A facet is a way to add additionals interfaces to a widget without coupeling it to the widget's implementation class.
This is used for example for window related behavior using the ZWindowFacet and
for default controls using ZDefaultWidgetManager.
It returns a reference to a class implementing the interface of ``metaObject``.
.. cpp:function:: template<typename T> T *findFacet() const
Returns a facet from this widget or the nearest parent implementing it.
.. rst-class:: tw-virtual
.. cpp:function:: void paintEvent(Tui::ZPaintEvent *event)
This event handler is used in widget implementations to handle the paint event.
See :cpp:func:`Tui::ZEventType::paint()` for details.
.. rst-class:: tw-virtual
.. cpp:function:: void keyEvent(Tui::ZKeyEvent *event)
This event handler is used in widget implementations to handle the key event.
See :cpp:func:`Tui::ZEventType::key()` for details.
.. rst-class:: tw-virtual
.. cpp:function:: void pasteEvent(Tui::ZPasteEvent *event)
This event handler is used in widget implementations to handle the paste event.
See :cpp:func:`Tui::ZEventType::paste()` for details.
.. rst-class:: tw-virtual
.. cpp:function:: void focusInEvent(Tui::ZFocusEvent *event)
This event handler is used in widget implementations to handle the focus in event.
See :cpp:func:`Tui::ZEventType::focusIn()` for details.
.. rst-class:: tw-virtual
.. cpp:function:: void focusOutEvent(Tui::ZFocusEvent *event)
This event handler is used in widget implementations to handle the focus out event.
See :cpp:func:`Tui::ZEventType::focusOut()` for details.
.. rst-class:: tw-virtual
.. cpp:function:: void resizeEvent(Tui::ZResizeEvent *event)
This event handler is used in widget implementations to handle the resize event.
See :cpp:func:`Tui::ZEventType::resize()` for details.
.. rst-class:: tw-virtual
.. cpp:function:: void moveEvent(Tui::ZMoveEvent *event)
This event handler is used in widget implementations to handle the move event.
See :cpp:func:`Tui::ZEventType::move()` for details.
.. cpp:namespace:: NULL
Related Types
-------------
.. cpp:enum:: Tui::SizePolicy
The enum describes how layout should allocate space to an item.
.. cpp:enumerator:: Fixed
The item should be be kept at the size indicated by the size hint.
.. cpp:enumerator:: Minimum
The size hint is the minimum acceptable size.
.. cpp:enumerator:: Maximum
The size hint is the maximum acceptable size.
.. cpp:enumerator:: Preferred
The item can shrink and expand.
.. cpp:enumerator:: Expanding
The item can shrink and expand.
Items with this policy should be preferred over items with other policies when expanding.
.. cpp:enum:: Tui::FocusContainerMode
If not ``None`` the widget with this mode is a focus container.
.. cpp:enumerator:: None
The widget is not a focus container.
.. cpp:enumerator:: Cycle
A widget with this mode will not pass focus to the parent widget or to its siblings.
Use this for windows and dialogs.
.. cpp:enumerator:: SubOrdering
A widget with this mode will determine focus order locally using the focus order property.
If all widgets inside this widgets are passed throught it will pass focus to the parent widget or to its siblings.
|