.. _knobs-knobtypes:

Knob Types
==========

This monster of a page presents all the knobs a NUKE Op is capable of creating, both by their ID and usage area. For a great example of most of them, check out the KnobParade example. The Knobs :ref:`knobs-intro` covers a number of factors to take into account when creating instances of these knobs.

Knobs By ID
-----------

==  =====================================================    ========================================================================  ========
ID  Call(s)                                                  UI & Notes                                                                Widget
==  =====================================================    ========================================================================  ========
0   | :ref:`knobs-knobtypes-obsolete_knob`             	     No Properties panel or Viewer widgets
1   | :ref:`knobs-knobtypes-string_knob`         	     .. image:: /_static/knobs-and-handles/String_knob.png
2   | :ref:`knobs-knobtypes-file_knob` 		       	     .. image:: /_static/knobs-and-handles/File_knob.png
    | :ref:`knobs-knobtypes-write_file_knob`	       	     .. image:: /_static/knobs-and-handles/Write_File_knob.png
3   | :ref:`knobs-knobtypes-int_knob`  		       	     .. image:: /_static/knobs-and-handles/Int_knob.png
    | :ref:`knobs-knobtypes-multiint_knob` 	       	     .. image:: /_static/knobs-and-handles/MultiInt_knob.png
4   | :ref:`knobs-knobtypes-enumeration_knob`        	     .. image:: /_static/knobs-and-handles/Enumeration_knob_open.png
5   | :ref:`knobs-knobtypes-bitmask_knob` 	       	     .. image:: /_static/knobs-and-handles/Bitmask_knob.png
6   | :ref:`knobs-knobtypes-bool_knob` 		       	     .. image:: /_static/knobs-and-handles/Bool_knob.png
7   | :ref:`knobs-knobtypes-double_knob`	       	     .. image:: /_static/knobs-and-handles/Double_knob.png
8   | :ref:`knobs-knobtypes-float_knob`		       	     .. image:: /_static/knobs-and-handles/Float_knob.png
    | :ref:`knobs-knobtypes-multifloat_knob`	       	     .. image:: /_static/knobs-and-handles/MultiFloat_knob.png
9   | :ref:`knobs-knobtypes-array_knob` 	       	     .. image:: /_static/knobs-and-handles/Array_knob.png
10  | :ref:`knobs-knobtypes-channelset_knob`       	     .. image:: /_static/knobs-and-handles/ChannelSet_knob_open.png
    | :ref:`knobs-knobtypes-channelmask_knob`	       	     .. image:: /_static/knobs-and-handles/ChanneMask_knob_open.png
    | :ref:`knobs-knobtypes-input_channelset_knob`     	     .. image:: /_static/knobs-and-handles/Input_ChannelSet_knob_open.png
    | :ref:`knobs-knobtypes-input_channelmask_knob`    	     .. image:: /_static/knobs-and-handles/Input_ChannelMask_knob_open.png
11  | :ref:`knobs-knobtypes-channel_knob`	       	     .. image:: /_static/knobs-and-handles/Channel_knob_open.png
    | :ref:`knobs-knobtypes-input_channel_knob`        	     .. image:: /_static/knobs-and-handles/Input_Channel_knob_open.png
12  | :ref:`knobs-knobtypes-xy_knob`   		       	     .. image:: /_static/knobs-and-handles/XY_knob.png                         .. image:: /_static/knobs-and-handles/XY_knob_widget.png
13  | :ref:`knobs-knobtypes-xyz_knob`  		       	     .. image:: /_static/knobs-and-handles/XYZ_knob.png
14  | :ref:`knobs-knobtypes-wh_knob`   		       	     .. image:: /_static/knobs-and-handles/WH_knob.png
15  | :ref:`knobs-knobtypes-bbox_knob` 		       	     .. image:: /_static/knobs-and-handles/BBox_knob.png                       .. image:: /_static/knobs-and-handles/BBox_knob_widget.png
16  | Obsoleted by 17              		       	     Was Size_knob
17  | :ref:`knobs-knobtypes-format_knob`	       	     .. image:: /_static/knobs-and-handles/Format_knob.png
18  | :ref:`knobs-knobtypes-color_knob`		       	     .. image:: /_static/knobs-and-handles/Color_knob.png
19  | :ref:`knobs-knobtypes-acolor_knob`	       	     .. image:: /_static/knobs-and-handles/AColor_knob.png
20  | :ref:`knobs-knobtypes-tab_knob`  		       	     .. image:: /_static/knobs-and-handles/Tab_knob.png
    | :ref:`knobs-knobtypes-begingroup`		       	     .. image:: /_static/knobs-and-handles/BeginGroup.png
    | :ref:`knobs-knobtypes-beginclosedgroup`          	     .. image:: /_static/knobs-and-handles/BeginClosedGroup.png
21  | :ref:`knobs-knobtypes-custom_knob`	       	     Properties panel/Viewer widget dependent on custom knob implementation
22  | :ref:`knobs-knobtypes-pyscript_knob`	       	     .. image:: /_static/knobs-and-handles/PyScript_Button.png
23  | Obsoleted by 28              		       	     Was Text_editor_knob
24  | :ref:`knobs-knobtypes-transform2d_knob`       	     .. image:: /_static/knobs-and-handles/Transform2d_knob.png                .. image:: /_static/knobs-and-handles/Transform2d_knob_widget.png
25  | :ref:`knobs-knobtypes-spacer`    		       	     .. image:: /_static/knobs-and-handles/Spacer.png
26  | :ref:`knobs-knobtypes-text_knob` 		       	     .. image:: /_static/knobs-and-handles/Text_knob.png
    | :ref:`knobs-knobtypes-named_text_knob`        	     
    | :ref:`knobs-knobtypes-divider`   		       	     .. image:: /_static/knobs-and-handles/Divider.png
