Same as original

button_group.cpp

Committer:
MikamiUitOpen
Date:
2016-02-17
Revision:
11:204bc17f59cc
Parent:
9:0573d8a9bbcd
Child:
13:af578b53ff0e

File content as of revision 11:204bc17f59cc:

//-----------------------------------------------------------
//  Button group class
//
//  2016/02/17, Copyright (c) 2016 MIKAMI, Naoki
//-----------------------------------------------------------

#include "button_group.hpp"

namespace Mikami
{
    // Constructor
    ButtonGroup::ButtonGroup(LCD_DISCO_F746NG &lcd, TS_DISCO_F746NG &ts,
                             uint16_t x0, uint16_t y0,
                             uint16_t width, uint16_t height,
                             uint32_t color, uint32_t backColor,
                             uint16_t number, const string str[],
                             uint16_t spaceX, uint16_t spaceY,
                             uint16_t column,
                             sFONT &fonts, uint32_t textColor)
                            : numberOfButtons_(number)
    {
        buttons_ = new Button *[number];
        for (int n=0; n<number; n++)
        {
            div_t u1 = div(n, column);
            uint16_t x = x0 + u1.rem*(width + spaceX);
            uint16_t y = y0 + u1.quot*(height + spaceY);
            buttons_[n] = new Button(lcd, ts, x, y, width, height,
                                     color, backColor,
                                     str[n], fonts, textColor);
        }
    }
    
    // Destructor
    ButtonGroup::~ButtonGroup()
    {
        for (int n=0; n<numberOfButtons_; n++) delete buttons_[n];
        delete[] *buttons_;   
    }

    // Redraw button with original color
    bool ButtonGroup::Redraw(int num, uint32_t textColor)
    {
        if (!Range(num)) return false;
        buttons_[num]->Redraw(textColor);
        return true;
    }

    // Erase button with selected color
    bool ButtonGroup::Erase(int num, uint32_t color)
    {
        if (!Range(num)) return false;
        buttons_[num]->Draw(color, color);
        return true;
    }

    // Check touch detected for specified button
    bool ButtonGroup::Touched(int num)
    {
        if (!Range(num)) return false;
        return buttons_[num]->Touched();
    }

    // Check touch detected for specified button and redraw
    bool ButtonGroup::Touched(int num, uint32_t color,
                              uint32_t textColor)
    {
        if (!Range(num)) return false;
        if (buttons_[num]->Touched(color, textColor))
        {
            for (int n=0; n<numberOfButtons_; n++)
                if (n != num) buttons_[n]->Redraw();
            return true;
        }
        else
            return false;
    }

    // Get touched number
    bool ButtonGroup::GetTouchedNumber(int &num)
    {
        for (int n=0; n<numberOfButtons_; n++)
            if (buttons_[n]->Touched())
            {
                num = n;
                return true;
            }
        return false;
    }

    // Get touched number and redraw button if touched
    bool ButtonGroup::GetTouchedNumber(int &num, uint32_t color)
    {
        if (GetTouchedNumber(num))
        {
            for (int n=0; n<numberOfButtons_; n++)
                if (n == num)
                    buttons_[n]->Draw(color);
                else
                    buttons_[n]->Redraw();
            return true;
        }
        else
            return false;
    }
    
    // Check range of argument
    bool ButtonGroup::Range(int n)
    {
        if ( (n >= 0) && (n < numberOfButtons_) )
            return true;
        else
            return false;
    }
}