diff --git a/include/rive/command_queue.hpp b/include/rive/command_queue.hpp index 77051af5..4dcfe7a7 100644 --- a/include/rive/command_queue.hpp +++ b/include/rive/command_queue.hpp @@ -269,6 +269,12 @@ class CommandQueue : public RefCnt std::string path, size_t size) {} + + virtual void onViewModelInstanceNameReceived( + const ViewModelInstanceHandle, + uint64_t requestId, + std::string name) + {} }; class StateMachineListener @@ -631,6 +637,9 @@ class CommandQueue : public RefCnt std::string path, uint64_t requestId = 0); + void requestViewModelInstanceName(ViewModelInstanceHandle, + uint64_t requestId = 0); + void requestStateMachineNames(ArtboardHandle, uint64_t requestId = 0); void requestDefaultViewModelInfo(ArtboardHandle, FileHandle, @@ -826,7 +835,8 @@ class CommandQueue : public RefCnt listViewModelInstanceNames, listViewModelProperties, listViewModelPropertyValue, - getViewModelListSize + getViewModelListSize, + getViewModelInstanceName }; enum class Message @@ -842,6 +852,7 @@ class CommandQueue : public RefCnt viewModelPropertiesListed, viewModelPropertyValueReceived, viewModelListSizeReceived, + viewModelInstanceNameReceived, fileLoaded, fileDeleted, imageDecoded, diff --git a/src/command_queue.cpp b/src/command_queue.cpp index 2c0d6955..cbf6b301 100644 --- a/src/command_queue.cpp +++ b/src/command_queue.cpp @@ -998,6 +998,16 @@ void CommandQueue::requestViewModelInstanceListSize( m_names << path; } +void CommandQueue::requestViewModelInstanceName( + ViewModelInstanceHandle handle, + uint64_t requestId) +{ + AutoLockAndNotify lock(m_commandMutex, m_commandConditionVariable); + m_commandStream << Command::getViewModelInstanceName; + m_commandStream << handle; + m_commandStream << requestId; +} + void CommandQueue::requestStateMachineNames(ArtboardHandle artboardHandle, uint64_t requestId) { @@ -1379,6 +1389,33 @@ void CommandQueue::processMessages() break; } + case Message::viewModelInstanceNameReceived: + { + ViewModelInstanceHandle handle; + std::string name; + uint64_t requestId; + m_messageStream >> handle; + m_messageStream >> requestId; + m_messageNames >> name; + lock.unlock(); + if (m_globalViewModelListener) + { + m_globalViewModelListener + ->onViewModelInstanceNameReceived(handle, + requestId, + name); + } + auto itr = m_viewModelListeners.find(handle); + if (itr != m_viewModelListeners.end()) + { + itr->second->onViewModelInstanceNameReceived( + handle, + requestId, + std::move(name)); + } + break; + } + case Message::fileLoaded: { FileHandle handle; diff --git a/src/command_server.cpp b/src/command_server.cpp index 05109160..8d74e925 100644 --- a/src/command_server.cpp +++ b/src/command_server.cpp @@ -2624,6 +2624,37 @@ bool CommandServer::processCommands() break; } + case CommandQueue::Command::getViewModelInstanceName: + { + ViewModelInstanceHandle handle; + uint64_t requestId; + commandStream >> handle; + commandStream >> requestId; + lock.unlock(); + + if (auto viewModel = getViewModelInstance(handle)) + { + std::unique_lock messageLock( + m_commandQueue->m_messageMutex); + messageStream + << CommandQueue::Message::viewModelInstanceNameReceived; + messageStream << handle; + messageStream << requestId; + m_commandQueue->m_messageNames << viewModel->name(); + } + else + { + ErrorReporter( + this, + handle, + requestId, + CommandQueue::Message::viewModelError) + << "failed to get view model instance " << handle + << " when getting instance name"; + } + break; + } + case CommandQueue::Command::pointerMove: { StateMachineHandle handle;