Loading...
Searching...
No Matches
AudioFileChooserWidget.hpp
1#pragma once
2
3#include <score/tools/FilePath.hpp>
4#include <Process/Dataflow/ControlWidgets.hpp>
5
6#include <Media/MediaFileHandle.hpp>
7
8#include <score/tools/ProjectFiles.hpp>
9
10#include <nano_observer.hpp>
11#include <score_plugin_media_export.h>
12namespace Media::Sound
13{
14struct WaveformComputer;
15}
16namespace score
17{
18
19class SCORE_PLUGIN_MEDIA_EXPORT QGraphicsWaveformButton final
20 : public QObject
21 , public QGraphicsItem
22 , public Nano::Observer
23{
25
26 bool m_pressed{};
27
28public:
29 QGraphicsWaveformButton(QGraphicsItem* parent);
31
32 void pressed() E_SIGNAL(SCORE_PLUGIN_MEDIA_EXPORT, pressed);
33 void dropped(QString filename) E_SIGNAL(SCORE_PLUGIN_MEDIA_EXPORT, dropped, filename);
34 void bang();
35
36 const QString& text() const noexcept { return m_string; }
39 bool hasWaveform() const noexcept { return !m_images.empty(); }
44 void setFile(const QString& s, const QString& absolute);
45 QRectF boundingRect() const override;
46
47private:
48 void on_finishedDecoding();
49 void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
50 void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
51 void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override;
52
53 void dragEnterEvent(QGraphicsSceneDragDropEvent* event) override;
54 void dragMoveEvent(QGraphicsSceneDragDropEvent* event) override;
55 void dragLeaveEvent(QGraphicsSceneDragDropEvent* event) override;
56 void dropEvent(QGraphicsSceneDragDropEvent* event) override;
57
58 void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
59 final override;
60 QRectF m_rect;
61 QString m_string;
62 std::shared_ptr<Media::AudioFile> m_file;
63 QVector<QImage*> m_images;
65};
66
67}
68namespace Media
69{
70
71struct AudioFileChooser : WidgetFactory::FileChooser
72{
73 template <typename T, typename Control_T>
74 static score::QGraphicsWaveformButton* make_item(
75 const T& slider, Control_T& inlet, const score::DocumentContext& ctx,
76 QGraphicsItem* parent, QObject* context)
77 {
78 auto bt = new score::QGraphicsWaveformButton{parent};
79 auto on_open = [&inlet, &ctx] {
80 const auto current = QString::fromStdString(ossia::convert<std::string>(inlet.value()));
81 WidgetFactory::openFileToImport(
82 inlet.filters(), score::pickerStartFolder(current, ctx),
83 [&inlet, &ctx](const QString& filename) {
84 // On wasm `filename` is the staged MEMFS path; relativize so it is
85 // stored consistently with drops.
86 auto path = score::relativizeFilePath(filename, ctx);
87 CommandDispatcher<>{ctx.commandStack}
88 .submit<WidgetFactory::SetControlValue<Control_T>>(
89 inlet, path.toStdString());
90 });
91 };
92 auto on_set = [&inlet, &ctx](const QString& filename) {
93 if(filename.isEmpty())
94 return;
95
96 CommandDispatcher<>{ctx.commandStack}
97 .submit<WidgetFactory::SetControlValue<Control_T>>(
98 inlet, filename.toStdString());
99 };
100 QObject::connect(bt, &score::QGraphicsWaveformButton::pressed, &inlet, on_open);
101 QObject::connect(bt, &score::QGraphicsWaveformButton::dropped, &inlet, on_set);
102 auto set = [bt, &ctx](const ossia::value& val) {
103 auto str = QString::fromStdString(ossia::convert<std::string>(val));
104 if(str != bt->text())
105 {
106 if(!str.isEmpty())
107 bt->setFile(str, score::locateFilePath(str, ctx));
108 else
109 bt->setFile({}, {});
110 }
111 };
112
113 set(slider.value());
114 QObject::connect(&inlet, &Control_T::valueChanged, bt, set);
115
116 return bt;
117 }
118};
119}
The CommandDispatcher class.
Definition CommandDispatcher.hpp:13
Definition AudioFileChooserWidget.hpp:23
bool hasWaveform() const noexcept
Definition AudioFileChooserWidget.hpp:39
Base toolkit upon which the software is built.
Definition Application.cpp:117
QString locateFilePath(const QString &filename) noexcept
Definition File.cpp:84
QString pickerStartFolder(const QString &current, const score::DocumentContext &ctx) noexcept
Definition File.cpp:288
Definition WaveformComputer.hpp:55
Definition plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:1109
Definition DocumentContext.hpp:18