e3ac861539f62229799cbce2fdc093c27472524e
[evehomescreen] / src / widget.cpp
1 // Copyright (C) 2010 Jaakko Kyro <jkyro@korjaussarja.net>
2 // This file is licenced under GPL, see COPYING
3 // for full licence information
4 #include "widget.h"
5 #include <QPainter>
6 #include "eveaccount.h"
7 #include "evesettingsdialog.h"
8 #include "eveskilltraining.h"
9 #include "skilltree.h"
10 #include <QtDebug>
11 //#include <QNetworkConfigurationManager>
12 #include <QSettings>
13 #include <QTimer>
14 #include <QDateTime>
15
16 //QTM_USE_NAMESPACE
17
18 Widget::Widget(QWidget *parent)
19     : QLabel(parent),
20     m_settings(new EveSettingsDialog(this)),
21     m_training(NULL),
22     //m_net(new QNetworkConfigurationManager(this)),
23     m_skills(new SkillTree(this)),
24     m_model(new EveModel),
25     m_timer(new QTimer(this)),
26     m_updateTimer(new QTimer(this))
27 {
28     setAlignment(Qt::AlignCenter);
29     setAttribute(Qt::WA_TranslucentBackground);
30     setGeometry(0,0,150,180);
31     //connect(m_net,SIGNAL(onlineStateChanged(bool)),this,SLOT(onlineStateChanged(bool)));
32     connect(m_skills,SIGNAL(skillsLoaded()),this,SLOT(update()));
33     m_skills->loadSkills();
34     m_model->loadSettings();
35     m_settings->setModel(m_model);
36     EveCharacter *c = m_model->selectedCharacter();
37     if (c != NULL) {
38         loadTraining();
39     }
40     m_timer->setSingleShot(true);
41     connect(m_timer,SIGNAL(timeout()),this,SLOT(loadTraining()));
42     m_updateTimer->setSingleShot(true);
43     connect(m_updateTimer,SIGNAL(timeout()),this,SLOT(update()));
44 }
45
46 Widget::~Widget()
47 {
48
49 }
50
51
52 QSize Widget::sizeHint() const
53 {
54     return 2 * QLabel::sizeHint();
55 }
56
57 void Widget::paintEvent(QPaintEvent *event)
58 {
59     QPainter p(this);
60     QColor bgColor(0, 0, 0, 128);
61     p.setBrush(bgColor);
62     p.setPen(Qt::NoPen);
63     p.drawRoundedRect(rect(), 25, 25);
64
65     QFont dFont(p.font());
66     dFont.setPixelSize(15);
67     p.setFont(dFont);
68     EveCharacter *character = m_model->selectedCharacter();
69     if (character != NULL) {
70         QPoint iconLoc((150-64)/2,(150-64)/2);
71         if (character->characterIcon) {
72             p.drawPixmap(iconLoc,*(character->characterIcon));
73         }
74         QRect nameLoc(0,10,150,20);
75         p.setPen(Qt::white);
76         p.drawText(nameLoc,Qt::AlignCenter,character->name);
77         if (m_training) {
78             if (m_training->isLoading()) {
79                 QRect skillTitle(0,100,150,50);
80                 p.drawText(skillTitle,Qt::AlignCenter|Qt::TextWordWrap,
81                            "Loading skills...");
82             } else if (m_training->training) {
83                 int timeLeft = m_training->currentTime.secsTo(m_training->lastTraining().endTime);
84                 qDebug() << "Time left:" << timeLeft;
85                 if (timeLeft < 60*60*24) {
86                     // Queue not full -> yellow text
87
88                     QColor penColor(254,241,53);
89                     p.setPen(penColor);
90                 }
91
92                 QRect skillTitle(0,100,150,50);
93                 p.drawText(skillTitle,Qt::AlignCenter|Qt::TextWordWrap,
94                            QString("%1 %2").arg(m_skills->skillName(m_training->firstTraining().typeId))
95                            .arg(m_training->firstTraining().level));
96                 QRect skillLoc(0,145,150,20);
97                 p.drawText(skillLoc,Qt::AlignCenter,m_training->firstTraining().endTime.toString(Qt::SystemLocaleShortDate));
98
99             } else {
100
101                 QRect skillTitle(0,110,150,50);
102                 p.setPen(Qt::red);
103                 p.drawText(skillTitle,Qt::AlignCenter|Qt::TextWordWrap,
104                            "No skill in training");
105             }
106         }
107     }
108     p.end();
109
110     QLabel::paintEvent(event);
111 }
112
113 void Widget::showSettingsDialog()
114 {
115
116     int result = m_settings->exec();
117     if (result == QDialog::Accepted) {
118
119         m_model->setSelected(m_settings->selectedCharacter());
120         EveCharacter *character = m_model->selectedCharacter();
121         if (character != NULL) {
122             qDebug() << "Got character " << character->name;
123             connect(character,SIGNAL(imageLoaded()),this,SLOT(skillReady()));
124             character->fetchImage();
125
126             loadTraining();
127         }
128     }
129 }
130
131 void Widget::loadTraining()
132 {
133     EveCharacter *character = m_model->selectedCharacter();
134
135     if (character != NULL) {
136
137         qDebug() << "Fetch skills";
138         if (m_training == NULL) {
139             m_training = new EveSkillTraining(this);
140             connect(m_training,SIGNAL(finished()),this,SLOT(trainingLoaded()));
141         }
142         m_training->setAccount(m_settings->model().data());
143         m_training->setCharacter(character);
144
145         m_training->fetchInfo();
146     }
147     update();
148 }
149
150 void Widget::skillReady()
151 {
152     m_training->fetchInfo();
153     m_model->saveSettings();
154     update();
155 }
156
157 void Widget::onlineStateChanged(bool online)
158 {
159     qDebug() << "Online status changed, reloading info";
160     if (online) {
161         m_training->fetchInfo();
162         update();
163     }
164 }
165
166 void Widget::trainingLoaded()
167 {
168     qDebug() << "Training loaded";
169     if (m_training != NULL && m_training->training) {
170         QDateTime limit = (m_training->cachedUntil > m_training->lastTraining().endTime) ?
171                           m_training->cachedUntil : m_training->lastTraining().endTime;
172
173         qDebug() << "Next refresh:" << limit.toString(Qt::SystemLocaleShortDate);
174         int interval = 1000 * (m_training->currentTime.secsTo(limit) + 15);
175         //qDebug() << "Timer interval" << interval;
176         if (m_timer->isActive()) {
177             m_timer->stop();
178         }
179
180         m_timer->setInterval( interval );
181         m_timer->start();
182         if (m_updateTimer->isActive())
183             m_updateTimer->stop();
184
185         QDateTime nextUpdate = m_training->lastTraining().endTime;
186
187         nextUpdate.addSecs(-1*60*60*24);
188         if (nextUpdate > m_training->currentTime) {
189             m_updateTimer->setInterval(1000 * (m_training->currentTime.secsTo(nextUpdate) + 15));
190             m_updateTimer->start();
191         }
192     }
193     update();
194 }
195
196 void Widget::mousePressEvent(QMouseEvent *event)
197 {
198     Q_UNUSED(event);
199     qDebug() << "Press event";
200     m_training->fetchInfo();
201     update();
202 }