Skip to content

Commit

Permalink
fix sl problem. better looking
Browse files Browse the repository at this point in the history
  • Loading branch information
CsRic committed Nov 23, 2024
1 parent b095194 commit 6048590
Show file tree
Hide file tree
Showing 5 changed files with 96 additions and 18 deletions.
4 changes: 3 additions & 1 deletion Akasha/Source/MyLookAndFeel.h
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,9 @@ namespace Akasha {
public:
CustomLookAndFeel() {
setDefaultSansSerifTypeface(getCustomFont());
setColour(juce::CodeEditorComponent::backgroundColourId, juce::Colour(0xFF101010));
setColour(juce::CodeEditorComponent::backgroundColourId, juce::Colour(0xFF252525));
setColour(juce::TextEditor::backgroundColourId, juce::Colour(0xFF353535));
setColour(juce::TextEditor::outlineColourId, juce::Colour(0xFF707070));
}
static const juce::Typeface::Ptr getCustomFont() {
static auto typeface = juce::Typeface::createSystemTypefaceFor(din::DIN_ttf, din::DIN_ttfSize);
Expand Down
27 changes: 22 additions & 5 deletions Akasha/Source/PluginEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -49,7 +49,10 @@ AkashaAudioProcessorEditor::AkashaAudioProcessorEditor(AkashaAudioProcessor& p,
addAndMakeVisible(formulaEditor);

// main editor.
setSize(800, 600);
int savedWidth = valueTreeState.getParameterAsValue("editorWidth").getValue();
int savedHeight = valueTreeState.getParameterAsValue("editorHeight").getValue();

setSize(savedWidth, savedHeight);
setResizable(true, true);
setResizeLimits(600, 400, std::numeric_limits<int>::max(), std::numeric_limits<int>::max());

Expand All @@ -58,18 +61,27 @@ AkashaAudioProcessorEditor::AkashaAudioProcessorEditor(AkashaAudioProcessor& p,
voice_ptr->setConsole(&code_console);
}
// read other states
setCodeString(audioProcessor.savedCode);
setCodeString(audioProcessor.savedCode);
setMacroText(audioProcessor.savedMacroText);
}

AkashaAudioProcessorEditor::~AkashaAudioProcessorEditor() {
// report current texts before closing.
audioProcessor.savedCode = getCodeString();
audioProcessor.savedMacroText = getMacroText();
setLookAndFeel(nullptr);
}

void AkashaAudioProcessorEditor::paint(juce::Graphics& g) {
g.fillAll(juce::Colours::darkgrey);
}

void AkashaAudioProcessorEditor::mouseDown(const juce::MouseEvent& event) {
if (!formulaEditor.getBounds().contains(event.getPosition())) {
formulaEditor.unfocusAllComponents();
}
AudioProcessorEditor::mouseDown(event);
}
void AkashaAudioProcessorEditor::resized() {
juce::FlexBox mainFlexBox;
juce::FlexBox macroSlidersBox;
Expand All @@ -79,8 +91,10 @@ void AkashaAudioProcessorEditor::resized() {

textEditorBox.flexDirection = juce::FlexBox::Direction::column;
textEditorBox.justifyContent = juce::FlexBox::JustifyContent::center;
textEditorBox.items.add(juce::FlexItem(formulaEditor).withFlex(1.0f));
textEditorBox.items.add(juce::FlexItem(code_console).withMinHeight(40.0f));
textEditorBox.items.add(juce::FlexItem(formulaEditor).withFlex(1.0f)
.withMargin(juce::FlexItem::Margin(0.0f)));
textEditorBox.items.add(juce::FlexItem(code_console).withMinHeight(40.0f)
.withMargin(juce::FlexItem::Margin(0.0f)));

macroSlidersBox.flexDirection = juce::FlexBox::Direction::row;
macroSlidersBox.flexWrap = juce::FlexBox::Wrap::wrap;
Expand All @@ -92,5 +106,8 @@ void AkashaAudioProcessorEditor::resized() {
mainFlexBox.items.add(juce::FlexItem(textEditorBox).withFlex(1.0f));
mainFlexBox.items.add(juce::FlexItem(macroSlidersBox).withMinHeight(100.f));

mainFlexBox.performLayout(getLocalBounds());
mainFlexBox.performLayout(getLocalBounds().reduced(3.0f));

valueTreeState.getParameterAsValue("editorWidth").setValue(getWidth());
valueTreeState.getParameterAsValue("editorHeight").setValue(getHeight());
}
49 changes: 45 additions & 4 deletions Akasha/Source/PluginEditor.h
Original file line number Diff line number Diff line change
Expand Up @@ -58,21 +58,28 @@ namespace Akasha {
juce::Label label;
};

class FormulaEditor : public juce::CodeEditorComponent {
class FormulaEditor : public juce::CodeEditorComponent,
private juce::CodeDocument::Listener {
public:
FormulaEditor(juce::CodeDocument& document, juce::CodeTokeniser* codeTokeniser, Akasha::JSEngine& engine) :
juce::CodeEditorComponent(document, codeTokeniser), jsEngine(engine) {
setFont(juce::Font(juce::Font::getDefaultMonospacedFontName(), 15.0f, juce::Font::plain));
setTabSize(4, true);

document.addListener(this);
setScrollbarThickness(8);
}

void compile() {
juce::String info;
giveInfo("");
giveInfo("Compiling...");
if (!jsEngine.loadFunction(getText().toStdString(), info)) {
giveInfo(info);
}
giveInfo("Compiled OK :D");
else {
giveInfo("Compiled OK :D");
}
editAfterCompile = false;
}

bool keyPressed(const juce::KeyPress& key) override {
Expand All @@ -94,24 +101,58 @@ namespace Akasha {
loadContent(newText);
}

void focusGained(FocusChangeType cause) override {
hasFocus = true;
repaint();
}
void focusLost(FocusChangeType cause) override {
hasFocus = false;
repaint();
// auto recompile : )
if (editAfterCompile) {
compile();
}
}

void paint(juce::Graphics& g) override {
juce::CodeEditorComponent::paint(g);
if (!hasFocus) {
juce::Colour overlayColour = juce::Colours::grey.withAlpha(0.2f);
auto bounds = getLocalBounds();
g.setColour(overlayColour);
g.fillRect(bounds);
}
}

private:
void codeDocumentTextInserted(const juce::String&, int) override {
editAfterCompile = true;
}
void codeDocumentTextDeleted(int, int) override {
editAfterCompile = true;
}

void giveInfo(juce::String info) {
if (console != nullptr) {
console->setText(info);
}
}

juce::TextEditor* console = nullptr; // debug purpose.
Akasha::JSEngine& jsEngine;
bool hasFocus = false; // keyboard focus
bool editAfterCompile = false;
};
}

class AkashaAudioProcessorEditor : public juce::AudioProcessorEditor{
class AkashaAudioProcessorEditor : public juce::AudioProcessorEditor {
public:
AkashaAudioProcessorEditor(AkashaAudioProcessor& p, juce::AudioProcessorValueTreeState& vts);
~AkashaAudioProcessorEditor() override;

void paint(juce::Graphics&) override;
void resized() override;
void mouseDown(const juce::MouseEvent& event) override;

juce::String getCodeString() const {
return formulaEditor.getText();
Expand Down
28 changes: 20 additions & 8 deletions Akasha/Source/PluginProcessor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -154,15 +154,26 @@ juce::AudioProcessorEditor* AkashaAudioProcessor::createEditor() {
}

void AkashaAudioProcessor::getStateInformation(juce::MemoryBlock& destData) {
if (auto* editor = dynamic_cast<AkashaAudioProcessorEditor*>(getActiveEditor())) {
savedCode = editor->getCodeString();
savedMacroText = editor->getMacroText();
}
auto state = parameters.copyState();
std::unique_ptr<juce::XmlElement> xml (state.createXml());

juce::XmlElement* textData = xml->createNewChildElement("Text");
textData->setAttribute("code", savedCode);
for (int i = 0; i < 8; ++i) {
textData->setAttribute("macro" + juce::String(i), savedMacroText[i]);
if (xml != nullptr) {
while (auto* existingText = xml->getChildByName("Text")) {
xml->removeChildElement(existingText, true);
}
juce::XmlElement* textData = xml->createNewChildElement("Text");
if (textData != nullptr) {
textData->setAttribute("code", savedCode);
for (int i = 0; i < 8; ++i) {
textData->setAttribute("macro" + juce::String(i), savedMacroText[i]);
}
}
copyXmlToBinary(*xml, destData);
}
copyXmlToBinary (*xml, destData);
DBG("Generated XML: " + xml->toString()); // debug
}

void AkashaAudioProcessor::setStateInformation(const void* data, int sizeInBytes) {
Expand All @@ -174,13 +185,14 @@ void AkashaAudioProcessor::setStateInformation(const void* data, int sizeInBytes
}
else{
std::unique_ptr<juce::XmlElement> xmlState (getXmlFromBinary (data, sizeInBytes));
DBG("Loaded XML: " + xmlState->toString()); // debug
if (xmlState.get() != nullptr) {
if (xmlState->hasTagName(parameters.state.getType())) {
parameters.replaceState(juce::ValueTree::fromXml(*xmlState));
if (auto* textData = xmlState->getChildByName("Text")) {
savedCode = textData->getStringAttribute("code");
savedCode = textData->getStringAttribute("code", defaultJavascriptCode);
for (int i = 0; i < 8; ++i) {
savedMacroText[i] = textData->getStringAttribute("macro" + juce::String(i));
savedMacroText[i] = textData->getStringAttribute("macro" + juce::String(i), "m" + juce::String(i));
}
}
}
Expand Down
6 changes: 6 additions & 0 deletions Akasha/Source/PluginProcessor.h
Original file line number Diff line number Diff line change
Expand Up @@ -136,6 +136,11 @@ namespace Akasha {
for (int i = 0; i < 8; ++i) {
layout.add(std::make_unique<juce::AudioParameterFloat>("macro" + juce::String(i), "macro" + juce::String(i), 0.0f, 1.0f, 0.0f));
}
// editorSize
layout.add(std::make_unique<juce::AudioParameterInt>(
"editorWidth", "Editor Width", 600, std::numeric_limits<int>::max(), 800));
layout.add(std::make_unique<juce::AudioParameterInt>(
"editorHeight", "Editor Height", 600, std::numeric_limits<int>::max(), 1000));
return layout;
}
}
Expand Down Expand Up @@ -193,4 +198,5 @@ class AkashaAudioProcessor : public juce::AudioProcessor {
std::vector<Akasha::AkashaVoice*> voices;
juce::AudioProcessorValueTreeState parameters;
std::array<std::atomic<float>*, 8> macros;

};

0 comments on commit 6048590

Please sign in to comment.