|
- /*
- ==============================================================================
-
- This file is part of the JUCETICE project - Copyright 2008 by Lucio Asnaghi.
-
- JUCETICE is based around the JUCE library - "Jules' Utility Class Extensions"
- Copyright 2008 by Julian Storer.
-
- ------------------------------------------------------------------------------
-
- JUCE and JUCETICE can be redistributed and/or modified under the terms of
- the GNU Lesser General Public License, as published by the Free Software
- Foundation; either version 2 of the License, or (at your option) any later
- version.
-
- JUCE and JUCETICE are distributed in the hope that they will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- GNU General Public License for more details.
-
- You should have received a copy of the GNU Lesser General Public License
- along with JUCE and JUCETICE; if not, visit www.gnu.org/licenses or write to
- Free Software Foundation, Inc., 59 Temple Place, Suite 330,
- Boston, MA 02111-1307 USA
-
- ==============================================================================
-
- @author rockhardbuns
- @tweaker Lucio Asnaghi
- @tweaker falkTX
-
- ==============================================================================
- */
-
- #ifndef DISTRHO_VEX_BOOLGRIDCOMPONENT_HEADER_INCLUDED
- #define DISTRHO_VEX_BOOLGRIDCOMPONENT_HEADER_INCLUDED
-
- #ifndef CARLA_EXPORT
- #define CARLA_EXPORT
- #endif
-
- #ifdef CARLA_EXPORT
- #include "juce_gui_basics.h"
- #else
- #include "../StandardHeader.h"
- #endif
-
- class BoolGridComponent : public Component,
- public ChangeBroadcaster
- {
- public:
- BoolGridComponent()
- : Component("Bool Grid Component")
- {
- grid = new bool[80];
- lastCell = -1;
- cellX = -1; cellY = -1;
- sizeX = 16; sizeY = 5;
- activeLength = 8;
-
- for(int x = 0; x < sizeX; x++)
- {
- for(int y = 0; y < sizeY; y++)
- {
- grid[(x * sizeY) + y] = false;
- }
- }
- }
-
- ~BoolGridComponent() override
- {
- delete[] grid;
- }
-
- void paint(Graphics& g) override
- {
- //background
- //g.setColour(Colour(200,200,210).withAlpha(0.4f));
- //g.fillRect(0,0,getWidth(),getHeight());
-
- //cell size -recalculate in case of resizing
- cellX = getWidth() / sizeX;
- cellY = getHeight() / sizeY;
-
- //Draw lines and checkmarks
- for(int x = 0; x < sizeX; x++){
- for(int y = 0; y < sizeY; y++){
- //lines
- g.setColour(Colour(100,100,130));
- g.drawLine((float) x*cellX, 0.0f,(float) x*cellX, (float) getHeight() );
- g.drawLine(0.0f, (float) y*cellY, (float)getWidth(), (float) y*cellY);
-
- //checkmarks
- g.setColour(Colours::black);
- if (grid[(x * sizeY) + sizeY - y -1]){
- g.fillEllipse((float) x*cellX+3, (float) y*cellY+3 ,(float) cellX - 5 ,(float) cellY - 5);
- }
- }
- }
-
- //Grey stuff out
- g.setColour(Colour(uint8(170),170,170,.7f));
- g.fillRect(cellX*activeLength,0,getWidth(),getHeight());
-
- //bevel outline for the entire draw area
- LookAndFeel_V2::drawBevel(g, 0, 0, getWidth(), getHeight(), 1, Colours::black, Colours::white, 0);
- }
-
- //Yay, someone clicked my component!
- void mouseDown(const MouseEvent& e) override
- {
- if (e.mouseWasClicked())
- {
- if ((e.y < getHeight()-1) && (e.x < getWidth()-1)){ //this avoids false triggers along the rims
-
- int cx = (e.x-1)/cellX; int cy = (e.y-1)/cellY; //cx,cy are the cell coords
-
- if (cx < activeLength){ //if the click was on the greyed out portion, we dont do jack
- lastCell = (cx * sizeY) + sizeY - cy -1;
- grid[lastCell]= !grid[lastCell]; //toggle the clicked cell
- repaint();
- sendChangeMessage();
- }
- }
- }
- }
-
- //get the state of a specific cell
- bool getCellState(int x, int y) const
- {
- return grid[(x * sizeY) + y];
- }
-
- bool getCellState(int x) const
- {
- return grid[x];
- }
-
- //set the state of a specific cell. the last param determines if we broadcast
- //Cell determined by grid coords i.e X * Y
- void setCellState(int x, int y, bool state, bool broadcast = false)
- {
- grid[(x * sizeY) + y] = state;
- if (broadcast){sendChangeMessage();}
- repaint();
- }
-
- //Overloaded - cell determined soley by array index
- void setCellState(int x, bool state, bool broadcast = false)
- {
- grid[x] = state;
- if (broadcast){sendChangeMessage();}
- repaint();
- }
-
- // the last changed cell, in terms of array index
- int getLastChanged()
- {
- return lastCell;
- lastCell = -1;
- }
-
- //Get the active length
- int getLength() const
- {
- return activeLength;
- }
-
- //Set the active length of the grid
- void setLength(int l)
- {
- activeLength = jmin(l, sizeX);
- activeLength = jmax(activeLength, 1);
- repaint();
- }
-
- //Clear the grid
- void reset()
- {
- for(int x = 0; x < sizeX; x++){
- for(int y = 0; y < sizeY; y++){
- grid[(x * sizeY) + y] = false;
- }
- }
- repaint();
- }
-
- private:
- int sizeX, sizeY; // grid size in number of cells
- int cellX, cellY; // cell size in pixels, used by paint();
- int lastCell; // last cell clicked, for outside interaction
- int activeLength; // How much of the grid should be usable vs greyed
-
- bool* grid; // SizeX * SizeY
-
- JUCE_DECLARE_NON_COPYABLE_WITH_LEAK_DETECTOR(BoolGridComponent)
- };
-
- #endif // DISTRHO_VEX_BOOLGRIDCOMPONENT_HEADER_INCLUDED
|