DISCO-F469NI_Button_and_Slider_Library v1.0

Dependencies:   BSP_DISCO_F469NI LCD_DISCO_F469NI TS_DISCO_F469NI mbed

F469GUI/F469_BUTTON.cpp

Committer:
wsteenberg
Date:
2018-09-25
Revision:
0:ebf3f36f3a64

File content as of revision 0:ebf3f36f3a64:

//-----------------------------------------------------------
//
//  F469_BUTTON class
//
//-----------------------------------------------------------

#include "F469_BUTTON.hpp"

// Draw button
void Button::Render()
    {
        active_ = true;
        
        switch(STYLE_)
            {
                case 1:                                     // Style 1 - Normal button 
                    lcd_.SetTextColor(BUTTON_COLOUR_);      // Set Textcolour to original
                    lcd_.FillRect(ButtonX_, ButtonY_, ButtonW_, ButtonH_);  // Draw button rectangle
                    break;
        
                case 2:                                     // Style 2 - 3D button
                    lcd_.SetTextColor(LCD_COLOR_DARKGRAY);  // Set Textcolour to shadow colour
                    lcd_.FillRect(ButtonX_+1, ButtonY_+2, (ButtonW_+3), ButtonH_+3);// Draw shadow
                    
                    lcd_.SetTextColor(BUTTON_COLOUR_);      // Set Textcolour to original
                    lcd_.FillRect(ButtonX_, ButtonY_, ButtonW_, ButtonH_);  // Draw button
                    break; 
            }  
             if (LABEL_.length() != 0)                        // If the label is larger than 0
                    {
                        lcd_.SetFont(FONTS_);
                        lcd_.SetBackColor(BUTTON_COLOUR_);    // Set background colour
                        lcd_.SetTextColor(LCD_COLOR_WHITE);   // Set textcolour

                        uint16_t x0 = ButtonX_ + (ButtonW_ - FONT_WIDTH_*(LABEL_.length()))/2;      // Calcukate x value for Button name
                        uint16_t y0 = ButtonY_ + (ButtonH_ - FONT_HEIGHT_)/2 + 1;                   // Calcukate y value for Button name
                        lcd_.DisplayStringAt(x0, y0, (uint8_t *)LABEL_.c_str(),   
                                 LEFT_MODE);                    // Write button name
                        lcd_.SetBackColor(LCD_COLOR_WHITE);     // Set back colour
                    }        
    }
    

void Button::Change()   // Change colour of button when pressed
    {
        switch(STYLE_)
            {
                case 1:                                     // Style 1 - Normal button 
                    lcd_.SetTextColor(CHANGE_COLOUR_);      // Set Textcolour to the change colour
                    lcd_.FillRect(ButtonX_, ButtonY_, ButtonW_, ButtonH_);          // Draw button rectangle
                    break;
        
                case 2:                                     // Style 2 - 3D button
                    lcd_.SetTextColor(LCD_COLOR_WHITE);     // Set Textcolour to background colour
                    lcd_.FillRect(ButtonX_, ButtonY_, (ButtonW_+3), ButtonH_+3);    // Clears background
    
                    lcd_.SetTextColor(LCD_COLOR_GRAY);      // Set Textcolour to shadow colour
                    lcd_.FillRect(ButtonX_+1, ButtonY_+2, (ButtonW_+3), ButtonH_+3);// Draws shadow
        
                    lcd_.SetTextColor(CHANGE_COLOUR_);      // Indent button
                    lcd_.FillRect((ButtonX_+6), (ButtonY_+6), (ButtonW_-3), (ButtonH_-2));  // Draw indented button
                    break; 
                }         
        
             if (LABEL_.length() != 0)            
                    {
                        lcd_.SetFont(FONTS_);
                        lcd_.SetBackColor(CHANGE_COLOUR_);
                        lcd_.SetTextColor(LCD_COLOR_BLACK);
                        uint16_t x0 = ButtonX_ + (ButtonW_ - FONT_WIDTH_*(LABEL_.length()))/2;  // Calcukate x value for Button name
                        uint16_t y0 = ButtonY_ + (ButtonH_ - FONT_HEIGHT_)/2 + 1;               // Calcukate y value for Button name
                        lcd_.DisplayStringAt(x0, y0, (uint8_t *)LABEL_.c_str(),
                                 LEFT_MODE);                // Write button name 
                        lcd_.SetBackColor(LCD_COLOR_WHITE); // Set back colour
                    }          
    }
    
        

void Button::Hide()     // Hide button
    {
        lcd_.SetTextColor(LCD_COLOR_WHITE);                     // Set textcolour to background colour
        lcd_.FillRect(ButtonX_, ButtonY_, ButtonW_, ButtonH_);  // Draw rectangle in background colour     
        active_ = false;                                        // Set active boolean to false
    }
      

bool Button::Press()      // Check if touch detected
    {
        ts_.GetState(&state_);
        if (!state_.touchDetected) return false;
        if (!active_) return false;
        if (!ButtonBoundaryCheck()) return false;
        Change();           // Run the Change routine to change the colour of the button
        wait(0.2);          // Wait to allow the colour change to be visible
        Render();           // Draw the original button
        return true;
    } 

bool Button::ButtonBoundaryCheck()       // Check if touch is within button boundaries
    {
        int nTouch = multiTouch ? state_.touchDetected : 1;
        for (int n=0; n<nTouch; n++)
        {
            uint16_t x = state_.touchX[n];                  // Assign touch x pos to x
            uint16_t y = state_.touchY[n];                  // Assign touch y pos to y

            if ( (ButtonX_ <= x) && (x <= ButtonX_+ButtonW_) &&               // Check x value inside boundary
                 (ButtonY_ <= y) && (y <= ButtonY_+ButtonH_) ) return true;   // Check y value inside boundary
        }
        return false;
    }
    
TS_StateTypeDef Button::state_;
bool Button::multiTouch = false;