plasma: rework launcher applet "under mouse" state check

to match that of Plasma::ScrollWidget (for better or worse) doing it ala
fixup by compressing the checks, during DnD the state is not checked tho
but there are no constant checks now

Signed-off-by: Ivailo Monev <xakepa10@gmail.com>
This commit is contained in:
Ivailo Monev 2024-05-23 19:34:13 +03:00
parent 2978f69078
commit bea052e609

View file

@ -78,6 +78,8 @@ static const int s_launcherdelay = 500; // ms
static const int s_animationduration = 250; static const int s_animationduration = 250;
static const int s_iconmargin = 2; static const int s_iconmargin = 2;
static const int s_actionmargin = 1; static const int s_actionmargin = 1;
// double the usual animation time
static const int s_undertimeout = 500; // ms
static QSizeF kIconSize() static QSizeF kIconSize()
{ {
@ -182,13 +184,14 @@ public:
void addAction(QAction *action); void addAction(QAction *action);
void removeAction(const int action); void removeAction(const int action);
void setUnderMouse(const bool undermouse);
Q_SIGNALS: Q_SIGNALS:
void activated(); void activated();
private Q_SLOTS: private Q_SLOTS:
void slotClicked(const Qt::MouseButton button); void slotClicked(const Qt::MouseButton button);
void slotUpdateFonts(); void slotUpdateFonts();
void slotTimeout();
protected: protected:
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) final; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) final;
@ -225,7 +228,6 @@ private:
QString m_data; QString m_data;
int m_actioncounter; int m_actioncounter;
QPointer<QMimeData> m_mimedata; QPointer<QMimeData> m_mimedata;
QTimer* m_undermousetimer;
}; };
LauncherWidget::LauncherWidget(QGraphicsWidget *parent) LauncherWidget::LauncherWidget(QGraphicsWidget *parent)
@ -248,8 +250,7 @@ LauncherWidget::LauncherWidget(QGraphicsWidget *parent)
m_action3animation(nullptr), m_action3animation(nullptr),
m_action4animation(nullptr), m_action4animation(nullptr),
m_actioncounter(0), m_actioncounter(0),
m_mimedata(nullptr), m_mimedata(nullptr)
m_undermousetimer(nullptr)
{ {
m_layout = new QGraphicsLinearLayout(Qt::Horizontal, this); m_layout = new QGraphicsLinearLayout(Qt::Horizontal, this);
setLayout(m_layout); setLayout(m_layout);
@ -307,15 +308,6 @@ LauncherWidget::LauncherWidget(QGraphicsWidget *parent)
KGlobalSettings::self(), SIGNAL(kdisplayFontChanged()), KGlobalSettings::self(), SIGNAL(kdisplayFontChanged()),
this, SLOT(slotUpdateFonts()) this, SLOT(slotUpdateFonts())
); );
m_undermousetimer = new QTimer(this);
// this could be done on scroll event (Plasma::ScrollWidget::scrollStateChanged()) but that
// means locking for thread-safety
m_undermousetimer->setInterval(s_animationduration * 4);
connect(
m_undermousetimer, SIGNAL(timeout()),
this, SLOT(slotTimeout())
);
} }
LauncherWidget::~LauncherWidget() LauncherWidget::~LauncherWidget()
@ -456,6 +448,11 @@ void LauncherWidget::removeAction(const int actionnumber)
} }
} }
void LauncherWidget::setUnderMouse(const bool undermouse)
{
animateHoverAndButtons(!undermouse);
}
void LauncherWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) void LauncherWidget::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{ {
Q_UNUSED(option); Q_UNUSED(option);
@ -508,9 +505,7 @@ QVariant LauncherWidget::itemChange(QGraphicsItem::GraphicsItemChange change, co
switch (change) { switch (change) {
case QGraphicsItem::ItemVisibleHasChanged: { case QGraphicsItem::ItemVisibleHasChanged: {
if (value.toBool()) { if (value.toBool()) {
m_undermousetimer->start(); setUnderMouse(isUnderMouse());
} else {
m_undermousetimer->stop();
} }
break; break;
} }
@ -608,13 +603,98 @@ void LauncherWidget::slotUpdateFonts()
m_subtextwidget->setFont(subtextfont); m_subtextwidget->setFont(subtextfont);
} }
void LauncherWidget::slotTimeout()
class LauncherWidgetBase : public QGraphicsWidget
{ {
animateHoverAndButtons(!isUnderMouse()); Q_OBJECT
public:
LauncherWidgetBase(QGraphicsWidget *parent, LauncherApplet *launcherapplet);
protected:
QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value) final;
void clearLauncherWidgets();
void checkUnderMouse();
QMutex b_mutex;
LauncherApplet* b_launcherapplet;
QGraphicsLinearLayout* b_layout;
QList<LauncherWidget*> b_launcherwidgets;
private Q_SLOTS:
void slotTimeout();
private:
QTimer* m_undertimer;
};
LauncherWidgetBase::LauncherWidgetBase(QGraphicsWidget *parent, LauncherApplet *launcherapplet)
: QGraphicsWidget(parent),
b_launcherapplet(launcherapplet),
b_layout(nullptr),
m_undertimer(nullptr)
{
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
b_layout = new QGraphicsLinearLayout(Qt::Vertical, this);
setLayout(b_layout);
}
QVariant LauncherWidgetBase::itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value)
{
const QVariant result = QGraphicsWidget::itemChange(change, value);
switch (change) {
case QGraphicsItem::ItemPositionHasChanged: {
if (!m_undertimer) {
m_undertimer = new QTimer(this);
m_undertimer->setInterval(s_undertimeout);
m_undertimer->setSingleShot(true);
connect(
m_undertimer, SIGNAL(timeout()),
this, SLOT(slotTimeout())
);
}
if (!m_undertimer->isActive()) {
QMutexLocker locker(&b_mutex);
foreach (LauncherWidget* launcherwidget, b_launcherwidgets) {
launcherwidget->setUnderMouse(false);
}
}
// compresses checks until position stop changing
m_undertimer->start();
break;
}
default: {
break;
}
}
return result;
}
void LauncherWidgetBase::clearLauncherWidgets()
{
foreach (LauncherWidget* launcherwidget, b_launcherwidgets) {
b_layout->removeItem(launcherwidget);
}
qDeleteAll(b_launcherwidgets);
b_launcherwidgets.clear();
adjustSize();
}
void LauncherWidgetBase::checkUnderMouse()
{
QMutexLocker locker(&b_mutex);
foreach (LauncherWidget* launcherwidget, b_launcherwidgets) {
launcherwidget->setUnderMouse(launcherwidget->isUnderMouse());
}
}
void LauncherWidgetBase::slotTimeout()
{
checkUnderMouse();
} }
class LauncherSearch : public QGraphicsWidget class LauncherSearch : public LauncherWidgetBase
{ {
Q_OBJECT Q_OBJECT
public: public:
@ -633,10 +713,6 @@ private Q_SLOTS:
void slotDelayedRun(); void slotDelayedRun();
private: private:
QMutex m_mutex;
LauncherApplet* m_launcherapplet;
QGraphicsLinearLayout* m_layout;
QList<LauncherWidget*> m_launcherwidgets;
Plasma::Label* m_label; Plasma::Label* m_label;
Plasma::BusyWidget* m_busywidget; Plasma::BusyWidget* m_busywidget;
Plasma::RunnerManager* m_runnermanager; Plasma::RunnerManager* m_runnermanager;
@ -644,26 +720,20 @@ private:
}; };
LauncherSearch::LauncherSearch(QGraphicsWidget *parent, LauncherApplet *launcherapplet) LauncherSearch::LauncherSearch(QGraphicsWidget *parent, LauncherApplet *launcherapplet)
: QGraphicsWidget(parent), : LauncherWidgetBase(parent, launcherapplet),
m_launcherapplet(launcherapplet),
m_layout(nullptr),
m_label(nullptr), m_label(nullptr),
m_busywidget(nullptr), m_busywidget(nullptr),
m_runnermanager(launcherapplet->runnerManager()), m_runnermanager(launcherapplet->runnerManager()),
m_match(nullptr) m_match(nullptr)
{ {
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_layout = new QGraphicsLinearLayout(Qt::Vertical, this);
setLayout(m_layout);
m_label = new Plasma::Label(this); m_label = new Plasma::Label(this);
m_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_label->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_label->setAlignment(Qt::AlignCenter); m_label->setAlignment(Qt::AlignCenter);
m_layout->addItem(m_label); b_layout->addItem(m_label);
m_busywidget = new Plasma::BusyWidget(this); m_busywidget = new Plasma::BusyWidget(this);
m_busywidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); m_busywidget->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_layout->addItem(m_busywidget); b_layout->addItem(m_busywidget);
connect( connect(
m_runnermanager, SIGNAL(queryFinished()), m_runnermanager, SIGNAL(queryFinished()),
@ -673,12 +743,8 @@ LauncherSearch::LauncherSearch(QGraphicsWidget *parent, LauncherApplet *launcher
void LauncherSearch::prepare() void LauncherSearch::prepare()
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&b_mutex);
foreach (LauncherWidget* launcherwidget, m_launcherwidgets) { clearLauncherWidgets();
m_layout->removeItem(launcherwidget);
}
qDeleteAll(m_launcherwidgets);
m_launcherwidgets.clear();
m_label->setText(i18n("Searching..")); m_label->setText(i18n("Searching.."));
m_label->setVisible(true); m_label->setVisible(true);
@ -696,7 +762,7 @@ void LauncherSearch::query(const QString &text)
void LauncherSearch::slotUpdateLayout() void LauncherSearch::slotUpdateLayout()
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&b_mutex);
const QList<Plasma::QueryMatch> matches = m_runnermanager->matches(); const QList<Plasma::QueryMatch> matches = m_runnermanager->matches();
m_busywidget->setRunning(false); m_busywidget->setRunning(false);
m_busywidget->setVisible(false); m_busywidget->setVisible(false);
@ -734,13 +800,15 @@ void LauncherSearch::slotUpdateLayout()
} }
} }
launcherwidget->setMimeData(m_runnermanager->mimeDataForMatch(match)); launcherwidget->setMimeData(m_runnermanager->mimeDataForMatch(match));
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotActivated()) this, SLOT(slotActivated())
); );
} }
locker.unlock();
checkUnderMouse();
emit queryFinished(); emit queryFinished();
} }
@ -748,7 +816,7 @@ void LauncherSearch::slotTriggered()
{ {
QAction* matchaction = qobject_cast<QAction*>(sender()); QAction* matchaction = qobject_cast<QAction*>(sender());
const QString matchid = matchaction->property("_k_id").toString(); const QString matchid = matchaction->property("_k_id").toString();
m_launcherapplet->resetState(); b_launcherapplet->resetState();
foreach (const Plasma::QueryMatch &match, m_runnermanager->matches()) { foreach (const Plasma::QueryMatch &match, m_runnermanager->matches()) {
if (match.id() == matchid) { if (match.id() == matchid) {
m_match = match; m_match = match;
@ -763,7 +831,7 @@ void LauncherSearch::slotTriggered()
void LauncherSearch::slotActivated() void LauncherSearch::slotActivated()
{ {
LauncherWidget* launcherwidget = qobject_cast<LauncherWidget*>(sender()); LauncherWidget* launcherwidget = qobject_cast<LauncherWidget*>(sender());
m_launcherapplet->resetState(); b_launcherapplet->resetState();
const QString matchid = launcherwidget->data(); const QString matchid = launcherwidget->data();
foreach (const Plasma::QueryMatch &match, m_runnermanager->matches()) { foreach (const Plasma::QueryMatch &match, m_runnermanager->matches()) {
if (match.id() == matchid) { if (match.id() == matchid) {
@ -781,33 +849,7 @@ void LauncherSearch::slotDelayedRun()
} }
class LauncherSearchHelp : public QGraphicsWidget class LauncherFavorites : public LauncherWidgetBase
{
Q_OBJECT
public:
LauncherSearchHelp(QGraphicsWidget *parent, LauncherApplet *launcherapplet);
private:
LauncherApplet* m_launcherapplet;
QGraphicsLinearLayout* m_layout;
Plasma::RunnerManager* m_runnermanager;
};
LauncherSearchHelp::LauncherSearchHelp(QGraphicsWidget *parent, LauncherApplet *launcherapplet)
: QGraphicsWidget(parent),
m_launcherapplet(launcherapplet),
m_layout(nullptr),
m_runnermanager(launcherapplet->runnerManager())
{
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_layout = new QGraphicsLinearLayout(Qt::Vertical, this);
setLayout(m_layout);
// TODO: fill with text about the runners
}
class LauncherFavorites : public QGraphicsWidget
{ {
Q_OBJECT Q_OBJECT
public: public:
@ -821,23 +863,13 @@ private Q_SLOTS:
void slotTriggered(); void slotTriggered();
private: private:
QMutex m_mutex;
LauncherApplet* m_launcherapplet;
KBookmarkManager* m_bookmarkmanager; KBookmarkManager* m_bookmarkmanager;
QGraphicsLinearLayout* m_layout;
QList<LauncherWidget*> m_launcherwidgets;
}; };
LauncherFavorites::LauncherFavorites(QGraphicsWidget *parent, LauncherApplet* launcherapplet) LauncherFavorites::LauncherFavorites(QGraphicsWidget *parent, LauncherApplet* launcherapplet)
: QGraphicsWidget(parent), : LauncherWidgetBase(parent, launcherapplet),
m_launcherapplet(launcherapplet), m_bookmarkmanager(launcherapplet->bookmarkManager())
m_bookmarkmanager(launcherapplet->bookmarkManager()),
m_layout(nullptr)
{ {
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_layout = new QGraphicsLinearLayout(Qt::Vertical, this);
setLayout(m_layout);
connect( connect(
m_bookmarkmanager, SIGNAL(changed(QString,QString)), m_bookmarkmanager, SIGNAL(changed(QString,QString)),
this, SLOT(slotUpdateLayout()) this, SLOT(slotUpdateLayout())
@ -854,14 +886,8 @@ LauncherFavorites::LauncherFavorites(QGraphicsWidget *parent, LauncherApplet* la
void LauncherFavorites::slotUpdateLayout() void LauncherFavorites::slotUpdateLayout()
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&b_mutex);
foreach (LauncherWidget* launcherwidget, m_launcherwidgets) { clearLauncherWidgets();
m_layout->removeItem(launcherwidget);
}
qDeleteAll(m_launcherwidgets);
m_launcherwidgets.clear();
adjustSize();
bool isfirsttime = true; bool isfirsttime = true;
KBookmarkGroup bookmarkgroup = m_bookmarkmanager->root(); KBookmarkGroup bookmarkgroup = m_bookmarkmanager->root();
@ -931,8 +957,8 @@ void LauncherFavorites::slotUpdateLayout()
); );
launcherwidget->addAction(favoriteaction); launcherwidget->addAction(favoriteaction);
launcherwidget->setMimeData(kMakeMimeData(entrypath)); launcherwidget->setMimeData(kMakeMimeData(entrypath));
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotActivated()) this, SLOT(slotActivated())
@ -951,12 +977,15 @@ void LauncherFavorites::slotUpdateLayout()
this, SLOT(slotUpdateLayout()) this, SLOT(slotUpdateLayout())
); );
} }
locker.unlock();
checkUnderMouse();
} }
void LauncherFavorites::slotActivated() void LauncherFavorites::slotActivated()
{ {
LauncherWidget* launcherwidget = qobject_cast<LauncherWidget*>(sender()); LauncherWidget* launcherwidget = qobject_cast<LauncherWidget*>(sender());
kRunService(launcherwidget->data(), m_launcherapplet); kRunService(launcherwidget->data(), b_launcherapplet);
} }
void LauncherFavorites::slotTriggered() void LauncherFavorites::slotTriggered()
@ -1090,7 +1119,7 @@ void LauncherNavigator::slotReleased()
emit navigate(toolbutton->property("_k_id").toString()); emit navigate(toolbutton->property("_k_id").toString());
} }
class LauncherServiceWidget : public QGraphicsWidget class LauncherServiceWidget : public LauncherWidgetBase
{ {
Q_OBJECT Q_OBJECT
public: public:
@ -1108,25 +1137,15 @@ private Q_SLOTS:
void slotTriggered(); void slotTriggered();
private: private:
QMutex m_mutex;
LauncherApplet* m_launcherapplet;
KBookmarkManager* m_bookmarkmanager; KBookmarkManager* m_bookmarkmanager;
QGraphicsLinearLayout* m_layout;
QList<LauncherWidget*> m_launcherwidgets;
QString m_serviceid; QString m_serviceid;
}; };
LauncherServiceWidget::LauncherServiceWidget(QGraphicsWidget *parent, LauncherApplet *launcherapplet, const QString &serviceid) LauncherServiceWidget::LauncherServiceWidget(QGraphicsWidget *parent, LauncherApplet *launcherapplet, const QString &serviceid)
: QGraphicsWidget(parent), : LauncherWidgetBase(parent, launcherapplet),
m_launcherapplet(launcherapplet),
m_bookmarkmanager(launcherapplet->bookmarkManager()), m_bookmarkmanager(launcherapplet->bookmarkManager()),
m_layout(nullptr),
m_serviceid(serviceid) m_serviceid(serviceid)
{ {
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_layout = new QGraphicsLinearLayout(Qt::Vertical, this);
setLayout(m_layout);
KServiceGroup::Ptr servicegroup = KServiceGroup::group(serviceid); KServiceGroup::Ptr servicegroup = KServiceGroup::group(serviceid);
if (!servicegroup.isNull() && servicegroup->isValid()) { if (!servicegroup.isNull() && servicegroup->isValid()) {
const QSizeF iconsize = kIconSize(); const QSizeF iconsize = kIconSize();
@ -1139,8 +1158,8 @@ LauncherServiceWidget::LauncherServiceWidget(QGraphicsWidget *parent, LauncherAp
iconsize, kGenericIcon(subgroup->icon()), subgroup->caption(), subgroup->comment() iconsize, kGenericIcon(subgroup->icon()), subgroup->caption(), subgroup->comment()
); );
launcherwidget->setData(subgroup->relPath()); launcherwidget->setData(subgroup->relPath());
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotGroupActivated()) this, SLOT(slotGroupActivated())
@ -1157,8 +1176,8 @@ LauncherServiceWidget::LauncherServiceWidget(QGraphicsWidget *parent, LauncherAp
); );
launcherwidget->setData(entrypath); launcherwidget->setData(entrypath);
launcherwidget->setMimeData(kMakeMimeData(entrypath)); launcherwidget->setMimeData(kMakeMimeData(entrypath));
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotAppActivated()) this, SLOT(slotAppActivated())
@ -1168,6 +1187,7 @@ LauncherServiceWidget::LauncherServiceWidget(QGraphicsWidget *parent, LauncherAp
kWarning() << "invalid serivce group" << serviceid; kWarning() << "invalid serivce group" << serviceid;
} }
checkUnderMouse();
slotCheckBookmarks(); slotCheckBookmarks();
connect( connect(
m_bookmarkmanager, SIGNAL(changed(QString,QString)), m_bookmarkmanager, SIGNAL(changed(QString,QString)),
@ -1193,7 +1213,7 @@ void LauncherServiceWidget::slotGroupActivated()
void LauncherServiceWidget::slotAppActivated() void LauncherServiceWidget::slotAppActivated()
{ {
LauncherWidget* launcherwidget = qobject_cast<LauncherWidget*>(sender()); LauncherWidget* launcherwidget = qobject_cast<LauncherWidget*>(sender());
kRunService(launcherwidget->data(), m_launcherapplet); kRunService(launcherwidget->data(), b_launcherapplet);
} }
void LauncherServiceWidget::slotCheckBookmarks() void LauncherServiceWidget::slotCheckBookmarks()
@ -1206,8 +1226,8 @@ void LauncherServiceWidget::slotCheckBookmarks()
bookmark = bookmarkgroup.next(bookmark); bookmark = bookmarkgroup.next(bookmark);
} }
QMutexLocker locker(&m_mutex); QMutexLocker locker(&b_mutex);
foreach (LauncherWidget* launcherwidget, m_launcherwidgets) { foreach (LauncherWidget* launcherwidget, b_launcherwidgets) {
const QString launcherdata = launcherwidget->data(); const QString launcherdata = launcherwidget->data();
const bool isinfavorites = bookmarkurls.contains(launcherdata); const bool isinfavorites = bookmarkurls.contains(launcherdata);
// there is only one action, it is known which one is that // there is only one action, it is known which one is that
@ -1387,7 +1407,7 @@ void LauncherApplications::slotNavigate(const QString &id)
} }
class LauncherRecent : public QGraphicsWidget class LauncherRecent : public LauncherWidgetBase
{ {
Q_OBJECT Q_OBJECT
public: public:
@ -1401,23 +1421,13 @@ private Q_SLOTS:
void slotTriggered(); void slotTriggered();
private: private:
QMutex m_mutex;
LauncherApplet* m_launcherapplet;
QGraphicsLinearLayout* m_layout;
QList<LauncherWidget*> m_launcherwidgets;
KDirWatch* m_dirwatch; KDirWatch* m_dirwatch;
}; };
LauncherRecent::LauncherRecent(QGraphicsWidget *parent, LauncherApplet *launcherapplet) LauncherRecent::LauncherRecent(QGraphicsWidget *parent, LauncherApplet *launcherapplet)
: QGraphicsWidget(parent), : LauncherWidgetBase(parent, launcherapplet),
m_launcherapplet(launcherapplet),
m_layout(nullptr),
m_dirwatch(nullptr) m_dirwatch(nullptr)
{ {
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_layout = new QGraphicsLinearLayout(Qt::Vertical, this);
setLayout(m_layout);
m_dirwatch = new KDirWatch(this); m_dirwatch = new KDirWatch(this);
m_dirwatch->addDir(KRecentDocument::recentDocumentDirectory()); m_dirwatch->addDir(KRecentDocument::recentDocumentDirectory());
connect( connect(
@ -1428,14 +1438,8 @@ LauncherRecent::LauncherRecent(QGraphicsWidget *parent, LauncherApplet *launcher
void LauncherRecent::slotUpdateLayout() void LauncherRecent::slotUpdateLayout()
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&b_mutex);
foreach (LauncherWidget* launcherwidget, m_launcherwidgets) { clearLauncherWidgets();
m_layout->removeItem(launcherwidget);
}
qDeleteAll(m_launcherwidgets);
m_launcherwidgets.clear();
adjustSize();
const QSizeF iconsize = kIconSize(); const QSizeF iconsize = kIconSize();
foreach (const QString &recent, KRecentDocument::recentDocuments()) { foreach (const QString &recent, KRecentDocument::recentDocuments()) {
@ -1455,19 +1459,22 @@ void LauncherRecent::slotUpdateLayout()
Qt::QueuedConnection Qt::QueuedConnection
); );
launcherwidget->addAction(recenteaction); launcherwidget->addAction(recenteaction);
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotActivated()) this, SLOT(slotActivated())
); );
} }
locker.unlock();
checkUnderMouse();
} }
void LauncherRecent::slotActivated() void LauncherRecent::slotActivated()
{ {
LauncherWidget* launcherwidget = qobject_cast<LauncherWidget*>(sender()); LauncherWidget* launcherwidget = qobject_cast<LauncherWidget*>(sender());
kRunUrl(launcherwidget->data(), m_launcherapplet); kRunUrl(launcherwidget->data(), b_launcherapplet);
} }
void LauncherRecent::slotTriggered() void LauncherRecent::slotTriggered()
@ -1480,7 +1487,7 @@ void LauncherRecent::slotTriggered()
} }
class LauncherLeave : public QGraphicsWidget class LauncherLeave : public LauncherWidgetBase
{ {
Q_OBJECT Q_OBJECT
public: public:
@ -1497,10 +1504,6 @@ private Q_SLOTS:
void slotDelayedShutdown(); void slotDelayedShutdown();
private: private:
QMutex m_mutex;
LauncherApplet* m_launcherapplet;
QGraphicsLinearLayout* m_layout;
QList<LauncherWidget*> m_launcherwidgets;
Plasma::Separator* m_systemseparator; Plasma::Separator* m_systemseparator;
QTimer* m_timer; QTimer* m_timer;
bool m_canswitch; bool m_canswitch;
@ -1512,8 +1515,7 @@ private:
}; };
LauncherLeave::LauncherLeave(QGraphicsWidget *parent, LauncherApplet *launcherapplet) LauncherLeave::LauncherLeave(QGraphicsWidget *parent, LauncherApplet *launcherapplet)
: QGraphicsWidget(parent), : LauncherWidgetBase(parent, launcherapplet),
m_launcherapplet(launcherapplet),
m_systemseparator(nullptr), m_systemseparator(nullptr),
m_timer(nullptr), m_timer(nullptr),
m_canswitch(false), m_canswitch(false),
@ -1522,10 +1524,6 @@ LauncherLeave::LauncherLeave(QGraphicsWidget *parent, LauncherApplet *launcherap
m_shutdowntype(KWorkSpace::ShutdownTypeNone), m_shutdowntype(KWorkSpace::ShutdownTypeNone),
m_sleepstate(Solid::PowerManagement::SuspendState) m_sleepstate(Solid::PowerManagement::SuspendState)
{ {
setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
m_layout = new QGraphicsLinearLayout(Qt::Vertical, this);
setLayout(m_layout);
m_timer = new QTimer(this); m_timer = new QTimer(this);
m_timer->setInterval(s_polltimeout); m_timer->setInterval(s_polltimeout);
connect( connect(
@ -1542,15 +1540,11 @@ LauncherLeave::LauncherLeave(QGraphicsWidget *parent, LauncherApplet *launcherap
void LauncherLeave::slotUpdateLayout() void LauncherLeave::slotUpdateLayout()
{ {
QMutexLocker locker(&m_mutex); QMutexLocker locker(&b_mutex);
foreach (LauncherWidget* launcherwidget, m_launcherwidgets) { clearLauncherWidgets();
m_layout->removeItem(launcherwidget);
}
qDeleteAll(m_launcherwidgets);
m_launcherwidgets.clear();
if (m_systemseparator) { if (m_systemseparator) {
m_layout->removeItem(m_systemseparator); b_layout->removeItem(m_systemseparator);
delete m_systemseparator; delete m_systemseparator;
m_systemseparator = nullptr; m_systemseparator = nullptr;
} }
@ -1565,8 +1559,8 @@ void LauncherLeave::slotUpdateLayout()
iconsize, KIcon("system-switch-user"), i18n("Switch user"), i18n("Start a parallel session as a different user") iconsize, KIcon("system-switch-user"), i18n("Switch user"), i18n("Start a parallel session as a different user")
); );
launcherwidget->setData("switch"); launcherwidget->setData("switch");
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotActivated()) this, SLOT(slotActivated())
@ -1576,7 +1570,7 @@ void LauncherLeave::slotUpdateLayout()
if (hassessionicon) { if (hassessionicon) {
m_systemseparator = new Plasma::Separator(this); m_systemseparator = new Plasma::Separator(this);
m_systemseparator->setOrientation(Qt::Horizontal); m_systemseparator->setOrientation(Qt::Horizontal);
m_layout->addItem(m_systemseparator); b_layout->addItem(m_systemseparator);
} }
const QSet<Solid::PowerManagement::SleepState> sleepsates = Solid::PowerManagement::supportedSleepStates(); const QSet<Solid::PowerManagement::SleepState> sleepsates = Solid::PowerManagement::supportedSleepStates();
@ -1586,8 +1580,8 @@ void LauncherLeave::slotUpdateLayout()
iconsize, KIcon("system-suspend"), i18n("Sleep"), i18n("Suspend to RAM") iconsize, KIcon("system-suspend"), i18n("Sleep"), i18n("Suspend to RAM")
); );
launcherwidget->setData("suspendram"); launcherwidget->setData("suspendram");
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotActivated()) this, SLOT(slotActivated())
@ -1599,8 +1593,8 @@ void LauncherLeave::slotUpdateLayout()
iconsize, KIcon("system-suspend-hibernate"), i18n("Hibernate"), i18n("Suspend to disk") iconsize, KIcon("system-suspend-hibernate"), i18n("Hibernate"), i18n("Suspend to disk")
); );
launcherwidget->setData("suspenddisk"); launcherwidget->setData("suspenddisk");
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotActivated()) this, SLOT(slotActivated())
@ -1612,8 +1606,8 @@ void LauncherLeave::slotUpdateLayout()
iconsize, KIcon("system-suspend"), i18n("Hybrid Suspend"), i18n("Hybrid Suspend") iconsize, KIcon("system-suspend"), i18n("Hybrid Suspend"), i18n("Hybrid Suspend")
); );
launcherwidget->setData("suspendhybrid"); launcherwidget->setData("suspendhybrid");
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotActivated()) this, SLOT(slotActivated())
@ -1626,8 +1620,8 @@ void LauncherLeave::slotUpdateLayout()
iconsize, KIcon("system-reboot"), i18nc("Restart computer", "Restart"), i18n("Restart computer") iconsize, KIcon("system-reboot"), i18nc("Restart computer", "Restart"), i18n("Restart computer")
); );
launcherwidget->setData("restart"); launcherwidget->setData("restart");
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotActivated()) this, SLOT(slotActivated())
@ -1639,8 +1633,8 @@ void LauncherLeave::slotUpdateLayout()
iconsize, KIcon("system-shutdown"), i18n("Shut down"), i18n("Turn off computer") iconsize, KIcon("system-shutdown"), i18n("Shut down"), i18n("Turn off computer")
); );
launcherwidget->setData("shutdown"); launcherwidget->setData("shutdown");
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotActivated()) this, SLOT(slotActivated())
@ -1651,19 +1645,22 @@ void LauncherLeave::slotUpdateLayout()
iconsize, KIcon("system-log-out"), i18n("Log out"), i18n("End session") iconsize, KIcon("system-log-out"), i18n("Log out"), i18n("End session")
); );
launcherwidget->setData("logout"); launcherwidget->setData("logout");
m_launcherwidgets.append(launcherwidget); b_launcherwidgets.append(launcherwidget);
m_layout->addItem(launcherwidget); b_layout->addItem(launcherwidget);
connect( connect(
launcherwidget, SIGNAL(activated()), launcherwidget, SIGNAL(activated()),
this, SLOT(slotActivated()) this, SLOT(slotActivated())
); );
locker.unlock();
checkUnderMouse();
} }
void LauncherLeave::slotActivated() void LauncherLeave::slotActivated()
{ {
LauncherWidget* launcherwidget = qobject_cast<LauncherWidget*>(sender()); LauncherWidget* launcherwidget = qobject_cast<LauncherWidget*>(sender());
const QString launcherwidgetdata = launcherwidget->data(); const QString launcherwidgetdata = launcherwidget->data();
m_launcherapplet->resetState(); b_launcherapplet->resetState();
if (launcherwidgetdata == QLatin1String("switch")) { if (launcherwidgetdata == QLatin1String("switch")) {
QTimer::singleShot(s_launcherdelay, this, SLOT(slotDelayedSwitch())); QTimer::singleShot(s_launcherdelay, this, SLOT(slotDelayedSwitch()));
} else if (launcherwidgetdata == QLatin1String("suspendram")) { } else if (launcherwidgetdata == QLatin1String("suspendram")) {
@ -1736,7 +1733,6 @@ public Q_SLOTS:
private Q_SLOTS: private Q_SLOTS:
void slotSearch(const QString &text); void slotSearch(const QString &text);
void slotActivated();
void slotUserTimeout(); void slotUserTimeout();
void slotSearchTimeout(); void slotSearchTimeout();
void slotQueryFinished(); void slotQueryFinished();
@ -1748,7 +1744,6 @@ private:
Plasma::IconWidget* m_iconwidget; Plasma::IconWidget* m_iconwidget;
Plasma::Label* m_label; Plasma::Label* m_label;
Plasma::LineEdit* m_lineedit; Plasma::LineEdit* m_lineedit;
Plasma::IconWidget* m_helpiconwidget;
Plasma::TabBar* m_tabbar; Plasma::TabBar* m_tabbar;
Plasma::ScrollWidget* m_favoritesscrollwidget; Plasma::ScrollWidget* m_favoritesscrollwidget;
LauncherFavorites* m_favoriteswidget; LauncherFavorites* m_favoriteswidget;
@ -1759,8 +1754,6 @@ private:
LauncherLeave* m_leavewidget; LauncherLeave* m_leavewidget;
Plasma::ScrollWidget* m_searchscrollwidget; Plasma::ScrollWidget* m_searchscrollwidget;
LauncherSearch* m_searchwidget; LauncherSearch* m_searchwidget;
Plasma::ScrollWidget* m_searchhelpscrollwidget;
LauncherSearchHelp* m_searchhelpwidget;
KUser* m_user; KUser* m_user;
QTimer* m_usertimer; QTimer* m_usertimer;
QTimer* m_searchtimer; QTimer* m_searchtimer;
@ -1774,7 +1767,6 @@ LauncherAppletWidget::LauncherAppletWidget(LauncherApplet* auncherapplet)
m_iconwidget(nullptr), m_iconwidget(nullptr),
m_label(nullptr), m_label(nullptr),
m_lineedit(nullptr), m_lineedit(nullptr),
m_helpiconwidget(nullptr),
m_tabbar(nullptr), m_tabbar(nullptr),
m_favoritesscrollwidget(nullptr), m_favoritesscrollwidget(nullptr),
m_favoriteswidget(nullptr), m_favoriteswidget(nullptr),
@ -1785,8 +1777,6 @@ LauncherAppletWidget::LauncherAppletWidget(LauncherApplet* auncherapplet)
m_leavewidget(nullptr), m_leavewidget(nullptr),
m_searchscrollwidget(nullptr), m_searchscrollwidget(nullptr),
m_searchwidget(nullptr), m_searchwidget(nullptr),
m_searchhelpscrollwidget(nullptr),
m_searchhelpwidget(nullptr),
m_user(nullptr), m_user(nullptr),
m_usertimer(nullptr), m_usertimer(nullptr),
m_searchtimer(nullptr) m_searchtimer(nullptr)
@ -1819,18 +1809,6 @@ LauncherAppletWidget::LauncherAppletWidget(LauncherApplet* auncherapplet)
m_toplayout->setAlignment(m_lineedit, Qt::AlignCenter); m_toplayout->setAlignment(m_lineedit, Qt::AlignCenter);
setFocusProxy(m_lineedit); setFocusProxy(m_lineedit);
m_helpiconwidget = new Plasma::IconWidget(this);
m_helpiconwidget->setAcceptHoverEvents(false);
m_helpiconwidget->setAcceptedMouseButtons(Qt::NoButton);
m_helpiconwidget->setIcon("help-contextual");
// TODO: enable once implemented
m_helpiconwidget->setVisible(false);
connect(
m_helpiconwidget, SIGNAL(activated()),
this, SLOT(slotActivated())
);
m_toplayout->addItem(m_helpiconwidget);
m_tabbar = new Plasma::TabBar(this); m_tabbar = new Plasma::TabBar(this);
m_favoritesscrollwidget = kMakeScrollWidget(m_tabbar); m_favoritesscrollwidget = kMakeScrollWidget(m_tabbar);
m_favoritesscrollwidget->setMinimumSize(s_minimumsize); m_favoritesscrollwidget->setMinimumSize(s_minimumsize);
@ -1869,13 +1847,6 @@ LauncherAppletWidget::LauncherAppletWidget(LauncherApplet* auncherapplet)
this, SLOT(slotSearch(QString)) this, SLOT(slotSearch(QString))
); );
m_searchhelpscrollwidget = kMakeScrollWidget(this);
m_searchhelpscrollwidget->setMinimumSize(s_minimumsize);
m_searchhelpscrollwidget->setVisible(false);
m_searchhelpwidget = new LauncherSearchHelp(m_searchhelpscrollwidget, m_launcherapplet);
m_searchhelpscrollwidget->setWidget(m_searchhelpwidget);
m_layout->addItem(m_searchhelpscrollwidget);
m_usertimer = new QTimer(this); m_usertimer = new QTimer(this);
m_usertimer->setInterval(s_polltimeout); m_usertimer->setInterval(s_polltimeout);
connect( connect(
@ -1938,11 +1909,6 @@ void LauncherAppletWidget::slotSearch(const QString &text)
m_searchtimer->start(); m_searchtimer->start();
} }
void LauncherAppletWidget::slotActivated()
{
m_searchhelpscrollwidget->setVisible(!m_searchhelpscrollwidget->isVisible());
}
void LauncherAppletWidget::slotUserTimeout() void LauncherAppletWidget::slotUserTimeout()
{ {
const QString hostname = QHostInfo::localHostName(); const QString hostname = QHostInfo::localHostName();