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