27  | :ref:`knobs-knobtypes-help_knob` 		       	     .. image:: /_static/knobs-and-handles/Help_knob.png
28  | :ref:`knobs-knobtypes-multiline_string_knob`     	     .. image:: /_static/knobs-and-handles/Multiline_String_knob.png
29  | :ref:`knobs-knobtypes-axis_knob` 		       	     .. image:: /_static/knobs-and-handles/Axis_knob.png                       .. image:: /_static/knobs-and-handles/Axis_knob_widget.png
30  | :ref:`knobs-knobtypes-uv_knob`   		       	     .. image:: /_static/knobs-and-handles/UV_knob.png
31  | :ref:`knobs-knobtypes-box3_knob` 		       	     .. image:: /_static/knobs-and-handles/Box3_knob.png                       .. image:: /_static/knobs-and-handles/Box3_knob_widget.png
32  | :ref:`knobs-knobtypes-button`    		       	     .. image:: /_static/knobs-and-handles/Button.png
    | :ref:`knobs-knobtypes-script_knob`	       	     .. image:: /_static/knobs-and-handles/Script_Button.png
33  | :ref:`knobs-knobtypes-lookupcurves_knob`       	     .. image:: /_static/knobs-and-handles/LookupCurves_knob.png
34  | n/a                          		       	     Was Tooltip_knob
35  | :ref:`knobs-knobtypes-pulldown_knob`	       	     .. image:: /_static/knobs-and-handles/Pulldown_knob_open.png
36  | :ref:`knobs-knobtypes-eyedropper_knob`	       	     .. image:: /_static/knobs-and-handles/Eyedropper_knob.png
37  | :ref:`knobs-knobtypes-range_knob`		       	     .. image:: /_static/knobs-and-handles/Range_knob.png
38  | :ref:`knobs-knobtypes-histogram_knob`	       	     .. image:: /_static/knobs-and-handles/Histogram_knob.png
39  | :ref:`knobs-knobtypes-keyer_knob`		       	     .. image:: /_static/knobs-and-handles/Keyer_knob.png
40  | :ref:`knobs-knobtypes-colorchip_knob`	       	     .. image:: /_static/knobs-and-handles/ColorChip_knob.png
41  | :ref:`knobs-knobtypes-link_knob` 		       	     Inherits Properties panel/widgets of 'linked' knob
42  | :ref:`knobs-knobtypes-scale_knob`			     .. image:: /_static/knobs-and-handles/Scale_knob.png
43  | Multiline_Eval_String_knob() 		       	     .. image:: /_static/knobs-and-handles/Multiline_String_knob.png
    | See :ref:`knobs-knobtypes-multiline_string_knob`
44  | :ref:`knobs-knobtypes-oneview_knob`       	     .. image:: /_static/knobs-and-handles/OneView_knob.png
45  | :ref:`knobs-knobtypes-multiview_knob`	       	     .. image:: /_static/knobs-and-handles/MultiView_knob.png
46  | :ref:`knobs-knobtypes-viewview_knob`	       	     .. image:: /_static/knobs-and-handles/ViewView_knob.png
47  | :ref:`knobs-knobtypes-pypulldown_knob`	       	     .. image:: /_static/knobs-and-handles/PyPulldown_knob_open.png
48  | GPUEngine_knob             		       	     WIP - Do not use
49  | MultiArray_knob					     Generally, Table_knob is a better choice
50  | :ref:`knobs-knobtypes-viewpair_knob`	       	     .. image:: /_static/knobs-and-handles/ViewPair_knob.png
51  | :ref:`knobs-knobtypes-list_knob` 		       	     .. image:: /_static/knobs-and-handles/List_knob.png
52  | :ref:`knobs-knobtypes-python_knob`	       	     Allows Python interface - Not for c++ use                                            
53  | :ref:`knobs-knobtypes-metadata_knob`	       	     .. image:: /_static/knobs-and-handles/Metadata_knob.png
54  | :ref:`knobs-knobtypes-pixelaspect_knob`	       	     .. image:: /_static/knobs-and-handles/PixelAspect_knob.png
55  | CP_knob                      		       	     Obsolete - Do not use
56  | :ref:`knobs-knobtypes-begintoolbar`	       	     .. image:: /_static/knobs-and-handles/BeginToolbar.png                                                           
57  | :ref:`knobs-knobtypes-begintabgroup`       	     .. image:: /_static/knobs-and-handles/BeginTabGroup.png
58  | n/a                          		       	     Allows Python interface - Not for c++ use
59  | :ref:`knobs-knobtypes-beginexogroup`	       	     No interface per se - Wraps group members and presents on all tabs
60  | :ref:`knobs-knobtypes-menu_knob` 		       	     .. image:: /_static/knobs-and-handles/Menu_knob_open.png
61  | :ref:`knobs-knobtypes-password_knob`	       	     .. image:: /_static/knobs-and-handles/Password_knob.png
62  | Toolbox_knob                 		       	     WIP - Do not use
63  | :ref:`knobs-knobtypes-table_knob`		       	     .. image:: /_static/knobs-and-handles/Table_knob.png
64  | :ref:'knobs-knobtypes-sceneview_knob'              .. image:: /_static/knobs-and-handles/SceneView_knob.png
64  | :ref:`knobs-knobtypes-geoselect_knob`	       	     No direct interface - See Viewer/GeoOp geoselect functionality
65  | :ref:`knobs-knobtypes-inputOnly_channelset_knob` 	     .. image:: /_static/knobs-and-handles/InputOnly_ChannelSet_knob.png
    | :ref:`knobs-knobtypes-inputonly_channelmask_knob`	     .. image:: /_static/knobs-and-handles/InputOnly_ChannelMask_knob.png
66  | :ref:`knobs-knobtypes-inputonly_channel_knob`   	     .. image:: /_static/knobs-and-handles/InputOnly_Channel_knob.png
67  | ControlPointCollection_knob  		       	     WIP - Do not use
68  | :ref:`knobs-knobtypes-cascadingenumeration_knob` 	     .. image:: /_static/knobs-and-handles/CascadingEnumeration_knob_open.png
69  | :ref:`knobs-knobtypes-dynamic_bitmask_knob`      	     .. image:: /_static/knobs-and-handles/Dynamic_Bitmask_knob_open.png
70  | :ref:`knobs-knobtypes-metakeyframe_knob`       	     .. image:: /_static/knobs-and-handles/MetaKeyFrame_knob.png
71  | :ref:`knobs-knobtypes-positionvector_knob`      	     .. image:: /_static/knobs-and-handles/PositionVector_knob.png             .. image:: /_static/knobs-and-handles/PositionVector_knob_widget.png
72  | :ref:`knobs-knobtypes-Cached_File_knob`	       	     .. image:: /_static/knobs-and-handles/Cached_File_knob.png
73  | TransformJack_knob           		       	     WIP - Do not use
74  | :ref:`knobs-knobtypes-ripple_knob`	       	     .. image:: /_static/knobs-and-handles/Ripple_knob.png
==  =====================================================    ========================================================================  ========

