aboutsummaryrefslogtreecommitdiff
path: root/src-qt5/core/lumina-desktop-unified/src-screensaver/SSBaseWidget.cpp
blob: ed2246954fcd04bccab1740165065340b2ce461d (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
//===========================================
//  Lumina-DE source code
//  Copyright (c) 2015, Ken Moore
//  Available under the 3-clause BSD license
//  See the LICENSE file for full details
//===========================================

#include "SSBaseWidget.h"

#define DEBUG 1

static QStringList validPlugs;
// ========
//   PUBLIC
// ========
SSBaseWidget::SSBaseWidget(QWidget *parent, QSettings *set) : QWidget(parent){
  if(validPlugs.isEmpty()){ validPlugs << "none"; } //add more later
  settings = set; //needed to pass along for plugins to read any special options/settings
  this->setObjectName("LuminaBaseSSWidget");
  ANIM = 0;
  this->setMouseTracking(true);
  plugType="none";
}

SSBaseWidget::~SSBaseWidget(){
  if(ANIM!=0){ this->stopPainting(); }
}

void SSBaseWidget::setPlugin(QString plug){
  plug = plug.toLower();
  if(validPlugs.contains(plug) || plug=="random"){ plugType = plug; }
  else{ plugType = "none"; }
}

// =============
//  PUBLIC SLOTS
// =============
void SSBaseWidget::startPainting(){
  cplug = plugType;
  //free up any old animation instance
  if(ANIM!=0){
    ANIM->stop(); ANIM->clear();
    delete ANIM; ANIM = 0;
  }
  //If a random plugin - grab one of the known plugins
  if(cplug=="random"){
    QStringList valid = BaseAnimGroup::KnownAnimations();
    valid.removeAll("none"); //they want a screensaver - remove the "none" option from the valid list
    if(valid.isEmpty()){ cplug = "none"; } //no known plugins
    else{ cplug = valid[ qrand()%valid.length() ]; } //grab a random plugin
  }
  if(DEBUG){ qDebug() << " - Screen Saver:" << cplug; }
  //Now list all the various plugins and start them appropriately
  QString style;
  if(cplug=="none"){
    style = "background: black;"; //show the underlying black parent widget
  }else{
    style = "background: black;";
  }
  this->setStyleSheet("QWidget#LuminaBaseSSWidget{ "+style+"}");
  this->repaint();
  //If not a stylesheet-based plugin - set it here
  if(cplug!="none"){
    ANIM = BaseAnimGroup::NewAnimation(cplug, this, settings);
    connect(ANIM, SIGNAL(finished()), this, SLOT(startPainting()) ); //repeat the plugin as needed
    ANIM->LoadAnimations();
  }
  //Now start the animation(s)
  if(ANIM!=0){
    if(ANIM->animationCount()>0){
      if(DEBUG){ qDebug() << " - Starting SS Plugin:" << cplug << ANIM->animationCount() << ANIM->duration() << ANIM->loopCount(); }
      ANIM->start();
    }
  }
}

void SSBaseWidget::stopPainting(){
  if(ANIM!=0){
    ANIM->stop();
    ANIM->clear();
    ANIM->deleteLater();
    ANIM = 0;
  }
}
bgstack15