/* 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 * Kuzma Shapran * * 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 #include #include #include #include #include #include #include #include #include #include #include #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 &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(sender()); if (!btn) return; mLayout->removeWidget(btn); btn->deleteLater(); saveSettings(); if (mLayout->isEmpty()) showPlaceHolder(); realign(); } void LXQtQuickLaunch::buttonMoveLeft() { QuickLaunchButton *btn = qobject_cast(sender()); if (!btn) return; int index = indexOfButton(btn); if (index > 0) { mLayout->moveItem(index, index - 1); saveSettings(); } } void LXQtQuickLaunch::buttonMoveRight() { QuickLaunchButton *btn1 = qobject_cast(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 > hashList; int size = mLayout->count(); for (int j = 0; j < size; ++j) { QuickLaunchButton *b = qobject_cast(mLayout->itemAt(j)->widget()); if (!b) continue; // convert QHash to QMap QMap map; QHashIterator 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); }