Knobs By Type & Call
--------------------

Abstract Numeric Data
_____________________

The base form of knobs, these are useful for storing any form of data without implying a particular usage. Many more specialized knobs inherit from these base classes, in particular :ref:`knobs-knobtypes-array_knob`.

.. _knobs-knobtypes-int_knob:

Int_knob
^^^^^^^^^^

| Stores: int
| Proxy adaptive: no
| Notes: Presents just a numeric input box. No slider presented by default, animation menu in right-click context only.

.. image:: /_static/knobs-and-handles/Int_knob.png

.. _knobs-knobtypes-float_knob:

Float_knob
^^^^^^^^^^

| Stores: float or double
| Proxy adaptive: no
| Notes: Both float and double varieties available. Presents a numeric input box, linear slider, and animation menu button.

.. image:: /_static/knobs-and-handles/Float_knob.png

.. _knobs-knobtypes-double_knob:

Double_knob
^^^^^^^^^^^

| Stores: double
| Proxy adaptive: no
| Notes: Same as calling :ref:`knobs-knobtypes-float_knob` with a double pointer. Essentially obsolete, but still usable.

.. image:: /_static/knobs-and-handles/Double_knob.png

.. _knobs-knobtypes-uv_knob:

UV_knob
^^^^^^^

| Stores: 2 floats or doubles as array
| Proxy adaptive: no
| Notes: Presents two numeric input boxes, with hardcoded 'u' and 'v' sub-labels, plus an animation menu button. If you're looking to get arbitrary sub-labels, you could use a combination of two instances of :ref:`knobs-knobtypes-float_knob` (with sliders and startline switched off) and an initial :ref:`knobs-knobtypes-text_knob`.

.. image:: /_static/knobs-and-handles/UV_knob.png

.. _knobs-knobtypes-array_knob:

Array_knob
^^^^^^^^^^

| Stores: ConvolveArray (as provided by Convolve.h) storing an arbitrary width and height matrix of floats
| Proxy adaptive: no
| Notes: ConvolveArray contains methods for sizing the array. It can also be sized dynamically on creation by passing values in a 'from_script' fashion. For example, if you create the KnobParade example passing 'Array_knob { { 0 1 2 } { 3 4 5 } }' you'll get an array knob of 3x2, with the appropriate values filled in. See your install's toolbars.py (found in your nukescripts directory) to see how a Python panel script is used to provide the dynamic sizing on node creation for the Matrix entry.

.. image:: /_static/knobs-and-handles/Array_knob.png

.. _knobs-knobtypes-multiint_knob:

MultiInt_knob
^^^^^^^^^^^^^

| Stores: Arbitrary number of ints as array
| Proxy adaptive: no
| Notes: Takes the array dimension as an argument on construction. As with :ref:`knobs-knobtypes-int_knob`, it has numerical entry boxes and the animation menu in right-click context only.

.. image:: /_static/knobs-and-handles/MultiInt_knob.png

.. _knobs-knobtypes-multifloat_knob:

MultiFloat_knob
^^^^^^^^^^^^^^^

| Stores: Arbitrary number of doubles or floats as array
| Proxy adaptive: no
| Notes: Takes the array dimension as an argument on construction. Presents numerical entry boxes for each member, a linear slider, and animation menu button.

.. image:: /_static/knobs-and-handles/MultiFloat_knob.png

Color
_____

Color knobs, as you might suspect from the name, allow storage and present interfaces enabling data to be treated as colors.

.. _knobs-knobtypes-color_knob:

Color_knob
^^^^^^^^^^

| Stores: 3 doubles or floats as array
| Proxy adaptive: no
| Notes: Stores color values at either double or float precision. Initially shows a single entry box and slider, a button to split to 3 entry boxes, a button to pop up the NUKE color wheel, and a swatch showing the current color plus an eyedropper for sampling. The color swatch is looked up through the root monitor LUT to present an interface representation in a familiar color space.

.. image:: /_static/knobs-and-handles/Color_knob.png

.. _knobs-knobtypes-acolor_knob:

AColor_knob
^^^^^^^^^^^

| Stores: 4 doubles or floats as array
| Proxy adaptive: no
| Notes: As with :ref:`knobs-knobtypes-color_knob`, but stores and allows editing of a fourth value, representing alpha. Alpha is not represented in the swatch.

.. image:: /_static/knobs-and-handles/AColor_knob.png

.. _knobs-knobtypes-colorchip_knob:

ColorChip_knob
^^^^^^^^^^^^^^

| Stores: unsigned int
| Proxy adaptive: no
| Notes: Presents a button which pops up the NUKE color wheel when clicked. Stores selected color bytes as rrggbb00. Generally used for allowing selection of interface colors. To get floating point equivalent (unpack the stored color), use from_sRGB().

.. image:: /_static/knobs-and-handles/ColorChip_knob.png

String
______

String knobs present a variety of interfaces to the lowly char* pointer or std::string.

.. _knobs-knobtypes-string_knob:

String_knob
^^^^^^^^^^^

| Stores: char* or std::string
| Proxy adaptive: no
| Notes: Single line text field, either as a char* or a std::string.

.. image:: /_static/knobs-and-handles/String_knob.png

.. _knobs-knobtypes-file_knob:

File_knob
^^^^^^^^^

| Stores: char*
| Proxy adaptive: no
| Notes: As with :ref:`knobs-knobtypes-string_knob`, except no std::string option. Presents a string plus a button which launches the NUKE file browser. Alternatively, you can supply a FileKnob_Type to filter the files shown as per the default or customized rules.

.. image:: /_static/knobs-and-handles/File_knob.png

.. _knobs-knobtypes-cached_file_knob:

Cached_File_knob
^^^^^^^^^^^^^^^^

| Stores: char*
| Proxy adaptive: no
| Notes: As with :ref:`knobs-knobtypes-file_knob`, adding a dropdown which, depending on setting, allows NUKE to locally cache files on a network storage device.

.. image:: /_static/knobs-and-handles/Cached_File_knob.png

.. _knobs-knobtypes-read_file_knob:

