Browse Source

Change "SVG" to "Svg" for correct capitalization style. Create Window::loadSvg, loadImage, and loadFont.

tags/v1.0.0
Andrew Belt 5 years ago
parent
commit
822c525d6b
39 changed files with 394 additions and 322 deletions
  1. +1
    -1
      include/app/ModuleWidget.hpp
  2. +0
    -35
      include/app/SVGSlider.hpp
  3. +9
    -6
      include/app/SvgButton.hpp
  4. +9
    -5
      include/app/SvgKnob.hpp
  5. +5
    -3
      include/app/SvgPanel.hpp
  6. +9
    -5
      include/app/SvgPort.hpp
  7. +7
    -4
      include/app/SvgScrew.hpp
  8. +40
    -0
      include/app/SvgSlider.hpp
  9. +9
    -6
      include/app/SvgSwitch.hpp
  10. +100
    -100
      include/component.hpp
  11. +3
    -2
      include/dsp/vumeter.hpp
  12. +9
    -9
      include/rack.hpp
  13. +4
    -3
      include/ui/IconButton.hpp
  14. +1
    -1
      include/widget/OpenGlWidget.hpp
  15. +0
    -39
      include/widget/SVGWidget.hpp
  16. +29
    -0
      include/widget/SvgWidget.hpp
  17. +20
    -8
      include/window.hpp
  18. +1
    -1
      src/Core/AudioInterface.cpp
  19. +1
    -1
      src/Core/CV_CC.cpp
  20. +1
    -1
      src/Core/CV_Gate.cpp
  21. +1
    -1
      src/Core/CV_MIDI.cpp
  22. +1
    -1
      src/Core/MIDI_CC.cpp
  23. +1
    -1
      src/Core/MIDI_CV.cpp
  24. +1
    -1
      src/Core/MIDI_Gate.cpp
  25. +4
    -4
      src/Core/MIDI_Map.cpp
  26. +1
    -1
      src/Core/Notes.cpp
  27. +2
    -2
      src/app/LedDisplay.cpp
  28. +3
    -3
      src/app/ModuleWidget.cpp
  29. +10
    -10
      src/app/SvgButton.cpp
  30. +6
    -6
      src/app/SvgKnob.cpp
  31. +5
    -5
      src/app/SvgPanel.cpp
  32. +6
    -6
      src/app/SvgPort.cpp
  33. +3
    -3
      src/app/SvgScrew.cpp
  34. +9
    -9
      src/app/SvgSlider.cpp
  35. +7
    -7
      src/app/SvgSwitch.cpp
  36. +3
    -3
      src/ui/IconButton.cpp
  37. +3
    -3
      src/widget/OpenGlWidget.cpp
  38. +31
    -0
      src/widget/SvgWidget.cpp
  39. +39
    -26
      src/window.cpp

+ 1
- 1
include/app/ModuleWidget.hpp View File

@@ -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);


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

@@ -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

include/app/SVGButton.hpp → include/app/SvgButton.hpp View File

@@ -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

include/app/SVGKnob.hpp → include/app/SvgKnob.hpp View File

@@ -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

include/app/SVGPanel.hpp → include/app/SvgPanel.hpp View File

@@ -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

include/app/SVGPort.hpp → include/app/SvgPort.hpp View File

@@ -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

include/app/SVGScrew.hpp → include/app/SvgScrew.hpp View File

@@ -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

+ 40
- 0
include/app/SvgSlider.hpp View File

@@ -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

include/app/SVGSwitch.hpp → include/app/SvgSwitch.hpp View File

@@ -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

+ 100
- 100
include/component.hpp View File

@@ -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;
}
};


+ 3
- 2
include/dsp/vumeter.hpp View File

@@ -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.
*/


+ 9
- 9
include/rack.hpp View File

@@ -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"



+ 4
- 3
include/ui/IconButton.hpp View File

@@ -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);}
};




include/widget/GLWidget.hpp → include/widget/OpenGlWidget.hpp View File

@@ -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.
*/

+ 0
- 39
include/widget/SVGWidget.hpp View File

@@ -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

+ 29
- 0
include/widget/SvgWidget.hpp View File

@@ -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

+ 20
- 8
include/window.hpp View File

@@ -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);
};




+ 1
- 1
src/Core/AudioInterface.cpp View File

@@ -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)));


+ 1
- 1
src/Core/CV_CC.cpp View File

@@ -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)));


+ 1
- 1
src/Core/CV_Gate.cpp View File

@@ -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)));


+ 1
- 1
src/Core/CV_MIDI.cpp View File

@@ -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)));


+ 1
- 1
src/Core/MIDI_CC.cpp View File

@@ -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)));


+ 1
- 1
src/Core/MIDI_CV.cpp View File

@@ -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)));


+ 1
- 1
src/Core/MIDI_Gate.cpp View File

@@ -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)));


+ 4
- 4
src/Core/MIDI_Map.cpp View File

@@ -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)));


+ 1
- 1
src/Core/Notes.cpp View File

@@ -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)));


+ 2
- 2
src/app/LedDisplay.cpp View File

@@ -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
- 3
src/app/ModuleWidget.cpp View File

@@ -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;


src/app/SVGButton.cpp → src/app/SvgButton.cpp View File

@@ -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);

src/app/SVGKnob.cpp → src/app/SvgKnob.cpp View File

@@ -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;

src/app/SVGPanel.cpp → src/app/SvgPanel.cpp View File

@@ -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

src/app/SVGPort.cpp → src/app/SvgPort.cpp View File

@@ -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;

src/app/SVGScrew.cpp → src/app/SvgScrew.cpp View File

@@ -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);
}


src/app/SVGSlider.cpp → src/app/SvgSlider.cpp View File

@@ -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();

src/app/SVGSwitch.cpp → src/app/SvgSwitch.cpp View File

@@ -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);

+ 3
- 3
src/ui/IconButton.cpp View File

@@ -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;
}



src/widget/GLWidget.cpp → src/widget/OpenGlWidget.cpp View File

@@ -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);

+ 31
- 0
src/widget/SvgWidget.cpp View File

@@ -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

+ 39
- 26
src/window.cpp View File

@@ -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;


Loading…
Cancel
Save