Skip to content

Commit

Permalink
More work
Browse files Browse the repository at this point in the history
  • Loading branch information
abique committed Sep 17, 2024
1 parent c623d87 commit 10e7293
Show file tree
Hide file tree
Showing 12 changed files with 88 additions and 13 deletions.
1 change: 1 addition & 0 deletions plugins/core-plugin.cc
Original file line number Diff line number Diff line change
Expand Up @@ -174,6 +174,7 @@ namespace clap {
guiDefineParameters();
guiDefineTrackInfo();
guiSubscribeUndo();
guiPopulateProperties();

auto skinPath = _pathProvider->getQmlSkinPath();
_guiHandle->gui().addImportPath(_pathProvider->getQmlLibraryPath());
Expand Down
5 changes: 4 additions & 1 deletion plugins/core-plugin.hh
Original file line number Diff line number Diff line change
Expand Up @@ -54,6 +54,8 @@ namespace clap {
const TuningProvider &tuningProvider() const noexcept { return _tuningProvider; }

protected:
bool enableDraftExtensions() const noexcept override { return true; }

//-------------//
// clap_plugin //
//-------------//
Expand Down Expand Up @@ -152,7 +154,7 @@ namespace clap {
bool stateLoad(const clap_istream *stream) noexcept override;

virtual std::vector<uint8_t> stateSaveExtra() noexcept { return {}; }
virtual bool stateLoadExtra(const std::vector<uint8_t>& data) noexcept { return true; }
virtual bool stateLoadExtra(const std::vector<uint8_t> &data) noexcept { return true; }

#ifndef CLAP_PLUGINS_HEADLESS
//-----------------//
Expand All @@ -174,6 +176,7 @@ namespace clap {
void guiDefineParameters();
void guiSubscribeUndo();
void guiUnsubscribeUndo();
virtual void guiPopulateProperties() {}

//---------------------//
// AbstractGuiListener //
Expand Down
5 changes: 5 additions & 0 deletions plugins/gui/abstract-gui.hh
Original file line number Diff line number Diff line change
Expand Up @@ -3,19 +3,24 @@
#include <clap/clap.h>

#include <string>
#include <variant>

namespace clap {

class CorePlugin;
class AbstractGuiListener;
class AbstractGui {
public:
using PropertyValue = std::variant<bool, int64_t, double, std::string>;

AbstractGui(AbstractGuiListener &listener);
virtual ~AbstractGui();

virtual void addImportPath(const std::string& importPath) = 0;
virtual void setSkin(const std::string& skinUrl) = 0;

virtual void setGuiProperty(const std::string& name, const PropertyValue& value) = 0;

virtual void defineParameter(const clap_param_info &paramInfo) = 0;
virtual void updateParameter(clap_id paramId, double value, double modAmount) = 0;
virtual void setParameterMappingIndication(clap_id paramId, bool hasIndication, clap_color color, const char *label, const char *description) = 0;
Expand Down
5 changes: 5 additions & 0 deletions plugins/gui/gui.cc
Original file line number Diff line number Diff line change
Expand Up @@ -55,6 +55,11 @@ namespace clap {
_quickView->setSource(QUrl(skinUrl.c_str()));
}

void Gui::setGuiProperty(const std::string &name, const PropertyValue &value)
{
_pluginProxy->setGuiProperty(name, value);
}

void Gui::defineParameter(const clap_param_info &paramInfo) {
qDebug() << "clap-gui: defineParam(" << paramInfo.id << ")";
_pluginProxy->defineParameter(paramInfo);
Expand Down
2 changes: 2 additions & 0 deletions plugins/gui/gui.hh
Original file line number Diff line number Diff line change
Expand Up @@ -35,6 +35,8 @@ namespace clap {
void addImportPath(const std::string &importPath) override;
void setSkin(const std::string &skinPath) override;

void setGuiProperty(const std::string &name, const PropertyValue &value) override;

void defineParameter(const clap_param_info &paramInfo) override;
void updateParameter(clap_id paramId, double value, double modAmount) override;
void setParameterMappingIndication(clap_id paramId,
Expand Down
15 changes: 14 additions & 1 deletion plugins/gui/plugin-proxy.cc
Original file line number Diff line number Diff line change
@@ -1,7 +1,9 @@
#include "plugin-proxy.hh"
#include <variant>

#include "../modules/module.hh"
#include "abstract-gui-listener.hh"
#include "gui.hh"
#include "plugin-proxy.hh"

namespace clap {
PluginProxy::PluginProxy(Gui &client) : super(&client), _client(client) {}
Expand Down Expand Up @@ -46,4 +48,15 @@ namespace clap {
}
_client.guiListener().onGuiInvoke(method.toStdString(), targetArgs);
}

void PluginProxy::setGuiProperty(const std::string &name,
const AbstractGui::PropertyValue &value) {
const auto qname = QString::fromStdString(name);
const auto qvalue = QVariant::fromStdVariant(value);

_properties.insert(qname, qvalue);
guiPropertiesChanged();
}

const QVariantMap &PluginProxy::guiProperties() const noexcept { return _properties; }
} // namespace clap
12 changes: 12 additions & 0 deletions plugins/gui/plugin-proxy.hh
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@
#include <unordered_map>

#include <QObject>
#include <QVariantMap>

#include <clap/clap.h>

#include "abstract-gui.hh"
#include "parameter-proxy.hh"

namespace clap {
Expand All @@ -16,9 +18,17 @@ namespace clap {

Q_OBJECT

Q_PROPERTY(QVariantMap props READ guiProperties NOTIFY guiPropertiesChanged)

signals:
void guiPropertiesChanged();

public:
explicit PluginProxy(Gui &client);

void setGuiProperty(const std::string &name, const AbstractGui::PropertyValue &value);
const QVariantMap &guiProperties() const noexcept;

void defineParameter(const clap_param_info &info);

Q_INVOKABLE ParameterProxy *param(clap_id paramId);
Expand All @@ -30,6 +40,8 @@ namespace clap {
private:
Gui &_client;
std::unordered_map<clap_id, ParameterProxy *> _parameters;

QVariantMap _properties;
};

} // namespace clap
3 changes: 3 additions & 0 deletions plugins/gui/qml/clap/skins/undo-test/main.qml
Original file line number Diff line number Diff line change
Expand Up @@ -35,5 +35,8 @@ Rectangle {
text: "Do something"
onClicked: plugin.invoke("incrementState")
}
Text {
text: plugin.props["counter"]
}
}
}
5 changes: 5 additions & 0 deletions plugins/gui/threaded-gui-proxy.cc
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,11 @@ namespace clap {
_gui.get(), [=, this] { _gui->setSkin(skinUrl); }, Qt::QueuedConnection);
}

void ThreadedGuiProxy::setGuiProperty(const std::string &name, const PropertyValue &value) {
QMetaObject::invokeMethod(
_gui.get(), [=, this] { _gui->setGuiProperty(name, value); }, Qt::QueuedConnection);
}

void ThreadedGuiProxy::defineParameter(const clap_param_info &paramInfo) {
QMetaObject::invokeMethod(
_gui.get(), [=, this] { _gui->defineParameter(paramInfo); }, Qt::QueuedConnection);
Expand Down
4 changes: 3 additions & 1 deletion plugins/gui/threaded-gui-proxy.hh
Original file line number Diff line number Diff line change
Expand Up @@ -8,14 +8,16 @@ namespace clap {

class Gui;

class ThreadedGuiProxy : public AbstractGui {
class ThreadedGuiProxy final : public AbstractGui {
public:
ThreadedGuiProxy(AbstractGuiListener &listener, std::shared_ptr<Gui> &guiClient);
~ThreadedGuiProxy() override;

void addImportPath(const std::string &importPath) override;
void setSkin(const std::string &skinUrl) override;

void setGuiProperty(const std::string &name, const PropertyValue &value) override;

void defineParameter(const clap_param_info &paramInfo) override;
void updateParameter(clap_id paramId, double value, double modAmount) override;
void setParameterMappingIndication(clap_id paramId,
Expand Down
4 changes: 3 additions & 1 deletion plugins/plugs/undo-test/undo-test.hh
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,8 @@ namespace clap {
bool undoRedo(clap_id format_version, const void *delta, size_t delta_size) noexcept override;

void incrementState();
void notifyGuiStateProperties();
void guiPopulateProperties() override;

#ifndef CLAP_PLUGINS_HEADLESS
void onGuiInvoke(
Expand All @@ -35,6 +37,6 @@ namespace clap {
#endif

private:
uint32_t _state{0};
uint32_t _counter{0};
};
} // namespace clap
40 changes: 31 additions & 9 deletions plugins/plugs/undo-test/undo-test.hxx
Original file line number Diff line number Diff line change
@@ -1,5 +1,7 @@
#include <cstring>

#include "../gui/abstract-gui.hh"
#include "../gui/gui-handle.hh"
#include "undo-test.hh"

namespace clap {
Expand Down Expand Up @@ -94,10 +96,12 @@ namespace clap {
auto undoDelta = static_cast<const UndoDelta *>(delta);

char buffer[128];
snprintf(buffer, sizeof(buffer), "UNDO undo %d -> %d", _state, undoDelta->old_value);
snprintf(buffer, sizeof(buffer), "UNDO undo %d -> %d", _counter, undoDelta->old_value);
_host.log(CLAP_LOG_INFO, buffer);

_state = undoDelta->old_value;
_counter = undoDelta->old_value;

notifyGuiStateProperties();
return true;
}

Expand All @@ -121,10 +125,12 @@ namespace clap {
auto undoDelta = static_cast<const UndoDelta *>(delta);

char buffer[128];
snprintf(buffer, sizeof(buffer), "UNDO redo %d -> %d", _state, undoDelta->new_value);
snprintf(buffer, sizeof(buffer), "UNDO redo %d -> %d", _counter, undoDelta->new_value);
_host.log(CLAP_LOG_INFO, buffer);

_state = undoDelta->new_value;
_counter = undoDelta->new_value;

notifyGuiStateProperties();
return true;
}

Expand All @@ -134,8 +140,8 @@ namespace clap {
return;

UndoDelta delta;
delta.old_value = _state;
delta.new_value = ++_state;
delta.old_value = _counter;
delta.new_value = ++_counter;

char buffer[128];
snprintf(buffer, sizeof(buffer), "UNDO increment %d -> %d", delta.old_value, delta.new_value);
Expand All @@ -145,6 +151,8 @@ namespace clap {
_host.undoChangeMade(buffer, &delta, sizeof(delta), true);
else
_host.undoChangeMade(buffer, nullptr, 0, 0);

notifyGuiStateProperties();
}

template <bool hasDelta, bool areDeltasPersistant>
Expand All @@ -168,19 +176,33 @@ namespace clap {
else
super::onGuiInvoke(method, args);
}

template <bool hasDelta, bool areDeltasPersistant>
void UndoTest<hasDelta, areDeltasPersistant>::guiPopulateProperties() {
super::guiPopulateProperties();
notifyGuiStateProperties();
}
#endif

template <bool hasDelta, bool areDeltasPersistant>
void UndoTest<hasDelta, areDeltasPersistant>::notifyGuiStateProperties() {
#ifndef CLAP_PLUGINS_HEADLESS
if (_guiHandle)
_guiHandle->gui().setGuiProperty("counter", _counter);
#endif
}

template <bool hasDelta, bool areDeltasPersistant>
std::vector<uint8_t> UndoTest<hasDelta, areDeltasPersistant>::stateSaveExtra() noexcept {
return std::vector<uint8_t>((const uint8_t *)&_state, (const uint8_t *)(&_state + 1));
return std::vector<uint8_t>((const uint8_t *)&_counter, (const uint8_t *)(&_counter + 1));
}

template <bool hasDelta, bool areDeltasPersistant>
bool UndoTest<hasDelta, areDeltasPersistant>::stateLoadExtra(
const std::vector<uint8_t> &data) noexcept {
if (data.size() != sizeof(_state))
if (data.size() != sizeof(_counter))
return false;
_state = *(const uint32_t *)data.data();
_counter = *(const uint32_t *)data.data();
return true;
}

Expand Down

0 comments on commit 10e7293

Please sign in to comment.