Browse Source

Split app.hpp into individual headers

tags/v1.0.0
Andrew Belt 6 years ago
parent
commit
4b55d428e8
62 changed files with 816 additions and 535 deletions
  1. +4
    -2
      include/WidgetState.hpp
  2. +29
    -439
      include/app.hpp
  3. +27
    -0
      include/app/AudioWidget.hpp
  4. +16
    -0
      include/app/CircularShadow.hpp
  5. +17
    -0
      include/app/Component.hpp
  6. +23
    -0
      include/app/Knob.hpp
  7. +37
    -0
      include/app/LedDisplay.hpp
  8. +18
    -0
      include/app/LightWidget.hpp
  9. +25
    -0
      include/app/MidiWidget.hpp
  10. +19
    -0
      include/app/ModuleLightWidget.hpp
  11. +5
    -2
      include/app/ModuleWidget.hpp
  12. +19
    -0
      include/app/MomentarySwitch.hpp
  13. +19
    -0
      include/app/MultiLightWidget.hpp
  14. +28
    -0
      include/app/ParamWidget.hpp
  15. +17
    -0
      include/app/PluginManagerWidget.hpp
  16. +30
    -0
      include/app/Port.hpp
  17. +13
    -0
      include/app/RackRail.hpp
  18. +20
    -0
      include/app/RackScene.hpp
  19. +13
    -0
      include/app/RackScrollWidget.hpp
  20. +61
    -0
      include/app/RackWidget.hpp
  21. +24
    -0
      include/app/SVGButton.hpp
  22. +24
    -0
      include/app/SVGKnob.hpp
  23. +1
    -3
      include/app/SVGPanel.hpp
  24. +19
    -0
      include/app/SVGPort.hpp
  25. +17
    -0
      include/app/SVGScrew.hpp
  26. +24
    -0
      include/app/SVGSlider.hpp
  27. +20
    -0
      include/app/SVGSwitch.hpp
  28. +14
    -0
      include/app/ToggleSwitch.hpp
  29. +19
    -0
      include/app/Toolbar.hpp
  30. +24
    -0
      include/app/WireContainer.hpp
  31. +32
    -0
      include/app/WireWidget.hpp
  32. +47
    -0
      include/app/common.hpp
  33. +16
    -5
      include/event.hpp
  34. +1
    -0
      include/ui.hpp
  35. +1
    -3
      include/ui/Button.hpp
  36. +1
    -2
      include/ui/ChoiceButton.hpp
  37. +1
    -2
      include/ui/IconButton.hpp
  38. +1
    -3
      include/ui/Label.hpp
  39. +1
    -2
      include/ui/List.hpp
  40. +0
    -2
      include/ui/Menu.hpp
  41. +1
    -2
      include/ui/MenuEntry.hpp
  42. +2
    -4
      include/ui/MenuItem.hpp
  43. +1
    -3
      include/ui/MenuLabel.hpp
  44. +1
    -2
      include/ui/MenuOverlay.hpp
  45. +1
    -3
      include/ui/MenuSeparator.hpp
  46. +2
    -2
      include/ui/PasswordField.hpp
  47. +1
    -3
      include/ui/ProgressBar.hpp
  48. +1
    -3
      include/ui/RadioButton.hpp
  49. +1
    -3
      include/ui/Scene.hpp
  50. +1
    -2
      include/ui/ScrollWidget.hpp
  51. +1
    -2
      include/ui/SequentialLayout.hpp
  52. +1
    -3
      include/ui/Slider.hpp
  53. +1
    -3
      include/ui/TextField.hpp
  54. +1
    -3
      include/ui/Tooltip.hpp
  55. +1
    -2
      include/ui/TooltipOverlay.hpp
  56. +1
    -2
      include/ui/WindowOverlay.hpp
  57. +1
    -3
      include/ui/WindowWidget.hpp
  58. +6
    -0
      include/ui/common.hpp
  59. +0
    -5
      include/widgets.hpp
  60. +10
    -10
      include/widgets/OpaqueWidget.hpp
  61. +1
    -0
      include/widgets/Widget.hpp
  62. +53
    -10
      src/WidgetState.cpp

+ 4
- 2
include/WidgetState.hpp View File

@@ -1,11 +1,13 @@
#pragma once
#include "event.hpp"
#include "widgets/Widget.hpp"
#include "math.hpp"
#include <vector>


