]> ruin.nu Git - hbs.git/blobdiff - bs/bsview.cpp
adding, removing and chaning fleets now works.
[hbs.git] / bs / bsview.cpp
index 4f050c03601967fa42c1eb43a362dc8d84c220cb..c050952c291c942b45b733f80af97bb1ab70f297 100644 (file)
@@ -33,13 +33,16 @@ using namespace std;
 #include "scanview.h"
 #include "ui/infoview.h"
 #include "tickview.h"
-#include "ui/fleetviewbase.h"
+#include "fleetview.h"
 #include "fleet.h"
+#include "planet.h"
 
 BSView::BSView(QWidget *parent, BSDoc *doc) : QSplitter(parent)
 {
   /** connect doc with the view*/
-  connect(doc, SIGNAL(documentChanged()), this, SLOT(slotDocumentChanged()));
+       
+       m_bMoreDocChanges = false;
+       connect(doc, SIGNAL(documentChanged()), this, SLOT(slotDocumentChanged()));
        
        m_doc = doc;
        
@@ -52,23 +55,51 @@ BSView::BSView(QWidget *parent, BSDoc *doc) : QSplitter(parent)
        m_NumberView->addColumn("Name");
        m_NumberView->addColumn("Number");
        m_NumberView->addColumn("ETA");
+       m_NumberView->addColumn("Score");
        //addBattle("NO BATTLES");
 
+       
+       
+       connect(m_NumberView, SIGNAL(expanded(QListViewItem*)), SLOT(slotItemExpanded(QListViewItem*)));
+       connect(m_NumberView, SIGNAL(collapsed(QListViewItem*)), SLOT(slotItemCollapsed(QListViewItem*)));
+       
        m_InfoView = new InfoView(m_LeftSplit);
+
+       connect(m_InfoView,SIGNAL(add()),SLOT(slotInfoNew()));
+       connect(m_InfoView,SIGNAL(apply()),SLOT(slotInfoApply()));
+       connect(m_InfoView,SIGNAL(cancel()),SLOT(slotInfoCancel()));
+       connect(m_InfoView,SIGNAL(remove()),SLOT(slotInfoRemove()));
+
+       vector<QString> raceNames;
+       const map<string, vector<int> >& races = Fleet::Races();
+       for(map<string, vector<int> >::const_iterator i = races.begin(); i != races.end(); ++i)
+       {
+               raceNames.push_back(i->first.c_str());
+       }
+       m_InfoView->setRaces(raceNames);
        
        //the right side
        m_TickView = new TickView(m_RightSplit);
        m_FleetViews = new QWidgetStack(m_RightSplit);
        m_ScanView = new ScanView(m_RightSplit);
        
+       Fleet fl1;
+       //fl1.setRace(tr("Terran").latin1());
+       fl1.setRace("Terran");
+       Fleet fl2;
+       fl2.setRace(tr("Generic").latin1());
+
        //the widget stack
        m_BattleSum = new BattleSum();
        m_FleetViews->addWidget(m_BattleSum, 0);
-       m_FleetView = new FleetViewBase();
+       m_FleetView = new FleetView(&fl1, true);
        m_FleetViews->addWidget(m_FleetView, 1);
-
+       m_GenericFleetView = new FleetView(&fl2, true);
+       m_FleetViews->addWidget(m_GenericFleetView, 2);
        //m_FleetViews->raiseWidget(0);
-       connect(m_NumberView, SIGNAL(selectionChanged(QListViewItem *)), SLOT(slotFleetSelection(QListViewItem *))); 
+       connect(m_NumberView, SIGNAL(selectionChanged(QListViewItem *)), SLOT(slotFleetSelection(QListViewItem *)));
+       connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
+       connect(m_GenericFleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
 }
 
 BSView::~BSView()
@@ -92,40 +123,56 @@ void BSView::addBattle(QString name)
  */
 void BSView::slotDocumentChanged()
 {
+       if (m_bMoreDocChanges)
+               return;
+
        m_NumberView->clear();
        
-       map<QString, map<QString, map<QString, Fleet> > >& battles = m_doc->Battles();  
+       const BattleList& battles = m_doc->battles();   
+
+       vector<QString> battlenames;
 
-       for (map<QString, map<QString, map<QString, Fleet> > >::iterator i = battles.begin(); i != battles.end(); i++)
+       for (BattleList::const_iterator i = battles.begin(); i != battles.end(); ++i)
        {
                QString b = (*i).first;
+               battlenames.push_back(i->first);
                QListViewItem* battle = new QListViewItem(m_NumberView, b);
+               battle->setOpen(m_TreeExpanded[b]["--"]);
+                       
 
-               for (map<QString, map<QString, Fleet> >::iterator j = battles[b].begin(); j != battles[b].end(); j++)
+               for (map<QString, map<QString, Fleet*> >::const_iterator j = i->second.begin(); j != i->second.end(); ++j)
                {
                        QString g = (*j).first;
                        QListViewItem* group = new QListViewItem(battle, g);
                        int groupShips = 0;
+                       unsigned groupScore = 0;
+                       group->setOpen(m_TreeExpanded[b][g]);
 
-                       for (map<QString, Fleet>::iterator k = battles[b][g].begin(); k != battles[b][g].end(); k++)
+                       for (map<QString, Fleet*>::const_iterator k = j->second.begin(); k != j->second.end(); ++k)
                        {       
-                               int ships = battles[b][g][(*k).first].NumberOfShips();
+                               int ships = k->second->numberOfShips();
+                               unsigned score = k->second->score();
                                groupShips += ships;
-                               (void) new QListViewItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(battles[b][g][(*k).first].ETA()));
+                               groupScore += score;
+                               //if(k->first == tr("Home Planet"))
+                                       (void) new QListViewItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(k->second->ETA()), QString("%1").arg(score));
+                               /*else
+                                       (void) new QCheckListItem(group, (*k).first, QString("%1").arg(ships), QString("%1").arg(k->second->ETA()), QString("%1").arg(score), QCheckListItem::CheckBox);*/
+
                        }
                        group->setText(1, QString("%1").arg(groupShips));
+                       group->setText(3, QString("%1").arg(groupScore));
                }
        }
