@@ -45,7 +45,7 @@ struct ModuleWidget : widget::OpaqueWidget { | |||
Transfers ownership | |||
*/ | |||
void setModule(engine::Module *module); | |||
void setPanel(std::shared_ptr<SVG> svg); | |||
void setPanel(std::shared_ptr<Svg> svg); | |||
/** Convenience functions for adding special widgets (calls addChild()) */ | |||
void addParam(ParamWidget *param); | |||
@@ -1,35 +0,0 @@ | |||
#pragma once | |||
#include "app/common.hpp" | |||
#include "app/SliderKnob.hpp" | |||
#include "widget/FramebufferWidget.hpp" | |||
#include "widget/SVGWidget.hpp" | |||
namespace rack { | |||
namespace app { | |||
/** Behaves like a knob but linearly moves an widget::SVGWidget between two points. | |||
Can be used for horizontal or vertical linear faders. | |||
*/ | |||
struct SVGSlider : app::SliderKnob { | |||
widget::FramebufferWidget *fb; | |||
widget::SVGWidget *background; | |||
widget::SVGWidget *handle; | |||
/** Intermediate positions will be interpolated between these positions */ | |||
math::Vec minHandlePos, maxHandlePos; | |||
SVGSlider(); | |||
void setBackgroundSVG(std::shared_ptr<SVG> backgroundSVG); | |||
void setHandleSVG(std::shared_ptr<SVG> handleSVG); | |||
void onChange(const event::Change &e) override; | |||
DEPRECATED void setSVGs(std::shared_ptr<SVG> backgroundSVG, std::shared_ptr<SVG> handleSVG) { | |||
setBackgroundSVG(backgroundSVG); | |||
setHandleSVG(handleSVG); | |||
} | |||
}; | |||
} // namespace app | |||
} // namespace rack |
@@ -2,25 +2,28 @@ | |||
#include "app/common.hpp" | |||
#include "widget/OpaqueWidget.hpp" | |||
#include "widget/FramebufferWidget.hpp" | |||
#include "widget/SVGWidget.hpp" | |||
#include "widget/SvgWidget.hpp" | |||
namespace rack { | |||
namespace app { | |||
struct SVGButton : widget::OpaqueWidget { | |||
struct SvgButton : widget::OpaqueWidget { | |||
widget::FramebufferWidget *fb; | |||
widget::SVGWidget *sw; | |||
std::vector<std::shared_ptr<SVG>> frames; | |||
widget::SvgWidget *sw; | |||
std::vector<std::shared_ptr<Svg>> frames; | |||
SVGButton(); | |||
void addFrame(std::shared_ptr<SVG> svg); | |||
SvgButton(); | |||
void addFrame(std::shared_ptr<Svg> svg); | |||
void onDragStart(const event::DragStart &e) override; | |||
void onDragEnd(const event::DragEnd &e) override; | |||
void onDragDrop(const event::DragDrop &e) override; | |||
}; | |||
DEPRECATED typedef SvgButton SVGButton; | |||
} // namespace app | |||
} // namespace rack |
@@ -3,7 +3,7 @@ | |||
#include "app/Knob.hpp" | |||
#include "widget/FramebufferWidget.hpp" | |||
#include "widget/TransformWidget.hpp" | |||
#include "widget/SVGWidget.hpp" | |||
#include "widget/SvgWidget.hpp" | |||
#include "app/CircularShadow.hpp" | |||
@@ -12,19 +12,23 @@ namespace app { | |||
/** A knob which rotates an SVG and caches it in a framebuffer */ | |||
struct SVGKnob : Knob { | |||
struct SvgKnob : Knob { | |||
widget::FramebufferWidget *fb; | |||
widget::TransformWidget *tw; | |||
widget::SVGWidget *sw; | |||
widget::SvgWidget *sw; | |||
CircularShadow *shadow; | |||
/** Angles in radians */ | |||
float minAngle, maxAngle; | |||
SVGKnob(); | |||
void setSVG(std::shared_ptr<SVG> svg); | |||
SvgKnob(); | |||
void setSvg(std::shared_ptr<Svg> svg); | |||
DEPRECATED void setSVG(std::shared_ptr<Svg> svg) {setSvg(svg);} | |||
void onChange(const event::Change &e) override; | |||
}; | |||
DEPRECATED typedef SvgKnob SVGKnob; | |||
} // namespace app | |||
} // namespace rack |
@@ -2,7 +2,7 @@ | |||
#include "app/common.hpp" | |||
#include "widget/TransparentWidget.hpp" | |||
#include "widget/FramebufferWidget.hpp" | |||
#include "widget/SVGWidget.hpp" | |||
#include "widget/SvgWidget.hpp" | |||
#include "app.hpp" | |||
@@ -15,12 +15,14 @@ struct PanelBorder : widget::TransparentWidget { | |||
}; | |||
struct SVGPanel : widget::FramebufferWidget { | |||
struct SvgPanel : widget::FramebufferWidget { | |||
void step() override; | |||
void setBackground(std::shared_ptr<SVG> svg); | |||
void setBackground(std::shared_ptr<Svg> svg); | |||
}; | |||
DEPRECATED typedef SvgPanel SVGPanel; | |||
} // namespace app | |||
} // namespace rack |
@@ -2,7 +2,7 @@ | |||
#include "app/common.hpp" | |||
#include "app/PortWidget.hpp" | |||
#include "widget/FramebufferWidget.hpp" | |||
#include "widget/SVGWidget.hpp" | |||
#include "widget/SvgWidget.hpp" | |||
#include "app/CircularShadow.hpp" | |||
@@ -10,15 +10,19 @@ namespace rack { | |||
namespace app { | |||
struct SVGPort : PortWidget { | |||
struct SvgPort : PortWidget { | |||
widget::FramebufferWidget *fb; | |||
widget::SVGWidget *sw; | |||
widget::SvgWidget *sw; | |||
CircularShadow *shadow; | |||
SVGPort(); | |||
void setSVG(std::shared_ptr<SVG> svg); | |||
SvgPort(); | |||
void setSvg(std::shared_ptr<Svg> svg); | |||
DEPRECATED void setSVG(std::shared_ptr<Svg> svg) {setSvg(svg);} | |||
}; | |||
DEPRECATED typedef SvgPort SVGPort; | |||
} // namespace app | |||
} // namespace rack |
@@ -1,7 +1,7 @@ | |||
#pragma once | |||
#include "common.hpp" | |||
#include "widget/FramebufferWidget.hpp" | |||
#include "widget/SVGWidget.hpp" | |||
#include "widget/SvgWidget.hpp" | |||
namespace rack { | |||
@@ -9,12 +9,15 @@ namespace app { | |||
/** If you don't add these to your ModuleWidget, they will fall out of the rack... */ | |||
struct SVGScrew : widget::FramebufferWidget { | |||
widget::SVGWidget *sw; | |||
struct SvgScrew : widget::FramebufferWidget { | |||
widget::SvgWidget *sw; | |||
SVGScrew(); | |||
SvgScrew(); | |||
}; | |||
DEPRECATED typedef SvgScrew SVGScrew; | |||
} // namespace app | |||
} // namespace rack |
@@ -0,0 +1,40 @@ | |||
#pragma once | |||
#include "app/common.hpp" | |||
#include "app/SliderKnob.hpp" | |||
#include "widget/FramebufferWidget.hpp" | |||
#include "widget/SvgWidget.hpp" | |||
namespace rack { | |||
namespace app { | |||
/** Behaves like a knob but linearly moves an widget::SvgWidget between two points. | |||
Can be used for horizontal or vertical linear faders. | |||
*/ | |||
struct SvgSlider : app::SliderKnob { | |||
widget::FramebufferWidget *fb; | |||
widget::SvgWidget *background; | |||
widget::SvgWidget *handle; | |||
/** Intermediate positions will be interpolated between these positions */ | |||
math::Vec minHandlePos, maxHandlePos; | |||
SvgSlider(); | |||
void setBackgroundSvg(std::shared_ptr<Svg> svg); | |||
void setHandleSvg(std::shared_ptr<Svg> svg); | |||
void onChange(const event::Change &e) override; | |||
DEPRECATED void setBackgroundSVG(std::shared_ptr<Svg> svg) {setBackgroundSvg(svg);} | |||
DEPRECATED void setHandleSVG(std::shared_ptr<Svg> svg) {setBackgroundSvg(svg);} | |||
DEPRECATED void setSVGs(std::shared_ptr<Svg> backgroundSvg, std::shared_ptr<Svg> handleSvg) { | |||
setBackgroundSvg(backgroundSvg); | |||
setHandleSvg(handleSvg); | |||
} | |||
}; | |||
DEPRECATED typedef SvgSlider SVGSlider; | |||
} // namespace app | |||
} // namespace rack |
@@ -1,7 +1,7 @@ | |||
#pragma once | |||
#include "app/common.hpp" | |||
#include "widget/FramebufferWidget.hpp" | |||
#include "widget/SVGWidget.hpp" | |||
#include "widget/SvgWidget.hpp" | |||
#include "app/Switch.hpp" | |||
@@ -10,17 +10,20 @@ namespace app { | |||
/** A ParamWidget with multiple frames corresponding to its value */ | |||
struct SVGSwitch : Switch { | |||
struct SvgSwitch : Switch { | |||
widget::FramebufferWidget *fb; | |||
widget::SVGWidget *sw; | |||
std::vector<std::shared_ptr<SVG>> frames; | |||
widget::SvgWidget *sw; | |||
std::vector<std::shared_ptr<Svg>> frames; | |||
SVGSwitch(); | |||
SvgSwitch(); | |||
/** Adds an SVG file to represent the next switch position */ | |||
void addFrame(std::shared_ptr<SVG> svg); | |||
void addFrame(std::shared_ptr<Svg> svg); | |||
void onChange(const event::Change &e) override; | |||
}; | |||
DEPRECATED typedef SvgSwitch SVGSwitch; | |||
} // namespace app | |||
} // namespace rack |
@@ -27,7 +27,7 @@ static const NVGcolor DARK_GRAY = nvgRGB(0x17, 0x17, 0x17); | |||
// Knobs | |||
//////////////////// | |||
struct RoundKnob : app::SVGKnob { | |||
struct RoundKnob : app::SvgKnob { | |||
RoundKnob() { | |||
minAngle = -0.83*M_PI; | |||
maxAngle = 0.83*M_PI; | |||
@@ -36,25 +36,25 @@ struct RoundKnob : app::SVGKnob { | |||
struct RoundBlackKnob : RoundKnob { | |||
RoundBlackKnob() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/RoundBlackKnob.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/RoundBlackKnob.svg"))); | |||
} | |||
}; | |||
struct RoundSmallBlackKnob : RoundKnob { | |||
RoundSmallBlackKnob() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/RoundSmallBlackKnob.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/RoundSmallBlackKnob.svg"))); | |||
} | |||
}; | |||
struct RoundLargeBlackKnob : RoundKnob { | |||
RoundLargeBlackKnob() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/RoundLargeBlackKnob.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/RoundLargeBlackKnob.svg"))); | |||
} | |||
}; | |||
struct RoundHugeBlackKnob : RoundKnob { | |||
RoundHugeBlackKnob() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/RoundHugeBlackKnob.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/RoundHugeBlackKnob.svg"))); | |||
} | |||
}; | |||
@@ -65,7 +65,7 @@ struct RoundBlackSnapKnob : RoundBlackKnob { | |||
}; | |||
struct Davies1900hKnob : app::SVGKnob { | |||
struct Davies1900hKnob : app::SvgKnob { | |||
Davies1900hKnob() { | |||
minAngle = -0.83*M_PI; | |||
maxAngle = 0.83*M_PI; | |||
@@ -74,42 +74,42 @@ struct Davies1900hKnob : app::SVGKnob { | |||
struct Davies1900hWhiteKnob : Davies1900hKnob { | |||
Davies1900hWhiteKnob() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Davies1900hWhite.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Davies1900hWhite.svg"))); | |||
} | |||
}; | |||
struct Davies1900hBlackKnob : Davies1900hKnob { | |||
Davies1900hBlackKnob() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Davies1900hBlack.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Davies1900hBlack.svg"))); | |||
} | |||
}; | |||
struct Davies1900hRedKnob : Davies1900hKnob { | |||
Davies1900hRedKnob() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Davies1900hRed.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Davies1900hRed.svg"))); | |||
} | |||
}; | |||
struct Davies1900hLargeWhiteKnob : Davies1900hKnob { | |||
Davies1900hLargeWhiteKnob() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Davies1900hLargeWhite.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Davies1900hLargeWhite.svg"))); | |||
} | |||
}; | |||
struct Davies1900hLargeBlackKnob : Davies1900hKnob { | |||
Davies1900hLargeBlackKnob() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Davies1900hLargeBlack.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Davies1900hLargeBlack.svg"))); | |||
} | |||
}; | |||
struct Davies1900hLargeRedKnob : Davies1900hKnob { | |||
Davies1900hLargeRedKnob() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Davies1900hLargeRed.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Davies1900hLargeRed.svg"))); | |||
} | |||
}; | |||
struct Rogan : app::SVGKnob { | |||
struct Rogan : app::SvgKnob { | |||
Rogan() { | |||
minAngle = -0.83*M_PI; | |||
maxAngle = 0.83*M_PI; | |||
@@ -118,191 +118,191 @@ struct Rogan : app::SVGKnob { | |||
struct Rogan6PSWhite : Rogan { | |||
Rogan6PSWhite() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan6PSWhite.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan6PSWhite.svg"))); | |||
} | |||
}; | |||
struct Rogan5PSGray : Rogan { | |||
Rogan5PSGray() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan5PSGray.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan5PSGray.svg"))); | |||
} | |||
}; | |||
struct Rogan3PSBlue : Rogan { | |||
Rogan3PSBlue() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan3PSBlue.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan3PSBlue.svg"))); | |||
} | |||
}; | |||
struct Rogan3PSRed : Rogan { | |||
Rogan3PSRed() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan3PSRed.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan3PSRed.svg"))); | |||
} | |||
}; | |||
struct Rogan3PSGreen : Rogan { | |||
Rogan3PSGreen() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan3PSGreen.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan3PSGreen.svg"))); | |||
} | |||
}; | |||
struct Rogan3PSWhite : Rogan { | |||
Rogan3PSWhite() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan3PSWhite.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan3PSWhite.svg"))); | |||
} | |||
}; | |||
struct Rogan3PBlue : Rogan { | |||
Rogan3PBlue() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan3PBlue.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan3PBlue.svg"))); | |||
} | |||
}; | |||
struct Rogan3PRed : Rogan { | |||
Rogan3PRed() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan3PRed.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan3PRed.svg"))); | |||
} | |||
}; | |||
struct Rogan3PGreen : Rogan { | |||
Rogan3PGreen() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan3PGreen.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan3PGreen.svg"))); | |||
} | |||
}; | |||
struct Rogan3PWhite : Rogan { | |||
Rogan3PWhite() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan3PWhite.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan3PWhite.svg"))); | |||
} | |||
}; | |||
struct Rogan2SGray : Rogan { | |||
Rogan2SGray() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan2SGray.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan2SGray.svg"))); | |||
} | |||
}; | |||
struct Rogan2PSBlue : Rogan { | |||
Rogan2PSBlue() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan2PSBlue.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan2PSBlue.svg"))); | |||
} | |||
}; | |||
struct Rogan2PSRed : Rogan { | |||
Rogan2PSRed() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan2PSRed.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan2PSRed.svg"))); | |||
} | |||
}; | |||
struct Rogan2PSGreen : Rogan { | |||
Rogan2PSGreen() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan2PSGreen.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan2PSGreen.svg"))); | |||
} | |||
}; | |||
struct Rogan2PSWhite : Rogan { | |||
Rogan2PSWhite() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan2PSWhite.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan2PSWhite.svg"))); | |||
} | |||
}; | |||
struct Rogan2PBlue : Rogan { | |||
Rogan2PBlue() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan2PBlue.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan2PBlue.svg"))); | |||
} | |||
}; | |||
struct Rogan2PRed : Rogan { | |||
Rogan2PRed() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan2PRed.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan2PRed.svg"))); | |||
} | |||
}; | |||
struct Rogan2PGreen : Rogan { | |||
Rogan2PGreen() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan2PGreen.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan2PGreen.svg"))); | |||
} | |||
}; | |||
struct Rogan2PWhite : Rogan { | |||
Rogan2PWhite() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan2PWhite.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan2PWhite.svg"))); | |||
} | |||
}; | |||
struct Rogan1PSBlue : Rogan { | |||
Rogan1PSBlue() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan1PSBlue.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan1PSBlue.svg"))); | |||
} | |||
}; | |||
struct Rogan1PSRed : Rogan { | |||
Rogan1PSRed() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan1PSRed.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan1PSRed.svg"))); | |||
} | |||
}; | |||
struct Rogan1PSGreen : Rogan { | |||
Rogan1PSGreen() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan1PSGreen.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan1PSGreen.svg"))); | |||
} | |||
}; | |||
struct Rogan1PSWhite : Rogan { | |||
Rogan1PSWhite() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan1PSWhite.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan1PSWhite.svg"))); | |||
} | |||
}; | |||
struct Rogan1PBlue : Rogan { | |||
Rogan1PBlue() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan1PBlue.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan1PBlue.svg"))); | |||
} | |||
}; | |||
struct Rogan1PRed : Rogan { | |||
Rogan1PRed() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan1PRed.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan1PRed.svg"))); | |||
} | |||
}; | |||
struct Rogan1PGreen : Rogan { | |||
Rogan1PGreen() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan1PGreen.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan1PGreen.svg"))); | |||
} | |||
}; | |||
struct Rogan1PWhite : Rogan { | |||
Rogan1PWhite() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Rogan1PWhite.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Rogan1PWhite.svg"))); | |||
} | |||
}; | |||
struct SynthTechAlco : app::SVGKnob { | |||
struct SynthTechAlco : app::SvgKnob { | |||
SynthTechAlco() { | |||
minAngle = -0.82*M_PI; | |||
maxAngle = 0.82*M_PI; | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/SynthTechAlco.svg"))); | |||
SVGWidget *cap = new SVGWidget; | |||
cap->setSVG(SVG::load(asset::system("res/ComponentLibrary/SynthTechAlco_cap.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/SynthTechAlco.svg"))); | |||
SvgWidget *cap = new SvgWidget; | |||
cap->setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/SynthTechAlco_cap.svg"))); | |||
addChild(cap); | |||
} | |||
}; | |||
struct Trimpot : app::SVGKnob { | |||
struct Trimpot : app::SvgKnob { | |||
Trimpot() { | |||
minAngle = -0.75*M_PI; | |||
maxAngle = 0.75*M_PI; | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/Trimpot.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/Trimpot.svg"))); | |||
} | |||
}; | |||
struct BefacoBigKnob : app::SVGKnob { | |||
struct BefacoBigKnob : app::SvgKnob { | |||
BefacoBigKnob() { | |||
minAngle = -0.75*M_PI; | |||
maxAngle = 0.75*M_PI; | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/BefacoBigKnob.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoBigKnob.svg"))); | |||
} | |||
}; | |||
@@ -312,62 +312,62 @@ struct BefacoBigSnapKnob : BefacoBigKnob { | |||
} | |||
}; | |||
struct BefacoTinyKnob : app::SVGKnob { | |||
struct BefacoTinyKnob : app::SvgKnob { | |||
BefacoTinyKnob() { | |||
minAngle = -0.75*M_PI; | |||
maxAngle = 0.75*M_PI; | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/BefacoTinyKnob.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoTinyKnob.svg"))); | |||
} | |||
}; | |||
struct BefacoSlidePot : app::SVGSlider { | |||
struct BefacoSlidePot : app::SvgSlider { | |||
BefacoSlidePot() { | |||
math::Vec margin = math::Vec(3.5, 3.5); | |||
maxHandlePos = math::Vec(-1, -2).plus(margin); | |||
minHandlePos = math::Vec(-1, 87).plus(margin); | |||
setBackgroundSVG(SVG::load(asset::system("res/ComponentLibrary/BefacoSlidePot.svg"))); | |||
setHandleSVG(SVG::load(asset::system("res/ComponentLibrary/BefacoSlidePotHandle.svg"))); | |||
setBackgroundSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoSlidePot.svg"))); | |||
setHandleSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoSlidePotHandle.svg"))); | |||
background->box.pos = margin; | |||
box.size = background->box.size.plus(margin.mult(2)); | |||
} | |||
}; | |||
struct LEDSlider : app::SVGSlider { | |||
struct LEDSlider : app::SvgSlider { | |||
LEDSlider() { | |||
maxHandlePos = mm2px(math::Vec(0.738, 0.738).plus(math::Vec(2, 0))); | |||
minHandlePos = mm2px(math::Vec(0.738, 22.078).plus(math::Vec(2, 0))); | |||
setBackgroundSVG(SVG::load(asset::system("res/ComponentLibrary/LEDSlider.svg"))); | |||
setBackgroundSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/LEDSlider.svg"))); | |||
} | |||
}; | |||
/** API is unstable for LEDSlider. Will add a LightWidget later. */ | |||
struct LEDSliderGreen : LEDSlider { | |||
LEDSliderGreen() { | |||
setHandleSVG(SVG::load(asset::system("res/ComponentLibrary/LEDSliderGreenHandle.svg"))); | |||
setHandleSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/LEDSliderGreenHandle.svg"))); | |||
} | |||
}; | |||
struct LEDSliderRed : LEDSlider { | |||
LEDSliderRed() { | |||
setHandleSVG(SVG::load(asset::system("res/ComponentLibrary/LEDSliderRedHandle.svg"))); | |||
setHandleSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/LEDSliderRedHandle.svg"))); | |||
} | |||
}; | |||
struct LEDSliderYellow : LEDSlider { | |||
LEDSliderYellow() { | |||
setHandleSVG(SVG::load(asset::system("res/ComponentLibrary/LEDSliderYellowHandle.svg"))); | |||
setHandleSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/LEDSliderYellowHandle.svg"))); | |||
} | |||
}; | |||
struct LEDSliderBlue : LEDSlider { | |||
LEDSliderBlue() { | |||
setHandleSVG(SVG::load(asset::system("res/ComponentLibrary/LEDSliderBlueHandle.svg"))); | |||
setHandleSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/LEDSliderBlueHandle.svg"))); | |||
} | |||
}; | |||
struct LEDSliderWhite : LEDSlider { | |||
LEDSliderWhite() { | |||
setHandleSVG(SVG::load(asset::system("res/ComponentLibrary/LEDSliderWhiteHandle.svg"))); | |||
setHandleSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/LEDSliderWhiteHandle.svg"))); | |||
} | |||
}; | |||
@@ -375,21 +375,21 @@ struct LEDSliderWhite : LEDSlider { | |||
// Ports | |||
//////////////////// | |||
struct PJ301MPort : app::SVGPort { | |||
struct PJ301MPort : app::SvgPort { | |||
PJ301MPort() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/PJ301M.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/PJ301M.svg"))); | |||
} | |||
}; | |||
struct PJ3410Port : app::SVGPort { | |||
struct PJ3410Port : app::SvgPort { | |||
PJ3410Port() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/PJ3410.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/PJ3410.svg"))); | |||
} | |||
}; | |||
struct CL1362Port : app::SVGPort { | |||
struct CL1362Port : app::SvgPort { | |||
CL1362Port() { | |||
setSVG(SVG::load(asset::system("res/ComponentLibrary/CL1362.svg"))); | |||
setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/CL1362.svg"))); | |||
} | |||
}; | |||
@@ -510,79 +510,79 @@ struct PB61303Light : BASE { | |||
// Switches | |||
//////////////////// | |||
struct NKK : app::SVGSwitch { | |||
struct NKK : app::SvgSwitch { | |||
NKK() { | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/NKK_0.svg"))); | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/NKK_1.svg"))); | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/NKK_2.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/NKK_0.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/NKK_1.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/NKK_2.svg"))); | |||
} | |||
}; | |||
struct CKSS : app::SVGSwitch { | |||
struct CKSS : app::SvgSwitch { | |||
CKSS() { | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/CKSS_0.svg"))); | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/CKSS_1.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/CKSS_0.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/CKSS_1.svg"))); | |||
} | |||
}; | |||
struct CKSSThree : app::SVGSwitch { | |||
struct CKSSThree : app::SvgSwitch { | |||
CKSSThree() { | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/CKSSThree_0.svg"))); | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/CKSSThree_1.svg"))); | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/CKSSThree_2.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/CKSSThree_0.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/CKSSThree_1.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/CKSSThree_2.svg"))); | |||
} | |||
}; | |||
struct CKD6 : app::SVGSwitch { | |||
struct CKD6 : app::SvgSwitch { | |||
CKD6() { | |||
momentary = true; | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/CKD6_0.svg"))); | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/CKD6_1.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/CKD6_0.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/CKD6_1.svg"))); | |||
} | |||
}; | |||
struct TL1105 : app::SVGSwitch { | |||
struct TL1105 : app::SvgSwitch { | |||
TL1105() { | |||
momentary = true; | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/TL1105_0.svg"))); | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/TL1105_1.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/TL1105_0.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/TL1105_1.svg"))); | |||
} | |||
}; | |||
struct LEDButton : app::SVGSwitch { | |||
struct LEDButton : app::SvgSwitch { | |||
LEDButton() { | |||
momentary = true; | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/LEDButton.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/LEDButton.svg"))); | |||
} | |||
}; | |||
struct BefacoSwitch : app::SVGSwitch { | |||
struct BefacoSwitch : app::SvgSwitch { | |||
BefacoSwitch() { | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/BefacoSwitch_0.svg"))); | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/BefacoSwitch_1.svg"))); | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/BefacoSwitch_2.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoSwitch_0.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoSwitch_1.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoSwitch_2.svg"))); | |||
} | |||
}; | |||
struct BefacoPush : app::SVGSwitch { | |||
struct BefacoPush : app::SvgSwitch { | |||
BefacoPush() { | |||
momentary = true; | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/BefacoPush_0.svg"))); | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/BefacoPush_1.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoPush_0.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/BefacoPush_1.svg"))); | |||
} | |||
}; | |||
struct LEDBezel : app::SVGSwitch { | |||
struct LEDBezel : app::SvgSwitch { | |||
LEDBezel() { | |||
momentary = true; | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/LEDBezel.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/LEDBezel.svg"))); | |||
} | |||
}; | |||
struct PB61303 : app::SVGSwitch { | |||
struct PB61303 : app::SvgSwitch { | |||
PB61303() { | |||
momentary = true; | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/PB61303.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/PB61303.svg"))); | |||
} | |||
}; | |||
@@ -590,16 +590,16 @@ struct PB61303 : app::SVGSwitch { | |||
// Misc | |||
//////////////////// | |||
struct ScrewSilver : app::SVGScrew { | |||
struct ScrewSilver : app::SvgScrew { | |||
ScrewSilver() { | |||
sw->setSVG(SVG::load(asset::system("res/ComponentLibrary/ScrewSilver.svg"))); | |||
sw->setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/ScrewSilver.svg"))); | |||
box.size = sw->box.size; | |||
} | |||
}; | |||
struct ScrewBlack : app::SVGScrew { | |||
struct ScrewBlack : app::SvgScrew { | |||
ScrewBlack() { | |||
sw->setSVG(SVG::load(asset::system("res/ComponentLibrary/ScrewBlack.svg"))); | |||
sw->setSvg(APP->window->loadSvg(asset::system("res/ComponentLibrary/ScrewBlack.svg"))); | |||
box.size = sw->box.size; | |||
} | |||
}; | |||
@@ -6,7 +6,7 @@ namespace rack { | |||
namespace dsp { | |||
/** Deprecated. */ | |||
/** Deprecated. Use VUMeter2. */ | |||
struct VUMeter { | |||
/** Decibel level difference between adjacent meter lights */ | |||
float dBInterval = 3.0; | |||
@@ -15,7 +15,7 @@ struct VUMeter { | |||
void setValue(float v) { | |||
dBScaled = std::log10(std::abs(v)) * 20.0 / dBInterval; | |||
} | |||
/** Returns the brightness of the light indexed by i | |||
/** Returns the brightness of the light indexed by i. | |||
Light 0 is a clip light (red) which is either on or off. | |||
All others are smooth lights which are fully bright at -dBInterval*i and higher, and fully off at -dBInterval*(i-1). | |||
*/ | |||
@@ -61,6 +61,7 @@ struct VUMeter2 { | |||
} | |||
/** Returns the LED brightness measuring tick marks between dbMin and dbMax. | |||
For example, `getBrightness(-6.f, 0.f)` will be at minimum brightness at -6dB and maximum brightness at 0dB. | |||
Set dbMin == dbMax == 0.f for a clip indicator. | |||
Expensive, so call this infrequently. | |||
*/ | |||
@@ -17,9 +17,9 @@ | |||
#include "widget/OpaqueWidget.hpp" | |||
#include "widget/TransformWidget.hpp" | |||
#include "widget/ZoomWidget.hpp" | |||
#include "widget/SVGWidget.hpp" | |||
#include "widget/SvgWidget.hpp" | |||
#include "widget/FramebufferWidget.hpp" | |||
#include "widget/GLWidget.hpp" | |||
#include "widget/OpenGlWidget.hpp" | |||
#include "ui/SequentialLayout.hpp" | |||
#include "ui/Label.hpp" | |||
@@ -56,13 +56,13 @@ | |||
#include "app/Scene.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/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/Toolbar.hpp" | |||
#include "app/CableWidget.hpp" | |||
@@ -1,6 +1,6 @@ | |||
#pragma once | |||
#include "widget/FramebufferWidget.hpp" | |||
#include "widget/SVGWidget.hpp" | |||
#include "widget/SvgWidget.hpp" | |||
#include "ui/common.hpp" | |||
#include "ui/Button.hpp" | |||
@@ -11,10 +11,11 @@ namespace ui { | |||
struct IconButton : Button { | |||
widget::FramebufferWidget *fw; | |||
widget::SVGWidget *sw; | |||
widget::SvgWidget *sw; | |||
IconButton(); | |||
void setSVG(std::shared_ptr<SVG> svg); | |||
void setSvg(std::shared_ptr<Svg> svg); | |||
DEPRECATED void setSVG(std::shared_ptr<Svg> svg) {setSvg(svg);} | |||
}; | |||
@@ -6,7 +6,7 @@ namespace rack { | |||
namespace widget { | |||
struct GLWidget : FramebufferWidget { | |||
struct OpenGlWidget : FramebufferWidget { | |||
/** Draws every frame by default | |||
Override this to restore the default behavior of FramebufferWidget. | |||
*/ |
@@ -1,39 +0,0 @@ | |||
#pragma once | |||
#include "widget/Widget.hpp" | |||
#include "svg.hpp" | |||
namespace rack { | |||
namespace widget { | |||
/** Draws an SVG */ | |||
struct SVGWidget : Widget { | |||
std::shared_ptr<SVG> svg; | |||
/** Sets the box size to the svg image size */ | |||
void wrap() { | |||
if (svg && svg->handle) { | |||
box.size = math::Vec(svg->handle->width, svg->handle->height); | |||
} | |||
else { | |||
box.size = math::Vec(); | |||
} | |||
} | |||
/** Sets and wraps the SVG */ | |||
void setSVG(std::shared_ptr<SVG> svg) { | |||
this->svg = svg; | |||
wrap(); | |||
} | |||
void draw(const DrawContext &ctx) override { | |||
if (svg && svg->handle) { | |||
svgDraw(ctx.vg, svg->handle); | |||
} | |||
} | |||
}; | |||
} // namespace widget | |||
} // namespace rack |
@@ -0,0 +1,29 @@ | |||
#pragma once | |||
#include "widget/Widget.hpp" | |||
#include "svg.hpp" | |||
namespace rack { | |||
namespace widget { | |||
/** Draws an SVG */ | |||
struct SvgWidget : Widget { | |||
std::shared_ptr<Svg> svg; | |||
/** Sets the box size to the svg image size */ | |||
void wrap(); | |||
/** Sets and wraps the SVG */ | |||
void setSvg(std::shared_ptr<Svg> svg); | |||
DEPRECATED void setSVG(std::shared_ptr<Svg> svg) {setSvg(svg);} | |||
void draw(const DrawContext &ctx) override; | |||
}; | |||
DEPRECATED typedef SvgWidget SVGWidget; | |||
} // namespace widget | |||
} // namespace rack |
@@ -40,26 +40,34 @@ namespace rack { | |||
// Constructing these directly will load from the disk each time. Use the load() functions to load from disk and cache them as long as the shared_ptr is held. | |||
struct Font { | |||
NVGcontext *vg; | |||
int handle; | |||
Font(const std::string &filename); | |||
Font(NVGcontext *vg, const std::string &filename); | |||
~Font(); | |||
static std::shared_ptr<Font> load(const std::string &filename); | |||
/** Use `APP->window->loadFont()` instead. */ | |||
DEPRECATED static std::shared_ptr<Font> load(const std::string &filename); | |||
}; | |||
struct Image { | |||
NVGcontext *vg; | |||
int handle; | |||
Image(const std::string &filename); | |||
Image(NVGcontext *vg, const std::string &filename); | |||
~Image(); | |||
static std::shared_ptr<Image> load(const std::string &filename); | |||
/** Use `APP->window->loadImage()` instead. */ | |||
DEPRECATED static std::shared_ptr<Image> load(const std::string &filename); | |||
}; | |||
struct SVG { | |||
struct Svg { | |||
NSVGimage *handle; | |||
SVG(const std::string &filename); | |||
~SVG(); | |||
static std::shared_ptr<SVG> load(const std::string &filename); | |||
Svg(const std::string &filename); | |||
~Svg(); | |||
/** Use `APP->window->loadSvg()` instead. */ | |||
DEPRECATED static std::shared_ptr<Svg> load(const std::string &filename); | |||
}; | |||
DEPRECATED typedef Svg SVG; | |||
struct Window { | |||
GLFWwindow *win = NULL; | |||
NVGcontext *vg = NULL; | |||
@@ -91,6 +99,10 @@ struct Window { | |||
int getMods(); | |||
void setFullScreen(bool fullScreen); | |||
bool isFullScreen(); | |||
std::shared_ptr<Font> loadFont(const std::string &filename); | |||
std::shared_ptr<Image> loadImage(const std::string &filename); | |||
std::shared_ptr<Svg> loadSvg(const std::string &filename); | |||
}; | |||
@@ -236,7 +236,7 @@ struct AudioInterface : Module { | |||
struct AudioInterfaceWidget : ModuleWidget { | |||
AudioInterfaceWidget(AudioInterface *module) { | |||
setModule(module); | |||
setPanel(SVG::load(asset::system("res/Core/AudioInterface.svg"))); | |||
setPanel(APP->window->loadSvg(asset::system("res/Core/AudioInterface.svg"))); | |||
addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); | |||
addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); | |||
@@ -112,7 +112,7 @@ struct CV_CC : Module { | |||
struct CV_CCWidget : ModuleWidget { | |||
CV_CCWidget(CV_CC *module) { | |||
setModule(module); | |||
setPanel(SVG::load(asset::system("res/Core/CV-CC.svg"))); | |||
setPanel(APP->window->loadSvg(asset::system("res/Core/CV-CC.svg"))); | |||
addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); | |||
addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); | |||
@@ -146,7 +146,7 @@ struct CV_Gate : Module { | |||
struct CV_GateWidget : ModuleWidget { | |||
CV_GateWidget(CV_Gate *module) { | |||
setModule(module); | |||
setPanel(SVG::load(asset::system("res/Core/CV-Gate.svg"))); | |||
setPanel(APP->window->loadSvg(asset::system("res/Core/CV-Gate.svg"))); | |||
addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); | |||
addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); | |||
@@ -316,7 +316,7 @@ struct CV_MIDI : Module { | |||
struct CV_MIDIWidget : ModuleWidget { | |||
CV_MIDIWidget(CV_MIDI *module) { | |||
setModule(module); | |||
setPanel(SVG::load(asset::system("res/Core/CV-MIDI.svg"))); | |||
setPanel(APP->window->loadSvg(asset::system("res/Core/CV-MIDI.svg"))); | |||
addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); | |||
addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); | |||
@@ -137,7 +137,7 @@ struct MIDI_CC : Module { | |||
struct MIDI_CCWidget : ModuleWidget { | |||
MIDI_CCWidget(MIDI_CC *module) { | |||
setModule(module); | |||
setPanel(SVG::load(asset::system("res/Core/MIDI-CC.svg"))); | |||
setPanel(APP->window->loadSvg(asset::system("res/Core/MIDI-CC.svg"))); | |||
addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); | |||
addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); | |||
@@ -260,7 +260,7 @@ struct MIDI_CV : Module { | |||
struct MIDI_CVWidget : ModuleWidget { | |||
MIDI_CVWidget(MIDI_CV *module) { | |||
setModule(module); | |||
setPanel(SVG::load(asset::system("res/Core/MIDI-CV.svg"))); | |||
setPanel(APP->window->loadSvg(asset::system("res/Core/MIDI-CV.svg"))); | |||
addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); | |||
addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); | |||
@@ -147,7 +147,7 @@ struct MIDI_Gate : Module { | |||
struct MIDI_GateWidget : ModuleWidget { | |||
MIDI_GateWidget(MIDI_Gate *module) { | |||
setModule(module); | |||
setPanel(SVG::load(asset::system("res/Core/MIDI-Gate.svg"))); | |||
setPanel(APP->window->loadSvg(asset::system("res/Core/MIDI-Gate.svg"))); | |||
addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); | |||
addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); | |||
@@ -46,13 +46,13 @@ struct MIDI_Map : Module { | |||
}; | |||
struct CKD6Button : SVGButton { | |||
struct CKD6Button : SvgButton { | |||
MIDI_Map *module; | |||
int id; | |||
CKD6Button() { | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/CKD6_0.svg"))); | |||
addFrame(SVG::load(asset::system("res/ComponentLibrary/CKD6_1.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/CKD6_0.svg"))); | |||
addFrame(APP->window->loadSvg(asset::system("res/ComponentLibrary/CKD6_1.svg"))); | |||
} | |||
void onAction(const event::Action &e) override { | |||
@@ -73,7 +73,7 @@ TWidget *createMapButtonCentered(math::Vec pos, MIDI_Map *module, int id) { | |||
struct MIDI_MapWidget : ModuleWidget { | |||
MIDI_MapWidget(MIDI_Map *module) { | |||
setModule(module); | |||
setPanel(SVG::load(asset::system("res/Core/MIDI-Map.svg"))); | |||
setPanel(APP->window->loadSvg(asset::system("res/Core/MIDI-Map.svg"))); | |||
addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); | |||
addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); | |||
@@ -9,7 +9,7 @@ struct NotesWidget : ModuleWidget { | |||
NotesWidget(Module *module) { | |||
setModule(module); | |||
setPanel(SVG::load(asset::system("res/Core/Notes.svg"))); | |||
setPanel(APP->window->loadSvg(asset::system("res/Core/Notes.svg"))); | |||
addChild(createWidget<ScrewSilver>(Vec(RACK_GRID_WIDTH, 0))); | |||
addChild(createWidget<ScrewSilver>(Vec(box.size.x - 2 * RACK_GRID_WIDTH, 0))); | |||
@@ -35,7 +35,7 @@ void LedDisplaySeparator::draw(const widget::DrawContext &ctx) { | |||
LedDisplayChoice::LedDisplayChoice() { | |||
box.size = mm2px(math::Vec(0, 28.0 / 3)); | |||
font = Font::load(asset::system("res/fonts/ShareTechMono-Regular.ttf")); | |||
font = APP->window->loadFont(asset::system("res/fonts/ShareTechMono-Regular.ttf")); | |||
color = nvgRGB(0xff, 0xd7, 0x14); | |||
textOffset = math::Vec(10, 18); | |||
} | |||
@@ -65,7 +65,7 @@ void LedDisplayChoice::onButton(const event::Button &e) { | |||
LedDisplayTextField::LedDisplayTextField() { | |||
font = Font::load(asset::system("res/fonts/ShareTechMono-Regular.ttf")); | |||
font = APP->window->loadFont(asset::system("res/fonts/ShareTechMono-Regular.ttf")); | |||
color = nvgRGB(0xff, 0xd7, 0x14); | |||
textOffset = math::Vec(5, 5); | |||
} | |||
@@ -3,7 +3,7 @@ | |||
#include "system.hpp" | |||
#include "asset.hpp" | |||
#include "app/Scene.hpp" | |||
#include "app/SVGPanel.hpp" | |||
#include "app/SvgPanel.hpp" | |||
#include "helpers.hpp" | |||
#include "app.hpp" | |||
#include "settings.hpp" | |||
@@ -299,7 +299,7 @@ void ModuleWidget::setModule(engine::Module *module) { | |||
this->module = module; | |||
} | |||
void ModuleWidget::setPanel(std::shared_ptr<SVG> svg) { | |||
void ModuleWidget::setPanel(std::shared_ptr<Svg> svg) { | |||
// Remove old panel | |||
if (panel) { | |||
removeChild(panel); | |||
@@ -308,7 +308,7 @@ void ModuleWidget::setPanel(std::shared_ptr<SVG> svg) { | |||
} | |||
{ | |||
SVGPanel *panel = new SVGPanel; | |||
SvgPanel *panel = new SvgPanel; | |||
panel->setBackground(svg); | |||
addChild(panel); | |||
box.size = panel->box.size; | |||
@@ -1,44 +1,44 @@ | |||
#include "app/SVGButton.hpp" | |||
#include "app/SvgButton.hpp" | |||
namespace rack { | |||
namespace app { | |||
SVGButton::SVGButton() { | |||
SvgButton::SvgButton() { | |||
fb = new widget::FramebufferWidget; | |||
addChild(fb); | |||
sw = new widget::SVGWidget; | |||
sw = new widget::SvgWidget; | |||
fb->addChild(sw); | |||
} | |||
void SVGButton::addFrame(std::shared_ptr<SVG> svg) { | |||
void SvgButton::addFrame(std::shared_ptr<Svg> svg) { | |||
frames.push_back(svg); | |||
// If this is our first frame, automatically set SVG and size | |||
if (!sw->svg) { | |||
sw->setSVG(svg); | |||
sw->setSvg(svg); | |||
box.size = sw->box.size; | |||
fb->box.size = sw->box.size; | |||
} | |||
} | |||
void SVGButton::onDragStart(const event::DragStart &e) { | |||
void SvgButton::onDragStart(const event::DragStart &e) { | |||
if (frames.size() >= 2) { | |||
sw->setSVG(frames[1]); | |||
sw->setSvg(frames[1]); | |||
fb->dirty = true; | |||
} | |||
e.consume(this); | |||
} | |||
void SVGButton::onDragEnd(const event::DragEnd &e) { | |||
void SvgButton::onDragEnd(const event::DragEnd &e) { | |||
if (frames.size() >= 1) { | |||
sw->setSVG(frames[0]); | |||
sw->setSvg(frames[0]); | |||
fb->dirty = true; | |||
} | |||
} | |||
void SVGButton::onDragDrop(const event::DragDrop &e) { | |||
void SvgButton::onDragDrop(const event::DragDrop &e) { | |||
if (e.origin == this) { | |||
event::Action eAction; | |||
onAction(eAction); |
@@ -1,11 +1,11 @@ | |||
#include "app/SVGKnob.hpp" | |||
#include "app/SvgKnob.hpp" | |||
namespace rack { | |||
namespace app { | |||
SVGKnob::SVGKnob() { | |||
SvgKnob::SvgKnob() { | |||
fb = new widget::FramebufferWidget; | |||
addChild(fb); | |||
@@ -16,12 +16,12 @@ SVGKnob::SVGKnob() { | |||
tw = new widget::TransformWidget; | |||
fb->addChild(tw); | |||
sw = new widget::SVGWidget; | |||
sw = new widget::SvgWidget; | |||
tw->addChild(sw); | |||
} | |||
void SVGKnob::setSVG(std::shared_ptr<SVG> svg) { | |||
sw->setSVG(svg); | |||
void SvgKnob::setSvg(std::shared_ptr<Svg> svg) { | |||
sw->setSvg(svg); | |||
tw->box.size = sw->box.size; | |||
fb->box.size = sw->box.size; | |||
box.size = sw->box.size; | |||
@@ -31,7 +31,7 @@ void SVGKnob::setSVG(std::shared_ptr<SVG> svg) { | |||
// shadow->box = shadow->box.grow(math::Vec(2, 2)); | |||
} | |||
void SVGKnob::onChange(const event::Change &e) { | |||
void SvgKnob::onChange(const event::Change &e) { | |||
// Re-transform the widget::TransformWidget | |||
if (paramQuantity) { | |||
float angle; |
@@ -1,4 +1,4 @@ | |||
#include "app/SVGPanel.hpp" | |||
#include "app/SvgPanel.hpp" | |||
namespace rack { | |||
@@ -15,7 +15,7 @@ void PanelBorder::draw(const widget::DrawContext &ctx) { | |||
} | |||
void SVGPanel::step() { | |||
void SvgPanel::step() { | |||
if (math::isNear(APP->window->pixelRatio, 1.0)) { | |||
// Small details draw poorly at low DPI, so oversample when drawing to the framebuffer | |||
oversample = 2.0; | |||
@@ -23,9 +23,9 @@ void SVGPanel::step() { | |||
widget::FramebufferWidget::step(); | |||
} | |||
void SVGPanel::setBackground(std::shared_ptr<SVG> svg) { | |||
widget::SVGWidget *sw = new widget::SVGWidget; | |||
sw->setSVG(svg); | |||
void SvgPanel::setBackground(std::shared_ptr<Svg> svg) { | |||
widget::SvgWidget *sw = new widget::SvgWidget; | |||
sw->setSvg(svg); | |||
addChild(sw); | |||
// Set size |
@@ -1,26 +1,26 @@ | |||
#include "app/SVGPort.hpp" | |||
#include "app/SvgPort.hpp" | |||
namespace rack { | |||
namespace app { | |||
SVGPort::SVGPort() { | |||
SvgPort::SvgPort() { | |||
fb = new widget::FramebufferWidget; | |||
addChild(fb); | |||
shadow = new CircularShadow; | |||
fb->addChild(shadow); | |||
// Avoid breakage if plugins fail to call setSVG() | |||
// Avoid breakage if plugins fail to call setSvg() | |||
// In that case, just disable the shadow. | |||
shadow->box.size = math::Vec(); | |||
sw = new widget::SVGWidget; | |||
sw = new widget::SvgWidget; | |||
fb->addChild(sw); | |||
} | |||
void SVGPort::setSVG(std::shared_ptr<SVG> svg) { | |||
sw->setSVG(svg); | |||
void SvgPort::setSvg(std::shared_ptr<Svg> svg) { | |||
sw->setSvg(svg); | |||
fb->box.size = sw->box.size; | |||
box.size = sw->box.size; | |||
shadow->box.size = sw->box.size; |
@@ -1,12 +1,12 @@ | |||
#include "app/SVGScrew.hpp" | |||
#include "app/SvgScrew.hpp" | |||
namespace rack { | |||
namespace app { | |||
SVGScrew::SVGScrew() { | |||
sw = new widget::SVGWidget; | |||
SvgScrew::SvgScrew() { | |||
sw = new widget::SvgWidget; | |||
addChild(sw); | |||
} | |||
@@ -1,36 +1,36 @@ | |||
#include "app/SVGSlider.hpp" | |||
#include "app/SvgSlider.hpp" | |||
namespace rack { | |||
namespace app { | |||
SVGSlider::SVGSlider() { | |||
SvgSlider::SvgSlider() { | |||
fb = new widget::FramebufferWidget; | |||
addChild(fb); | |||
background = new widget::SVGWidget; | |||
background = new widget::SvgWidget; | |||
fb->addChild(background); | |||
handle = new widget::SVGWidget; | |||
handle = new widget::SvgWidget; | |||
fb->addChild(handle); | |||
speed = 2.0; | |||
} | |||
void SVGSlider::setBackgroundSVG(std::shared_ptr<SVG> backgroundSVG) { | |||
background->setSVG(backgroundSVG); | |||
void SvgSlider::setBackgroundSvg(std::shared_ptr<Svg> svg) { | |||
background->setSvg(svg); | |||
fb->box.size = background->box.size; | |||
box.size = background->box.size; | |||
} | |||
void SVGSlider::setHandleSVG(std::shared_ptr<SVG> handleSVG) { | |||
handle->setSVG(handleSVG); | |||
void SvgSlider::setHandleSvg(std::shared_ptr<Svg> svg) { | |||
handle->setSvg(svg); | |||
handle->box.pos = maxHandlePos; | |||
fb->dirty = true; | |||
} | |||
void SVGSlider::onChange(const event::Change &e) { | |||
void SvgSlider::onChange(const event::Change &e) { | |||
if (paramQuantity) { | |||
// Interpolate handle position | |||
float v = paramQuantity->getScaledValue(); |
@@ -1,33 +1,33 @@ | |||
#include "app/SVGSwitch.hpp" | |||
#include "app/SvgSwitch.hpp" | |||
namespace rack { | |||
namespace app { | |||
SVGSwitch::SVGSwitch() { | |||
SvgSwitch::SvgSwitch() { | |||
fb = new widget::FramebufferWidget; | |||
addChild(fb); | |||
sw = new widget::SVGWidget; | |||
sw = new widget::SvgWidget; | |||
fb->addChild(sw); | |||
} | |||
void SVGSwitch::addFrame(std::shared_ptr<SVG> svg) { | |||
void SvgSwitch::addFrame(std::shared_ptr<Svg> svg) { | |||
frames.push_back(svg); | |||
// If this is our first frame, automatically set SVG and size | |||
if (!sw->svg) { | |||
sw->setSVG(svg); | |||
sw->setSvg(svg); | |||
box.size = sw->box.size; | |||
fb->box.size = sw->box.size; | |||
} | |||
} | |||
void SVGSwitch::onChange(const event::Change &e) { | |||
void SvgSwitch::onChange(const event::Change &e) { | |||
if (!frames.empty() && paramQuantity) { | |||
int index = (int) std::round(paramQuantity->getValue()); | |||
index = math::clamp(index, 0, (int) frames.size() - 1); | |||
sw->setSVG(frames[index]); | |||
sw->setSvg(frames[index]); | |||
fb->dirty = true; | |||
} | |||
ParamWidget::onChange(e); |
@@ -12,13 +12,13 @@ IconButton::IconButton() { | |||
fw->oversample = 2; | |||
addChild(fw); | |||
sw = new widget::SVGWidget; | |||
sw = new widget::SvgWidget; | |||
sw->box.pos = math::Vec(2, 2); | |||
fw->addChild(sw); | |||
} | |||
void IconButton::setSVG(std::shared_ptr<SVG> svg) { | |||
sw->setSVG(svg); | |||
void IconButton::setSvg(std::shared_ptr<Svg> svg) { | |||
sw->setSvg(svg); | |||
fw->dirty = true; | |||
} | |||
@@ -1,4 +1,4 @@ | |||
#include "widget/GLWidget.hpp" | |||
#include "widget/OpenGlWidget.hpp" | |||
#include "app.hpp" | |||
@@ -6,13 +6,13 @@ namespace rack { | |||
namespace widget { | |||
void GLWidget::step() { | |||
void OpenGlWidget::step() { | |||
// Render every frame | |||
dirty = true; | |||
} | |||
void GLWidget::drawFramebuffer() { | |||
void OpenGlWidget::drawFramebuffer() { | |||
glViewport(0.0, 0.0, fbSize.x, fbSize.y); | |||
glClearColor(0.0, 0.0, 0.0, 1.0); | |||
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); |
@@ -0,0 +1,31 @@ | |||
#include "widget/SvgWidget.hpp" | |||
#include "app.hpp" | |||
namespace rack { | |||
namespace widget { | |||
void SvgWidget::wrap() { | |||
if (svg && svg->handle) { | |||
box.size = math::Vec(svg->handle->width, svg->handle->height); | |||
} | |||
else { | |||
box.size = math::Vec(); | |||
} | |||
} | |||
void SvgWidget::setSvg(std::shared_ptr<Svg> svg) { | |||
this->svg = svg; | |||
wrap(); | |||
} | |||
void SvgWidget::draw(const DrawContext &ctx) { | |||
if (svg && svg->handle) { | |||
svgDraw(ctx.vg, svg->handle); | |||
} | |||
} | |||
} // namespace widget | |||
} // namespace rack |
@@ -23,13 +23,8 @@ | |||
namespace rack { | |||
static std::map<std::string, std::weak_ptr<Font>> fontCache; | |||
static std::map<std::string, std::weak_ptr<Image>> imageCache; | |||
static std::map<std::string, std::weak_ptr<SVG>> svgCache; | |||
Font::Font(const std::string &filename) { | |||
handle = nvgCreateFont(APP->window->vg, filename.c_str(), filename.c_str()); | |||
Font::Font(NVGcontext *vg, const std::string &filename) { | |||
handle = nvgCreateFont(vg, filename.c_str(), filename.c_str()); | |||
if (handle >= 0) { | |||
INFO("Loaded font %s", filename.c_str()); | |||
} | |||
@@ -43,14 +38,11 @@ Font::~Font() { | |||
} | |||
std::shared_ptr<Font> Font::load(const std::string &filename) { | |||
auto sp = fontCache[filename].lock(); | |||
if (!sp) | |||
fontCache[filename] = sp = std::make_shared<Font>(filename); | |||
return sp; | |||
return APP->window->loadFont(filename); | |||
} | |||
Image::Image(const std::string &filename) { | |||
handle = nvgCreateImage(APP->window->vg, filename.c_str(), NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY); | |||
Image::Image(NVGcontext *vg, const std::string &filename) { | |||
handle = nvgCreateImage(vg, filename.c_str(), NVG_IMAGE_REPEATX | NVG_IMAGE_REPEATY); | |||
if (handle > 0) { | |||
INFO("Loaded image %s", filename.c_str()); | |||
} | |||
@@ -61,17 +53,14 @@ Image::Image(const std::string &filename) { | |||
Image::~Image() { | |||
// TODO What if handle is invalid? | |||
nvgDeleteImage(APP->window->vg, handle); | |||
nvgDeleteImage(vg, handle); | |||
} | |||
std::shared_ptr<Image> Image::load(const std::string &filename) { | |||
auto sp = imageCache[filename].lock(); | |||
if (!sp) | |||
imageCache[filename] = sp = std::make_shared<Image>(filename); | |||
return sp; | |||
return APP->window->loadImage(filename); | |||
} | |||
SVG::SVG(const std::string &filename) { | |||
Svg::Svg(const std::string &filename) { | |||
handle = nsvgParseFromFile(filename.c_str(), "px", app::SVG_DPI); | |||
if (handle) { | |||
INFO("Loaded SVG %s", filename.c_str()); | |||
@@ -81,15 +70,12 @@ SVG::SVG(const std::string &filename) { | |||
} | |||
} | |||
SVG::~SVG() { | |||
Svg::~Svg() { | |||
nsvgDelete(handle); | |||
} | |||
std::shared_ptr<SVG> SVG::load(const std::string &filename) { | |||
auto sp = svgCache[filename].lock(); | |||
if (!sp) | |||
svgCache[filename] = sp = std::make_shared<SVG>(filename); | |||
return sp; | |||
std::shared_ptr<Svg> Svg::load(const std::string &filename) { | |||
return APP->window->loadSvg(filename); | |||
} | |||
@@ -100,6 +86,10 @@ struct Window::Internal { | |||
int lastWindowY = 0; | |||
int lastWindowWidth = 0; | |||
int lastWindowHeight = 0; | |||
std::map<std::string, std::weak_ptr<Font>> fontCache; | |||
std::map<std::string, std::weak_ptr<Image>> imageCache; | |||
std::map<std::string, std::weak_ptr<Svg>> svgCache; | |||
}; | |||
@@ -316,7 +306,7 @@ Window::~Window() { | |||
} | |||
void Window::run() { | |||
uiFont = Font::load(asset::system("res/fonts/DejaVuSans.ttf")); | |||
uiFont = APP->window->loadFont(asset::system("res/fonts/DejaVuSans.ttf")); | |||
frame = 0; | |||
while(!glfwWindowShouldClose(win)) { | |||
@@ -460,6 +450,29 @@ bool Window::isFullScreen() { | |||
return monitor != NULL; | |||
} | |||
std::shared_ptr<Font> Window::loadFont(const std::string &filename) { | |||
auto sp = internal->fontCache[filename].lock(); | |||
if (!sp) | |||
internal->fontCache[filename] = sp = std::make_shared<Font>(vg, filename); | |||
return sp; | |||
} | |||
std::shared_ptr<Image> Window::loadImage(const std::string &filename) { | |||
auto sp = internal->imageCache[filename].lock(); | |||
if (!sp) | |||
internal->imageCache[filename] = sp = std::make_shared<Image>(vg, filename); | |||
return sp; | |||
} | |||
std::shared_ptr<Svg> Window::loadSvg(const std::string &filename) { | |||
auto sp = internal->svgCache[filename].lock(); | |||
if (!sp) | |||
internal->svgCache[filename] = sp = std::make_shared<Svg>(filename); | |||
return sp; | |||
} | |||
void windowInit() { | |||
int err; | |||