namespace rack {


struct Widget;


struct WidgetState {
Widget *rootWidget = NULL;


+ 29
- 439
include/app.hpp View File

@@ -1,441 +1,38 @@
#pragma once
#include <vector>
#include <jansson.h>
#include "widgets.hpp"
#include "ui.hpp"
#include "WidgetState.hpp"


static const float SVG_DPI = 75.0;
static const float MM_PER_IN = 25.4;


namespace rack {


inline float in2px(float inches) {
return inches * SVG_DPI;
}

inline math::Vec in2px(math::Vec inches) {
return inches.mult(SVG_DPI);
}

inline float mm2px(float millimeters) {
return millimeters * (SVG_DPI / MM_PER_IN);
}

inline math::Vec mm2px(math::Vec millimeters) {
return millimeters.mult(SVG_DPI / MM_PER_IN);
}


struct Model;
struct Module;
struct Wire;

struct RackWidget;
struct ParamWidget;
struct Port;
struct SVGPanel;

////////////////////
// module
////////////////////

// A 1HPx3U module should be 15x380 pixels. Thus the width of a module should be a factor of 15.
static const float RACK_GRID_WIDTH = 15;
static const float RACK_GRID_HEIGHT = 380;
static const math::Vec RACK_GRID_SIZE = math::Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
static const std::string PRESET_FILTERS = "VCV Rack module preset (.vcvm):vcvm";
static const std::string PATCH_FILTERS = "VCV Rack patch (.vcv):vcv";

} // namespace rack


#include "app/AudioWidget.hpp"
#include "app/CircularShadow.hpp"
#include "app/common.hpp"
#include "app/Component.hpp"
#include "app/Knob.hpp"
#include "app/LedDisplay.hpp"
#include "app/LightWidget.hpp"
#include "app/MidiWidget.hpp"
#include "app/ModuleLightWidget.hpp"
#include "app/ModuleWidget.hpp"
#include "app/MomentarySwitch.hpp"
#include "app/MultiLightWidget.hpp"
#include "app/ParamWidget.hpp"
#include "app/PluginManagerWidget.hpp"
#include "app/Port.hpp"
#include "app/RackRail.hpp"
#include "app/RackScene.hpp"
#include "app/RackScrollWidget.hpp"
#include "app/RackWidget.hpp"
#include "app/SVGButton.hpp"
#include "app/SVGKnob.hpp"
#include "app/SVGPanel.hpp"
#include "app/SVGPort.hpp"
#include "app/SVGScrew.hpp"
#include "app/SVGSlider.hpp"
#include "app/SVGSwitch.hpp"
#include "app/ToggleSwitch.hpp"
#include "app/Toolbar.hpp"
#include "app/WireContainer.hpp"
#include "app/WireWidget.hpp"


namespace rack {


struct WireWidget : OpaqueWidget {
Port *outputPort = NULL;
Port *inputPort = NULL;
Port *hoveredOutputPort = NULL;
Port *hoveredInputPort = NULL;
Wire *wire = NULL;
NVGcolor color;

WireWidget();
~WireWidget();
/** Synchronizes the plugged state of the widget to the owned wire */
void updateWire();
math::Vec getOutputPos();
math::Vec getInputPos();
json_t *toJson();
void fromJson(json_t *rootJ);
void draw(NVGcontext *vg) override;
void drawPlugs(NVGcontext *vg);
};

struct WireContainer : TransparentWidget {
WireWidget *activeWire = NULL;
/** Takes ownership of `w` and adds it as a child if it isn't already */
void setActiveWire(WireWidget *w);
/** "Drops" the wire onto the port, making an engine connection if successful */
void commitActiveWire();
void removeTopWire(Port *port);
void removeAllWires(Port *port);
/** Returns the most recently added wire connected to the given Port, i.e. the top of the stack */
WireWidget *getTopWire(Port *port);
void draw(NVGcontext *vg) override;
};

struct RackWidget : OpaqueWidget {
FramebufferWidget *rails;
// Only put ModuleWidgets in here
Widget *moduleContainer;
// Only put WireWidgets in here
WireContainer *wireContainer;
std::string lastPath;
math::Vec lastMousePos;
bool lockModules = false;

RackWidget();
~RackWidget();

/** Completely clear the rack's modules and wires */
void clear();
/** Clears the rack and loads the template patch */
void reset();
void loadDialog();
void saveDialog();
void saveAsDialog();
/** If `lastPath` is defined, ask the user to reload it */
void revert();
/** Disconnects all wires */
void disconnect();
void save(std::string filename);
void load(std::string filename);
json_t *toJson();
void fromJson(json_t *rootJ);
/** Creates a module and adds it to the rack */
ModuleWidget *moduleFromJson(json_t *moduleJ);
void pastePresetClipboard();

void addModule(ModuleWidget *m);
/** Removes the module and transfers ownership to the caller */
void deleteModule(ModuleWidget *m);
void cloneModule(ModuleWidget *m);
/** Sets a module's box if non-colliding. Returns true if set */
bool requestModuleBox(ModuleWidget *m, math::Rect box);
/** Moves a module to the closest non-colliding position */
bool requestModuleBoxNearest(ModuleWidget *m, math::Rect box);

void step() override;
void draw(NVGcontext *vg) override;

void onHover(event::Hover &e) override;
void onButton(event::Button &e) override;
void onZoom(event::Zoom &e) override;
};

struct RackRail : TransparentWidget {
void draw(NVGcontext *vg) override;
};

////////////////////
// ParamWidgets and other components
////////////////////

/** A Widget that exists on a Panel and interacts with a Module */
struct Component : OpaqueWidget {
Module *module = NULL;
};

struct CircularShadow : TransparentWidget {
float blurRadius;
float opacity;
CircularShadow();
void draw(NVGcontext *vg) override;
};

/** A Component which has control over a Param (defined in engine.hpp) */
struct ParamWidget : Component, QuantityWidget {
int paramId;
/** Used to momentarily disable value randomization
To permanently disable or change randomization behavior, override the randomize() method instead of changing this.
*/
bool randomizable = true;
/** Apply per-sample smoothing in the engine */
bool smooth = false;

json_t *toJson();
void fromJson(json_t *rootJ);
virtual void reset();
virtual void randomize();
void onButton(event::Button &e) override;
void onChange(event::Change &e) override;
};

/** Implements vertical dragging behavior for ParamWidgets */
struct Knob : ParamWidget {
/** Snap to nearest integer while dragging */
bool snap = false;
/** Multiplier for mouse movement to adjust knob value */
float speed = 1.0;
float dragValue;
Knob();
void onDragStart(event::DragStart &e) override;
void onDragMove(event::DragMove &e) override;
void onDragEnd(event::DragEnd &e) override;
};

/** A knob which rotates an SVG and caches it in a framebuffer */
struct SVGKnob : Knob, FramebufferWidget {
TransformWidget *tw;
SVGWidget *sw;
CircularShadow *shadow;
/** Angles in radians */
float minAngle, maxAngle;

SVGKnob();
void setSVG(std::shared_ptr<SVG> svg);
void step() override;
void onChange(event::Change &e) override;
};

/** Behaves like a knob but linearly moves an SVGWidget between two points.
Can be used for horizontal or vertical linear faders.
*/
struct SVGSlider : Knob, FramebufferWidget {
SVGWidget *background;
SVGWidget *handle;
/** Intermediate positions will be interpolated between these positions */
math::Vec minHandlePos, maxHandlePos;

SVGSlider();
void setSVGs(std::shared_ptr<SVG> backgroundSVG, std::shared_ptr<SVG> handleSVG);
void step() override;
void onChange(event::Change &e) override;
};

/** A ParamWidget with multiple frames corresponding to its value */
struct SVGSwitch : virtual ParamWidget, FramebufferWidget {
std::vector<std::shared_ptr<SVG>> frames;
SVGWidget *sw;
SVGSwitch();
/** Adds an SVG file to represent the next switch position */
void addFrame(std::shared_ptr<SVG> svg);
void onChange(event::Change &e) override;
};

/** A switch that cycles through each mechanical position */
struct ToggleSwitch : virtual ParamWidget {
void onDragStart(event::DragStart &e) override;
};

/** A switch that is turned on when held and turned off when released.
Consider using SVGButton if the switch simply changes the state of your Module when clicked.
*/
struct MomentarySwitch : virtual ParamWidget {
/** Don't randomize state */
void randomize() override {}
void onDragStart(event::DragStart &e) override;
void onDragEnd(event::DragEnd &e) override;
};

/** A Component with a default (up) and active (down) state when clicked.
Does not modify a Param, simply calls onAction() of a subclass.
*/
struct SVGButton : Component, FramebufferWidget {
Module *module = NULL;
std::shared_ptr<SVG> defaultSVG;
std::shared_ptr<SVG> activeSVG;
SVGWidget *sw;
SVGButton();
/** If `activeSVG` is NULL, `defaultSVG` is used as the active state instead. */
void setSVGs(std::shared_ptr<SVG> defaultSVG, std::shared_ptr<SVG> activeSVG);
void onDragStart(event::DragStart &e) override;
void onDragEnd(event::DragEnd &e) override;
};

////////////////////
// IO widgets
////////////////////

struct LedDisplay : virtual Widget {
void draw(NVGcontext *vg) override;
};

struct LedDisplaySeparator : TransparentWidget {
LedDisplaySeparator();
void draw(NVGcontext *vg) override;
};

struct LedDisplayChoice : TransparentWidget {
std::string text;
std::shared_ptr<Font> font;
math::Vec textOffset;
NVGcolor color;
LedDisplayChoice();
void draw(NVGcontext *vg) override;
void onButton(event::Button &e) override;
};

struct LedDisplayTextField : TextField {
std::shared_ptr<Font> font;
math::Vec textOffset;
NVGcolor color;
LedDisplayTextField();
void draw(NVGcontext *vg) override;
int getTextPosition(math::Vec mousePos) override;
};


struct AudioIO;
struct MidiIO;

struct AudioWidget : LedDisplay {
/** Not owned */
AudioIO *audioIO = NULL;
LedDisplayChoice *driverChoice;
LedDisplaySeparator *driverSeparator;
LedDisplayChoice *deviceChoice;
LedDisplaySeparator *deviceSeparator;
LedDisplayChoice *sampleRateChoice;
LedDisplaySeparator *sampleRateSeparator;
LedDisplayChoice *bufferSizeChoice;
AudioWidget();
void step() override;
};

struct MidiWidget : LedDisplay {
/** Not owned */
MidiIO *midiIO = NULL;
LedDisplayChoice *driverChoice;
LedDisplaySeparator *driverSeparator;
LedDisplayChoice *deviceChoice;
LedDisplaySeparator *deviceSeparator;
LedDisplayChoice *channelChoice;
MidiWidget();
void step() override;
};

////////////////////
// lights
////////////////////

struct LightWidget : TransparentWidget {
NVGcolor bgColor = nvgRGBA(0, 0, 0, 0);
NVGcolor color = nvgRGBA(0, 0, 0, 0);
NVGcolor borderColor = nvgRGBA(0, 0, 0, 0);
void draw(NVGcontext *vg) override;
virtual void drawLight(NVGcontext *vg);
virtual void drawHalo(NVGcontext *vg);
};

/** Mixes a list of colors based on a list of brightness values */
struct MultiLightWidget : LightWidget {
/** Colors of each value state */
std::vector<NVGcolor> baseColors;
void addBaseColor(NVGcolor baseColor);
/** Sets the color to a linear combination of the baseColors with the given weights */
void setValues(const std::vector<float> &values);
};

/** A MultiLightWidget that points to a module's Light or a range of lights
Will access firstLightId, firstLightId + 1, etc. for each added color
*/
struct ModuleLightWidget : MultiLightWidget {
Module *module = NULL;
int firstLightId;
void step() override;
};

////////////////////
// ports
////////////////////

struct Port : Component {
enum PortType {
INPUT,
OUTPUT
};
PortType type = INPUT;
int portId;
MultiLightWidget *plugLight;

Port();
~Port();
void step() override;
void draw(NVGcontext *vg) override;
void onButton(event::Button &e) override;
void onDragStart(event::DragStart &e) override;
void onDragEnd(event::DragEnd &e) override;
void onDragDrop(event::DragDrop &e) override;
void onDragEnter(event::DragEnter &e) override;
void onDragLeave(event::DragLeave &e) override;
};

struct SVGPort : Port, FramebufferWidget {
SVGWidget *background;
CircularShadow *shadow;

SVGPort();
void setSVG(std::shared_ptr<SVG> svg);
void draw(NVGcontext *vg) override;
};

/** If you don't add these to your ModuleWidget, they will fall out of the rack... */
struct SVGScrew : FramebufferWidget {
SVGWidget *sw;

SVGScrew();
};

////////////////////
// scene
////////////////////

struct Toolbar : OpaqueWidget {
Slider *wireOpacitySlider;
Slider *wireTensionSlider;
Slider *zoomSlider;
RadioButton *cpuUsageButton;

Toolbar();
void draw(NVGcontext *vg) override;
};

struct PluginManagerWidget : virtual Widget {
Widget *loginWidget;
Widget *manageWidget;
Widget *downloadWidget;
PluginManagerWidget();
void step() override;
};

struct RackScrollWidget : ScrollWidget {
void step() override;
};

struct RackScene : Scene {
ScrollWidget *scrollWidget;
ZoomWidget *zoomWidget;

RackScene();
void step() override;
void draw(NVGcontext *vg) override;
void onHoverKey(event::HoverKey &e) override;
void onPathDrop(event::PathDrop &e) override;
};

////////////////////
// globals
////////////////////

extern std::string gApplicationName;
extern std::string gApplicationVersion;
extern std::string gApiHost;
@@ -453,11 +50,4 @@ void appModuleBrowserCreate();
json_t *appModuleBrowserToJson();
void appModuleBrowserFromJson(json_t *rootJ);


/** Deprecated. Will be removed in v1 */
json_t *colorToJson(NVGcolor color);
/** Deprecated. Will be removed in v1 */
NVGcolor jsonToColor(json_t *colorJ);


} // namespace rack

+ 27
- 0
include/app/AudioWidget.hpp View File

@@ -0,0 +1,27 @@
#pragma once
#include "common.hpp"
#include "LedDisplay.hpp"


namespace rack {


struct AudioIO;


struct AudioWidget : LedDisplay {
/** Not owned */
AudioIO *audioIO = NULL;
LedDisplayChoice *driverChoice;
LedDisplaySeparator *driverSeparator;
LedDisplayChoice *deviceChoice;
LedDisplaySeparator *deviceSeparator;
LedDisplayChoice *sampleRateChoice;
LedDisplaySeparator *sampleRateSeparator;
LedDisplayChoice *bufferSizeChoice;
AudioWidget();
void step() override;
};


} // namespace rack

+ 16
- 0
include/app/CircularShadow.hpp View File

@@ -0,0 +1,16 @@
#pragma once
#include "common.hpp"


namespace rack {


struct CircularShadow : TransparentWidget {
float blurRadius;
float opacity;
CircularShadow();
void draw(NVGcontext *vg) override;
};


} // namespace rack

+ 17
- 0
include/app/Component.hpp View File

@@ -0,0 +1,17 @@
#pragma once
#include "common.hpp"


namespace rack {


struct Module;


/** A Widget that exists on a Panel and interacts with a Module */
struct Component : OpaqueWidget {
Module *module = NULL;
};


} // namespace rack

+ 23
- 0
include/app/Knob.hpp View File

@@ -0,0 +1,23 @@
#pragma once
#include "common.hpp"
#include "ParamWidget.hpp"


namespace rack {


/** Implements vertical dragging behavior for ParamWidgets */
struct Knob : ParamWidget {
/** Snap to nearest integer while dragging */
bool snap = false;
/** Multiplier for mouse movement to adjust knob value */
float speed = 1.0;
float dragValue;
Knob();
void onDragStart(event::DragStart &e) override;
void onDragMove(event::DragMove &e) override;
void onDragEnd(event::DragEnd &e) override;
};


} // namespace rack

+ 37
- 0
include/app/LedDisplay.hpp View File

@@ -0,0 +1,37 @@
#pragma once
#include "common.hpp"


namespace rack {


struct LedDisplay : virtual Widget {
void draw(NVGcontext *vg) override;
};

struct LedDisplaySeparator : TransparentWidget {
LedDisplaySeparator();
void draw(NVGcontext *vg) override;
};

struct LedDisplayChoice : TransparentWidget {
std::string text;
std::shared_ptr<Font> font;
math::Vec textOffset;
NVGcolor color;
LedDisplayChoice();
void draw(NVGcontext *vg) override;
void onButton(event::Button &e) override;
};

struct LedDisplayTextField : TextField {
std::shared_ptr<Font> font;
math::Vec textOffset;
NVGcolor color;
LedDisplayTextField();
void draw(NVGcontext *vg) override;
int getTextPosition(math::Vec mousePos) override;
};


} // namespace rack

+ 18
- 0
include/app/LightWidget.hpp View File

@@ -0,0 +1,18 @@
#pragma once
#include "common.hpp"


namespace rack {


struct LightWidget : TransparentWidget {
NVGcolor bgColor = nvgRGBA(0, 0, 0, 0);
NVGcolor color = nvgRGBA(0, 0, 0, 0);
NVGcolor borderColor = nvgRGBA(0, 0, 0, 0);
void draw(NVGcontext *vg) override;
virtual void drawLight(NVGcontext *vg);
virtual void drawHalo(NVGcontext *vg);
};


} // namespace rack

+ 25
- 0
include/app/MidiWidget.hpp View File

@@ -0,0 +1,25 @@
#pragma once
#include "common.hpp"
#include "LedDisplay.hpp"


namespace rack {


struct MidiIO;


struct MidiWidget : LedDisplay {
/** Not owned */
MidiIO *midiIO = NULL;
LedDisplayChoice *driverChoice;
LedDisplaySeparator *driverSeparator;
LedDisplayChoice *deviceChoice;
LedDisplaySeparator *deviceSeparator;
LedDisplayChoice *channelChoice;
MidiWidget();
void step() override;
};


} // namespace rack

+ 19
- 0
include/app/ModuleLightWidget.hpp View File

@@ -0,0 +1,19 @@
#pragma once
#include "common.hpp"
#include "MultiLightWidget.hpp"


namespace rack {


/** A MultiLightWidget that points to a module's Light or a range of lights
Will access firstLightId, firstLightId + 1, etc. for each added color
*/
struct ModuleLightWidget : MultiLightWidget {
Module *module = NULL;
int firstLightId;
void step() override;
};


} // namespace rack

+ 5
- 2
include/app/ModuleWidget.hpp View File

@@ -1,6 +1,5 @@
#pragma once
#include "widgets/OpaqueWidget.hpp"
#include "app/SVGPanel.hpp"
#include "common.hpp"
#include "plugin.hpp"
#include "engine.hpp"

@@ -8,6 +7,10 @@
namespace rack {


struct SVGPanel;
struct Port;


struct ModuleWidget : OpaqueWidget {
Model *model = NULL;
/** Owns the module pointer */


+ 19
- 0
include/app/MomentarySwitch.hpp View File

@@ -0,0 +1,19 @@
#pragma once
#include "common.hpp"


namespace rack {


/** A switch that is turned on when held and turned off when released.
Consider using SVGButton if the switch simply changes the state of your Module when clicked.
*/
struct MomentarySwitch : virtual ParamWidget {
/** Don't randomize state */
void randomize() override {}
void onDragStart(event::DragStart &e) override;
void onDragEnd(event::DragEnd &e) override;
};


} // namespace rack

+ 19
- 0
include/app/MultiLightWidget.hpp View File

@@ -0,0 +1,19 @@
#pragma once
#include "common.hpp"
#include "LightWidget.hpp"


namespace rack {


/** Mixes a list of colors based on a list of brightness values */
struct MultiLightWidget : LightWidget {
/** Colors of each value state */
std::vector<NVGcolor> baseColors;
void addBaseColor(NVGcolor baseColor);
/** Sets the color to a linear combination of the baseColors with the given weights */
void setValues(const std::vector<float> &values);
};


} // namespace rack

+ 28
- 0
include/app/ParamWidget.hpp View File

@@ -0,0 +1,28 @@
#pragma once
#include "common.hpp"
#include "engine.hpp"


namespace rack {


/** A Component which has control over a Param */
struct ParamWidget : Component, QuantityWidget {
int paramId;
/** Used to momentarily disable value randomization
To permanently disable or change randomization behavior, override the randomize() method instead of changing this.
*/
bool randomizable = true;
/** Apply per-sample smoothing in the engine */
bool smooth = false;

json_t *toJson();
void fromJson(json_t *rootJ);
virtual void reset();
virtual void randomize();
void onButton(event::Button &e) override;
void onChange(event::Change &e) override;
};


} // namespace rack

+ 17
- 0
include/app/PluginManagerWidget.hpp View File

@@ -0,0 +1,17 @@
#pragma once
#include "common.hpp"


namespace rack {


struct PluginManagerWidget : virtual Widget {
Widget *loginWidget;
Widget *manageWidget;
Widget *downloadWidget;
PluginManagerWidget();
void step() override;
};


} // namespace rack

+ 30
- 0
include/app/Port.hpp View File

@@ -0,0 +1,30 @@
#pragma once
#include "common.hpp"


namespace rack {


struct Port : Component {
enum PortType {
INPUT,
OUTPUT
};
PortType type = INPUT;
int portId;
MultiLightWidget *plugLight;

Port();
~Port();
void step() override;
void draw(NVGcontext *vg) override;
void onButton(event::Button &e) override;
void onDragStart(event::DragStart &e) override;
void onDragEnd(event::DragEnd &e) override;
void onDragDrop(event::DragDrop &e) override;
void onDragEnter(event::DragEnter &e) override;
void onDragLeave(event::DragLeave &e) override;
};


} // namespace rack

+ 13
- 0
include/app/RackRail.hpp View File

@@ -0,0 +1,13 @@
#pragma once
#include "common.hpp"


namespace rack {


struct RackRail : TransparentWidget {
void draw(NVGcontext *vg) override;
};


} // namespace rack

+ 20
- 0
include/app/RackScene.hpp View File

@@ -0,0 +1,20 @@
#pragma once
#include "common.hpp"


namespace rack {


struct RackScene : Scene {
ScrollWidget *scrollWidget;
ZoomWidget *zoomWidget;

RackScene();
void step() override;
void draw(NVGcontext *vg) override;
void onHoverKey(event::HoverKey &e) override;
void onPathDrop(event::PathDrop &e) override;
};


} // namespace rack

+ 13
- 0
include/app/RackScrollWidget.hpp View File

@@ -0,0 +1,13 @@
#pragma once
#include "common.hpp"


namespace rack {


struct RackScrollWidget : ScrollWidget {
void step() override;
};


} // namespace rack

+ 61
- 0
include/app/RackWidget.hpp View File

@@ -0,0 +1,61 @@
#pragma once
#include "common.hpp"
#include "WireWidget.hpp"
#include "WireContainer.hpp"
#include "engine.hpp"


namespace rack {


struct RackWidget : OpaqueWidget {
FramebufferWidget *rails;
// Only put ModuleWidgets in here
Widget *moduleContainer;
// Only put WireWidgets in here
WireContainer *wireContainer;
std::string lastPath;
math::Vec lastMousePos;
bool lockModules = false;

RackWidget();
~RackWidget();

/** Completely clear the rack's modules and wires */
void clear();
/** Clears the rack and loads the template patch */
void reset();
void loadDialog();
void saveDialog();
void saveAsDialog();
/** If `lastPath` is defined, ask the user to reload it */
void revert();
/** Disconnects all wires */
void disconnect();
void save(std::string filename);
void load(std::string filename);
json_t *toJson();
void fromJson(json_t *rootJ);
/** Creates a module and adds it to the rack */
ModuleWidget *moduleFromJson(json_t *moduleJ);
void pastePresetClipboard();

void addModule(ModuleWidget *m);
/** Removes the module and transfers ownership to the caller */
void deleteModule(ModuleWidget *m);
void cloneModule(ModuleWidget *m);
/** Sets a module's box if non-colliding. Returns true if set */
bool requestModuleBox(ModuleWidget *m, math::Rect box);
/** Moves a module to the closest non-colliding position */
bool requestModuleBoxNearest(ModuleWidget *m, math::Rect box);

void step() override;
void draw(NVGcontext *vg) override;

void onHover(event::Hover &e) override;
void onButton(event::Button &e) override;
void onZoom(event::Zoom &e) override;
};


} // namespace rack

+ 24
- 0
include/app/SVGButton.hpp View File

@@ -0,0 +1,24 @@
#pragma once
#include "common.hpp"
#include "engine.hpp"


namespace rack {


/** A Component with a default (up) and active (down) state when clicked.
Does not modify a Param, simply calls onAction() of a subclass.
*/
struct SVGButton : Component, FramebufferWidget {
std::shared_ptr<SVG> defaultSVG;
std::shared_ptr<SVG> activeSVG;
SVGWidget *sw;
SVGButton();
/** If `activeSVG` is NULL, `defaultSVG` is used as the active state instead. */
void setSVGs(std::shared_ptr<SVG> defaultSVG, std::shared_ptr<SVG> activeSVG);
void onDragStart(event::DragStart &e) override;
void onDragEnd(event::DragEnd &e) override;
};


} // namespace rack

+ 24
- 0
include/app/SVGKnob.hpp View File

@@ -0,0 +1,24 @@
#pragma once
#include "common.hpp"
#include "CircularShadow.hpp"


namespace rack {


/** A knob which rotates an SVG and caches it in a framebuffer */
struct SVGKnob : Knob, FramebufferWidget {
TransformWidget *tw;
SVGWidget *sw;
CircularShadow *shadow;
/** Angles in radians */
float minAngle, maxAngle;

SVGKnob();
void setSVG(std::shared_ptr<SVG> svg);
void step() override;
void onChange(event::Change &e) override;
};


} // namespace rack

+ 1
- 3
include/app/SVGPanel.hpp View File

@@ -1,7 +1,5 @@
#pragma once
#include "app.hpp"
#include "widgets/FramebufferWidget.hpp"
#include "widgets/SVGWidget.hpp"
#include "common.hpp"


namespace rack {


+ 19
- 0
include/app/SVGPort.hpp View File

@@ -0,0 +1,19 @@
#pragma once
#include "common.hpp"
#include "Port.hpp"


namespace rack {


struct SVGPort : Port, FramebufferWidget {
SVGWidget *background;
CircularShadow *shadow;

SVGPort();
void setSVG(std::shared_ptr<SVG> svg);
void draw(NVGcontext *vg) override;
};


} // namespace rack

+ 17
- 0
include/app/SVGScrew.hpp View File

@@ -0,0 +1,17 @@
#pragma once
#include "common.hpp"
#include "Port.hpp"


namespace rack {


/** If you don't add these to your ModuleWidget, they will fall out of the rack... */
struct SVGScrew : FramebufferWidget {
SVGWidget *sw;

SVGScrew();
};


} // namespace rack

+ 24
- 0
include/app/SVGSlider.hpp View File

@@ -0,0 +1,24 @@
#pragma once
#include "common.hpp"


namespace rack {


/** Behaves like a knob but linearly moves an SVGWidget between two points.
Can be used for horizontal or vertical linear faders.
*/
struct SVGSlider : Knob, FramebufferWidget {
SVGWidget *background;
SVGWidget *handle;
/** Intermediate positions will be interpolated between these positions */
math::Vec minHandlePos, maxHandlePos;

SVGSlider();
void setSVGs(std::shared_ptr<SVG> backgroundSVG, std::shared_ptr<SVG> handleSVG);
void step() override;
void onChange(event::Change &e) override;
};


} // namespace rack

+ 20
- 0
include/app/SVGSwitch.hpp View File

@@ -0,0 +1,20 @@
#pragma once
#include "common.hpp"


namespace rack {


/** A ParamWidget with multiple frames corresponding to its value */
struct SVGSwitch : virtual ParamWidget, FramebufferWidget {
std::vector<std::shared_ptr<SVG>> frames;
SVGWidget *sw;

SVGSwitch();
/** Adds an SVG file to represent the next switch position */
void addFrame(std::shared_ptr<SVG> svg);
void onChange(event::Change &e) override;
};


} // namespace rack

+ 14
- 0
include/app/ToggleSwitch.hpp View File

@@ -0,0 +1,14 @@
#pragma once
#include "common.hpp"


namespace rack {


/** A switch that cycles through each mechanical position */
struct ToggleSwitch : virtual ParamWidget {
void onDragStart(event::DragStart &e) override;
};


} // namespace rack

+ 19
- 0
include/app/Toolbar.hpp View File

@@ -0,0 +1,19 @@
#pragma once
#include "common.hpp"


namespace rack {


struct Toolbar : OpaqueWidget {
Slider *wireOpacitySlider;
Slider *wireTensionSlider;
Slider *zoomSlider;
RadioButton *cpuUsageButton;

Toolbar();
void draw(NVGcontext *vg) override;
};


} // namespace rack

+ 24
- 0
include/app/WireContainer.hpp View File

@@ -0,0 +1,24 @@
#pragma once
#include "common.hpp"
#include "WireWidget.hpp"
#include "engine.hpp"


namespace rack {


struct WireContainer : TransparentWidget {
WireWidget *activeWire = NULL;
/** Takes ownership of `w` and adds it as a child if it isn't already */
void setActiveWire(WireWidget *w);
/** "Drops" the wire onto the port, making an engine connection if successful */
void commitActiveWire();
void removeTopWire(Port *port);
void removeAllWires(Port *port);
/** Returns the most recently added wire connected to the given Port, i.e. the top of the stack */
WireWidget *getTopWire(Port *port);
void draw(NVGcontext *vg) override;
};


} // namespace rack

+ 32
- 0
include/app/WireWidget.hpp View File

@@ -0,0 +1,32 @@
#pragma once
#include "common.hpp"


namespace rack {


struct Port;


struct WireWidget : OpaqueWidget {
Port *outputPort = NULL;
Port *inputPort = NULL;
Port *hoveredOutputPort = NULL;
Port *hoveredInputPort = NULL;
Wire *wire = NULL;
NVGcolor color;

WireWidget();
~WireWidget();
/** Synchronizes the plugged state of the widget to the owned wire */
void updateWire();
math::Vec getOutputPos();
math::Vec getInputPos();
json_t *toJson();
void fromJson(json_t *rootJ);
void draw(NVGcontext *vg) override;
void drawPlugs(NVGcontext *vg);
};


} // namespace rack

+ 47
- 0
include/app/common.hpp View File

@@ -0,0 +1,47 @@
#pragma once
#include "ui.hpp"
#include <jansson.h>


namespace rack {


static const float SVG_DPI = 75.0;
static const float MM_PER_IN = 25.4;


/** Converts inch measurements to pixels */
inline float in2px(float in) {
return in * SVG_DPI;
}

inline math::Vec in2px(math::Vec in) {
return in.mult(SVG_DPI);
}

/** Converts millimeter measurements to pixels */
inline float mm2px(float mm) {
return mm * (SVG_DPI / MM_PER_IN);
}

inline math::Vec mm2px(math::Vec mm) {
return mm.mult(SVG_DPI / MM_PER_IN);
}


// A 1HPx3U module should be 15x380 pixels. Thus the width of a module should be a factor of 15.
static const float RACK_GRID_WIDTH = 15;
static const float RACK_GRID_HEIGHT = 380;
static const math::Vec RACK_GRID_SIZE = math::Vec(RACK_GRID_WIDTH, RACK_GRID_HEIGHT);
static const std::string PRESET_FILTERS = "VCV Rack module preset (.vcvm):vcvm";
static const std::string PATCH_FILTERS = "VCV Rack patch (.vcv):vcv";



/** Deprecated. Will be removed in v1 */
json_t *colorToJson(NVGcolor color);
/** Deprecated. Will be removed in v1 */
NVGcolor jsonToColor(json_t *colorJ);


} // namespace rack

+ 16
- 5
include/event.hpp View File

@@ -12,8 +12,10 @@ struct Widget;
namespace event {


/** Base event class */
struct Event {
/** Set this to the Widget that consumes (responds to) the event.
/** The Widget that consumes the event.
Set to `this` in your event handler method if consumed.
This stops propagation of the event if applicable.
*/
Widget *target = NULL;
@@ -46,7 +48,7 @@ struct Text {

/** Occurs every frame when the mouse is hovering over a Widget.
Recurses until consumed.
If target is set, other events may occur on that Widget.
If `target` is set, other events may occur on that Widget.
*/
struct Hover : Event, Position {
/** Change in mouse position since the last frame. Can be zero. */
@@ -56,7 +58,7 @@ struct Hover : Event, Position {

/** Occurs each mouse button press or release.
Recurses until consumed.
If target is set, other events may occur on that Widget.
If `target` is set, other events may occur on that Widget.
*/
struct Button : Event, Position {
/** GLFW_MOUSE_BUTTON_LEFT, GLFW_MOUSE_BUTTON_RIGHT, GLFW_MOUSE_BUTTON_MIDDLE, etc. */
@@ -116,6 +118,7 @@ struct Deselect : Event {


/** Occurs when a key is pressed while a Widget is selected.
If consumed, a HoverKey event will not be triggered.
*/
struct SelectKey : Event, Key {
};
@@ -140,14 +143,22 @@ struct DragEnd : Event {
};


/** Occurs when a dragged Widget is moved.
Called once per frame, even when mouseDelta is zero.
/** Occurs every frame on the dragged Widget.
`mouseDelta` may be zero.
*/
struct DragMove : Event {
math::Vec mouseDelta;
};


/** Occurs every frame when the mouse is hovering over a Widget while dragging.
Must consume to allow DragEnter, DragLeave, and DragDrop to occur.
*/
struct DragHover : Event, Position {
/** Change in mouse position since the last frame. Can be zero. */
math::Vec mouseDelta;
};

/** Occurs when the mouse enters a Widget while dragging.
*/
struct DragEnter : Event {


+ 1
- 0
include/ui.hpp View File

@@ -1,4 +1,5 @@
#pragma once
#include "ui/common.hpp"
#include "ui/SequentialLayout.hpp"
#include "ui/Label.hpp"
#include "ui/List.hpp"


+ 1
- 3
include/ui/Button.hpp View File

@@ -1,7 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "blendish.h"
#include "common.hpp"


namespace rack {


+ 1
- 2
include/ui/ChoiceButton.hpp View File

@@ -1,6 +1,5 @@
#pragma once

#include "ui/Button.hpp"
#include "Button.hpp"


namespace rack {


+ 1
- 2
include/ui/IconButton.hpp View File

@@ -1,6 +1,5 @@
#pragma once

#include "ui/Button.hpp"
#include "common.hpp"


namespace rack {


+ 1
- 3
include/ui/Label.hpp View File

@@ -1,7 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "blendish.h"
#include "common.hpp"


namespace rack {


+ 1
- 2
include/ui/List.hpp View File

@@ -1,6 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "common.hpp"


namespace rack {


+ 0
- 2
include/ui/Menu.hpp View File

@@ -1,7 +1,5 @@
#pragma once

#include "MenuEntry.hpp"
#include "blendish.h"


namespace rack {


+ 1
- 2
include/ui/MenuEntry.hpp View File

@@ -1,6 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "common.hpp"


namespace rack {


+ 2
- 4
include/ui/MenuItem.hpp View File

@@ -1,8 +1,6 @@
#pragma once

#include "widgets.hpp"
#include "blendish.h"
#include "ui/MenuOverlay.hpp"
#include "common.hpp"
#include "MenuOverlay.hpp"


namespace rack {


+ 1
- 3
include/ui/MenuLabel.hpp View File

@@ -1,7 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "blendish.h"
#include "common.hpp"


namespace rack {


+ 1
- 2
include/ui/MenuOverlay.hpp View File

@@ -1,6 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "common.hpp"


namespace rack {


+ 1
- 3
include/ui/MenuSeparator.hpp View File

@@ -1,7 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "blendish.h"
#include "common.hpp"


namespace rack {


+ 2
- 2
include/ui/PasswordField.hpp View File

@@ -1,6 +1,6 @@
#pragma once
#include "ui/TextField.hpp"
#include "common.hpp"
#include "TextField.hpp"


namespace rack {


+ 1
- 3
include/ui/ProgressBar.hpp View File

@@ -1,7 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "blendish.h"
#include "common.hpp"


namespace rack {


+ 1
- 3
include/ui/RadioButton.hpp View File

@@ -1,7 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "blendish.h"
#include "common.hpp"


namespace rack {


+ 1
- 3
include/ui/Scene.hpp View File

@@ -1,7 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "logger.hpp"
#include "common.hpp"


namespace rack {


+ 1
- 2
include/ui/ScrollWidget.hpp View File

@@ -1,6 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "common.hpp"
#include "WidgetState.hpp"




+ 1
- 2
include/ui/SequentialLayout.hpp View File

@@ -1,6 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "common.hpp"


namespace rack {


+ 1
- 3
include/ui/Slider.hpp View File

@@ -1,7 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "blendish.h"
#include "common.hpp"


namespace rack {


+ 1
- 3
include/ui/TextField.hpp View File

@@ -1,8 +1,6 @@
#pragma once

#include "widgets.hpp"
#include "common.hpp"
#include "WidgetState.hpp"
#include "blendish.h"


namespace rack {


+ 1
- 3
include/ui/Tooltip.hpp View File

@@ -1,7 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "blendish.h"
#include "common.hpp"


namespace rack {


+ 1
- 2
include/ui/TooltipOverlay.hpp View File

@@ -1,6 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "common.hpp"


namespace rack {


+ 1
- 2
include/ui/WindowOverlay.hpp View File

@@ -1,6 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "common.hpp"


namespace rack {


+ 1
- 3
include/ui/WindowWidget.hpp View File

@@ -1,7 +1,5 @@
#pragma once

#include "widgets.hpp"
#include "blendish.h"
#include "common.hpp"


namespace rack {


+ 6
- 0
include/ui/common.hpp View File

@@ -0,0 +1,6 @@
#pragma once
#include "widgets.hpp"
#include "blendish.h"

#define CHECKMARK_STRING "âś”"
#define CHECKMARK(_cond) ((_cond) ? CHECKMARK_STRING : "")

+ 0
- 5
include/widgets.hpp View File

@@ -1,5 +1,4 @@
#pragma once

#include "widgets/Widget.hpp"
#include "widgets/TransparentWidget.hpp"
#include "widgets/OpaqueWidget.hpp"
@@ -8,7 +7,3 @@
#include "widgets/SVGWidget.hpp"
#include "widgets/FramebufferWidget.hpp"
#include "widgets/QuantityWidget.hpp"


#define CHECKMARK_STRING "âś”"
#define CHECKMARK(_cond) ((_cond) ? CHECKMARK_STRING : "")

+ 10
- 10
include/widgets/OpaqueWidget.hpp View File

@@ -15,31 +15,31 @@ struct OpaqueWidget : virtual Widget {
if (!e.target)
e.target = this;
}

void onButton(event::Button &e) override {
Widget::onButton(e);
if (!e.target)
e.target = this;
}

void onHoverKey(event::HoverKey &e) override {
Widget::onHoverKey(e);
if (!e.target)
e.target = this;
}

void onHoverText(event::HoverText &e) override {
Widget::onHoverText(e);
if (!e.target)
e.target = this;
}

// void onHoverScroll(event::HoverScroll &e) override {
// Widget::onHoverScroll(e);
// if (!e.target)
// e.target = this;
// }

void onHoverScroll(event::HoverScroll &e) override {
Widget::onHoverScroll(e);
if (!e.target)
e.target = this;
}
void onDragHover(event::DragHover &e) override {
Widget::onDragHover(e);
if (!e.target)
e.target = this;
}
void onPathDrop(event::PathDrop &e) override {
Widget::onPathDrop(e);
if (!e.target)


+ 1
- 0
include/widgets/Widget.hpp View File

@@ -121,6 +121,7 @@ struct Widget {
virtual void onDragStart(event::DragStart &e) {}
virtual void onDragEnd(event::DragEnd &e) {}
virtual void onDragMove(event::DragMove &e) {}
virtual void onDragHover(event::DragHover &e) {recursePositionEvent(&Widget::onDragHover, e);}
virtual void onDragEnter(event::DragEnter &e) {}
virtual void onDragLeave(event::DragLeave &e) {}
virtual void onDragDrop(event::DragDrop &e) {}


+ 53
- 10
src/WidgetState.cpp View File

@@ -1,11 +1,14 @@
#include "WidgetState.hpp"
#include "event.hpp"
#include "widgets.hpp"
#include "logger.hpp"


namespace rack {


void WidgetState::handleButton(math::Vec pos, int button, int action, int mods) {
// Button event
// event::Button
event::Button eButton;
eButton.pos = pos;
eButton.button = button;
@@ -15,28 +18,37 @@ void WidgetState::handleButton(math::Vec pos, int button, int action, int mods)
Widget *clickedWidget = eButton.target;

if (button == GLFW_MOUSE_BUTTON_LEFT) {
// Drag events
if (action == GLFW_PRESS && !draggedWidget && clickedWidget) {
// event::DragStart
event::DragStart eDragStart;
clickedWidget->onDragStart(eDragStart);
draggedWidget = clickedWidget;
}

if (action == GLFW_RELEASE && draggedWidget) {
if (dragHoveredWidget) {
// event::DragLeave
event::DragLeave eDragLeave;
dragHoveredWidget->onDragLeave(eDragLeave);
}

if (clickedWidget) {
// event::DragDrop
event::DragDrop eDragDrop;
eDragDrop.origin = draggedWidget;
clickedWidget->onDragDrop(eDragDrop);
}

// event::DragEnd
event::DragEnd eDragEnd;
draggedWidget->onDragEnd(eDragEnd);
draggedWidget = NULL;
dragHoveredWidget = NULL;
}

// Select events
if (action == GLFW_PRESS && clickedWidget != selectedWidget) {
if (selectedWidget) {
// event::Deselect
event::Deselect eDeselect;
selectedWidget->onDeselect(eDeselect);
}
@@ -44,6 +56,7 @@ void WidgetState::handleButton(math::Vec pos, int button, int action, int mods)
selectedWidget = clickedWidget;

if (selectedWidget) {
// event::Select
event::Select eSelect;
selectedWidget->onSelect(eSelect);
}
@@ -62,22 +75,47 @@ void WidgetState::handleButton(math::Vec pos, int button, int action, int mods)


void WidgetState::handleHover(math::Vec pos, math::Vec mouseDelta) {
// Drag events
if (draggedWidget) {
// event::DragMove
event::DragMove eDragMove;
eDragMove.mouseDelta = mouseDelta;
draggedWidget->onDragMove(eDragMove);

// event::DragHover
event::DragHover eDragHover;
eDragHover.pos = pos;
eDragHover.mouseDelta = mouseDelta;
rootWidget->onDragHover(eDragHover);
Widget *newDragHoveredWidget = eDragHover.target;

if (newDragHoveredWidget != dragHoveredWidget) {
if (dragHoveredWidget) {
// event::DragLeave
event::DragLeave eDragLeave;
dragHoveredWidget->onDragLeave(eDragLeave);
}

dragHoveredWidget = newDragHoveredWidget;

if (dragHoveredWidget) {
// event::DragEnter
event::DragEnter eDragEnter;
dragHoveredWidget->onDragEnter(eDragEnter);
}
}

return;
}

// if (scrollWidget) {
// event::HoverScroll
// event::HoverScroll eHoverScroll;
// eHoverScroll.pos = pos;
// eHoverScroll.scrollDelta = scrollDelta;
// rootWidget->onHoverScroll(eHoverScroll);
// }

// Hover event
// event::Hover
event::Hover eHover;
eHover.pos = pos;
eHover.mouseDelta = mouseDelta;
@@ -86,6 +124,7 @@ void WidgetState::handleHover(math::Vec pos, math::Vec mouseDelta) {

if (newHoveredWidget != hoveredWidget) {
if (hoveredWidget) {
// event::Leave
event::Leave eLeave;
hoveredWidget->onLeave(eLeave);
}
@@ -93,6 +132,7 @@ void WidgetState::handleHover(math::Vec pos, math::Vec mouseDelta) {
hoveredWidget = newHoveredWidget;

if (hoveredWidget) {
// event::Enter
event::Enter eEnter;
hoveredWidget->onEnter(eEnter);
}
@@ -101,7 +141,7 @@ void WidgetState::handleHover(math::Vec pos, math::Vec mouseDelta) {

void WidgetState::handleLeave() {
if (hoveredWidget) {
// Leave event
// event::Leave
event::Leave eLeave;
hoveredWidget->onLeave(eLeave);
}
@@ -109,7 +149,7 @@ void WidgetState::handleLeave() {
}

void WidgetState::handleScroll(math::Vec pos, math::Vec scrollDelta) {
// HoverScroll event
// event::HoverScroll
event::HoverScroll eHoverScroll;
eHoverScroll.pos = pos;
eHoverScroll.scrollDelta = scrollDelta;
@@ -117,7 +157,7 @@ void WidgetState::handleScroll(math::Vec pos, math::Vec scrollDelta) {
}

void WidgetState::handleDrop(math::Vec pos, std::vector<std::string> paths) {
// PathDrop event
// event::PathDrop
event::PathDrop ePathDrop;
ePathDrop.pos = pos;
ePathDrop.paths = paths;
@@ -126,7 +166,7 @@ void WidgetState::handleDrop(math::Vec pos, std::vector<std::string> paths) {

void WidgetState::handleText(math::Vec pos, int codepoint) {
if (selectedWidget) {
// SelectText event
// event::SelectText
event::SelectText eSelectText;
eSelectText.codepoint = codepoint;
selectedWidget->onSelectText(eSelectText);
@@ -134,7 +174,7 @@ void WidgetState::handleText(math::Vec pos, int codepoint) {
return;
}

// HoverText event
// event::HoverText
event::HoverText eHoverText;
eHoverText.pos = pos;
eHoverText.codepoint = codepoint;
@@ -143,6 +183,7 @@ void WidgetState::handleText(math::Vec pos, int codepoint) {

void WidgetState::handleKey(math::Vec pos, int key, int scancode, int action, int mods) {
if (selectedWidget) {
// event::SelectKey
event::SelectKey eSelectKey;
eSelectKey.key = key;
eSelectKey.scancode = scancode;
@@ -153,6 +194,7 @@ void WidgetState::handleKey(math::Vec pos, int key, int scancode, int action, in
return;
}

// event::HoverKey
event::HoverKey eHoverKey;
eHoverKey.pos = pos;
eHoverKey.key = key;
@@ -171,6 +213,7 @@ void WidgetState::finalizeWidget(Widget *w) {
}

void WidgetState::handleZoom() {
// event::Zoom
event::Zoom eZoom;
rootWidget->onZoom(eZoom);
}


Loading…
Cancel
Save