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
146
147
148
149
150
151
152
153
154
155
|
//===========================================
// Lumina-DE source code
// Copyright (c) 2014-2015, Ken Moore
// Available under the 3-clause BSD license
// See the LICENSE file for full details
//===========================================
// This class is the generic container layout for all desktop plugins
// Simply subclass this when creating a new plugin to enable correct
// visibility and usage within the desktop window
//===========================================
// WARNING: Do *not* setup a custom context menu for the entire plugins area!
// This can prevent access to the general desktop context menu if
// the plugin was maximized to fill the desktop area!
//===========================================
#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_H
#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_H
#include <QObject>
#include <QFrame>
#include <QWidget>
#include <QString>
#include <QDebug>
#include <QSettings>
#include <QMoveEvent>
#include <QResizeEvent>
#include <QMouseEvent>
#include <QTimer>
#include <QMenu>
class LDPlugin : public QFrame{
Q_OBJECT
private:
QString PLUGID, prefix;
QSettings *settings;
QMenu *menu;
QTimer *dragTimer;
void setupMenu();
public:
LDPlugin(QWidget *parent = 0, QString id="unknown");
~LDPlugin(){}
QString ID(){
return PLUGID;
}
virtual QSize defaultPluginSize(){
//This needs to be re-implemented in the subclassed plugin
// The returned QSize is in grid points (typically 100 or 200 pixels square)
return QSize(1,1); //1x1 grid size
}
void savePluginGeometry(QRect geom){
settings->setValue(prefix+"geometry/desktopGridPoints", geom);
settings->sync();
}
QRect loadPluginGeometry(){
return settings->value(prefix+"geometry/desktopGridPoints", QRect()).toRect();
}
void saveSetting(QString var, QVariant val){
//qDebug() << "Saving Setting:" << prefix+var+QString(" = ")+val.toString();
settings->setValue(prefix+var, val);
settings->sync();
}
QVariant readSetting(QString var, QVariant defaultval){
return settings->value(prefix+var, defaultval);
}
virtual void Cleanup(){
//This needs to be re-implemented in the subclassed plugin
//This is where any last-minute changes are performed before a plugin is removed permanently
//Note1: This is *not* called if the plugin is being temporarily closed
//Note2: All the settings for this plugin will be automatically removed after this is finished
}
void removeSettings(bool permanent = false){ //such as when a plugin is deleted
if(permanent){ Cleanup(); }
QStringList list = settings->allKeys().filter(prefix);
for(int i=0; i<list.length(); i++){ settings->remove(list[i]); }
}
public slots:
virtual void LocaleChange(){
//This needs to be re-implemented in the subclassed plugin
//This is where all text is set/translated
setupMenu();
}
virtual void ThemeChange(){
//This needs to be re-implemented in the subclassed plugin
//This is where all the visuals are set if using Theme-dependant icons.
setupMenu();
}
void showPluginMenu(){
emit CloseDesktopMenu();
menu->popup( QCursor::pos() );
}
signals:
void OpenDesktopMenu();
void CloseDesktopMenu();
void PluginResized();
//Signals for communication with the desktop layout system (not generally used by hand)
void StartMoving(QString); //ID of plugin
void StartResizing(QString); //ID of plugin
void RemovePlugin(QString); //ID of plugin
void IncreaseIconSize(); // only used for desktop icons
void DecreaseIconSize(); // only used for desktop icons
private slots:
void slotStartMove(){
QCursor::setPos( this->mapToGlobal(QPoint(this->width()/2, this->height()/2)) );
emit StartMoving(PLUGID);
}
void slotStartResize(){
QCursor::setPos( this->mapToGlobal(QPoint(this->width()/2, this->height()/2)) );
emit StartResizing(PLUGID);
}
void slotRemovePlugin(){
removeSettings(true);
emit RemovePlugin(PLUGID);
}
protected:
void mousePressEvent(QMouseEvent *ev){
if(!dragTimer->isActive() && ev->buttons().testFlag(Qt::LeftButton) ){ dragTimer->start(); }
QWidget::mousePressEvent(ev);
}
void mouseReleaseEvent(QMouseEvent *ev){
if(dragTimer->isActive()){ dragTimer->stop(); }
QWidget::mouseReleaseEvent(ev);
}
void mouseMoveEvent(QMouseEvent *ev){
if(ev->buttons().testFlag(Qt::LeftButton)){
if(dragTimer->isActive()){ dragTimer->stop(); }
slotStartMove();
}
QWidget::mouseMoveEvent(ev);
}
void resizeEvent(QResizeEvent *ev){
emit PluginResized();
QFrame::resizeEvent(ev); //do normal processing
}
};
#endif
|