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