mirror of
git://projects.qi-hardware.com/gmenu2x.git
synced 2024-11-22 12:09:41 +02:00
Fix dynamic allocation of IconButton instances
Previously, IconButton instances to be added to button boxes were allocated with new, but never freed with delete. unique_ptr makes sure the buttons will be freed along with the button box that owns them, or when code calls ButtonBox::clear. The destructor of ButtonBox has been made redundant by this change, so it's gone.
This commit is contained in:
parent
004c41e2ef
commit
891525aa94
@ -7,6 +7,8 @@
|
||||
#include "utilities.h"
|
||||
|
||||
using std::string;
|
||||
using std::unique_ptr;
|
||||
using std::move;
|
||||
|
||||
BrowseDialog::BrowseDialog(
|
||||
GMenu2X *gmenu2x, Touchscreen &ts_,
|
||||
@ -18,24 +20,26 @@ BrowseDialog::BrowseDialog(
|
||||
, ts_pressed(false)
|
||||
, buttonBox(gmenu2x)
|
||||
{
|
||||
IconButton *btn;
|
||||
buttonBox.add(unique_ptr<IconButton>(new IconButton(gmenu2x, ts, "skin:imgs/buttons/left.png")));
|
||||
unique_ptr<IconButton> btnUp(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/cancel.png", gmenu2x->tr["Up one folder"]));
|
||||
btnUp->setAction(BIND(&BrowseDialog::directoryUp));
|
||||
buttonBox.add(move(btnUp));
|
||||
|
||||
buttonBox.add(new IconButton(gmenu2x, ts, "skin:imgs/buttons/left.png"));
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/cancel.png", gmenu2x->tr["Up one folder"]);
|
||||
btn->setAction(BIND(&BrowseDialog::directoryUp));
|
||||
buttonBox.add(btn);
|
||||
unique_ptr<IconButton> btnSelect(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Select"]));
|
||||
btnSelect->setAction(BIND(&BrowseDialog::directoryEnter));
|
||||
buttonBox.add(move(btnSelect));
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Select"]);
|
||||
btn->setAction(BIND(&BrowseDialog::directoryEnter));
|
||||
buttonBox.add(btn);
|
||||
unique_ptr<IconButton> btnConfirm(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/start.png", gmenu2x->tr["Confirm"]));
|
||||
btnConfirm->setAction(BIND(&BrowseDialog::confirm));
|
||||
buttonBox.add(move(btnConfirm));
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/start.png", gmenu2x->tr["Confirm"]);
|
||||
btn->setAction(BIND(&BrowseDialog::confirm));
|
||||
buttonBox.add(btn);
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/select.png", gmenu2x->tr["Exit"]);
|
||||
btn->setAction(BIND(&BrowseDialog::quit));
|
||||
buttonBox.add(btn);
|
||||
unique_ptr<IconButton> btnExit(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/select.png", gmenu2x->tr["Exit"]));
|
||||
btnExit->setAction(BIND(&BrowseDialog::quit));
|
||||
buttonBox.add(move(btnExit));
|
||||
|
||||
iconGoUp = gmenu2x->sc.skinRes("imgs/go-up.png");
|
||||
iconFolder = gmenu2x->sc.skinRes("imgs/folder.png");
|
||||
|
@ -3,18 +3,16 @@
|
||||
#include "gmenu2x.h"
|
||||
#include "iconbutton.h"
|
||||
|
||||
using std::unique_ptr;
|
||||
using std::move;
|
||||
|
||||
ButtonBox::ButtonBox(GMenu2X *gmenu2x) : gmenu2x(gmenu2x)
|
||||
{
|
||||
}
|
||||
|
||||
ButtonBox::~ButtonBox()
|
||||
void ButtonBox::add(unique_ptr<IconButton> button)
|
||||
{
|
||||
clear();
|
||||
}
|
||||
|
||||
void ButtonBox::add(IconButton *button)
|
||||
{
|
||||
buttons.push_back(button);
|
||||
buttons.push_back(move(button));
|
||||
}
|
||||
|
||||
void ButtonBox::clear()
|
||||
@ -25,7 +23,7 @@ void ButtonBox::clear()
|
||||
void ButtonBox::paint(Surface& s, unsigned int x)
|
||||
{
|
||||
const int y = gmenu2x->resY - 1;
|
||||
for (auto button : buttons) {
|
||||
for (auto& button : buttons) {
|
||||
auto rect = button->getRect();
|
||||
button->setPosition(x, y - rect.h);
|
||||
button->paint(s);
|
||||
@ -35,7 +33,7 @@ void ButtonBox::paint(Surface& s, unsigned int x)
|
||||
|
||||
void ButtonBox::handleTS()
|
||||
{
|
||||
for (auto button : buttons) {
|
||||
for (auto& button : buttons) {
|
||||
button->handleTS();
|
||||
}
|
||||
}
|
||||
|
@ -1,26 +1,27 @@
|
||||
#ifndef __BUTTONBOX_H__
|
||||
#define __BUTTONBOX_H__
|
||||
|
||||
#include "iconbutton.h"
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
|
||||
class GMenu2X;
|
||||
class IconButton;
|
||||
class Surface;
|
||||
|
||||
class ButtonBox
|
||||
{
|
||||
public:
|
||||
ButtonBox(GMenu2X *gmenu2x);
|
||||
~ButtonBox();
|
||||
|
||||
void add(IconButton *button);
|
||||
void add(std::unique_ptr<IconButton> button);
|
||||
void clear();
|
||||
|
||||
void paint(Surface& s, unsigned int x);
|
||||
void handleTS();
|
||||
|
||||
private:
|
||||
std::vector<IconButton*> buttons;
|
||||
std::vector<std::unique_ptr<IconButton> > buttons;
|
||||
GMenu2X *gmenu2x;
|
||||
};
|
||||
|
||||
|
@ -98,25 +98,25 @@ InputDialog::InputDialog(GMenu2X *gmenu2x, InputManager &inputMgr_,
|
||||
setKeyboard(0);
|
||||
|
||||
buttonbox = new ButtonBox(gmenu2x);
|
||||
IconButton *btnBackspace = new IconButton(gmenu2x, ts,
|
||||
"skin:imgs/buttons/l.png", gmenu2x->tr["Backspace"]);
|
||||
unique_ptr<IconButton> btnBackspace(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/l.png", gmenu2x->tr["Backspace"]));
|
||||
btnBackspace->setAction(BIND(&InputDialog::backspace));
|
||||
buttonbox->add(btnBackspace);
|
||||
buttonbox->add(move(btnBackspace));
|
||||
|
||||
IconButton *btnSpace = new IconButton(gmenu2x, ts,
|
||||
"skin:imgs/buttons/r.png", gmenu2x->tr["Space"]);
|
||||
unique_ptr<IconButton> btnSpace(
|
||||
new IconButton(gmenu2x, ts, "skin:imgs/buttons/r.png", gmenu2x->tr["Space"]));
|
||||
btnSpace->setAction(BIND(&InputDialog::space));
|
||||
buttonbox->add(btnSpace);
|
||||
buttonbox->add(move(btnSpace));
|
||||
|
||||
IconButton *btnConfirm = new IconButton(gmenu2x, ts,
|
||||
"skin:imgs/buttons/accept.png", gmenu2x->tr["Confirm"]);
|
||||
unique_ptr<IconButton> btnConfirm(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Confirm"]));
|
||||
btnConfirm->setAction(BIND(&InputDialog::confirm));
|
||||
buttonbox->add(btnConfirm);
|
||||
buttonbox->add(move(btnConfirm));
|
||||
|
||||
IconButton *btnChangeKeys = new IconButton(gmenu2x, ts,
|
||||
"skin:imgs/buttons/cancel.png", gmenu2x->tr["Change keys"]);
|
||||
unique_ptr<IconButton> btnChangeKeys(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/cancel.png", gmenu2x->tr["Change keys"]));
|
||||
btnChangeKeys->setAction(BIND(&InputDialog::changeKeys));
|
||||
buttonbox->add(btnChangeKeys);
|
||||
buttonbox->add(move(btnChangeKeys));
|
||||
}
|
||||
|
||||
void InputDialog::setKeyboard(int kb) {
|
||||
|
@ -29,6 +29,8 @@
|
||||
#include <sstream>
|
||||
|
||||
using std::string;
|
||||
using std::unique_ptr;
|
||||
using std::move;
|
||||
|
||||
MenuSettingBool::MenuSettingBool(
|
||||
GMenu2X *gmenu2x, Touchscreen &ts,
|
||||
@ -58,11 +60,10 @@ MenuSettingBool::MenuSettingBool(
|
||||
|
||||
void MenuSettingBool::initButton()
|
||||
{
|
||||
IconButton *btn = new IconButton(gmenu2x, ts,
|
||||
"skin:imgs/buttons/accept.png",
|
||||
gmenu2x->tr["Switch"]);
|
||||
unique_ptr<IconButton> btn(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Switch"]));
|
||||
btn->setAction(BIND(&MenuSettingBool::toggle));
|
||||
buttonBox.add(btn);
|
||||
buttonBox.add(move(btn));
|
||||
}
|
||||
|
||||
void MenuSettingBool::draw(int valueX, int y, int h)
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include "iconbutton.h"
|
||||
|
||||
using std::string;
|
||||
using std::unique_ptr;
|
||||
using std::move;
|
||||
|
||||
MenuSettingDir::MenuSettingDir(
|
||||
GMenu2X *gmenu2x, Touchscreen &ts_,
|
||||
@ -33,17 +35,15 @@ MenuSettingDir::MenuSettingDir(
|
||||
: MenuSettingStringBase(gmenu2x, name, description, value)
|
||||
, ts(ts_)
|
||||
{
|
||||
IconButton *btn;
|
||||
unique_ptr<IconButton> btnCancel(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/cancel.png", gmenu2x->tr["Clear"]));
|
||||
btnCancel->setAction(BIND(&MenuSettingDir::clear));
|
||||
buttonBox.add(move(btnCancel));
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/cancel.png",
|
||||
gmenu2x->tr["Clear"]);
|
||||
btn->setAction(BIND(&MenuSettingDir::clear));
|
||||
buttonBox.add(btn);
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/accept.png",
|
||||
gmenu2x->tr["Select"]);
|
||||
btn->setAction(BIND(&MenuSettingDir::edit));
|
||||
buttonBox.add(btn);
|
||||
unique_ptr<IconButton> btnAccept(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Select"]));
|
||||
btnAccept->setAction(BIND(&MenuSettingDir::edit));
|
||||
buttonBox.add(move(btnAccept));
|
||||
}
|
||||
|
||||
void MenuSettingDir::edit()
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include "iconbutton.h"
|
||||
|
||||
using std::string;
|
||||
using std::unique_ptr;
|
||||
using std::move;
|
||||
|
||||
MenuSettingFile::MenuSettingFile(
|
||||
GMenu2X *gmenu2x, Touchscreen &ts_,
|
||||
@ -35,15 +37,15 @@ MenuSettingFile::MenuSettingFile(
|
||||
, ts(ts_)
|
||||
, filter(filter_)
|
||||
{
|
||||
IconButton *btn;
|
||||
unique_ptr<IconButton> btnClear(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/cancel.png", gmenu2x->tr["Clear"]));
|
||||
btnClear->setAction(BIND(&MenuSettingFile::clear));
|
||||
buttonBox.add(move(btnClear));
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/cancel.png", gmenu2x->tr["Clear"]);
|
||||
btn->setAction(BIND(&MenuSettingFile::clear));
|
||||
buttonBox.add(btn);
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Select"]);
|
||||
btn->setAction(BIND(&MenuSettingFile::edit));
|
||||
buttonBox.add(btn);
|
||||
unique_ptr<IconButton> btnSelect(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Select"]));
|
||||
btnSelect->setAction(BIND(&MenuSettingFile::edit));
|
||||
buttonBox.add(move(btnSelect));
|
||||
}
|
||||
|
||||
void MenuSettingFile::edit()
|
||||
|
@ -30,6 +30,8 @@
|
||||
|
||||
using std::string;
|
||||
using std::stringstream;
|
||||
using std::unique_ptr;
|
||||
using std::move;
|
||||
|
||||
MenuSettingInt::MenuSettingInt(
|
||||
GMenu2X *gmenu2x, Touchscreen &ts,
|
||||
@ -37,8 +39,6 @@ MenuSettingInt::MenuSettingInt(
|
||||
int *value, int min, int max, int increment)
|
||||
: MenuSetting(gmenu2x,name,description)
|
||||
{
|
||||
IconButton *btn;
|
||||
|
||||
_value = value;
|
||||
originalValue = *value;
|
||||
this->min = min;
|
||||
@ -50,21 +50,25 @@ MenuSettingInt::MenuSettingInt(
|
||||
function_t actionInc = BIND(&MenuSettingInt::inc);
|
||||
function_t actionDec = BIND(&MenuSettingInt::dec);
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/l.png");
|
||||
btn->setAction(actionDec);
|
||||
buttonBox.add(btn);
|
||||
unique_ptr<IconButton> btnL1(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/l.png"));
|
||||
btnL1->setAction(actionDec);
|
||||
buttonBox.add(move(btnL1));
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/left.png", gmenu2x->tr["Decrease"]);
|
||||
btn->setAction(actionDec);
|
||||
buttonBox.add(btn);
|
||||
unique_ptr<IconButton> btnL2(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/left.png", gmenu2x->tr["Decrease"]));
|
||||
btnL2->setAction(actionDec);
|
||||
buttonBox.add(move(btnL2));
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/r.png");
|
||||
btn->setAction(actionInc);
|
||||
buttonBox.add(btn);
|
||||
unique_ptr<IconButton> btnR1(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/r.png"));
|
||||
btnR1->setAction(actionInc);
|
||||
buttonBox.add(move(btnR1));
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/right.png", gmenu2x->tr["Increase"]);
|
||||
btn->setAction(actionInc);
|
||||
buttonBox.add(btn);
|
||||
unique_ptr<IconButton> btnR2(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/right.png", gmenu2x->tr["Increase"]));
|
||||
btnR2->setAction(actionInc);
|
||||
buttonBox.add(move(btnR2));
|
||||
}
|
||||
|
||||
void MenuSettingInt::draw(int valueX, int y, int h)
|
||||
|
@ -28,6 +28,8 @@
|
||||
using std::find;
|
||||
using std::string;
|
||||
using std::vector;
|
||||
using std::unique_ptr;
|
||||
using std::move;
|
||||
|
||||
MenuSettingMultiString::MenuSettingMultiString(
|
||||
GMenu2X *gmenu2x, Touchscreen &ts,
|
||||
@ -38,15 +40,15 @@ MenuSettingMultiString::MenuSettingMultiString(
|
||||
{
|
||||
setSel(find(choices->begin(), choices->end(), *value) - choices->begin());
|
||||
|
||||
IconButton *btn;
|
||||
unique_ptr<IconButton> btnDec(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/left.png"));
|
||||
btnDec->setAction(BIND(&MenuSettingMultiString::decSel));
|
||||
buttonBox.add(move(btnDec));
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/left.png");
|
||||
btn->setAction(BIND(&MenuSettingMultiString::decSel));
|
||||
buttonBox.add(btn);
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/right.png", gmenu2x->tr["Change value"]);
|
||||
btn->setAction(BIND(&MenuSettingMultiString::incSel));
|
||||
buttonBox.add(btn);
|
||||
unique_ptr<IconButton> btnInc(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/right.png", gmenu2x->tr["Change value"]));
|
||||
btnInc->setAction(BIND(&MenuSettingMultiString::incSel));
|
||||
buttonBox.add(move(btnInc));
|
||||
}
|
||||
|
||||
bool MenuSettingMultiString::handleButtonPress(InputManager::Button button)
|
||||
|
@ -29,6 +29,8 @@
|
||||
|
||||
using std::string;
|
||||
using std::stringstream;
|
||||
using std::unique_ptr;
|
||||
using std::move;
|
||||
|
||||
constexpr unsigned int COMPONENT_WIDTH = 28;
|
||||
|
||||
@ -228,14 +230,14 @@ void MenuSettingRGBA::updateButtonBox()
|
||||
{
|
||||
buttonBox.clear();
|
||||
if (edit) {
|
||||
buttonBox.add(new IconButton(gmenu2x, ts, "skin:imgs/buttons/l.png"));
|
||||
buttonBox.add(new IconButton(gmenu2x, ts, "skin:imgs/buttons/left.png", gmenu2x->tr["Decrease"]));
|
||||
buttonBox.add(new IconButton(gmenu2x, ts, "skin:imgs/buttons/r.png"));
|
||||
buttonBox.add(new IconButton(gmenu2x, ts, "skin:imgs/buttons/right.png", gmenu2x->tr["Increase"]));
|
||||
buttonBox.add(new IconButton(gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Confirm"]));
|
||||
buttonBox.add(unique_ptr<IconButton>(new IconButton(gmenu2x, ts, "skin:imgs/buttons/l.png")));
|
||||
buttonBox.add(unique_ptr<IconButton>(new IconButton(gmenu2x, ts, "skin:imgs/buttons/left.png", gmenu2x->tr["Decrease"])));
|
||||
buttonBox.add(unique_ptr<IconButton>(new IconButton(gmenu2x, ts, "skin:imgs/buttons/r.png")));
|
||||
buttonBox.add(unique_ptr<IconButton>(new IconButton(gmenu2x, ts, "skin:imgs/buttons/right.png", gmenu2x->tr["Increase"])));
|
||||
buttonBox.add(unique_ptr<IconButton>(new IconButton(gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Confirm"])));
|
||||
} else {
|
||||
buttonBox.add(new IconButton(gmenu2x, ts, "skin:imgs/buttons/left.png"));
|
||||
buttonBox.add(new IconButton(gmenu2x, ts, "skin:imgs/buttons/right.png", gmenu2x->tr["Change color component"]));
|
||||
buttonBox.add(new IconButton(gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Edit"]));
|
||||
buttonBox.add(unique_ptr<IconButton>(new IconButton(gmenu2x, ts, "skin:imgs/buttons/left.png")));
|
||||
buttonBox.add(unique_ptr<IconButton>(new IconButton(gmenu2x, ts, "skin:imgs/buttons/right.png", gmenu2x->tr["Change color component"])));
|
||||
buttonBox.add(unique_ptr<IconButton>(new IconButton(gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Edit"])));
|
||||
}
|
||||
}
|
||||
|
@ -26,6 +26,8 @@
|
||||
#include "inputdialog.h"
|
||||
|
||||
using std::string;
|
||||
using std::unique_ptr;
|
||||
using std::move;
|
||||
|
||||
MenuSettingString::MenuSettingString(
|
||||
GMenu2X *gmenu2x, Touchscreen &ts_,
|
||||
@ -36,15 +38,15 @@ MenuSettingString::MenuSettingString(
|
||||
, diagTitle(diagTitle_)
|
||||
, diagIcon(diagIcon_)
|
||||
{
|
||||
IconButton *btn;
|
||||
unique_ptr<IconButton> btnClear(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/cancel.png", gmenu2x->tr["Clear"]));
|
||||
btnClear->setAction(BIND(&MenuSettingString::clear));
|
||||
buttonBox.add(move(btnClear));
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/cancel.png", gmenu2x->tr["Clear"]);
|
||||
btn->setAction(BIND(&MenuSettingString::clear));
|
||||
buttonBox.add(btn);
|
||||
|
||||
btn = new IconButton(gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Edit"]);
|
||||
btn->setAction(BIND(&MenuSettingString::edit));
|
||||
buttonBox.add(btn);
|
||||
unique_ptr<IconButton> btnEdit(new IconButton(
|
||||
gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Edit"]));
|
||||
btnEdit->setAction(BIND(&MenuSettingString::edit));
|
||||
buttonBox.add(move(btnEdit));
|
||||
}
|
||||
|
||||
void MenuSettingString::edit()
|
||||
|
@ -63,8 +63,8 @@ bool WallpaperDialog::exec()
|
||||
uint i, selected = 0, firstElement = 0, iY;
|
||||
|
||||
ButtonBox buttonbox(gmenu2x);
|
||||
buttonbox.add(new IconButton(gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Select"]));
|
||||
buttonbox.add(new IconButton(gmenu2x, ts, "skin:imgs/buttons/cancel.png", gmenu2x->tr["Exit"]));
|
||||
buttonbox.add(unique_ptr<IconButton>(new IconButton(gmenu2x, ts, "skin:imgs/buttons/accept.png", gmenu2x->tr["Select"])));
|
||||
buttonbox.add(unique_ptr<IconButton>(new IconButton(gmenu2x, ts, "skin:imgs/buttons/cancel.png", gmenu2x->tr["Exit"])));
|
||||
|
||||
unsigned int top, height;
|
||||
tie(top, height) = gmenu2x->getContentArea();
|
||||
|
Loading…
Reference in New Issue
Block a user