aboutsummaryrefslogtreecommitdiff
path: root/lumina-desktop/desktop-plugins/LDPluginContainer.h
blob: e7388a800e0ec5254a46f56619b6eff58b9b52a4 (plain)
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
//===========================================
//  Lumina-DE source code
//  Copyright (c) 2014, Ken Moore
//  Available under the 3-clause BSD license
//  See the LICENSE file for full details
//===========================================
//  This class is the generic container for a desktop plugin that handles
//    saving/restoring all the movement and sizing
//===========================================
#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_CONTAINER_H
#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_CONTAINER_H

#include <QObject>
#include <QMdiSubWindow>
#include <QApplication>
#include <QSettings>
#include <QMoveEvent>
#include <QResizeEvent>
#include <QCloseEvent>
#include <QString>
#include <QFile>
#include <QIcon>
#include <QTimer>

#include "LDPlugin.h"

class LDPluginContainer : public QMdiSubWindow{
	Q_OBJECT
	
private:
	QTimer *syncTimer;
	bool locked, setup;
	LDPlugin *PLUG;

private slots:
	void saveGeometry(){
	    if(PLUG==0){ return; }
	    //if(!locked && !setup){
	      PLUG->saveSetting("location/x", this->pos().x());
	      PLUG->saveSetting("location/y", this->pos().y());
	      PLUG->saveSetting("location/width", this->width()-4);
	      PLUG->saveSetting("location/height", this->height()-4);
	    //}
	}
	
public:
	LDPluginContainer(LDPlugin *plugin = 0, bool islocked = true) : QMdiSubWindow(){
	  locked = islocked;
	  setup=true;
	  PLUG = plugin;
	  syncTimer = new QTimer(this);
	    syncTimer->setInterval(500); //save settings 1/2 second after it is moved
	    syncTimer->setSingleShot(true); //no repeats
	    connect(syncTimer, SIGNAL(timeout()), this, SLOT(saveGeometry()) );
	  this->setWhatsThis(plugin->ID());
	  this->setContentsMargins(0,0,0,0);
	  if(!locked){
	    //this->setStyleSheet("LDPluginContainer{ border-width: 1px;}");
	    this->setWindowTitle( plugin->ID().replace("---"," - ") );
	    //this->setWidget( new QWidget() );
	    this->setWidget( plugin );
	    //this->setWindowIcon(QIcon()); //remove the Qt icon
	  }else{
	    this->setStyleSheet("LDPluginContainer{ background: transparent; border: none;}");
	    this->setWidget(plugin);
	  }
	  //qDebug() << "New Container:" << PLUG->size() << PLUG->sizeHint();
	  connect(PLUG, SIGNAL(PluginResized()), this, SLOT(loadInitialPosition()) );
	}
	
	~LDPluginContainer(){
	}
	
	void saveNewPosition(QPoint pt){
	  //generally only used while a plugin is locked and does not have an initial position
	  // This works around an issue with QMdiArea moving the new container out of alignment
	  if(PLUG==0){ return; }
	  PLUG->saveSetting("location/x",pt.x());
	  PLUG->saveSetting("location/y", pt.y());
	}
	
	bool hasFixedPosition(){
	  return (PLUG->readSetting("location/x",-12345).toInt() != -12345);
	}

public slots:
	void loadInitialSize(){
	  if(PLUG==0){ return; }
	  QSize sz(PLUG->readSetting("location/width",100).toInt(), PLUG->readSetting("location/height",100).toInt());
	  this->resize(sz);
	}
	
	void loadInitialPosition(){
	  QRect set(PLUG->readSetting("location/x",-12345).toInt(), PLUG->readSetting("location/y",-12345).toInt(), PLUG->readSetting("location/width",PLUG->size().width()).toInt() +4, PLUG->readSetting("location/height",PLUG->size().height()).toInt()+4);
	  //qDebug() << "Initial Plugin Location:" << set.x() << set.y() << set.width() << set.height();
	    if(set.height() < 10){ set.setHeight(10); } //to prevent foot-shooting
	    if(set.width() < 10){ set.setWidth(10); } //to prevent foot-shooting
	    if(set.x()!=-12345 && set.y()!=-12345){
	      //this->move(set.x(), set.y());
	      this->setGeometry(set);
	    }else{
	      qDebug() << " - Found Size:" << set;
	      this->resize(set.width(), set.height());
	      qDebug() << " - Assigning location:" << this->pos();
	      saveNewPosition(this->pos());
	    }
	  this->show();
	  QApplication::processEvents();
	  setup=false; //done with setup
	}
	

signals:
	void PluginRemoved(QString);
	
protected:
	void moveEvent(QMoveEvent *event){
	  //qDebug() << "Move Event: " << PLUG->ID() << setup;
	  //Save this location to the settings
	  if( !setup ){
	    if(syncTimer->isActive()){ syncTimer->stop(); }
	    syncTimer->start();
	    //qDebug() << "DP Move:" << event->pos().x() << event->pos().y();
	  }
	  QMdiSubWindow::moveEvent(event); //be sure to pass this event along to the container
	}
	
	void resizeEvent(QResizeEvent *event){
	  //Save this size info to the settings
	  if(!setup){
	    //qDebug() << "DP Resize:" << event->size().width() << event->size().height();
	    if(syncTimer->isActive()){ syncTimer->stop(); }
	    syncTimer->start();
	  }
	  QMdiSubWindow::resizeEvent(event); //be sure to pass this event along to the container
	}
	
	void closeEvent(QCloseEvent *event){
	  //qDebug() << "Desktop Plugin Close Event:" << this->whatsThis();
	  if( !this->whatsThis().isEmpty() && !locked){
	    //Plugin removed by the user - delete the settings file
	    locked = true; //ensure that the save settings routines don't do anything during the close
	    emit PluginRemoved( this->whatsThis() );
	  }
	  if(syncTimer->isActive()){ syncTimer->stop(); } //prevent save routine from running in a moment
	  //settings = 0; //ensure we don't touch the settings file after a close event
	  QMdiSubWindow::closeEvent(event); //continue closing this window
	}
	
};

#endif
bgstack15