//=========================================== // Lumina-DE source code // Copyright (c) 2016, Ken Moore // Available under the 3-clause BSD license // See the LICENSE file for full details //=========================================== #include "TrayUI.h" #include <LuminaXDG.h> #include<QUuid> TrayUI::TrayUI(QObject *parent) : QSystemTrayIcon(parent){ this->setContextMenu( new QMenu() ); this->setIcon(LXDG::findIcon("Insight-FileManager","")); connect(this, SIGNAL(activated(QSystemTrayIcon::ActivationReason)), this, SLOT(TrayActivated())); } TrayUI::~TrayUI(){ this->contextMenu()->deleteLater(); } void TrayUI::StartOperation( FILEOP op, QStringList oldF, QStringList newF){ createOP(op, oldF, newF); QTimer::singleShot(1000, this, SLOT(checkJobs())); } void TrayUI::createOP( FILEOP type, QStringList oldF, QStringList newF){ OPWidget *OP = new OPWidget(); if(type==MOVE){ OP->setupOperation("move", oldF, newF); } else if(type==COPY){ OP->setupOperation("copy", oldF, newF); } else if(type==DELETE){ OP->setupOperation("delete",oldF, QStringList()); } else{ OP->deleteLater(); return; } //invalid type of operation OP->setWhatsThis( QUuid::createUuid().toString() ); this->contextMenu()->addAction(OP->widgetAction()); OPS << OP; connect(OP, SIGNAL(starting(QString)), this, SLOT(OperationStarted(QString)) ); connect(OP, SIGNAL(finished(QString)), this, SLOT(OperationFinished(QString)) ); connect(OP, SIGNAL(closed(QString)), this, SLOT(OperationClosed(QString)) ); QTimer::singleShot(0, OP, SLOT(startOperation()) ); } void TrayUI::TrayActivated(){ this->contextMenu()->popup( this->geometry().center() ); } //Operation Widget Responses void TrayUI::OperationClosed(QString ID){ for(int i=0; i<OPS.length(); i++){ if(OPS[i]->whatsThis()==ID){ //qDebug() << "Removing OPWidget:" << ID; //this->contextMenu()->removeAction(OPS[i]->widgetAction()); OPS.takeAt(i)->deleteLater(); break; } } QTimer::singleShot(1000, this, SLOT(checkJobs()) ); } void TrayUI::OperationStarted(QString ID){ for(int i=0; i<OPS.length(); i++){ if(OPS[i]->whatsThis()==ID){ //NOTHING FOR NOW - ENABLE POPUPS LATER (if desired - they can get annoying for short operations) } } } void TrayUI::OperationFinished(QString ID){ //qDebug() << "Op Finished:" << ID; for(int i=0; i<OPS.length(); i++){ if(OPS[i]->whatsThis()!=ID){ continue; } //qDebug() << " - found widget"; bool err = OPS[i]->hasErrors(); //qDebug() << " -- Errors:" << err << "Duration:" << OPS[i]->duration(); //Assemble the notification (if more than 1 second to perform operation) if(OPS[i]->duration()>1){ this->showMessage( tr("Finished"), err ? tr("Errors during operation. Click to view details") : "", err ? QSystemTrayIcon::Warning : QSystemTrayIcon::Information); } //Close the widget if no errors if(!err){ OperationClosed(ID); } break; } } void TrayUI::checkJobs(){ if(OPS.isEmpty()){ emit JobsFinished(); this->hide(); }else{ bool showNotify = !this->isVisible(); this->show(); if(showNotify){ this->showMessage(tr("New Tasks Running"),"",QSystemTrayIcon::NoIcon, 2000); } } }