+       m_InfoView->setBattles(battlenames);
+       updateInfoView();
+       updateFleetView();
 }
 
 //////////////////////////////////////////////////////////////////////////////
 //
 void BSView::slotFleetSelection(QListViewItem *lvi)
 {
-       //cout << lvi->parent()->text(2).toLocal8bit() << endl;
-//     for (int i = 0; i < 5; i++)
-//             cout << lvi->text(i).local8Bit() << endl;
-       
 
        if (lvi->parent() == '\0')
        {
@@ -133,37 +180,228 @@ void BSView::slotFleetSelection(QListViewItem *lvi)
        }
        else if (lvi->parent()->parent() == '\0')
        {
-                       m_FleetView->slotHomePlanet(false);
                if (lvi->text(0) == tr("Friendly"))
                {
-                       m_FleetView->slotAttacker(false);
+//                     m_FleetView->slotAttacker(false);
                }
                else
                {
-                       m_FleetView->slotAttacker(true);
+//                     m_FleetView->slotAttacker(true);
                }
-               m_FleetViews->raiseWidget(1);
+               m_FleetViews->raiseWidget(2);
+               
+       }
+       else
+       {
+               m_sFleet = lvi->text(0);
+               m_sGroup = lvi->parent()->text(0);
+               m_sBattle = lvi->parent()->parent()->text(0);
+
+               updateInfoView();
+               updateFleetView();
+       }
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+void BSView::slotItemExpanded(QListViewItem *lvi)
+{
+       if (lvi->parent() == '\0')
+       {
+               m_TreeExpanded[lvi->text(0)]["--"] = true;
+       }
+       else if (lvi->parent()->parent() == '\0')
+       {
+               m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = true;    
+       }
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+void BSView::slotItemCollapsed(QListViewItem *lvi)
+{
+       if (lvi->parent() == '\0')
+       {
+               m_TreeExpanded[lvi->text(0)]["--"] = false;
+       }
+       else if (lvi->parent()->parent() == '\0')
+       {
+               m_TreeExpanded[lvi->parent()->text(0)][lvi->text(0)] = false;   
+       }
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+void BSView::slotFleetChanged(const Fleet* fleet)
+{
+       m_doc->changeFleet(m_sBattle, m_sGroup, m_sFleet, fleet);
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+void BSView::slotInfoApply()
+{
+       QString battle = m_InfoView->battle();
+       QString group  = m_InfoView->group();
+       QString fleet  = m_InfoView->fleetName();
+
+
+       
+       const Fleet* old = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
+
+       const Planet* oldpl = dynamic_cast<const Planet*>(old);
+
+       Fleet* fl;
+       if(oldpl)
+               fl = new Planet(*oldpl);
+       else
+               fl = new Fleet(*old);
+
+       
                
+       m_bMoreDocChanges = true;
+       m_doc->removeFleet(m_sBattle, m_sGroup, m_sFleet);
+       m_bMoreDocChanges = false;
+
+       m_sBattle = battle;
+       m_sGroup = group;
+       m_sFleet = fleet;
+
+
+       fl->setETA(m_InfoView->eta());
+       fl->setName(m_sFleet.latin1());
+       fl->setRace(m_InfoView->race().latin1());
+       
+       m_doc->newFleet(m_sBattle, m_sGroup, m_sFleet, fl);
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+void BSView::slotInfoCancel()
+{
+       updateInfoView();
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+void BSView::slotInfoNew()
+{
+
+       QString battle = m_InfoView->battle();
+       QString group  = m_InfoView->group();
+       QString fleet  = m_InfoView->fleetName();
+
+       const Fleet* fl1 = m_doc->specificFleet(battle, group, fleet);
+       if (fl1)
+       {
+               //fleet does already exist, do not overwrite.
+               //Need something else here....
+               return;
+       }
+
+       
+       
+       Fleet* fl = new Fleet();
+
+       m_sBattle = battle;
+       m_sGroup = group;
+       m_sFleet = fleet;
+
+       fl->setETA(m_InfoView->eta());
+       fl->setName(m_sFleet.latin1());
+       fl->setRace(m_InfoView->race().latin1());
+
+       m_doc->newFleet(m_sBattle, m_sGroup, m_sFleet, fl);
+
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+void BSView::slotInfoRemove()
+{
+       m_doc->removeFleet(m_sBattle, m_sGroup, m_sFleet);
+       m_sFleet = "";
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+void BSView::updateInfoView()
+{
+       const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
+
+       if(!fl)
+       {
+               m_InfoView->setFleetName("");
+               m_InfoView->setEta(0);
+               m_InfoView->enableNameChange(true);
+               m_InfoView->enableRemove(false);
+               return;
+       }
+       m_InfoView->setGroup(m_sGroup);
+       m_InfoView->setBattle(m_sBattle);
+
+/*     NO LONGER NEEDED SINCE IT'S INTEGRATED IN THE InfoView CLASS
+ *     if(m_sFleet == tr("Home Planet") && m_sGroup == tr("Friendly"))
+       {
+               //m_InfoView->enableNameChange(false);
+               //m_InfoView->enableRemove(false);
        }
        else
        {
-               if (lvi->parent()->text(0) == tr("Friendly"))
+               m_InfoView->enableNameChange(true);
+               m_InfoView->enableRemove(true);
+       }
+*/
+
+       m_InfoView->setRace(fl->race().c_str());
+       m_InfoView->setFleetName(m_sFleet);
+       m_InfoView->setEta(fl->ETA());
+       m_InfoView->setGroup(m_sGroup);
+       m_InfoView->setBattle(m_sBattle);
+}
+
+//////////////////////////////////////////////////////////////////////////
+//
+void BSView::updateFleetView()
+{
+       bool friendly = false;
+       bool home       = false;
+
+       const Fleet* fl = m_doc->specificFleet(m_sBattle, m_sGroup, m_sFleet);
+
+       if (!fl)
+       {
+               m_FleetViews->raiseWidget(2);
+               return;
+       }
+
+       if ( m_sGroup == tr("Friendly"))
+       {
+                       friendly = true;
+                       if(m_sFleet == tr("Home Planet"))
+                               home=true;
+       }
+       if (fl->race() == tr("Generic").latin1())
+       {
+               m_GenericFleetView->viewFleet(fl, friendly);
+               m_FleetViews->raiseWidget(2);
+
+       }
+       else 
+       {
+               if (fl->race() == m_FleetView->fleet()->race() &&
+               m_FleetView->isHome() == home)
                {
-                       m_FleetView->slotAttacker(false);
-                       m_FleetView->slotHomePlanet(false);
-                       if (lvi->text(0) == tr("Home Planet"))
-                       {
-                               m_FleetView->slotHomePlanet(true);
-                       }
+                       m_FleetView->viewFleet(fl, friendly);
                }
                else
                {
-                       m_FleetView->slotAttacker(true);
-                       m_FleetView->slotHomePlanet(false);
+                       m_FleetViews->removeWidget(m_FleetView);
+                       delete m_FleetView;
+                       m_FleetView = new FleetView(fl, friendly);
+                       connect(m_FleetView, SIGNAL(fleetChanged(const Fleet*)), SLOT(slotFleetChanged(const Fleet*)));
+                       m_FleetViews->addWidget(m_FleetView, 1);
                }
                m_FleetViews->raiseWidget(1);
-                               
        }
-
-       
 }