osci-render/Source/components/LuaConsole.cpp

108 wiersze
3.0 KiB
C++
Czysty Zwykły widok Historia

2024-03-01 15:29:14 +00:00
#include "LuaConsole.h"
#include "../PluginEditor.h"
LuaConsole::LuaConsole() {
setText("Lua Console");
console.setReadOnly(true);
2024-03-02 18:31:12 +00:00
console.setLineNumbersShown(false);
console.setScrollbarThickness(0);
document.getUndoManager().setMaxNumberOfStoredUnits(0, 0);
startTimerHz(10);
clearConsoleButton.onClick = [this] {
clear(true);
2024-03-02 18:31:12 +00:00
};
2024-03-01 15:29:14 +00:00
addAndMakeVisible(console);
2024-03-02 18:31:12 +00:00
addAndMakeVisible(clearConsoleButton);
addAndMakeVisible(pauseConsoleButton);
addAndMakeVisible(emptyConsoleLabel);
2024-03-02 18:31:12 +00:00
clearConsoleButton.setTooltip("Clear console output. You can clear the console from Lua with the clear() function.");
2024-03-03 13:43:03 +00:00
pauseConsoleButton.setTooltip("Pause console output, and show a scrollbar to navigate through the console history.");
2024-03-02 18:31:12 +00:00
pauseConsoleButton.onClick = [this] {
console.setScrollbarThickness(pauseConsoleButton.getToggleState() ? 10 : 0);
};
emptyConsoleLabel.setJustificationType(juce::Justification::centred);
2024-03-01 15:29:14 +00:00
}
LuaConsole::~LuaConsole() {}
2024-03-02 18:31:12 +00:00
void LuaConsole::print(const std::string& text) {
juce::SpinLock::ScopedLockType l(lock);
2024-03-01 15:29:14 +00:00
2024-03-02 18:31:12 +00:00
if (consoleOpen && !pauseConsoleButton.getToggleState()) {
buffer += text + "\n";
consoleLines++;
2024-03-01 15:29:14 +00:00
}
}
void LuaConsole::clear(bool forceClear) {
2024-03-02 18:31:12 +00:00
juce::SpinLock::ScopedLockType l(lock);
if (forceClear || !pauseConsoleButton.getToggleState()) {
document.replaceAllContent("");
document.clearUndoHistory();
consoleLines = 0;
buffer.clear();
juce::MessageManager::callAsync([this] {
console.setVisible(false);
emptyConsoleLabel.setVisible(true);
});
}
2024-03-02 18:31:12 +00:00
}
void LuaConsole::timerCallback() {
juce::SpinLock::ScopedLockType l(lock);
if (consoleOpen && !pauseConsoleButton.getToggleState()) {
document.insertText(juce::CodeDocument::Position(document, std::numeric_limits<int>::max(), std::numeric_limits<int>::max()), buffer);
buffer.clear();
// clear console if it gets too long
if (consoleLines > 100000) {
// soft-clear console
int linesToClear = consoleLines * 0.9;
document.deleteSection(juce::CodeDocument::Position(document, 0, 0), juce::CodeDocument::Position(document, linesToClear, 0));
consoleLines -= linesToClear;
}
console.moveCaretToTop(false);
console.moveCaretToEnd(false);
console.scrollDown();
if (consoleLines > 0) {
console.setVisible(true);
emptyConsoleLabel.setVisible(false);
}
2024-03-02 18:31:12 +00:00
}
}
void LuaConsole::setConsoleOpen(bool open) {
juce::SpinLock::ScopedLockType l(lock);
consoleOpen = open;
console.setVisible(open);
if (open) {
startTimerHz(10);
} else {
stopTimer();
}
2024-03-01 15:29:14 +00:00
}
void LuaConsole::resized() {
2024-03-02 18:31:12 +00:00
auto topBar = getLocalBounds().removeFromTop(30);
auto area = getLocalBounds().withTrimmedTop(30);
2024-03-01 15:29:14 +00:00
console.setBounds(area);
emptyConsoleLabel.setBounds(area);
2024-03-02 18:31:12 +00:00
clearConsoleButton.setBounds(topBar.removeFromRight(30).withSizeKeepingCentre(20, 20));
pauseConsoleButton.setBounds(topBar.removeFromRight(30).withSizeKeepingCentre(20, 20));
2024-03-01 15:29:14 +00:00
}