Read_File_knob
^^^^^^^^^^^^^^

| Stores: char* or std::string
| Proxy adaptive: no
| Notes: As with :ref:`knobs-knobtypes-file_knob`, adding a std::string option and requiring implementation of ReadFileKnobOwner. Not generally recommended (due to complexity of implementation), but may be useful in more esoteric situations.

.. _knobs-knobtypes-write_file_knob:

Write_File_knob
^^^^^^^^^^^^^^^

| Stores: char* or std::string
| Proxy adaptive: no
| Notes: As with :ref:`knobs-knobtypes-file_knob`, adding a std::string option and dual storage which switches depending on the current proxy mode.

.. image:: /_static/knobs-and-handles/Write_File_knob.png


.. _knobs-knobtypes-multiline_string_knob:

MultiLine_String_knob
^^^^^^^^^^^^^^^^^^^^^

| Stores: char*
| Proxy adaptive: no
| Notes: A text field for multiple lines of text, including scroll bars.

.. image:: /_static/knobs-and-handles/MultiLine_String_knob.png

.. _knobs-knobtypes-password_knob:

Password_knob
^^^^^^^^^^^^^

| Stores: char*
| Proxy adaptive: no
| Notes: Similar to :ref:`knobs-knobtypes-string_knob`, without std::string implementation, and displaying a bullet character for every text element entered. Note that this stores plain text, so it is generally advisable for use in Python panels and other transitional implementations, as opposed to NDK based Ops.

.. image:: /_static/knobs-and-handles/Password_knob.png

Selection
_________

Checkboxes and more.

.. _knobs-knobtypes-bitmask_knob:

Bitmask_knob
^^^^^^^^^^^^

| Stores: unsigned int
| Proxy adaptive: no
| Notes: A series of labelled checkboxes. Each checkbox sets one bit in the output integer (checkbox 1 sets bit 1, checkbox 2 sets bit 2, and so on). Pass a static const char* const for the labels themselves. Querying values is achieved by defining field bits then ANDing them with the int. Be wary of labels such as 'r', 'g', or 'b' as you're liable to end up with unexpected label coloring.

.. image:: /_static/knobs-and-handles/Bitmask_knob.png


.. _knobs-knobtypes-bool_knob:

Bool_knob
^^^^^^^^^

| Stores: bool
| Proxy adaptive: no
| Notes: A single checkbox with a label to the right, and no new line by default. Be wary of labels such as 'r', 'g', or 'b' as you're liable to end up with unexpected label coloring.

.. image:: /_static/knobs-and-handles/Bool_knob.png

Transforms
__________

Transformation related knobs provide a series of interfaces around both 2D and 3D transforms, some of which automatically take into account the current state of NUKE's proxy and downres mode to make usage nice and easy.

.. _knobs-knobtypes-xy_knob:

XY_knob
^^^^^^^

| Stores: 2 doubles or floats as array
| Proxy adaptive: yes
| Notes: Two numerical input boxes with hardcoded 'x' and 'y' labels, plus a draggable Viewer handle. Optionally, a parent XY_knob can be passed on construction resulting in all values being relative to that parent, a Viewer vector widget drawing between this position and the parent, and the stored value updating when the parent updates.

.. image:: /_static/knobs-and-handles/XY_knob.png

.. image:: /_static/knobs-and-handles/XY_knob_widget.png

.. _knobs-knobtypes-xyz_knob:

XYZ_knob
^^^^^^^^

| Stores: 3 floats as array
| Proxy adaptive: no
| Notes: Three numerical input boxes with hardcoded 'x', 'y', and 'z' labels, plus a draggable 3D Viewer handle. Optionally, a parent XYZ_knob can be passed on construction resulting in all values being relative to that parent, a Viewer vector widget drawing between this position and the parent, and the stored value updating when the parent updates.

.. image:: /_static/knobs-and-handles/XYZ_knob.png

.. _knobs-knobtypes-wh_knob:

WH_knob
^^^^^^^

| Stores: 2 doubles or floats as array
| Proxy adaptive: yes
| Notes: A single numerical input box with a slider and a button to switch to two numerical input boxes with hardcoded 'w' and 'h' labels. When stored, the horizontal value is divided by the incoming format's pixel aspect ratio, so that if the user sees equal values, the result in the Viewer is square.

.. image:: /_static/knobs-and-handles/WH_knob.png

.. _knobs-knobtypes-bbox_knob:

BBox_knob
^^^^^^^^^

