]> ruin.nu Git - hbs.git/blob - bs/bsview.cpp
some changes..
[hbs.git] / bs / bsview.cpp
1 /***************************************************************************
2                           bcview.cpp  -  description
3                              -------------------
4     begin                : Sun Jun 17 19:19:58 CEST 2001
5     copyright            : (C) 2001 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 "bsview.h"
19
20 //standard library
21 #include <iostream>
22 #include <map>
23 #include <vector>
24 #include <string>
25
26 using namespace std;
27
28 //QT includes
29 #include <qlistview.h>
30 #include <qwidgetstack.h>
31
32 #include "battlesum.h"
33 #include "scanview.h"
34 #include "ui/infoview.h"
35 //#include "tickview.h"
36 #include "fleetview.h"
37 #include "fleet.h"
38 #include "planet.h"
39
40 BSView::BSView(QWidget *parent, BSDoc *doc) : QSplitter(parent)
41 {
42   /** connect doc with the view*/
43
44         m_iMaxTick = 0;
45         m_iMinTick = 0;
46         m_iResultMode = 0;
47         
48         m_bMoreDocChanges = false;
49         connect(doc, SIGNAL(documentChanged()), this, SLOT(slotDocumentChanged()));
50         
51         m_doc = doc;
52         
53         m_LeftSplit = new QSplitter(QSplitter::Vertical, this);
54         m_RightSplit = new QSplitter(QSplitter::Vertical, this);
55
56         //setting up the listview
57         m_NumberView = new QListView(m_LeftSplit);
58         m_NumberView->setRootIsDecorated(true);  
59         m_NumberView->addColumn("Name");
60         m_NumberView->addColumn("Number");
61         m_NumberView->addColumn("ETA");
62         m_NumberView->addColumn("Score");
63         //addBattle("NO BATTLES");
64
65         
66         
67         connect(m_NumberView, SIGNAL(expanded(QListViewItem*)), SLOT(slotItemExpanded(QListViewItem*)));
68         connect(m_NumberView, SIGNAL(collapsed(QListViewItem*)), SLOT(slotItemCollapsed(QListViewItem*)));
69         
70         m_InfoView = new InfoView(m_LeftSplit);
71
72         connect(m_InfoView,SIGNAL(add()),SLOT(slotInfoNew()));
73         connect(m_InfoView,SIGNAL(apply()),SLOT(slotInfoApply()));
74         connect(m_InfoView,SIGNAL(cancel()),SLOT(slotInfoCancel()));
75         connect(m_InfoView,SIGNAL(remove()),SLOT(slotInfoRemove()));
76
77         vector<QString> raceNames;
78         const map<string, vector<int> >& races = Fleet::Races();
79         for(map<string, vector<int> >::const_iterator i = races.begin(); i != races.end(); ++i)
80         {
81                 raceNames.push_back(i->first.c_str());
82         }
83         m_InfoView->setRaces(raceNames);
84         
85         //the right side
86         //m_TickView = new TickView(m_RightSplit);
87         m_FleetViews = new QWidgetStack(m_RightSplit);
88         m_ScanView = new ScanView(m_RightSplit);
89         
90         Fleet fl1;
91         //fl1.setRace(tr("Terran").latin1());
92         fl1.setRace("Terran");
93         Fleet fl2;
94         fl2.setRace(tr("Generic").latin1());
95
96         //the widget stack
97         m_BattleSum = new BattleSum();
98         m_FleetViews->addWidget(m_BattleSum, 0);
99         m_FleetView = new FleetView(&fl1, true);
100         m_FleetViews->addWidget(m_FleetView, 1);
101         m_GenericFleetView = new FleetView(&fl2, true);
102         m_FleetViews->addWidget(m_GenericFleetView, 2);
103         m_FleetView->slotViewTickRange(m_iMinTick, m_iMaxTick);
104         m_GenericFleetView->slotViewTickRange(m_iMinTick, m_iMaxTick);
105
106         //m_FleetViews->raiseWidget(0);
107         connect(m_NumberView, SIGNAL(selectionChanged(QListViewItem *)), SLOT(slotFleetSelection(QListViewItem *)));
108         connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
109         connect(m_GenericFleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
110         connect(m_ScanView, SIGNAL(scanUsed(int,QString, int)), SLOT(slotUseScan(int, QString, int)));
111 }
112
113 BSView::~BSView()
114 {
115 }
116
117 //////////////////////////////////////////////////////////////////////////
118 //
119 void BSView::addBattle(QString name)
120 {
121         QListViewItem* battle = new QListViewItem(m_NumberView, name);
122         QListViewItem* def = new QListViewItem(battle, tr("Friendly"),"", "","1");
123         (void) new QListViewItem(battle, tr("Hostile"),"", "","2");
124         (void) new QListViewItem(def, tr("Home Planet"), "","","1");
125 }
126
127 ///////////////////////////////////////////////////////////////////////////////
128 //
129 /***This function clears the listview and then iterates through the battles
130  * and recreates the listview hierarchy.
131  */
132 void BSView::slotDocumentChanged()
133 {
134         if (m_bMoreDocChanges)
135                 return;
136
137         m_NumberView->clear();
138         
139         const BattleList& battles = m_doc->battles();   
140
141         vector<QString> battlenames;
142
143         for (BattleList::const_iterator i = battles.begin(); i != battles.end(); ++i)
144         {
145                 QString b = (*i).first;
146                 battlenames.push_back(i->first);
147                 QListViewItem* battle = new QListViewItem(m_NumberView, b);
148                 battle->setOpen(m_TreeExpanded[b]["--"]);
149                         
150
151                 for (map<QString, map<QString, Fleet*> >::const_iterator j = i->second.begin(); j != i->second.end(); ++j)
152                 {
153                         QString g = (*j).first;
154                         QListViewItem* group = new QListViewItem(battle, g);
155                         int groupShips = 0;
156                         unsigned groupScore = 0;
157                         group->setOpen(m_TreeExpanded[b][g]);
158
159                         for (map<QString, Fleet*>::const_iterator k = j->second.begin(); k != j->second.end(); ++k)
160                         {       
161                                 int ships = k->second->numberOfShips();
162                                 unsigned score = k->second->score();
163                                 groupShips += ships;
164                                 groupScore += score;
165                                 //if(k->first == tr("Home Planet"))
166                                         (void) new QListViewItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(k->second->ETA()), QString("%1").arg(score));
167                                 /*else
168                                         (void) new QCheckListItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(k->second->ETA()), QString("%1").arg(score), QCheckListItem::CheckBox);*/
169
170                         }
171                         group->setText(1, QString("%1").arg(groupShips));
172                         group->setText(3, QString("%1").arg(groupScore));
173                 }
174         }
175         m_InfoView->setBattles(battlenames);
176         updateInfoView();
177         updateFleetView();
178 }
179
180 //////////////////////////////////////////////////////////////////////////////
181 //
182 void BSView::slotFleetSelection(QListViewItem *lvi)
183 {
184
185         if (lvi->parent() == '\0')
186         {
187                 m_FleetViews->raiseWidget(0);
188         }
189         else if (lvi->parent()->parent() == '\0')
190         {
191                 if (lvi->text(0) == tr("Friendly"))
192                 {
193         //                      m_FleetView->slotAttacker(false);
194                 }
195                 else
196                 {
197         //                      m_FleetView->slotAttacker(true);
198                 }
199                 m_FleetViews->raiseWidget(2);
200                 
201         }
202         else
203         {
204                 m_sFleet = lvi->text(0);
205                 m_sGroup = lvi->parent()->text(0);
206                 m_sBattle = lvi->parent()->parent()->text(0);
207
208                 updateInfoView();
209                 updateFleetView();
210         }
211 }
212
213 //////////////////////////////////////////////////////////////////////////
214 //
215 void BSView::slotItemExpanded(QListViewItem *lvi)
216 {
217         if (lvi->parent() == '\0')
218         {
219                 m_TreeExpanded[lvi->text(0)]["--"] = true;
220         }
221         else if (lvi->parent()->parent() == '\0')
222         {
223                 m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = true;    
224         }
225 }
226
227 //////////////////////////////////////////////////////////////////////////
228 //
229 void BSView::slotItemCollapsed(QListViewItem *lvi)
230 {
231         if (lvi->parent() == '\0')
232         {
233                 m_TreeExpanded[lvi->text(0)]["--"] = false;
234         }
235         else if (lvi->parent()->parent() == '\0')
236         {
237                 m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = false;   
238         }
239 }
240
241 //////////////////////////////////////////////////////////////////////////
242 //
243 void BSView::slotFleetChanged(const Fleet* fleet)
244 {
245         m_doc->changeFleet(m_sBattle, m_sGroup, m_sFleet, fleet);
246 }
247
248 //////////////////////////////////////////////////////////////////////////
249 //
250 void BSView::slotInfoApply()
251 {
252         QString battle = m_InfoView->battle();
253         QString group  = m_InfoView->group();
254         QString fleet  = m_InfoView->fleetName();
255
256
257         
258         const Fleet* old = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
259
260         const Planet* oldpl = dynamic_cast<const Planet*>(old);
261
262         Fleet* fl;
263         if(oldpl)
264                 fl = new Planet(*oldpl);
265         else
266                 fl = new Fleet(*old);
267
268         
269                 
270         m_bMoreDocChanges = true;
271         m_doc->removeFleet(m_sBattle, m_sGroup, m_sFleet);
272         m_bMoreDocChanges = false;
273
274         m_sBattle = battle;
275         m_sGroup = group;
276         m_sFleet = fleet;
277
278
279         fl->setETA(m_InfoView->eta());
280         fl->setName(m_sFleet.latin1());
281         fl->setRace(m_InfoView->race().latin1());
282         fl->setStays(m_InfoView->stays());
283         
284         m_doc->newFleet(m_sBattle, m_sGroup, m_sFleet, fl);
285 }
286
287 //////////////////////////////////////////////////////////////////////////
288 //
289 void BSView::slotInfoCancel()
290 {
291         updateInfoView();
292 }
293
294 //////////////////////////////////////////////////////////////////////////
295 //
296 void BSView::slotInfoNew()
297 {
298
299         QString battle = m_InfoView->battle();
300         QString group  = m_InfoView->group();
301         QString fleet  = m_InfoView->fleetName();
302
303         const Fleet* fl1 = m_doc->specificFleet(battle, group, fleet);
304         if (fl1)
305         {
306                 //fleet does already exist, do not overwrite.
307                 //Need something else here....
308                 return;
309         }
310
311         
312         
313         Fleet* fl = new Fleet();
314
315         m_sBattle = battle;
316         m_sGroup = group;
317         m_sFleet = fleet;
318
319         fl->setETA(m_InfoView->eta());
320         fl->setName(m_sFleet.latin1());
321         fl->setRace(m_InfoView->race().latin1());
322         fl->setStays(m_InfoView->stays());
323
324         m_doc->newFleet(m_sBattle, m_sGroup, m_sFleet, fl);
325
326 }
327
328 //////////////////////////////////////////////////////////////////////////
329 //
330 void BSView::slotInfoRemove()
331 {
332         m_doc->removeFleet(m_sBattle, m_sGroup, m_sFleet);
333         m_sFleet = "";
334 }
335
336 //////////////////////////////////////////////////////////////////////////
337 //
338 void BSView::updateInfoView()
339 {
340         const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
341
342         if(!fl)
343         {
344                 m_InfoView->setFleetName("");
345                 m_InfoView->setEta(0);
346                 m_InfoView->enableNameChange(true);
347                 m_InfoView->enableRemove(false);
348                 return;
349         }
350         m_InfoView->setGroup(m_sGroup);
351         m_InfoView->setBattle(m_sBattle);
352
353 /*      NO LONGER NEEDED SINCE IT'S INTEGRATED IN THE InfoView CLASS
354  *      if(m_sFleet == tr("Home Planet") && m_sGroup == tr("Friendly"))
355         {
356                 //m_InfoView->enableNameChange(false);
357                 //m_InfoView->enableRemove(false);
358         }
359         else
360         {
361                 m_InfoView->enableNameChange(true);
362                 m_InfoView->enableRemove(true);
363         }
364 */
365
366         m_InfoView->setRace(fl->race().c_str());
367         m_InfoView->setFleetName(m_sFleet);
368         m_InfoView->setEta(fl->ETA());
369         m_InfoView->setGroup(m_sGroup);
370         m_InfoView->setBattle(m_sBattle);
371         m_InfoView->setStays(fl->stays());
372 }
373
374 //////////////////////////////////////////////////////////////////////////
375 //
376 void BSView::updateFleetView()
377 {
378         bool friendly = false;
379         bool home       = false;
380
381         const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
382
383         if (!fl)
384         {
385                 m_FleetViews->raiseWidget(2);
386                 return;
387         }
388
389         if ( m_sGroup == tr("Friendly"))
390         {
391                         friendly = true;
392                         if(m_sFleet == tr("Home Planet"))
393                                 home=true;
394         }
395         if (fl->race() == tr("Generic").latin1())
396         {
397                 m_GenericFleetView->viewFleet(fl, friendly);
398                 m_FleetViews->raiseWidget(2);
399
400         }
401         else 
402         {
403                 if (fl->race() == m_FleetView->fleet()->race() &&
404                 m_FleetView->isHome() == home)
405                 {
406                         m_FleetView->viewFleet(fl, friendly);
407                 }
408                 else
409                 {
410                         m_FleetViews->removeWidget(m_FleetView);
411                         delete m_FleetView;
412                         m_FleetView = new FleetView(fl, friendly);
413                         connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
414                         m_FleetView->slotViewTickRange(m_iMinTick, m_iMaxTick);
415                         m_FleetView->slotSetResultMode(m_iResultMode);
416                         m_FleetViews->addWidget(m_FleetView, 1);
417                 }
418                 m_FleetViews->raiseWidget(2);
419                 m_FleetViews->raiseWidget(1);
420         }
421 }
422
423 //////////////////////////////////////////////////////////////////////////
424 //
425 void BSView::slotTickChanged(int min, int max)
426 {
427         m_FleetView->slotViewTickRange(min, max);
428         m_GenericFleetView->slotViewTickRange(min, max);
429
430         m_iMinTick = min;
431         m_iMaxTick = max;
432 }
433
434 //////////////////////////////////////////////////////////////////////////
435 //
436 void BSView::slotResultModeChanged( int i)
437 {
438         m_FleetView->slotSetResultMode(i);
439         m_GenericFleetView->slotSetResultMode(i);
440         
441         m_iResultMode = i;
442 }
443
444 //////////////////////////////////////////////////////////////////////////
445 //
446 void BSView::slotUseScan(int action, QString text, int fleets)
447 {
448         cerr << "Action: " << action << endl;
449         cerr << "Text: " << text.latin1() << endl;
450         cerr << "Fleets: " << fleets << endl;
451 }