1
0
mirror of git://projects.qi-hardware.com/gmenu2x.git synced 2024-11-25 20:51:38 +02:00

Cleaned up GMenu2X::contextMenu()

This commit is contained in:
Maarten ter Huurne 2013-08-11 20:57:13 +02:00
parent 8de59b5c04
commit 945e29986a

View File

@ -82,6 +82,8 @@
#include <sys/mman.h> #include <sys/mman.h>
struct MenuOption { struct MenuOption {
MenuOption(std::string text, function_t action)
: text(text), action(action) {}
std::string text; std::string text;
function_t action; function_t action;
}; };
@ -839,75 +841,64 @@ void GMenu2X::showManual() {
} }
void GMenu2X::contextMenu() { void GMenu2X::contextMenu() {
vector<MenuOption> voices; vector<shared_ptr<MenuOption>> options;
{ LinkApp* app = menu->selLinkApp();
MenuOption opt = {tr.translate("Add link in $1",menu->selSection().c_str(),NULL), BIND(&GMenu2X::addLink)};
voices.push_back(opt); options.push_back(make_shared<MenuOption>(
tr.translate("Add link in $1", menu->selSection().c_str(), NULL),
BIND(&GMenu2X::addLink)));
if (app && !app->getManual().empty()) {
options.push_back(make_shared<MenuOption>(
tr.translate("Show manual of $1", app->getTitle().c_str(), NULL),
BIND(&GMenu2X::showManual)));
} }
{ if (app && app->isEditable()) {
LinkApp* app = menu->selLinkApp();
if (app && !app->getManual().empty()) {
MenuOption opt = {tr.translate("Show manual of $1",menu->selLink()->getTitle().c_str(),NULL),
BIND(&GMenu2X::showManual),
};
voices.push_back(opt);
}
}
if (menu->selLinkApp()!=NULL && menu->selLinkApp()->isEditable()) { /* FIXME(percuei): This permits to mask the "Edit link" entry
* on the contextual menu in case CPUFREQ support is
/* FIXME(percuei): this permits to mask the "Edit link" entry * not compiled in and the link corresponds to an OPK.
* on the contextual menu in case CPUFREQ support is * This is not a good idea as it'll break things if
* not compiled in and the link corresponds to an OPK. * a new config option is added to the contextual menu.
* This is not a good idea as it'll break things if */
* a new config option is added to the contextual menu. */
#if defined(HAVE_LIBOPK) && !defined(ENABLE_CPUFREQ) #if defined(HAVE_LIBOPK) && !defined(ENABLE_CPUFREQ)
if (!menu->selLinkApp()->isOpk() || if (!app->isOpk() || !app->getSelectorDir().empty())
!menu->selLinkApp()->getSelectorDir().empty())
#endif #endif
{ {
MenuOption opt = {tr.translate("Edit $1",menu->selLink()->getTitle().c_str(),NULL), BIND(&GMenu2X::editLink)}; options.push_back(make_shared<MenuOption>(
voices.push_back(opt); tr.translate("Edit $1", app->getTitle().c_str(), NULL),
BIND(&GMenu2X::editLink)));
} }
#ifdef HAVE_LIBOPK #ifdef HAVE_LIBOPK
if (!menu->selLinkApp()->isOpk()) if (!app->isOpk())
#endif #endif
{ {
MenuOption opt = {tr.translate("Delete $1 link",menu->selLink()->getTitle().c_str(),NULL), BIND(&GMenu2X::deleteLink)}; options.push_back(make_shared<MenuOption>(
voices.push_back(opt); tr.translate("Delete $1 link", app->getTitle().c_str(), NULL),
BIND(&GMenu2X::deleteLink)));
} }
} }
{ options.push_back(make_shared<MenuOption>(
MenuOption opt = {tr["Add section"], BIND(&GMenu2X::addSection)}; tr["Add section"], BIND(&GMenu2X::addSection)));
voices.push_back(opt); options.push_back(make_shared<MenuOption>(
}{ tr["Rename section"], BIND(&GMenu2X::renameSection)));
MenuOption opt = {tr["Rename section"], BIND(&GMenu2X::renameSection)}; options.push_back(make_shared<MenuOption>(
voices.push_back(opt); tr["Delete section"], BIND(&GMenu2X::deleteSection)));
}{ options.push_back(make_shared<MenuOption>(
MenuOption opt = {tr["Delete section"], BIND(&GMenu2X::deleteSection)}; tr["Scan for applications and games"], BIND(&GMenu2X::scanner)));
voices.push_back(opt);
}{
MenuOption opt = {tr["Scan for applications and games"], BIND(&GMenu2X::scanner)};
voices.push_back(opt);
}
bool close = false; const int h = font->getHeight();
uint i, fadeAlpha=0;
int sel = 0;
int h = font->getHeight();
SDL_Rect box; SDL_Rect box;
box.h = (h+2)*voices.size()+8; box.h = (h + 2) * options.size() + 8;
box.w = 0; box.w = 0;
for (i=0; i<voices.size(); i++) { for (auto option : options) {
int w = font->getTextWidth(voices[i].text); box.w = max(box.w, static_cast<Uint16>(font->getTextWidth(option->text)));
if (w>box.w) box.w = w;
} }
box.w += 23; box.w += 23;
box.x = halfX - box.w/2; box.x = halfX - box.w / 2;
box.y = halfY - box.h/2; box.y = halfY - box.h / 2;
SDL_Rect selbox = { SDL_Rect selbox = {
static_cast<Sint16>(box.x + 4), static_cast<Sint16>(box.x + 4),
@ -915,7 +906,7 @@ void GMenu2X::contextMenu() {
static_cast<Uint16>(box.w - 8), static_cast<Uint16>(box.w - 8),
static_cast<Uint16>(h + 2) static_cast<Uint16>(h + 2)
}; };
long tickNow, tickStart = SDL_GetTicks(); const long tickStart = SDL_GetTicks();
Surface bg(s); Surface bg(s);
/*//Darken background /*//Darken background
@ -923,23 +914,27 @@ void GMenu2X::contextMenu() {
bg.box(box.x, box.y, box.w, box.h, skinConfColors["messageBoxBg"]); bg.box(box.x, box.y, box.w, box.h, skinConfColors["messageBoxBg"]);
bg.rectangle( box.x+2, box.y+2, box.w-4, box.h-4, skinConfColors["messageBoxBorder"] );*/ bg.rectangle( box.x+2, box.y+2, box.w-4, box.h-4, skinConfColors["messageBoxBorder"] );*/
InputManager::ButtonEvent event; uint fadeAlpha = 0;
int sel = 0;
bool close = false;
while (!close) { while (!close) {
tickNow = SDL_GetTicks(); const long tickNow = SDL_GetTicks();
selbox.y = box.y+4+(h+2)*sel; selbox.y = box.y + 4 + (h + 2) * sel;
bg.blit(s,0,0); bg.blit(s, 0, 0);
if (fadeAlpha<200) fadeAlpha = intTransition(0,200,tickStart,500,tickNow); if (fadeAlpha < 200)
s->box(0, 0, resX, resY, 0,0,0,fadeAlpha); fadeAlpha = intTransition(0, 200, tickStart, 500, tickNow);
s->box(0, 0, resX, resY, 0, 0, 0, fadeAlpha);
s->box(box.x, box.y, box.w, box.h, skinConfColors[COLOR_MESSAGE_BOX_BG]); s->box(box.x, box.y, box.w, box.h, skinConfColors[COLOR_MESSAGE_BOX_BG]);
s->rectangle( box.x+2, box.y+2, box.w-4, box.h-4, skinConfColors[COLOR_MESSAGE_BOX_BORDER] ); s->rectangle(box.x + 2, box.y + 2, box.w - 4, box.h - 4,
skinConfColors[COLOR_MESSAGE_BOX_BORDER]);
//draw selection rect //draw selection rect
s->box( selbox.x, selbox.y, selbox.w, selbox.h, skinConfColors[COLOR_MESSAGE_BOX_SELECTION] ); s->box(selbox, skinConfColors[COLOR_MESSAGE_BOX_SELECTION]);
for (i=0; i<voices.size(); i++) for (uint i = 0; i < options.size(); i++)
s->write( font, voices[i].text, box.x+12, box.y+5+(h+2)*i, Font::HAlignLeft, Font::VAlignTop ); s->write(font, options[i]->text, box.x + 12, box.y + 5 + (h + 2) * i,
Font::HAlignLeft, Font::VAlignTop);
s->flip(); s->flip();
//touchscreen //touchscreen
@ -950,51 +945,51 @@ void GMenu2X::contextMenu() {
close = true; close = true;
else if (ts.getX() >= selbox.x else if (ts.getX() >= selbox.x
&& ts.getX() <= selbox.x + selbox.w) && ts.getX() <= selbox.x + selbox.w)
for (i=0; i<voices.size(); i++) { for (uint i = 0; i < options.size(); i++) {
selbox.y = box.y+4+(h+2)*i; selbox.y = box.y + 4 + (h + 2) * i;
if (ts.getY() >= selbox.y if (ts.getY() >= selbox.y
&& ts.getY() <= selbox.y + selbox.h) { && ts.getY() <= selbox.y + selbox.h) {
voices[i].action(); options[i]->action();
close = true; close = true;
i = voices.size(); i = options.size();
} }
} }
} else if (ts.pressed() && ts.inRect(box)) { } else if (ts.pressed() && ts.inRect(box)) {
for (i=0; i<voices.size(); i++) { for (uint i = 0; i < options.size(); i++) {
selbox.y = box.y+4+(h+2)*i; selbox.y = box.y + 4 + (h + 2) * i;
if (ts.getY() >= selbox.y if (ts.getY() >= selbox.y
&& ts.getY() <= selbox.y + selbox.h) { && ts.getY() <= selbox.y + selbox.h) {
sel = i; sel = i;
i = voices.size(); i = options.size();
} }
} }
} }
} }
InputManager::ButtonEvent event;
if (fadeAlpha < 200) {
if (!input.pollEvent(&event) || event.state != InputManager::PRESSED) continue;
} else {
event.button = input.waitForPressedButton();
}
if (fadeAlpha < 200) { switch(event.button) {
if (!input.pollEvent(&event) || event.state != InputManager::PRESSED) continue; case InputManager::MENU:
} else { close = true;
event.button = input.waitForPressedButton(); break;
} case InputManager::UP:
sel = std::max(0, sel - 1);
switch(event.button) { break;
case InputManager::MENU: case InputManager::DOWN:
close = true; sel = std::min((int)options.size() - 1, sel + 1);
break; break;
case InputManager::UP: case InputManager::ACCEPT:
sel = std::max(0, sel-1); options[sel]->action();
break; close = true;
case InputManager::DOWN: break;
sel = std::min((int)voices.size()-1, sel+1); default:
break; break;
case InputManager::ACCEPT: }
voices[sel].action();
close = true;
break;
default:
break;
}
} }
} }