diff --git a/CMakeLists.txt b/CMakeLists.txt index bedbd289..5e690ef0 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -99,6 +99,7 @@ target_sources(${PROJECT_NAME} src/media/AudioDisplayComponent.cpp src/media/MidiDisplayComponent.cpp src/media/FileDisplayComponent.cpp + src/media/TextDisplayComponent.cpp src/media/OutputLabelComponent.cpp src/media/pianoroll/KeyboardComponent.cpp diff --git a/pyharp b/pyharp index d65c4f7d..8c6fdf8d 160000 --- a/pyharp +++ b/pyharp @@ -1 +1 @@ -Subproject commit d65c4f7d0264dcdb3024a6c5466cddd7b2defdca +Subproject commit 8c6fdf8dfb65b977c2145835dc61114cb8bb72a5 diff --git a/src/Model.h b/src/Model.h index ac0e01d7..4840c2b6 100644 --- a/src/Model.h +++ b/src/Model.h @@ -484,6 +484,17 @@ class Model DBG_AND_LOG("Model::extractInputs: MIDI track input \"" + midiTrack->label + "\" extracted."); } + else if (type == "text_track") + { + std::shared_ptr textFile = + std::make_shared(controlsDict); + + newInputs.push_back(textFile); + tempComponentIDs.push_back(textFile->id); + + DBG_AND_LOG("Model::extractInputs: Text file input \"" + textFile->label + + "\" extracted."); + } else if (type == "generic_file") { std::shared_ptr fileChooser = @@ -618,6 +629,16 @@ class Model DBG_AND_LOG("Model::extractOutputs: MIDI track output \"" + midiTrack->label + "\" extracted."); } + else if (type == "text_track") + { + std::shared_ptr textFile = + std::make_shared(controlsDict); + + newOutputs.push_back(textFile); + + DBG_AND_LOG("Model::extractOutputs: Text file output \"" + textFile->label + + "\" extracted."); + } else if (type == "generic_file") { std::shared_ptr fileOutput = diff --git a/src/media/MediaDisplayComponent.cpp b/src/media/MediaDisplayComponent.cpp index 60bea601..82985101 100644 --- a/src/media/MediaDisplayComponent.cpp +++ b/src/media/MediaDisplayComponent.cpp @@ -1,6 +1,7 @@ #include "MediaDisplayComponent.h" #include "AudioDisplayComponent.h" #include "MidiDisplayComponent.h" +#include "TextDisplayComponent.h" #include "../utils/Interface.h" @@ -295,9 +296,11 @@ StringArray MediaDisplayComponent::getSupportedExtensions() { StringArray audioExtensions = AudioDisplayComponent::getSupportedExtensions(); StringArray midiExtensions = MidiDisplayComponent::getSupportedExtensions(); + StringArray textExtensions = TextDisplayComponent::getSupportedExtensions(); StringArray allExtensions = StringArray(audioExtensions); allExtensions.mergeArray(midiExtensions); + allExtensions.mergeArray(textExtensions); return allExtensions; } diff --git a/src/media/TextDisplayComponent.cpp b/src/media/TextDisplayComponent.cpp new file mode 100644 index 00000000..f42f13c6 --- /dev/null +++ b/src/media/TextDisplayComponent.cpp @@ -0,0 +1,43 @@ +#include "TextDisplayComponent.h" + +TextDisplayComponent::TextDisplayComponent() : TextDisplayComponent("Text Track") {} + +TextDisplayComponent::TextDisplayComponent(String name, bool req, bool fromDAW, DisplayMode mode) + : MediaDisplayComponent(name, req, fromDAW, mode) +{ + textEditor.setMultiLine(true); + textEditor.setReadOnly(true); + textEditor.setScrollbarsShown(true); + textEditor.setCaretVisible(false); + textEditor.setPopupMenuEnabled(false); + textEditor.setText("No text file loaded."); + contentComponent.addAndMakeVisible(textEditor); +} + +StringArray TextDisplayComponent::getSupportedExtensions() +{ + StringArray extensions; + + extensions.add(".txt"); + + return extensions; +} + +void TextDisplayComponent::resized() +{ + MediaDisplayComponent::resized(); + textEditor.setBounds(contentComponent.getLocalBounds()); +} + +void TextDisplayComponent::loadMediaFile(const URL& filePath) +{ + File file = filePath.getLocalFile(); + textEditor.setText(file.loadFileAsString()); +} + +void TextDisplayComponent::resetMedia() +{ + textEditor.setText("No text file loaded."); +} + +void TextDisplayComponent::postLoadActions(const URL& /*filePath*/) {} diff --git a/src/media/TextDisplayComponent.h b/src/media/TextDisplayComponent.h new file mode 100644 index 00000000..8fa32f84 --- /dev/null +++ b/src/media/TextDisplayComponent.h @@ -0,0 +1,38 @@ +#pragma once + +#include "MediaDisplayComponent.h" + +class TextDisplayComponent : public MediaDisplayComponent +{ +public: + TextDisplayComponent(); + TextDisplayComponent(String name, + bool req = true, + bool fromDAW = false, + DisplayMode mode = DisplayMode::Hybrid); + ~TextDisplayComponent() override = default; + + static StringArray getSupportedExtensions(); + + StringArray getInstanceExtensions() override + { + return TextDisplayComponent::getSupportedExtensions(); + } + + int getFixedHeight() const override { return fixedHeight; } + + double getTotalLengthInSecs() override { return 0.0; } + + void resized() override; + + void loadMediaFile(const URL& filePath) override; + +private: + void resetMedia() override; + + void postLoadActions(const URL& filePath) override; + + TextEditor textEditor; + + static constexpr int fixedHeight = 150; +}; diff --git a/src/utils/Controls.h b/src/utils/Controls.h index 422b85fc..4f1367af 100644 --- a/src/utils/Controls.h +++ b/src/utils/Controls.h @@ -83,6 +83,11 @@ struct MidiTrackComponentInfo : public TrackComponentInfo using TrackComponentInfo::TrackComponentInfo; }; +struct TextTrackComponentInfo : public TrackComponentInfo +{ + using TrackComponentInfo::TrackComponentInfo; +}; + struct FileComponentInfo : public ModelComponentInfo // TODO - Listener? { bool required = true; diff --git a/src/widgets/TrackAreaWidget.h b/src/widgets/TrackAreaWidget.h index 2a9df586..966faec9 100644 --- a/src/widgets/TrackAreaWidget.h +++ b/src/widgets/TrackAreaWidget.h @@ -12,6 +12,7 @@ #include "../media/FileDisplayComponent.h" #include "../media/MediaDisplayComponent.h" #include "../media/MidiDisplayComponent.h" +#include "../media/TextDisplayComponent.h" #include "../utils/Controls.h" #include "../utils/Interface.h" @@ -376,6 +377,11 @@ class TrackAreaWidget : public Component, m = std::make_unique( label, midiTrackInfo->required, fromDAW, displayMode); } + else if (auto textTrackInfo = dynamic_cast(trackInfo)) + { + m = std::make_unique( + label, textTrackInfo->required, fromDAW, displayMode); + } else { DBG_AND_LOG( @@ -491,6 +497,15 @@ class TrackAreaWidget : public Component, trackInfo = std::move(midiTrackInfo); } + else if (TextDisplayComponent::getSupportedExtensions().contains(ext)) + { + auto textTrackInfo = std::make_unique(); + + textTrackInfo->required = false; + textTrackInfo->label = label.toStdString(); + + trackInfo = std::move(textTrackInfo); + } else { DBG_AND_LOG("TrackAreaWidget::addTrackFromFilePath: Tried to add file "