]> ruin.nu Git - hbs.git/blob - bs/fleetview.cpp
solved an evil bug in Fleet::distributeLossesGains and some other stuff
[hbs.git] / bs / fleetview.cpp
1 /***************************************************************************
2                           fleetview.cpp  -  description
3                              -------------------
4     begin                : Sun Mar 10 2002
5     copyright            : (C) 2002 by Michael Andreen
6     email                : whale@linux.nu
7  ***************************************************************************/
8
9 /***************************************************************************
10  *                                                                         *
11  *   This program is free software; you can redistribute it and/or modify  *
12  *   it under the terms of the GNU General Public License as published by  *
13  *   the Free Software Foundation; either version 2 of the License, or     *
14  *   (at your option) any later version.                                   *
15  *                                                                         *
16  ***************************************************************************/
17
18 #include "fleetview.h"
19
20 #include "ui/roidseditview.h"
21 #include "ui/resourceview.h"
22 #include "planet.h"
23
24 #include <qvalidator.h>
25
26 #include <iostream>
27 #include <map>
28
29 using namespace std;
30
31 FleetView::FleetView(const Fleet* fleet, bool friendly, QWidget *parent, const char *name ) : QWidget(parent,name)
32 {
33         m_Modified = false;
34         const Planet* planet = 0;
35         if((planet = dynamic_cast<const Planet*>(fleet)))
36         {
37                         m_Fleet = new Planet(*planet);
38                         m_bHome = true;
39         }
40         else
41         {
42                 m_Fleet = new Fleet(*fleet);
43                 m_bHome = false;
44         }
45         
46         m_Fleet->printFleet();
47         m_bFriendly = friendly;
48
49         //m_ChangesMapper = new QSignalMapper(this);
50
51         
52         findNames();
53         int rows = m_Names.size() / 3 + m_Names.size() % 3;
54         m_MainLayout = new QVBoxLayout(this,2);
55         m_MainLayout->addSpacing(2);
56         m_UnitsLayout = new QGridLayout(m_MainLayout, rows, 6);
57         buildUnitTable();
58         //QSpacerItem* space = new QSpacerItem(1, 1);
59         
60
61         m_MainLayout->addStretch(10);
62
63         if (m_bHome)
64         {
65                 m_RoidsEditView = new RoidsEditView(this);
66                 m_MainLayout->addWidget(m_RoidsEditView);
67                 connect(m_RoidsEditView, SIGNAL(changed(const QString&, int)), SLOT(slotRoidsChanged(const QString&, int)));
68         }
69         m_ResourceView = new ResourceView(this);
70         m_MainLayout->addWidget(m_ResourceView);
71   fillTable();
72 }
73
74 FleetView::~FleetView(){
75 }
76
77 /////////////////////////////////////////////////////////////////////
78 //
79 void FleetView::viewFleet(const Fleet* fleet, bool friendly)
80 {
81         if (m_Fleet->race() != fleet->race())
82         {
83                 findNames();
84         }
85         delete m_Fleet;
86         if(m_bHome)
87         {
88                 m_Fleet = new Planet(*dynamic_cast<const Planet*>(fleet));
89         }
90         else
91         {
92                 m_Fleet = new Fleet(*fleet);
93         }
94         m_Fleet->printFleet();
95         fillTable();
96 }
97
98 /////////////////////////////////////////////////////////////////////
99 //
100 void FleetView::findNames()
101 {
102         m_Names.clear();
103
104         const UnitList& units = Fleet::Units(); 
105         vector<int> races = m_Fleet->RacesAllowed();
106
107         for (UnitList::const_iterator i = units.begin(); i != units.end(); ++i)
108         {
109                 for (vector<int>::iterator j = races.begin(); j != races.end(); ++j)
110                 {
111                         if ((*j) == i->second.race())
112                         {
113                                 m_Names.push_back(i->first.c_str());
114                                 break;
115                         }
116                 }
117         }
118 }
119
120 /////////////////////////////////////////////////////////////////////
121 //
122 void FleetView::buildUnitTable()
123 {
124         int rows = 0;
125         QIntValidator* val = new QIntValidator(this);
126         val->setBottom(0);
127
128         for (vector<QString>::iterator i = m_Names.begin(); i != m_Names.end(); ++rows)
129         {
130                 for ( int cols = 0; i != m_Names.end() && cols < 3; ++i, ++cols)
131                 {
132                         m_UnitsLabel[(*i)] = new QLabel((*i), this);
133                         m_UnitsLayout->addWidget(m_UnitsLabel[(*i)], rows, cols*3);
134
135                         m_UnitsEdit[(*i)] = new QLineEdit(this,(*i));
136       m_UnitsEdit[(*i)]->setValidator(val);
137                         m_UnitsLayout->addWidget(m_UnitsEdit[(*i)], rows, cols*3+1);
138
139                         m_UnitsLostSurvivedView[(*i)] = new QLineEdit(this);
140                         m_UnitsLostSurvivedView[(*i)]->setFocusPolicy(QWidget::NoFocus);
141                         m_UnitsLostSurvivedView[(*i)]->setReadOnly(true);
142                         m_UnitsLayout->addWidget(m_UnitsLostSurvivedView[(*i)], rows, cols*3+2);
143
144                         connect(m_UnitsEdit[(*i)], SIGNAL(textChanged(const QString&)),this, SLOT(unitsChanged(const QString&)));
145                 }
146         }
147
148 }
149
150 /////////////////////////////////////////////////////////////////////
151 //
152 const Fleet* FleetView::fleet()
153 {
154         return m_Fleet;
155 }
156
157 /////////////////////////////////////////////////////////////////////
158 //
159 bool FleetView::isHome()
160 {
161         return m_bHome;
162 }
163
164 /////////////////////////////////////////////////////////////////////
165 //
166 bool FleetView::isFriendly()
167 {
168         return m_bFriendly;
169 }
170
171 /////////////////////////////////////////////////////////////////////
172 //
173 void FleetView::unitsChanged(const QString& number)
174 {
175         m_Fleet->setFleet(sender()->name(), number.toInt());
176         m_Modified = true;
177         emit fleetChanged(m_Fleet);
178 }
179
180 /////////////////////////////////////////////////////////////////////
181 //
182 bool FleetView::isModified()
183 {
184         return m_Modified;
185 }
186
187 /////////////////////////////////////////////////////////////////////
188 //
189 void FleetView::fillTable()
190 {
191         for(vector<QString>::iterator i = m_Names.begin(); i != m_Names.end(); ++i)
192         {
193                 m_UnitsEdit[(*i)]->setText(QString("%1").arg(m_Fleet->fleet(i->latin1(), 0)));
194         }
195         Planet* pl;
196         if ((pl = dynamic_cast<Planet*>(m_Fleet)) && m_bHome)
197         {
198                 m_RoidsEditView->setValue(tr("score"),pl->planetScore());
199                 m_RoidsEditView->setValue(tr("metal"),pl->roids(tr("metal").latin1()));
200                 m_RoidsEditView->setValue(tr("crystal"),pl->roids(tr("crystal").latin1()));
201                 m_RoidsEditView->setValue(tr("eonium"),pl->roids(tr("eonium").latin1()));
202                 m_RoidsEditView->setValue(tr("uninit"),pl->roids(tr("uninit").latin1()));
203         }
204 }
205
206 /////////////////////////////////////////////////////////////////////
207 //
208 void FleetView::slotRoidsChanged(const QString& type, int value)
209 {
210         Planet* pl;
211         if ((pl = dynamic_cast<Planet*>(m_Fleet)))
212         {
213                 if (type == tr("score"))
214                         pl->setPlanetScore(value);
215                 else
216                 {
217                         pl->setRoids(type.latin1(), value);
218                 }
219                 emit fleetChanged(pl);
220         }
221 }
222
223 /////////////////////////////////////////////////////////////////////
224 //
225 void FleetView::slotViewTickRange(int min = -1, int max = -1)
226 {
227         if (min > -1)
228                 m_iMinTick = min;
229         if (max > -1)
230                 m_iMaxTick = max;
231         
232         for(vector<QString>::iterator i = m_Names.begin(); i != m_Names.end(); ++i)
233         {
234                 int before = m_Fleet->fleet(i->latin1(), m_iMinTick);
235                 int after = m_Fleet->fleet(i->latin1(), m_iMaxTick);
236                 m_UnitsLostSurvivedView[(*i)]->setText(QString("%1").arg(after - before));
237         }
238 }