aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.h
diff options
context:
space:
mode:
Diffstat (limited to 'src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.h')
-rw-r--r--src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.h303
1 files changed, 0 insertions, 303 deletions
diff --git a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.h b/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.h
deleted file mode 100644
index abc34878..00000000
--- a/src-qt5/core/lumina-desktop-unified/src-DE/LDesktopPluginSpace.h
+++ /dev/null
@@ -1,303 +0,0 @@
-//===========================================
-// Lumina-DE source code
-// Copyright (c) 2015, Ken Moore
-// Available under the 3-clause BSD license
-// See the LICENSE file for full details
-//===========================================
-#ifndef _LUMINA_DESKTOP_LDESKTOP_PLUGIN_SPACE_H
-#define _LUMINA_DESKTOP_LDESKTOP_PLUGIN_SPACE_H
-
-#include <QListWidget>
-#include <QDropEvent>
-#include <QDrag> //includes all the QDrag*Event classes
-#include <QUrl>
-#include <QMimeData>
-#include <QSettings>
-#include <QDebug>
-#include <QFile>
-#include <QDir>
-#include <QFileInfo>
-#include <QProcess>
-
-#include "desktop-plugins/LDPlugin.h"
-
-#define MIMETYPE QString("x-special/lumina-desktop-plugin")
-
-class LDesktopPluginSpace : public QWidget{
- Q_OBJECT
-
-signals:
- void PluginRemovedByUser(QString ID);
- void IncreaseIcons(); //increase default icon sizes
- void DecreaseIcons(); //decrease default icon sizes
- void HideDesktopMenu();
-
-public:
- LDesktopPluginSpace();
- ~LDesktopPluginSpace();
-
- void LoadItems(QStringList plugs, QStringList files);
- //void setShowGrid(bool show); This is already implemented in QTableView (inherited)
- void SetIconSize(int size);
- void ArrangeTopToBottom(bool ttb); //if false, will arrange left->right
- void cleanup();
-
- void setBackground(QPixmap pix); //should already be sized appropriately for this widget
- void setDesktopArea(QRect area);
-
-public slots:
- void UpdateGeom(int oldgrid = -1);
-
-private:
- QSettings *plugsettings;
- QStringList plugins, deskitems;
- QList<LDPlugin*> ITEMS;
- QPixmap wallpaper;
- QRect desktopRect;
- bool TopToBottom;
- float GRIDSIZE;
-
- int RoundUp(double num){
- int out = num; //This will truncate the number
- if(out < num){ out++; } //need to increase by 1
- return out;
- }
-
- void addDesktopItem(QString filepath); //This will convert it into a valid Plugin ID automatically
- void addDesktopPlugin(QString plugID);
-
-
- QRect findOpenSpot(int gridwidth = 1, int gridheight = 1, int startRow = 0, int startCol = 0, bool reversed = false, QString plugID = "");
- QRect findOpenSpot(QRect grid, QString plugID, bool recursive = false);
-
- QPoint posToGrid(QPoint pos){
- //This assumes a point in widget-relative coordinates
- pos.setX( RoundUp(pos.x()/GRIDSIZE));
- pos.setY( RoundUp(pos.y()/GRIDSIZE));
- return pos;
- }
-
- QRect geomToGrid(QRect geom, int grid = -1){
- if(grid<0){
- //use the current grid size
- return QRect( RoundUp(geom.x()/GRIDSIZE), RoundUp(geom.y()/GRIDSIZE), \
- RoundUp(geom.width()/GRIDSIZE), RoundUp(geom.height()/GRIDSIZE) );
- }else{
- //use the input grid size
- return QRect( RoundUp(geom.x()/((double) grid)), RoundUp(geom.y()/((double) grid)), \
- RoundUp(geom.width()/((double) grid)), RoundUp(geom.height()/((double) grid)) );
- }
- }
-
- QRect gridToGeom(QRect grid){
- //This function incorporates the bottom/right edge matchins procedures (for incomplete last grid)
- QRect geom(grid.x()*GRIDSIZE, grid.y()*GRIDSIZE, grid.width()*GRIDSIZE, grid.height()*GRIDSIZE);
- //Now check the edge conditions (last right/bottom grid points might be smaller than GRIDSIZE)
- QSize areaSize = desktopRect.size(); //use the size of the area instead of the geometry - because we need this in child coordinates like "geom" above
- //qDebug() << "GridToGeom:" << grid << geom << "Area size:" << areaSize;
- if(geom.right() > areaSize.width() && (geom.right()-areaSize.width())<GRIDSIZE ){
- geom.setRight(areaSize.width()-1); //match up with the edge
- }
- if(geom.bottom() > areaSize.height() && (geom.bottom() -areaSize.height())<GRIDSIZE ){
- geom.setBottom(areaSize.height()-1); //match up with the edge
- }
- //qDebug() << " - Adjusted:" << geom;
- return geom;
- }
-
- //Internal simplification for setting up a drag event
- void setupDrag(QString id, QString type){
- QMimeData *mime = new QMimeData;
- mime->setData(MIMETYPE, QString(type+"::::"+id).toLocal8Bit() );
- //If this is a desktop file - also add it to the generic URI list mimetype
- if(id.startsWith("applauncher::")){
- QList<QUrl> urilist;
- urilist << QUrl::fromLocalFile( id.section("---",0,0).section("::",1,50) );
- mime->setUrls(urilist);
- }
- //Create the drag structure
- QDrag *drag = new QDrag(this);
- drag->setMimeData(mime);
- drag->exec(Qt::CopyAction);
- }
-
- bool ValidGrid(QRect grid){
- //qDebug() << "Check Valid Grid:" << grid << RoundUp(this->width()/GRIDSIZE) << RoundUp(this->height()/GRIDSIZE);
- //This just checks that the grid coordinates are not out of bounds - should still run ValidGeometry() below with the actual pixel geom
- if(grid.x()<0 || grid.y()<0 || grid.width()<0 || grid.height()<0){ return false; }
- else if( (grid.x()+grid.width()) > RoundUp(desktopRect.width()/GRIDSIZE) ){ return false; }
- else if( (grid.y()+grid.height()) > RoundUp(desktopRect.height()/GRIDSIZE) ){ return false; }
- return true;
- }
-
- bool ValidGeometry(QString id, QRect geom){
- //First check that it is within the desktop area completely
- // Note that "this->geometry()" is not in the same coordinate space as the geometry inputs
- if(!QRect(0,0,desktopRect.width(), desktopRect.height()).contains(geom)){ return false; }
- //Now check that it does not collide with any other items
- for(int i=0; i<ITEMS.length(); i++){
- if(ITEMS[i]->whatsThis()==id){ continue; }
- else if(geom.intersects(ITEMS[i]->geometry())){ return false; }
- }
- return true;
- }
-
- LDPlugin* ItemFromID(QString ID){
- for(int i=0; i<ITEMS.length(); i++){
- if(ITEMS[i]->whatsThis()==ID){ return ITEMS[i]; }
- }
- return 0;
- }
-
- void MovePlugin(LDPlugin* plug, QRect geom){
- plug->setGeometry( geom );
- plug->setFixedSize(geom.size()); //needed for some plugins
- plug->savePluginGeometry(geom);
- }
-
-private slots:
- void reloadPlugins(bool ForceIconUpdate = false);
-
- void StartItemMove(QString ID){
- setupDrag(ID, "move");
- }
- void StartItemResize(QString ID){
- setupDrag(ID, "resize");
- }
- void RemoveItem(QString ID){
- //Special case - desktop file/dir link using the "applauncher" plugin
- if(ID.startsWith("applauncher::")){
- QFileInfo info(ID.section("---",0,0).section("::",1,50) );
- if(info.exists() && info.absolutePath()==QDir::homePath()+"/Desktop"){
- qDebug() << "Deleting Desktop Item:" << info.absoluteFilePath();
- if(!info.isSymLink() && info.isDir()){ QProcess::startDetached("rm -r \""+info.absoluteFilePath()+"\""); }
- else{ QFile::remove(info.absoluteFilePath()); } //just remove the file/symlink directly
- emit PluginRemovedByUser(ID);
- return;
- }
- }
- //Any other type of plugin
- for(int i=0; i<ITEMS.length(); i++){
- if(ITEMS[i]->whatsThis()==ID){
- ITEMS[i]->Cleanup();
- ITEMS.takeAt(i)->deleteLater();
- break;
- }
- }
- emit PluginRemovedByUser(ID);
- }
-
-protected:
- void focusInEvent(QFocusEvent *ev){
- this->lower(); //make sure we stay on the bottom of the window stack
- QWidget::focusInEvent(ev); //do normal handling
- }
- void paintEvent(QPaintEvent*ev);
-
- //Need Drag and Drop functionality (internal movement)
- void dragEnterEvent(QDragEnterEvent *ev){
- if(ev->mimeData()->hasFormat(MIMETYPE) ){
- ev->acceptProposedAction(); //allow this to be dropped here
- }else if(ev->mimeData()->hasUrls()){
- ev->acceptProposedAction(); //allow this to be dropped here
- }else{
- ev->ignore();
- }
- }
-
- void dragMoveEvent(QDragMoveEvent *ev){
- if(ev->mimeData()->hasFormat(MIMETYPE) ){
- //Internal move/resize - Check for validity
- QString act = QString( ev->mimeData()->data(MIMETYPE) );
- LDPlugin *item = ItemFromID(act.section("::::",1,50));
- //qDebug() << "Internal Move Event:" << act << ev->pos();
- if(item!=0){
- QRect geom = item->geometry();
- QPoint grid = posToGrid(ev->pos());
- if(act.section("::::",0,0)=="move"){
- QPoint diff = grid - posToGrid(geom.center()); //difference in grid coords
- //qDebug() << "Move Event:" << "Diff:" << diff << "Geom:" << geom << grid << ev->pos();
- geom = geomToGrid(geom); //convert to grid coords
- //qDebug() << "Move Event:" << "Old geom (grid):" << geom;
- geom.moveTo( (geom.topLeft()+diff) );
- //qDebug() << " - After Move:" << geom;
- bool valid = ValidGrid(geom);
- if(valid){
- //Convert to pixel coordinates and check validity again
- geom = gridToGeom(geom); //convert back to px coords with edge matching
- valid = ValidGeometry(act.section("::::",1,50), geom);
- }
- if(valid){
- MovePlugin(item, geom);
- //item->setGeometry(geom);
- //item->setFixedSize(geom.size()); //needed due to resizing limitations and such for some plugins
- ev->acceptProposedAction();
- //item->savePluginGeometry(geom); //save in pixel coords
- }else{ ev->ignore(); } //invalid location
-
- }else{
- //Resize operation
- QPoint diff = ev->pos() - (geom.center()-QPoint(1,1)); //need difference from center (pixels)
- //Note: Use the 1x1 pixel offset to ensure that the center point is not exactly on a grid point intersection (2x2, 4x4, etc)
- //qDebug() << "Resize Plugin:" << geom << grid << posToGrid(geom.center()) << diff;
- geom = geomToGrid(geom); //convert to grid coordinates now
- //qDebug() << " - Grid Geom:" << geom;
- if(diff.x()<0){ geom.setLeft(ev->pos().x()/GRIDSIZE); } //expanding to the left (round down)
- else if(diff.x()>0){ geom.setRight( ev->pos().x()/GRIDSIZE); } //expanding to the right (round down)
- if(diff.y()<0){ geom.setTop( ev->pos().y()/GRIDSIZE); } //expanding above (round down)
- else if(diff.y()>0){ geom.setBottom( ev->pos().y()/GRIDSIZE); } //expanding below (round down)
- //qDebug() << " - Adjusted:" << geom;
- bool valid = ValidGrid(geom);
- if(valid){
- //Convert to pixel coordinates and check validity again
- geom = gridToGeom(geom); //convert back to px coords with edge matching
- valid = ValidGeometry(act.section("::::",1,50), geom);
- }
- if(valid){
- MovePlugin(item, geom);
- //item->setGeometry(geom);
- //item->setFixedSize(geom.size()); //needed due to resizing limitations and such for some plugins
- ev->acceptProposedAction();
- //item->savePluginGeometry(geom); //save in pixel coords
- }else{ ev->ignore(); } //invalid location
- }
- }
- }else if(ev->mimeData()->hasUrls()){
- ev->acceptProposedAction(); //allow this to be dropped here
- }else{
- ev->ignore();
- }
- }
-
- void dropEvent(QDropEvent *ev){
- //QPoint grid = posToGrid(ev->pos());
- if(ev->mimeData()->hasFormat(MIMETYPE)){
- //Desktop Items getting moved around - already performed in the dragMoveEvent
- ev->accept();
- }else if(ev->mimeData()->hasUrls()){
- ev->accept();
- //Files getting dropped here
- QList<QUrl> urls = ev->mimeData()->urls();
- qDebug() << "Desktop Drop Event:" << urls;
- for(int i=0; i<urls.length(); i++){
- //If this file is not in the desktop folder, move/copy it here
- if(urls[i].isLocalFile()){
- QFileInfo info(urls[i].toLocalFile());
- if(info.exists() && !QFile::exists(QDir::homePath()+"/Desktop/"+info.fileName())){
- //Make a link to the file here
- QFile::link(info.absoluteFilePath(), QDir::homePath()+"/Desktop/"+info.fileName());
- }else{
- qWarning() << "Invalid desktop file drop (ignored):" << urls[i].toString();
- }
- }
-
- }
- }else{
- //Ignore this event
- ev->ignore();
- }
- }
-
-};
-
-#endif
bgstack15