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