Initial commit
This commit is contained in:
@ -0,0 +1,190 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* This file is part of the TouchGFX 4.16.1 distribution.
|
||||
*
|
||||
* <h2><center>© Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.</center></h2>
|
||||
*
|
||||
* This software component is licensed by ST under Ultimate Liberty license
|
||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at:
|
||||
* www.st.com/SLA0044
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file mvp/MVPApplication.hpp
|
||||
*
|
||||
* Declares the touchgfx::MVPApplication class.
|
||||
*/
|
||||
#ifndef MVPAPPLICATION_HPP
|
||||
#define MVPAPPLICATION_HPP
|
||||
|
||||
#include <cassert>
|
||||
#include <new>
|
||||
#include <common/Meta.hpp>
|
||||
#include <common/Partition.hpp>
|
||||
#include <mvp/MVPHeap.hpp>
|
||||
#include <mvp/View.hpp>
|
||||
#include <touchgfx/Application.hpp>
|
||||
#include <touchgfx/Callback.hpp>
|
||||
#include <touchgfx/hal/HAL.hpp>
|
||||
#include <touchgfx/transitions/Transition.hpp>
|
||||
|
||||
namespace touchgfx
|
||||
{
|
||||
class Presenter;
|
||||
|
||||
/**
|
||||
* A specialization of the TouchGFX Application class that provides the necessary glue for
|
||||
* transitioning between presenter/view pairs.
|
||||
*
|
||||
* It maintains a callback for transitioning and evaluates this at each tick.
|
||||
*
|
||||
* @see Application
|
||||
*/
|
||||
class MVPApplication : public Application
|
||||
{
|
||||
public:
|
||||
/** Initializes a new instance of the MVPApplication class. */
|
||||
MVPApplication()
|
||||
: currentPresenter(0),
|
||||
pendingScreenTransitionCallback(0)
|
||||
{
|
||||
instance = this;
|
||||
}
|
||||
|
||||
/**
|
||||
* Handles the pending screen transition.
|
||||
*
|
||||
* Delegates the work to evaluatePendingScreenTransition()
|
||||
*/
|
||||
virtual void handlePendingScreenTransition()
|
||||
{
|
||||
evaluatePendingScreenTransition();
|
||||
}
|
||||
|
||||
protected:
|
||||
Presenter* currentPresenter; ///< Pointer to the currently active presenter.
|
||||
|
||||
GenericCallback<>* pendingScreenTransitionCallback; ///< Callback for screen transitions. Will be set to something valid when a transition request is made.
|
||||
|
||||
/**
|
||||
* Evaluates the pending Callback instances. If a callback is valid, it is executed and
|
||||
* a Screen transition is executed.
|
||||
*/
|
||||
void evaluatePendingScreenTransition()
|
||||
{
|
||||
if (pendingScreenTransitionCallback && pendingScreenTransitionCallback->isValid())
|
||||
{
|
||||
pendingScreenTransitionCallback->execute();
|
||||
pendingScreenTransitionCallback = 0;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
/**
|
||||
* Prepare screen transition. Private helper function for makeTransition. Do not use.
|
||||
*
|
||||
* @param [in] currentScreen If non-null, the current screen.
|
||||
* @param [in] currentPresenter If non-null, the current presenter.
|
||||
* @param [in] currentTrans If non-null, the current transaction.
|
||||
*/
|
||||
FORCE_INLINE_FUNCTION static void prepareTransition(Screen** currentScreen, Presenter** currentPresenter, Transition** currentTrans)
|
||||
{
|
||||
Application::getInstance()->clearAllTimerWidgets();
|
||||
|
||||
if (*currentTrans)
|
||||
{
|
||||
(*currentTrans)->tearDown();
|
||||
}
|
||||
if (*currentTrans)
|
||||
{
|
||||
(*currentTrans)->~Transition();
|
||||
}
|
||||
if (*currentScreen)
|
||||
{
|
||||
(*currentScreen)->tearDownScreen();
|
||||
}
|
||||
if (*currentPresenter)
|
||||
{
|
||||
(*currentPresenter)->deactivate();
|
||||
}
|
||||
if (*currentScreen)
|
||||
{
|
||||
(*currentScreen)->~Screen();
|
||||
}
|
||||
if (*currentPresenter)
|
||||
{
|
||||
(*currentPresenter)->~Presenter();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Finalize screen transition. Private helper function for makeTransition. Do not use.
|
||||
*
|
||||
* @param [in] newScreen If non-null, the new screen.
|
||||
* @param [in] newPresenter If non-null, the new presenter.
|
||||
* @param [in] newTransition If non-null, the new transition.
|
||||
*/
|
||||
FORCE_INLINE_FUNCTION static void finalizeTransition(Screen* newScreen, Presenter* newPresenter, Transition* newTransition)
|
||||
{
|
||||
newScreen->setupScreen();
|
||||
newPresenter->activate();
|
||||
newScreen->bindTransition(*newTransition);
|
||||
newTransition->init();
|
||||
newTransition->invalidate();
|
||||
}
|
||||
|
||||
/**
|
||||
* Function for effectuating a screen transition (i.e. makes the requested new presenter/view
|
||||
* pair active). Once this function has returned, the new screen has been transitioned
|
||||
* to. Due to the memory allocation strategy of using the same memory area for all
|
||||
* screens, the old view/presenter will no longer exist when this function returns.
|
||||
*
|
||||
* Will properly clean up old screen (tearDownScreen, Presenter::deactivate) and call
|
||||
* setupScreen/activate on new view/presenter pair. Will also make sure the view,
|
||||
* presenter and model are correctly bound to each other.
|
||||
*
|
||||
* @tparam ScreenType Class type for the View.
|
||||
* @tparam PresenterType Class type for the Presenter.
|
||||
* @tparam TransType Class type for the Transition.
|
||||
* @tparam ModelType Class type for the Model.
|
||||
* @param [in] currentScreen Pointer to pointer to the current view.
|
||||
* @param [in] currentPresenter Pointer to pointer to the current presenter.
|
||||
* @param [in] heap Reference to the heap containing the memory storage in which
|
||||
* to allocate.
|
||||
* @param [in] currentTrans Pointer to pointer to the current transition.
|
||||
* @param [in] model Pointer to model.
|
||||
*
|
||||
* @return Pointer to the new Presenter of the requested type. Incidentally it will be the same
|
||||
* value as the old presenter due to memory reuse.
|
||||
*/
|
||||
template <class ScreenType, class PresenterType, class TransType, class ModelType>
|
||||
PresenterType* makeTransition(Screen** currentScreen, Presenter** currentPresenter, MVPHeap& heap, Transition** currentTrans, ModelType* model)
|
||||
{
|
||||
assert(sizeof(ScreenType) <= heap.screenStorage.element_size() && "View allocation error: Check that all views are added to FrontendHeap::ViewTypes");
|
||||
assert(sizeof(PresenterType) <= heap.presenterStorage.element_size() && "Presenter allocation error: Check that all presenters are added to FrontendHeap::PresenterTypes");
|
||||
assert(sizeof(TransType) <= heap.transitionStorage.element_size() && "Transition allocation error: Check that all transitions are added to FrontendHeap::TransitionTypes");
|
||||
|
||||
prepareTransition(currentScreen, currentPresenter, currentTrans);
|
||||
|
||||
TransType* newTransition = new (&heap.transitionStorage.at<TransType>(0)) TransType;
|
||||
ScreenType* newScreen = new (&heap.screenStorage.at<ScreenType>(0)) ScreenType;
|
||||
PresenterType* newPresenter = new (&heap.presenterStorage.at<PresenterType>(0)) PresenterType(*newScreen);
|
||||
*currentTrans = newTransition;
|
||||
*currentPresenter = newPresenter;
|
||||
*currentScreen = newScreen;
|
||||
model->bind(newPresenter);
|
||||
newPresenter->bind(model);
|
||||
newScreen->bind(*newPresenter);
|
||||
|
||||
finalizeTransition((Screen*)newScreen, (Presenter*)newPresenter, (Transition*)newTransition);
|
||||
|
||||
return newPresenter;
|
||||
}
|
||||
|
||||
} // namespace touchgfx
|
||||
|
||||
#endif // MVPAPPLICATION_HPP
|
@ -0,0 +1,73 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* This file is part of the TouchGFX 4.16.1 distribution.
|
||||
*
|
||||
* <h2><center>© Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.</center></h2>
|
||||
*
|
||||
* This software component is licensed by ST under Ultimate Liberty license
|
||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at:
|
||||
* www.st.com/SLA0044
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file mvp/MVPHeap.hpp
|
||||
*
|
||||
* Declares the touchgfx::MVPHeap class.
|
||||
*/
|
||||
#ifndef MVPHEAP_HPP
|
||||
#define MVPHEAP_HPP
|
||||
|
||||
namespace touchgfx
|
||||
{
|
||||
class AbstractPartition;
|
||||
class MVPApplication;
|
||||
|
||||
/**
|
||||
* Generic heap class for MVP applications. Serves as a way of obtaining the memory storage
|
||||
* areas for presenters, screens, transitions and the concrete application.
|
||||
*
|
||||
* Subclassed by an application-specific heap which provides the actual storage areas.
|
||||
* This generic interface is used only in makeTransition.
|
||||
*/
|
||||
class MVPHeap
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Initializes a new instance of the MVPHeap class.
|
||||
*
|
||||
* @param [in] pres A memory partition containing enough memory to hold the largest
|
||||
* presenter.
|
||||
* @param [in] scr A memory partition containing enough memory to hold the largest view.
|
||||
* @param [in] tra A memory partition containing enough memory to hold the largest
|
||||
* transition.
|
||||
* @param [in] app A reference to the MVPApplication instance.
|
||||
*/
|
||||
MVPHeap(AbstractPartition& pres,
|
||||
AbstractPartition& scr,
|
||||
AbstractPartition& tra,
|
||||
MVPApplication& app)
|
||||
: presenterStorage(pres),
|
||||
screenStorage(scr),
|
||||
transitionStorage(tra),
|
||||
frontendApplication(app)
|
||||
{
|
||||
}
|
||||
|
||||
/** Finalizes an instance of the MVPHeap class. */
|
||||
virtual ~MVPHeap()
|
||||
{
|
||||
}
|
||||
|
||||
AbstractPartition& presenterStorage; ///< A memory partition containing enough memory to hold the largest presenter.
|
||||
AbstractPartition& screenStorage; ///< A memory partition containing enough memory to hold the largest view.
|
||||
AbstractPartition& transitionStorage; ///< A memory partition containing enough memory to hold the largest transition.
|
||||
MVPApplication& frontendApplication; ///< A reference to the MVPApplication instance.
|
||||
};
|
||||
|
||||
} // namespace touchgfx
|
||||
|
||||
#endif // MVPHEAP_HPP
|
@ -0,0 +1,68 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* This file is part of the TouchGFX 4.16.1 distribution.
|
||||
*
|
||||
* <h2><center>© Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.</center></h2>
|
||||
*
|
||||
* This software component is licensed by ST under Ultimate Liberty license
|
||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at:
|
||||
* www.st.com/SLA0044
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file mvp/Presenter.hpp
|
||||
*
|
||||
* Declares the touchgfx::Presenter class.
|
||||
*/
|
||||
#ifndef PRESENTER_HPP
|
||||
#define PRESENTER_HPP
|
||||
|
||||
namespace touchgfx
|
||||
{
|
||||
/**
|
||||
* The Presenter base class that all application-specific presenters should derive from. Only
|
||||
* contains activate and deactivate virtual functions which are called automatically
|
||||
* during screen transition.
|
||||
*/
|
||||
class Presenter
|
||||
{
|
||||
public:
|
||||
/**
|
||||
* Place initialization code for the Presenter here.
|
||||
*
|
||||
* The activate function is called automatically when a screen transition causes this
|
||||
* Presenter to become active. Place initialization code for the Presenter here.
|
||||
*/
|
||||
virtual void activate()
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Place cleanup code for the Presenter here.
|
||||
*
|
||||
* The deactivate function is called automatically when a screen transition causes this
|
||||
* Presenter to become inactive. Place cleanup code for the Presenter here.
|
||||
*/
|
||||
virtual void deactivate()
|
||||
{
|
||||
}
|
||||
|
||||
/** Finalizes an instance of the Presenter class. */
|
||||
virtual ~Presenter()
|
||||
{
|
||||
}
|
||||
|
||||
protected:
|
||||
/** Initializes a new instance of the Presenter class. */
|
||||
Presenter()
|
||||
{
|
||||
}
|
||||
};
|
||||
|
||||
} // namespace touchgfx
|
||||
|
||||
#endif // PRESENTER_HPP
|
@ -0,0 +1,65 @@
|
||||
/**
|
||||
******************************************************************************
|
||||
* This file is part of the TouchGFX 4.16.1 distribution.
|
||||
*
|
||||
* <h2><center>© Copyright (c) 2021 STMicroelectronics.
|
||||
* All rights reserved.</center></h2>
|
||||
*
|
||||
* This software component is licensed by ST under Ultimate Liberty license
|
||||
* SLA0044, the "License"; You may not use this file except in compliance with
|
||||
* the License. You may obtain a copy of the License at:
|
||||
* www.st.com/SLA0044
|
||||
*
|
||||
******************************************************************************
|
||||
*/
|
||||
|
||||
/**
|
||||
* @file mvp/View.hpp
|
||||
*
|
||||
* Declares the touchgfx::View class.
|
||||
*/
|
||||
#ifndef VIEW_HPP
|
||||
#define VIEW_HPP
|
||||
|
||||
#include <mvp/Presenter.hpp>
|
||||
#include <touchgfx/Screen.hpp>
|
||||
|
||||
namespace touchgfx
|
||||
{
|
||||
/**
|
||||
* This is a generic touchgfx::Screen specialization for normal applications. It provides a link
|
||||
* to the Presenter class.
|
||||
*
|
||||
* @tparam T The type of Presenter associated with this view.
|
||||
*
|
||||
* @see Screen
|
||||
*
|
||||
* @note All views in the application must be a subclass of this type.
|
||||
*/
|
||||
template <class T>
|
||||
class View : public Screen
|
||||
{
|
||||
public:
|
||||
View()
|
||||
: presenter(0)
|
||||
{
|
||||
}
|
||||
|
||||
/**
|
||||
* Binds an instance of a specific Presenter type (subclass) to the View instance. This
|
||||
* function is called automatically when a new presenter/view pair is activated.
|
||||
*
|
||||
* @param [in] presenter The specific Presenter to be associated with the View.
|
||||
*/
|
||||
void bind(T& presenter)
|
||||
{
|
||||
this->presenter = &presenter;
|
||||
}
|
||||
|
||||
protected:
|
||||
T* presenter; ///< Pointer to the Presenter associated with this view.
|
||||
};
|
||||
|
||||
} // namespace touchgfx
|
||||
|
||||
#endif // VIEW_HPP
|
Reference in New Issue
Block a user