25 #include <json-c/json.h>
33 this->inputEditorManager = inputEditorManager;
34 this->composition = composition;
35 this->sidebar = sidebar;
36 this->window = window;
37 portWithOpenInputEditor =
nullptr;
50 showInputEditor(port, forwardTabTraversal);
59 map<VuoRendererPort *, pair<string, string> > startAndFinalValues;
60 for (
auto i : startValueForPort)
61 startAndFinalValues[i.first].first = i.second;
62 for (
auto i : finalValueForPort)
63 startAndFinalValues[i.first].second = i.second;
67 QGraphicsSceneMouseEvent releaseEvent(QEvent::GraphicsSceneMouseRelease);
68 releaseEvent.setScenePos(firstPortLeftCenterGlobal);
69 releaseEvent.setButton(Qt::LeftButton);
70 QApplication::sendEvent(
this, &releaseEvent);
72 QCoreApplication::processEvents();
75 return startAndFinalValues;
81 void VuoInputEditorSession::showInputEditor(
VuoRendererPort *port,
bool forwardTabTraversal)
86 string originalValueAsString;
95 bool isPublishedInput = !port->
getInput();
110 inputEditor->setParent(window);
112 inputEditor->installEventFilter(
this);
114 QPoint portCenterGlobal;
121 QPoint portCenterInScene = port->scenePos().toPoint();
122 QPoint portCenterInView = composition->views()[0]->mapFromScene(portCenterInScene);
123 portCenterGlobal = composition->views()[0]->mapToGlobal(portCenterInView);
125 QPoint portLeftCenterGlobal = portCenterGlobal - QPoint(port->
getPortRect().width()/2., 0);
127 if (startValueForPort.empty())
128 firstPortLeftCenterGlobal = portLeftCenterGlobal;
130 json_object *originalValue = json_tokener_parse(originalValueAsString.c_str());
133 vector<pair<QString, json_object *> > portConstants;
142 portWithOpenInputEditor = port;
144 connect(inputEditor, SIGNAL(valueChanged(
json_object *)),
this, SLOT(updateValueForEditedPort(
json_object *)));
155 if (startValueForPort.find(port) == startValueForPort.end())
157 startValueForPort[port] = originalValueAsString;
164 if (!details || json_object_get_type(details) != json_type_object)
165 details = json_object_new_object();
181 if (json_object_object_get_ex(hostDetails,
"suggestedMin", &suggestedMinValue))
182 json_object_object_add(details,
"suggestedMin", json_object_get(suggestedMinValue));
186 if (json_object_object_get_ex(hostDetails,
"suggestedMax", &suggestedMaxValue))
187 json_object_object_add(details,
"suggestedMax", json_object_get(suggestedMaxValue));
191 if (json_object_object_get_ex(hostDetails,
"suggestedStep", &suggestedStepValue))
192 json_object_object_add(details,
"suggestedStep", json_object_get(suggestedStepValue));
200 json_object_object_add(details,
"isDark", json_object_new_boolean(editor->
isInterfaceDark()));
201 json_object_object_add(details,
"forwardTabTraversal", json_object_new_boolean(forwardTabTraversal));
203 map<QString, json_object *> portNameToConstantValueMap(portConstants.begin(), portConstants.end());
204 json_object *newValue = inputEditor->
show(portLeftCenterGlobal, originalValue, details, portNameToConstantValueMap);
205 string newValueAsString = json_object_to_json_string_ext(newValue, JSON_C_TO_STRING_PLAIN);
209 if (finalValueForPort.find(port) == finalValueForPort.end())
210 finalValueForPort[port] = newValueAsString;
212 disconnect(inputEditor, 0,
this, 0);
213 inputEditor->deleteLater();
223 void VuoInputEditorSession::showPreviousInputEditor()
228 if (! portWithOpenInputEditor)
246 vector<QString> portsWithEligibleInputEditors;
247 for (vector<pair<QString, json_object *> >::iterator i = portConstants.begin(); i != portConstants.end(); ++i)
252 if (currentPortClass)
255 if (currentPortDataEditor)
258 portsWithEligibleInputEditors.push_back(i->first);
260 currentPortDataEditor->deleteLater();
264 if (portsWithEligibleInputEditors.empty())
267 QString previousPortName =
"";
268 bool referencePortJustTraversed =
false;
269 for (vector<QString>::reverse_iterator ri = portsWithEligibleInputEditors.rbegin(); ri != portsWithEligibleInputEditors.rend(); ++ri)
271 QString currentPortName = *ri;
273 if (referencePortJustTraversed)
275 previousPortName = currentPortName;
276 referencePortJustTraversed =
false;
280 referencePortJustTraversed = (currentPortName == portName);
283 if (referencePortJustTraversed)
284 previousPortName = portsWithEligibleInputEditors.back();
287 showInputEditor(previousPort,
false);
295 void VuoInputEditorSession::showNextInputEditor()
300 if (! portWithOpenInputEditor)
318 vector<QString> portsWithEligibleInputEditors;
319 for (vector<pair<QString, json_object *> >::iterator i = portConstants.begin(); i != portConstants.end(); ++i)
324 if (currentPortClass)
327 if (currentPortDataEditor)
330 portsWithEligibleInputEditors.push_back(i->first);
332 currentPortDataEditor->deleteLater();
336 if (portsWithEligibleInputEditors.empty())
339 QString nextPortName =
"";
340 bool referencePortJustTraversed =
false;
341 foreach (QString currentPortName, portsWithEligibleInputEditors)
343 if (referencePortJustTraversed)
345 nextPortName = currentPortName;
346 referencePortJustTraversed =
false;
350 referencePortJustTraversed = (currentPortName == portName);
353 if (referencePortJustTraversed)
354 nextPortName = portsWithEligibleInputEditors.front();
357 showInputEditor(nextPort,
true);
364 void VuoInputEditorSession::updateValueForEditedPort(
json_object *newValue)
366 if (! portWithOpenInputEditor)
376 string newValueAsString = json_object_to_json_string_ext(newValue, JSON_C_TO_STRING_PLAIN);
392 if (object->metaObject() && !strcmp(object->metaObject()->className(),
"VuoInputEditorText"))
394 if (event->type() == QEvent::Drop)
396 QDropEvent *filteredDropEvent =
static_cast<QDropEvent *
>(event);
408 const QMimeData *mimeData = filteredDropEvent->mimeData();
409 QList<QUrl> urls = mimeData->urls();
410 if (urls.size() == 1)
412 QString filePath = (useAbsoluteFilePaths? urls[0].path() : compositionDir.relativeFilePath(urls[0].path()));
414 QList<QUrl> modifiedUrls;
415 modifiedUrls.append(filePath);
416 QMimeData *modifiedMimeData =
new QMimeData();
417 modifiedMimeData->setUrls(modifiedUrls);
419 filteredDropEvent->accept();
421 QDropEvent *modifiedDropEvent =
new QDropEvent(
422 filteredDropEvent->pos(),
423 filteredDropEvent->possibleActions(),
425 filteredDropEvent->mouseButtons(),
426 filteredDropEvent->keyboardModifiers(),
427 filteredDropEvent->type());
429 object->removeEventFilter(
this);
430 QApplication::sendEvent(
object, modifiedDropEvent);
431 object->installEventFilter(
this);
439 else if (event->type() == QEvent::DragEnter)
441 QDropEvent *filteredDragEnterEvent =
static_cast<QDragEnterEvent *
>(event);
442 const QMimeData *mimeData = filteredDragEnterEvent->mimeData();
445 if (mimeData->hasFormat(
"text/uri-list"))
447 QList<QUrl> urls = mimeData->urls();
448 if (urls.size() == 1)
451 filteredDragEnterEvent->setDropAction(Qt::IgnoreAction);
454 filteredDragEnterEvent->setDropAction(Qt::IgnoreAction);
459 else if (event->type() == QEvent::DragMove)
465 else if (event->type() == QEvent::DragLeave)
467 (
static_cast<QDragLeaveEvent *
>(event))->accept();
472 return QObject::eventFilter(
object, event);