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