mirror of
git://projects.qi-hardware.com/gmenu2x.git
synced 2024-11-16 17:17:32 +02:00
Disable delete context menu option for undeletable link files
Before this change, it was possible to delete for example a link that is stored on a read-only file system and it would disappear after deletion but reappear as soon as the menu restarts.
This commit is contained in:
parent
c3df9c4517
commit
79ef176831
@ -35,31 +35,33 @@ ContextMenu::ContextMenu(GMenu2X &gmenu2x, Menu &menu)
|
|||||||
tr.translate("Add link in $1", menu.selSection().c_str(), NULL),
|
tr.translate("Add link in $1", menu.selSection().c_str(), NULL),
|
||||||
std::bind(&GMenu2X::addLink, &gmenu2x)));
|
std::bind(&GMenu2X::addLink, &gmenu2x)));
|
||||||
|
|
||||||
if (app && !app->getManual().empty()) {
|
if (app) {
|
||||||
|
if (!app->getManual().empty()) {
|
||||||
options.push_back(std::make_shared<MenuOption>(
|
options.push_back(std::make_shared<MenuOption>(
|
||||||
tr.translate("Show manual of $1", app->getTitle().c_str(), NULL),
|
tr.translate("Show manual of $1",
|
||||||
|
app->getTitle().c_str(), NULL),
|
||||||
std::bind(&GMenu2X::showManual, &gmenu2x)));
|
std::bind(&GMenu2X::showManual, &gmenu2x)));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (app && app->isEditable()) {
|
|
||||||
|
|
||||||
/* FIXME(percuei): This permits to mask the "Edit link" entry
|
/* FIXME(percuei): This permits to mask the "Edit link" entry
|
||||||
* on the contextual menu in case CPUFREQ support is
|
* on the contextual menu in case CPUFREQ support is
|
||||||
* not compiled in and the link corresponds to an OPK.
|
* not compiled in and the link corresponds to an OPK.
|
||||||
* This is not a good idea as it'll break things if
|
* This is not a good idea as it'll break things if
|
||||||
* a new config option is added to the contextual menu.
|
* a new config option is added to the contextual menu.
|
||||||
*/
|
*/
|
||||||
if (!app->isOpk()
|
if (app->isEditable() && (
|
||||||
|
!app->isOpk()
|
||||||
#if defined(ENABLE_CPUFREQ)
|
#if defined(ENABLE_CPUFREQ)
|
||||||
|| true
|
|| true
|
||||||
#endif
|
#endif
|
||||||
|| !app->getSelectorDir().empty()
|
|| !app->getSelectorDir().empty()
|
||||||
) {
|
)) {
|
||||||
options.push_back(std::make_shared<MenuOption>(
|
options.push_back(std::make_shared<MenuOption>(
|
||||||
tr.translate("Edit $1", app->getTitle().c_str(), NULL),
|
tr.translate("Edit $1", app->getTitle().c_str(), NULL),
|
||||||
std::bind(&GMenu2X::editLink, &gmenu2x)));
|
std::bind(&GMenu2X::editLink, &gmenu2x)));
|
||||||
}
|
}
|
||||||
if (!app->isOpk()) {
|
|
||||||
|
if (app->isDeletable()) {
|
||||||
options.push_back(std::make_shared<MenuOption>(
|
options.push_back(std::make_shared<MenuOption>(
|
||||||
tr.translate("Delete $1", app->getTitle().c_str(), NULL),
|
tr.translate("Delete $1", app->getTitle().c_str(), NULL),
|
||||||
std::bind(&GMenu2X::deleteLink, &gmenu2x)));
|
std::bind(&GMenu2X::deleteLink, &gmenu2x)));
|
||||||
|
@ -81,12 +81,13 @@ private:
|
|||||||
|
|
||||||
|
|
||||||
#ifdef HAVE_LIBOPK
|
#ifdef HAVE_LIBOPK
|
||||||
LinkApp::LinkApp(GMenu2X *gmenu2x_, const char* linkfile,
|
LinkApp::LinkApp(GMenu2X *gmenu2x_, const char* linkfile, bool deletable,
|
||||||
struct OPK *opk, const char *metadata_)
|
struct OPK *opk, const char *metadata_)
|
||||||
#else
|
#else
|
||||||
LinkApp::LinkApp(GMenu2X *gmenu2x_, const char* linkfile)
|
LinkApp::LinkApp(GMenu2X *gmenu2x_, const char* linkfile, bool deletable)
|
||||||
#endif
|
#endif
|
||||||
: Link(gmenu2x_, bind(&LinkApp::start, this))
|
: Link(gmenu2x_, bind(&LinkApp::start, this))
|
||||||
|
, deletable(deletable)
|
||||||
{
|
{
|
||||||
manual = "";
|
manual = "";
|
||||||
file = linkfile;
|
file = linkfile;
|
||||||
|
@ -40,7 +40,7 @@ private:
|
|||||||
std::string sclock;
|
std::string sclock;
|
||||||
int iclock;
|
int iclock;
|
||||||
std::string exec, params, workdir, manual, selectordir, selectorfilter;
|
std::string exec, params, workdir, manual, selectordir, selectorfilter;
|
||||||
bool selectorbrowser, editable;
|
bool selectorbrowser, deletable, editable;
|
||||||
|
|
||||||
std::string file;
|
std::string file;
|
||||||
|
|
||||||
@ -61,10 +61,10 @@ public:
|
|||||||
bool isOpk() { return isOPK; }
|
bool isOpk() { return isOPK; }
|
||||||
const std::string &getOpkFile() { return opkFile; }
|
const std::string &getOpkFile() { return opkFile; }
|
||||||
|
|
||||||
LinkApp(GMenu2X *gmenu2x, const char* linkfile,
|
LinkApp(GMenu2X *gmenu2x, const char* linkfile, bool deletable,
|
||||||
struct OPK *opk = NULL, const char *metadata = NULL);
|
struct OPK *opk = NULL, const char *metadata = NULL);
|
||||||
#else
|
#else
|
||||||
LinkApp(GMenu2X *gmenu2x, const char* linkfile);
|
LinkApp(GMenu2X *gmenu2x, const char* linkfile, bool deletable);
|
||||||
bool isOpk() { return false; }
|
bool isOpk() { return false; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -93,6 +93,7 @@ public:
|
|||||||
void showManual();
|
void showManual();
|
||||||
void selector(int startSelection=0, const std::string &selectorDir="");
|
void selector(int startSelection=0, const std::string &selectorDir="");
|
||||||
bool targetExists();
|
bool targetExists();
|
||||||
|
bool isDeletable() { return deletable; }
|
||||||
bool isEditable() { return editable; }
|
bool isEditable() { return editable; }
|
||||||
|
|
||||||
const std::string &getFile() { return file; }
|
const std::string &getFile() { return file; }
|
||||||
|
14
src/menu.cpp
14
src/menu.cpp
@ -495,7 +495,7 @@ bool Menu::addLink(string path, string file, string section) {
|
|||||||
|
|
||||||
INFO("Section: '%s(%i)'\n", sections[isection].c_str(), isection);
|
INFO("Section: '%s(%i)'\n", sections[isection].c_str(), isection);
|
||||||
|
|
||||||
LinkApp* link = new LinkApp(gmenu2x, linkpath.c_str());
|
LinkApp* link = new LinkApp(gmenu2x, linkpath.c_str(), true);
|
||||||
link->setSize(gmenu2x->skinConfInt["linkWidth"],gmenu2x->skinConfInt["linkHeight"]);
|
link->setSize(gmenu2x->skinConfInt["linkWidth"],gmenu2x->skinConfInt["linkHeight"]);
|
||||||
links[isection].push_back( link );
|
links[isection].push_back( link );
|
||||||
}
|
}
|
||||||
@ -698,7 +698,10 @@ void Menu::openPackage(std::string path, bool order)
|
|||||||
if (!has_metadata)
|
if (!has_metadata)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
link = new LinkApp(gmenu2x, path.c_str(), opk, name);
|
// Note: OPK links can only be deleted by removing the OPK itself,
|
||||||
|
// but that is not something we want to do in the menu,
|
||||||
|
// so consider this link undeletable.
|
||||||
|
link = new LinkApp(gmenu2x, path.c_str(), false, opk, name);
|
||||||
link->setSize(gmenu2x->skinConfInt["linkWidth"], gmenu2x->skinConfInt["linkHeight"]);
|
link->setSize(gmenu2x->skinConfInt["linkWidth"], gmenu2x->skinConfInt["linkHeight"]);
|
||||||
|
|
||||||
addSection(link->getCategory());
|
addSection(link->getCategory());
|
||||||
@ -844,8 +847,11 @@ void Menu::readLinks() {
|
|||||||
+ sections[correct], linkfiles);
|
+ sections[correct], linkfiles);
|
||||||
|
|
||||||
sort(linkfiles.begin(), linkfiles.end(),case_less());
|
sort(linkfiles.begin(), linkfiles.end(),case_less());
|
||||||
for (uint x=0; x<linkfiles.size(); x++) {
|
for (auto const& linkfile : linkfiles) {
|
||||||
LinkApp *link = new LinkApp(gmenu2x, linkfiles[x].c_str());
|
// Check whether the link file could be deleted.
|
||||||
|
bool deletable = access(parentDir(linkfile).c_str(), W_OK) == 0;
|
||||||
|
|
||||||
|
LinkApp *link = new LinkApp(gmenu2x, linkfile.c_str(), deletable);
|
||||||
link->setSize(gmenu2x->skinConfInt["linkWidth"], gmenu2x->skinConfInt["linkHeight"]);
|
link->setSize(gmenu2x->skinConfInt["linkWidth"], gmenu2x->skinConfInt["linkHeight"]);
|
||||||
if (link->targetExists())
|
if (link->targetExists())
|
||||||
links[i].push_back(link);
|
links[i].push_back(link);
|
||||||
|
Loading…
Reference in New Issue
Block a user