[Horus] Optimization for the Model Select screen (proxy design pattern)

This commit is contained in:
Bertrand Songis
2016-09-02 18:55:33 +02:00
parent aecf70158e
commit b1cf4da7bb
3 changed files with 27 additions and 15 deletions
+2 -2
View File
@@ -51,7 +51,7 @@ void drawCategory(coord_t y, const char * name, bool selected)
void drawModel(coord_t x, coord_t y, ModelCell * model, bool current, bool selected)
{
lcd->drawBitmap(x+1, y+1, &model->buffer);
lcd->drawBitmap(x+1, y+1, model->getBuffer());
if (current) {
lcd->drawBitmapPattern(x+66, y+43, LBM_ACTIVE_MODEL, TITLE_BGCOLOR);
}
@@ -324,7 +324,7 @@ bool menuModelSelect(event_t event)
drawModel(MODELS_LEFT, y, *it, current, selected);
}
if (selected) {
lcdDrawText(MODELS_LEFT, LCD_H-FH-1, (*it)->name, TEXT_COLOR);
// lcdDrawText(MODELS_LEFT, LCD_H-FH-1, (*it)->name, TEXT_COLOR);
}
}
}
+24 -12
View File
@@ -31,47 +31,59 @@ class ModelCell
{
public:
ModelCell(const char * name):
buffer(BMP_RGB565, MODELCELL_WIDTH, MODELCELL_HEIGHT)
buffer(NULL)
{
buffer.clear(TEXT_BGCOLOR);
strncpy(this->name, name, sizeof(this->name));
}
const BitmapBuffer * getBuffer()
{
if (!buffer) {
load();
}
return buffer;
}
void load()
{
ModelHeader header;
const char * error = NULL;
buffer = new BitmapBuffer(BMP_RGB565, MODELCELL_WIDTH, MODELCELL_HEIGHT);
buffer->clear(TEXT_BGCOLOR);
if (strncmp(name, g_eeGeneral.currModelFilename, LEN_MODEL_FILENAME) == 0)
header = g_model.header;
else
error = readModel(name, (uint8_t *)&header, sizeof(header));
if (error) {
buffer.drawText(5, 2, "(Invalid Model)", TEXT_COLOR);
buffer.drawBitmapPattern(5, 23, LBM_LIBRARY_SLOT, TEXT_COLOR);
buffer->drawText(5, 2, "(Invalid Model)", TEXT_COLOR);
buffer->drawBitmapPattern(5, 23, LBM_LIBRARY_SLOT, TEXT_COLOR);
}
else {
char timer[LEN_TIMER_STRING];
buffer.drawSizedText(5, 2, header.name, LEN_MODEL_NAME, ZCHAR|TEXT_COLOR);
buffer->drawSizedText(5, 2, header.name, LEN_MODEL_NAME, ZCHAR|TEXT_COLOR);
getTimerString(timer, 0);
buffer.drawText(101, 40, timer, TEXT_COLOR);
buffer->drawText(101, 40, timer, TEXT_COLOR);
for (int i=0; i<4; i++) {
buffer.drawBitmapPattern(104+i*11, 25, LBM_SCORE0, TITLE_BGCOLOR);
buffer->drawBitmapPattern(104+i*11, 25, LBM_SCORE0, TITLE_BGCOLOR);
}
GET_FILENAME(filename, BITMAPS_PATH, header.bitmap, "");
const BitmapBuffer * bitmap = BitmapBuffer::load(filename);
if (bitmap) {
buffer.drawScaledBitmap(bitmap, 5, 24, 56, 32);
buffer->drawScaledBitmap(bitmap, 5, 24, 56, 32);
delete bitmap;
}
else {
buffer.drawBitmapPattern(5, 23, LBM_LIBRARY_SLOT, TEXT_COLOR);
buffer->drawBitmapPattern(5, 23, LBM_LIBRARY_SLOT, TEXT_COLOR);
}
}
buffer.drawSolidHorizontalLine(5, 19, 143, LINE_COLOR);
buffer->drawSolidHorizontalLine(5, 19, 143, LINE_COLOR);
}
char name[LEN_MODEL_FILENAME+1];
BitmapBuffer buffer;
BitmapBuffer * buffer;
};
class ModelsCategory: public std::list<ModelCell *>
+1 -1
View File
@@ -24,7 +24,7 @@
#include "ff.h"
#define DEFAULT_CATEGORY "Models"
#define DEFAULT_MODEL_FILENAME "model01.bin"
#define DEFAULT_MODEL_FILENAME "model1.bin"
const char * readModel(const char * filename, uint8_t * buffer, uint32_t size);
const char * loadModel(const char * filename, bool alarms=true);