aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/lumina-desktop/desktop-plugins/applauncher/AppLauncherPlugin.h
blob: 6cff4bf73410158244eb75112230515ece9563fd (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
//===========================================
//  Lumina-DE source code
//  Copyright (c) 2014-2017, Ken Moore
//  Available under the 3-clause BSD license
//  See the LICENSE file for full details
//===========================================
//  This class is a quick sample desktop plugin
//===========================================
#ifndef _LUMINA_DESKTOP_DESKTOP_PLUGIN_APPLICATION_LAUNCHER_H
#define _LUMINA_DESKTOP_DESKTOP_PLUGIN_APPLICATION_LAUNCHER_H

#include <QToolButton>
#include <QInputDialog>
#include <QVBoxLayout>
#include <QProcess>
#include <QFile>
#include <QFileSystemWatcher>
#include <QTimer>
#include <QMenu>
#include <QCursor>
#include <QDrag>
#include <QMimeData>
#include <QtConcurrent>

#include "../LDPlugin.h"

#include <LuminaXDG.h>

class AppLauncherPlugin : public LDPlugin{
	Q_OBJECT
public:
	AppLauncherPlugin(QWidget* parent, QString ID);
	~AppLauncherPlugin(){}

	void Cleanup(); //special function for final cleanup

private:
	QToolButton *button;
	QFileSystemWatcher *watcher;
	//QMenu *menu;
	QInputDialog *inputDLG;
	QString iconID;
	int icosize;
	QPoint dragstartpos;

private slots:
	void loadButton();
	void buttonClicked(bool openwith = false);
	void iconLoaded(QString);

	//void openContextMenu();

	//void increaseIconSize();
	//void decreaseIconSize();
	//void deleteFile();

	void actionTriggered(QAction *act);
	void openWith();
	void fileProperties();
	void fileDelete();
	void fileCut();
	void fileCopy();
	void fileRename();
	void renameFinished(int result);

	void fileDrop(bool copy, QList<QUrl> urls);

public slots:
	void LocaleChange(){
	  loadButton(); //force reload
	}

protected:
	void resizeEvent(QResizeEvent *ev){
	  LDPlugin::resizeEvent(ev);
	  QTimer::singleShot(100, this, SLOT(loadButton()) );
	}
	void changeEvent(QEvent *ev){
	  LDPlugin::changeEvent(ev);
	  QEvent::Type tmp = ev->type();
	  if(tmp == QEvent::StyleChange || tmp==QEvent::ThemeChange || tmp==QEvent::LanguageChange || tmp==QEvent::LocaleChange){ loadButton(); }
	}

	void mousePressEvent(QMouseEvent *ev){
	  if(ev->button()==Qt::LeftButton){
	    dragstartpos = ev->pos();
	  }
	}

	void mouseMoveEvent(QMouseEvent *ev){
	  if( (ev->buttons() & Qt::LeftButton) ){
	    if((ev->pos() - dragstartpos).manhattanLength() > (this->width()/4) ){
	      //Start the drag event for this file
	      QDrag *drag = new QDrag(this);
	      QMimeData *md = new QMimeData;
	        md->setUrls( QList<QUrl>() << QUrl::fromLocalFile(button->whatsThis()) );
	        drag->setMimeData(md);
	      //Now perform the drag and react appropriately
	      Qt::DropAction dropAction = drag->exec(Qt::CopyAction | Qt::MoveAction);
	      if(dropAction == Qt::MoveAction){
	        // File Moved, remove it from here
	        //qDebug() << "File Moved:" << button->whatsThis();
	        //DO NOT DELETE FILES - return code often is wrong (browser drops for instance)
	      }
	    }
	  }else{
	    LDPlugin::mouseMoveEvent(ev);
	  }
	}

	void dragEnterEvent(QDragEnterEvent *ev){
	  if(ev->mimeData()->hasUrls() && this->acceptDrops()){ ev->acceptProposedAction(); }
	}

	void dropEvent(QDropEvent *ev){
	  QList<QUrl> urls = ev->mimeData()->urls();
	  bool ok = !urls.isEmpty() && this->acceptDrops();
	  if(ok){
	    if(ev->proposedAction() == Qt::MoveAction){
	      ev->setDropAction(Qt::MoveAction);
	      QtConcurrent::run(this, &AppLauncherPlugin::fileDrop, false, urls);
	    }else if(ev->proposedAction() == Qt::CopyAction){
	      ev->setDropAction(Qt::CopyAction);
	      QtConcurrent::run(this, &AppLauncherPlugin::fileDrop, true, urls);
	    }else{ ok = false; }
	  }
	  if(ok){ ev->acceptProposedAction(); }
	}
};
#endif
bgstack15