[escher] Rework of timers and bigger text in toolboxes

This commit is contained in:
Laury
2022-06-24 22:35:36 +02:00
parent 391fd5e243
commit 0b2a581177
74 changed files with 407 additions and 208 deletions

View File

@@ -3,6 +3,8 @@
#include <escher/alternate_empty_view_controller.h>
#include <escher/alternate_empty_view_delegate.h>
#include <escher/animated.h>
#include <escher/animation_timer.h>
#include <escher/background_view.h>
#include <escher/bank_view_controller.h>
#include <escher/buffer_text_view.h>
@@ -66,6 +68,7 @@
#include <escher/selectable_table_view_delegate.h>
#include <escher/simple_table_view_data_source.h>
#include <escher/simple_list_view_data_source.h>
#include <escher/slideable_message_text_view.h>
#include <escher/solid_color_view.h>
#include <escher/stack_view_controller.h>
#include <escher/switch_view.h>

View File

@@ -0,0 +1,11 @@
#ifndef APPS_ANIMATED_H
#define APPS_ANIMATED_H
class Animated {
public:
virtual void willStartAnimation() {};
virtual void didStopAnimation() {};
virtual void animate() = 0;
};
#endif

View File

@@ -0,0 +1,25 @@
#ifndef APPS_ANIMATION_TIMER_H
#define APPS_ANIMATION_TIMER_H
#include <escher/timer.h>
#include <escher/animated.h>
#include <assert.h>
class AnimationTimer : public Timer {
public:
AnimationTimer():
Timer(1),
m_animated(nullptr)
{}
void setAnimated(Animated * animated);
void removeAnimated(Animated * animated=nullptr);
private:
bool fire() override {
assert(m_animated);
m_animated->animate();
return true;
}
Animated * m_animated;
};
#endif

View File

@@ -69,8 +69,6 @@ public:
virtual void didBecomeActive(Window * window);
virtual void willBecomeInactive();
View * modalView();
virtual int numberOfTimers() { return 0; }
virtual Timer * timerAtIndex(int i) { assert(false); return nullptr; }
virtual Poincare::Context * localContext() { return nullptr; }
protected:
App(Snapshot * snapshot, ViewController * rootViewController, I18n::Message warningMessage = (I18n::Message)0) :

View File

@@ -36,10 +36,6 @@ protected:
static App * s_activeApp;
private:
void step();
int numberOfTimers() override;
Timer * timerAtIndex(int i) override;
virtual int numberOfContainerTimers();
virtual Timer * containerTimerAtIndex(int i);
};
#endif

View File

@@ -2,9 +2,11 @@
#define ESCHER_MESSAGE_TABLE_CELL_H
#include <escher/message_text_view.h>
#include <escher/slideable_message_text_view.h>
#include <escher/i18n.h>
#include <escher/table_cell.h>
template<class T=MessageTextView>
class MessageTableCell : public TableCell {
public:
MessageTableCell(I18n::Message label = (I18n::Message)0, const KDFont * font = KDFont::SmallFont, Layout layout = Layout::HorizontalLeftOverlap);
@@ -17,7 +19,7 @@ public:
protected:
KDColor backgroundColor() const override { return m_backgroundColor; }
private:
MessageTextView m_messageTextView;
T m_messageTextView;
KDColor m_backgroundColor;
};

View File