| Stores: 4 doubles or floats as array
| Proxy adaptive: yes
| Notes: Four numerical input boxes with a button to switch mode between x, y, r and t (bottom left x and y plus top right r and t) and x, y, w and h (bottom left x and y plus the box's width and height) with hardcoded labels. It also draws a box widget into the Viewer with eight handles, allowing corner and edge dragging. When constructing the knob you can optionally pass an XY_knob as a parent, which causes all stored values to be shown relative to that knob's position.

.. image:: /_static/knobs-and-handles/BBox_knob.png

.. image:: /_static/knobs-and-handles/BBox_knob_widget.png

.. _knobs-knobtypes-format_knob:

Format_knob
^^^^^^^^^^^

| Stores: FormatPair (as defined in Format.h)
| Proxy adaptive: no
| Notes: Presents a single select dropdown of all formats currently available in the script. FormatPair stores both full size and proxy adapted versions, and offers a useful 'format()' function for querying and setting the current script format list programmatically.

.. image:: /_static/knobs-and-handles/Format_knob.png

.. _knobs-knobtypes-box3_knob:

Box3_knob
^^^^^^^^^

| Stores: 6 floats as array
| Proxy adaptive: no
| Notes: Describes a cubic 3D volume using two 3D points. Presents 6 numerical entry boxes, with labels hardcoded to 'x,' 'y,' 'n,' 'r,' 't' and 'f', where n stands for near, and f for far (you can probably guess the rest!).

.. image:: /_static/knobs-and-handles/Box3_knob.png

.. image:: /_static/knobs-and-handles/Box3_knob_widget.png


.. _knobs-knobtypes-scale_knob:

Scale_knob
^^^^^^^^^^

| Stores: 2 floats as array
| Proxy adaptive: yes
| Notes: Presents a single numerical entry box with a slider, plus a button to flip the interface to two numerical interface boxes. Proxy scales to take into account differing aspect ratios between formats.

.. image:: /_static/knobs-and-handles/Scale_knob.png

.. _knobs-knobtypes-pixelaspect_knob:

PixelAspect_knob
^^^^^^^^^^^^^^^^

| Stores: double
| Proxy adaptive: yes
| Notes: Same as a :ref:`knobs-knobtypes-float_knob` in double only variety, which proxy scales to take into account differing aspect ratios between formats.

.. image:: /_static/knobs-and-handles/PixelAspect_knob.png


.. _knobs-knobtypes-positionvector_knob:

PositionVector_knob
^^^^^^^^^^^^^^^^^^^

| Stores: 6 floats as array
| Proxy adaptive: no
| Notes: Presents six numerical entry boxes in two lines, labelled 'from' and 'to,' each with three boxes labeled 'x', 'y', and 'z'. Additionally, it presents two 3D positions joined by an arrow widget in the 3D Viewer.

.. image:: /_static/knobs-and-handles/PositionVector_knob.png

.. image:: /_static/knobs-and-handles/PositionVector_knob_widget.png

.. _knobs-knobtypes-transform2d_knob:

Transform2d_knob
^^^^^^^^^^^^^^^^

| Stores: Matrix4 (provided by Matrix4.h)
| Proxy adaptive: user definable
| Notes: Describes an affine transform. Presents a number of lines of multiple instances of :ref:`knobs-knobtypes-float_knob`, as well as a 2D transform jack in the Viewer. By default, the child knobs are created with their own names, however if you append '_' to your knob name, each child knob appends their names to this, allowing multiple Transform2d_knobs on a single node. Additionally, a type can be passed on construction allowing a range of behaviors.

.. image:: /_static/knobs-and-handles/Transform2d_knob.png

.. image:: /_static/knobs-and-handles/Transform2d_knob_widget.png

.. _knobs-knobtypes-axis_knob:

Axis_knob
^^^^^^^^^

| Stores: Matrix4 (provided by Matrix4.h)
| Proxy adaptive: no
| Notes: Describes a 3D, 6 degrees of freedom transformation. Presents a number of lines of multiple instances of :ref:`knobs-knobtypes-float_knob`, as well as a 3D transform jack in the Viewer. By default, the child knobs are created with their own names, however if you append '_' to your knob name, each child knob appends their names to this, allowing multiple Axis_knobs on a single node.

.. image:: /_static/knobs-and-handles/Axis_knob.png

.. image:: /_static/knobs-and-handles/Axis_knob_widget.png


Buttons
_______

Buttons galore. Execute c++, Python, and TCL.

.. _knobs-knobtypes-button:

Button
^^^^^^

| Stores: No storage
| Proxy adaptive: no
| Notes: Presents a push button which does not start a new line by default. It has no data storage, so you have to implement knob_changed() and check for the button's name to make it perform the desired action.

.. image:: /_static/knobs-and-handles/Button.png

.. _knobs-knobtypes-script_knob:

Script_knob
^^^^^^^^^^^

| Stores: No storage
| Proxy adaptive: no
| Notes: Presents a push button which does not start a new line by default. It has no data storage, but executes a passed string of TCL inside NUKE's TCL scripting environment using this knob as 'context' so that relative names work.

.. image:: /_static/knobs-and-handles/Script_button.png

.. _knobs-knobtypes-pyscript_knob:

PyScript_knob
^^^^^^^^^^^^^

| Stores: No storage
| Proxy adaptive: no
| Notes: Presents a push button which does not start a new line by default. It has no data storage, but executes a passed string of Python inside NUKE's Python scripting environment using this knob as 'context' so that relative names work.

.. image:: /_static/knobs-and-handles/PyScript_button.png

Menus
_____

Dropdowns to pick items, execute codes, or run script menus.

.. _knobs-knobtypes-enumeration_knob:

Enumeration_knob
^^^^^^^^^^^^^^^^

| Stores: int
| Proxy adaptive: no
| Notes: Presents a single selection dropdown menu. Options are mapped to an int and labels are stored in a static const char* const.

.. image:: /_static/knobs-and-handles/Enumeration_knob_open.png

.. _knobs-knobtypes-cascadingenumeration_knob:

CascadingEnumeration_knob
^^^^^^^^^^^^^^^^^^^^^^^^^

| Stores: int
| Proxy adaptive: no
| Notes: An :ref:`knobs-knobtypes-enumeration_knob` which allows for multiple levels of dropdown options (but still single select only). Levels and entries are defined in the label static const char* const, using '/' characters to split menus from entries.

.. image:: /_static/knobs-and-handles/CascadingEnumeration_knob_open.png

.. _knobs-knobtypes-pulldown_knob:

Pulldown_knob
^^^^^^^^^^^^^

| Stores: No storage
| Proxy adaptive: no
| Notes: Presents a dropdown menu where selecting an item executes defined TCL scripts within NUKE's TCL scripting environment (using this knob as 'context' so that relative names work). Entry labels and scripts are defined within the same static const char* const, with every odd entry being the entry label and its subsequent even entry defining the script.

.. image:: /_static/knobs-and-handles/Pulldown_knob_open.png

.. _knobs-knobtypes-pypulldown_knob:

PyPulldown_knob
^^^^^^^^^^^^^^^

| Stores: No storage
| Proxy adaptive: no
| Notes: Similar to :ref:`knobs-knobtypes-pulldown_knob`, only executing defined scripts inside NUKE's Python scripting environment.

.. image:: /_static/knobs-and-handles/PyPulldown_knob_open.png

.. _knobs-knobtypes-menu_knob:

Menu_knob
^^^^^^^^^

| Stores: No storage
| Proxy adaptive: no
| Notes: Presents a button that pops up a menu defined inside NUKE's scripting environment. When a menu entry is selected, its corresponding script is executed from within the same environment. Relies on the passed menu name being pre-defined.

.. image:: /_static/knobs-and-handles/Menu_knob_open.png

.. _knobs-knobtypes-dynamic_bitmask_knob:

Dynamic_Bitmask_knob
^^^^^^^^^^^^^^^^^^^^

| Stores: unsigned int
| Proxy adaptive: no
| Notes: Similar to :ref:`knobs-knobtypes-bitmask_knob`, but allows for dynamic relabelling of checkbox entries presented as a dropdown selection menu.

.. image:: /_static/knobs-and-handles/Dynamic_Bitmask_knob_open.png

Lists
_____

Presenting arbitrary data in a tidy, accessible form.

.. _knobs-knobtypes-list_knob:

List_knob
^^^^^^^^^

| Stores: std::vector of std::vectors of std::strings
| Proxy adaptive: no
| Notes: The outer vector defines each row and the inner vector a series of string columns. Generally :ref:`knobs-knobtypes-table_knob` is a better option.

.. image:: /_static/knobs-and-handles/List_knob.png

.. _knobs-knobtypes-table_knob:

Table_knob
^^^^^^^^^^

| Stores: Manages own storage
| Proxy adaptive: no
| Notes: Presents an editable table supporting a variety of entry types. The interface is managed using TableKnobI.h methods.

.. image:: /_static/knobs-and-handles/Table_knob.png

.. _knobs-knobtypes-sceneview_knob:

SceneView_Knob
^^^^^^^^^^^^^^

| Stores: Manages own storage
| Proxy adaptive: no
| Notes: Presents a heirachial tree of items with user-selectable selection state. The interface is managed using SceneView_KnobI.h methods.

.. image:: /_static/knobs-and-handles/SceneView_knob.png

Channels
________

Channel and ChannelSet selection lists.

.. _knobs-knobtypes-channelset_knob:

ChannelSet_knob
^^^^^^^^^^^^^^^

| Stores: ChannelSet (as defined in ChannelSet.h)
| Proxy adaptive: no
| Notes: Presents a dropdown list of the current channelsets in the script with those not in the incoming stream in the 'other' sub menu. Also offers a 'new' entry to allow the creation of new channel sets.

.. image:: /_static/knobs-and-handles/ChannelSet_knob_open.png


.. _knobs-knobtypes-channelmask_knob:

ChannelMask_knob
^^^^^^^^^^^^^^^^

| Stores: ChannelSet (as defined in ChannelSet.h)
| Proxy adaptive: no
| Notes: Same as :ref:`knobs-knobtypes-channelset_knob`. A legacy knob, we recommend using the ChannelSet variety instead.

.. image:: /_static/knobs-and-handles/ChanneMask_knob_open.png

.. _knobs-knobtypes-input_channelset_knob:

Input_ChannelSet_knob
^^^^^^^^^^^^^^^^^^^^^

| Stores: ChannelSet (as defined in ChannelSet.h)
| Proxy adaptive: no
| Notes: As :ref:`knobs-knobtypes-channelset_knob`, but when contracted, allows an input index to be defined from which the current vs 'other' entry menu is taken. Also has an 'all' menu entry.

.. image:: /_static/knobs-and-handles/Input_ChannelSet_knob_open.png

.. _knobs-knobtypes-input_channelmask_knob:

Input_ChannelMask_knob
^^^^^^^^^^^^^^^^^^^^^^

| Stores: ChannelSet (as defined in ChannelSet.h)
| Proxy adaptive: no
| Notes: Same as :ref:`knobs-knobtypes-input_channelset_knob`. A legacy knob, we recommend using the ChannelSet variety instead.

.. image:: /_static/knobs-and-handles/Input_ChannelMask_knob_open.png

.. _knobs-knobtypes-channel_knob:

Channel_knob
^^^^^^^^^^^^

| Stores: 1 to 4 Channels (as defined in Channel.h) as an array
| Proxy adaptive: no
| Notes: Presents a dropdown list of the current channels in the script, plus a 'none' entry and 'new' entry, allowing the creation of extra channels.

.. image:: /_static/knobs-and-handles/Channel_knob_open.png

.. _knobs-knobtypes-input_channel_knob:

Input_Channel_knob
^^^^^^^^^^^^^^^^^^

| Stores: 1 to 4 Channels (as defined in Channel.h) as an array
| Proxy adaptive: no
| Notes: Similar to :ref:`knobs-knobtypes-input_channel_knob`, but presents the channel list as channelsets listed by their presence in the incoming stream, as with :ref:`knobs-knobtypes-input_channelset_knob`.

.. image:: /_static/knobs-and-handles/Input_Channel_knob_open.png

.. _knobs-knobtypes-inputonly_channelset_knob:

InputOnly_ChannelSet_knob
^^^^^^^^^^^^^^^^^^^^^^^^^

| Stores: ChannelSet (as defined in ChannelSet.h)
| Proxy adaptive: no
| Notes: Presents a dropdown list of the current channelsets present in the defined incoming stream.

.. image:: /_static/knobs-and-handles/InputOnly_ChannelSet_knob.png

.. _knobs-knobtypes-inputonly_channelmask_knob:

InputOnly_ChannelMask_knob
^^^^^^^^^^^^^^^^^^^^^^^^^^

| Stores: ChannelSet (as defined in ChannelSet.h)
| Proxy adaptive: no
| Notes: Same as :ref:`knobs-knobtypes-inputonly_channelset_knob`. A legacy knob, we recommend using the ChannelSet variety instead.

.. image:: /_static/knobs-and-handles/InputOnly_ChannelMask_knob.png

.. _knobs-knobtypes-inputonly_channel_knob:

InputOnly_Channel_knob
^^^^^^^^^^^^^^^^^^^^^^

| Stores: 1 to 4 Channels (as defined in Channel.h) as an array
| Proxy adaptive: no
| Notes: Presents a dropdown list of the current channels present in the defined incoming stream.

.. image:: /_static/knobs-and-handles/InputOnly_Channel_knob.png


Views
_____

Access multiple views.

.. _knobs-knobtypes-oneview_knob:

OneView_knob
^^^^^^^^^^^^

| Stores: int
| Proxy adaptive: no
| Notes: Presents a single selection dropdown list of the current views present in the script. The int stored can be related to the view names (and indeed, used to initialise the int as desired) using the outputContext() structure's view related methods. Views are numbered from 0, where 0 is a special case 'default' view which is used as parent storage for all unsplit knobs.

.. image:: /_static/knobs-and-handles/OneView_knob.png

.. _knobs-knobtypes-multiview_knob:

MultiView_knob
^^^^^^^^^^^^^^

| Stores: std::set of ints
| Proxy adaptive: no
| Notes: Presents a multi-selection dropdown list of the current views present in the script. The ints stored in the std::set can be related to the view names (and indeed, used to initialize the int as desired) using the outputContext() structure's view related methods. Views are numbered from 0, where 0 is a special case 'default' view which is used as parent storage for all unsplit knobs.

.. image:: /_static/knobs-and-handles/MultiView_knob.png

.. _knobs-knobtypes-viewview_knob:

ViewView_knob
^^^^^^^^^^^^^

| Stores: std::set of std::pairs of an int with an int
| Proxy adaptive: no
| Notes: Presents a 'patch bay' type interface allowing the user to specify a relationship between pairs of views. The ints stored in the std::pairs can be related to the view names (and indeed, used to initialise the int as desired) using the outputContext() structure's view related methods. Views are numbered from 0, where 0 is a special case 'default' view which is used as parent storage for all unsplit knobs.

.. image:: /_static/knobs-and-handles/ViewView_knob.png

.. _knobs-knobtypes-viewpair_knob:

ViewPair_knob
^^^^^^^^^^^^^

| Stores: std::pair of an int with an int
| Proxy adaptive: no
| Notes: Presents a pair of single select dropdown lists of the current views within the script, and represents a relationship between the two views. The ints stored in the std::pair can be related to the view names (and indeed, used to initialise the int as desired) using the outputContext() structure's view related methods. Views are numbered from 0, where 0 is a special case 'default' view which is used as parent storage for all unsplit knobs.

.. image:: /_static/knobs-and-handles/ViewPair_knob.png

Layout
______

Knobs enabling you to lay out your controls in a sensible and accessible fashion.

.. _knobs-knobtypes-tab_knob:

Tab_knob
^^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Starts a new Tab in the parameter panel  and resets BeginGroup hierarchy to zero. By default, without an initial Tab declaration, the first tab on a node inherits its name from the node itself. Declaring a name up front, before any other knobs, simply renames the first tab - it does not create a new tab. Tab_knobs allow controls to be grouped according to logical delineation. It's generally best practise to put the most commonly used controls up front and lesser used ones on subsequent tabs. For the lesser used knobs that still need to be altered within the context of the primary controls, the :ref:`knobs-knobtypes-begingroup` or :ref:`knobs-knobtypes-beginclosedgroup` knobs may be a better choice. If you have the situation within a page where there's a set of controls which can be divided into logical groups, the :ref:`knobs-knobtypes-begintabgroup` knob may be applicable.

.. image:: /_static/knobs-and-handles/Tab_knob.png

.. _knobs-knobtypes-begingroup:

BeginGroup/EndGroup
^^^^^^^^^^^^^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: BeginGroup and EndGroup wrap any intervening knobs in an open twirly (default behavior). This allows the user to spin the contents up or down to minimise the screen real estate used. They are generally recommended for more in depth control access (those controls not required for every Op application), for example knobs that are altered with reference to other knobs outside the group, but on the same tab. For knobs which are less frequently applied, the :ref:`knobs-knobtypes-beginclosedgroup` knob may be more useful, and for situations where the knobs in the group have no alteration requirement within the context of other controls (outside the group), see the :ref:`knobs-knobtypes-tab_knob`.

.. image:: /_static/knobs-and-handles/BeginGroup.png

.. _knobs-knobtypes-beginclosedgroup:

BeginClosedGroup/EndGroup
^^^^^^^^^^^^^^^^^^^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Similar to :ref:`knobs-knobtypes-begingroup`, but presents wrapped knobs inside a twirly which is closed by default.

.. image:: /_static/knobs-and-handles/BeginClosedGroup.png

.. _knobs-knobtypes-text_knob:

Text_knob
^^^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Presents as user defined text on the Properties panel, but does not start a new line by default. Note that this can be used between knobs by clearing the start line flag on the subsequent knob.

.. image:: /_static/knobs-and-handles/Text_knob.png

.. _knobs-knobtypes-named_text_knob:

Named_Text_knob
^^^^^^^^^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Same as :ref:`knobs-knobtypes-text_knob`, but allows a name to be passed on creation, allowing the knob object to be accessed later.

.. image:: /_static/knobs-and-handles/Text_knob.png

.. _knobs-knobtypes-spacer:

Spacer
^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Presents as a empty horizontal gap between whatever knobs are on either side. In most circumstances, you'll need to clear the start line flag on the subsequent knob to prevent it line feeding, negating any effect from the spacer itself.

.. image:: /_static/knobs-and-handles/Spacer.png

.. _knobs-knobtypes-newline:

Newline
^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Used to force a new line (line feed) for knobs that don't do this by default (alternatively you can use the STARTLINE knob flag).

.. image:: /_static/knobs-and-handles/Newline.png

.. _knobs-knobtypes-divider:

Divider
^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Used to split the controls into logical groupings, it presents a line drawn across the knob Properties panel and an optional text label. 

.. image:: /_static/knobs-and-handles/Divider.png

.. _knobs-knobtypes-help_knob:

Help_knob
^^^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Presents a button with a ? label, used to pop up a help line. Generic help info should go in the Op's help text return, and knob specific help in the respective knob's tooltip, but this can be useful in circumstances where you have a grouping of controls requiring extra explanation.

.. image:: /_static/knobs-and-handles/Help_knob.png

.. _knobs-knobtypes-begintabgroup:

BeginTabGroup/EndTabGroup
^^^^^^^^^^^^^^^^^^^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Allows a specific region of a panel to be split into multiple tabs. Requires the use of :ref:`knobs-knobtypes-tab_knob` between the Begin and End calls to setup the set of tabs, with all knobs falling after a tab declaration appearing on that panel.

.. image:: /_static/knobs-and-handles/BeginTabGroup.png

.. _knobs-knobtypes-beginexogroup:

BeginExoGroup/EndExoGroup
^^^^^^^^^^^^^^^^^^^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Presents the wrapped knobs on every Tab of the Op's Properties panel as an extra-tabular group. Does not provide a twirly (either open or closed), so this may need to be your first wrapped knob.

These knobs have no interface as such - they simply wrap the controls encompassed and present them on all tabs.

.. _knobs-knobtypes-begintoolbar:

BeginToolbar/EndToolbar
^^^^^^^^^^^^^^^^^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Presents wrapped knobs on a toolbar positioned on one side of the Viewer (defined when creating the BeginToolbar knob). You can then collapse the toolbar using the small arrowheads positioned at either end, similar to native Viewer toolbars. The toolbar is only presented when the Op Properties panel is open, is only suitable for a subset of the knob types available, is and dependent on whether the toolbar in question is horizontal or vertical. Generally, vertical toolbars are only really suitable for Buttons with the SMALLUI flag set, whilst horizontal toolbars can have a wider set including numerical entry boxes, sliders, and a variety of dropdowns. 

.. image:: /_static/knobs-and-handles/BeginToolbar.png


Specialist
__________

Miscellaneous knobs, some very useful and some more esoteric.

.. _knobs-knobtypes-lookupcurves_knob:

LookupCurves_knob
^^^^^^^^^^^^^^^^^

| Stores: LookupCurve (as defined by LookupCurves.h)
| Proxy adaptive: no
| Notes: Presents a curve interface with an arbitrary number of curves included. The curve editor interface can be flagged on construction as a particular type, to allow drawing of colored swatches and curves, or to alter curve behavior. Implementing and using such a knob can be a little more involved than most of the others covered thus far, and so both the KnobParade and ColorLookup examples provide an insight into this knob in action. The LookupCurve provides the core of the tool, as it's constructed from a CurveDescription which defines the default curves, names, tooltips, and so on.

.. image:: /_static/knobs-and-handles/LookupCurves_knob.png

.. _knobs-knobtypes-histogram_knob:

Histogram_knob
^^^^^^^^^^^^^^

| Stores: Histogram_Data (as defined by HistogramKnob.h)
| Proxy adaptive: no
| Notes: Presents a read only histogram graph interface with two sets of data (in most cases representing in and out). See the KnobParade example for a sample of how to populate the data structure. Note that this is the only knob which does not take ownership of the data pointer passed, and therefore requires a reference count decrement call in the Op destructor to allow the data to be freed when no longer in use.

.. image:: /_static/knobs-and-handles/Histogram_knob.png

.. _knobs-knobtypes-eyedropper_knob:

Eyedropper_knob
^^^^^^^^^^^^^^^

| Stores: 8 floats as an array
| Proxy adaptive: no
| Notes: Presents a color swatch button that activates an eye dropper color sampling interface operated using the standard NUKE sampling hotkeys. This allows both point and area sampling with the color swatch drawn in a monitor LUTed representation of the underlying stored value. The first 4 floats represent the color picked, and the second set of 4 represent the x, y, r, and t of the box from which the sample was taken.

.. image:: /_static/knobs-and-handles/Eyedropper_knob.png

.. _knobs-knobtypes-range_knob:

Range_knob
^^^^^^^^^^

| Stores: An arbitrary number of doubles or floats as an array
| Proxy adaptive: no
| Notes: Presents a single slider along with an arbitrary number of numerical entry boxes. Note that the slider handles are unable to cross over each other, so the floats have to be sequential and sorted.

.. image:: /_static/knobs-and-handles/Range_knob.png


.. _knobs-knobtypes-keyer_knob:

Keyer_knob
^^^^^^^^^^

| Stores: 4 doubles as an array
| Proxy adaptive: no
| Notes: Presents a trapezoid graph shape with corners defined by the data values. Used in the Keyer node and generally not recommended elsewhere.

.. image:: /_static/knobs-and-handles/Keyer_knob.png

.. _knobs-knobtypes-link_knob:

Link_knob
^^^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Soft links to another node, identified by the name passed on construction. It presents panel and Viewer widgets from the soft linked knob, and is is generally used in NUKE to present knobs internal to a gizmo on its main Properties panel.

.. _knobs-knobtypes-metadata_knob:

MetaData_knob
^^^^^^^^^^^^^

| Stores: Manages internal data storage
| Proxy adaptive: no
| Notes: Presents a read only list of all the metadata found on the incoming data stream. For an editable interface, you'll have to specialize a :ref:`knobs-knobtypes-table_knob`.

.. image:: /_static/knobs-and-handles/MetaData_knob.png

.. _knobs-knobtypes-metakeyframe_knob:

MetaKeyFrame_knob
^^^^^^^^^^^^^^^^^

| Stores: Manages internal data storage
| Proxy adaptive: no
| Notes: Presents a keyframing interface as found in Roto, Gridwarp, and similar nodes. It is used to define animations on top of a complex series of underlying knobs and data. The knob should be controlled using its interface header MetaKeyFrameKnobI.h.

.. image:: /_static/knobs-and-handles/MetaKeyFrame_knob.png

.. _knobs-knobtypes-ripple_knob:

Ripple_knob
^^^^^^^^^^^

| Stores: Manages internal data storage
| Proxy adaptive: no
| Notes: Presents a ripple keyframing interface as found in the Roto and RotoPaint nodes. It is used to define changes across a temporal range. The knob should be controlled using its interface header RippleKnobI.h.

.. image:: /_static/knobs-and-handles/Ripple_knob.png

.. _knobs-knobtypes-obsolete_knob:

Obsolete_knob
^^^^^^^^^^^^^

| Stores: No data storage
| Proxy adaptive: no
| Notes: Obsolete_knob is a mechanism for changing the name and action of knobs. Please see :ref:`intro-plugin-versioning` for an in depth discussion of its uses.

No interface presented.

.. _knobs-knobtypes-geoselect_knob:

GeoSelect_knob
^^^^^^^^^^^^^^

| Stores: Manages internal data storage
| Proxy adaptive: no
| Notes: Presents a button interface on the Viewer, and a series of selection based handles on 3D geometry. Creation of Geoselect_knobs is not recommended, however GeoOp's inherit one automatically (assuming you chain the knob's call back to the GeoOp parent). This can be accessed using the name "geo_select" and addressed using the interface defined in GeoSelectKnobI.h.

.. _knobs-knobtypes-python_knob:

Python_knob
^^^^^^^^^^^

| Stores: <dependent>
| Proxy adaptive: no
| Notes: The Python_knob allows a set of Python bindings to be made against the underlying c++ data. See the PythonGeo example for a sample of this in action.

.. _knobs-knobtypes-custom_knob:

Custom_knob
^^^^^^^^^^^

| Stores: <dependent>
| Proxy adaptive: <dependent>
| Notes: Allows construction of user defined knobs. These are able to store arbitrary data and present Qt interfaces on the param panel and/or OpenGL widgets in the Viewer. See :ref:`knobs-writing_knobs` for more information.



