mirror of
https://github.com/robbert-vdh/yabridge.git
synced 2026-05-09 20:29:10 +02:00
Fully implement IContextMenuTarget
This commit is contained in:
@@ -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 << ")";
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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;
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -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]
|
||||||
|
|||||||
Reference in New Issue
Block a user