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.

ovdCBitMaskSettingView.cpp 2.5KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. #include "ovdCBitMaskSettingView.h"
  2. #include "../ovd_base.h"
  3. namespace OpenViBE {
  4. namespace Designer {
  5. namespace Setting {
  6. static void OnCheckbuttonPressed(GtkToggleButton* /*button*/, gpointer data) { static_cast<CBitMaskSettingView*>(data)->onChange(); }
  7. CBitMaskSettingView::CBitMaskSettingView(Kernel::IBox& box, const size_t index, CString& builderName, const Kernel::IKernelContext& ctx,
  8. const CIdentifier& typeID)
  9. : CAbstractSettingView(box, index, builderName, "settings_collection-table_setting_bitmask"), m_typeID(typeID), m_kernelCtx(ctx)
  10. {
  11. GtkWidget* settingWidget = CAbstractSettingView::getEntryFieldWidget();
  12. const gint tableSize = guint((m_kernelCtx.getTypeManager().getBitMaskEntryCount(m_typeID) + 1) >> 1);
  13. GtkTable* bitMaskTable = GTK_TABLE(settingWidget);
  14. gtk_table_resize(bitMaskTable, 2, tableSize);
  15. for (size_t i = 0; i < m_kernelCtx.getTypeManager().getBitMaskEntryCount(m_typeID); ++i)
  16. {
  17. CString name;
  18. uint64_t value;
  19. if (m_kernelCtx.getTypeManager().getBitMaskEntry(m_typeID, i, name, value))
  20. {
  21. GtkWidget* button = gtk_check_button_new();
  22. gtk_table_attach_defaults(bitMaskTable, button, guint(i & 1), guint((i & 1) + 1), guint(i >> 1), guint((i >> 1) + 1));
  23. gtk_button_set_label(GTK_BUTTON(button), name.toASCIIString());
  24. m_toggleButton.push_back(GTK_TOGGLE_BUTTON(button));
  25. g_signal_connect(G_OBJECT(button), "toggled", G_CALLBACK(OnCheckbuttonPressed), this);
  26. }
  27. }
  28. gtk_widget_show_all(GTK_WIDGET(bitMaskTable));
  29. CAbstractSettingView::initializeValue();
  30. }
  31. void CBitMaskSettingView::getValue(CString& value) const
  32. {
  33. std::string res;
  34. for (auto& toggle : m_toggleButton)
  35. {
  36. if (gtk_toggle_button_get_active(toggle))
  37. {
  38. if (!res.empty()) { res += ':'; }
  39. res += gtk_button_get_label(GTK_BUTTON(toggle));
  40. }
  41. }
  42. value = res.c_str();
  43. }
  44. void CBitMaskSettingView::setValue(const CString& value)
  45. {
  46. m_onValueSetting = true;
  47. const std::string str(value);
  48. for (auto& toggle : m_toggleButton)
  49. {
  50. const gchar* label = gtk_button_get_label(GTK_BUTTON(toggle));
  51. if (str.find(label) != std::string::npos) { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), true); }
  52. else { gtk_toggle_button_set_active(GTK_TOGGLE_BUTTON(toggle), false); }
  53. }
  54. m_onValueSetting = false;
  55. }
  56. void CBitMaskSettingView::onChange()
  57. {
  58. if (!m_onValueSetting)
  59. {
  60. CString value;
  61. this->getValue(value);
  62. getBox().setSettingValue(getSettingIndex(), value);
  63. }
  64. }
  65. } // namespace Setting
  66. } // namespace Designer
  67. } // namespace OpenViBE