You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
lxqt-panel-packaging/panel/lxqtpanelapplication.h

184 lines
6.5 KiB

/* BEGIN_COMMON_COPYRIGHT_HEADER
* (c)LGPL2+
*
* LXDE-Qt - a lightweight, Qt based, desktop toolset
* http://razor-qt.org
*
* Copyright: 2010-2011 Razor team
* Authors:
* Alexander Sokoloff <sokoloff.a@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 */
#ifndef LXQTPANELAPPLICATION_H
#define LXQTPANELAPPLICATION_H
#include <LXQt/Application>
#include "ilxqtpanelplugin.h"
class QScreen;
class LXQtPanel;
class LXQtPanelApplicationPrivate;
/*!
* \brief The LXQtPanelApplication class inherits from LXQt::Application and
* is therefore the QApplication that we will create and execute in our
* main()-function.
*
* LXQtPanelApplication itself is not a visible panel, rather it is only
* the container which holds the visible panels. These visible panels are
* LXQtPanel objects which are stored in mPanels. This approach enables us
* to have more than one panel (for example one panel at the top and one
* panel at the bottom of the screen) without additional effort.
*/
class LXQtPanelApplication : public LXQt::Application
{
Q_OBJECT
public:
/*!
* \brief Creates a new LXQtPanelApplication with the given command line
* arguments. Performs the following steps:
* 1. Initializes the LXQt::Application, sets application name and version.
* 2. Handles command line arguments. Currently, the only cmdline argument
* is -c = -config = -configfile which chooses a different config file
* for the LXQt::Settings.
* 3. Creates the LXQt::Settings.
* 4. Connects QCoreApplication::aboutToQuit to cleanup().
* 5. Calls addPanel() for each panel found in the config file. If there is
* none, adds a new panel.
* \param argc
* \param argv
*/
explicit LXQtPanelApplication(int& argc, char** argv);
~LXQtPanelApplication();
/*!
* \brief Determines the number of LXQtPanel objects
* \return the current number of LXQtPanel objects
*/
int count() { return mPanels.count(); }
/*!
* \brief Checks if a given Plugin is running and has the
* ILXQtPanelPlugin::SingleInstance flag set. As Plugins are added to
* LXQtPanel instances, this method only iterates over these LXQtPanel
* instances and lets them check the conditions.
* \param pluginId Plugin Identifier which is the basename of the .desktop
* file that specifies the plugin.
* \return true if the Plugin is running and has the
* ILXQtPanelPlugin::SingleInstance flag set, false otherwise.
*/
bool isPluginSingletonAndRunnig(QString const & pluginId) const;
public slots:
/*!
* \brief Adds a new LXQtPanel which consists of the following steps:
* 1. Create id/name.
* 2. Create the LXQtPanel: call addPanel(name).
* 3. Update the config file (add the new panel id to the list of panels).
* 4. Show the panel configuration dialog so that the user can add plugins.
*
* This method will create a new LXQtPanel with a new name and add this
* to the config file. So this should only be used while the application
* is running and the user decides to add a new panel. At application
* startup, addPanel() should be used instead.
*
* \note This slot will be used from the LXQtPanel right-click menu. As we
* can only add new panels from a visible panel, we should never run
* lxqt-panel without an LXQtPanel. Without a panel, we have just an
* invisible application.
*/
void addNewPanel();
signals:
/*!
* \brief Signal that re-emits the signal pluginAdded() from LXQtPanel.
*/
void pluginAdded();
/*!
* \brief Signal that re-emits the signal pluginRemoved() from LXQtPanel.
*/
void pluginRemoved();
private:
/*!
* \brief Holds all the instances of LXQtPanel.
*/
QList<LXQtPanel*> mPanels;
/*!
* \brief Creates a new LXQtPanel with the given name and connects the
* appropriate signals and slots.
* This method can be used at application startup.
* \param name Name of the LXQtPanel as it is used in the config file.
* \return The newly created LXQtPanel.
*/
LXQtPanel* addPanel(const QString &name);
private slots:
/*!
* \brief Removes the given LXQtPanel which consists of the following
* steps:
* 1. Remove the panel from mPanels.
* 2. Remove the panel from the config file.
* 3. Schedule the QObject for deletion: QObject::deleteLater().
* \param panel LXQtPanel instance that should be removed.
*/
void removePanel(LXQtPanel* panel);
/*!
* \brief Connects the QScreen::destroyed signal of a new screen to
* the screenDestroyed() slot so that we can handle this screens'
* destruction as soon as it happens.
* \param newScreen The QScreen that was created and added.
*/
void handleScreenAdded(QScreen* newScreen);
/*!
* \brief Handles screen destruction. This is a workaround for a Qt bug.
* For further information, see the implementation notes.
* \param screenObj The QScreen that was destroyed.
*/
void screenDestroyed(QObject* screenObj);
/*!
* \brief Reloads the panels. This is the second part of the workaround
* mentioned above.
*/
void reloadPanelsAsNeeded();
/*!
* \brief Deletes all LXQtPanel instances that are stored in mPanels.
*/
void cleanup();
private:
/*!
* \brief mSettings is the LXQt::Settings object that is used for the
* current instance of lxqt-panel. Normally, this refers to the config file
* $HOME/.config/lxqt/panel.conf (on Unix systems). This behaviour can be
* changed with the -c command line option.
*/
LXQtPanelApplicationPrivate *const d_ptr;
Q_DECLARE_PRIVATE(LXQtPanelApplication)
Q_DISABLE_COPY(LXQtPanelApplication)
};
#endif // LXQTPANELAPPLICATION_H