Channel.cpp 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595
  1. /*
  2. ==============================================================================
  3. This is an automatically generated GUI class created by the Introjucer!
  4. Be careful when adding custom code to these files, as only the code within
  5. the "//[xyz]" and "//[/xyz]" sections will be retained when the file is loaded
  6. and re-saved.
  7. Created with Introjucer version: 3.1.0
  8. ------------------------------------------------------------------------------
  9. The Introjucer is part of the JUCE library - "Jules' Utility Class Extensions"
  10. Copyright 2004-13 by Raw Material Software Ltd.
  11. ==============================================================================
  12. */
  13. //[Headers] You can add your own extra header files here...
  14. #include "LinJam.h"
  15. #include "Constants.h"
  16. #include "Mixer.h"
  17. #include "ConfigChannel.h"
  18. #include "./Trace/TraceChannels.h"
  19. //[/Headers]
  20. #include "Channel.h"
  21. //[MiscUserDefs] You can add your own user definitions and misc code here...
  22. //[/MiscUserDefs]
  23. //==============================================================================
  24. Channel::Channel (ValueTree channel_store)
  25. {
  26. setName ("Channel");
  27. addAndMakeVisible (xmitButton = new ToggleButton ("xmitButton"));
  28. xmitButton->setExplicitFocusOrder (1);
  29. xmitButton->setButtonText (TRANS("XMIT"));
  30. xmitButton->setColour (ToggleButton::textColourId, Colours::grey);
  31. addAndMakeVisible (muteButton = new ToggleButton ("muteButton"));
  32. muteButton->setExplicitFocusOrder (2);
  33. muteButton->setButtonText (TRANS("MUTE"));
  34. muteButton->setColour (ToggleButton::textColourId, Colours::grey);
  35. addAndMakeVisible (soloButton = new ToggleButton ("soloButton"));
  36. soloButton->setExplicitFocusOrder (3);
  37. soloButton->setButtonText (TRANS("SOLO"));
  38. soloButton->setColour (ToggleButton::textColourId, Colours::grey);
  39. addAndMakeVisible (removeButton = new TextButton ("removeButton"));
  40. removeButton->setExplicitFocusOrder (4);
  41. removeButton->setButtonText (TRANS("X"));
  42. removeButton->setColour (TextButton::buttonColourId, Colour (0xff400000));
  43. removeButton->setColour (TextButton::buttonOnColourId, Colours::maroon);
  44. removeButton->setColour (TextButton::textColourOnId, Colours::red);
  45. removeButton->setColour (TextButton::textColourOffId, Colours::red);
  46. addAndMakeVisible (configButton = new TextButton ("configButton"));
  47. configButton->setExplicitFocusOrder (5);
  48. configButton->setButtonText (TRANS("?"));
  49. configButton->setColour (TextButton::buttonColourId, Colour (0xff404000));
  50. configButton->setColour (TextButton::buttonOnColourId, Colours::olive);
  51. configButton->setColour (TextButton::textColourOnId, Colours::yellow);
  52. configButton->setColour (TextButton::textColourOffId, Colours::yellow);
  53. addAndMakeVisible (panSlider = new Slider ("panSlider"));
  54. panSlider->setExplicitFocusOrder (6);
  55. panSlider->setRange (-1, 1, 0);
  56. panSlider->setSliderStyle (Slider::Rotary);
  57. panSlider->setTextBoxStyle (Slider::NoTextBox, true, 0, 12);
  58. panSlider->setColour (Slider::textBoxTextColourId, Colours::grey);
  59. panSlider->setColour (Slider::textBoxBackgroundColourId, Colours::black);
  60. panSlider->addListener (this);
  61. addAndMakeVisible (gainSlider = new Slider ("gainSlider"));
  62. gainSlider->setExplicitFocusOrder (7);
  63. gainSlider->setRange (-120, 20, 0);
  64. gainSlider->setSliderStyle (Slider::LinearVertical);
  65. gainSlider->setTextBoxStyle (Slider::NoTextBox, true, 48, 12);
  66. gainSlider->setColour (Slider::textBoxTextColourId, Colours::grey);
  67. gainSlider->setColour (Slider::textBoxBackgroundColourId, Colour (0x00000000));
  68. gainSlider->addListener (this);
  69. addAndMakeVisible (nameLabel = new Label ("nameLabel",
  70. TRANS("channel name")));
  71. nameLabel->setExplicitFocusOrder (8);
  72. nameLabel->setFont (Font (12.00f, Font::plain));
  73. nameLabel->setJustificationType (Justification::centred);
  74. nameLabel->setEditable (true, true, true);
  75. nameLabel->setColour (Label::textColourId, Colours::grey);
  76. nameLabel->setColour (TextEditor::textColourId, Colours::black);
  77. nameLabel->setColour (TextEditor::backgroundColourId, Colour (0x00000000));
  78. nameLabel->addListener (this);
  79. addAndMakeVisible (stereoLabel = new Label ("stereoLabel",
  80. TRANS("ST")));
  81. stereoLabel->setFont (Font (10.00f, Font::bold));
  82. stereoLabel->setJustificationType (Justification::centred);
  83. stereoLabel->setEditable (false, false, false);
  84. stereoLabel->setColour (Label::textColourId, Colours::green);
  85. stereoLabel->setColour (TextEditor::textColourId, Colours::black);
  86. stereoLabel->setColour (TextEditor::backgroundColourId, Colour (0x00000000));
  87. addAndMakeVisible (vuLeftSlider = new Slider ("vuLeftSlider"));
  88. vuLeftSlider->setRange (-120, 20, 0);
  89. vuLeftSlider->setSliderStyle (Slider::LinearBar);
  90. vuLeftSlider->setTextBoxStyle (Slider::NoTextBox, true, 48, 12);
  91. vuLeftSlider->setColour (Slider::textBoxTextColourId, Colours::grey);
  92. vuLeftSlider->setColour (Slider::textBoxBackgroundColourId, Colour (0x00000000));
  93. vuLeftSlider->addListener (this);
  94. addAndMakeVisible (vuRightSlider = new Slider ("vuRightSlider"));
  95. vuRightSlider->setRange (-120, 20, 0);
  96. vuRightSlider->setSliderStyle (Slider::LinearBar);
  97. vuRightSlider->setTextBoxStyle (Slider::NoTextBox, true, 48, 12);
  98. vuRightSlider->setColour (Slider::textBoxTextColourId, Colours::grey);
  99. vuRightSlider->setColour (Slider::textBoxBackgroundColourId, Colour (0x00000000));
  100. vuRightSlider->addListener (this);
  101. addAndMakeVisible (vuLeftLabel = new Label ("vuLeftLabel",
  102. TRANS("-120")));
  103. vuLeftLabel->setFont (Font (10.00f, Font::plain));
  104. vuLeftLabel->setJustificationType (Justification::centred);
  105. vuLeftLabel->setEditable (false, false, false);
  106. vuLeftLabel->setColour (Label::textColourId, Colours::grey);
  107. vuLeftLabel->setColour (TextEditor::textColourId, Colours::black);
  108. vuLeftLabel->setColour (TextEditor::backgroundColourId, Colour (0x00000000));
  109. addAndMakeVisible (vuRightLabel = new Label ("vuRightLabel",
  110. TRANS("-120")));
  111. vuRightLabel->setFont (Font (10.00f, Font::plain));
  112. vuRightLabel->setJustificationType (Justification::centred);
  113. vuRightLabel->setEditable (false, false, false);
  114. vuRightLabel->setColour (Label::textColourId, Colours::grey);
  115. vuRightLabel->setColour (TextEditor::textColourId, Colours::black);
  116. vuRightLabel->setColour (TextEditor::backgroundColourId, Colour (0x00000000));
  117. //[UserPreSize]
  118. this->vuLeftSlider ->setSliderStyle(Slider::LinearBarVertical) ;
  119. this->vuRightSlider->setSliderStyle(Slider::LinearBarVertical) ;
  120. this->vuLeftSlider ->setValue(CLIENT::VU_DB_MIN) ;
  121. this->vuRightSlider->setValue(CLIENT::VU_DB_MIN) ;
  122. //[/UserPreSize]
  123. setSize (60, 252);
  124. //[Constructor] You can add your own custom stuff here..
  125. String channel_name = channel_store[CONFIG::CHANNEL_NAME_ID].toString() ;
  126. double volume = double(channel_store[CONFIG::VOLUME_ID]) ;
  127. double pan = double(channel_store[CONFIG::PAN_ID]) ;
  128. bool is_xmit = bool( channel_store[CONFIG::IS_XMIT_RCV_ID]) ;
  129. bool is_muted = bool( channel_store[CONFIG::IS_MUTED_ID]) ;
  130. bool is_solo = bool( channel_store[CONFIG::IS_SOLO_ID]) ;
  131. double vu_min = 0.0 ;
  132. double vu_max = CLIENT::VU_DB_RANGE ;
  133. double gain_min = CLIENT::VU_DB_MIN ;
  134. double gain_max = CLIENT::VU_DB_MIN + CLIENT::VU_DB_RANGE ;
  135. this->nameLabel ->setText( channel_name , juce::dontSendNotification) ;
  136. this->gainSlider->setValue( volume) ;
  137. this->panSlider ->setValue( pan) ;
  138. this->xmitButton->setToggleState(is_xmit , juce::dontSendNotification) ;
  139. this->muteButton->setToggleState(is_muted , juce::dontSendNotification) ;
  140. this->soloButton->setToggleState(is_solo , juce::dontSendNotification) ;
  141. this->gainSlider ->setDoubleClickReturnValue(true , 0.0) ;
  142. this->panSlider ->setDoubleClickReturnValue(true , 0.0) ;
  143. this->vuLeftSlider ->setInterceptsMouseClicks(false , false) ;
  144. this->vuRightSlider->setInterceptsMouseClicks(false , false) ;
  145. this->vuLeftSlider ->setRange(vu_min , vu_max , 0) ;
  146. this->vuRightSlider->setRange(vu_min , vu_max , 0) ;
  147. this->gainSlider ->setRange(gain_min , gain_max , 0) ;
  148. this->removeButton->addListener(this) ;
  149. this->configButton->addListener(this) ;
  150. this->xmitButton ->addListener(this) ;
  151. this->muteButton ->addListener(this) ;
  152. this->soloButton ->addListener(this) ;
  153. // establish shared config storage and listeners
  154. this->configStore = channel_store ;
  155. Value name_value = getValueObject(CONFIG::CHANNEL_NAME_ID) ;
  156. Value stereo_value = getValueObject(CONFIG::STEREO_ID) ;
  157. Value vu_l_value = getValueObject(CONFIG::VU_LEFT_ID) ;
  158. Value vu_r_value = getValueObject(CONFIG::VU_RIGHT_ID) ;
  159. this->channelName .referTo(name_value) ;
  160. this->stereoStatus.referTo(stereo_value) ;
  161. this->vuLeft .referTo(vu_l_value) ;
  162. this->vuRight .referTo(vu_r_value) ;
  163. this->channelName .addListener(this) ;
  164. this->stereoStatus.addListener(this) ;
  165. this->vuLeft .addListener(this) ;
  166. this->vuRight .addListener(this) ;
  167. //[/Constructor]
  168. }
  169. Channel::~Channel()
  170. {
  171. //[Destructor_pre]. You can add your own custom destruction code here..
  172. //[/Destructor_pre]
  173. xmitButton = nullptr;
  174. muteButton = nullptr;
  175. soloButton = nullptr;
  176. removeButton = nullptr;
  177. configButton = nullptr;
  178. panSlider = nullptr;
  179. gainSlider = nullptr;
  180. nameLabel = nullptr;
  181. stereoLabel = nullptr;
  182. vuLeftSlider = nullptr;
  183. vuRightSlider = nullptr;
  184. vuLeftLabel = nullptr;
  185. vuRightLabel = nullptr;
  186. //[Destructor]. You can add your own custom destruction code here..
  187. //[/Destructor]
  188. }
  189. //==============================================================================
  190. void Channel::paint (Graphics& g)
  191. {
  192. //[UserPrePaint] Add your own custom painting code here..
  193. //[/UserPrePaint]
  194. g.setColour (Colours::black);
  195. g.fillRoundedRectangle (0.0f, 0.0f, static_cast<float> (getWidth() - 0), static_cast<float> (getHeight() - 0), 10.000f);
  196. g.setColour (Colours::white);
  197. g.drawRoundedRectangle (0.0f, 0.0f, static_cast<float> (getWidth() - 0), static_cast<float> (getHeight() - 0), 10.000f, 1.000f);
  198. //[UserPaint] Add your own custom painting code here..
  199. //[/UserPaint]
  200. }
  201. void Channel::resized()
  202. {
  203. xmitButton->setBounds (4, 4, 36, 12);
  204. muteButton->setBounds (4, 20, 36, 12);
  205. soloButton->setBounds (4, 36, 36, 12);
  206. removeButton->setBounds (45, 0, 15, 16);
  207. configButton->setBounds (45, 16, 15, 16);
  208. panSlider->setBounds (12, 52, 36, 36);
  209. gainSlider->setBounds (22, 92, 16, 128);
  210. nameLabel->setBounds (4, 236, 52, 12);
  211. stereoLabel->setBounds (12, 72, 36, 12);
  212. vuLeftSlider->setBounds (6, 92, 16, 128);
  213. vuRightSlider->setBounds (38, 92, 16, 128);
  214. vuLeftLabel->setBounds (4, 224, 24, 12);
  215. vuRightLabel->setBounds (32, 224, 24, 12);
  216. //[UserResized] Add your own custom resize handling here..
  217. bool is_mono = int(this->stereoStatus.getValue()) == CONFIG::MONO ;
  218. bool is_master = this->configStore.getParent().getType() == CONFIG::MASTERS_ID &&
  219. this->configStore .getType() == CONFIG::MASTER_ID ;
  220. if (is_mono && !is_master)
  221. {
  222. vuLeftSlider->setBounds(6 , 92 , 24 , 128) ;
  223. gainSlider ->setBounds(32 , 92 , 24 , 128) ;
  224. }
  225. //[/UserResized]
  226. }
  227. void Channel::sliderValueChanged (Slider* sliderThatWasMoved)
  228. {
  229. //[UsersliderValueChanged_Pre]
  230. //[/UsersliderValueChanged_Pre]
  231. if (sliderThatWasMoved == panSlider)
  232. {
  233. //[UserSliderCode_panSlider] -- add your slider handling code here..
  234. // set stored config for this channel pan (configures NJClient implicitly)
  235. double pan = sliderThatWasMoved->getValue() ;
  236. setConfig(CONFIG::PAN_ID , var(pan)) ;
  237. //[/UserSliderCode_panSlider]
  238. }
  239. else if (sliderThatWasMoved == gainSlider)
  240. {
  241. //[UserSliderCode_gainSlider] -- add your slider handling code here..
  242. // set stored config for this channel volume (configures NJClient implicitly)
  243. double gain = sliderThatWasMoved->getValue() ;
  244. setConfig(CONFIG::VOLUME_ID , var(gain)) ;
  245. //[/UserSliderCode_gainSlider]
  246. }
  247. else if (sliderThatWasMoved == vuLeftSlider)
  248. {
  249. //[UserSliderCode_vuLeftSlider] -- add your slider handling code here..
  250. //[/UserSliderCode_vuLeftSlider]
  251. }
  252. else if (sliderThatWasMoved == vuRightSlider)
  253. {
  254. //[UserSliderCode_vuRightSlider] -- add your slider handling code here..
  255. //[/UserSliderCode_vuRightSlider]
  256. }
  257. //[UsersliderValueChanged_Post]
  258. //[/UsersliderValueChanged_Post]
  259. }
  260. void Channel::labelTextChanged (Label* labelThatHasChanged)
  261. {
  262. //[UserlabelTextChanged_Pre]
  263. //[/UserlabelTextChanged_Pre]
  264. if (labelThatHasChanged == nameLabel)
  265. {
  266. //[UserLabelCode_nameLabel] -- add your label text handling code here..
  267. DEBUG_TRACE_RENAME_CHANNEL_GUI_VIA_LABEL
  268. // store new channel name (configures NJClient asynchronously)
  269. setConfig(CONFIG::CHANNEL_NAME_ID , var(this->nameLabel->getText())) ;
  270. //[/UserLabelCode_nameLabel]
  271. }
  272. //[UserlabelTextChanged_Post]
  273. //[/UserlabelTextChanged_Post]
  274. }
  275. //[MiscUserCode] You can add your own definitions of your custom methods or any other code here...
  276. /* Channel class private instance methods */
  277. void Channel::buttonClicked(Button* a_button) { handleButtonClicked(a_button) ; }
  278. void Channel::valueChanged(Value& a_value)
  279. {
  280. if (a_value.refersToSameSourceAs(this->vuLeft))
  281. updateChannelVU(this->vuLeftSlider , this->vuLeftLabel ,
  282. double(this->vuLeft.getValue())) ;
  283. else if (a_value.refersToSameSourceAs(this->vuRight))
  284. updateChannelVU(this->vuRightSlider , this->vuRightLabel ,
  285. double(this->vuRight.getValue())) ;
  286. else if (a_value.refersToSameSourceAs(this->stereoStatus)) setStereoState() ;
  287. else if (a_value.refersToSameSourceAs(this->channelName))
  288. {
  289. DEBUG_TRACE_RENAME_CHANNEL_GUI_VIA_CALLOUTBOX
  290. String new_channel_name = this->channelName.getValue().toString() ;
  291. this->nameLabel->setText(new_channel_name , juce::dontSendNotification) ;
  292. }
  293. }
  294. void Channel::updateChannelVU(Slider* a_vu_slider , Label* a_vu_label , double vu)
  295. {
  296. double actual_vu = vu + CLIENT::VU_DB_MIN ;
  297. bool is_metro = this->configStore.getType() == CONFIG::METRO_ID ;
  298. bool is_saturated = actual_vu >= 0.0 && !is_metro ;
  299. String label_text = (vu <= CLIENT::VU_DB_RANGE)? String(int(actual_vu)) :
  300. String(GUI::INFINITY_CHAR) ;
  301. a_vu_slider->setValue(vu) ;
  302. a_vu_label ->setText(label_text , juce::dontSendNotification) ;
  303. a_vu_slider->setColour(Slider::thumbColourId , (is_saturated) ?
  304. Colours::red :
  305. Colour(0xFFBBBBFF)) ;
  306. a_vu_slider->setColour(Slider::trackColourId , (is_saturated) ?
  307. Colour(0x01800000) :
  308. Colour(0x01008000)) ;
  309. }
  310. Value Channel::getValueObject(Identifier a_key)
  311. {
  312. return this->configStore.getPropertyAsValue(a_key , nullptr) ;
  313. }
  314. void Channel::setConfig(Identifier a_key , var a_value)
  315. {
  316. this->configStore.setProperty(a_key , a_value , nullptr) ;
  317. }
  318. /* Channel class protected instance methods */
  319. bool Channel::handleButtonClicked(Button* a_button)
  320. {
  321. // set stored config for this channel (configures NJClient implicitly)
  322. if (a_button == this->xmitButton)
  323. setConfig(CONFIG::IS_XMIT_RCV_ID , var(a_button->getToggleState())) ;
  324. else if (a_button == this->muteButton)
  325. setConfig(CONFIG::IS_MUTED_ID , var(a_button->getToggleState())) ;
  326. else if (a_button == this->soloButton)
  327. setConfig(CONFIG::IS_SOLO_ID , var(a_button->getToggleState())) ;
  328. else return false ;
  329. return true ;
  330. }
  331. void Channel::setStereoState()
  332. {
  333. DEBUG_TRACE_STEREO_STATE_GUI
  334. bool is_stereo = int(this->stereoStatus.getValue()) != CONFIG::MONO ;
  335. bool is_metro = this->configStore.getType() == CONFIG::METRO_ID ;
  336. // show/hide stereo-only components
  337. this->stereoLabel ->setVisible(is_stereo) ;
  338. this->vuRightSlider->setVisible(is_stereo) ;
  339. this->vuRightLabel ->setVisible(is_stereo && !is_metro) ;
  340. // set channel name
  341. String channel_name = this->channelName.getValue().toString() ;
  342. String stereo_postfix = channel_name.getLastCharacters(CLIENT::STEREO_POSTFIX_N_CHARS) ;
  343. if (is_stereo && !stereo_postfix.compare(CLIENT::STEREO_L_POSTFIX))
  344. channel_name = LinJamConfig::TrimStereoName(channel_name) ;
  345. this->nameLabel->setText(channel_name , juce::dontSendNotification) ;
  346. resized() ;
  347. }
  348. /* MasterChannels , LocalChannels , RemoteChannels classes private class methods */
  349. MasterChannel::MasterChannel(ValueTree channel_store) : Channel(channel_store)
  350. {
  351. this->removeButton->setVisible(false) ;
  352. this->configButton->setVisible(false) ;
  353. this->xmitButton ->setVisible(false) ;
  354. this->soloButton ->setVisible(false) ;
  355. this->stereoLabel ->setVisible(true) ;
  356. this->nameLabel ->setEditable(false , false , false) ;
  357. // metro VU used as loop progress indicator
  358. if (this->configStore.getType() == CONFIG::METRO_ID)
  359. {
  360. this->vuLeftSlider ->setRange(0.0 , 1.0 , 0.0) ;
  361. this->vuRightSlider->setRange(0.0 , 1.0 , 0.0) ;
  362. this->vuLeftLabel ->setVisible(false) ;
  363. this->vuRightLabel ->setVisible(false) ;
  364. }
  365. setStereoState() ;
  366. }
  367. LocalChannel::LocalChannel(ValueTree channel_store) : Channel(channel_store)
  368. {
  369. this->xmitButton->setButtonText(GUI::XMIT_LABEL_TEXT) ;
  370. setStereoState() ;
  371. }
  372. RemoteChannel::RemoteChannel(ValueTree channel_store) : Channel(channel_store)
  373. {
  374. this->nameLabel ->setEditable(false , false , false) ;
  375. this->removeButton->setVisible(false) ;
  376. this->configButton->setVisible(false) ;
  377. this->xmitButton ->setButtonText(GUI::RCV_LABEL_TEXT) ;
  378. setStereoState() ;
  379. }
  380. /* LocalChannel class private instance methods */
  381. void LocalChannel::buttonClicked(Button* a_button)
  382. {
  383. if (handleButtonClicked(a_button)) return ;
  384. if (a_button == this->removeButton)
  385. LinJam::RemoveLocalChannel(this->configStore) ;
  386. else if (a_button == this->configButton)
  387. {
  388. ConfigChannel* configChannel = new ConfigChannel(this->configStore) ;
  389. Component* mixer = getParentComponent()->getParentComponent() ;
  390. Component* mainContent = mixer->getParentComponent() ;
  391. // compute CallOutBox arrow target posistion
  392. int modalX = mixer->getX() + getX() + this->configButton->getX() + GUI::HOVER_BTN_XC ;
  393. int modalY = mixer->getY() + getY() + this->configButton->getY() + GUI::HOVER_BTN_YC ;
  394. juce::Rectangle<int> modalRect = juce::Rectangle<int>(modalX , modalY , 1 , 1) ;
  395. // instantiate ConfigChannel as CallOutBox
  396. configChannel->setSize(GUI::CHANNEL_CONFIG_W , GUI::CHANNEL_CONFIG_H) ;
  397. CallOutBox::launchAsynchronously(configChannel , modalRect , mainContent) ;
  398. }
  399. }
  400. //[/MiscUserCode]
  401. //==============================================================================
  402. #if 0
  403. /* -- Introjucer information section --
  404. This is where the Introjucer stores the metadata that describe this GUI layout, so
  405. make changes in here at your peril!
  406. BEGIN_JUCER_METADATA
  407. <JUCER_COMPONENT documentType="Component" className="Channel" componentName="Channel"
  408. parentClasses="public Component, public ButtonListener, public SliderListener, public Value::Listener"
  409. constructorParams="ValueTree channel_store" variableInitialisers=""
  410. snapPixels="8" snapActive="1" snapShown="1" overlayOpacity="0.330"
  411. fixedSize="0" initialWidth="60" initialHeight="252">
  412. <BACKGROUND backgroundColour="0">
  413. <ROUNDRECT pos="0 0 0M 0M" cornerSize="10" fill="solid: ff000000" hasStroke="1"
  414. stroke="1, mitered, butt" strokeColour="solid: ffffffff"/>
  415. </BACKGROUND>
  416. <TOGGLEBUTTON name="xmitButton" id="f45f759640162c62" memberName="xmitButton"
  417. virtualName="" explicitFocusOrder="1" pos="4 4 36 12" txtcol="ff808080"
  418. buttonText="XMIT" connectedEdges="0" needsCallback="0" radioGroupId="0"
  419. state="0"/>
  420. <TOGGLEBUTTON name="muteButton" id="263020526add917" memberName="muteButton"
  421. virtualName="" explicitFocusOrder="2" pos="4 20 36 12" txtcol="ff808080"
  422. buttonText="MUTE" connectedEdges="0" needsCallback="0" radioGroupId="0"
  423. state="0"/>
  424. <TOGGLEBUTTON name="soloButton" id="3b096c8c7df5c792" memberName="soloButton"
  425. virtualName="" explicitFocusOrder="3" pos="4 36 36 12" txtcol="ff808080"
  426. buttonText="SOLO" connectedEdges="0" needsCallback="0" radioGroupId="0"
  427. state="0"/>
  428. <TEXTBUTTON name="removeButton" id="becd368b728d32c0" memberName="removeButton"
  429. virtualName="" explicitFocusOrder="4" pos="45 0 15 16" bgColOff="ff400000"
  430. bgColOn="ff800000" textCol="ffff0000" textColOn="ffff0000" buttonText="X"
  431. connectedEdges="0" needsCallback="0" radioGroupId="0"/>
  432. <TEXTBUTTON name="configButton" id="f0a56a4ebe614916" memberName="configButton"
  433. virtualName="" explicitFocusOrder="5" pos="45 16 15 16" bgColOff="ff404000"
  434. bgColOn="ff808000" textCol="ffffff00" textColOn="ffffff00" buttonText="?"
  435. connectedEdges="0" needsCallback="0" radioGroupId="0"/>
  436. <SLIDER name="panSlider" id="aa7c4f80abb603e9" memberName="panSlider"
  437. virtualName="" explicitFocusOrder="6" pos="12 52 36 36" textboxtext="ff808080"
  438. textboxbkgd="ff000000" min="-1" max="1" int="0" style="Rotary"
  439. textBoxPos="NoTextBox" textBoxEditable="0" textBoxWidth="0" textBoxHeight="12"
  440. skewFactor="1"/>
  441. <SLIDER name="gainSlider" id="e34ef13291b2ec40" memberName="gainSlider"
  442. virtualName="" explicitFocusOrder="7" pos="22 92 16 128" textboxtext="ff808080"
  443. textboxbkgd="0" min="-120" max="20" int="0" style="LinearVertical"
  444. textBoxPos="NoTextBox" textBoxEditable="0" textBoxWidth="48"
  445. textBoxHeight="12" skewFactor="1"/>
  446. <LABEL name="nameLabel" id="66bafa468220da02" memberName="nameLabel"
  447. virtualName="" explicitFocusOrder="8" pos="4 236 52 12" textCol="ff808080"
  448. edTextCol="ff000000" edBkgCol="0" labelText="channel name" editableSingleClick="1"
  449. editableDoubleClick="1" focusDiscardsChanges="1" fontname="Default font"
  450. fontsize="12" bold="0" italic="0" justification="36"/>
  451. <LABEL name="stereoLabel" id="deaf84482cab9f7d" memberName="stereoLabel"
  452. virtualName="" explicitFocusOrder="0" pos="12 72 36 12" textCol="ff008000"
  453. edTextCol="ff000000" edBkgCol="0" labelText="ST" editableSingleClick="0"
  454. editableDoubleClick="0" focusDiscardsChanges="0" fontname="Default font"
  455. fontsize="10" bold="1" italic="0" justification="36"/>
  456. <SLIDER name="vuLeftSlider" id="fbb656fdc87f46ed" memberName="vuLeftSlider"
  457. virtualName="" explicitFocusOrder="0" pos="6 92 16 128" textboxtext="ff808080"
  458. textboxbkgd="0" min="-120" max="20" int="0" style="LinearBar"
  459. textBoxPos="NoTextBox" textBoxEditable="0" textBoxWidth="48"
  460. textBoxHeight="12" skewFactor="1"/>
  461. <SLIDER name="vuRightSlider" id="31c942b6caa362dd" memberName="vuRightSlider"
  462. virtualName="" explicitFocusOrder="0" pos="38 92 16 128" textboxtext="ff808080"
  463. textboxbkgd="0" min="-120" max="20" int="0" style="LinearBar"
  464. textBoxPos="NoTextBox" textBoxEditable="0" textBoxWidth="48"
  465. textBoxHeight="12" skewFactor="1"/>
  466. <LABEL name="vuLeftLabel" id="cdc1fb3056af7c9b" memberName="vuLeftLabel"
  467. virtualName="" explicitFocusOrder="0" pos="4 224 24 12" textCol="ff808080"
  468. edTextCol="ff000000" edBkgCol="0" labelText="-120" editableSingleClick="0"
  469. editableDoubleClick="0" focusDiscardsChanges="0" fontname="Default font"
  470. fontsize="10" bold="0" italic="0" justification="36"/>
  471. <LABEL name="vuRightLabel" id="4bb31261e6795ae1" memberName="vuRightLabel"
  472. virtualName="" explicitFocusOrder="0" pos="32 224 24 12" textCol="ff808080"
  473. edTextCol="ff000000" edBkgCol="0" labelText="-120" editableSingleClick="0"
  474. editableDoubleClick="0" focusDiscardsChanges="0" fontname="Default font"
  475. fontsize="10" bold="0" italic="0" justification="36"/>
  476. </JUCER_COMPONENT>
  477. END_JUCER_METADATA
  478. */
  479. #endif
  480. //[EndFile] You can add extra defines here...
  481. //[/EndFile]