9 # error This is a userspace-only header, not allowed by the current build.
12 #ifdef MENU_LOGS_ENABLED
13 # define MENU_LOG(...) LOG(__VA_ARGS__)
15 # define MENU_LOG(...)
18 #include <sifteo/cube.h>
19 #include <sifteo/asset.h>
20 #include <sifteo/video.h>
41 const PinnedAssetImage *background;
42 const AssetImage *footer;
43 const AssetImage *header;
44 const AssetImage *tips[8];
45 const AssetImage *overflowIcon;
49 const AssetImage *icon;
50 const AssetImage *label;
54 bool operator==(
const struct MenuNeighbor& rhs)
const
56 return (masterSide == rhs.masterSide)
57 && (neighbor == rhs.neighbor)
58 && (neighborSide == rhs.neighborSide);
61 bool operator!=(
const struct MenuNeighbor& rhs)
const
63 return !operator==(rhs);
74 struct MenuNeighbor neighbor;
106 Menu(VideoBuffer&,
const MenuAssets*, MenuItem*);
109 void init(VideoBuffer&,
const MenuAssets*, MenuItem*);
111 bool pollEvent(
struct MenuEvent *);
112 void performDefault();
114 void replaceIcon(uint8_t item,
const AssetImage *icon,
const AssetImage *label = 0);
115 bool itemVisible(uint8_t item);
116 void setIconYOffset(uint8_t px);
117 void setPeekTiles(uint8_t numTiles);
118 void anchor(uint8_t item,
bool hopUp =
false, int8_t panTarget=-1);
123 bool isTiltingAtEdge();
124 void setNumTips(uint8_t nt);
126 void drawFooter(
bool force =
false);
128 VideoBuffer *videoBuffer()
const;
132 static const float kTimeDilator = 13.1f;
133 static const float kMaxSpeedMultiplier = 2.f;
134 static const float kAccelScalingFactor = -0.25f;
135 static const uint8_t kNumTilesX = 18;
136 static const uint8_t kNumVisibleTilesX = 16;
137 static const uint8_t kNumTilesY = 18;
138 static const uint8_t kNumVisibleTilesY = 16;
139 static const float kAccelThresholdOn = 4.15f;
140 static const float kAccelThresholdOff = 0.85f;
141 static const float kAccelThresholdStep = 9.5f;
142 static const uint8_t kDefaultIconYOffset = 16;
143 static const uint8_t kDefaultPeekTiles = 1;
144 static const float kPanEasingRate = 0.05f;
146 static const unsigned kPanDelayMilliseconds = 800;
149 uint8_t kHeaderHeight;
150 uint8_t kFooterHeight;
152 uint8_t kIconTileWidth;
153 uint8_t kIconTileHeight;
154 int8_t kEndCapPadding;
158 unsigned kIconPixelWidth()
const {
return kIconTileWidth * TILE; }
159 unsigned kIconPixelHeight()
const {
return kIconTileHeight * TILE; }
160 unsigned kItemTileWidth()
const {
return ((kEndCapPadding + TILE - 1) / TILE) + kIconTileWidth - kPeekTiles; }
161 unsigned kItemPixelWidth()
const {
return kItemTileWidth() * TILE; }
162 float kOneG()
const {
return abs(64 * kAccelScalingFactor); }
166 const struct MenuAssets *assets;
168 struct MenuItem *items;
170 uint8_t startingItem;
173 struct MenuEvent currentEvent;
180 SystemTime prevTipTime;
184 int stopping_position;
203 void transFromStart();
204 void transToStatic();
206 void transFromStatic();
207 void transToTilting();
209 void transFromTilting();
210 void transToInertia();
212 void transFromInertia();
213 void transToFinish();
215 void transFromFinish();
218 void transFromHopUp();
220 void transToPanTarget();
221 void statePanTarget();
222 void transFromPanTarget();
225 bool dispatchEvent(
struct MenuEvent *ev);
227 void handleNeighborAdd();
228 void handleNeighborRemove();
229 void handleItemArrive();
230 void handleItemDepart();
231 void handleItemPress();
233 void handlePrepaint();
236 void detectNeighbors();
237 uint8_t computeSelected();
238 void checkForPress();
239 void drawColumn(
int);
240 int stoppingPositionFor(
int);
241 float velocityMultiplier();
243 static float lerp(
float min,
float max,
float u);
245 bool itemVisibleAtCol(uint8_t item,
int column);
246 uint8_t itemAtCol(
int column);
247 int computeCurrentTile();