You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

ovdCConnectorEditor.cpp 4.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "ovdCConnectorEditor.h"
  2. #include <map>
  3. #include <string>
  4. namespace OpenViBE {
  5. namespace Designer {
  6. static void reset_scenario_connector_identifier(GtkWidget* /*widget*/, CConnectorEditor* self)
  7. {
  8. const CIdentifier newID = self->m_Box.getUnusedInputIdentifier(CIdentifier::undefined());
  9. if (self->m_IDEntry && newID != CIdentifier::undefined()) { gtk_entry_set_text(self->m_IDEntry, newID.str().c_str()); }
  10. }
  11. bool CConnectorEditor::run()
  12. {
  13. //get_identifier_t getID;
  14. set_name_t setName;
  15. set_type_t setType;
  16. is_type_supported_t isTypeSupported;
  17. //update_identifier_t updateID;
  18. Kernel::EBoxInterfacorType interfacorType;
  19. switch (m_type)
  20. {
  21. case Box_Input:
  22. setName = &Kernel::IBox::setInputName;
  23. setType = &Kernel::IBox::setInputType;
  24. isTypeSupported = &Kernel::IBox::hasInputSupport;
  25. interfacorType = Kernel::Input;
  26. break;
  27. case Box_Output:
  28. setName = &Kernel::IBox::setOutputName;
  29. setType = &Kernel::IBox::setOutputType;
  30. isTypeSupported = &Kernel::IBox::hasOutputSupport;
  31. interfacorType = Kernel::Output;
  32. break;
  33. default:
  34. return false;
  35. }
  36. CString name;
  37. CIdentifier typeID;
  38. CIdentifier id;
  39. m_Box.getInterfacorIdentifier(interfacorType, m_index, id);
  40. m_Box.getInterfacorName(interfacorType, m_index, name);
  41. m_Box.getInterfacorType(interfacorType, m_index, typeID);
  42. GtkBuilder* builder = gtk_builder_new();
  43. gtk_builder_add_from_file(builder, m_guiFilename.c_str(), nullptr);
  44. gtk_builder_connect_signals(builder, nullptr);
  45. GtkWidget* dialog = GTK_WIDGET(gtk_builder_get_object(builder, "connector_editor"));
  46. GtkEntry* nameEntry = GTK_ENTRY(gtk_builder_get_object(builder, "connector_editor-connector_name_entry"));
  47. GtkComboBox* typeComboBox = GTK_COMBO_BOX(gtk_builder_get_object(builder, "connector_editor-connector_type_combobox"));
  48. m_IDEntry = GTK_ENTRY(gtk_builder_get_object(builder, "connector_editor-connector_identifier_entry"));
  49. GtkButton* idResetButton = GTK_BUTTON(gtk_builder_get_object(builder, "connector_editor-connector_identifier_reset_button"));
  50. gtk_list_store_clear(GTK_LIST_STORE(gtk_combo_box_get_model(typeComboBox)));
  51. gtk_window_set_title(GTK_WINDOW(dialog), m_title.c_str());
  52. if (m_Box.getAlgorithmClassIdentifier() == CIdentifier::undefined())
  53. {
  54. gtk_widget_show(GTK_WIDGET(gtk_builder_get_object(builder, "connector_editor-connector_identifier_label")));
  55. gtk_widget_show(GTK_WIDGET(m_IDEntry));
  56. gtk_widget_show(GTK_WIDGET(idResetButton));
  57. g_signal_connect(GTK_WIDGET(idResetButton), "clicked", G_CALLBACK(reset_scenario_connector_identifier), this);
  58. }
  59. //get a list of stream types and display connector type
  60. std::map<std::string, CIdentifier> streamTypes;
  61. gint active = -1;
  62. for (const auto& currentTypeID : m_kernelCtx.getTypeManager().getSortedTypes())
  63. {
  64. //First check if the type is support by the connector
  65. if ((m_Box.*isTypeSupported)(currentTypeID.first))
  66. {
  67. //If the input type is support by the connector, let's add it to the list
  68. if (m_kernelCtx.getTypeManager().isStream(currentTypeID.first))
  69. {
  70. gtk_combo_box_append_text(typeComboBox, currentTypeID.second.toASCIIString());
  71. if (currentTypeID.first == typeID)
  72. {
  73. active = gint(streamTypes.size());
  74. gtk_combo_box_set_active(typeComboBox, active);
  75. }
  76. streamTypes[currentTypeID.second.toASCIIString()] = currentTypeID.first;
  77. }
  78. }
  79. }
  80. //display connector name
  81. gtk_entry_set_text(nameEntry, name.toASCIIString());
  82. gtk_entry_set_text(m_IDEntry, id.str().c_str());
  83. bool finished = false;
  84. bool res = false;
  85. while (!finished)
  86. {
  87. const gint result = gtk_dialog_run(GTK_DIALOG(dialog));
  88. if (result == GTK_RESPONSE_APPLY)
  89. {
  90. char* activeText = gtk_combo_box_get_active_text(typeComboBox);
  91. if (activeText)
  92. {
  93. const auto newName = gtk_entry_get_text(nameEntry);
  94. auto newType = streamTypes[activeText];
  95. const auto newIdStr = gtk_entry_get_text(m_IDEntry);
  96. (m_Box.*setType)(m_index, newType);
  97. (m_Box.*setName)(m_index, newName);
  98. // If the connector identifier is valid then create a new one and swap it with the edited one
  99. // this is because we can not change the identifier of a setting
  100. CIdentifier newID;
  101. if (newID.fromString(newIdStr) && (newID != id)) { m_Box.updateInterfacorIdentifier(interfacorType, m_index, newID); }
  102. // (m_Box.*addConnector)(newName, newType);
  103. finished = true;
  104. res = true;
  105. }
  106. }
  107. else if (result == 2) // revert
  108. {
  109. m_Box.getInterfacorName(interfacorType, m_index, name);
  110. m_Box.getInterfacorType(interfacorType, m_index, typeID);
  111. gtk_entry_set_text(nameEntry, name.toASCIIString());
  112. gtk_combo_box_set_active(typeComboBox, active);
  113. }
  114. else
  115. {
  116. finished = true;
  117. res = false;
  118. }
  119. }
  120. gtk_widget_destroy(dialog);
  121. g_object_unref(builder);
  122. return res;
  123. }
  124. } //namespace Designer
  125. } //namespace OpenViBE