@@ -4,7 +4,7 @@
#include <escher/message_table_cell.h>
#include <escher/buffer_text_view.h>
class MessageTableCellWithBuffer : public MessageTableCell {
class MessageTableCellWithBuffer : public MessageTableCell<> {
public:
MessageTableCellWithBuffer(I18n::Message message = (I18n::Message)0, const KDFont * font = KDFont::SmallFont, const KDFont * accessoryFont = KDFont::LargeFont, KDColor accessoryTextColor = Palette::PrimaryText);
View * accessoryView() const override;

View File

@@ -4,7 +4,8 @@
#include <escher/message_table_cell.h>
#include <escher/chevron_view.h>
class MessageTableCellWithChevron : public MessageTableCell {
template <class T=MessageTextView>
class MessageTableCellWithChevron : public MessageTableCell<T> {
public:
MessageTableCellWithChevron(I18n::Message message = (I18n::Message)0, const KDFont * font = KDFont::SmallFont);
View * accessoryView() const override;

View File

@@ -4,7 +4,7 @@
#include <escher/message_table_cell_with_chevron.h>
#include <escher/buffer_text_view.h>
class MessageTableCellWithChevronAndBuffer : public MessageTableCellWithChevron {
class MessageTableCellWithChevronAndBuffer : public MessageTableCellWithChevron<> {
public:
MessageTableCellWithChevronAndBuffer(const KDFont * labelFont = KDFont::SmallFont, const KDFont * subAccessoryFont = KDFont::SmallFont);
View * subAccessoryView() const override;

View File

@@ -4,7 +4,7 @@
#include <escher/message_table_cell_with_chevron.h>
#include <escher/expression_view.h>
class MessageTableCellWithChevronAndExpression : public MessageTableCellWithChevron {
class MessageTableCellWithChevronAndExpression : public MessageTableCellWithChevron<> {
public:
MessageTableCellWithChevronAndExpression(I18n::Message message = (I18n::Message)0, const KDFont * font = KDFont::SmallFont);
View * subAccessoryView() const override;

View File

@@ -3,7 +3,7 @@
#include <escher/message_table_cell_with_chevron.h>
class MessageTableCellWithChevronAndMessage : public MessageTableCellWithChevron {
class MessageTableCellWithChevronAndMessage : public MessageTableCellWithChevron<> {
public:
MessageTableCellWithChevronAndMessage(const KDFont * labelFont = KDFont::SmallFont, const KDFont * contentFont = KDFont::SmallFont);
View * subAccessoryView() const override;

View File

@@ -6,7 +6,7 @@
#include <escher/responder.h>
#include <poincare/print_float.h>
class MessageTableCellWithEditableText : public Responder, public MessageTableCell {
class MessageTableCellWithEditableText : public Responder, public MessageTableCell<> {
public:
MessageTableCellWithEditableText(Responder * parentResponder = nullptr, InputEventHandlerDelegate * inputEventHandlerDelegate = nullptr, TextFieldDelegate * textFieldDelegate = nullptr, I18n::Message message = (I18n::Message)0);
View * accessoryView() const override;

View File

@@ -4,7 +4,7 @@
#include <escher/message_table_cell.h>
#include <escher/expression_view.h>
class MessageTableCellWithExpression : public MessageTableCell {
class MessageTableCellWithExpression : public MessageTableCell<> {
public:
MessageTableCellWithExpression(I18n::Message message = (I18n::Message)0, const KDFont * font = KDFont::LargeFont);
View * accessoryView() const override;

View File

@@ -4,7 +4,7 @@
#include <escher/message_table_cell.h>
#include <escher/gauge_view.h>
class MessageTableCellWithGauge : public MessageTableCell {
class MessageTableCellWithGauge : public MessageTableCell<> {
public:
MessageTableCellWithGauge(I18n::Message message = (I18n::Message)0, const KDFont * font = KDFont::SmallFont);
View * accessoryView() const override;

View File

@@ -3,9 +3,10 @@
#include <escher/message_table_cell.h>
class MessageTableCellWithMessage : public MessageTableCell {
template <class T=MessageTextView>
class MessageTableCellWithMessage : public MessageTableCell<T> {
public:
MessageTableCellWithMessage(I18n::Message message = (I18n::Message)0, Layout layout = Layout::Vertical);
MessageTableCellWithMessage(I18n::Message message = (I18n::Message)0, TableCell::Layout layout = TableCell::Layout::Vertical);
View * accessoryView() const override;
void setHighlighted(bool highlight) override;
void setAccessoryMessage(I18n::Message textBody);

View File

@@ -4,7 +4,7 @@
#include <escher/message_table_cell.h>
#include <escher/switch_view.h>
class MessageTableCellWithSwitch : public MessageTableCell {
class MessageTableCellWithSwitch : public MessageTableCell<> {
public:
MessageTableCellWithSwitch(I18n::Message message = (I18n::Message)0, const KDFont * font = KDFont::SmallFont);
View * accessoryView() const override;

View File

@@ -9,13 +9,14 @@ public:
RunLoop();
void run();
void runWhile(bool (*callback)(void * ctx), void * ctx);
void addTimer(Timer * timer);
void removeTimer(Timer * timer);
protected:
virtual bool dispatchEvent(Ion::Events::Event e) = 0;
virtual int numberOfTimers();
virtual Timer * timerAtIndex(int i);
private:
bool step();
int m_time;
Timer * m_firstTimer;
};
#endif

View File

@@ -0,0 +1,26 @@
#ifndef ESCHER_SLIDEABLE_MESSAGE_TEXT_VIEW_H
#define ESCHER_SLIDEABLE_MESSAGE_TEXT_VIEW_H
#include <escher/message_text_view.h>
#include <escher/animation_timer.h>
class SlideableMessageTextView : public MessageTextView, public Animated {
public:
SlideableMessageTextView(const KDFont * font = KDFont::LargeFont, I18n::Message message = (I18n::Message)0, float horizontalAlignment = 0.0f, float verticalAlignment = 0.0f,
KDColor textColor = Palette::PrimaryText, KDColor backgroundColor = Palette::ListCellBackground);
void willStartAnimation() override;
void didStopAnimation() override;
void animate() override;
/* TextView */
void drawRect(KDContext * ctx, KDRect rect) const override;
private:
static constexpr uint8_t k_numberOfSpaces = 3;
KDCoordinate m_textOffset;
bool m_goingLeft; // true if we are going left, false if we are going right
bool m_paused;
};
#endif

View File

@@ -3,25 +3,24 @@
#include <stdint.h>
/* Timers we'll need
* - Blink cursor timer
* - Dim Screen timer
* - Power down timer
* - Watchdog timer ?
* - Battery level timer
* - LED blink timer
/**
* A timer that can be used to schedule events.
* We organize timers in a linked list.
*/
class Timer {
public:
static constexpr int TickDuration = 300; // In Miliseconds
Timer(uint32_t period); // Period is in ticks
bool tick();
void reset(uint32_t NewPeriod = -1);
void setNext(Timer * next) { m_next = next; }
Timer * next() { return m_next; }
protected:
virtual bool fire() = 0;
uint32_t m_period;
uint32_t m_numberOfTicksBeforeFire;
private:
Timer * m_next;
};
#endif

View File

@@ -28,8 +28,8 @@ protected:
/* indexAfterFork is called when a fork-node is encountered to choose which
* of its children should be selected, based on external context. */
virtual int indexAfterFork() const { assert(false); return 0; };
MessageTableCellWithMessage * leafCellAtIndex(int index) override = 0;
MessageTableCellWithChevron * nodeCellAtIndex(int index) override = 0;
MessageTableCellWithMessage<SlideableMessageTextView> * leafCellAtIndex(int index) override = 0;
MessageTableCellWithChevron<SlideableMessageTextView> * nodeCellAtIndex(int index) override = 0;
mutable const ToolboxMessageTree * m_messageTreeModel;
/* m_messageTreeModel points at the messageTree of the tree (describing the
* whole model) where we are located. It enables to know which rows are leaves

View File

@@ -5,14 +5,16 @@
class ToolboxMessageTree : public MessageTree {
public:
constexpr static ToolboxMessageTree Leaf(I18n::Message label, I18n::Message text = (I18n::Message)0, bool stripInsertedText = true, I18n::Message insertedText = (I18n::Message)0) {
constexpr static ToolboxMessageTree Leaf(I18n::Message label, I18n::Message text = (I18n::Message)0, bool stripInsertedText = true, I18n::Message insertedText = (I18n::Message)0, bool multiLine = false, uint8_t numberOfLines = 1) {
return ToolboxMessageTree(
label,
text,
(insertedText == (I18n::Message)0) ? label : insertedText,
static_cast<ToolboxMessageTree *>(0),
0,
stripInsertedText);
stripInsertedText,
multiLine,
numberOfLines);
};
template <int N>
constexpr static ToolboxMessageTree Node(I18n::Message label, const ToolboxMessageTree (&children)[N], bool fork = false) {
@@ -41,22 +43,28 @@ public:
I18n::Message insertedText() const { return m_insertedText; }
bool stripInsertedText() const { return m_stripInsertedText; }
bool isFork() const { return numberOfChildren() < 0; }
bool isMultiLine() const { return m_multiLine; }
uint8_t numberOfLines() const { return m_numberOfLines; }
private:
constexpr ToolboxMessageTree(I18n::Message label, I18n::Message text, I18n::Message insertedText, const ToolboxMessageTree * children, int numberOfChildren, bool stripInsertedText) :
constexpr ToolboxMessageTree(I18n::Message label, I18n::Message text, I18n::Message insertedText, const ToolboxMessageTree * children, int numberOfChildren, bool stripInsertedText, bool multiLine = false, uint8_t numberOfLines = 1) :
MessageTree(label, numberOfChildren),
m_children(children),
m_text(text),
m_insertedText(insertedText),
m_stripInsertedText(stripInsertedText),
m_childrenConsecutive(true)
m_childrenConsecutive(true),
m_multiLine(multiLine),
m_numberOfLines(numberOfLines)
{}
constexpr ToolboxMessageTree(I18n::Message label, I18n::Message text, I18n::Message insertedText, const ToolboxMessageTree ** children, int numberOfChildren, bool stripInsertedText) :
constexpr ToolboxMessageTree(I18n::Message label, I18n::Message text, I18n::Message insertedText, const ToolboxMessageTree ** children, int numberOfChildren, bool stripInsertedText, bool multiLine = false, uint8_t numberOfLines = 1) :
MessageTree(label, numberOfChildren),
m_children(children),
m_text(text),
m_insertedText(insertedText),
m_stripInsertedText(stripInsertedText),
m_childrenConsecutive(false)
m_childrenConsecutive(false),
m_multiLine(multiLine),
m_numberOfLines(numberOfLines)
{}
union Children {
@@ -71,6 +79,8 @@ private:
I18n::Message m_insertedText;
bool m_stripInsertedText;
const bool m_childrenConsecutive;
bool m_multiLine;
uint8_t m_numberOfLines;
};
#endif