How can I access all 3 callbacks of the flexbutton widget? (or any button)
My code needs to react to button press, button down and button released. But only one of these callbacks can be selected in touchgfx designer...
My code needs to react to button press, button down and button released. But only one of these callbacks can be selected in touchgfx designer...
Hello,
Indeed, you cannot access 3 callbacks of a button in general using Designer. For that, you need to implement it yourself.
I don't really understand the point of 3 callbacks when a button has only 2 states : pressed and released. Press and button down is not supposed to be the same ?
I tried a rough implementation of a button that triggers a callback in the screen view with the current state (PRESSED or RELEASED). For that I based myself on the Designer implementation of a Flex button, creating my own widget based on a combination of ImageButtonStyle.hpp, ClickButtonTrigger.hpp and AbstractContainer.hpp.
Here is the code of the widget as well as the screen view
customButtonContainer.hpp
#ifndef CUSTOMBUTTONCONTAINER_HPP
#define CUSTOMBUTTONCONTAINER_HPP
#include <touchgfx/containers/Container.hpp>
#include <touchgfx/widgets/Image.hpp>
namespace touchgfx
{
/**
* @class CustomButtonTrigger CustomButtonTrigger.hpp
*/
class CustomButtonContainer : public Container
{
public:
/**
* @fn CustomButtonContainer::CustomButtonContainer()
*
* @brief Default constructor.
*/
CustomButtonContainer() : pressed(false), alpha(255), up(), down(), action(0)
{
setTouchable(true);
buttonImage.setXY(0, 0);
add(buttonImage);
}
/**
* @fn virtual CustomButtonContainer::~CustomButtonContainer()
*
* @brief Destructor.
*/
virtual ~CustomButtonContainer() {}
/**
* @fn virtual void CustomButtonContainer::setBitmaps(const Bitmap& bmpReleased, const Bitmap& bmpPressed)
*
* @brief Sets the bitmaps.
*
* @param bmpReleased The bitmap released.
* @param bmpPressed The bitmap pressed.
*/
virtual void setBitmaps(const Bitmap& bmpReleased, const Bitmap& bmpPressed)
{
up = bmpReleased;
down = bmpPressed;
setWidth(down.getWidth());
setHeight(down.getHeight());
handlePressedUpdated();
}
/**
* @fn void CustomButtonContainer::setBitmapXY(uint16_t x, uint16_t y)
*
* @brief Sets bitmap xy.
*
* @param x An uint16_t to process.
* @param y An uint16_t to process.
*/
void setBitmapXY(uint16_t x, uint16_t y)
{
buttonImage.setXY(x, y);
}
/**
* @fn Bitmap CustomButtonContainer::getCurrentlyDisplayedBitmap() const
*
* @brief Gets currently displayed bitmap.
*
* @return The currently displayed bitmap.
*/
Bitmap getCurrentlyDisplayedBitmap() const
{
return (pressed ? down : up);
}
/**
* @fn void CustomButtonContainer::setPressed(bool isPressed)
*
* @brief Sets the pressed state.
*
* @param isPressed True if is pressed, false if not.
*/
void setPressed(bool isPressed)
{
pressed = isPressed;
handlePressedUpdated();
}
/**
* @fn bool CustomButtonContainer::getPressed()
*
* @brief Gets the pressed state.
*
* @return True if it succeeds, false if it fails.
*/
bool getPressed()
{
return pressed;
}
/**
* @fn void CustomButtonContainer::setAlpha(uint8_t newAlpha)
*
* @brief Sets an alpha value.
*
* @param newAlpha The new alpha.
*/
void setAlpha(uint8_t newAlpha)
{
alpha = newAlpha;
handleAlphaUpdated();
}
/**
* @fn uint8_t CustomButtonContainer::getAlpha() const
*
* @brief Gets the alpha.
*
* @return The alpha value.
*/
uint8_t getAlpha() const
{
return alpha;
}
/**
* @fn void CustomButtonContainer::setAction(GenericCallback< const CustomButtonContainer&, bool& >& callback)
*
* @brief Sets an action callback.
*
* @param callback The callback.
*/
void setAction(GenericCallback< const CustomButtonContainer&, bool& >& callback)
{
action = &callback;
}
/**
* @fn virtual void CustomButtonContainer::handleClickEvent(const ClickEvent& event)
*
* @brief Handles the click event described by event.
*
* @param event The event.
*/
virtual void handleClickEvent(const ClickEvent& event)
{
bool wasPressed = getPressed();
bool newPressedValue = (event.getType() == ClickEvent::PRESSED);
if ((newPressedValue && !wasPressed) || (!newPressedValue && wasPressed))
{
setPressed(newPressedValue);
invalidate();
if (action->isValid())
{
action->execute(*this, pressed);
}
}
}
protected:
bool pressed; ///< True if pressed
uint8_t alpha; ///< The current alpha value. 255 denotes solid, 0 denotes completely transparent.
Image buttonImage; ///< The button image
Bitmap up; ///< The image to display when button is released.
Bitmap down; ///< The image to display when button is pressed.
GenericCallback< const CustomButtonContainer&, bool&>* action; ///< The action
/**
* @fn virtual void CustomButtonContainer::handlePressedUpdated()
*
* @brief Handles the pressed updated.
*/
virtual void handlePressedUpdated()
{
buttonImage.setBitmap(pressed ? down : up);
}
/**
* @fn virtual void CustomButtonContainer::handleAlphaUpdated()
*
* @brief Handles the alpha updated.
*/
virtual void handleAlphaUpdated()
{
buttonImage.setAlpha(alpha);
}
};
} // namespace touchgfx
#endif // CUSTOMBUTTONCONTAINER_HPPScreen1View.hpp
#ifndef SCREEN1VIEW_HPP
#define SCREEN1VIEW_HPP
#include <gui_generated/screen1_screen/Screen1ViewBase.hpp>
#include <gui/screen1_screen/Screen1Presenter.hpp>
#include <gui/common/customButtonContainer.hpp>
class Screen1View : public Screen1ViewBase
{
public:
Screen1View();
virtual ~Screen1View() {}
virtual void setupScreen();
virtual void tearDownScreen();
protected:
touchgfx::CustomButtonContainer customButton;
Callback<Screen1View, const CustomButtonContainer&, bool&> buttonEventCallback;
void handleButtonEvent(const CustomButtonContainer& element, bool& buttonState);
};
#endif // SCREEN1VIEW_HPPScreen1View.cpp
#include <gui/screen1_screen/Screen1View.hpp>
#include "BitmapDatabase.hpp"
Screen1View::Screen1View():
buttonEventCallback(this, &Screen1View::handleButtonEvent)
{
customButton.setBitmaps(Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_MEDIUM_ID), Bitmap(BITMAP_BLUE_BUTTONS_ROUND_EDGE_MEDIUM_PRESSED_ID));
customButton.setBitmapXY(0, 0);
customButton.setPosition(285, 200, 230, 60);
add(customButton);
customButton.setAction(buttonEventCallback);
}
void Screen1View::setupScreen()
{
Screen1ViewBase::setupScreen();
}
void Screen1View::tearDownScreen()
{
Screen1ViewBase::tearDownScreen();
}
void Screen1View::handleButtonEvent(const CustomButtonContainer& element, bool& buttonState)
{
if(buttonState)
{
touchgfx_printf("pressed\n");
}
else
{
touchgfx_printf("released\n");
}
}You can try with this code first, but make sure the designer knows the bitmaps you're using for the button.
Just to be clear, it is only a rough example and not an official solution
Hope it will help
/Alexandre
Enter your E-mail address. We'll send you an e-mail with instructions to reset your password.