[Panel-devel] KDE/kdebase/workspace/plasma/applets/kickoff
Robert Knight
robertknight at gmail.com
Sun Dec 9 07:12:11 CET 2007
Hi,
> * added optional favorites submenu
> * added optional switch user, lock and logout actions
> * added configuration interface to enable/disable them
Is it necessary or useful to make these menu items optional? I can
see that not everyone might want to have a list of shortcuts (the
favorites) in the menu, but I'm not sure the same can be said for the
Switch User, Lock and Logout options.
Regards,
Robert.
On 08/12/2007, Sebastian Sauer <mail at dipe.org> wrote:
> SVN commit 746417 by sebsauer:
>
> * fix menu-pos on zoom!=1:1
> * added optional favorites submenu
> * added optional switch user, lock and logout actions
> * added configuration interface to enable/disable them
>
>
>
> M +5 -0 core/urlitemlauncher.cpp
> M +2 -0 core/urlitemlauncher.h
> M +9 -3 simpleapplet/menuview.cpp
> M +153 -17 simpleapplet/simpleapplet.cpp
> M +8 -15 simpleapplet/simpleapplet.h
>
>
> --- trunk/KDE/kdebase/workspace/plasma/applets/kickoff/core/urlitemlauncher.cpp #746416:746417
> @@ -121,6 +121,11 @@
> return Private::openUrl(urlString);
> }
>
> +bool UrlItemLauncher::openUrl(const QString& url)
> +{
> + return Private::openUrl(url);
> +}
> +
> void UrlItemLauncher::onSetupDone(Solid::ErrorType error, QVariant errorData, const QString &udi)
> {
> if (error!=Solid::NoError) {
> --- trunk/KDE/kdebase/workspace/plasma/applets/kickoff/core/urlitemlauncher.h #746416:746417
> @@ -71,6 +71,8 @@
> public Q_SLOTS:
> /** Open the specified @p index from a Kickoff model. */
> bool openItem(const QModelIndex& index);
> + /** Open the specified @p url */
> + bool openUrl(const QString& url);
>
> private Q_SLOTS:
> void onSetupDone(Solid::ErrorType error, QVariant errorData, const QString &udi);
> --- trunk/KDE/kdebase/workspace/plasma/applets/kickoff/simpleapplet/menuview.cpp #746416:746417
> @@ -23,6 +23,7 @@
> // Qt
> #include <QtCore/QAbstractItemModel>
> #include <QtCore/QStack>
> +#include <QtCore/QUrl>
> #include <QtDebug>
>
> // Local
> @@ -75,6 +76,7 @@
> {
> connect(this,SIGNAL(triggered(QAction*)),this,SLOT(actionTriggered(QAction*)));
> UrlItemLauncher::addGlobalHandler(UrlItemLauncher::ExtensionHandler,"desktop",new ServiceItemHandler);
> + UrlItemLauncher::addGlobalHandler(UrlItemLauncher::ProtocolHandler, "leave", new LeaveItemHandler);
> }
> MenuView::~MenuView()
> {
> @@ -121,7 +123,8 @@
> QMenu *menu = qobject_cast<QMenu*>(parentWidget);
> while (menu) {
> int row = menu->actions().indexOf(action);
> - Q_ASSERT( row != -1 );
> + if( row < 0 )
> + return QModelIndex();
> rows.push(row);
>
> if (menu == this) {
> @@ -254,7 +257,10 @@
> void MenuView::actionTriggered(QAction *action)
> {
> QModelIndex index = indexForAction(action);
> - Q_ASSERT(index.isValid());
> - d->launcher->openItem(index);
> + if (index.isValid())
> + d->launcher->openItem(index);
> + else if (action->data().type() == QVariant::Url)
> + d->launcher->openUrl(action->data().toUrl().toString());
> }
> +
> #include "menuview.moc"
> --- trunk/KDE/kdebase/workspace/plasma/applets/kickoff/simpleapplet/simpleapplet.cpp #746416:746417
> @@ -22,12 +22,15 @@
> #include "simpleapplet/menuview.h"
>
> // Qt
> +#include <QCheckBox>
> +#include <QVBoxLayout>
> #include <QGraphicsSceneMouseEvent>
> #include <QGraphicsView>
> #include <QtDebug>
>
> // KDE
> #include <KIcon>
> +#include <KDialog>
>
> // Plasma
> #include <plasma/layouts/boxlayout.h>
> @@ -35,24 +38,71 @@
> #include <plasma/containment.h>
>
> // Local
> +#include "core/models.h"
> #include "core/applicationmodel.h"
> +#include "core/favoritesmodel.h"
> +#include "core/leavemodel.h"
>
> +class MenuLauncherApplet::Private
> +{
> +public:
> + QMenu *menuview;
> + Plasma::Icon *icon;
> + Kickoff::MenuView *appview;
> + Kickoff::MenuView* favview;
> +
> + bool showFavorites;
> + bool showLeaveSwitchUser;
> + bool showLeaveLock;
> + bool showLeaveLogout;
> +
> + KDialog *dialog;
> + QCheckBox *showFavCheckBox;
> + QCheckBox *showSwitchUserCheckBox;
> + QCheckBox *showLockCheckBox;
> + QCheckBox *showLogoutCheckBox;
> +
> + Private() : menuview(0), appview(0), favview(0), dialog(0) {}
> + ~Private() { delete dialog; delete menuview; delete appview; delete favview; }
> +};
> +
> MenuLauncherApplet::MenuLauncherApplet(QObject *parent, const QVariantList &args)
> : Plasma::Applet(parent,args),
> - m_menuview(0)
> + d(new Private)
> {
> + setHasConfigurationInterface(true);
> +
> Plasma::HBoxLayout *layout = new Plasma::HBoxLayout(this);
> layout->setMargin(0);
> - m_icon = new Plasma::Icon(KIcon("start-here"), QString(), this);
> - m_icon->setFlag(ItemIsMovable, false);
> - connect(m_icon, SIGNAL(pressed(bool, QGraphicsSceneMouseEvent*)), this, SLOT(toggleMenu(bool,QGraphicsSceneMouseEvent*)));
> +
> + d->icon = new Plasma::Icon(QString(), this);
> + d->icon->setFlag(ItemIsMovable, false);
> + connect(d->icon, SIGNAL(pressed(bool, QGraphicsSceneMouseEvent*)), this, SLOT(toggleMenu(bool,QGraphicsSceneMouseEvent*)));
> +
> + d->showFavorites = true;
> + d->showLeaveSwitchUser = true;
> + d->showLeaveLock = true;
> + d->showLeaveLogout = true;
> }
>
> MenuLauncherApplet::~MenuLauncherApplet()
> {
> - delete m_menuview;
> + delete d;
> }
>
> +void MenuLauncherApplet::init()
> +{
> + KConfigGroup cg = config();
> +
> + d->icon->setIcon(KIcon(cg.readEntry("icon","start-here")));
> + //setMinimumContentSize(d->icon->iconSize()); //setSize(d->icon->iconSize())
> +
> + d->showFavorites = cg.readEntry("showFavorites",d->showFavorites);
> + d->showLeaveSwitchUser = cg.readEntry("showLeaveSwitchUser",d->showLeaveSwitchUser);
> + d->showLeaveLock = cg.readEntry("showLeaveLock",d->showLeaveLock);
> + d->showLeaveLogout = cg.readEntry("showLeaveLogout",d->showLeaveLogout);
> +}
> +
> QSizeF MenuLauncherApplet::contentSizeHint() const
> {
> return QSizeF(48,48);
> @@ -63,34 +113,120 @@
> return 0;
> }
>
> +void MenuLauncherApplet::showConfigurationInterface()
> +{
> + if (! d->dialog) {
> + d->dialog = new KDialog();
> + d->dialog->setCaption( i18nc("@title:window","Configure Menu") );
> + d->dialog->setButtons( KDialog::Ok | KDialog::Cancel | KDialog::Apply );
> + connect(d->dialog, SIGNAL(applyClicked()), this, SLOT(configAccepted()));
> + connect(d->dialog, SIGNAL(okClicked()), this, SLOT(configAccepted()));
> +
> + QVBoxLayout *layout = new QVBoxLayout(d->dialog->mainWidget());
> + d->dialog->mainWidget()->setLayout(layout);
> +
> + d->showFavCheckBox = new QCheckBox(i18n("Favorites"), d->dialog->mainWidget());
> + d->showFavCheckBox->setCheckState(d->showFavorites ? Qt::Checked : Qt::Unchecked);
> + layout->addWidget(d->showFavCheckBox);
> +
> + d->showSwitchUserCheckBox = new QCheckBox(i18n("Switch User"), d->dialog->mainWidget());
> + d->showSwitchUserCheckBox->setCheckState(d->showLeaveSwitchUser ? Qt::Checked : Qt::Unchecked);
> + layout->addWidget(d->showSwitchUserCheckBox);
> +
> + d->showLockCheckBox = new QCheckBox(i18n("Lock"), d->dialog->mainWidget());
> + d->showLockCheckBox->setCheckState(d->showLeaveLock ? Qt::Checked : Qt::Unchecked);
> + layout->addWidget(d->showLockCheckBox);
> +
> + d->showLogoutCheckBox = new QCheckBox(i18n("Logout"), d->dialog->mainWidget());
> + d->showLogoutCheckBox->setCheckState(d->showLeaveLogout ? Qt::Checked : Qt::Unchecked);
> + layout->addWidget(d->showLogoutCheckBox);
> + }
> + d->dialog->show();
> +}
> +
> +void MenuLauncherApplet::configAccepted()
> +{
> + d->showFavorites = d->showFavCheckBox->checkState() == Qt::Checked;
> + d->showLeaveSwitchUser = d->showSwitchUserCheckBox->checkState() == Qt::Checked;
> + d->showLeaveLock = d->showLockCheckBox->checkState() == Qt::Checked;
> + d->showLeaveLogout = d->showLogoutCheckBox->checkState() == Qt::Checked;
> +
> + KConfigGroup cg = config();
> + cg.writeEntry("showFavorites", d->showFavorites);
> + cg.writeEntry("showLeaveSwitchUser", d->showLeaveSwitchUser);
> + cg.writeEntry("showLeaveLock", d->showLeaveLock);
> + cg.writeEntry("showLeaveLogout", d->showLeaveLogout);
> + cg.config()->sync();
> +
> + delete d->menuview;
> + d->menuview = 0;
> +}
> +
> void MenuLauncherApplet::toggleMenu(bool pressed, QGraphicsSceneMouseEvent *event)
> {
> if (!pressed) {
> return;
> }
>
> - if (!m_menuview) {
> - m_menuview = new Kickoff::MenuView();
> - ApplicationModel *appModel = new ApplicationModel(m_menuview);
> - appModel->setDuplicatePolicy(ApplicationModel::ShowLatestOnlyPolicy);
> - m_menuview->setModel(appModel);
> + if (!d->menuview) {
> + d->menuview = new QMenu();
> +
> + if(!d->appview) {
> + d->appview = new Kickoff::MenuView();
> + ApplicationModel *appModel = new ApplicationModel(d->appview);
> + appModel->setDuplicatePolicy(ApplicationModel::ShowLatestOnlyPolicy);
> + d->appview->setModel(appModel);
> + }
> + foreach (QAction *action, d->appview->actions())
> + d->menuview->addAction(action);
> + connect(d->menuview,SIGNAL(triggered(QAction*)),d->appview,SLOT(actionTriggered(QAction*)));
> +
> + if (d->showFavorites) {
> + if (!d->favview) {
> + d->favview = new Kickoff::MenuView();
> + Kickoff::FavoritesModel* favmodel = new Kickoff::FavoritesModel(d->favview);
> + d->favview->setModel(favmodel);
> + }
> + d->menuview->addSeparator();
> + foreach (QAction *action, d->favview->actions())
> + d->menuview->addAction(action);
> + connect(d->menuview,SIGNAL(triggered(QAction*)),d->favview,SLOT(actionTriggered(QAction*)));
> + }
> +
> + if (d->showLeaveSwitchUser || d->showLeaveLock || d->showLeaveLogout) {
> + d->menuview->addSeparator();
> + if (d->showLeaveSwitchUser) {
> + QAction *lockaction = d->menuview->addAction(KIcon("system-switch-user"),i18n("Switch User"));
> + lockaction->setData(QUrl("leave:/switch"));
> + }
> + if (d->showLeaveLock) {
> + QAction *lockaction = d->menuview->addAction(KIcon("system-lock-screen"),i18n("Lock"));
> + lockaction->setData(QUrl("leave:/lock"));
> + }
> + if (d->showLeaveLogout) {
> + QAction *logoutaction = d->menuview->addAction(KIcon("system-log-out"),i18n("Logout"));
> + logoutaction->setData(QUrl("leave:/logout"));
> + }
> + }
> }
>
> - QPointF scenePos = mapToScene(boundingRect().topLeft());
> + const QPointF scenePos = mapToScene(boundingRect().topLeft());
> QWidget *viewWidget = event->widget() ? event->widget()->parentWidget() : 0;
> QGraphicsView *view = qobject_cast<QGraphicsView*>(viewWidget);
> QPoint globalPos;
> if (view) {
> - QPoint viewPos = view->mapFromScene(scenePos);
> + const QPoint viewPos = view->mapFromScene(scenePos);
> globalPos = view->mapToGlobal(viewPos);
> - int ypos = globalPos.ry() - m_menuview->sizeHint().height();
> - if( ypos < 0 )
> - ypos = globalPos.ry() + boundingRect().height();
> + int ypos = globalPos.ry() - d->menuview->sizeHint().height();
> + if( ypos < 0 ) {
> + const QRect size = mapToView(view, boundingRect());
> + ypos = globalPos.ry() + size.height();
> + }
> globalPos.ry() = ypos;
> }
>
> - m_menuview->setAttribute(Qt::WA_DeleteOnClose);
> - m_menuview->popup(globalPos);
> + d->menuview->setAttribute(Qt::WA_DeleteOnClose);
> + d->menuview->popup(globalPos);
> }
>
> #include "simpleapplet.moc"
> --- trunk/KDE/kdebase/workspace/plasma/applets/kickoff/simpleapplet/simpleapplet.h #746416:746417
> @@ -20,24 +20,11 @@
> #ifndef SIMPLEAPPLET_H
> #define SIMPLEAPPLET_H
>
> -// KDE
> -#include <KIcon>
> -
> // Plasma
> #include <plasma/applet.h>
>
> class QGraphicsSceneMouseEvent;
>
> -namespace Kickoff
> -{
> - class MenuView;
> -}
> -namespace Plasma
> -{
> - class Icon;
> - class PushButton;
> -}
> -
> class MenuLauncherApplet : public Plasma::Applet
> {
> Q_OBJECT
> @@ -46,15 +33,21 @@
> MenuLauncherApplet(QObject *parent, const QVariantList &args);
> virtual ~MenuLauncherApplet();
>
> + void init();
> +
> QSizeF contentSizeHint() const;
> Qt::Orientations expandingDirections() const;
>
> +public slots:
> + void showConfigurationInterface();
> +
> protected slots:
> + void configAccepted();
> void toggleMenu(bool pressed, QGraphicsSceneMouseEvent *event);
>
> private:
> - Kickoff::MenuView *m_menuview;
> - Plasma::Icon *m_icon;
> + class Private;
> + Private * const d;
> };
>
> K_EXPORT_PLASMA_APPLET(menulauncher, MenuLauncherApplet)
>
More information about the Panel-devel
mailing list