1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
|
//===========================================
// Lumina-DE source code
// Copyright (c) 2015, Ken Moore
// Available under the 3-clause BSD license
// See the LICENSE file for full details
//===========================================
#include "LStartButton.h"
#include "../../LSession.h"
#include <LuminaXDG.h>
#include <LUtils.h> //This contains the "ResizeMenu" class
//#include <LIconCache.h>
//extern LIconCache *ICONS;
LStartButtonPlugin::LStartButtonPlugin(QWidget *parent, QString id, bool horizontal) : LPPlugin(parent, id, horizontal){
button = new QToolButton(this);
button->setAutoRaise(true);
button->setToolButtonStyle(Qt::ToolButtonIconOnly);
button->setPopupMode(QToolButton::DelayedPopup); //make sure it runs the update routine first
connect(button, SIGNAL(clicked()), this, SLOT(openMenu()));
this->layout()->setContentsMargins(0,0,0,0);
this->layout()->addWidget(button);
menu = new ResizeMenu(this);
menu->setContentsMargins(1,1,1,1);
connect(menu, SIGNAL(aboutToHide()), this, SIGNAL(MenuClosed()));
connect(menu, SIGNAL(MenuResized(QSize)), this, SLOT(SaveMenuSize(QSize)) );
startmenu = new StartMenu(this);
connect(startmenu, SIGNAL(CloseMenu()), this, SLOT(closeMenu()) );
connect(startmenu, SIGNAL(UpdateQuickLaunch(QStringList)), this, SLOT(updateQuickLaunch(QStringList)));
QRect screenSize = QApplication::desktop()->availableGeometry(this);
QSize saved = LSession::handle()->DesktopPluginSettings()->value("panelPlugs/"+this->type()+"/MenuSize",QSize(this->fontMetrics().horizontalAdvance("x")*30 ,screenSize.height()/1.8)).toSize();
//qDebug() << "Got Start Menu Saved Size:" << saved;
if(!saved.isNull() && saved.isValid()){ startmenu->setFixedSize(saved); } //re-load the previously saved value
menu->setContents(startmenu);
button->setMenu(menu);
connect(menu, SIGNAL(aboutToHide()), this, SLOT(updateButtonVisuals()) );
QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes
QTimer::singleShot(0, startmenu, SLOT(ReLoadQuickLaunch()) );
//Setup the global shortcut handling for opening the start menu
connect(QApplication::instance(), SIGNAL(StartButtonActivated()), this, SLOT(shortcutActivated()) );
LSession::handle()->registerStartButton(this->type());
}
LStartButtonPlugin::~LStartButtonPlugin(){
LSession::handle()->unregisterStartButton(this->type());
}
void LStartButtonPlugin::updateButtonVisuals(){
button->setToolTip(tr(""));
button->setText( SYSTEM::user() );
button->setIcon( LXDG::findIcon("start-here-lumina","Lumina-DE") ); //force icon refresh
}
void LStartButtonPlugin::updateQuickLaunch(QStringList apps){
//First clear any obsolete apps
QStringList old;
//qDebug() << "Update QuickLaunch Buttons";
for(int i=0; i<QUICKL.length(); i++){
if( !apps.contains(QUICKL[i]->whatsThis()) ){
//App was removed
QUICKL.takeAt(i)->deleteLater();
i--;
}else{
//App still listed - update the button
old << QUICKL[i]->whatsThis(); //add the list of current buttons
LFileInfo info(QUICKL[i]->whatsThis());
QUICKL[i]->setIcon( info.icon() );
if(info.isDesktopFile()){ QUICKL[i]->setToolTip( info.XDG()->name ); }
else{ QUICKL[i]->setToolTip( info.fileName() ); }
}
}
//Now go through and create any new buttons
for(int i=0; i<apps.length(); i++){
if( !old.contains(apps[i]) ){
//New App
LQuickLaunchButton *tmp = new LQuickLaunchButton(apps[i], this);
QUICKL << tmp;
LFileInfo info(apps[i]);
tmp->setIcon( info.icon() );
if(info.isDesktopFile()){ tmp->setToolTip( info.XDG()->name ); }
else{ tmp->setToolTip( info.fileName() ); }
//Now add the button to the layout and connect the signal/slots
this->layout()->insertWidget(i+1,tmp); //"button" is always in slot 0
connect(tmp, SIGNAL(Launch(QString)), this, SLOT(LaunchQuick(QString)) );
connect(tmp, SIGNAL(Remove(QString)), this, SLOT(RemoveQuick(QString)) );
}
}
//qDebug() << " - Done updateing QuickLaunch Buttons";
QTimer::singleShot(0,this, SLOT(OrientationChange())); //Update icons/sizes
}
void LStartButtonPlugin::LaunchQuick(QString file){
//Need to get which button was clicked
//qDebug() << "Quick Launch triggered:" << file;
if(!file.isEmpty()){
LSession::LaunchApplication("lumina-open \""+file+"\"");
emit MenuClosed();
}
}
void LStartButtonPlugin::RemoveQuick(QString file){
//qDebug() << "Remove Quicklaunch Button:" << file;
if(!file.isEmpty()){
startmenu->UpdateQuickLaunch(file, false); //always a removal
emit MenuClosed();
}
}
void LStartButtonPlugin::SaveMenuSize(QSize sz){
//Save this size for the menu
LSession::handle()->DesktopPluginSettings()->setValue("panelPlugs/"+this->type()+"/MenuSize", sz);
}
// ========================
// PRIVATE FUNCTIONS
// ========================
void LStartButtonPlugin::openMenu(){
if(menu->isVisible()){ return; } //don't re-show it - already open
//TESTING CODE TO SEE IF THIS MAKES IT RECOVER MEMORY
/*StartMenu *old = startmenu;
startmenu = new StartMenu(this);
connect(startmenu, SIGNAL(CloseMenu()), this, SLOT(closeMenu()) );
connect(startmenu, SIGNAL(UpdateQuickLaunch(QStringList)), this, SLOT(updateQuickLaunch(QStringList)));
menu->setContents(startmenu);
if(old!=0){ old->deleteLater(); }*/
//--------
//qDebug() << "Menu Size:" << startmenu->size();
startmenu->activateWindow();
startmenu->UpdateMenu();
button->showMenu();
}
void LStartButtonPlugin::closeMenu(){
menu->hide();
}
void LStartButtonPlugin::shortcutActivated(){
if(LSession::handle()->registerStartButton(this->type())){
if(menu->isVisible()){ closeMenu(); }
else{ this->activateWindow(); openMenu(); }
}
}
|