]> ruin.nu Git - hbs.git/blob - bs/bsview.cpp
some
[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 #include <qtabwidget.h>
32 #include <qtextedit.h>
33
34 #include "battlesum.h"
35 #include "scanview.h"
36 #include "ui/infoview.h"
37 //#include "tickview.h"
38 #include "fleetview.h"
39 #include "fleet.h"
40 #include "planet.h"
41
42 BSView::BSView(QWidget *parent, BSDoc *doc) : QSplitter(parent)
43 {
44   /** connect doc with the view*/
45
46         m_iMaxTick = 0;
47         m_iMinTick = 0;
48         m_iResultMode = 0;
49         
50         m_bMoreDocChanges = false;
51         connect(doc, SIGNAL(documentChanged()), this, SLOT(slotDocumentChanged()));
52         
53         m_doc = doc;
54         
55         m_LeftSplit = new QSplitter(QSplitter::Vertical, this);
56
57         m_Pages = new QTabWidget(this);
58
59         m_RightSplit = new QSplitter(QSplitter::Vertical);
60         m_Pages->addTab(m_RightSplit, tr("Units"));
61         
62         m_Report = new QTextEdit();
63         m_Report->setReadOnly(true);
64         m_Pages->addTab(m_Report, tr("Report"));
65
66
67         //setting up the listview
68         m_NumberView = new QListView(m_LeftSplit);
69         m_NumberView->setRootIsDecorated(true);  
70         m_NumberView->addColumn("Name");
71         m_NumberView->addColumn("Number");
72         m_NumberView->addColumn("ETA");
73         m_NumberView->addColumn("Score");
74         //addBattle("NO BATTLES");
75
76         
77         
78         connect(m_NumberView, SIGNAL(expanded(QListViewItem*)), SLOT(slotItemExpanded(QListViewItem*)));
79         connect(m_NumberView, SIGNAL(collapsed(QListViewItem*)), SLOT(slotItemCollapsed(QListViewItem*)));
80         
81         m_InfoView = new InfoView(m_LeftSplit);
82
83         connect(m_InfoView,SIGNAL(add()),SLOT(slotInfoNew()));
84         connect(m_InfoView,SIGNAL(apply()),SLOT(slotInfoApply()));
85         connect(m_InfoView,SIGNAL(cancel()),SLOT(slotInfoCancel()));
86         connect(m_InfoView,SIGNAL(remove()),SLOT(slotInfoRemove()));
87
88         vector<QString> raceNames;
89         const map<string, vector<int> >& races = Fleet::Races();
90         for(map<string, vector<int> >::const_iterator i = races.begin(); i != races.end(); ++i)
91         {
92                 raceNames.push_back(i->first.c_str());
93         }
94         m_InfoView->setRaces(raceNames);
95         
96         //the right side
97         //m_TickView = new TickView(m_RightSplit);
98         m_FleetViews = new QWidgetStack(m_RightSplit);
99         m_ScanView = new ScanView(m_RightSplit);
100         
101         Fleet fl1;
102         //fl1.setRace(tr("Terran").latin1());
103         fl1.setRace("Terran");
104         Fleet fl2;
105         fl2.setRace(tr("Generic").latin1());
106
107         //the widget stack
108         m_BattleSum = new BattleSum();
109         m_FleetViews->addWidget(m_BattleSum, 0);
110         m_FleetView = new FleetView(&fl1, true);
111         m_FleetViews->addWidget(m_FleetView, 1);
112         m_GenericFleetView = new FleetView(&fl2, true);
113         m_FleetViews->addWidget(m_GenericFleetView, 2);
114         m_FleetView->slotViewTickRange(m_iMinTick, m_iMaxTick);
115         m_GenericFleetView->slotViewTickRange(m_iMinTick, m_iMaxTick);
116
117         //m_FleetViews->raiseWidget(0);
118         connect(m_NumberView, SIGNAL(selectionChanged(QListViewItem *)), SLOT(slotFleetSelection(QListViewItem *)));
119         connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
120         connect(m_GenericFleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
121         connect(m_ScanView, SIGNAL(scanUsed(int,QString, int)), SLOT(slotUseScan(int, QString, int)));
122 }
123
124 BSView::~BSView()
125 {
126 }
127
128 //////////////////////////////////////////////////////////////////////////
129 //
130 void BSView::addBattle(QString name)
131 {
132         QListViewItem* battle = new QListViewItem(m_NumberView, name);
133         QListViewItem* def = new QListViewItem(battle, tr("Friendly"),"", "","1");
134         (void) new QListViewItem(battle, tr("Hostile"),"", "","2");
135         (void) new QListViewItem(def, tr("Home Planet"), "","","1");
136 }
137
138 ///////////////////////////////////////////////////////////////////////////////
139 //
140 /***This function clears the listview and then iterates through the battles
141  * and recreates the listview hierarchy.
142  */
143 void BSView::slotDocumentChanged()
144 {
145         if (m_bMoreDocChanges)
146                 return;
147
148         m_NumberView->clear();
149         
150         const BattleList& battles = m_doc->battles();   
151
152         vector<QString> battlenames;
153
154         for (BattleList::const_iterator i = battles.begin(); i != battles.end(); ++i)
155         {
156                 QString b = (*i).first;
157                 battlenames.push_back(i->first);
158                 QListViewItem* battle = new QListViewItem(m_NumberView, b);
159                 battle->setOpen(m_TreeExpanded[b]["--"]);
160                         
161
162                 for (map<QString, map<QString, Fleet*> >::const_iterator j = i->second.begin(); j != i->second.end(); ++j)
163                 {
164                         QString g = (*j).first;
165                         QListViewItem* group = new QListViewItem(battle, g);
166                         int groupShips = 0;
167                         unsigned groupScore = 0;
168                         group->setOpen(m_TreeExpanded[b][g]);
169
170                         for (map<QString, Fleet*>::const_iterator k = j->second.begin(); k != j->second.end(); ++k)
171                         {       
172                                 int ships = k->second->numberOfShips();
173                                 unsigned score = k->second->score();
174                                 groupShips += ships;
175                                 groupScore += score;
176                                 //if(k->first == tr("Home Planet"))
177                                         (void) new QListViewItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(k->second->ETA()), QString("%1").arg(score));
178                                 /*else
179                                         (void) new QCheckListItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(k->second->ETA()), QString("%1").arg(score), QCheckListItem::CheckBox);*/
180
181                         }
182                         group->setText(1, QString("%1").arg(groupShips));
183                         group->setText(3, QString("%1").arg(groupScore));
184                 }
185         }
186         m_InfoView->setBattles(battlenames);
187         updateInfoView();
188         setCurrentListViewItem();
189         updateFleetView();
190 }
191
192 //////////////////////////////////////////////////////////////////////////////
193 //
194 void BSView::slotFleetSelection(QListViewItem *lvi)
195 {
196
197         if (lvi->parent() == '\0')
198         {
199                 m_FleetViews->raiseWidget(0);
200                 m_sFleet = QString::null;
201                 m_sGroup = QString::null;
202                 QString temp = lvi->text(0);
203
204                 if (temp != m_sBattle)
205                 {
206                         m_sBattle = temp;
207                         slotGenerateReport();
208                 }
209         }
210         else if (lvi->parent()->parent() == '\0')
211         {
212                 m_sFleet = QString::null;
213                 m_sGroup = lvi->text(0);
214                 QString temp = lvi->parent()->text(0);
215
216                 if (temp != m_sBattle)
217                 {
218                         m_sBattle = temp;
219                         slotGenerateReport();
220                 }
221
222                 if (lvi->text(0) == tr("Friendly"))
223                 {
224         //                      m_FleetView->slotAttacker(false);
225                 }
226                 else
227                 {
228         //                      m_FleetView->slotAttacker(true);
229                 }
230                 m_FleetViews->raiseWidget(2);
231                 
232         }
233         else
234         {
235                 m_sFleet = lvi->text(0);
236                 m_sGroup = lvi->parent()->text(0);
237                 QString temp = lvi->parent()->parent()->text(0);
238
239                 if (temp != m_sBattle)
240                 {
241                         m_sBattle = temp;
242                         slotGenerateReport();
243                 }
244
245                 updateInfoView();
246                 updateFleetView();
247         }
248 }
249
250 //////////////////////////////////////////////////////////////////////////
251 //
252 void BSView::slotItemExpanded(QListViewItem *lvi)
253 {
254         if (lvi->parent() == '\0')
255         {
256                 m_TreeExpanded[lvi->text(0)]["--"] = true;
257         }
258         else if (lvi->parent()->parent() == '\0')
259         {
260                 m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = true;    
261         }
262 }
263
264 //////////////////////////////////////////////////////////////////////////
265 //
266 void BSView::slotItemCollapsed(QListViewItem *lvi)
267 {
268         if (lvi->parent() == '\0')
269         {
270                 m_TreeExpanded[lvi->text(0)]["--"] = false;
271         }
272         else if (lvi->parent()->parent() == '\0')
273         {
274                 m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = false;   
275         }
276 }
277
278 //////////////////////////////////////////////////////////////////////////
279 //
280 void BSView::slotFleetChanged(const Fleet* fleet)
281 {
282         m_doc->changeFleet(m_sBattle, m_sGroup, m_sFleet, fleet);
283 }
284
285 //////////////////////////////////////////////////////////////////////////
286 //
287 void BSView::slotInfoApply()
288 {
289         QString battle = m_InfoView->battle();
290         QString group  = m_InfoView->group();
291         QString fleet  = m_InfoView->fleetName();
292
293
294         
295         const Fleet* old = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
296
297         const Planet* oldpl = dynamic_cast<const Planet*>(old);
298
299         Fleet* fl;
300         if(oldpl)
301                 fl = new Planet(*oldpl);
302         else
303                 fl = new Fleet(*old);
304
305         
306                 
307         m_bMoreDocChanges = true;
308         m_doc->removeFleet(m_sBattle, m_sGroup, m_sFleet);
309         m_bMoreDocChanges = false;
310
311         m_sBattle = battle;
312         m_sGroup = group;
313         m_sFleet = fleet;
314
315
316         fl->setETA(m_InfoView->eta());
317         fl->setName(m_sFleet.latin1());
318         fl->setRace(m_InfoView->race().latin1());
319         fl->setStays(m_InfoView->stays());
320         
321         m_doc->newFleet(m_sBattle, m_sGroup, m_sFleet, fl);
322 }
323
324 //////////////////////////////////////////////////////////////////////////
325 //
326 void BSView::slotInfoCancel()
327 {
328         updateInfoView();
329 }
330
331 //////////////////////////////////////////////////////////////////////////
332 //
333 void BSView::slotInfoNew()
334 {
335
336         QString battle = m_InfoView->battle();
337         QString group  = m_InfoView->group();
338         QString fleet  = m_InfoView->fleetName();
339
340         const Fleet* fl1 = m_doc->specificFleet(battle, group, fleet);
341         if (fl1)
342         {
343                 //fleet does already exist, do not overwrite.
344                 //Need something else here....
345                 return;
346         }
347
348         
349         
350         Fleet* fl = new Fleet();
351
352         m_sBattle = battle;
353         m_sGroup = group;
354         m_sFleet = fleet;
355
356         fl->setETA(m_InfoView->eta());
357         fl->setName(m_sFleet.latin1());
358         fl->setRace(m_InfoView->race().latin1());
359         fl->setStays(m_InfoView->stays());
360
361         m_doc->newFleet(m_sBattle, m_sGroup, m_sFleet, fl);
362
363 }
364
365 //////////////////////////////////////////////////////////////////////////
366 //
367 void BSView::slotInfoRemove()
368 {
369         m_doc->removeFleet(m_sBattle, m_sGroup, m_sFleet);
370         m_sFleet = "";
371 }
372
373 //////////////////////////////////////////////////////////////////////////
374 //
375 void BSView::updateInfoView()
376 {
377         const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
378
379         if(!fl)
380         {
381                 m_InfoView->setFleetName("");
382                 m_InfoView->setEta(0);
383                 m_InfoView->enableNameChange(true);
384                 m_InfoView->enableRemove(false);
385                 return;
386         }
387         m_InfoView->setGroup(m_sGroup);
388         m_InfoView->setBattle(m_sBattle);
389
390 /*      NO LONGER NEEDED SINCE IT'S INTEGRATED IN THE InfoView CLASS
391  *      if(m_sFleet == tr("Home Planet") && m_sGroup == tr("Friendly"))
392         {
393                 //m_InfoView->enableNameChange(false);
394                 //m_InfoView->enableRemove(false);
395         }
396         else
397         {
398                 m_InfoView->enableNameChange(true);
399                 m_InfoView->enableRemove(true);
400         }
401 */
402
403         m_InfoView->setRace(fl->race().c_str());
404         m_InfoView->setFleetName(m_sFleet);
405         m_InfoView->setEta(fl->ETA());
406         m_InfoView->setGroup(m_sGroup);
407         m_InfoView->setBattle(m_sBattle);
408         m_InfoView->setStays(fl->stays());
409 }
410
411 //////////////////////////////////////////////////////////////////////////
412 //
413 void BSView::updateFleetView()
414 {
415         bool friendly = false;
416         bool home       = false;
417
418         const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
419
420         if (!fl)
421         {
422                 m_FleetViews->raiseWidget(2);
423                 return;
424         }
425
426         if ( m_sGroup == tr("Friendly"))
427         {
428                         friendly = true;
429                         if(m_sFleet == tr("Home Planet"))
430                                 home=true;
431         }
432         if (fl->race() == tr("Generic").latin1())
433         {
434                 m_GenericFleetView->viewFleet(fl, friendly);
435                 m_FleetViews->raiseWidget(2);
436
437         }
438         else 
439         {
440                 if (fl->race() == m_FleetView->fleet()->race() &&
441                 m_FleetView->isHome() == home)
442                 {
443                         m_FleetView->viewFleet(fl, friendly);
444                 }
445                 else
446                 {
447                         m_FleetViews->removeWidget(m_FleetView);
448                         delete m_FleetView;
449                         m_FleetView = new FleetView(fl, friendly);
450                         connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
451                         m_FleetView->slotViewTickRange(m_iMinTick, m_iMaxTick);
452                         m_FleetView->slotSetResultMode(m_iResultMode);
453                         m_FleetViews->addWidget(m_FleetView, 1);
454                 }
455                 m_FleetViews->raiseWidget(2);
456                 m_FleetViews->raiseWidget(1);
457         }
458 }
459
460 //////////////////////////////////////////////////////////////////////////
461 //
462 void BSView::slotTickChanged(int min, int max)
463 {
464         m_FleetView->slotViewTickRange(min, max);
465         m_GenericFleetView->slotViewTickRange(min, max);
466
467         m_iMinTick = min;
468         m_iMaxTick = max;
469 }
470
471 //////////////////////////////////////////////////////////////////////////
472 //
473 void BSView::slotResultModeChanged( int i)
474 {
475         m_FleetView->slotSetResultMode(i);
476         m_GenericFleetView->slotSetResultMode(i);
477         
478         m_iResultMode = i;
479 }
480
481 //////////////////////////////////////////////////////////////////////////
482 //
483 void BSView::slotUseScan(int action, QString text, int fleets)
484 {
485         cerr << "Action: " << action << endl;
486         cerr << "Text: " << text.latin1() << endl;
487         cerr << "Fleets: " << fleets << endl;
488 }
489
490
491 //////////////////////////////////////////////////////////////////////////
492 //
493 void BSView::slotGenerateReport()
494 {
495         const Fleet *fl = m_doc->specificFleet(m_sBattle, "Friendly", "Home Planet");
496         
497         const Planet* pl = dynamic_cast<const Planet*>(fl);
498         if (pl)
499         {
500                 cerr << "generating....." << endl;
501                 ReportList report = pl->report();
502                 QString t;
503                 
504                 t.append("<qt>\n");
505                 
506
507                 for (ReportList::iterator i = report.begin(); i != report.end(); ++i)
508                 {
509                         t.append(QString("Tick number: %0\n").arg(i->first));
510                         t.append("<ul>\n");
511                         for(map<int, map<string, map<string, map<string, int> > > >::iterator j = i->second.begin(); j != i->second.end(); ++j)
512                         {
513                                 t.append(QString("<li>Now handling initiative: %0\n").arg(j->first));
514                                 t.append("<ul type=circle>\n");
515
516                                 for(map<string, map<string, map<string, int> > >::iterator k = j->second.begin(); k != j->second.end(); ++k)
517                                 {
518                                         for(map<string, map<string, int> >::iterator l = k->second.begin(); l != k->second.end(); ++l)
519                                         {
520                                                 QString color;
521                                                 if (k->first == "Friendly")
522                                                         color = "#46AA1B";
523                                                 if (k->first == "Hostile")
524                                                         color = "#FF0000";
525
526                                                 t.append(QString("<li><font color=\"%3\"> %0 %1 %2 killing/blocking at: </font> \n").arg(l->second["000"]).arg(k->first.c_str()).arg(l->first.c_str()).arg(color));
527                                                 t.append("<ul type=square>\n");
528
529                                                 for(map<string, int>::iterator m = l->second.begin(); m != l->second.end(); ++m)
530                                                 {
531                                                         if (m->first != "000")
532                                                                 t.append(QString("<li>%0 %1</li>").arg(m->second).arg(m->first.c_str()));
533                                                 }
534
535                                                 t.append("</ul>\n");
536                                                 t.append("</li>\n");
537                                         }
538                                 }
539                                 t.append("</ul>\n");
540                                 t.append("</li>\n");
541                         }
542                         t.append("</ul>\n");
543
544                         t.append("<hr>\n");
545                 }
546                 t.append("</qt>\n");
547                 //cerr << t.latin1();
548                 //m_Report->clear();
549                 m_Report->setText(t);
550
551         }
552         //m_Report->append("<b>test\n<b>");
553 }
554
555 //////////////////////////////////////////////////////////////////////////
556 //
557 void BSView::setCurrentListViewItem()
558 {
559         QListViewItemIterator i(m_NumberView);
560         while ( i.current() != 0)
561         {
562                 QListViewItem* lvi = i.current();
563                 if (lvi->parent() == '\0')
564                 {
565                         if (m_sFleet.isNull() && m_sGroup.isNull() && m_sBattle == lvi->text(0))
566                         {
567                                 m_NumberView->setCurrentItem(lvi);
568                                 return;
569                         }
570                 }
571                 else if (lvi->parent()->parent() == '\0')
572                 {
573                         if (m_sFleet.isNull() && m_sGroup == lvi->text(0) && m_sBattle == lvi->parent()->text(0))
574                         {
575                                 m_NumberView->setCurrentItem(lvi);
576                                 return;
577                         }
578                 }
579                 else 
580                 {
581                         if (m_sFleet == lvi->text(0) && m_sGroup == lvi->parent()->text(0) && m_sBattle == lvi->parent()->parent()->text(0))
582                         {
583                                 m_NumberView->setCurrentItem(lvi);
584                                 return;
585                         }
586                 }
587                 ++i;    
588         }
589         m_NumberView->setCurrentItem(m_NumberView->firstChild());
590 }