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{
14class WaveformRenderer;
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;
44 void setFile(const QString& s, const QString& absolute);
45 QRectF boundingRect() const override;
46
47private:
48 void mousePressEvent(QGraphicsSceneMouseEvent* event) override;
49 void mouseMoveEvent(QGraphicsSceneMouseEvent* event) override;
50 void mouseReleaseEvent(QGraphicsSceneMouseEvent* event) override;
51
52 void dragEnterEvent(QGraphicsSceneDragDropEvent* event) override;
53 void dragMoveEvent(QGraphicsSceneDragDropEvent* event) override;
54 void dragLeaveEvent(QGraphicsSceneDragDropEvent* event) override;
55 void dropEvent(QGraphicsSceneDragDropEvent* event) override;
56
57 void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
58 final override;
59 QRectF m_rect;
60 QString m_string;
61 std::unique_ptr<Media::Sound::WaveformRenderer> m_waveform;
62};
63
64}
65namespace Media
66{
67
68struct AudioFileChooser : WidgetFactory::FileChooser
69{
70 template <typename T, typename Control_T>
71 static score::QGraphicsWaveformButton* make_item(
72 const T& slider, Control_T& inlet, const score::DocumentContext& ctx,
73 QGraphicsItem* parent, QObject* context)
74 {
75 auto bt = new score::QGraphicsWaveformButton{parent};
76 auto on_open = [&inlet, &ctx] {
77 const auto current = QString::fromStdString(ossia::convert<std::string>(inlet.value()));
78 WidgetFactory::openFileToImport(
79 inlet.filters(), score::pickerStartFolder(current, ctx),
80 [&inlet, &ctx](const QString& filename) {
81 // On wasm `filename` is the staged MEMFS path; relativize so it is
82 // stored consistently with drops.
83 auto path = score::relativizeFilePath(filename, ctx);
84 CommandDispatcher<>{ctx.commandStack}
85 .submit<WidgetFactory::SetControlValue<Control_T>>(
86 inlet, path.toStdString());
87 });
88 };
89 auto on_set = [&inlet, &ctx](const QString& filename) {
90 if(filename.isEmpty())
91 return;
92
93 CommandDispatcher<>{ctx.commandStack}
94 .submit<WidgetFactory::SetControlValue<Control_T>>(
95 inlet, filename.toStdString());
96 };
97 QObject::connect(bt, &score::QGraphicsWaveformButton::pressed, &inlet, on_open);
98 QObject::connect(bt, &score::QGraphicsWaveformButton::dropped, &inlet, on_set);
99 auto set = [bt, &ctx](const ossia::value& val) {
100 auto str = QString::fromStdString(ossia::convert<std::string>(val));
101 if(str != bt->text())
102 {
103 if(!str.isEmpty())
104 bt->setFile(str, score::locateFilePath(str, ctx));
105 else
106 bt->setFile({}, {});
107 }
108 };
109
110 set(slider.value());
111 QObject::connect(&inlet, &Control_T::valueChanged, bt, set);
112
113 return bt;
114 }
115};
116}
The CommandDispatcher class.
Definition CommandDispatcher.hpp:13
Definition AudioFileChooserWidget.hpp:23
Base toolkit upon which the software is built.
Definition Application.cpp:83
QString locateFilePath(const QString &filename) noexcept
Definition File.cpp:84
QString pickerStartFolder(const QString &current, const score::DocumentContext &ctx) noexcept
Definition File.cpp:293
Definition plugins/score-lib-process/Process/Dataflow/ControlWidgets.hpp:1266
Definition DocumentContext.hpp:18