|
|
|
/* BEGIN_COMMON_COPYRIGHT_HEADER
|
|
|
|
* (c)LGPL2+
|
|
|
|
*
|
|
|
|
* LXDE-Qt - a lightweight, Qt based, desktop toolset
|
|
|
|
* http://razor-qt.org
|
|
|
|
*
|
|
|
|
* Copyright: 2010-2012 Razor team
|
|
|
|
* Authors:
|
|
|
|
* Petr Vanek <petr@scribus.info>
|
|
|
|
* Kuzma Shapran <kuzma.shapran@gmail.com>
|
|
|
|
*
|
|
|
|
* This program or library is free software; you can redistribute it
|
|
|
|
* and/or modify it under the terms of the GNU Lesser General Public
|
|
|
|
* License as published by the Free Software Foundation; either
|
|
|
|
* version 2.1 of the License, or (at your option) any later version.
|
|
|
|
*
|
|
|
|
* This library is distributed in the hope that it will be useful,
|
|
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
|
|
|
* Lesser General Public License for more details.
|
|
|
|
|
|
|
|
* You should have received a copy of the GNU Lesser General
|
|
|
|
* Public License along with this library; if not, write to the
|
|
|
|
* Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
|
|
|
|
* Boston, MA 02110-1301 USA
|
|
|
|
*
|
|
|
|
* END_COMMON_COPYRIGHT_HEADER */
|
|
|
|
|
|
|
|
#include "lxqtquicklaunch.h"
|
|
|
|
#include "quicklaunchbutton.h"
|
|
|
|
#include "quicklaunchaction.h"
|
|
|
|
#include "../panel/ilxqtpanelplugin.h"
|
|
|
|
#include <QDesktopServices>
|
|
|
|
#include <QDragEnterEvent>
|
|
|
|
#include <QFileIconProvider>
|
|
|
|
#include <QFileInfo>
|
|
|
|
#include <QLabel>
|
|
|
|
#include <QMessageBox>
|
|
|
|
#include <QToolButton>
|
|
|
|
#include <QUrl>
|
|
|
|
#include <QDebug>
|
|
|
|
#include <XdgDesktopFile>
|
|
|
|
#include <XdgIcon>
|
|
|
|
#include <LXQt/GridLayout>
|
|
|
|
#include "../panel/pluginsettings.h"
|
|
|
|
|
|
|
|
|
|
|
|
LXQtQuickLaunch::LXQtQuickLaunch(ILXQtPanelPlugin *plugin, QWidget* parent) :
|
|
|
|
QFrame(parent),
|
|
|
|
mPlugin(plugin),
|
|
|
|
mPlaceHolder(0)
|
|
|
|
{
|
|
|
|
setAcceptDrops(true);
|
|
|
|
|
|
|
|
mLayout = new LXQt::GridLayout(this);
|
|
|
|
setLayout(mLayout);
|
|
|
|
|
|
|
|
QString desktop;
|
|
|
|
QString file;
|
|
|
|
QString execname;
|
|
|
|
QString exec;
|
|
|
|
QString icon;
|
|
|
|
for (const QMap<QString, QVariant> &app : mPlugin->settings()->readArray("apps"))
|
|
|
|
{
|
|
|
|
desktop = app.value("desktop", "").toString();
|
|
|
|
file = app.value("file", "").toString();
|
|
|
|
if (!desktop.isEmpty())
|
|
|
|
{
|
|
|
|
XdgDesktopFile xdg;
|
|
|
|
if (!xdg.load(desktop))
|
|
|
|
{
|
|
|
|
qDebug() << "XdgDesktopFile" << desktop << "is not valid";
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
if (!xdg.isSuitable())
|
|
|
|
{
|
|
|
|
qDebug() << "XdgDesktopFile" << desktop << "is not applicable";
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
|
|
|
addButton(new QuickLaunchAction(&xdg, this));
|
|
|
|
}
|
|
|
|
else if (! file.isEmpty())
|
|
|
|
{
|
|
|
|
addButton(new QuickLaunchAction(file, this));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
execname = app.value("name", "").toString();
|
|
|
|
exec = app.value("exec", "").toString();
|
|
|
|
icon = app.value("icon", "").toString();
|
|
|
|
if (icon.isNull())
|
|
|
|
{
|
|
|
|
qDebug() << "Icon" << icon << "is not valid (isNull). Skipped.";
|
|
|
|
continue;
|
|
|
|
}
|
|
|
|
addButton(new QuickLaunchAction(execname, exec, icon, this));
|
|
|
|
}
|
|
|
|
} // for
|
|
|
|
|
|
|
|
if (mLayout->isEmpty())
|
|
|
|
showPlaceHolder();
|
|
|
|
|
|
|
|
realign();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
LXQtQuickLaunch::~LXQtQuickLaunch()
|
|
|
|
{
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int LXQtQuickLaunch::indexOfButton(QuickLaunchButton* button) const
|
|
|
|
{
|
|
|
|
return mLayout->indexOf(button);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int LXQtQuickLaunch::countOfButtons() const
|
|
|
|
{
|
|
|
|
return mLayout->count();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LXQtQuickLaunch::realign()
|
|
|
|
{
|
|
|
|
mLayout->setEnabled(false);
|
|
|
|
ILXQtPanel *panel = mPlugin->panel();
|
|
|
|
|
|
|
|
if (mPlaceHolder)
|
|
|
|
{
|
|
|
|
mLayout->setColumnCount(1);
|
|
|
|
mLayout->setRowCount(1);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (panel->isHorizontal())
|
|
|
|
{
|
|
|
|
mLayout->setRowCount(panel->lineCount());
|
|
|
|
mLayout->setColumnCount(0);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
mLayout->setColumnCount(panel->lineCount());
|
|
|
|
mLayout->setRowCount(0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
mLayout->setEnabled(true);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LXQtQuickLaunch::addButton(QuickLaunchAction* action)
|
|
|
|
{
|
|
|
|
mLayout->setEnabled(false);
|
|
|
|
QuickLaunchButton* btn = new QuickLaunchButton(action, mPlugin, this);
|
|
|
|
mLayout->addWidget(btn);
|
|
|
|
|
|
|
|
connect(btn, SIGNAL(switchButtons(QuickLaunchButton*,QuickLaunchButton*)), this, SLOT(switchButtons(QuickLaunchButton*,QuickLaunchButton*)));
|
|
|
|
connect(btn, SIGNAL(buttonDeleted()), this, SLOT(buttonDeleted()));
|
|
|
|
connect(btn, SIGNAL(movedLeft()), this, SLOT(buttonMoveLeft()));
|
|
|
|
connect(btn, SIGNAL(movedRight()), this, SLOT(buttonMoveRight()));
|
|
|
|
|
|
|
|
mLayout->removeWidget(mPlaceHolder);
|
|
|
|
delete mPlaceHolder;
|
|
|
|
mPlaceHolder = 0;
|
|
|
|
mLayout->setEnabled(true);
|
|
|
|
realign();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LXQtQuickLaunch::dragEnterEvent(QDragEnterEvent *e)
|
|
|
|
{
|
|
|
|
// Getting URL from mainmenu...
|
|
|
|
if (e->mimeData()->hasUrls())
|
|
|
|
{
|
|
|
|
e->acceptProposedAction();
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (e->source() && e->source()->parent() == this)
|
|
|
|
{
|
|
|
|
e->acceptProposedAction();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LXQtQuickLaunch::dropEvent(QDropEvent *e)
|
|
|
|
{
|
|
|
|
const QMimeData *mime = e->mimeData();
|
|
|
|
|
|
|
|
foreach (const QUrl &url, mime->urls().toSet())
|
|
|
|
{
|
|
|
|
QString fileName(url.isLocalFile() ? url.toLocalFile() : url.url());
|
|
|
|
QFileInfo fi(fileName);
|
|
|
|
XdgDesktopFile xdg;
|
|
|
|
|
|
|
|
if (xdg.load(fileName))
|
|
|
|
{
|
|
|
|
if (xdg.isSuitable())
|
|
|
|
addButton(new QuickLaunchAction(&xdg, this));
|
|
|
|
}
|
|
|
|
else if (fi.exists() && fi.isExecutable() && !fi.isDir())
|
|
|
|
{
|
|
|
|
addButton(new QuickLaunchAction(fileName, fileName, "", this));
|
|
|
|
}
|
|
|
|
else if (fi.exists())
|
|
|
|
{
|
|
|
|
addButton(new QuickLaunchAction(fileName, this));
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
qWarning() << "XdgDesktopFile" << fileName << "is not valid";
|
|
|
|
QMessageBox::information(this, tr("Drop Error"),
|
|
|
|
tr("File/URL '%1' cannot be embedded into QuickLaunch for now").arg(fileName)
|
|
|
|
);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
saveSettings();
|
|
|
|
}
|
|
|
|
|
|
|
|
void LXQtQuickLaunch::switchButtons(QuickLaunchButton *button1, QuickLaunchButton *button2)
|
|
|
|
{
|
|
|
|
if (button1 == button2)
|
|
|
|
return;
|
|
|
|
|
|
|
|
int n1 = mLayout->indexOf(button1);
|
|
|
|
int n2 = mLayout->indexOf(button2);
|
|
|
|
|
|
|
|
int l = qMin(n1, n2);
|
|
|
|
int m = qMax(n1, n2);
|
|
|
|
|
|
|
|
mLayout->moveItem(l, m);
|
|
|
|
mLayout->moveItem(m-1, l);
|
|
|
|
saveSettings();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LXQtQuickLaunch::buttonDeleted()
|
|
|
|
{
|
|
|
|
QuickLaunchButton *btn = qobject_cast<QuickLaunchButton*>(sender());
|
|
|
|
if (!btn)
|
|
|
|
return;
|
|
|
|
|
|
|
|
mLayout->removeWidget(btn);
|
|
|
|
btn->deleteLater();
|
|
|
|
saveSettings();
|
|
|
|
|
|
|
|
if (mLayout->isEmpty())
|
|
|
|
showPlaceHolder();
|
|
|
|
|
|
|
|
realign();
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LXQtQuickLaunch::buttonMoveLeft()
|
|
|
|
{
|
|
|
|
QuickLaunchButton *btn = qobject_cast<QuickLaunchButton*>(sender());
|
|
|
|
if (!btn)
|
|
|
|
return;
|
|
|
|
|
|
|
|
int index = indexOfButton(btn);
|
|
|
|
if (index > 0)
|
|
|
|
{
|
|
|
|
mLayout->moveItem(index, index - 1);
|
|
|
|
saveSettings();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LXQtQuickLaunch::buttonMoveRight()
|
|
|
|
{
|
|
|
|
QuickLaunchButton *btn1 = qobject_cast<QuickLaunchButton*>(sender());
|
|
|
|
if (!btn1)
|
|
|
|
return;
|
|
|
|
|
|
|
|
int index = indexOfButton(btn1);
|
|
|
|
if (index < countOfButtons() - 1)
|
|
|
|
{
|
|
|
|
mLayout->moveItem(index, index + 1);
|
|
|
|
saveSettings();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LXQtQuickLaunch::saveSettings()
|
|
|
|
{
|
|
|
|
PluginSettings *settings = mPlugin->settings();
|
|
|
|
settings->remove("apps");
|
|
|
|
|
|
|
|
QList<QMap<QString, QVariant> > hashList;
|
|
|
|
int size = mLayout->count();
|
|
|
|
for (int j = 0; j < size; ++j)
|
|
|
|
{
|
|
|
|
QuickLaunchButton *b = qobject_cast<QuickLaunchButton*>(mLayout->itemAt(j)->widget());
|
|
|
|
if (!b)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
// convert QHash<QString, QString> to QMap<QString, QVariant>
|
|
|
|
QMap<QString, QVariant> map;
|
|
|
|
QHashIterator<QString, QString> it(b->settingsMap());
|
|
|
|
while (it.hasNext())
|
|
|
|
{
|
|
|
|
it.next();
|
|
|
|
map[it.key()] = it.value();
|
|
|
|
}
|
|
|
|
hashList << map;
|
|
|
|
}
|
|
|
|
|
|
|
|
settings->setArray("apps", hashList);
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
void LXQtQuickLaunch::showPlaceHolder()
|
|
|
|
{
|
|
|
|
if (!mPlaceHolder)
|
|
|
|
{
|
|
|
|
mPlaceHolder = new QLabel(this);
|
|
|
|
mPlaceHolder->setAlignment(Qt::AlignCenter);
|
|
|
|
mPlaceHolder->setObjectName("QuickLaunchPlaceHolder");
|
|
|
|
mPlaceHolder->setText(tr("Drop application\nicons here"));
|
|
|
|
}
|
|
|
|
|
|
|
|
mLayout->addWidget(mPlaceHolder);
|
|
|
|
}
|