99 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			99 lines
		
	
	
		
			2.8 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| //
 | |
| // Created by Alex Birch on 01/10/2017.
 | |
| //
 | |
| 
 | |
| #include "Pills.h"
 | |
| #include "MyColours.h"
 | |
| 
 | |
| using namespace std;
 | |
| 
 | |
| Pills::Pills(
 | |
|         string label,
 | |
|         const vector<string> &items,
 | |
|         const function<void (int)> &onItemSelected,
 | |
|         const function<int (const string&)> &itemToIDMapper,
 | |
|         int initiallySelectedItem
 | |
| ) : label(label),
 | |
|     items(items),
 | |
|     onItemSelected(onItemSelected),
 | |
|     itemToIDMapper(itemToIDMapper)
 | |
| {
 | |
|     // faster (rounded edges introduce transparency)
 | |
|     setOpaque (true);
 | |
| 
 | |
|     populate(initiallySelectedItem);
 | |
| }
 | |
| 
 | |
| void Pills::populate(int initiallySelectedItem) {
 | |
|     int index = 0;
 | |
|     for (string item : items) {
 | |
|         TextButton* pill = addToList(new TextButton(
 | |
|                 item
 | |
|         ));
 | |
| //        pill->setColour (TextButton::buttonOnColourId, Colours::blueviolet.brighter());
 | |
| //        pill->setBounds(20 + index * 55, 260, 55, 24);
 | |
|         pill->setConnectedEdges (
 | |
|                 (index == 0 ? 0 : Button::ConnectedOnLeft)
 | |
|                         | (index == (items.size()-1) ? 0 : Button::ConnectedOnRight)
 | |
|         );
 | |
|         pill->setRadioGroupId(34567);
 | |
|         if (index == initiallySelectedItem) {
 | |
|             pill->setToggleState(true, dontSendNotification);
 | |
|             selected = pill;
 | |
|         }
 | |
|         pill->setClickingTogglesState(true);
 | |
|         pill->addListener(this);
 | |
|         index++;
 | |
|     }
 | |
| }
 | |
| 
 | |
| void Pills::setItems(
 | |
|         const vector<string> &items,
 | |
|         int initiallySelectedItem
 | |
| ) {
 | |
|     this->items = items;
 | |
|     for(TextButton* t : buttons) {
 | |
|         t->removeListener(this);
 | |
|     }
 | |
|     buttons.clear(true);
 | |
|     populate(initiallySelectedItem);
 | |
|     resized();
 | |
| }
 | |
| 
 | |
| void Pills::buttonClicked (Button* button) {
 | |
|     selected = button;
 | |
|     onItemSelected(itemToIDMapper(button->getName().toStdString()));
 | |
| }
 | |
| 
 | |
| TextButton* Pills::addToList (TextButton* newButton) {
 | |
|     buttons.add (newButton);
 | |
|     addAndMakeVisible (newButton);
 | |
|     return newButton;
 | |
| }
 | |
| 
 | |
| void Pills::cycle(bool right) {
 | |
|     int currentIx = static_cast<const int>(distance(buttons.begin(), find(buttons.begin(), buttons.end(), selected)));
 | |
|     currentIx += right ? 1 : buttons.size()-1;
 | |
|     buttons[currentIx % buttons.size()]->triggerClick();
 | |
| }
 | |
| 
 | |
| void Pills::resized() {
 | |
|     int index = 0;
 | |
|     Rectangle<int> r (getLocalBounds());
 | |
|     const int equalWidth = r.proportionOfWidth(buttons.size() <= 0 ? 1.0 : 1.0f/buttons.size());
 | |
|     for(TextButton* t : buttons) {
 | |
|         Rectangle<int> r2 (getLocalBounds());
 | |
|         r2.removeFromLeft(equalWidth * index);
 | |
|         r2.removeFromRight(equalWidth * (buttons.size()-index-1));
 | |
|         t->setBounds (r2);
 | |
|         index++;
 | |
|     }
 | |
| }
 | |
| 
 | |
| /**
 | |
|  * This is required to support setOpaque(true)
 | |
|  */
 | |
| void Pills::paint(Graphics& g)
 | |
| {
 | |
|     g.fillAll(MyColours::getUIColourIfAvailable(LookAndFeel_V4::ColourScheme::UIColour::windowBackground, Colours::lightgrey));
 | |
| } |