Fully implement IContextMenuTarget

This commit is contained in:
Robbert van der Helm
2021-01-06 23:58:05 +01:00
parent 26eb8ac1f3
commit 5d0df7febe
9 changed files with 57 additions and 8 deletions
+1
View File
@@ -170,6 +170,7 @@ bool Vst3Logger::log_request(
const YaContextMenuTarget::ExecuteMenuItem& request) { const YaContextMenuTarget::ExecuteMenuItem& request) {
return log_request_base(is_host_vst, [&](auto& message) { return log_request_base(is_host_vst, [&](auto& message) {
message << request.owner_instance_id << ": <IContextMenuTarget* #" message << request.owner_instance_id << ": <IContextMenuTarget* #"
<< " #" << request.target_tag
<< ">::executeMenuItem(tag = " << request.tag << ")"; << ">::executeMenuItem(tag = " << request.tag << ")";
}); });
} }
+1
View File
@@ -74,6 +74,7 @@ using ControlRequest =
YaConnectionPoint::Connect, YaConnectionPoint::Connect,
YaConnectionPoint::Disconnect, YaConnectionPoint::Disconnect,
YaConnectionPoint::Notify, YaConnectionPoint::Notify,
YaContextMenuTarget::ExecuteMenuItem,
YaEditController::SetComponentState, YaEditController::SetComponentState,
YaEditController::GetParameterCount, YaEditController::GetParameterCount,
YaEditController::GetParameterInfo, YaEditController::GetParameterInfo,
@@ -129,7 +129,7 @@ class Vst3ContextMenuProxy : public YaContextMenu {
} }
/** /**
* Get the unique ID for this context menu * Get the unique ID for this context menu.
*/ */
inline size_t context_menu_id() const { return arguments.context_menu_id; } inline size_t context_menu_id() const { return arguments.context_menu_id; }
@@ -18,8 +18,11 @@
YaContextMenuTarget::ConstructArgs::ConstructArgs( YaContextMenuTarget::ConstructArgs::ConstructArgs(
native_size_t owner_instance_id, native_size_t owner_instance_id,
native_size_t context_menu_id) native_size_t context_menu_id,
: owner_instance_id(owner_instance_id), context_menu_id(context_menu_id) {} int32 tag)
: owner_instance_id(owner_instance_id),
context_menu_id(context_menu_id),
tag(tag) {}
YaContextMenuTarget::YaContextMenuTarget(const ConstructArgs&& args) YaContextMenuTarget::YaContextMenuTarget(const ConstructArgs&& args)
: arguments(std::move(args)){FUNKNOWN_CTOR} : arguments(std::move(args)){FUNKNOWN_CTOR}
@@ -47,17 +47,21 @@ class YaContextMenuTarget : public Steinberg::Vst::IContextMenuTarget {
* context menu belongs to. * context menu belongs to.
* @param context_menu_id The unique ID of the context menu requested by * @param context_menu_id The unique ID of the context menu requested by
* `owwner_instance_id`. * `owwner_instance_id`.
* @param tag The tag of the menu item this target belongs to.
*/ */
ConstructArgs(native_size_t owner_instance_id, ConstructArgs(native_size_t owner_instance_id,
native_size_t context_menu_id); native_size_t context_menu_id,
int32 tag);
native_size_t owner_instance_id; native_size_t owner_instance_id;
native_size_t context_menu_id; native_size_t context_menu_id;
int32 tag;
template <typename S> template <typename S>
void serialize(S& s) { void serialize(S& s) {
s.value8b(owner_instance_id); s.value8b(owner_instance_id);
s.value8b(context_menu_id); s.value8b(context_menu_id);
s.value4b(tag);
} }
}; };
@@ -71,6 +75,23 @@ class YaContextMenuTarget : public Steinberg::Vst::IContextMenuTarget {
DECLARE_FUNKNOWN_METHODS DECLARE_FUNKNOWN_METHODS
/**
* Get the instance ID of the owner of this object.
*/
inline size_t owner_instance_id() const {
return arguments.owner_instance_id;
}
/**
* Get the unique ID for the context menu this target belongs to.
*/
inline size_t context_menu_id() const { return arguments.context_menu_id; }
/**
* Get the tag of the menu item this target was passed to.
*/
inline int32 target_tag() const { return arguments.tag; }
/* /*
* Message to pass through a call to * Message to pass through a call to
* `IContextMenuTarget::executeMenuItem(tag)` to the proxied object provided * `IContextMenuTarget::executeMenuItem(tag)` to the proxied object provided
@@ -81,6 +102,11 @@ class YaContextMenuTarget : public Steinberg::Vst::IContextMenuTarget {
native_size_t owner_instance_id; native_size_t owner_instance_id;
native_size_t context_menu_id; native_size_t context_menu_id;
/**
* The tag this target was passed for. This should be the same as `tag`,
* but it doesn't have to be.
*/
int32 target_tag;
int32 tag; int32 tag;
@@ -88,6 +114,7 @@ class YaContextMenuTarget : public Steinberg::Vst::IContextMenuTarget {
void serialize(S& s) { void serialize(S& s) {
s.value8b(owner_instance_id); s.value8b(owner_instance_id);
s.value8b(context_menu_id); s.value8b(context_menu_id);
s.value4b(target_tag);
s.value4b(tag); s.value4b(tag);
} }
}; };
@@ -31,7 +31,9 @@ YaContextMenuTargetImpl::queryInterface(const Steinberg::TUID _iid,
} }
tresult PLUGIN_API YaContextMenuTargetImpl::executeMenuItem(int32 tag) { tresult PLUGIN_API YaContextMenuTargetImpl::executeMenuItem(int32 tag) {
// TODO: Implement return bridge.send_message(YaContextMenuTarget::ExecuteMenuItem{
bridge.logger.log("TODO: IContextMenuTarget::executeMenuItem()"); .owner_instance_id = owner_instance_id(),
return Steinberg::kNotImplemented; .context_menu_id = context_menu_id(),
.target_tag = target_tag(),
.tag = tag});
} }
@@ -47,7 +47,7 @@ Vst3ContextMenuProxyImpl::queryInterface(const Steinberg::TUID _iid,
int32 PLUGIN_API Vst3ContextMenuProxyImpl::getItemCount() { int32 PLUGIN_API Vst3ContextMenuProxyImpl::getItemCount() {
// TODO: Implement // TODO: Implement
std::cerr << "TODO: IContextMenu::getItemCount()" << std::endl; std::cerr << "TODO: IContextMenu::getItemCount()" << std::endl;
return Steinberg::kNotImplemented; return 0;
} }
tresult PLUGIN_API Vst3ContextMenuProxyImpl::getItem( tresult PLUGIN_API Vst3ContextMenuProxyImpl::getItem(
@@ -50,6 +50,13 @@ class Vst3ContextMenuProxyImpl : public Vst3ContextMenuProxy {
Steinberg::Vst::IContextMenuTarget* target) override; Steinberg::Vst::IContextMenuTarget* target) override;
tresult PLUGIN_API popup(Steinberg::UCoord x, Steinberg::UCoord y) override; tresult PLUGIN_API popup(Steinberg::UCoord x, Steinberg::UCoord y) override;
/**
* The targets passed when to `addItem` calls made by the plugin. This way
* we can call these same targets later.
*/
std::map<int32, Steinberg::IPtr<Steinberg::Vst::IContextMenuTarget>>
context_menu_targets;
private: private:
Vst3Bridge& bridge; Vst3Bridge& bridge;
}; };
+8
View File
@@ -261,6 +261,14 @@ void Vst3Bridge::run() {
.connection_point->notify( .connection_point->notify(
request.message_ptr.get_original()); request.message_ptr.get_original());
}, },
[&](YaContextMenuTarget::ExecuteMenuItem& request)
-> YaContextMenuTarget::ExecuteMenuItem::Response {
return object_instances[request.owner_instance_id]
.registered_context_menus.at(request.context_menu_id)
.get()
.context_menu_targets[request.target_tag]
->executeMenuItem(request.tag);
},
[&](YaEditController::SetComponentState& request) [&](YaEditController::SetComponentState& request)
-> YaEditController::SetComponentState::Response { -> YaEditController::SetComponentState::Response {
return object_instances[request.instance_id] return object_instances[request.instance_id]