mirror of
https://github.com/UpsilonNumworks/Upsilon.git
synced 2026-01-19 00:37:25 +01:00
Some nodes of the ToolboxMessageTree can be marked as "forks", dispatching one branch or the other depending on preferences. They are used in the Unit menu to provide a different toolbox depending on the unit system. Change-Id: I591f7abc3d24e682e827a540a9defac1877871b5
78 lines
2.7 KiB
C++
78 lines
2.7 KiB
C++
#ifndef ESCHER_TOOLBOX_MESSAGE_TREE_H
|
|
#define ESCHER_TOOLBOX_MESSAGE_TREE_H
|
|
|
|
#include <escher/message_tree.h>
|
|
|
|
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) {
|
|
return ToolboxMessageTree(
|
|
label,
|
|
text,
|
|
(insertedText == (I18n::Message)0) ? label : insertedText,
|
|
static_cast<ToolboxMessageTree *>(0),
|
|
0,
|
|
stripInsertedText);
|
|
};
|
|
template <int N>
|
|
constexpr static ToolboxMessageTree Node(I18n::Message label, const ToolboxMessageTree (&children)[N], bool fork = false) {
|
|
return ToolboxMessageTree(
|
|
label,
|
|
(I18n::Message)0,
|
|
(I18n::Message)0,
|
|
children,
|
|
fork ? -N : N,
|
|
true);
|
|
}
|
|
template <int N>
|
|
constexpr static ToolboxMessageTree Node(I18n::Message label, const ToolboxMessageTree * (&children)[N], bool fork = false) {
|
|
return ToolboxMessageTree(
|
|
label,
|
|
(I18n::Message)0,
|
|
(I18n::Message)0,
|
|
children,
|
|
fork ? -N : N,
|
|
true);
|
|
}
|
|
const MessageTree * childAtIndex(int index) const override {
|
|
return m_childrenConsecutive ? m_children.m_direct + index : m_children.m_indirect[index];
|
|
}
|
|
I18n::Message text() const { return m_text; }
|
|
I18n::Message insertedText() const { return m_insertedText; }
|
|
bool stripInsertedText() const { return m_stripInsertedText; }
|
|
bool isFork() const { return numberOfChildren() < 0; }
|
|
private:
|
|
constexpr ToolboxMessageTree(I18n::Message label, I18n::Message text, I18n::Message insertedText, const ToolboxMessageTree * children, int numberOfChildren, bool stripInsertedText) :
|
|
MessageTree(label, numberOfChildren),
|
|
m_children(children),
|
|
m_text(text),
|
|
m_insertedText(insertedText),
|
|
m_stripInsertedText(stripInsertedText),
|
|
m_childrenConsecutive(true)
|
|
{}
|
|
constexpr ToolboxMessageTree(I18n::Message label, I18n::Message text, I18n::Message insertedText, const ToolboxMessageTree ** children, int numberOfChildren, bool stripInsertedText) :
|
|
MessageTree(label, numberOfChildren),
|
|
m_children(children),
|
|
m_text(text),
|
|
m_insertedText(insertedText),
|
|
m_stripInsertedText(stripInsertedText),
|
|
m_childrenConsecutive(false)
|
|
{}
|
|
|
|
union Children {
|
|
public:
|
|
constexpr Children(const ToolboxMessageTree * children) : m_direct(children) {}
|
|
constexpr Children(const ToolboxMessageTree ** children) : m_indirect(children) {}
|
|
const ToolboxMessageTree * m_direct;
|
|
const ToolboxMessageTree ** m_indirect;
|
|
};
|
|
const Children m_children;
|
|
I18n::Message m_text;
|
|
I18n::Message m_insertedText;
|
|
bool m_stripInsertedText;
|
|
const bool m_childrenConsecutive;
|
|
};
|
|
|
|
#endif
|
|
|