1
0
mirror of git://projects.qi-hardware.com/gmenu2x.git synced 2024-11-17 01:51:31 +02:00
gmenu2x/src/browsedialog.cpp
Maarten ter Huurne 944ab86f9c Cleanup of touch screen code.
Initialize in constructor and clean up in destructor instead of having separate init() and deinit() methods.
Don't close file descriptor if open failed (ts_fd == -1).
Renamed initialized() to available(), since it tests whether the touch screen was found, not whether an initialization was attempted.
Improved code layout and minor other cleanups.
2011-12-23 12:30:15 +01:00

265 lines
6.3 KiB
C++

#include "browsedialog.h"
#include "FastDelegate.h"
#include "filelister.h"
#include "gmenu2x.h"
#include "iconbutton.h"
#include "utilities.h"
using namespace fastdelegate;
using std::string;
BrowseDialog::BrowseDialog(GMenu2X *gmenu2x, const string &title,
const string &subtitle)
: Dialog(gmenu2x)
, title(title)
, subtitle(subtitle)
, ts_pressed(false)
, buttonBox(gmenu2x)
{
IconButton *btn;
buttonBox.add(new IconButton(gmenu2x, "skin:imgs/buttons/left.png"));
btn = new IconButton(gmenu2x, "skin:imgs/buttons/cancel.png", gmenu2x->tr["Up one folder"]);
btn->setAction(MakeDelegate(this, &BrowseDialog::directoryUp));
buttonBox.add(btn);
btn = new IconButton(gmenu2x, "skin:imgs/buttons/accept.png", gmenu2x->tr["Enter folder"]);
btn->setAction(MakeDelegate(this, &BrowseDialog::directoryEnter));
buttonBox.add(btn);
btn = new IconButton(gmenu2x, "skin:imgs/buttons/start.png", gmenu2x->tr["Confirm"]);
btn->setAction(MakeDelegate(this, &BrowseDialog::confirm));
buttonBox.add(btn);
btn = new IconButton(gmenu2x, "skin:imgs/buttons/select.png", gmenu2x->tr["Exit"]);
btn->setAction(MakeDelegate(this, &BrowseDialog::quit));
buttonBox.add(btn);
iconGoUp = gmenu2x->sc.skinRes("imgs/go-up.png");
iconFolder = gmenu2x->sc.skinRes("imgs/folder.png");
iconFile = gmenu2x->sc.skinRes("imgs/file.png");
}
BrowseDialog::~BrowseDialog()
{
}
bool BrowseDialog::exec()
{
if (!fl)
return false;
string path = fl->getPath();
if (path.empty() || !fileExists(path) || path.compare(0, CARD_ROOT_LEN, CARD_ROOT) != 0)
setPath(CARD_ROOT);
fl->browse();
rowHeight = gmenu2x->font->getHeight()+1; // gp2x=15+1 / pandora=19+1
numRows = (gmenu2x->resY-gmenu2x->skinConfInt["topBarHeight"]-20)/rowHeight;
clipRect = (SDL_Rect){0, gmenu2x->skinConfInt["topBarHeight"]+1, gmenu2x->resX-9, gmenu2x->resY-gmenu2x->skinConfInt["topBarHeight"]-25};
touchRect = (SDL_Rect){2, gmenu2x->skinConfInt["topBarHeight"]+4, gmenu2x->resX-12, clipRect.h};
selected = 0;
close = false;
while (!close) {
if (gmenu2x->ts.available()) gmenu2x->ts.poll();
paint();
handleInput();
}
return result;
}
BrowseDialog::Action BrowseDialog::getAction(InputManager::Button button)
{
switch (button) {
case InputManager::MENU:
return BrowseDialog::ACT_CLOSE;
case InputManager::UP:
return BrowseDialog::ACT_UP;
case InputManager::DOWN:
return BrowseDialog::ACT_DOWN;
case InputManager::ALTLEFT:
return BrowseDialog::ACT_SCROLLUP;
case InputManager::ALTRIGHT:
return BrowseDialog::ACT_SCROLLDOWN;
case InputManager::LEFT:
case InputManager::CANCEL:
return BrowseDialog::ACT_GOUP;
case InputManager::ACCEPT:
return BrowseDialog::ACT_SELECT;
case InputManager::SETTINGS:
return BrowseDialog::ACT_CONFIRM;
default:
return BrowseDialog::ACT_NONE;
}
}
void BrowseDialog::handleInput()
{
InputManager::Button button = gmenu2x->input.waitForPressedButton();
BrowseDialog::Action action;
if (ts_pressed && !gmenu2x->ts.pressed()) {
action = BrowseDialog::ACT_SELECT;
ts_pressed = false;
} else {
action = getAction(button);
}
if (gmenu2x->ts.available() && gmenu2x->ts.pressed() && !gmenu2x->ts.inRect(touchRect)) ts_pressed = false;
if (action == BrowseDialog::ACT_SELECT && (*fl)[selected] == "..")
action = BrowseDialog::ACT_GOUP;
switch (action) {
case BrowseDialog::ACT_CLOSE:
quit();
break;
case BrowseDialog::ACT_UP:
if (selected == 0)
selected = fl->size() - 1;
else
selected -= 1;
break;
case BrowseDialog::ACT_SCROLLUP:
if (selected <= numRows - 2)
selected = 0;
else
selected -= numRows - 2;
break;
case BrowseDialog::ACT_DOWN:
if (fl->size() - 1 <= selected)
selected = 0;
else
selected += 1;
break;
case BrowseDialog::ACT_SCROLLDOWN:
if (selected+(numRows-2)>=fl->size())
selected = fl->size()-1;
else
selected += numRows-2;
break;
case BrowseDialog::ACT_GOUP:
directoryUp();
break;
case BrowseDialog::ACT_SELECT:
if (fl->isDirectory(selected)) {
directoryEnter();
break;
}
/* Falltrough */
case BrowseDialog::ACT_CONFIRM:
confirm();
break;
default:
break;
}
buttonBox.handleTS();
}
#include <iostream>
void BrowseDialog::directoryUp()
{
string path = fl->getPath();
string::size_type p = path.rfind("/");
if (p == path.size() - 1)
p = path.rfind("/", p - 1);
if (p == string::npos || path.compare(0, 1, "/") != 0 || path.length() < 2) {
quit();
} else {
selected = 0;
setPath(path.substr(0, p));
}
}
void BrowseDialog::directoryEnter()
{
string path = fl->getPath();
if (path[path.size()-1] != '/')
path += "/";
setPath(path + fl->at(selected));
selected = 0;
}
void BrowseDialog::confirm()
{
result = true;
close = true;
}
void BrowseDialog::quit()
{
result = false;
close = true;
}
void BrowseDialog::paint()
{
unsigned int i, iY;
unsigned int firstElement, lastElement;
unsigned int offsetY;
Surface *icon;
gmenu2x->bg->blit(gmenu2x->s, 0, 0);
drawTitleIcon("icons/explorer.png", true);
writeTitle(title);
writeSubTitle(subtitle);
buttonBox.paint(5);
// TODO(MtH): I have no idea what the right value of firstElement would be,
// but originally it was undefined and that is never a good idea.
firstElement = 0;
if (selected>firstElement+numRows-1)
firstElement = selected-numRows+1;
else if (selected < firstElement)
firstElement = selected;
//Selection
iY = selected-firstElement;
iY = gmenu2x->skinConfInt["topBarHeight"]+1+(iY*rowHeight);
gmenu2x->s->box(2, iY, gmenu2x->resX-12, rowHeight-1, gmenu2x->skinConfColors[COLOR_SELECTION_BG]);
lastElement = firstElement + numRows;
if (lastElement > fl->size())
lastElement = fl->size();
offsetY = gmenu2x->skinConfInt["topBarHeight"]+1;
//Files & Directories
gmenu2x->s->setClipRect(clipRect);
for (i = firstElement; i < lastElement; i++) {
if (fl->isDirectory(i)) {
if ((*fl)[i]=="..")
icon = iconGoUp;
else
icon = iconFolder;
} else {
icon = iconFile;
}
icon->blit(gmenu2x->s, 5, offsetY);
gmenu2x->s->write(gmenu2x->font, (*fl)[i], 24, offsetY + 8, ASFont::HAlignLeft, ASFont::VAlignMiddle);
if (gmenu2x->ts.available() && gmenu2x->ts.pressed() && gmenu2x->ts.inRect(touchRect.x, offsetY + 3, touchRect.w, rowHeight)) {
ts_pressed = true;
selected = i;
}
offsetY += rowHeight;
}
gmenu2x->s->clearClipRect();
gmenu2x->drawScrollBar(numRows,fl->size(),firstElement,clipRect.y,clipRect.h);
gmenu2x->s->flip();
}