0f41be064b501394165f0f2e258a707b75163452
[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 && m_training->training) {
78             int timeLeft = m_training->currentTime.secsTo(m_training->lastTraining().endTime);
79             qDebug() << "Time left:" << timeLeft;
80             if (timeLeft < 60*60*24) {
81                         // Queue not full -> yellow text
82
83                 QColor penColor(254,241,53);
84                 p.setPen(penColor);
85             }
86
87             QRect skillTitle(0,100,150,50);
88             p.drawText(skillTitle,Qt::AlignCenter|Qt::TextWordWrap,
89                        QString("%1 %2").arg(m_skills->skillName(m_training->firstTraining().typeId))
90                                        .arg(m_training->firstTraining().level));
91             QRect skillLoc(0,145,150,20);
92             p.drawText(skillLoc,Qt::AlignCenter,m_training->firstTraining().endTime.toString(Qt::SystemLocaleShortDate));
93         } else {
94
95             QRect skillTitle(0,110,150,50);
96             p.setPen(Qt::red);
97             p.drawText(skillTitle,Qt::AlignCenter|Qt::TextWordWrap,
98                        "No skill in training");
99         }
100
101     }
102     p.end();
103
104     QLabel::paintEvent(event);
105 }
106
107 void Widget::showSettingsDialog()
108 {
109
110     int result = m_settings->exec();
111     if (result == QDialog::Accepted) {
112
113         m_model->setSelected(m_settings->selectedCharacter());
114         EveCharacter *character = m_model->selectedCharacter();
115         if (character != NULL) {
116             qDebug() << "Got character " << character->name;
117             connect(character,SIGNAL(imageLoaded()),this,SLOT(skillReady()));
118             character->fetchImage();
119
120             loadTraining();
121         }
122     }
123 }
124
125 void Widget::loadTraining()
126 {
127     EveCharacter *character = m_model->selectedCharacter();
128     if (character != NULL) {
129
130         qDebug() << "Fetch skills";
131         if (m_training == NULL) {
132             m_training = new EveSkillTraining(this);
133             connect(m_training,SIGNAL(finished()),this,SLOT(trainingLoaded()));
134         }
135         m_training->setAccount(m_settings->model().data());
136         m_training->setCharacter(character);
137
138         m_training->fetchInfo();
139     }
140 }
141
142 void Widget::skillReady()
143 {
144     update();
145     m_training->fetchInfo();
146     m_model->saveSettings();
147 }
148
149 void Widget::onlineStateChanged(bool online)
150 {
151     qDebug() << "Online status changed, reloading info";
152     if (online) {
153         m_training->fetchInfo();
154     }
155 }
156
157 void Widget::trainingLoaded()
158 {
159     qDebug() << "Training loaded";
160     if (m_training != NULL && m_training->training) {
161         QDateTime limit = (m_training->cachedUntil > m_training->lastTraining().endTime) ?
162                           m_training->cachedUntil : m_training->lastTraining().endTime;
163
164         qDebug() << "Next refresh:" << limit.toString(Qt::SystemLocaleShortDate);
165         int interval = 1000 * (m_training->currentTime.secsTo(limit) + 15);
166         //qDebug() << "Timer interval" << interval;
167         if (m_timer->isActive()) {
168             m_timer->stop();
169         }
170
171         m_timer->setInterval( interval );
172         m_timer->start();
173         if (m_updateTimer->isActive())
174             m_updateTimer->stop();
175
176         QDateTime nextUpdate = m_training->lastTraining().endTime;
177
178         nextUpdate.addSecs(-1*60*60*24);
179         if (nextUpdate > m_training->currentTime) {
180             m_updateTimer->setInterval(1000 * (m_training->currentTime.secsTo(nextUpdate) + 15));
181             m_updateTimer->start();
182         }
183     }
184     update();
185 }