From a2c1598b64002558c5cd2870e0320f8bebd4e642 Mon Sep 17 00:00:00 2001 From: Vansh Chugh <1shhmusic2002@gmail.com> Date: Tue, 21 Jul 2026 01:28:41 +0530 Subject: [PATCH 1/3] added TextDisplayComponent for .txt support --- CMakeLists.txt | 1 + src/Model.h | 21 +++++++++++ src/media/MediaDisplayComponent.cpp | 3 ++ src/media/TextDisplayComponent.cpp | 56 +++++++++++++++++++++++++++++ src/media/TextDisplayComponent.h | 35 ++++++++++++++++++ src/utils/Controls.h | 5 +++ src/widgets/TrackAreaWidget.h | 15 ++++++++ 7 files changed, 136 insertions(+) create mode 100644 src/media/TextDisplayComponent.cpp create mode 100644 src/media/TextDisplayComponent.h 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/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..5255d186 --- /dev/null +++ b/src/media/TextDisplayComponent.cpp @@ -0,0 +1,56 @@ +#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() +{ + return { ".txt" }; +} + +StringArray TextDisplayComponent::getInstanceExtensions() +{ + return getSupportedExtensions(); +} + +double TextDisplayComponent::getTotalLengthInSecs() { return 0.0; } + +void TextDisplayComponent::paint(Graphics& g) +{ + MediaDisplayComponent::paint(g); +} + +void TextDisplayComponent::resized() +{ + MediaDisplayComponent::resized(); + textEditor.setBounds(contentComponent.getLocalBounds()); +} + +void TextDisplayComponent::loadMediaFile(const URL& filePath) +{ + File file = filePath.getLocalFile(); + textEditor.setText(file.loadFileAsString()); + repaint(); +} + +void TextDisplayComponent::resetMedia() +{ + textEditor.setText("No text file loaded."); + repaint(); +} + +void TextDisplayComponent::postLoadActions(const URL& /*filePath*/) +{ + repaint(); +} diff --git a/src/media/TextDisplayComponent.h b/src/media/TextDisplayComponent.h new file mode 100644 index 00000000..1de873be --- /dev/null +++ b/src/media/TextDisplayComponent.h @@ -0,0 +1,35 @@ +#pragma once + +#include "MediaDisplayComponent.h" + +class TextDisplayComponent : public MediaDisplayComponent +{ +public: + TextDisplayComponent(); + TextDisplayComponent(String name, + bool req = true, + bool fromDAW = false, + DisplayMode mode = DisplayMode::Input); + ~TextDisplayComponent() override = default; + + static StringArray getSupportedExtensions(); + + StringArray getInstanceExtensions() override; + + int getFixedHeight() const override { return fixedHeight; } + + double getTotalLengthInSecs() override; + + void paint(Graphics& g) override; + void resized() override; + + void loadMediaFile(const URL& filePath) override; + void resetMedia() override; + + void postLoadActions(const URL& filePath) override; + +private: + 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 " From 0c397c9f30086f3eb7db5cd93ae5b3991d1670ca Mon Sep 17 00:00:00 2001 From: Vansh Chugh <1shhmusic2002@gmail.com> Date: Tue, 21 Jul 2026 01:32:43 +0530 Subject: [PATCH 2/3] update pyharp to include HarpTextTrack --- pyharp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyharp b/pyharp index d65c4f7d..8c6fdf8d 160000 --- a/pyharp +++ b/pyharp @@ -1 +1 @@ -Subproject commit d65c4f7d0264dcdb3024a6c5466cddd7b2defdca +Subproject commit 8c6fdf8dfb65b977c2145835dc61114cb8bb72a5 From e2f22099d48b12f09d0447d970feb4e1ceee7471 Mon Sep 17 00:00:00 2001 From: Vansh Chugh <1shhmusic2002@gmail.com> Date: Tue, 21 Jul 2026 02:13:43 +0530 Subject: [PATCH 3/3] cleanup and style-matching --- src/media/TextDisplayComponent.cpp | 21 ++++----------------- src/media/TextDisplayComponent.h | 13 ++++++++----- 2 files changed, 12 insertions(+), 22 deletions(-) diff --git a/src/media/TextDisplayComponent.cpp b/src/media/TextDisplayComponent.cpp index 5255d186..f42f13c6 100644 --- a/src/media/TextDisplayComponent.cpp +++ b/src/media/TextDisplayComponent.cpp @@ -16,19 +16,11 @@ TextDisplayComponent::TextDisplayComponent(String name, bool req, bool fromDAW, StringArray TextDisplayComponent::getSupportedExtensions() { - return { ".txt" }; -} - -StringArray TextDisplayComponent::getInstanceExtensions() -{ - return getSupportedExtensions(); -} + StringArray extensions; -double TextDisplayComponent::getTotalLengthInSecs() { return 0.0; } + extensions.add(".txt"); -void TextDisplayComponent::paint(Graphics& g) -{ - MediaDisplayComponent::paint(g); + return extensions; } void TextDisplayComponent::resized() @@ -41,16 +33,11 @@ void TextDisplayComponent::loadMediaFile(const URL& filePath) { File file = filePath.getLocalFile(); textEditor.setText(file.loadFileAsString()); - repaint(); } void TextDisplayComponent::resetMedia() { textEditor.setText("No text file loaded."); - repaint(); } -void TextDisplayComponent::postLoadActions(const URL& /*filePath*/) -{ - repaint(); -} +void TextDisplayComponent::postLoadActions(const URL& /*filePath*/) {} diff --git a/src/media/TextDisplayComponent.h b/src/media/TextDisplayComponent.h index 1de873be..8fa32f84 100644 --- a/src/media/TextDisplayComponent.h +++ b/src/media/TextDisplayComponent.h @@ -9,26 +9,29 @@ class TextDisplayComponent : public MediaDisplayComponent TextDisplayComponent(String name, bool req = true, bool fromDAW = false, - DisplayMode mode = DisplayMode::Input); + DisplayMode mode = DisplayMode::Hybrid); ~TextDisplayComponent() override = default; static StringArray getSupportedExtensions(); - StringArray getInstanceExtensions() override; + StringArray getInstanceExtensions() override + { + return TextDisplayComponent::getSupportedExtensions(); + } int getFixedHeight() const override { return fixedHeight; } - double getTotalLengthInSecs() override; + double getTotalLengthInSecs() override { return 0.0; } - void paint(Graphics& g) override; void resized() override; void loadMediaFile(const URL& filePath) override; + +private: void resetMedia() override; void postLoadActions(const URL& filePath) override; -private: TextEditor textEditor; static constexpr int fixedHeight = 150;