Config.cpp 44 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761
  1. /*\
  2. |*| Copyright 2015-2016 bill-auger <https://github.com/bill-auger/av-caster/issues>
  3. |*|
  4. |*| This file is part of the AvCaster program.
  5. |*|
  6. |*| AvCaster is free software: you can redistribute it and/or modify
  7. |*| it under the terms of the GNU General Public License version 3
  8. |*| as published by the Free Software Foundation.
  9. |*|
  10. |*| AvCaster is distributed in the hope that it will be useful,
  11. |*| but WITHOUT ANY WARRANTY; without even the implied warranty of
  12. |*| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  13. |*| GNU General Public License for more details.
  14. |*|
  15. |*| You should have received a copy of the GNU General Public License
  16. |*| along with AvCaster. If not, see <http://www.gnu.org/licenses/>.
  17. \*/
  18. //[Headers] You can add your own extra header files here...
  19. #include "../Controllers/AvCaster.h"
  20. #include "../Trace/TraceConfig.h"
  21. //[/Headers]
  22. #include "Config.h"
  23. //[MiscUserDefs] You can add your own user definitions and misc code here...
  24. //[/MiscUserDefs]
  25. //==============================================================================
  26. Config::Config (MainContent* main_content)
  27. : mainContent(main_content)
  28. {
  29. addAndMakeVisible (configGroup = new GroupComponent ("configGroup",
  30. TRANS("Configuration")));
  31. configGroup->setColour (GroupComponent::outlineColourId, Colours::white);
  32. configGroup->setColour (GroupComponent::textColourId, Colours::white);
  33. addAndMakeVisible (screenButton = new TextButton ("screenButton"));
  34. screenButton->setExplicitFocusOrder (1);
  35. screenButton->setButtonText (TRANS("Screen"));
  36. screenButton->setConnectedEdges (Button::ConnectedOnBottom);
  37. addAndMakeVisible (cameraButton = new TextButton ("cameraButton"));
  38. cameraButton->setExplicitFocusOrder (2);
  39. cameraButton->setButtonText (TRANS("Camera"));
  40. cameraButton->setConnectedEdges (Button::ConnectedOnTop | Button::ConnectedOnBottom);
  41. addAndMakeVisible (audioButton = new TextButton ("audioButton"));
  42. audioButton->setExplicitFocusOrder (3);
  43. audioButton->setButtonText (TRANS("Audio"));
  44. audioButton->setConnectedEdges (Button::ConnectedOnTop | Button::ConnectedOnBottom);
  45. addAndMakeVisible (textButton = new TextButton ("textButton"));
  46. textButton->setExplicitFocusOrder (4);
  47. textButton->setButtonText (TRANS("Text"));
  48. textButton->setConnectedEdges (Button::ConnectedOnTop | Button::ConnectedOnBottom);
  49. addAndMakeVisible (imageButton = new TextButton ("imageButton"));
  50. imageButton->setExplicitFocusOrder (5);
  51. imageButton->setButtonText (TRANS("Image"));
  52. imageButton->setConnectedEdges (Button::ConnectedOnTop | Button::ConnectedOnBottom);
  53. addAndMakeVisible (outputButton = new TextButton ("outputButton"));
  54. outputButton->setExplicitFocusOrder (6);
  55. outputButton->setButtonText (TRANS("Output"));
  56. outputButton->setConnectedEdges (Button::ConnectedOnTop | Button::ConnectedOnBottom);
  57. addAndMakeVisible (chatButton = new TextButton ("chatButton"));
  58. chatButton->setExplicitFocusOrder (7);
  59. chatButton->setButtonText (TRANS("Chat"));
  60. chatButton->setConnectedEdges (Button::ConnectedOnTop);
  61. addAndMakeVisible (configPaneGroup = new GroupComponent ("configPaneGroup",
  62. TRANS("Screen")));
  63. configPaneGroup->setColour (GroupComponent::outlineColourId, Colours::white);
  64. configPaneGroup->setColour (GroupComponent::textColourId, Colours::white);
  65. addAndMakeVisible (configScreen = new ConfigScreen());
  66. configScreen->setName ("configScreen");
  67. addAndMakeVisible (configCamera = new ConfigCamera());
  68. configCamera->setName ("configCamera");
  69. addAndMakeVisible (configAudio = new ConfigAudio());
  70. configAudio->setName ("configAudio");
  71. addAndMakeVisible (configText = new ConfigText());
  72. configText->setName ("configText");
  73. addAndMakeVisible (configImage = new ConfigImage());
  74. configImage->setName ("configImage");
  75. addAndMakeVisible (configOutput = new ConfigOutput());
  76. configOutput->setName ("configOutput");
  77. addAndMakeVisible (configChat = new ConfigChat());
  78. configChat->setName ("configChat");
  79. addAndMakeVisible (dummyConfigPane = new Component());
  80. dummyConfigPane->setName ("dummyConfigPane");
  81. addAndMakeVisible (hintsGroup = new GroupComponent ("hintsGroup",
  82. TRANS("Hints")));
  83. hintsGroup->setColour (GroupComponent::outlineColourId, Colours::white);
  84. hintsGroup->setColour (GroupComponent::textColourId, Colours::white);
  85. addAndMakeVisible (hintsText = new TextEditor ("hintsText"));
  86. hintsText->setMultiLine (true);
  87. hintsText->setReturnKeyStartsNewLine (false);
  88. hintsText->setReadOnly (true);
  89. hintsText->setScrollbarsShown (true);
  90. hintsText->setCaretVisible (false);
  91. hintsText->setPopupMenuEnabled (false);
  92. hintsText->setColour (TextEditor::textColourId, Colours::white);
  93. hintsText->setColour (TextEditor::backgroundColourId, Colour (0x00000000));
  94. hintsText->setColour (TextEditor::highlightColourId, Colour (0x00000000));
  95. hintsText->setColour (TextEditor::outlineColourId, Colour (0x00000000));
  96. hintsText->setColour (TextEditor::shadowColourId, Colour (0x00000000));
  97. hintsText->setText (String::empty);
  98. //[UserPreSize]
  99. //[/UserPreSize]
  100. setSize (1, 1);
  101. //[Constructor] You can add your own custom stuff here..
  102. // establish local handles to child Component widgets
  103. this->displaySlider = this->configScreen->displaySlider ;
  104. this->screenSlider = this->configScreen->screenSlider ;
  105. this->screenWidthText = this->configScreen->screenWidthText ;
  106. this->screenHeightText = this->configScreen->screenHeightText ;
  107. this->xOffsetText = this->configScreen->xOffsetText ;
  108. this->yOffsetText = this->configScreen->yOffsetText ;
  109. this->cameraDevCombo = this->configCamera->cameraDevCombo ;
  110. this->cameraResCombo = this->configCamera->cameraResCombo ;
  111. this->audioApiCombo = this->configAudio ->audioApiCombo ;
  112. this->audioDevCombo = this->configAudio ->audioDevCombo ;
  113. this->audioCodecCombo = this->configAudio ->audioCodecCombo ;
  114. this->nChannelsSlider = this->configAudio ->nChannelsSlider ;
  115. this->samplerateCombo = this->configAudio ->samplerateCombo ;
  116. this->audioBitrateCombo = this->configAudio ->audioBitrateCombo ;
  117. this->motdText = this->configText ->motdText ;
  118. this->textStyleCombo = this->configText ->textStyleCombo ;
  119. this->textPosCombo = this->configText ->textPosCombo ;
  120. this->interstitialText = this->configImage ->interstitialText ;
  121. this->browseButton = this->configImage ->browseButton ;
  122. this->outputSinkCombo = this->configOutput->outputSinkCombo ;
  123. this->outputWidthText = this->configOutput->outputWidthText ;
  124. this->outputHeightText = this->configOutput->outputHeightText ;
  125. this->framerateCombo = this->configOutput->framerateCombo ;
  126. this->videoBitrateCombo = this->configOutput->videoBitrateCombo ;
  127. this->outputDestLabel = this->configOutput->outputDestLabel ;
  128. this->outputDestText = this->configOutput->outputDestText ;
  129. this->networkText = this->configChat ->networkText ;
  130. this->portText = this->configChat ->portText ;
  131. this->nickText = this->configChat ->nickText ;
  132. this->passText = this->configChat ->passText ;
  133. this->channelText = this->configChat ->channelText ;
  134. this->greetingText = this->configChat ->greetingText ;
  135. this->timestampToggle = this->configChat ->timestampToggle ;
  136. this->joinPartToggle = this->configChat ->joinPartToggle ;
  137. // configure look and feel , validations, and listeners
  138. Button ::Listener* this_button_listener = static_cast<Button ::Listener*>(this) ;
  139. Slider ::Listener* this_slider_listener = static_cast<Slider ::Listener*>(this) ;
  140. TextEditor::Listener* this_text_listener = static_cast<TextEditor::Listener*>(this) ;
  141. ComboBox ::Listener* this_combobox_listener = static_cast<ComboBox ::Listener*>(this) ;
  142. this->mainContent->configureButton(this->screenButton , this_button_listener) ;
  143. this->mainContent->configureButton(this->cameraButton , this_button_listener) ;
  144. this->mainContent->configureButton(this->audioButton , this_button_listener) ;
  145. this->mainContent->configureButton(this->textButton , this_button_listener) ;
  146. this->mainContent->configureButton(this->imageButton , this_button_listener) ;
  147. this->mainContent->configureButton(this->outputButton , this_button_listener) ;
  148. this->mainContent->configureButton(this->chatButton , this_button_listener) ;
  149. this->mainContent->configureButton(this->browseButton , this_button_listener) ;
  150. this->mainContent->configureButton(this->timestampToggle , this_button_listener) ;
  151. this->mainContent->configureButton(this->joinPartToggle , this_button_listener) ;
  152. this->mainContent->configureSlider(this->displaySlider , this_slider_listener ,
  153. GUI::MIN_DISPLAY_N , GUI::MAX_DISPLAY_N , 1.0) ;
  154. this->mainContent->configureSlider(this->screenSlider , this_slider_listener ,
  155. GUI::MIN_SCREEN_N , GUI::MAX_SCREEN_N , 1.0) ;
  156. this->mainContent->configureSlider(this->nChannelsSlider , this_slider_listener ,
  157. GUI::MIN_N_CHANNELS , GUI::MAX_N_CHANNELS , 1.0) ;
  158. this->mainContent->configureTextEditor(this->screenWidthText , this_text_listener ,
  159. GUI::MAX_RES_N_CHARS , APP::DIGITS ) ;
  160. this->mainContent->configureTextEditor(this->screenHeightText , this_text_listener ,
  161. GUI::MAX_RES_N_CHARS , APP::DIGITS ) ;
  162. this->mainContent->configureTextEditor(this->xOffsetText , this_text_listener ,
  163. GUI::MAX_RES_N_CHARS , APP::DIGITS ) ;
  164. this->mainContent->configureTextEditor(this->yOffsetText , this_text_listener ,
  165. GUI::MAX_RES_N_CHARS , APP::DIGITS ) ;
  166. this->mainContent->configureTextEditor(this->motdText , this_text_listener ,
  167. GUI::MAX_MOTD_LEN , String::empty ) ;
  168. this->mainContent->configureTextEditor(this->interstitialText , this_text_listener ,
  169. GUI::MAX_FILENAME_LEN , APP::VALID_ID_CHARS ) ;
  170. this->mainContent->configureTextEditor(this->hintsText , this_text_listener ,
  171. 0 , String::empty ) ;
  172. this->mainContent->configureTextEditor(this->outputWidthText , this_text_listener ,
  173. GUI::MAX_RES_N_CHARS , APP::DIGITS ) ;
  174. this->mainContent->configureTextEditor(this->outputHeightText , this_text_listener ,
  175. GUI::MAX_RES_N_CHARS , APP::DIGITS ) ;
  176. this->mainContent->configureTextEditor(this->outputDestText , this_text_listener ,
  177. GUI::MAX_FILENAME_LEN , APP::VALID_URI_CHARS ) ;
  178. this->mainContent->configureTextEditor(this->networkText , this_text_listener ,
  179. GUI::MAX_FILENAME_LEN , APP::VALID_URI_CHARS ) ;
  180. this->mainContent->configureTextEditor(this->portText , this_text_listener ,
  181. GUI::MAX_PORT_N_CHARS , APP::DIGITS ) ;
  182. this->mainContent->configureTextEditor(this->nickText , this_text_listener ,
  183. GUI::MAX_FILENAME_LEN , APP::VALID_NICK_CHARS) ;
  184. this->mainContent->configureTextEditor(this->passText , this_text_listener ,
  185. GUI::MAX_MOTD_LEN , String::empty ) ;
  186. this->mainContent->configureTextEditor(this->channelText , this_text_listener ,
  187. GUI::MAX_FILENAME_LEN , APP::VALID_NICK_CHARS) ;
  188. this->mainContent->configureTextEditor(this->greetingText , this_text_listener ,
  189. GUI::MAX_MOTD_LEN , String::empty ) ;
  190. this->mainContent->configureCombobox(this->cameraDevCombo , this_combobox_listener) ;
  191. this->mainContent->configureCombobox(this->cameraResCombo , this_combobox_listener) ;
  192. this->mainContent->configureCombobox(this->audioApiCombo , this_combobox_listener) ;
  193. this->mainContent->configureCombobox(this->audioDevCombo , this_combobox_listener) ;
  194. this->mainContent->configureCombobox(this->audioCodecCombo , this_combobox_listener) ;
  195. this->mainContent->configureCombobox(this->samplerateCombo , this_combobox_listener) ;
  196. this->mainContent->configureCombobox(this->audioBitrateCombo , this_combobox_listener) ;
  197. this->mainContent->configureCombobox(this->textStyleCombo , this_combobox_listener) ;
  198. this->mainContent->configureCombobox(this->textPosCombo , this_combobox_listener) ;
  199. this->mainContent->configureCombobox(this->outputSinkCombo , this_combobox_listener) ;
  200. this->mainContent->configureCombobox(this->framerateCombo , this_combobox_listener) ;
  201. this->mainContent->configureCombobox(this->videoBitrateCombo , this_combobox_listener) ;
  202. // NOTE: dummyPane is a non-functional dummy - most siblings bounds are coupled to it
  203. dummyConfigPane->toBack() ;
  204. updateVisibility(this->configStore[CONFIG::CONFIG_PANE_ID]) ;
  205. //[/Constructor]
  206. }
  207. Config::~Config()
  208. {
  209. //[Destructor_pre]. You can add your own custom destruction code here..
  210. //[/Destructor_pre]
  211. configGroup = nullptr;
  212. screenButton = nullptr;
  213. cameraButton = nullptr;
  214. audioButton = nullptr;
  215. textButton = nullptr;
  216. imageButton = nullptr;
  217. outputButton = nullptr;
  218. chatButton = nullptr;
  219. configPaneGroup = nullptr;
  220. configScreen = nullptr;
  221. configCamera = nullptr;
  222. configAudio = nullptr;
  223. configText = nullptr;
  224. configImage = nullptr;
  225. configOutput = nullptr;
  226. configChat = nullptr;
  227. dummyConfigPane = nullptr;
  228. hintsGroup = nullptr;
  229. hintsText = nullptr;
  230. //[Destructor]. You can add your own custom destruction code here..
  231. //[/Destructor]
  232. }
  233. //==============================================================================
  234. void Config::paint (Graphics& g)
  235. {
  236. //[UserPrePaint] Add your own custom painting code here..
  237. //[/UserPrePaint]
  238. g.setColour (Colour (0xff282828));
  239. g.fillRoundedRectangle (18.0f, 14.0f, static_cast<float> (getWidth() - 36), static_cast<float> (getHeight() - 32), 5.000f);
  240. g.setColour (Colour (0xff404040));
  241. g.fillRoundedRectangle (194.0f, 30.0f, static_cast<float> (getWidth() - 226), static_cast<float> (getHeight() - 66), 4.000f);
  242. g.setColour (Colour (0xff585858));
  243. g.fillRoundedRectangle (204.0f, 298.0f, static_cast<float> (getWidth() - 246), static_cast<float> (getHeight() - 342), 4.000f);
  244. //[UserPaint] Add your own custom painting code here..
  245. //[/UserPaint]
  246. }
  247. void Config::resized()
  248. {
  249. //[UserPreResize] Add your own custom resize code here..
  250. //[/UserPreResize]
  251. configGroup->setBounds (16, 4, getWidth() - 32, getHeight() - 20);
  252. screenButton->setBounds (16 + 16, ((4 + 16) + 16) + roundFloatToInt (252 * 0.0000f), 150, roundFloatToInt (252 * 0.1429f));
  253. cameraButton->setBounds (16 + 16, ((4 + 16) + 16) + roundFloatToInt (252 * 0.1429f), 150, roundFloatToInt (252 * 0.1429f));
  254. audioButton->setBounds (16 + 16, ((4 + 16) + 16) + roundFloatToInt (252 * 0.2857f), 150, roundFloatToInt (252 * 0.1429f));
  255. textButton->setBounds (16 + 16, ((4 + 16) + 16) + roundFloatToInt (252 * 0.4286f), 150, roundFloatToInt (252 * 0.1429f));
  256. imageButton->setBounds (16 + 16, ((4 + 16) + 16) + roundFloatToInt (252 * 0.5714f), 150, roundFloatToInt (252 * 0.1429f));
  257. outputButton->setBounds (16 + 16, ((4 + 16) + 16) + roundFloatToInt (252 * 0.7143f), 150, roundFloatToInt (252 * 0.1429f));
  258. chatButton->setBounds (16 + 16, ((4 + 16) + 16) + roundFloatToInt (252 * 0.8571f), 150, roundFloatToInt (252 * 0.1429f));
  259. configPaneGroup->setBounds (16 + 174, 4 + 16, (getWidth() - 32) - 186, roundFloatToInt ((getHeight() - 20) * 0.9534f));
  260. configScreen->setBounds (((16 + 174) + 12) + 0, ((4 + 16) + 16) + 0, (((getWidth() - 32) - 186) - 24) - 0, 252 - 0);
  261. configCamera->setBounds (((16 + 174) + 12) + 0, ((4 + 16) + 16) + 0, (((getWidth() - 32) - 186) - 24) - 0, 252 - 0);
  262. configAudio->setBounds (((16 + 174) + 12) + 0, ((4 + 16) + 16) + 0, (((getWidth() - 32) - 186) - 24) - 0, 252 - 0);
  263. configText->setBounds (((16 + 174) + 12) + 0, ((4 + 16) + 16) + 0, (((getWidth() - 32) - 186) - 24) - 0, 252 - 0);
  264. configImage->setBounds (((16 + 174) + 12) + 0, ((4 + 16) + 16) + 0, (((getWidth() - 32) - 186) - 24) - 0, 252 - 0);
  265. configOutput->setBounds (((16 + 174) + 12) + 0, ((4 + 16) + 16) + 0, (((getWidth() - 32) - 186) - 24) - 0, 252 - 0);
  266. configChat->setBounds (((16 + 174) + 12) + 0, ((4 + 16) + 16) + 0, (((getWidth() - 32) - 186) - 24) - 0, 252 - 0);
  267. dummyConfigPane->setBounds ((16 + 174) + 12, (4 + 16) + 16, ((getWidth() - 32) - 186) - 24, 252);
  268. hintsGroup->setBounds (((16 + 174) + 12) + 0, ((4 + 16) + 16) + 252, (((getWidth() - 32) - 186) - 24) - 0, (roundFloatToInt ((getHeight() - 20) * 0.9534f)) - 278);
  269. hintsText->setBounds ((((16 + 174) + 12) + 0) + 14, (((4 + 16) + 16) + 252) + 20, ((((getWidth() - 32) - 186) - 24) - 0) - 28, ((roundFloatToInt ((getHeight() - 20) * 0.9534f)) - 278) - 32);
  270. //[UserResized] Add your own custom resize handling here..
  271. //[/UserResized]
  272. }
  273. //[MiscUserCode] You can add your own definitions of your custom methods or any other code here...
  274. void Config::broughtToFront() { loadConfig() ; }
  275. void Config::sliderValueChanged(Slider* a_slider)
  276. {
  277. Identifier key ;
  278. var value = var(int(a_slider->getValue())) ;
  279. if (a_slider == this->displaySlider ) key = CONFIG::DISPLAY_N_ID ;
  280. else if (a_slider == this->screenSlider ) key = CONFIG::SCREEN_N_ID ;
  281. else if (a_slider == this->nChannelsSlider) key = CONFIG::N_CHANNELS_ID ;
  282. AvCaster::SetValue(key , value) ;
  283. }
  284. void Config::comboBoxChanged(ComboBox* a_combobox)
  285. {
  286. Identifier key = (a_combobox == this->cameraDevCombo ) ? CONFIG::CAMERA_DEVICE_ID :
  287. (a_combobox == this->cameraResCombo ) ? CONFIG::CAMERA_RES_ID :
  288. (a_combobox == this->audioApiCombo ) ? CONFIG::AUDIO_API_ID :
  289. (a_combobox == this->audioDevCombo ) ? CONFIG::AUDIO_DEVICE_ID :
  290. (a_combobox == this->audioCodecCombo ) ? CONFIG::AUDIO_CODEC_ID :
  291. (a_combobox == this->samplerateCombo ) ? CONFIG::SAMPLERATE_ID :
  292. (a_combobox == this->audioBitrateCombo) ? CONFIG::AUDIO_BITRATE_ID :
  293. (a_combobox == this->textStyleCombo ) ? CONFIG::TEXT_STYLE_ID :
  294. (a_combobox == this->textPosCombo ) ? CONFIG::TEXT_POSITION_ID :
  295. (a_combobox == this->outputSinkCombo ) ? CONFIG::OUTPUT_SINK_ID :
  296. (a_combobox == this->framerateCombo ) ? CONFIG::FRAMERATE_ID :
  297. (a_combobox == this->videoBitrateCombo) ? CONFIG::VIDEO_BITRATE_ID :
  298. Identifier::null ;
  299. int option_n = a_combobox->getSelectedItemIndex() ;
  300. var value = (~option_n) ? var(option_n) : this->configStore[key] ;
  301. a_combobox->setSelectedItemIndex(int(value) , juce::dontSendNotification) ;
  302. AvCaster::SetValue(key , value) ;
  303. }
  304. void Config::buttonClicked(Button* a_button)
  305. {
  306. Identifier key ;
  307. var value ;
  308. // Config buttons
  309. if (a_button == this->screenButton)
  310. { key = CONFIG::CONFIG_PANE_ID ; value = var(GUI::SCREEN_GROUP_TEXT) ; updateVisibility(value) ; }
  311. else if (a_button == this->cameraButton)
  312. { key = CONFIG::CONFIG_PANE_ID ; value = var(GUI::CAMERA_GROUP_TEXT) ; updateVisibility(value) ; }
  313. else if (a_button == this->audioButton )
  314. { key = CONFIG::CONFIG_PANE_ID ; value = var(GUI::AUDIO_GROUP_TEXT ) ; updateVisibility(value) ; }
  315. else if (a_button == this->textButton )
  316. { key = CONFIG::CONFIG_PANE_ID ; value = var(GUI::TEXT_GROUP_TEXT ) ; updateVisibility(value) ; }
  317. else if (a_button == this->imageButton )
  318. { key = CONFIG::CONFIG_PANE_ID ; value = var(GUI::IMAGE_GROUP_TEXT ) ; updateVisibility(value) ; }
  319. else if (a_button == this->outputButton)
  320. { key = CONFIG::CONFIG_PANE_ID ; value = var(GUI::OUTPUT_GROUP_TEXT) ; updateVisibility(value) ; }
  321. else if (a_button == this->chatButton )
  322. { key = CONFIG::CONFIG_PANE_ID ; value = var(GUI::CHAT_GROUP_TEXT ) ; updateVisibility(value) ; }
  323. // Image buttons
  324. else if (a_button == this->browseButton)
  325. {
  326. FileChooser file_chooser(GUI::IMAGE_CHOOSER_TEXT , APP::picturesDir() ,
  327. GUI::IMG_FILE_EXTS , false ) ;
  328. ImagePreviewComponent image_preview ;
  329. // image_preview.setSize(GUI::IMG_PREVIEW_W , GUI::IMG_PREVIEW_H) ; // NFG
  330. if (!file_chooser.browseForFileToOpen(&image_preview)) return ;
  331. String image_loc = file_chooser.getResult().getFullPathName() ;
  332. key = CONFIG::IMAGE_LOC_ID ; value = var(image_loc) ;
  333. }
  334. // Chat buttons
  335. else if (a_button == this->timestampToggle)
  336. { key = CONFIG::TIMESTAMPS_ID ; value = var(a_button->getToggleState()) ; }
  337. else if (a_button == this->joinPartToggle)
  338. { key = CONFIG::JOINPARTS_ID ; value = var(a_button->getToggleState()) ; }
  339. AvCaster::SetValue(key , value) ;
  340. }
  341. void Config::textEditorTextChanged(TextEditor& a_text_editor)
  342. {
  343. if (&a_text_editor == this->outputDestText) validateOutputDest() ;
  344. }
  345. void Config::textEditorFocusLost(TextEditor& a_text_editor)
  346. {
  347. TextEditor* ed = &a_text_editor ;
  348. String text = ed->getText().trim() ;
  349. var str_val = var(text) ;
  350. var int_val = var(text.getIntValue()) ;
  351. Identifier key ;
  352. var value ;
  353. if (ed == this->screenWidthText ) { key = CONFIG::SCREENCAP_W_ID ; value = int_val ; }
  354. else if (ed == this->screenHeightText) { key = CONFIG::SCREENCAP_H_ID ; value = int_val ; }
  355. else if (ed == this->xOffsetText ) { key = CONFIG::OFFSET_X_ID ; value = int_val ; }
  356. else if (ed == this->yOffsetText ) { key = CONFIG::OFFSET_Y_ID ; value = int_val ; }
  357. else if (ed == this->motdText ) { key = CONFIG::MOTD_TEXT_ID ; value = str_val ; }
  358. else if (ed == this->interstitialText) { key = CONFIG::IMAGE_LOC_ID ; value = str_val ; }
  359. else if (ed == this->outputWidthText ) { key = CONFIG::OUTPUT_W_ID ; value = int_val ; }
  360. else if (ed == this->outputHeightText) { key = CONFIG::OUTPUT_H_ID ; value = int_val ; }
  361. else if (ed == this->outputDestText ) { key = CONFIG::OUTPUT_DEST_ID ; value = str_val ; }
  362. else if (ed == this->networkText ) { key = CONFIG::NETWORK_ID ; value = str_val ; }
  363. else if (ed == this->portText ) { key = CONFIG::PORT_ID ; value = str_val ; }
  364. else if (ed == this->nickText ) { key = CONFIG::NICK_ID ; value = str_val ; }
  365. else if (ed == this->passText ) { key = CONFIG::PASS_ID ; value = str_val ; }
  366. else if (ed == this->channelText ) { key = CONFIG::CHANNEL_ID ; value = str_val ; }
  367. else if (ed == this->greetingText ) { key = CONFIG::GREETING_ID ; value = str_val ; }
  368. else return ;
  369. AvCaster::SetValue(key , value) ;
  370. }
  371. void Config::initialize(ValueTree config_store , ValueTree network_store)
  372. {
  373. this->configStore = config_store ;
  374. this->networkStore = network_store ;
  375. }
  376. void Config::loadConfig()
  377. {
  378. StringArray camera_devices = AvCaster::GetCameraNames () ;
  379. StringArray camera_resolutions = AvCaster::GetCameraResolutions() ;
  380. StringArray audio_devices = AvCaster::GetAudioNames () ;
  381. DEBUG_TRACE_CONFIG_LOAD_CONFIG
  382. var pane_name = this->configStore [CONFIG::CONFIG_PANE_ID ] ;
  383. double display_n = double(this->configStore [CONFIG::DISPLAY_N_ID ]) ;
  384. double screen_n = double(this->configStore [CONFIG::SCREEN_N_ID ]) ;
  385. String screencap_w = STRING(this->configStore [CONFIG::SCREENCAP_W_ID ]) ;
  386. String screencap_h = STRING(this->configStore [CONFIG::SCREENCAP_H_ID ]) ;
  387. String offset_x = STRING(this->configStore [CONFIG::OFFSET_X_ID ]) ;
  388. String offset_y = STRING(this->configStore [CONFIG::OFFSET_Y_ID ]) ;
  389. int camera_dev_idx = int (this->configStore [CONFIG::CAMERA_DEVICE_ID]) ;
  390. int camera_res_idx = int (this->configStore [CONFIG::CAMERA_RES_ID ]) ;
  391. int audio_api_idx = int (this->configStore [CONFIG::AUDIO_API_ID ]) ;
  392. int audio_dev_idx = int (this->configStore [CONFIG::AUDIO_DEVICE_ID ]) ;
  393. int audio_codec_idx = int (this->configStore [CONFIG::AUDIO_CODEC_ID ]) ;
  394. double n_channels = double(this->configStore [CONFIG::N_CHANNELS_ID ]) ;
  395. int samplerate_idx = int (this->configStore [CONFIG::SAMPLERATE_ID ]) ;
  396. int audio_bitrate_idx = int (this->configStore [CONFIG::AUDIO_BITRATE_ID]) ;
  397. int text_style_idx = int (this->configStore [CONFIG::TEXT_STYLE_ID ]) ;
  398. int text_pos_idx = int (this->configStore [CONFIG::TEXT_POSITION_ID]) ;
  399. String motd_text = STRING(this->configStore [CONFIG::MOTD_TEXT_ID ]) ;
  400. String interstitial_text = STRING(this->configStore [CONFIG::IMAGE_LOC_ID ]) ;
  401. int output_idx = int (this->configStore [CONFIG::OUTPUT_SINK_ID ]) ;
  402. String output_w_text = STRING(this->configStore [CONFIG::OUTPUT_W_ID ]) ;
  403. String output_h_text = STRING(this->configStore [CONFIG::OUTPUT_H_ID ]) ;
  404. int framerate_idx = int (this->configStore [CONFIG::FRAMERATE_ID ]) ;
  405. int video_bitrate_idx = int (this->configStore [CONFIG::VIDEO_BITRATE_ID]) ;
  406. String output_dest_text = STRING(this->configStore [CONFIG::OUTPUT_DEST_ID ]) ;
  407. String network_text = STRING(this->networkStore[CONFIG::NETWORK_ID ]) ;
  408. int port = int (this->networkStore[CONFIG::PORT_ID ]) ;
  409. String nick_text = STRING(this->networkStore[CONFIG::NICK_ID ]) ;
  410. String pass_text = STRING(this->networkStore[CONFIG::PASS_ID ]) ;
  411. String channel_text = STRING(this->networkStore[CONFIG::CHANNEL_ID ]) ;
  412. String greeting_text = STRING(this->networkStore[CONFIG::GREETING_ID ]) ;
  413. bool should_show_timestamps = bool (this->networkStore[CONFIG::TIMESTAMPS_ID ]) ;
  414. bool should_show_joinparts = bool (this->networkStore[CONFIG::JOINPARTS_ID ]) ;
  415. bool is_lctv_preset = AvCaster::GetPresetIdx() == CONFIG::LCTV_PRESET_IDX ;
  416. String output_label_text = (is_lctv_preset ) ? GUI::DEST_LCTV_TEXT :
  417. (output_idx == CONFIG::FILE_OUTPUT_IDX) ? GUI::DEST_FILE_TEXT :
  418. (output_idx == CONFIG::RTMP_OUTPUT_IDX) ? GUI::DEST_RTMP_TEXT :
  419. "ERR" ;
  420. this->displaySlider ->setValue (display_n ) ;
  421. this->screenSlider ->setValue (screen_n ) ;
  422. this->nChannelsSlider ->setValue (n_channels) ;
  423. this->screenWidthText ->setText (screencap_w ) ;
  424. this->screenHeightText ->setText (screencap_h ) ;
  425. this->xOffsetText ->setText (offset_x ) ;
  426. this->yOffsetText ->setText (offset_y ) ;
  427. this->motdText ->setText (motd_text ) ;
  428. this->interstitialText ->setText (interstitial_text) ;
  429. this->outputWidthText ->setText (output_w_text ) ;
  430. this->outputHeightText ->setText (output_h_text ) ;
  431. this->outputDestText ->setText (output_dest_text ) ;
  432. this->outputDestLabel ->setText (output_label_text , juce::dontSendNotification) ;
  433. this->networkText ->setText (network_text ) ;
  434. this->portText ->setText ((port > 0) ? String(port) : String::empty) ;
  435. this->nickText ->setText (nick_text ) ;
  436. this->passText ->setText (pass_text ) ;
  437. this->channelText ->setText (channel_text ) ;
  438. this->greetingText ->setText (greeting_text ) ;
  439. this->cameraDevCombo ->clear (juce::dontSendNotification) ;
  440. this->cameraResCombo ->clear (juce::dontSendNotification) ;
  441. this->audioDevCombo ->clear (juce::dontSendNotification) ;
  442. this->audioApiCombo ->clear (juce::dontSendNotification) ;
  443. this->audioCodecCombo ->clear (juce::dontSendNotification) ;
  444. this->samplerateCombo ->clear (juce::dontSendNotification) ;
  445. this->audioBitrateCombo->clear (juce::dontSendNotification) ;
  446. this->textStyleCombo ->clear (juce::dontSendNotification) ;
  447. this->textPosCombo ->clear (juce::dontSendNotification) ;
  448. this->outputSinkCombo ->clear (juce::dontSendNotification) ;
  449. this->framerateCombo ->clear (juce::dontSendNotification) ;
  450. this->videoBitrateCombo->clear (juce::dontSendNotification) ;
  451. this->cameraDevCombo ->addItemList (camera_devices , 1) ;
  452. this->cameraResCombo ->addItemList (camera_resolutions , 1) ;
  453. this->audioApiCombo ->addItemList (CONFIG::AudioApis() , 1) ;
  454. this->audioDevCombo ->addItemList (audio_devices , 1) ;
  455. this->audioCodecCombo ->addItemList (CONFIG::AudioCodecs() , 1) ;
  456. this->samplerateCombo ->addItemList (CONFIG::AudioSampleRates() , 1) ;
  457. this->audioBitrateCombo->addItemList (CONFIG::AudioBitRates() , 1) ;
  458. this->textStyleCombo ->addItemList (CONFIG::TextStyles() , 1) ;
  459. this->textPosCombo ->addItemList (CONFIG::TextPositions() , 1) ;
  460. this->outputSinkCombo ->addItemList (CONFIG::OutputSinks() , 1) ;
  461. this->framerateCombo ->addItemList (CONFIG::FrameRates() , 1) ;
  462. this->videoBitrateCombo->addItemList (CONFIG::VideoBitRates() , 1) ;
  463. this->cameraDevCombo ->setSelectedItemIndex(camera_dev_idx , juce::dontSendNotification) ;
  464. this->cameraResCombo ->setSelectedItemIndex(camera_res_idx , juce::dontSendNotification) ;
  465. this->audioApiCombo ->setSelectedItemIndex(audio_api_idx , juce::dontSendNotification) ;
  466. this->audioDevCombo ->setSelectedItemIndex(audio_dev_idx , juce::dontSendNotification) ;
  467. this->audioCodecCombo ->setSelectedItemIndex(audio_codec_idx , juce::dontSendNotification) ;
  468. this->samplerateCombo ->setSelectedItemIndex(samplerate_idx , juce::dontSendNotification) ;
  469. this->audioBitrateCombo->setSelectedItemIndex(audio_bitrate_idx , juce::dontSendNotification) ;
  470. this->textStyleCombo ->setSelectedItemIndex(text_style_idx , juce::dontSendNotification) ;
  471. this->textPosCombo ->setSelectedItemIndex(text_pos_idx , juce::dontSendNotification) ;
  472. this->outputSinkCombo ->setSelectedItemIndex(output_idx , juce::dontSendNotification) ;
  473. this->framerateCombo ->setSelectedItemIndex(framerate_idx , juce::dontSendNotification) ;
  474. this->videoBitrateCombo->setSelectedItemIndex(video_bitrate_idx , juce::dontSendNotification) ;
  475. this->timestampToggle ->setToggleState (should_show_timestamps , juce::dontSendNotification) ;
  476. this->joinPartToggle ->setToggleState (should_show_joinparts , juce::dontSendNotification) ;
  477. enableComponents() ; updateVisibility(pane_name) ;
  478. }
  479. void Config::enableComponents()
  480. {
  481. bool is_user_preset = !AvCaster::IsStaticPreset() ;
  482. this->audioCodecCombo->setEnabled(is_user_preset) ; // TODO: videoCodecCombo
  483. this->outputSinkCombo->setEnabled(is_user_preset) ; // TODO: outputMuxerCombo
  484. #ifdef DISABLE_GUI_CONFIG_NYI
  485. this->displaySlider ->setEnabled(false) ;
  486. this->screenSlider ->setEnabled(false) ;
  487. this->xOffsetText ->setEnabled(false) ;
  488. this->yOffsetText ->setEnabled(false) ;
  489. this->cameraResCombo ->setEnabled(false) ;
  490. this->audioDevCombo ->setEnabled(false) ;
  491. this->audioCodecCombo ->setEnabled(false) ;
  492. this->motdText ->setEnabled(false) ;
  493. this->textStyleCombo ->setEnabled(false) ;
  494. this->textPosCombo ->setEnabled(false) ;
  495. this->interstitialText->setEnabled(false) ;
  496. this->browseButton ->setEnabled(false) ;
  497. # ifdef DISABLE_CHAT
  498. this->networkText ->setEnabled(false) ;
  499. this->portText ->setEnabled(false) ;
  500. this->nickText ->setEnabled(false) ;
  501. this->passText ->setEnabled(false) ;
  502. this->channelText ->setEnabled(false) ;
  503. this->greetingText ->setEnabled(false) ;
  504. this->timestampToggle->setEnabled(false) ;
  505. this->joinPartToggle ->setEnabled(false) ;
  506. # endif // DISABLE_CHAT
  507. #endif // DISABLE_GUI_CONFIG_NYI
  508. }
  509. void Config::updateVisibility(var pane_name)
  510. {
  511. String group_text = STRING(pane_name) ;
  512. String hints_text ;
  513. // panels visibility
  514. this->configScreen->setVisible(group_text == GUI::SCREEN_GROUP_TEXT) ;
  515. this->configCamera->setVisible(group_text == GUI::CAMERA_GROUP_TEXT) ;
  516. this->configAudio ->setVisible(group_text == GUI::AUDIO_GROUP_TEXT ) ;
  517. this->configText ->setVisible(group_text == GUI::TEXT_GROUP_TEXT ) ;
  518. this->configImage ->setVisible(group_text == GUI::IMAGE_GROUP_TEXT ) ;
  519. this->configOutput->setVisible(group_text == GUI::OUTPUT_GROUP_TEXT) ;
  520. this->configChat ->setVisible(group_text == GUI::CHAT_GROUP_TEXT ) ;
  521. // display texts
  522. if (group_text == GUI::SCREEN_GROUP_TEXT) hints_text = GUI::SCREEN_HELP_TEXT ;
  523. else if (group_text == GUI::CAMERA_GROUP_TEXT) hints_text = GUI::CAMERA_HELP_TEXT ;
  524. else if (group_text == GUI::AUDIO_GROUP_TEXT ) hints_text = GUI::AUDIO_HELP_TEXT ;
  525. else if (group_text == GUI::TEXT_GROUP_TEXT ) hints_text = GUI::TEXT_HELP_TEXT ;
  526. else if (group_text == GUI::IMAGE_GROUP_TEXT ) hints_text = GUI::IMAGE_HELP_TEXT ;
  527. else if (group_text == GUI::OUTPUT_GROUP_TEXT) hints_text = outputHintsText() ;
  528. else if (group_text == GUI::CHAT_GROUP_TEXT ) hints_text = GUI::CHAT_HELP_TEXT ;
  529. this->configPaneGroup->setText(group_text) ; setHintsText(hints_text) ;
  530. }
  531. bool Config::setHintsText(String hints_text) { this->hintsText->setText(hints_text) ; }
  532. String Config::outputHintsText()
  533. {
  534. bool is_lctv_preset = AvCaster::GetPresetIdx() == CONFIG::LCTV_PRESET_IDX ;
  535. int output_idx = int(this->configStore[CONFIG::OUTPUT_SINK_ID]) ;
  536. return (is_lctv_preset ) ? GUI::LCTV_HELP_TEXT :
  537. (output_idx == CONFIG::FILE_OUTPUT_IDX) ? GUI::FILE_HELP_TEXT :
  538. (output_idx == CONFIG::RTMP_OUTPUT_IDX) ? GUI::RTMP_HELP_TEXT :
  539. "ERR" ;
  540. }
  541. bool Config::validateOutputDest()
  542. {
  543. String dest_text = this->outputDestText->getText() ;
  544. bool is_valid = dest_text.containsOnly(APP::VALID_URI_CHARS) ;
  545. Colour fg_color = (is_valid) ? GUI::TEXT_NORMAL_COLOR : GUI::TEXT_INVALID_COLOR ;
  546. Colour bg_color = (is_valid) ? GUI::TEXT_BG_COLOR : GUI::TEXT_INVALID_BG_COLOR ;
  547. this->outputDestText->setText (dest_text.trim()) ;
  548. this->outputDestText->setColour(ComboBox::textColourId , fg_color) ;
  549. this->outputDestText->setColour(ComboBox::backgroundColourId , bg_color) ;
  550. return is_valid ;
  551. }
  552. // bool Config::validateParams() { bool is_sane = validateOutputDest() ; return is_sane ; }
  553. //[/MiscUserCode]
  554. //==============================================================================
  555. #if 0
  556. /* -- Introjucer information section --
  557. This is where the Introjucer stores the metadata that describe this GUI layout, so
  558. make changes in here at your peril!
  559. BEGIN_JUCER_METADATA
  560. <JUCER_COMPONENT documentType="Component" className="Config" componentName=""
  561. parentClasses="public Component, public Button::Listener, public Slider::Listener, public TextEditor::Listener, public ComboBox::Listener"
  562. constructorParams="MainContent* main_content" variableInitialisers="mainContent(main_content)"
  563. snapPixels="8" snapActive="1" snapShown="1" overlayOpacity="0.330"
  564. fixedSize="0" initialWidth="1" initialHeight="1">
  565. <BACKGROUND backgroundColour="0">
  566. <ROUNDRECT pos="18 14 36M 32M" cornerSize="5" fill="solid: ff282828" hasStroke="0"/>
  567. <ROUNDRECT pos="194 30 226M 66M" cornerSize="4" fill="solid: ff404040" hasStroke="0"/>
  568. <ROUNDRECT pos="204 298 246M 342M" cornerSize="4" fill="solid: ff585858"
  569. hasStroke="0"/>
  570. </BACKGROUND>
  571. <GROUPCOMPONENT name="configGroup" id="6607ba656d5c8919" memberName="configGroup"
  572. virtualName="" explicitFocusOrder="0" pos="16 4 32M 20M" outlinecol="ffffffff"
  573. textcol="ffffffff" title="Configuration"/>
  574. <TEXTBUTTON name="screenButton" id="100ccdbe8e5db3ab" memberName="screenButton"
  575. virtualName="" explicitFocusOrder="1" pos="16 0% 150 14.286%"
  576. posRelativeX="6607ba656d5c8919" posRelativeY="7ab6ee7eab27ae3e"
  577. posRelativeW="6607ba656d5c8919" posRelativeH="7ab6ee7eab27ae3e"
  578. buttonText="Screen" connectedEdges="8" needsCallback="0" radioGroupId="0"/>
  579. <TEXTBUTTON name="cameraButton" id="a4094321ed5d0e5e" memberName="cameraButton"
  580. virtualName="" explicitFocusOrder="2" pos="16 14.286% 150 14.286%"
  581. posRelativeX="6607ba656d5c8919" posRelativeY="7ab6ee7eab27ae3e"
  582. posRelativeW="6607ba656d5c8919" posRelativeH="7ab6ee7eab27ae3e"
  583. buttonText="Camera" connectedEdges="12" needsCallback="0" radioGroupId="0"/>
  584. <TEXTBUTTON name="audioButton" id="7b29583a640ebd35" memberName="audioButton"
  585. virtualName="" explicitFocusOrder="3" pos="16 28.571% 150 14.286%"
  586. posRelativeX="6607ba656d5c8919" posRelativeY="7ab6ee7eab27ae3e"
  587. posRelativeW="6607ba656d5c8919" posRelativeH="7ab6ee7eab27ae3e"
  588. buttonText="Audio" connectedEdges="12" needsCallback="0" radioGroupId="0"/>
  589. <TEXTBUTTON name="textButton" id="b042999a8c4d0ee5" memberName="textButton"
  590. virtualName="" explicitFocusOrder="4" pos="16 42.857% 150 14.286%"
  591. posRelativeX="6607ba656d5c8919" posRelativeY="7ab6ee7eab27ae3e"
  592. posRelativeW="6607ba656d5c8919" posRelativeH="7ab6ee7eab27ae3e"
  593. buttonText="Text" connectedEdges="12" needsCallback="0" radioGroupId="0"/>
  594. <TEXTBUTTON name="imageButton" id="3d8666e0ed316005" memberName="imageButton"
  595. virtualName="" explicitFocusOrder="5" pos="16 57.143% 150 14.286%"
  596. posRelativeX="6607ba656d5c8919" posRelativeY="7ab6ee7eab27ae3e"
  597. posRelativeW="6607ba656d5c8919" posRelativeH="7ab6ee7eab27ae3e"
  598. buttonText="Image" connectedEdges="12" needsCallback="0" radioGroupId="0"/>
  599. <TEXTBUTTON name="outputButton" id="3068eaa718dd476b" memberName="outputButton"
  600. virtualName="" explicitFocusOrder="6" pos="16 71.429% 150 14.286%"
  601. posRelativeX="6607ba656d5c8919" posRelativeY="7ab6ee7eab27ae3e"
  602. posRelativeW="6607ba656d5c8919" posRelativeH="7ab6ee7eab27ae3e"
  603. buttonText="Output" connectedEdges="12" needsCallback="0" radioGroupId="0"/>
  604. <TEXTBUTTON name="chatButton" id="6e15e064df96f39b" memberName="chatButton"
  605. virtualName="" explicitFocusOrder="7" pos="16 85.714% 150 14.286%"
  606. posRelativeX="6607ba656d5c8919" posRelativeY="7ab6ee7eab27ae3e"
  607. posRelativeW="6607ba656d5c8919" posRelativeH="7ab6ee7eab27ae3e"
  608. buttonText="Chat" connectedEdges="4" needsCallback="0" radioGroupId="0"/>
  609. <GROUPCOMPONENT name="configPaneGroup" id="3d078232c622c691" memberName="configPaneGroup"
  610. virtualName="" explicitFocusOrder="0" pos="174 16 186M 95.335%"
  611. posRelativeX="6607ba656d5c8919" posRelativeY="6607ba656d5c8919"
  612. posRelativeW="6607ba656d5c8919" posRelativeH="6607ba656d5c8919"
  613. outlinecol="ffffffff" textcol="ffffffff" title="Screen"/>
  614. <GENERICCOMPONENT name="configScreen" id="e89c0f3c223ab737" memberName="configScreen"
  615. virtualName="" explicitFocusOrder="0" pos="0 0 0M 0M" posRelativeX="7ab6ee7eab27ae3e"
  616. posRelativeY="7ab6ee7eab27ae3e" posRelativeW="7ab6ee7eab27ae3e"
  617. posRelativeH="7ab6ee7eab27ae3e" class="ConfigScreen" params=""/>
  618. <GENERICCOMPONENT name="configCamera" id="eb987e4a398d67b3" memberName="configCamera"
  619. virtualName="" explicitFocusOrder="0" pos="0 0 0M 0M" posRelativeX="7ab6ee7eab27ae3e"
  620. posRelativeY="7ab6ee7eab27ae3e" posRelativeW="7ab6ee7eab27ae3e"
  621. posRelativeH="7ab6ee7eab27ae3e" class="ConfigCamera" params=""/>
  622. <GENERICCOMPONENT name="configAudio" id="a97a529009013839" memberName="configAudio"
  623. virtualName="" explicitFocusOrder="0" pos="0 0 0M 0M" posRelativeX="7ab6ee7eab27ae3e"
  624. posRelativeY="7ab6ee7eab27ae3e" posRelativeW="7ab6ee7eab27ae3e"
  625. posRelativeH="7ab6ee7eab27ae3e" class="ConfigAudio" params=""/>
  626. <GENERICCOMPONENT name="configText" id="46d2ff75060de9b1" memberName="configText"
  627. virtualName="" explicitFocusOrder="0" pos="0 0 0M 0M" posRelativeX="7ab6ee7eab27ae3e"
  628. posRelativeY="7ab6ee7eab27ae3e" posRelativeW="7ab6ee7eab27ae3e"
  629. posRelativeH="7ab6ee7eab27ae3e" class="ConfigText" params=""/>
  630. <GENERICCOMPONENT name="configImage" id="df20966cb9e5cfa1" memberName="configImage"
  631. virtualName="" explicitFocusOrder="0" pos="0 0 0M 0M" posRelativeX="7ab6ee7eab27ae3e"
  632. posRelativeY="7ab6ee7eab27ae3e" posRelativeW="7ab6ee7eab27ae3e"
  633. posRelativeH="7ab6ee7eab27ae3e" class="ConfigImage" params=""/>
  634. <GENERICCOMPONENT name="configOutput" id="dbe527be33400926" memberName="configOutput"
  635. virtualName="" explicitFocusOrder="0" pos="0 0 0M 0M" posRelativeX="7ab6ee7eab27ae3e"
  636. posRelativeY="7ab6ee7eab27ae3e" posRelativeW="7ab6ee7eab27ae3e"
  637. posRelativeH="7ab6ee7eab27ae3e" class="ConfigOutput" params=""/>
  638. <GENERICCOMPONENT name="configChat" id="6363efd2d63fdee4" memberName="configChat"
  639. virtualName="" explicitFocusOrder="0" pos="0 0 0M 0M" posRelativeX="7ab6ee7eab27ae3e"
  640. posRelativeY="7ab6ee7eab27ae3e" posRelativeW="7ab6ee7eab27ae3e"
  641. posRelativeH="7ab6ee7eab27ae3e" class="ConfigChat" params=""/>
  642. <GENERICCOMPONENT name="dummyConfigPane" id="7ab6ee7eab27ae3e" memberName="dummyConfigPane"
  643. virtualName="" explicitFocusOrder="0" pos="12 16 24M 252" posRelativeX="3d078232c622c691"
  644. posRelativeY="3d078232c622c691" posRelativeW="3d078232c622c691"
  645. posRelativeH="6607ba656d5c8919" class="Component" params=""/>
  646. <GROUPCOMPONENT name="hintsGroup" id="2ef603e605c1ac5d" memberName="hintsGroup"
  647. virtualName="" explicitFocusOrder="0" pos="0 252 0M 278M" posRelativeX="7ab6ee7eab27ae3e"
  648. posRelativeY="7ab6ee7eab27ae3e" posRelativeW="7ab6ee7eab27ae3e"
  649. posRelativeH="3d078232c622c691" outlinecol="ffffffff" textcol="ffffffff"
  650. title="Hints"/>
  651. <TEXTEDITOR name="hintsText" id="f3411ac6aaf06395" memberName="hintsText"
  652. virtualName="" explicitFocusOrder="0" pos="14 20 28M 32M" posRelativeX="2ef603e605c1ac5d"
  653. posRelativeY="2ef603e605c1ac5d" posRelativeW="2ef603e605c1ac5d"
  654. posRelativeH="2ef603e605c1ac5d" textcol="ffffffff" bkgcol="0"
  655. hilitecol="0" outlinecol="0" shadowcol="0" initialText="" multiline="1"
  656. retKeyStartsLine="0" readonly="1" scrollbars="1" caret="0" popupmenu="0"/>
  657. </JUCER_COMPONENT>
  658. END_JUCER_METADATA
  659. */
  660. #endif
  661. //[EndFile] You can add extra defines here...
  662. //[/EndFile]