diff --git a/examples/20-nanovg/blendish.h b/examples/20-nanovg/blendish.h index 958a1ae6..4cc707ff 100644 --- a/examples/20-nanovg/blendish.h +++ b/examples/20-nanovg/blendish.h @@ -25,26 +25,29 @@ THE SOFTWARE. #ifndef BLENDISH_H #define BLENDISH_H +#if BX_COMPILER_MSVC +# pragma warning(push) +# pragma warning(disable: 4305) // warning C4305: 'initializing' : truncation from 'double' to 'float' +# pragma warning(disable: 4244) // warning C4244: 'return' : conversion from 'int' to 'float', possible loss of data +#endif // BX_COMPILER_MSVC + #ifndef NANOVG_H #error "nanovg.h must be included first." #endif -#define fmaxf bx::fmax -#define fminf bx::fmin - #ifdef __cplusplus extern "C" { #endif /* -Revision 3 (2014-07-08) +Revision 6 (2014-09-21) Summary ------- -Blendish is a small collection of drawing functions for NanoVG, designed to -replicate the look of the Blender 2.5+ User Interface. You can use these +Blendish is a small collection of drawing functions for NanoVG, designed to +replicate the look of the Blender 2.5+ User Interface. You can use these functions to theme your UI library. Several metric constants for faithful reproduction are also included. @@ -53,7 +56,7 @@ icons is unclear, they are not included in Blendishes repository, but a SVG template, "icons_template.svg" is provided, which you can use to build your own icon sheet. -To use icons, you must first load the icon sheet using one of the +To use icons, you must first load the icon sheet using one of the nvgCreateImage*() functions and then pass the image handle to bndSetIconImage(); otherwise, no icons will be drawn. See bndSetIconImage() for more information. @@ -64,7 +67,7 @@ bndSetFont() has been called. See bndSetFont() for more information. Drawbacks --------- -There is no support varying dpi resolutions yet. The library is hardcoded +There is no support for varying dpi resolutions yet. The library is hardcoded to the equivalent of 72 dpi in the Blender system settings. Support for label truncation is missing. Text rendering breaks when widgets are @@ -78,7 +81,13 @@ before including blendish.h, otherwise the file will be in header-only mode. */ -// if that typedef is provided elsewhere, you may define +// you can override this from the outside to pick +// the export level you need +#ifndef BND_EXPORT +#define BND_EXPORT +#endif + +// if that typedef is provided elsewhere, you may define // BLENDISH_NO_NVG_TYPEDEFS before including the header. #ifndef BLENDISH_NO_NVG_TYPEDEFS typedef struct NVGcontext NVGcontext; @@ -108,6 +117,26 @@ typedef struct BNDwidgetTheme { int shadeDown; } BNDwidgetTheme; +// describes the theme used to draw nodes +typedef struct BNDnodeTheme { + // inner color of selected node (and downarrow) + NVGcolor nodeSelectedColor; + // outline of wires + NVGcolor wiresColor; + // color of text label when active + NVGcolor textSelectedColor; + + // inner color of active node (and dragged wire) + NVGcolor activeNodeColor; + // color of selected wire + NVGcolor wireSelectColor; + // color of background of node + NVGcolor nodeBackdropColor; + + // how much a noodle curves (0 to 10) + int noodleCurving; +} BNDnodeTheme; + // describes the theme used to draw widgets typedef struct BNDtheme { // the background color of panels and windows @@ -137,6 +166,8 @@ typedef struct BNDtheme { BNDwidgetTheme menuTheme; // theme for menu items BNDwidgetTheme menuItemTheme; + // theme for nodes + BNDnodeTheme nodeTheme; } BNDtheme; // how text on a control is aligned @@ -167,7 +198,7 @@ typedef enum BNDcornerFlags { BND_CORNER_DOWN_RIGHT = 4, // sharp bottom left corner BND_CORNER_DOWN_LEFT = 8, - // all corners are sharp; + // all corners are sharp; // you can invert a set of flags using ^= BND_CORNER_ALL BND_CORNER_ALL = 0xF, // top border is sharp @@ -184,38 +215,565 @@ typedef enum BNDcornerFlags { // (0,0) designates the upper-leftmost icon, (1,0) the one right next to it, // and so on. #define BND_ICONID(x,y) ((x)|((y)<<8)) +// alpha of disabled widget groups +// can be used in conjunction with nvgGlobalAlpha() +#define BND_DISABLED_ALPHA 0.5 -// default widget height -#define BND_WIDGET_HEIGHT 21 -// default toolbutton width (if icon only) -#define BND_TOOL_WIDTH 20 +enum { + // default widget height + BND_WIDGET_HEIGHT = 21, + // default toolbutton width (if icon only) + BND_TOOL_WIDTH = 20, -// width of vertical scrollbar -#define BND_SCROLLBAR_WIDTH 13 -// height of horizontal scrollbar -#define BND_SCROLLBAR_HEIGHT 14 + // default radius of node ports + BND_NODE_PORT_RADIUS = 5, + // top margin of node content + BND_NODE_MARGIN_TOP = 25, + // bottom margin of node content + BND_NODE_MARGIN_DOWN = 5, + // left and right margin of node content + BND_NODE_MARGIN_SIDE = 10, + // height of node title bar + BND_NODE_TITLE_HEIGHT = 20, + // width of node title arrow click area + BND_NODE_ARROW_AREA_WIDTH = 20, + + // size of splitter corner click area + BND_SPLITTER_AREA_SIZE = 12, + + // width of vertical scrollbar + BND_SCROLLBAR_WIDTH = 13, + // height of horizontal scrollbar + BND_SCROLLBAR_HEIGHT = 14, + + // default vertical spacing + BND_VSPACING = 1, + // default vertical spacing between groups + BND_VSPACING_GROUP = 8, + // default horizontal spacing + BND_HSPACING = 8, +}; + +typedef enum BNDicon { + BND_ICON_NONE = BND_ICONID(0,29), + BND_ICON_QUESTION = BND_ICONID(1,29), + BND_ICON_ERROR = BND_ICONID(2,29), + BND_ICON_CANCEL = BND_ICONID(3,29), + BND_ICON_TRIA_RIGHT = BND_ICONID(4,29), + BND_ICON_TRIA_DOWN = BND_ICONID(5,29), + BND_ICON_TRIA_LEFT = BND_ICONID(6,29), + BND_ICON_TRIA_UP = BND_ICONID(7,29), + BND_ICON_ARROW_LEFTRIGHT = BND_ICONID(8,29), + BND_ICON_PLUS = BND_ICONID(9,29), + BND_ICON_DISCLOSURE_TRI_DOWN = BND_ICONID(10,29), + BND_ICON_DISCLOSURE_TRI_RIGHT = BND_ICONID(11,29), + BND_ICON_RADIOBUT_OFF = BND_ICONID(12,29), + BND_ICON_RADIOBUT_ON = BND_ICONID(13,29), + BND_ICON_MENU_PANEL = BND_ICONID(14,29), + BND_ICON_BLENDER = BND_ICONID(15,29), + BND_ICON_GRIP = BND_ICONID(16,29), + BND_ICON_DOT = BND_ICONID(17,29), + BND_ICON_COLLAPSEMENU = BND_ICONID(18,29), + BND_ICON_X = BND_ICONID(19,29), + BND_ICON_GO_LEFT = BND_ICONID(21,29), + BND_ICON_PLUG = BND_ICONID(22,29), + BND_ICON_UI = BND_ICONID(23,29), + BND_ICON_NODE = BND_ICONID(24,29), + BND_ICON_NODE_SEL = BND_ICONID(25,29), + + BND_ICON_FULLSCREEN = BND_ICONID(0,28), + BND_ICON_SPLITSCREEN = BND_ICONID(1,28), + BND_ICON_RIGHTARROW_THIN = BND_ICONID(2,28), + BND_ICON_BORDERMOVE = BND_ICONID(3,28), + BND_ICON_VIEWZOOM = BND_ICONID(4,28), + BND_ICON_ZOOMIN = BND_ICONID(5,28), + BND_ICON_ZOOMOUT = BND_ICONID(6,28), + BND_ICON_PANEL_CLOSE = BND_ICONID(7,28), + BND_ICON_COPY_ID = BND_ICONID(8,28), + BND_ICON_EYEDROPPER = BND_ICONID(9,28), + BND_ICON_LINK_AREA = BND_ICONID(10,28), + BND_ICON_AUTO = BND_ICONID(11,28), + BND_ICON_CHECKBOX_DEHLT = BND_ICONID(12,28), + BND_ICON_CHECKBOX_HLT = BND_ICONID(13,28), + BND_ICON_UNLOCKED = BND_ICONID(14,28), + BND_ICON_LOCKED = BND_ICONID(15,28), + BND_ICON_UNPINNED = BND_ICONID(16,28), + BND_ICON_PINNED = BND_ICONID(17,28), + BND_ICON_SCREEN_BACK = BND_ICONID(18,28), + BND_ICON_RIGHTARROW = BND_ICONID(19,28), + BND_ICON_DOWNARROW_HLT = BND_ICONID(20,28), + BND_ICON_DOTSUP = BND_ICONID(21,28), + BND_ICON_DOTSDOWN = BND_ICONID(22,28), + BND_ICON_LINK = BND_ICONID(23,28), + BND_ICON_INLINK = BND_ICONID(24,28), + BND_ICON_PLUGIN = BND_ICONID(25,28), + + BND_ICON_HELP = BND_ICONID(0,27), + BND_ICON_GHOST_ENABLED = BND_ICONID(1,27), + BND_ICON_COLOR = BND_ICONID(2,27), + BND_ICON_LINKED = BND_ICONID(3,27), + BND_ICON_UNLINKED = BND_ICONID(4,27), + BND_ICON_HAND = BND_ICONID(5,27), + BND_ICON_ZOOM_ALL = BND_ICONID(6,27), + BND_ICON_ZOOM_SELECTED = BND_ICONID(7,27), + BND_ICON_ZOOM_PREVIOUS = BND_ICONID(8,27), + BND_ICON_ZOOM_IN = BND_ICONID(9,27), + BND_ICON_ZOOM_OUT = BND_ICONID(10,27), + BND_ICON_RENDER_REGION = BND_ICONID(11,27), + BND_ICON_BORDER_RECT = BND_ICONID(12,27), + BND_ICON_BORDER_LASSO = BND_ICONID(13,27), + BND_ICON_FREEZE = BND_ICONID(14,27), + BND_ICON_STYLUS_PRESSURE = BND_ICONID(15,27), + BND_ICON_GHOST_DISABLED = BND_ICONID(16,27), + BND_ICON_NEW = BND_ICONID(17,27), + BND_ICON_FILE_TICK = BND_ICONID(18,27), + BND_ICON_QUIT = BND_ICONID(19,27), + BND_ICON_URL = BND_ICONID(20,27), + BND_ICON_RECOVER_LAST = BND_ICONID(21,27), + BND_ICON_FULLSCREEN_ENTER = BND_ICONID(23,27), + BND_ICON_FULLSCREEN_EXIT = BND_ICONID(24,27), + BND_ICON_BLANK1 = BND_ICONID(25,27), + + BND_ICON_LAMP = BND_ICONID(0,26), + BND_ICON_MATERIAL = BND_ICONID(1,26), + BND_ICON_TEXTURE = BND_ICONID(2,26), + BND_ICON_ANIM = BND_ICONID(3,26), + BND_ICON_WORLD = BND_ICONID(4,26), + BND_ICON_SCENE = BND_ICONID(5,26), + BND_ICON_EDIT = BND_ICONID(6,26), + BND_ICON_GAME = BND_ICONID(7,26), + BND_ICON_RADIO = BND_ICONID(8,26), + BND_ICON_SCRIPT = BND_ICONID(9,26), + BND_ICON_PARTICLES = BND_ICONID(10,26), + BND_ICON_PHYSICS = BND_ICONID(11,26), + BND_ICON_SPEAKER = BND_ICONID(12,26), + BND_ICON_TEXTURE_SHADED = BND_ICONID(13,26), + + BND_ICON_VIEW3D = BND_ICONID(0,25), + BND_ICON_IPO = BND_ICONID(1,25), + BND_ICON_OOPS = BND_ICONID(2,25), + BND_ICON_BUTS = BND_ICONID(3,25), + BND_ICON_FILESEL = BND_ICONID(4,25), + BND_ICON_IMAGE_COL = BND_ICONID(5,25), + BND_ICON_INFO = BND_ICONID(6,25), + BND_ICON_SEQUENCE = BND_ICONID(7,25), + BND_ICON_TEXT = BND_ICONID(8,25), + BND_ICON_IMASEL = BND_ICONID(9,25), + BND_ICON_SOUND = BND_ICONID(10,25), + BND_ICON_ACTION = BND_ICONID(11,25), + BND_ICON_NLA = BND_ICONID(12,25), + BND_ICON_SCRIPTWIN = BND_ICONID(13,25), + BND_ICON_TIME = BND_ICONID(14,25), + BND_ICON_NODETREE = BND_ICONID(15,25), + BND_ICON_LOGIC = BND_ICONID(16,25), + BND_ICON_CONSOLE = BND_ICONID(17,25), + BND_ICON_PREFERENCES = BND_ICONID(18,25), + BND_ICON_CLIP = BND_ICONID(19,25), + BND_ICON_ASSET_MANAGER = BND_ICONID(20,25), + + BND_ICON_OBJECT_DATAMODE = BND_ICONID(0,24), + BND_ICON_EDITMODE_HLT = BND_ICONID(1,24), + BND_ICON_FACESEL_HLT = BND_ICONID(2,24), + BND_ICON_VPAINT_HLT = BND_ICONID(3,24), + BND_ICON_TPAINT_HLT = BND_ICONID(4,24), + BND_ICON_WPAINT_HLT = BND_ICONID(5,24), + BND_ICON_SCULPTMODE_HLT = BND_ICONID(6,24), + BND_ICON_POSE_HLT = BND_ICONID(7,24), + BND_ICON_PARTICLEMODE = BND_ICONID(8,24), + BND_ICON_LIGHTPAINT = BND_ICONID(9,24), + + BND_ICON_SCENE_DATA = BND_ICONID(0,23), + BND_ICON_RENDERLAYERS = BND_ICONID(1,23), + BND_ICON_WORLD_DATA = BND_ICONID(2,23), + BND_ICON_OBJECT_DATA = BND_ICONID(3,23), + BND_ICON_MESH_DATA = BND_ICONID(4,23), + BND_ICON_CURVE_DATA = BND_ICONID(5,23), + BND_ICON_META_DATA = BND_ICONID(6,23), + BND_ICON_LATTICE_DATA = BND_ICONID(7,23), + BND_ICON_LAMP_DATA = BND_ICONID(8,23), + BND_ICON_MATERIAL_DATA = BND_ICONID(9,23), + BND_ICON_TEXTURE_DATA = BND_ICONID(10,23), + BND_ICON_ANIM_DATA = BND_ICONID(11,23), + BND_ICON_CAMERA_DATA = BND_ICONID(12,23), + BND_ICON_PARTICLE_DATA = BND_ICONID(13,23), + BND_ICON_LIBRARY_DATA_DIRECT = BND_ICONID(14,23), + BND_ICON_GROUP = BND_ICONID(15,23), + BND_ICON_ARMATURE_DATA = BND_ICONID(16,23), + BND_ICON_POSE_DATA = BND_ICONID(17,23), + BND_ICON_BONE_DATA = BND_ICONID(18,23), + BND_ICON_CONSTRAINT = BND_ICONID(19,23), + BND_ICON_SHAPEKEY_DATA = BND_ICONID(20,23), + BND_ICON_CONSTRAINT_BONE = BND_ICONID(21,23), + BND_ICON_CAMERA_STEREO = BND_ICONID(22,23), + BND_ICON_PACKAGE = BND_ICONID(23,23), + BND_ICON_UGLYPACKAGE = BND_ICONID(24,23), + + BND_ICON_BRUSH_DATA = BND_ICONID(0,22), + BND_ICON_IMAGE_DATA = BND_ICONID(1,22), + BND_ICON_FILE = BND_ICONID(2,22), + BND_ICON_FCURVE = BND_ICONID(3,22), + BND_ICON_FONT_DATA = BND_ICONID(4,22), + BND_ICON_RENDER_RESULT = BND_ICONID(5,22), + BND_ICON_SURFACE_DATA = BND_ICONID(6,22), + BND_ICON_EMPTY_DATA = BND_ICONID(7,22), + BND_ICON_SETTINGS = BND_ICONID(8,22), + BND_ICON_RENDER_ANIMATION = BND_ICONID(9,22), + BND_ICON_RENDER_STILL = BND_ICONID(10,22), + BND_ICON_BOIDS = BND_ICONID(12,22), + BND_ICON_STRANDS = BND_ICONID(13,22), + BND_ICON_LIBRARY_DATA_INDIRECT = BND_ICONID(14,22), + BND_ICON_GREASEPENCIL = BND_ICONID(15,22), + BND_ICON_LINE_DATA = BND_ICONID(16,22), + BND_ICON_GROUP_BONE = BND_ICONID(18,22), + BND_ICON_GROUP_VERTEX = BND_ICONID(19,22), + BND_ICON_GROUP_VCOL = BND_ICONID(20,22), + BND_ICON_GROUP_UVS = BND_ICONID(21,22), + BND_ICON_RNA = BND_ICONID(24,22), + BND_ICON_RNA_ADD = BND_ICONID(25,22), + + BND_ICON_OUTLINER_OB_EMPTY = BND_ICONID(0,20), + BND_ICON_OUTLINER_OB_MESH = BND_ICONID(1,20), + BND_ICON_OUTLINER_OB_CURVE = BND_ICONID(2,20), + BND_ICON_OUTLINER_OB_LATTICE = BND_ICONID(3,20), + BND_ICON_OUTLINER_OB_META = BND_ICONID(4,20), + BND_ICON_OUTLINER_OB_LAMP = BND_ICONID(5,20), + BND_ICON_OUTLINER_OB_CAMERA = BND_ICONID(6,20), + BND_ICON_OUTLINER_OB_ARMATURE = BND_ICONID(7,20), + BND_ICON_OUTLINER_OB_FONT = BND_ICONID(8,20), + BND_ICON_OUTLINER_OB_SURFACE = BND_ICONID(9,20), + BND_ICON_OUTLINER_OB_SPEAKER = BND_ICONID(10,20), + BND_ICON_RESTRICT_VIEW_OFF = BND_ICONID(19,20), + BND_ICON_RESTRICT_VIEW_ON = BND_ICONID(20,20), + BND_ICON_RESTRICT_SELECT_OFF = BND_ICONID(21,20), + BND_ICON_RESTRICT_SELECT_ON = BND_ICONID(22,20), + BND_ICON_RESTRICT_RENDER_OFF = BND_ICONID(23,20), + BND_ICON_RESTRICT_RENDER_ON = BND_ICONID(24,20), + + BND_ICON_OUTLINER_DATA_EMPTY = BND_ICONID(0,19), + BND_ICON_OUTLINER_DATA_MESH = BND_ICONID(1,19), + BND_ICON_OUTLINER_DATA_CURVE = BND_ICONID(2,19), + BND_ICON_OUTLINER_DATA_LATTICE = BND_ICONID(3,19), + BND_ICON_OUTLINER_DATA_META = BND_ICONID(4,19), + BND_ICON_OUTLINER_DATA_LAMP = BND_ICONID(5,19), + BND_ICON_OUTLINER_DATA_CAMERA = BND_ICONID(6,19), + BND_ICON_OUTLINER_DATA_ARMATURE = BND_ICONID(7,19), + BND_ICON_OUTLINER_DATA_FONT = BND_ICONID(8,19), + BND_ICON_OUTLINER_DATA_SURFACE = BND_ICONID(9,19), + BND_ICON_OUTLINER_DATA_SPEAKER = BND_ICONID(10,19), + BND_ICON_OUTLINER_DATA_POSE = BND_ICONID(11,19), + + BND_ICON_MESH_PLANE = BND_ICONID(0,18), + BND_ICON_MESH_CUBE = BND_ICONID(1,18), + BND_ICON_MESH_CIRCLE = BND_ICONID(2,18), + BND_ICON_MESH_UVSPHERE = BND_ICONID(3,18), + BND_ICON_MESH_ICOSPHERE = BND_ICONID(4,18), + BND_ICON_MESH_GRID = BND_ICONID(5,18), + BND_ICON_MESH_MONKEY = BND_ICONID(6,18), + BND_ICON_MESH_CYLINDER = BND_ICONID(7,18), + BND_ICON_MESH_TORUS = BND_ICONID(8,18), + BND_ICON_MESH_CONE = BND_ICONID(9,18), + BND_ICON_LAMP_POINT = BND_ICONID(12,18), + BND_ICON_LAMP_SUN = BND_ICONID(13,18), + BND_ICON_LAMP_SPOT = BND_ICONID(14,18), + BND_ICON_LAMP_HEMI = BND_ICONID(15,18), + BND_ICON_LAMP_AREA = BND_ICONID(16,18), + BND_ICON_META_EMPTY = BND_ICONID(19,18), + BND_ICON_META_PLANE = BND_ICONID(20,18), + BND_ICON_META_CUBE = BND_ICONID(21,18), + BND_ICON_META_BALL = BND_ICONID(22,18), + BND_ICON_META_ELLIPSOID = BND_ICONID(23,18), + BND_ICON_META_CAPSULE = BND_ICONID(24,18), + + BND_ICON_SURFACE_NCURVE = BND_ICONID(0,17), + BND_ICON_SURFACE_NCIRCLE = BND_ICONID(1,17), + BND_ICON_SURFACE_NSURFACE = BND_ICONID(2,17), + BND_ICON_SURFACE_NCYLINDER = BND_ICONID(3,17), + BND_ICON_SURFACE_NSPHERE = BND_ICONID(4,17), + BND_ICON_SURFACE_NTORUS = BND_ICONID(5,17), + BND_ICON_CURVE_BEZCURVE = BND_ICONID(9,17), + BND_ICON_CURVE_BEZCIRCLE = BND_ICONID(10,17), + BND_ICON_CURVE_NCURVE = BND_ICONID(11,17), + BND_ICON_CURVE_NCIRCLE = BND_ICONID(12,17), + BND_ICON_CURVE_PATH = BND_ICONID(13,17), + BND_ICON_COLOR_RED = BND_ICONID(19,17), + BND_ICON_COLOR_GREEN = BND_ICONID(20,17), + BND_ICON_COLOR_BLUE = BND_ICONID(21,17), + + BND_ICON_FORCE_FORCE = BND_ICONID(0,16), + BND_ICON_FORCE_WIND = BND_ICONID(1,16), + BND_ICON_FORCE_VORTEX = BND_ICONID(2,16), + BND_ICON_FORCE_MAGNETIC = BND_ICONID(3,16), + BND_ICON_FORCE_HARMONIC = BND_ICONID(4,16), + BND_ICON_FORCE_CHARGE = BND_ICONID(5,16), + BND_ICON_FORCE_LENNARDJONES = BND_ICONID(6,16), + BND_ICON_FORCE_TEXTURE = BND_ICONID(7,16), + BND_ICON_FORCE_CURVE = BND_ICONID(8,16), + BND_ICON_FORCE_BOID = BND_ICONID(9,16), + BND_ICON_FORCE_TURBULENCE = BND_ICONID(10,16), + BND_ICON_FORCE_DRAG = BND_ICONID(11,16), + BND_ICON_FORCE_SMOKEFLOW = BND_ICONID(12,16), + + BND_ICON_MODIFIER = BND_ICONID(0,12), + BND_ICON_MOD_WAVE = BND_ICONID(1,12), + BND_ICON_MOD_BUILD = BND_ICONID(2,12), + BND_ICON_MOD_DECIM = BND_ICONID(3,12), + BND_ICON_MOD_MIRROR = BND_ICONID(4,12), + BND_ICON_MOD_SOFT = BND_ICONID(5,12), + BND_ICON_MOD_SUBSURF = BND_ICONID(6,12), + BND_ICON_HOOK = BND_ICONID(7,12), + BND_ICON_MOD_PHYSICS = BND_ICONID(8,12), + BND_ICON_MOD_PARTICLES = BND_ICONID(9,12), + BND_ICON_MOD_BOOLEAN = BND_ICONID(10,12), + BND_ICON_MOD_EDGESPLIT = BND_ICONID(11,12), + BND_ICON_MOD_ARRAY = BND_ICONID(12,12), + BND_ICON_MOD_UVPROJECT = BND_ICONID(13,12), + BND_ICON_MOD_DISPLACE = BND_ICONID(14,12), + BND_ICON_MOD_CURVE = BND_ICONID(15,12), + BND_ICON_MOD_LATTICE = BND_ICONID(16,12), + BND_ICON_CONSTRAINT_DATA = BND_ICONID(17,12), + BND_ICON_MOD_ARMATURE = BND_ICONID(18,12), + BND_ICON_MOD_SHRINKWRAP = BND_ICONID(19,12), + BND_ICON_MOD_CAST = BND_ICONID(20,12), + BND_ICON_MOD_MESHDEFORM = BND_ICONID(21,12), + BND_ICON_MOD_BEVEL = BND_ICONID(22,12), + BND_ICON_MOD_SMOOTH = BND_ICONID(23,12), + BND_ICON_MOD_SIMPLEDEFORM = BND_ICONID(24,12), + BND_ICON_MOD_MASK = BND_ICONID(25,12), + + BND_ICON_MOD_CLOTH = BND_ICONID(0,11), + BND_ICON_MOD_EXPLODE = BND_ICONID(1,11), + BND_ICON_MOD_FLUIDSIM = BND_ICONID(2,11), + BND_ICON_MOD_MULTIRES = BND_ICONID(3,11), + BND_ICON_MOD_SMOKE = BND_ICONID(4,11), + BND_ICON_MOD_SOLIDIFY = BND_ICONID(5,11), + BND_ICON_MOD_SCREW = BND_ICONID(6,11), + BND_ICON_MOD_VERTEX_WEIGHT = BND_ICONID(7,11), + BND_ICON_MOD_DYNAMICPAINT = BND_ICONID(8,11), + BND_ICON_MOD_REMESH = BND_ICONID(9,11), + BND_ICON_MOD_OCEAN = BND_ICONID(10,11), + BND_ICON_MOD_WARP = BND_ICONID(11,11), + BND_ICON_MOD_SKIN = BND_ICONID(12,11), + BND_ICON_MOD_TRIANGULATE = BND_ICONID(13,11), + BND_ICON_MOD_WIREFRAME = BND_ICONID(14,11), + + BND_ICON_REC = BND_ICONID(0,10), + BND_ICON_PLAY = BND_ICONID(1,10), + BND_ICON_FF = BND_ICONID(2,10), + BND_ICON_REW = BND_ICONID(3,10), + BND_ICON_PAUSE = BND_ICONID(4,10), + BND_ICON_PREV_KEYFRAME = BND_ICONID(5,10), + BND_ICON_NEXT_KEYFRAME = BND_ICONID(6,10), + BND_ICON_PLAY_AUDIO = BND_ICONID(7,10), + BND_ICON_PLAY_REVERSE = BND_ICONID(8,10), + BND_ICON_PREVIEW_RANGE = BND_ICONID(9,10), + BND_ICON_ACTION_TWEAK = BND_ICONID(10,10), + BND_ICON_PMARKER_ACT = BND_ICONID(11,10), + BND_ICON_PMARKER_SEL = BND_ICONID(12,10), + BND_ICON_PMARKER = BND_ICONID(13,10), + BND_ICON_MARKER_HLT = BND_ICONID(14,10), + BND_ICON_MARKER = BND_ICONID(15,10), + BND_ICON_SPACE2 = BND_ICONID(16,10), + BND_ICON_SPACE3 = BND_ICONID(17,10), + BND_ICON_KEYINGSET = BND_ICONID(18,10), + BND_ICON_KEY_DEHLT = BND_ICONID(19,10), + BND_ICON_KEY_HLT = BND_ICONID(20,10), + BND_ICON_MUTE_IPO_OFF = BND_ICONID(21,10), + BND_ICON_MUTE_IPO_ON = BND_ICONID(22,10), + BND_ICON_VISIBLE_IPO_OFF = BND_ICONID(23,10), + BND_ICON_VISIBLE_IPO_ON = BND_ICONID(24,10), + BND_ICON_DRIVER = BND_ICONID(25,10), + + BND_ICON_SOLO_OFF = BND_ICONID(0,9), + BND_ICON_SOLO_ON = BND_ICONID(1,9), + BND_ICON_FRAME_PREV = BND_ICONID(2,9), + BND_ICON_FRAME_NEXT = BND_ICONID(3,9), + BND_ICON_NLA_PUSHDOWN = BND_ICONID(4,9), + BND_ICON_IPO_CONSTANT = BND_ICONID(5,9), + BND_ICON_IPO_LINEAR = BND_ICONID(6,9), + BND_ICON_IPO_BEZIER = BND_ICONID(7,9), + BND_ICON_IPO_SINE = BND_ICONID(8,9), + BND_ICON_IPO_QUAD = BND_ICONID(9,9), + BND_ICON_IPO_CUBIC = BND_ICONID(10,9), + BND_ICON_IPO_QUART = BND_ICONID(11,9), + BND_ICON_IPO_QUINT = BND_ICONID(12,9), + BND_ICON_IPO_EXPO = BND_ICONID(13,9), + BND_ICON_IPO_CIRC = BND_ICONID(14,9), + BND_ICON_IPO_BOUNCE = BND_ICONID(15,9), + BND_ICON_IPO_ELASTIC = BND_ICONID(16,9), + BND_ICON_IPO_BACK = BND_ICONID(17,9), + BND_ICON_IPO_EASE_IN = BND_ICONID(18,9), + BND_ICON_IPO_EASE_OUT = BND_ICONID(19,9), + BND_ICON_IPO_EASE_IN_OUT = BND_ICONID(20,9), + + BND_ICON_VERTEXSEL = BND_ICONID(0,8), + BND_ICON_EDGESEL = BND_ICONID(1,8), + BND_ICON_FACESEL = BND_ICONID(2,8), + BND_ICON_LOOPSEL = BND_ICONID(3,8), + BND_ICON_ROTATE = BND_ICONID(5,8), + BND_ICON_CURSOR = BND_ICONID(6,8), + BND_ICON_ROTATECOLLECTION = BND_ICONID(7,8), + BND_ICON_ROTATECENTER = BND_ICONID(8,8), + BND_ICON_ROTACTIVE = BND_ICONID(9,8), + BND_ICON_ALIGN = BND_ICONID(10,8), + BND_ICON_SMOOTHCURVE = BND_ICONID(12,8), + BND_ICON_SPHERECURVE = BND_ICONID(13,8), + BND_ICON_ROOTCURVE = BND_ICONID(14,8), + BND_ICON_SHARPCURVE = BND_ICONID(15,8), + BND_ICON_LINCURVE = BND_ICONID(16,8), + BND_ICON_NOCURVE = BND_ICONID(17,8), + BND_ICON_RNDCURVE = BND_ICONID(18,8), + BND_ICON_PROP_OFF = BND_ICONID(19,8), + BND_ICON_PROP_ON = BND_ICONID(20,8), + BND_ICON_PROP_CON = BND_ICONID(21,8), + BND_ICON_SCULPT_DYNTOPO = BND_ICONID(22,8), + BND_ICON_PARTICLE_POINT = BND_ICONID(23,8), + BND_ICON_PARTICLE_TIP = BND_ICONID(24,8), + BND_ICON_PARTICLE_PATH = BND_ICONID(25,8), + + BND_ICON_MAN_TRANS = BND_ICONID(0,7), + BND_ICON_MAN_ROT = BND_ICONID(1,7), + BND_ICON_MAN_SCALE = BND_ICONID(2,7), + BND_ICON_MANIPUL = BND_ICONID(3,7), + BND_ICON_SNAP_OFF = BND_ICONID(4,7), + BND_ICON_SNAP_ON = BND_ICONID(5,7), + BND_ICON_SNAP_NORMAL = BND_ICONID(6,7), + BND_ICON_SNAP_INCREMENT = BND_ICONID(7,7), + BND_ICON_SNAP_VERTEX = BND_ICONID(8,7), + BND_ICON_SNAP_EDGE = BND_ICONID(9,7), + BND_ICON_SNAP_FACE = BND_ICONID(10,7), + BND_ICON_SNAP_VOLUME = BND_ICONID(11,7), + BND_ICON_STICKY_UVS_LOC = BND_ICONID(13,7), + BND_ICON_STICKY_UVS_DISABLE = BND_ICONID(14,7), + BND_ICON_STICKY_UVS_VERT = BND_ICONID(15,7), + BND_ICON_CLIPUV_DEHLT = BND_ICONID(16,7), + BND_ICON_CLIPUV_HLT = BND_ICONID(17,7), + BND_ICON_SNAP_PEEL_OBJECT = BND_ICONID(18,7), + BND_ICON_GRID = BND_ICONID(19,7), + + BND_ICON_PASTEDOWN = BND_ICONID(0,6), + BND_ICON_COPYDOWN = BND_ICONID(1,6), + BND_ICON_PASTEFLIPUP = BND_ICONID(2,6), + BND_ICON_PASTEFLIPDOWN = BND_ICONID(3,6), + BND_ICON_SNAP_SURFACE = BND_ICONID(8,6), + BND_ICON_AUTOMERGE_ON = BND_ICONID(9,6), + BND_ICON_AUTOMERGE_OFF = BND_ICONID(10,6), + BND_ICON_RETOPO = BND_ICONID(11,6), + BND_ICON_UV_VERTEXSEL = BND_ICONID(12,6), + BND_ICON_UV_EDGESEL = BND_ICONID(13,6), + BND_ICON_UV_FACESEL = BND_ICONID(14,6), + BND_ICON_UV_ISLANDSEL = BND_ICONID(15,6), + BND_ICON_UV_SYNC_SELECT = BND_ICONID(16,6), + + BND_ICON_BBOX = BND_ICONID(0,5), + BND_ICON_WIRE = BND_ICONID(1,5), + BND_ICON_SOLID = BND_ICONID(2,5), + BND_ICON_SMOOTH = BND_ICONID(3,5), + BND_ICON_POTATO = BND_ICONID(4,5), + BND_ICON_ORTHO = BND_ICONID(6,5), + BND_ICON_LOCKVIEW_OFF = BND_ICONID(9,5), + BND_ICON_LOCKVIEW_ON = BND_ICONID(10,5), + BND_ICON_AXIS_SIDE = BND_ICONID(12,5), + BND_ICON_AXIS_FRONT = BND_ICONID(13,5), + BND_ICON_AXIS_TOP = BND_ICONID(14,5), + BND_ICON_NDOF_DOM = BND_ICONID(15,5), + BND_ICON_NDOF_TURN = BND_ICONID(16,5), + BND_ICON_NDOF_FLY = BND_ICONID(17,5), + BND_ICON_NDOF_TRANS = BND_ICONID(18,5), + BND_ICON_LAYER_USED = BND_ICONID(19,5), + BND_ICON_LAYER_ACTIVE = BND_ICONID(20,5), + + BND_ICON_SORTALPHA = BND_ICONID(0,3), + BND_ICON_SORTBYEXT = BND_ICONID(1,3), + BND_ICON_SORTTIME = BND_ICONID(2,3), + BND_ICON_SORTSIZE = BND_ICONID(3,3), + BND_ICON_LONGDISPLAY = BND_ICONID(4,3), + BND_ICON_SHORTDISPLAY = BND_ICONID(5,3), + BND_ICON_GHOST = BND_ICONID(6,3), + BND_ICON_IMGDISPLAY = BND_ICONID(7,3), + BND_ICON_SAVE_AS = BND_ICONID(8,3), + BND_ICON_SAVE_COPY = BND_ICONID(9,3), + BND_ICON_BOOKMARKS = BND_ICONID(10,3), + BND_ICON_FONTPREVIEW = BND_ICONID(11,3), + BND_ICON_FILTER = BND_ICONID(12,3), + BND_ICON_NEWFOLDER = BND_ICONID(13,3), + BND_ICON_OPEN_RECENT = BND_ICONID(14,3), + BND_ICON_FILE_PARENT = BND_ICONID(15,3), + BND_ICON_FILE_REFRESH = BND_ICONID(16,3), + BND_ICON_FILE_FOLDER = BND_ICONID(17,3), + BND_ICON_FILE_BLANK = BND_ICONID(18,3), + BND_ICON_FILE_BLEND = BND_ICONID(19,3), + BND_ICON_FILE_IMAGE = BND_ICONID(20,3), + BND_ICON_FILE_MOVIE = BND_ICONID(21,3), + BND_ICON_FILE_SCRIPT = BND_ICONID(22,3), + BND_ICON_FILE_SOUND = BND_ICONID(23,3), + BND_ICON_FILE_FONT = BND_ICONID(24,3), + BND_ICON_FILE_TEXT = BND_ICONID(25,3), + + BND_ICON_RECOVER_AUTO = BND_ICONID(0,2), + BND_ICON_SAVE_PREFS = BND_ICONID(1,2), + BND_ICON_LINK_BLEND = BND_ICONID(2,2), + BND_ICON_APPEND_BLEND = BND_ICONID(3,2), + BND_ICON_IMPORT = BND_ICONID(4,2), + BND_ICON_EXPORT = BND_ICONID(5,2), + BND_ICON_EXTERNAL_DATA = BND_ICONID(6,2), + BND_ICON_LOAD_FACTORY = BND_ICONID(7,2), + BND_ICON_LOOP_BACK = BND_ICONID(13,2), + BND_ICON_LOOP_FORWARDS = BND_ICONID(14,2), + BND_ICON_BACK = BND_ICONID(15,2), + BND_ICON_FORWARD = BND_ICONID(16,2), + BND_ICON_FILE_BACKUP = BND_ICONID(24,2), + BND_ICON_DISK_DRIVE = BND_ICONID(25,2), + + BND_ICON_MATPLANE = BND_ICONID(0,1), + BND_ICON_MATSPHERE = BND_ICONID(1,1), + BND_ICON_MATCUBE = BND_ICONID(2,1), + BND_ICON_MONKEY = BND_ICONID(3,1), + BND_ICON_HAIR = BND_ICONID(4,1), + BND_ICON_ALIASED = BND_ICONID(5,1), + BND_ICON_ANTIALIASED = BND_ICONID(6,1), + BND_ICON_MAT_SPHERE_SKY = BND_ICONID(7,1), + BND_ICON_WORDWRAP_OFF = BND_ICONID(12,1), + BND_ICON_WORDWRAP_ON = BND_ICONID(13,1), + BND_ICON_SYNTAX_OFF = BND_ICONID(14,1), + BND_ICON_SYNTAX_ON = BND_ICONID(15,1), + BND_ICON_LINENUMBERS_OFF = BND_ICONID(16,1), + BND_ICON_LINENUMBERS_ON = BND_ICONID(17,1), + BND_ICON_SCRIPTPLUGINS = BND_ICONID(18,1), + + BND_ICON_SEQ_SEQUENCER = BND_ICONID(0,0), + BND_ICON_SEQ_PREVIEW = BND_ICONID(1,0), + BND_ICON_SEQ_LUMA_WAVEFORM = BND_ICONID(2,0), + BND_ICON_SEQ_CHROMA_SCOPE = BND_ICONID(3,0), + BND_ICON_SEQ_HISTOGRAM = BND_ICONID(4,0), + BND_ICON_SEQ_SPLITVIEW = BND_ICONID(5,0), + BND_ICON_IMAGE_RGB = BND_ICONID(9,0), + BND_ICON_IMAGE_RGB_ALPHA = BND_ICONID(10,0), + BND_ICON_IMAGE_ALPHA = BND_ICONID(11,0), + BND_ICON_IMAGE_ZDEPTH = BND_ICONID(12,0), + BND_ICON_IMAGEFILE = BND_ICONID(13,0), +} BNDicon; //////////////////////////////////////////////////////////////////////////////// // set the current theme all widgets will be drawn with. // the default Blender 2.6 theme is set by default. -void bndSetTheme(BNDtheme theme); +BND_EXPORT void bndSetTheme(BNDtheme theme); // Returns the currently set theme -const BNDtheme *bndGetTheme(); +BND_EXPORT const BNDtheme *bndGetTheme(); // designates an image handle as returned by nvgCreateImage*() as the themes' -// icon sheet. The icon sheet format must be compatible to Blender 2.6's icon +// icon sheet. The icon sheet format must be compatible to Blender 2.6's icon // sheet; the order of icons does not matter. // A valid icon sheet is e.g. shown at // http://wiki.blender.org/index.php/Dev:2.5/Doc/How_to/Add_an_icon -void bndSetIconImage(int image); +BND_EXPORT void bndSetIconImage(int image); // designates an image handle as returned by nvgCreateFont*() as the themes' // UI font. Blender's original UI font Droid Sans is perfectly suited and // available here: // https://svn.blender.org/svnroot/bf-blender/trunk/blender/release/datafiles/fonts/ -void bndSetFont(int font); +BND_EXPORT void bndSetFont(int font); //////////////////////////////////////////////////////////////////////////////// @@ -227,7 +785,7 @@ void bndSetFont(int font); // if iconid >= 0, an icon will be added to the widget // if label is not NULL, a label will be added to the widget // widget looks best when height is BND_WIDGET_HEIGHT -void bndLabel(NVGcontext *ctx, +BND_EXPORT void bndLabel(NVGcontext *ctx, float x, float y, float w, float h, int iconid, const char *label); // Draw a tool button with its lower left origin at (x,y) and size of (w,h), @@ -236,8 +794,8 @@ void bndLabel(NVGcontext *ctx, // if iconid >= 0, an icon will be added to the widget // if label is not NULL, a label will be added to the widget // widget looks best when height is BND_WIDGET_HEIGHT -void bndToolButton(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, +BND_EXPORT void bndToolButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, int iconid, const char *label); // Draw a radio button with its lower left origin at (x,y) and size of (w,h), @@ -246,10 +804,10 @@ void bndToolButton(NVGcontext *ctx, // if iconid >= 0, an icon will be added to the widget // if label is not NULL, a label will be added to the widget // widget looks best when height is BND_WIDGET_HEIGHT -void bndRadioButton(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, +BND_EXPORT void bndRadioButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, int iconid, const char *label); - + // Draw a text field with its lower left origin at (x,y) and size of (w,h), // where flags is one or multiple flags from BNDcornerFlags and state denotes // the widgets current UI state. @@ -259,28 +817,35 @@ void bndRadioButton(NVGcontext *ctx, // cend must be >= cbegin and <= strlen(text) and denotes the end of the caret // if cend < cbegin, then no caret will be drawn // widget looks best when height is BND_WIDGET_HEIGHT -void bndTextField(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, +BND_EXPORT void bndTextField(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, int iconid, const char *text, int cbegin, int cend); - + // Draw an option button with its lower left origin at (x,y) and size of (w,h), // where flags is one or multiple flags from BNDcornerFlags and state denotes // the widgets current UI state. // if label is not NULL, a label will be added to the widget // widget looks best when height is BND_WIDGET_HEIGHT -void bndOptionButton(NVGcontext *ctx, - float x, float y, float w, float h, BNDwidgetState state, +BND_EXPORT void bndOptionButton(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, const char *label); - + // Draw a choice button with its lower left origin at (x,y) and size of (w,h), // where flags is one or multiple flags from BNDcornerFlags and state denotes // the widgets current UI state. // if iconid >= 0, an icon will be added to the widget // if label is not NULL, a label will be added to the widget // widget looks best when height is BND_WIDGET_HEIGHT -void bndChoiceButton(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, +BND_EXPORT void bndChoiceButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, int iconid, const char *label); + +// Draw a color button with its lower left origin at (x,y) and size of (w,h), +// where flags is one or multiple flags from BNDcornerFlags and state denotes +// the widgets current UI state. +// widget looks best when height is BND_WIDGET_HEIGHT +BND_EXPORT void bndColorButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, NVGcolor color); // Draw a number field with its lower left origin at (x,y) and size of (w,h), // where flags is one or multiple flags from BNDcornerFlags and state denotes @@ -289,9 +854,9 @@ void bndChoiceButton(NVGcontext *ctx, // if value is not NULL, a value will be added to the widget, along with // a ":" separator // widget looks best when height is BND_WIDGET_HEIGHT -void bndNumberField(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, - const char *label, const char *value); +BND_EXPORT void bndNumberField(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, + const char *label, const char *value); // Draw slider control with its lower left origin at (x,y) and size of (w,h), // where flags is one or multiple flags from BNDcornerFlags and state denotes @@ -301,8 +866,8 @@ void bndNumberField(NVGcontext *ctx, // if value is not NULL, a value will be added to the widget, along with // a ":" separator // widget looks best when height is BND_WIDGET_HEIGHT -void bndSlider(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, +BND_EXPORT void bndSlider(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, float progress, const char *label, const char *value); // Draw scrollbar with its lower left origin at (x,y) and size of (w,h), @@ -311,20 +876,20 @@ void bndSlider(NVGcontext *ctx, // size is in the range 0..1 and controls the size of the scroll handle // horizontal widget looks best when height is BND_SCROLLBAR_HEIGHT, // vertical looks best when width is BND_SCROLLBAR_WIDTH -void bndScrollBar(NVGcontext *ctx, - float x, float y, float w, float h, BNDwidgetState state, +BND_EXPORT void bndScrollBar(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, float offset, float size); - + // Draw a menu background with its lower left origin at (x,y) and size of (w,h), // where flags is one or multiple flags from BNDcornerFlags. -void bndMenuBackground(NVGcontext *ctx, +BND_EXPORT void bndMenuBackground(NVGcontext *ctx, float x, float y, float w, float h, int flags); // Draw a menu label with its lower left origin at (x,y) and size of (w,h). // if iconid >= 0, an icon will be added to the widget // if label is not NULL, a label will be added to the widget // widget looks best when height is BND_WIDGET_HEIGHT -void bndMenuLabel(NVGcontext *ctx, +BND_EXPORT void bndMenuLabel(NVGcontext *ctx, float x, float y, float w, float h, int iconid, const char *label); // Draw a menu item with its lower left origin at (x,y) and size of (w,h), @@ -332,12 +897,54 @@ void bndMenuLabel(NVGcontext *ctx, // if iconid >= 0, an icon will be added to the widget // if label is not NULL, a label will be added to the widget // widget looks best when height is BND_WIDGET_HEIGHT -void bndMenuItem(NVGcontext *ctx, - float x, float y, float w, float h, BNDwidgetState state, +BND_EXPORT void bndMenuItem(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, int iconid, const char *label); // Draw a tooltip background with its lower left origin at (x,y) and size of (w,h) -void bndTooltipBackground(NVGcontext *ctx, float x, float y, float w, float h); +BND_EXPORT void bndTooltipBackground(NVGcontext *ctx, float x, float y, float w, float h); + +// Draw a node port at the given position filled with the given color +BND_EXPORT void bndNodePort(NVGcontext *ctx, float x, float y, BNDwidgetState state, + NVGcolor color); + +// Draw a node wire originating at (x0,y0) and floating to (x1,y1), with +// a colored gradient based on the states state0 and state1: +// BND_DEFAULT: default wire color +// BND_HOVER: selected wire color +// BND_ACTIVE: dragged wire color +BND_EXPORT void bndNodeWire(NVGcontext *ctx, float x0, float y0, float x1, float y1, + BNDwidgetState state0, BNDwidgetState state1); + +// Draw a node background with its upper left origin at (x,y) and size of (w,h) +// where titleColor provides the base color for the title bar +BND_EXPORT void bndNodeBackground(NVGcontext *ctx, float x, float y, float w, float h, + BNDwidgetState state, int iconid, const char *label, NVGcolor titleColor); + +// Draw a window with the upper right and lower left splitter widgets into +// the rectangle at origin (x,y) and size (w, h) +BND_EXPORT void bndSplitterWidgets(NVGcontext *ctx, float x, float y, float w, float h); + +// Draw the join area overlay stencil into the rectangle +// at origin (x,y) and size (w,h) +// vertical is 0 or 1 and designates the arrow orientation, +// mirror is 0 or 1 and flips the arrow side +BND_EXPORT void bndJoinAreaOverlay(NVGcontext *ctx, float x, float y, float w, float h, + int vertical, int mirror); + +//////////////////////////////////////////////////////////////////////////////// + +// Estimator Functions +// ------------------- +// Use these functions to estimate sizes for widgets with your NVGcontext. + +// returns the ideal width for a label with given icon and text +BND_EXPORT float bndLabelWidth(NVGcontext *ctx, int iconid, const char *label); + +// returns the height for a label with given icon, text and width; this +// function is primarily useful in conjunction with multiline labels and textboxes +BND_EXPORT float bndLabelHeight(NVGcontext *ctx, int iconid, const char *label, + float width); //////////////////////////////////////////////////////////////////////////////// @@ -347,71 +954,75 @@ void bndTooltipBackground(NVGcontext *ctx, float x, float y, float w, float h); // new kinds of controls in a similar fashion. // make color transparent using the default alpha value -NVGcolor bndTransparent(NVGcolor color); +BND_EXPORT NVGcolor bndTransparent(NVGcolor color); // offset a color by a given integer delta in the range -100 to 100 -NVGcolor bndOffsetColor(NVGcolor color, int delta); +BND_EXPORT NVGcolor bndOffsetColor(NVGcolor color, int delta); // assigns radius r to the four entries of array radiuses depending on whether // the corner is marked as sharp or not; see BNDcornerFlags for possible // flag values. -void bndSelectCorners(float *radiuses, float r, int flags); +BND_EXPORT void bndSelectCorners(float *radiuses, float r, int flags); // computes the upper and lower gradient colors for the inner box from a widget -// theme and the widgets state. If flipActive is set and the state is +// theme and the widgets state. If flipActive is set and the state is // BND_ACTIVE, the upper and lower colors will be swapped. -void bndInnerColors(NVGcolor *shade_top, NVGcolor *shade_down, +BND_EXPORT void bndInnerColors(NVGcolor *shade_top, NVGcolor *shade_down, const BNDwidgetTheme *theme, BNDwidgetState state, int flipActive); -// computes the text color for a widget label from a widget theme and the +// computes the text color for a widget label from a widget theme and the // widgets state. -NVGcolor bndTextColor(const BNDwidgetTheme *theme, BNDwidgetState state); +BND_EXPORT NVGcolor bndTextColor(const BNDwidgetTheme *theme, BNDwidgetState state); // computes the bounds of the scrollbar handle from the scrollbar size // and the handles offset and size. // offset is in the range 0..1 and defines the position of the scroll handle // size is in the range 0..1 and defines the size of the scroll handle -void bndScrollHandleRect(float *x, float *y, float *w, float *h, +BND_EXPORT void bndScrollHandleRect(float *x, float *y, float *w, float *h, float offset, float size); -// Add a rounded box path at position (x,y) with size (w,h) and a separate +// Add a rounded box path at position (x,y) with size (w,h) and a separate // radius for each corner listed in clockwise order, so that cr0 = top left, // cr1 = top right, cr2 = bottom right, cr3 = bottom left; // this is a low level drawing function: the path must be stroked or filled // to become visible. -void bndRoundedBox(NVGcontext *ctx, float x, float y, float w, float h, +BND_EXPORT void bndRoundedBox(NVGcontext *ctx, float x, float y, float w, float h, float cr0, float cr1, float cr2, float cr3); // Draw a flat panel without any decorations at position (x,y) with size (w,h) // and fills it with backgroundColor -void bndBackground(NVGcontext *ctx, float x, float y, float w, float h); +BND_EXPORT void bndBackground(NVGcontext *ctx, float x, float y, float w, float h); + +// Draw a beveled border at position (x,y) with size (w,h) shaded with +// lighter and darker versions of backgroundColor +BND_EXPORT void bndBevel(NVGcontext *ctx, float x, float y, float w, float h); // Draw a lower inset for a rounded box at position (x,y) with size (w,h) // that gives the impression the surface has been pushed in. // cr2 and cr3 contain the radiuses of the bottom right and bottom left // corners of the rounded box. -void bndBevelInset(NVGcontext *ctx, float x, float y, float w, float h, +BND_EXPORT void bndBevelInset(NVGcontext *ctx, float x, float y, float w, float h, float cr2, float cr3); - + // Draw an icon with (x,y) as its upper left coordinate; the iconid selects // the icon from the sheet; use the BND_ICONID macro to build icon IDs. -void bndIcon(NVGcontext *ctx, float x, float y, int iconid); +BND_EXPORT void bndIcon(NVGcontext *ctx, float x, float y, int iconid); // Draw a drop shadow around the rounded box at (x,y) with size (w,h) and // radius r, with feather as its maximum range in pixels. // No shadow will be painted inside the rounded box. -void bndDropShadow(NVGcontext *ctx, float x, float y, float w, float h, +BND_EXPORT void bndDropShadow(NVGcontext *ctx, float x, float y, float w, float h, float r, float feather, float alpha); -// Draw the inner part of a widget box, with a gradient from shade_top to +// Draw the inner part of a widget box, with a gradient from shade_top to // shade_down. If h>w, the gradient will be horizontal instead of // vertical. -void bndInnerBox(NVGcontext *ctx, float x, float y, float w, float h, +BND_EXPORT void bndInnerBox(NVGcontext *ctx, float x, float y, float w, float h, float cr0, float cr1, float cr2, float cr3, NVGcolor shade_top, NVGcolor shade_down); // Draw the outline part of a widget box with the given color -void bndOutlineBox(NVGcontext *ctx, float x, float y, float w, float h, +BND_EXPORT void bndOutlineBox(NVGcontext *ctx, float x, float y, float w, float h, float cr0, float cr1, float cr2, float cr3, NVGcolor color); // Draw an optional icon specified by and an optional label with @@ -422,11 +1033,20 @@ void bndOutlineBox(NVGcontext *ctx, float x, float y, float w, float h, // and color. // if value is not NULL, label and value will be drawn with a ":" separator // inbetween. -void bndIconLabelValue(NVGcontext *ctx, float x, float y, float w, float h, - int iconid, NVGcolor color, int align, float fontsize, const char *label, +BND_EXPORT void bndIconLabelValue(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, NVGcolor color, int align, float fontsize, const char *label, const char *value); -// Draw an optional icon specified by , an optional label and +// Draw an optional icon specified by and an optional label with +// given alignment (BNDtextAlignment), fontsize and color within a node title bar +// if iconid is >= 0, an icon will be drawn +// if label is not NULL, it will be drawn with the specified alignment, fontsize +// and color. +BND_EXPORT void bndNodeIconLabel(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, NVGcolor color, NVGcolor shadowColor, int align, + float fontsize, const char *label); + +// Draw an optional icon specified by , an optional label and // a caret with given fontsize and color within a widget box. // if iconid is >= 0, an icon will be drawn and the labels remaining space // will be adjusted. @@ -435,20 +1055,28 @@ void bndIconLabelValue(NVGcontext *ctx, float x, float y, float w, float h, // cbegin must be >= 0 and <= strlen(text) and denotes the beginning of the caret // cend must be >= cbegin and <= strlen(text) and denotes the end of the caret // if cend < cbegin, then no caret will be drawn -void bndIconLabelCaret(NVGcontext *ctx, float x, float y, float w, float h, - int iconid, NVGcolor color, float fontsize, const char *label, +BND_EXPORT void bndIconLabelCaret(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, NVGcolor color, float fontsize, const char *label, NVGcolor caretcolor, int cbegin, int cend); - + // Draw a checkmark for an option box with the given upper left coordinates // (ox,oy) with the specified color. -void bndCheck(NVGcontext *ctx, float ox, float oy, NVGcolor color); +BND_EXPORT void bndCheck(NVGcontext *ctx, float ox, float oy, NVGcolor color); // Draw a horizontal arrow for a number field with its center at (x,y) and // size s; if s is negative, the arrow points to the left. -void bndArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color); +BND_EXPORT void bndArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color); // Draw an up/down arrow for a choice box with its center at (x,y) and size s -void bndUpDownArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color); +BND_EXPORT void bndUpDownArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color); + +// Draw a node down-arrow with its tip at (x,y) and size s +BND_EXPORT void bndNodeArrowDown(NVGcontext *ctx, float x, float y, float s, NVGcolor color); + +// return the color of a node wire based on state +// BND_HOVER indicates selected state, +// BND_ACTIVE indicates dragged state +BND_EXPORT NVGcolor bndNodeWireColor(const BNDnodeTheme *theme, BNDwidgetState state); #ifdef __cplusplus }; @@ -465,18 +1093,42 @@ void bndUpDownArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color); #include #ifdef _MSC_VER - #pragma warning (push) - #pragma warning (disable: 4996) // Switch off security warnings - #pragma warning (disable: 4100) // Switch off unreferenced formal parameter warnings - #pragma warning (disable: 4244) // warning C4244: 'argument' : conversion from 'double' to 'float', possible loss of data - #pragma warning (disable: 4305) // warning C4305: 'initializing' : truncation from 'double' to 'float' - #ifdef __cplusplus - #define BND_INLINE inline - #else - #define BND_INLINE - #endif + #pragma warning (disable: 4996) // Switch off security warnings + #pragma warning (disable: 4100) // Switch off unreferenced formal parameter warnings + #ifdef __cplusplus + #define BND_INLINE inline + #else + #define BND_INLINE + #endif + +#include + +inline float bnd_fminf ( float a, float b ) +{ + return _isnan(a) ? b : ( _isnan(b) ? a : ((a < b) ? a : b)); +} + +inline float bnd_fmaxf ( float a, float b ) +{ + return _isnan(a) ? b : ( _isnan(b) ? a : ((a > b) ? a : b)); +} + +inline double bnd_fmin ( double a, double b ) +{ + return _isnan(a) ? b : ( _isnan(b) ? a : ((a < b) ? a : b)); +} + +inline double bnd_fmax ( double a, double b ) +{ + return _isnan(a) ? b : ( _isnan(b) ? a : ((a > b) ? a : b)); +} + #else - #define BND_INLINE inline + #define BND_INLINE inline + #define bnd_fminf(a, b) fminf(a, b) + #define bnd_fmaxf(a, b) fmaxf(a, b) + #define bnd_fmin(a, b) fmin(a, b) + #define bnd_fmax(a, b) fmax(a, b) #endif //////////////////////////////////////////////////////////////////////////////// @@ -494,10 +1146,14 @@ void bndUpDownArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color); // alpha intensity of transparent items (0xa4) #define BND_TRANSPARENT_ALPHA 0.643 -// shade intensity of beveled insets +// shade intensity of beveled panels #define BND_BEVEL_SHADE 30 +// shade intensity of beveled insets +#define BND_INSET_BEVEL_SHADE 30 // shade intensity of hovered inner boxes -#define BND_HOVER_SHADE 30 +#define BND_HOVER_SHADE 15 +// shade intensity of splitter bevels +#define BND_SPLITTER_SHADE 100 // width of icon sheet #define BND_ICON_SHEET_WIDTH 602 @@ -551,6 +1207,20 @@ void bndUpDownArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color); // max glyphs for position testing #define BND_MAX_GLYPHS 1024 +// text distance from bottom +#define BND_TEXT_PAD_DOWN 7 + +// stroke width of wire outline +#define BND_NODE_WIRE_OUTLINE_WIDTH 4 +// stroke width of wire +#define BND_NODE_WIRE_WIDTH 2 +// radius of node box +#define BND_NODE_RADIUS 8 +// feather of node title text +#define BND_NODE_TITLE_FEATHER 1 +// size of node title arrow +#define BND_NODE_ARROW_SIZE 9 + //////////////////////////////////////////////////////////////////////////////// BND_INLINE float bnd_clamp(float v, float mn, float mx) { @@ -570,10 +1240,10 @@ static BNDtheme bnd_theme = { {{{ 0.6,0.6,0.6,1 }}}, // color_inner {{{ 0.392,0.392,0.392,1 }}}, // color_inner_selected BND_COLOR_TEXT, // color_text - BND_COLOR_TEXT_SELECTED, // color_text_selected + BND_COLOR_TEXT_SELECTED, // color_text_selected 0, // shade_top 0, // shade_down - }, + }, // toolTheme { {{{ 0.098,0.098,0.098,1 }}}, // color_outline @@ -581,7 +1251,7 @@ static BNDtheme bnd_theme = { {{{ 0.6,0.6,0.6,1 }}}, // color_inner {{{ 0.392,0.392,0.392,1 }}}, // color_inner_selected BND_COLOR_TEXT, // color_text - BND_COLOR_TEXT_SELECTED, // color_text_selected + BND_COLOR_TEXT_SELECTED, // color_text_selected 15, // shade_top -15, // shade_down }, @@ -592,7 +1262,7 @@ static BNDtheme bnd_theme = { {{{ 0.275,0.275,0.275,1 }}}, // color_inner {{{ 0.337,0.502,0.761,1 }}}, // color_inner_selected BND_COLOR_TEXT_SELECTED, // color_text - BND_COLOR_TEXT, // color_text_selected + BND_COLOR_TEXT, // color_text_selected 15, // shade_top -15, // shade_down }, @@ -603,7 +1273,7 @@ static BNDtheme bnd_theme = { {{{ 0.6, 0.6, 0.6,1 }}}, // color_inner {{{ 0.6, 0.6, 0.6,1 }}}, // color_inner_selected BND_COLOR_TEXT, // color_text - BND_COLOR_TEXT_SELECTED, // color_text_selected + BND_COLOR_TEXT_SELECTED, // color_text_selected 0, // shade_top 25, // shade_down }, @@ -614,7 +1284,7 @@ static BNDtheme bnd_theme = { {{{ 0.275,0.275,0.275,1 }}}, // color_inner {{{ 0.275,0.275,0.275,1 }}}, // color_inner_selected BND_COLOR_TEXT, // color_text - BND_COLOR_TEXT_SELECTED, // color_text_selected + BND_COLOR_TEXT_SELECTED, // color_text_selected 15, // shade_top -15, // shade_down }, @@ -625,7 +1295,7 @@ static BNDtheme bnd_theme = { {{{ 0.275,0.275,0.275,1 }}}, // color_inner {{{ 0.275,0.275,0.275,1 }}}, // color_inner_selected BND_COLOR_TEXT_SELECTED, // color_text - {{{ 0.8,0.8,0.8,1 }}}, // color_text_selected + {{{ 0.8,0.8,0.8,1 }}}, // color_text_selected 15, // shade_top -15, // shade_down }, @@ -636,7 +1306,7 @@ static BNDtheme bnd_theme = { {{{ 0.706, 0.706, 0.706,1 }}}, // color_inner {{{ 0.6, 0.6, 0.6,1 }}}, // color_inner_selected BND_COLOR_TEXT, // color_text - BND_COLOR_TEXT_SELECTED, // color_text_selected + BND_COLOR_TEXT_SELECTED, // color_text_selected -20, // shade_top 0, // shade_down }, @@ -647,7 +1317,7 @@ static BNDtheme bnd_theme = { {{{ 0.706, 0.706, 0.706,1 }}}, // color_inner {{{ 0.6, 0.6, 0.6,1 }}}, // color_inner_selected BND_COLOR_TEXT, // color_text - BND_COLOR_TEXT_SELECTED, // color_text_selected + BND_COLOR_TEXT_SELECTED, // color_text_selected -20, // shade_top 0, // shade_down }, @@ -658,7 +1328,7 @@ static BNDtheme bnd_theme = { {{{ 0.314, 0.314, 0.314,0.706 }}}, // color_inner {{{ 0.392, 0.392, 0.392,0.706 }}}, // color_inner_selected BND_COLOR_TEXT, // color_text - BND_COLOR_TEXT_SELECTED, // color_text_selected + BND_COLOR_TEXT_SELECTED, // color_text_selected 5, // shade_top -5, // shade_down }, @@ -669,7 +1339,7 @@ static BNDtheme bnd_theme = { {{{ 0.098, 0.098, 0.098, 0.902 }}}, // color_inner {{{ 0.176, 0.176, 0.176, 0.902 }}}, // color_inner_selected {{{ 0.627, 0.627, 0.627, 1 }}}, // color_text - BND_COLOR_TEXT_SELECTED, // color_text_selected + BND_COLOR_TEXT_SELECTED, // color_text_selected 0, // shade_top 0, // shade_down }, @@ -680,7 +1350,7 @@ static BNDtheme bnd_theme = { {{{ 0.098, 0.098, 0.098, 0.902 }}}, // color_inner {{{ 0.176, 0.176, 0.176, 0.902 }}}, // color_inner_selected {{{ 0.627, 0.627, 0.627, 1 }}}, // color_text - BND_COLOR_TEXT_SELECTED, // color_text_selected + BND_COLOR_TEXT_SELECTED, // color_text_selected 0, // shade_top 0, // shade_down }, @@ -691,10 +1361,20 @@ static BNDtheme bnd_theme = { {{{ 0,0,0,0 }}}, // color_inner {{{ 0.337,0.502,0.761,1 }}}, // color_inner_selected BND_COLOR_TEXT_SELECTED, // color_text - BND_COLOR_TEXT, // color_text_selected + BND_COLOR_TEXT, // color_text_selected 38, // shade_top 0, // shade_down }, + // nodeTheme + { + {{{ 0.945,0.345,0,1 }}}, // nodeSelectedColor + {{{ 0,0,0,1 }}}, // wiresColor + {{{ 0.498,0.439,0.439,1 }}}, // textSelectedColor + {{{ 1,0.667,0.251,1 }}}, // activeNodeColor + {{{ 1,1,1,1 }}}, // wireSelectColor + {{{ 0.608,0.608,0.608,0.627 }}}, // nodeBackdropColor + 5, // noodleCurving + }, }; //////////////////////////////////////////////////////////////////////////////// @@ -723,21 +1403,21 @@ void bndSetFont(int font) { //////////////////////////////////////////////////////////////////////////////// -void bndLabel(NVGcontext *ctx, +void bndLabel(NVGcontext *ctx, float x, float y, float w, float h, int iconid, const char *label) { bndIconLabelValue(ctx,x,y,w,h,iconid, bnd_theme.regularTheme.textColor, BND_LEFT, BND_LABEL_FONT_SIZE, label, NULL); } -void bndToolButton(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, +void bndToolButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, int iconid, const char *label) { float cr[4]; NVGcolor shade_top, shade_down; - + bndSelectCorners(cr, BND_TOOL_RADIUS, flags); - bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); bndInnerColors(&shade_top, &shade_down, &bnd_theme.toolTheme, state, 1); bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], @@ -747,14 +1427,14 @@ void bndToolButton(NVGcontext *ctx, BND_LABEL_FONT_SIZE, label, NULL); } -void bndRadioButton(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, +void bndRadioButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, int iconid, const char *label) { float cr[4]; NVGcolor shade_top, shade_down; - + bndSelectCorners(cr, BND_OPTION_RADIUS, flags); - bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); bndInnerColors(&shade_top, &shade_down, &bnd_theme.radioTheme, state, 1); bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], @@ -764,14 +1444,14 @@ void bndRadioButton(NVGcontext *ctx, BND_LABEL_FONT_SIZE, label, NULL); } -void bndTextField(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, +void bndTextField(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, int iconid, const char *text, int cbegin, int cend) { float cr[4]; NVGcolor shade_top, shade_down; - + bndSelectCorners(cr, BND_TEXT_RADIUS, flags); - bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); bndInnerColors(&shade_top, &shade_down, &bnd_theme.textFieldTheme, state, 0); bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], @@ -780,19 +1460,19 @@ void bndTextField(NVGcontext *ctx, cend = -1; } bndIconLabelCaret(ctx,x,y,w,h,iconid, - bndTextColor(&bnd_theme.textFieldTheme, state), BND_LABEL_FONT_SIZE, + bndTextColor(&bnd_theme.textFieldTheme, state), BND_LABEL_FONT_SIZE, text, bnd_theme.textFieldTheme.itemColor, cbegin, cend); } -void bndOptionButton(NVGcontext *ctx, - float x, float y, float w, float h, BNDwidgetState state, +void bndOptionButton(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, const char *label) { float ox, oy; NVGcolor shade_top, shade_down; - + ox = x; oy = y+h-BND_OPTION_HEIGHT-3; - + bndBevelInset(ctx,ox,oy, BND_OPTION_WIDTH,BND_OPTION_HEIGHT, BND_OPTION_RADIUS,BND_OPTION_RADIUS); @@ -813,14 +1493,14 @@ void bndOptionButton(NVGcontext *ctx, BND_LABEL_FONT_SIZE, label, NULL); } -void bndChoiceButton(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, +void bndChoiceButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, int iconid, const char *label) { float cr[4]; NVGcolor shade_top, shade_down; - + bndSelectCorners(cr, BND_OPTION_RADIUS, flags); - bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); bndInnerColors(&shade_top, &shade_down, &bnd_theme.choiceTheme, state, 1); bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], @@ -832,14 +1512,24 @@ void bndChoiceButton(NVGcontext *ctx, bndTransparent(bnd_theme.choiceTheme.itemColor)); } -void bndNumberField(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, +void bndColorButton(NVGcontext *ctx, + float x, float y, float w, float h, int flags, NVGcolor color) { + float cr[4]; + bndSelectCorners(cr, BND_TOOL_RADIUS, flags); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], color, color); + bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], + bndTransparent(bnd_theme.toolTheme.outlineColor)); +} + +void bndNumberField(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, const char *label, const char *value) { float cr[4]; NVGcolor shade_top, shade_down; - + bndSelectCorners(cr, BND_NUMBER_RADIUS, flags); - bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); + bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); bndInnerColors(&shade_top, &shade_down, &bnd_theme.numberFieldTheme, state, 0); bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], @@ -853,12 +1543,12 @@ void bndNumberField(NVGcontext *ctx, bndTransparent(bnd_theme.numberFieldTheme.itemColor)); } -void bndSlider(NVGcontext *ctx, - float x, float y, float w, float h, int flags, BNDwidgetState state, +void bndSlider(NVGcontext *ctx, + float x, float y, float w, float h, int flags, BNDwidgetState state, float progress, const char *label, const char *value) { float cr[4]; NVGcolor shade_top, shade_down; - + bndSelectCorners(cr, BND_NUMBER_RADIUS, flags); bndBevelInset(ctx,x,y,w,h,cr[2],cr[3]); bndInnerColors(&shade_top, &shade_down, &bnd_theme.sliderTheme, state, 0); @@ -874,11 +1564,11 @@ void bndSlider(NVGcontext *ctx, bnd_theme.sliderTheme.itemColor, bnd_theme.sliderTheme.shadeDown); shade_down = bndOffsetColor( bnd_theme.sliderTheme.itemColor, bnd_theme.sliderTheme.shadeTop); - } + } nvgScissor(ctx,x,y,8+(w-8)*bnd_clamp(progress,0,1),h); bndInnerBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], shade_top, shade_down); nvgResetScissor(ctx); - + bndOutlineBox(ctx,x,y,w,h,cr[0],cr[1],cr[2],cr[3], bndTransparent(bnd_theme.sliderTheme.outlineColor)); bndIconLabelValue(ctx,x,y,w,h,-1, @@ -886,10 +1576,10 @@ void bndSlider(NVGcontext *ctx, BND_LABEL_FONT_SIZE, label, value); } -void bndScrollBar(NVGcontext *ctx, - float x, float y, float w, float h, BNDwidgetState state, +void bndScrollBar(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, float offset, float size) { - + bndBevelInset(ctx,x,y,w,h, BND_SCROLLBAR_RADIUS, BND_SCROLLBAR_RADIUS); bndInnerBox(ctx,x,y,w,h, @@ -903,18 +1593,18 @@ void bndScrollBar(NVGcontext *ctx, BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, bndTransparent(bnd_theme.scrollBarTheme.outlineColor)); - + NVGcolor itemColor = bndOffsetColor( bnd_theme.scrollBarTheme.itemColor, (state == BND_ACTIVE)?BND_SCROLLBAR_ACTIVE_SHADE:0); bndScrollHandleRect(&x,&y,&w,&h,offset,size); - + bndInnerBox(ctx,x,y,w,h, BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, BND_SCROLLBAR_RADIUS,BND_SCROLLBAR_RADIUS, bndOffsetColor( - itemColor, 3*bnd_theme.scrollBarTheme.shadeTop), + itemColor, 3*bnd_theme.scrollBarTheme.shadeTop), bndOffsetColor( itemColor, 3*bnd_theme.scrollBarTheme.shadeDown)); bndOutlineBox(ctx,x,y,w,h, @@ -923,11 +1613,11 @@ void bndScrollBar(NVGcontext *ctx, bndTransparent(bnd_theme.scrollBarTheme.outlineColor)); } -void bndMenuBackground(NVGcontext *ctx, +void bndMenuBackground(NVGcontext *ctx, float x, float y, float w, float h, int flags) { float cr[4]; NVGcolor shade_top, shade_down; - + bndSelectCorners(cr, BND_MENU_RADIUS, flags); bndInnerColors(&shade_top, &shade_down, &bnd_theme.menuTheme, BND_DEFAULT, 0); @@ -940,7 +1630,7 @@ void bndMenuBackground(NVGcontext *ctx, void bndTooltipBackground(NVGcontext *ctx, float x, float y, float w, float h) { NVGcolor shade_top, shade_down; - + bndInnerColors(&shade_top, &shade_down, &bnd_theme.tooltipTheme, BND_DEFAULT, 0); bndInnerBox(ctx,x,y,w,h+1, @@ -953,21 +1643,21 @@ void bndTooltipBackground(NVGcontext *ctx, float x, float y, float w, float h) { BND_SHADOW_FEATHER,BND_SHADOW_ALPHA); } -void bndMenuLabel(NVGcontext *ctx, +void bndMenuLabel(NVGcontext *ctx, float x, float y, float w, float h, int iconid, const char *label) { bndIconLabelValue(ctx,x,y,w,h,iconid, bnd_theme.menuTheme.textColor, BND_LEFT, BND_LABEL_FONT_SIZE, label, NULL); } -void bndMenuItem(NVGcontext *ctx, - float x, float y, float w, float h, BNDwidgetState state, +void bndMenuItem(NVGcontext *ctx, + float x, float y, float w, float h, BNDwidgetState state, int iconid, const char *label) { if (state != BND_DEFAULT) { - bndInnerBox(ctx,x,y,w,h,0,0,0,0, - bndOffsetColor(bnd_theme.menuItemTheme.innerSelectedColor, - bnd_theme.menuItemTheme.shadeTop), - bndOffsetColor(bnd_theme.menuItemTheme.innerSelectedColor, + bndInnerBox(ctx,x,y,w,h,0,0,0,0, + bndOffsetColor(bnd_theme.menuItemTheme.innerSelectedColor, + bnd_theme.menuItemTheme.shadeTop), + bndOffsetColor(bnd_theme.menuItemTheme.innerSelectedColor, bnd_theme.menuItemTheme.shadeDown)); state = BND_ACTIVE; } @@ -976,21 +1666,250 @@ void bndMenuItem(NVGcontext *ctx, BND_LABEL_FONT_SIZE, label, NULL); } +void bndNodePort(NVGcontext *ctx, float x, float y, BNDwidgetState state, + NVGcolor color) { + nvgBeginPath(ctx); + nvgCircle(ctx, x, y, BND_NODE_PORT_RADIUS); + nvgStrokeColor(ctx,bnd_theme.nodeTheme.wiresColor); + nvgStrokeWidth(ctx,1.0f); + nvgStroke(ctx); + nvgFillColor(ctx,(state != BND_DEFAULT)? + bndOffsetColor(color, BND_HOVER_SHADE):color); + nvgFill(ctx); +} + +void bndNodeWire(NVGcontext *ctx, float x0, float y0, float x1, float y1, + BNDwidgetState state0, BNDwidgetState state1) { + float delta = fabsf(x1 - x0)*(float)bnd_theme.nodeTheme.noodleCurving/10.0f; + + nvgBeginPath(ctx); + nvgMoveTo(ctx, x0, y0); + nvgBezierTo(ctx, + x0 + delta, y0, + x1 - delta, y1, + x1, y1); + nvgStrokeColor(ctx, bnd_theme.nodeTheme.wiresColor); + nvgStrokeWidth(ctx, BND_NODE_WIRE_OUTLINE_WIDTH); + nvgStroke(ctx); + nvgStrokePaint(ctx, nvgLinearGradient(ctx, + x0, y0, x1, y1, + bndNodeWireColor(&bnd_theme.nodeTheme, state0), + bndNodeWireColor(&bnd_theme.nodeTheme, state1))); + nvgStrokeWidth(ctx,BND_NODE_WIRE_WIDTH); + nvgStroke(ctx); +} + +void bndNodeBackground(NVGcontext *ctx, float x, float y, float w, float h, + BNDwidgetState state, int iconid, const char *label, NVGcolor titleColor) { + bndInnerBox(ctx,x,y,w,BND_NODE_TITLE_HEIGHT+2, + BND_NODE_RADIUS,BND_NODE_RADIUS,0,0, + bndTransparent(bndOffsetColor(titleColor, BND_BEVEL_SHADE)), + bndTransparent(titleColor)); + bndInnerBox(ctx,x,y+BND_NODE_TITLE_HEIGHT-1,w,h+2-BND_NODE_TITLE_HEIGHT, + 0,0,BND_NODE_RADIUS,BND_NODE_RADIUS, + bndTransparent(bnd_theme.nodeTheme.nodeBackdropColor), + bndTransparent(bnd_theme.nodeTheme.nodeBackdropColor)); + bndNodeIconLabel(ctx, + x+BND_NODE_ARROW_AREA_WIDTH,y, + w-BND_NODE_ARROW_AREA_WIDTH-BND_NODE_MARGIN_SIDE,BND_NODE_TITLE_HEIGHT, + iconid, bnd_theme.regularTheme.textColor, + bndOffsetColor(titleColor, BND_BEVEL_SHADE), + BND_LEFT, BND_LABEL_FONT_SIZE, label); + NVGcolor arrowColor; + NVGcolor borderColor; + switch(state) { + default: + case BND_DEFAULT: { + borderColor = nvgRGBf(0,0,0); + arrowColor = bndOffsetColor(titleColor, -BND_BEVEL_SHADE); + } break; + case BND_HOVER: { + borderColor = bnd_theme.nodeTheme.nodeSelectedColor; + arrowColor = bnd_theme.nodeTheme.nodeSelectedColor; + } break; + case BND_ACTIVE: { + borderColor = bnd_theme.nodeTheme.activeNodeColor; + arrowColor = bnd_theme.nodeTheme.nodeSelectedColor; + } break; + } + bndOutlineBox(ctx,x,y,w,h+1, + BND_NODE_RADIUS,BND_NODE_RADIUS,BND_NODE_RADIUS,BND_NODE_RADIUS, + bndTransparent(borderColor)); + bndNodeArrowDown(ctx, + x + BND_NODE_MARGIN_SIDE, y + BND_NODE_TITLE_HEIGHT-4, + BND_NODE_ARROW_SIZE, arrowColor); + bndDropShadow(ctx,x,y,w,h,BND_NODE_RADIUS, + BND_SHADOW_FEATHER,BND_SHADOW_ALPHA); +} + +void bndSplitterWidgets(NVGcontext *ctx, float x, float y, float w, float h) { + NVGcolor insetLight = bndTransparent( + bndOffsetColor(bnd_theme.backgroundColor, BND_SPLITTER_SHADE)); + NVGcolor insetDark = bndTransparent( + bndOffsetColor(bnd_theme.backgroundColor, -BND_SPLITTER_SHADE)); + NVGcolor inset = bndTransparent(bnd_theme.backgroundColor); + + float x2 = x+w; + float y2 = y+h; + + nvgBeginPath(ctx); + nvgMoveTo(ctx, x, y2-13); + nvgLineTo(ctx, x+13, y2); + nvgMoveTo(ctx, x, y2-9); + nvgLineTo(ctx, x+9, y2); + nvgMoveTo(ctx, x, y2-5); + nvgLineTo(ctx, x+5, y2); + + nvgMoveTo(ctx, x2-11, y); + nvgLineTo(ctx, x2, y+11); + nvgMoveTo(ctx, x2-7, y); + nvgLineTo(ctx, x2, y+7); + nvgMoveTo(ctx, x2-3, y); + nvgLineTo(ctx, x2, y+3); + + nvgStrokeColor(ctx, insetDark); + nvgStroke(ctx); + + nvgBeginPath(ctx); + nvgMoveTo(ctx, x, y2-11); + nvgLineTo(ctx, x+11, y2); + nvgMoveTo(ctx, x, y2-7); + nvgLineTo(ctx, x+7, y2); + nvgMoveTo(ctx, x, y2-3); + nvgLineTo(ctx, x+3, y2); + + nvgMoveTo(ctx, x2-13, y); + nvgLineTo(ctx, x2, y+13); + nvgMoveTo(ctx, x2-9, y); + nvgLineTo(ctx, x2, y+9); + nvgMoveTo(ctx, x2-5, y); + nvgLineTo(ctx, x2, y+5); + + nvgStrokeColor(ctx, insetLight); + nvgStroke(ctx); + + nvgBeginPath(ctx); + nvgMoveTo(ctx, x, y2-12); + nvgLineTo(ctx, x+12, y2); + nvgMoveTo(ctx, x, y2-8); + nvgLineTo(ctx, x+8, y2); + nvgMoveTo(ctx, x, y2-4); + nvgLineTo(ctx, x+4, y2); + + nvgMoveTo(ctx, x2-12, y); + nvgLineTo(ctx, x2, y+12); + nvgMoveTo(ctx, x2-8, y); + nvgLineTo(ctx, x2, y+8); + nvgMoveTo(ctx, x2-4, y); + nvgLineTo(ctx, x2, y+4); + + nvgStrokeColor(ctx, inset); + nvgStroke(ctx); +} + +void bndJoinAreaOverlay(NVGcontext *ctx, float x, float y, float w, float h, + int vertical, int mirror) { + + if (vertical) { + float u = w; + w = h; h = u; + } + + float s = (w= 0) { + w += BND_ICON_SHEET_RES; + } + if (label && (bnd_font >= 0)) { + nvgFontFaceId(ctx, bnd_font); + nvgFontSize(ctx, BND_LABEL_FONT_SIZE); + w += nvgTextBounds(ctx, 1, 1, label, NULL, NULL); + } + return w; +} + +float bndLabelHeight(NVGcontext *ctx, int iconid, const char *label, float width) { + int h = BND_WIDGET_HEIGHT; + width -= BND_TEXT_RADIUS*2; + if (iconid >= 0) { + width -= BND_ICON_SHEET_RES; + } + if (label && (bnd_font >= 0)) { + nvgFontFaceId(ctx, bnd_font); + nvgFontSize(ctx, BND_LABEL_FONT_SIZE); + float bounds[4]; + nvgTextBoxBounds(ctx, 1, 1, width, label, NULL, bounds); + int bh = int(bounds[3] - bounds[1]) + BND_TEXT_PAD_DOWN; + if (bh > h) + h = bh; + } + return h; +} + +//////////////////////////////////////////////////////////////////////////////// + +void bndRoundedBox(NVGcontext *ctx, float x, float y, float w, float h, float cr0, float cr1, float cr2, float cr3) { float d; - - w = fmaxf(0, w); - h = fmaxf(0, h); - d = fminf(w, h); - + + w = bnd_fmaxf(0, w); + h = bnd_fmaxf(0, h); + d = bnd_fminf(w, h); + nvgMoveTo(ctx, x,y+h*0.5f); - nvgArcTo(ctx, x,y, x+w,y, fminf(cr0, d/2)); - nvgArcTo(ctx, x+w,y, x+w,y+h, fminf(cr1, d/2)); - nvgArcTo(ctx, x+w,y+h, x,y+h, fminf(cr2, d/2)); - nvgArcTo(ctx, x,y+h, x,y, fminf(cr3, d/2)); + nvgArcTo(ctx, x,y, x+w,y, bnd_fminf(cr0, d/2)); + nvgArcTo(ctx, x+w,y, x+w,y+h, bnd_fminf(cr1, d/2)); + nvgArcTo(ctx, x+w,y+h, x,y+h, bnd_fminf(cr2, d/2)); + nvgArcTo(ctx, x,y+h, x,y, bnd_fminf(cr3, d/2)); nvgClosePath(ctx); } @@ -1010,27 +1929,52 @@ NVGcolor bndOffsetColor(NVGcolor color, int delta) { ):color; } +void bndBevel(NVGcontext *ctx, float x, float y, float w, float h) { + nvgStrokeWidth(ctx, 1); + + x += 0.5f; + y += 0.5f; + w -= 1; + h -= 1; + + nvgBeginPath(ctx); + nvgMoveTo(ctx, x, y+h); + nvgLineTo(ctx, x+w, y+h); + nvgLineTo(ctx, x+w, y); + nvgStrokeColor(ctx, bndTransparent( + bndOffsetColor(bnd_theme.backgroundColor, -BND_BEVEL_SHADE))); + nvgStroke(ctx); + + nvgBeginPath(ctx); + nvgMoveTo(ctx, x, y+h); + nvgLineTo(ctx, x, y); + nvgLineTo(ctx, x+w, y); + nvgStrokeColor(ctx, bndTransparent( + bndOffsetColor(bnd_theme.backgroundColor, BND_BEVEL_SHADE))); + nvgStroke(ctx); +} + void bndBevelInset(NVGcontext *ctx, float x, float y, float w, float h, float cr2, float cr3) { float d; - + y -= 0.5f; - d = fminf(w, h); - cr2 = fminf(cr2, d/2); - cr3 = fminf(cr3, d/2); - + d = bnd_fminf(w, h); + cr2 = bnd_fminf(cr2, d/2); + cr3 = bnd_fminf(cr3, d/2); + nvgBeginPath(ctx); nvgMoveTo(ctx, x+w,y+h-cr2); nvgArcTo(ctx, x+w,y+h, x,y+h, cr2); nvgArcTo(ctx, x,y+h, x,y, cr3); - - NVGcolor bevelColor = bndOffsetColor(bnd_theme.backgroundColor, - BND_BEVEL_SHADE); - + + NVGcolor bevelColor = bndOffsetColor(bnd_theme.backgroundColor, + BND_INSET_BEVEL_SHADE); + nvgStrokeWidth(ctx, 1); nvgStrokePaint(ctx, nvgLinearGradient(ctx, - x,y+h-fmaxf(cr2,cr3)-1, + x,y+h-bnd_fmaxf(cr2,cr3)-1, x,y+h-1, nvgRGBAf(bevelColor.r, bevelColor.g, bevelColor.b, 0), bevelColor)); @@ -1047,29 +1991,29 @@ void bndBackground(NVGcontext *ctx, float x, float y, float w, float h) { void bndIcon(NVGcontext *ctx, float x, float y, int iconid) { int ix, iy, u, v; if (bnd_icon_image < 0) return; // no icons loaded - + ix = iconid & 0xff; iy = (iconid>>8) & 0xff; u = BND_ICON_SHEET_OFFSET_X + ix*BND_ICON_SHEET_GRID; v = BND_ICON_SHEET_OFFSET_Y + iy*BND_ICON_SHEET_GRID; - + nvgBeginPath(ctx); nvgRect(ctx,x,y,BND_ICON_SHEET_RES,BND_ICON_SHEET_RES); nvgFillPaint(ctx, nvgImagePattern(ctx,x-u,y-v, BND_ICON_SHEET_WIDTH, BND_ICON_SHEET_HEIGHT, - 0,bnd_icon_image,0)); + 0,bnd_icon_image,1)); nvgFill(ctx); } void bndDropShadow(NVGcontext *ctx, float x, float y, float w, float h, float r, float feather, float alpha) { - + nvgBeginPath(ctx); y += feather; h -= feather; - + nvgMoveTo(ctx, x-feather, y-feather); nvgLineTo(ctx, x, y-feather); nvgLineTo(ctx, x, y+h-feather); @@ -1080,23 +2024,23 @@ void bndDropShadow(NVGcontext *ctx, float x, float y, float w, float h, nvgLineTo(ctx, x+w+feather, y+h+feather); nvgLineTo(ctx, x-feather, y+h+feather); nvgClosePath(ctx); - + nvgFillPaint(ctx, nvgBoxGradient(ctx, x - feather*0.5f,y - feather*0.5f, w + feather,h+feather, r+feather*0.5f, feather, - nvgRGBAf(0,0,0,alpha*alpha), + nvgRGBAf(0,0,0,alpha*alpha), nvgRGBAf(0,0,0,0))); nvgFill(ctx); } -void bndInnerBox(NVGcontext *ctx, float x, float y, float w, float h, +void bndInnerBox(NVGcontext *ctx, float x, float y, float w, float h, float cr0, float cr1, float cr2, float cr3, NVGcolor shade_top, NVGcolor shade_down) { nvgBeginPath(ctx); - bndRoundedBox(ctx,x+1,y+1,w-2,h-3, - fmaxf(0,cr0-1),fmaxf(0,cr1-1),fmaxf(0,cr2-1),fmaxf(0,cr3-1)); + bndRoundedBox(ctx,x+1,y+1,w-2,h-3,bnd_fmaxf(0,cr0-1), + bnd_fmaxf(0,cr1-1),bnd_fmaxf(0,cr2-1),bnd_fmaxf(0,cr3-1)); nvgFillPaint(ctx,((h-2)>w)? nvgLinearGradient(ctx,x,y,x+w,y,shade_top,shade_down): nvgLinearGradient(ctx,x,y,x,y+h,shade_top,shade_down)); @@ -1120,7 +2064,7 @@ void bndSelectCorners(float *radiuses, float r, int flags) { } void bndInnerColors( - NVGcolor *shade_top, NVGcolor *shade_down, + NVGcolor *shade_top, NVGcolor *shade_down, const BNDwidgetTheme *theme, BNDwidgetState state, int flipActive) { switch(state) { @@ -1135,9 +2079,9 @@ void bndInnerColors( *shade_down = bndOffsetColor(color, theme->shadeDown); } break; case BND_ACTIVE: { - *shade_top = bndOffsetColor(theme->innerSelectedColor, + *shade_top = bndOffsetColor(theme->innerSelectedColor, flipActive?theme->shadeDown:theme->shadeTop); - *shade_down = bndOffsetColor(theme->innerSelectedColor, + *shade_down = bndOffsetColor(theme->innerSelectedColor, flipActive?theme->shadeTop:theme->shadeDown); } break; } @@ -1148,15 +2092,15 @@ NVGcolor bndTextColor(const BNDwidgetTheme *theme, BNDwidgetState state) { } void bndIconLabelValue(NVGcontext *ctx, float x, float y, float w, float h, - int iconid, NVGcolor color, int align, float fontsize, const char *label, + int iconid, NVGcolor color, int align, float fontsize, const char *label, const char *value) { float pleft = BND_PAD_LEFT; if (label) { if (iconid >= 0) { bndIcon(ctx,x+4,y+2,iconid); pleft += BND_ICON_SHEET_RES; - } - + } + if (bnd_font < 0) return; nvgFontFaceId(ctx, bnd_font); nvgFontSize(ctx, fontsize); @@ -1166,7 +2110,7 @@ void bndIconLabelValue(NVGcontext *ctx, float x, float y, float w, float h, float label_width = nvgTextBounds(ctx, 1, 1, label, NULL, NULL); float sep_width = nvgTextBounds(ctx, 1, 1, BND_LABEL_SEPARATOR, NULL, NULL); - + nvgTextAlign(ctx, NVG_ALIGN_LEFT|NVG_ALIGN_BASELINE); x += pleft; if (align == BND_CENTER) { @@ -1174,25 +2118,48 @@ void bndIconLabelValue(NVGcontext *ctx, float x, float y, float w, float h, + nvgTextBounds(ctx, 1, 1, value, NULL, NULL); x += ((w-BND_PAD_RIGHT-pleft)-width)*0.5f; } - y += h-6; + y += h-BND_TEXT_PAD_DOWN; nvgText(ctx, x, y, label, NULL); x += label_width; nvgText(ctx, x, y, BND_LABEL_SEPARATOR, NULL); x += sep_width; - nvgText(ctx, x, y, value, NULL); + nvgText(ctx, x, y, value, NULL); } else { - nvgTextAlign(ctx, + nvgTextAlign(ctx, (align==BND_LEFT)?(NVG_ALIGN_LEFT|NVG_ALIGN_BASELINE): (NVG_ALIGN_CENTER|NVG_ALIGN_BASELINE)); - nvgTextBox(ctx,x+pleft,y+h-6,w-BND_PAD_RIGHT-pleft,label, NULL); + nvgTextBox(ctx,x+pleft,y+h-BND_TEXT_PAD_DOWN, + w-BND_PAD_RIGHT-pleft,label, NULL); } } else if (iconid >= 0) { bndIcon(ctx,x+2,y+2,iconid); } } -void bndIconLabelCaret(NVGcontext *ctx, float x, float y, float w, float h, - int iconid, NVGcolor color, float fontsize, const char *label, +void bndNodeIconLabel(NVGcontext *ctx, float x, float y, float w, float h, + int iconid, NVGcolor color, NVGcolor shadowColor, + int /*align*/, float fontsize, const char *label) { + if (label && (bnd_font >= 0)) { + nvgFontFaceId(ctx, bnd_font); + nvgFontSize(ctx, fontsize); + nvgBeginPath(ctx); + nvgTextAlign(ctx, NVG_ALIGN_LEFT|NVG_ALIGN_BASELINE); + nvgFillColor(ctx, shadowColor); + nvgFontBlur(ctx, BND_NODE_TITLE_FEATHER); + nvgTextBox(ctx,x+1,y+h+3-BND_TEXT_PAD_DOWN, + w,label, NULL); + nvgFillColor(ctx, color); + nvgFontBlur(ctx, 0); + nvgTextBox(ctx,x,y+h+2-BND_TEXT_PAD_DOWN, + w,label, NULL); + } + if (iconid >= 0) { + bndIcon(ctx,x+w-BND_ICON_SHEET_RES,y+3,iconid); + } +} + +void bndIconLabelCaret(NVGcontext *ctx, float x, float y, float w, float /*h*/, + int iconid, NVGcolor color, float fontsize, const char *label, NVGcolor caretcolor, int cbegin, int cend) { float bounds[4]; float pleft = BND_TEXT_RADIUS; @@ -1201,17 +2168,20 @@ void bndIconLabelCaret(NVGcontext *ctx, float x, float y, float w, float h, bndIcon(ctx,x+4,y+2,iconid); pleft += BND_ICON_SHEET_RES; } - + if (bnd_font < 0) return; - + x+=pleft; - y+=h-6; + y+=BND_WIDGET_HEIGHT-BND_TEXT_PAD_DOWN; nvgFontFaceId(ctx, bnd_font); nvgFontSize(ctx, fontsize); nvgTextAlign(ctx, NVG_ALIGN_LEFT|NVG_ALIGN_BASELINE); + w -= BND_TEXT_RADIUS+pleft; + if (cend >= cbegin) { +#if 1 float c0,c1; const char *cb;const char *ce; static NVGglyphPosition glyphs[BND_MAX_GLYPHS]; @@ -1227,6 +2197,41 @@ void bndIconLabelCaret(NVGcontext *ctx, float x, float y, float w, float h, if (glyphs[i].str == ce) c1 = glyphs[i].x; } + + nvgTextBounds(ctx,x,y,label,NULL, bounds); + nvgBeginPath(ctx); + if (cbegin == cend) { + nvgFillColor(ctx, nvgRGBf(0.337,0.502,0.761)); + nvgRect(ctx, c0-1, bounds[1], 2, bounds[3]-bounds[1]); + } else { + nvgFillColor(ctx, caretcolor); + nvgRect(ctx, c0-1, bounds[1], c1-c0+1, bounds[3]-bounds[1]); + } + nvgFill(ctx); +#else + float c0,c1; + const char *cb; + const char *ce; + const char *line; + int numlines; + cb = label+cbegin; ce = label+cend; + line = label; + + NVGtextRow rows[2]; + numlines = nvgTextBreakLines(ctx, line, NULL, w, rows, 2); + + /* + int nglyphs = nvgTextGlyphPositions( + ctx, x, y, label, label+cend+1, glyphs, BND_MAX_GLYPHS); + c0=glyphs[0].x; + c1=glyphs[nglyphs-1].x; + // TODO: this is slow + for (int i=0; i < nglyphs; ++i) { + if (glyphs[i].str == cb) + c0 = glyphs[i].x; + if (glyphs[i].str == ce) + c1 = glyphs[i].x; + } nvgTextBounds(ctx,x,y,label,NULL, bounds); nvgBeginPath(ctx); @@ -1238,11 +2243,13 @@ void bndIconLabelCaret(NVGcontext *ctx, float x, float y, float w, float h, nvgRect(ctx, c0-1, bounds[1], c1-c0+1, bounds[3]-bounds[1]); } nvgFill(ctx); + */ +#endif } - + nvgBeginPath(ctx); nvgFillColor(ctx, color); - nvgTextBox(ctx,x,y,w-BND_TEXT_RADIUS-pleft,label, NULL); + nvgTextBox(ctx,x,y,w,label, NULL); } void bndCheck(NVGcontext *ctx, float ox, float oy, NVGcolor color) { @@ -1284,29 +2291,50 @@ void bndUpDownArrow(NVGcontext *ctx, float x, float y, float s, NVGcolor color) nvgFill(ctx); } +void bndNodeArrowDown(NVGcontext *ctx, float x, float y, float s, NVGcolor color) { + float w; + nvgBeginPath(ctx); + w = 1.0f*s; + nvgMoveTo(ctx,x,y); + nvgLineTo(ctx,x+0.5*w,y-s); + nvgLineTo(ctx,x-0.5*w,y-s); + nvgClosePath(ctx); + nvgFillColor(ctx,color); + nvgFill(ctx); +} + void bndScrollHandleRect(float *x, float *y, float *w, float *h, float offset, float size) { size = bnd_clamp(size,0,1); offset = bnd_clamp(offset,0,1); if ((*h) > (*w)) { - float hs = fmaxf(size*(*h), (*w)+1); + float hs = bnd_fmaxf(size*(*h), (*w)+1); *y = (*y) + ((*h)-hs)*offset; *h = hs; } else { - float ws = fmaxf(size*(*w), (*h)-1); + float ws = bnd_fmaxf(size*(*w), (*h)-1); *x = (*x) + ((*w)-ws)*offset; *w = ws; } } +NVGcolor bndNodeWireColor(const BNDnodeTheme *theme, BNDwidgetState state) { + switch(state) { + default: + case BND_DEFAULT: return nvgRGBf(0.5f,0.5f,0.5f); + case BND_HOVER: return theme->wireSelectColor; + case BND_ACTIVE: return theme->activeNodeColor; + } +} + //////////////////////////////////////////////////////////////////////////////// #ifdef BND_INLINE #undef BND_INLINE #endif -#ifdef _MSC_VER -# pragma warning (pop) -#endif +#if BX_COMPILER_MSVC +# pragma warning(pop) +#endif // BX_COMPILER_MSVC #endif // BLENDISH_IMPLEMENTATION