initial import
[vym] / flagrowobj.cpp
diff --git a/flagrowobj.cpp b/flagrowobj.cpp
new file mode 100644 (file)
index 0000000..d481b88
--- /dev/null
@@ -0,0 +1,327 @@
+#include "flagrowobj.h"
+#include "geometry.h"
+
+#include <QToolBar>
+
+/////////////////////////////////////////////////////////////////
+// FlagRowObj
+/////////////////////////////////////////////////////////////////
+FlagRowObj::FlagRowObj()
+{
+//    cout << "Const FlagRowObj ()\n";
+    init ();
+}
+
+FlagRowObj::FlagRowObj(QGraphicsScene* s):MapObj(s) 
+{
+//    cout << "Const FlagRowObj (s)\n";
+    init ();
+}
+
+FlagRowObj::~FlagRowObj()
+{
+       //cout << "Destr FlagRowObj\n";
+       while (!flag.isEmpty())
+               delete (flag.takeFirst() );
+}
+
+void FlagRowObj::init ()
+{
+       parentRow=NULL;
+       showFlags=true;
+}
+
+void FlagRowObj::copy (FlagRowObj* other)
+{
+    MapObj::copy(other);
+       parentRow=other->parentRow;
+       flag.clear();
+       for (int i=0; i<flag.size(); ++i)
+               addFlag (flag.at(i));
+}
+
+void FlagRowObj::clone (FlagRowObj* pr)
+{
+       // Difference to copy:
+       // We don't copy the flags here, they
+       // are created on the fly by toggle and activate
+       // This saves lots of canvas objects.
+       MapObj::copy(pr);
+       flag.clear();
+       parentRow=pr;
+}
+
+void FlagRowObj::move(double x, double y)
+{
+    MapObj::move(x,y);
+       qreal dx=0;
+       for (int i=0; i<flag.size(); ++i)
+       {
+               flag.at(i)->move(x+dx,y);
+               dx+=QSizeF(flag.at(i)->getSize() ).width();
+       }
+}
+
+void FlagRowObj::moveBy(double x, double y)
+{
+    move (x+absPos.x(),y+absPos.y() );
+}
+
+void FlagRowObj::setVisibility (bool v)
+{
+       MapObj::setVisibility(v);
+       for (int i=0; i<flag.size(); ++i)
+               flag.at(i)->setVisibility (v);
+}
+
+FlagObj* FlagRowObj::addFlag (FlagObj *fo)
+{
+       FlagObj *newfo=new FlagObj (scene);
+       newfo->copy (fo);       // create a deep copy of fo
+       newfo->move (absPos.x() + bbox.width(), absPos.y() );
+       flag.append(newfo);
+       calcBBoxSize();
+       positionBBox();
+       return newfo;
+}
+
+void FlagRowObj::positionBBox()
+{
+    bbox.moveTopLeft(absPos );
+    clickBox.moveTopLeft(absPos );
+}
+
+void FlagRowObj::calcBBoxSize()
+{
+       QSizeF size(0,0);
+       QSizeF boxsize(0,0);
+       for (int i=0; i<flag.size(); ++i)
+       {
+               size=flag.at(i)->getSize();
+               // add widths
+               boxsize.setWidth(boxsize.width() + size.width() );
+               // maximize height
+               if (size.height() > boxsize.height() ) 
+                       boxsize.setHeight(size.height() );
+       }
+       bbox.setSize (boxsize);
+       clickBox.setSize (boxsize);
+}
+
+QString FlagRowObj::getFlagName (const QPointF &p)
+{
+       if (!inBox (p,clickBox)) return "";
+       for (int i=0; i<flag.size(); ++i)
+               if (inBox (p,flag.at(i)->getClickBox ())) return flag.at(i)->getName();
+       return "";      
+
+       
+}
+
+bool FlagRowObj::isActive (const QString &foname)
+{
+       FlagObj *fo=findFlag (foname);
+       if (parentRow && fo)
+               return fo->isActive();
+       else
+               if (fo) return true;
+       return false;
+}
+
+void FlagRowObj::toggle (const QString &foname, bool exclusive)
+{
+       FlagObj *fo=findFlag (foname);
+       if (fo)
+       {
+               // FlagObj is here, it will be active, too.
+               // Deactivate it by removing it from this row.
+               flag.remove (fo);
+               delete (fo);
+       } else
+       {
+               // FlagObj is not present in this row.
+               // Copy it from parentRow
+               fo=parentRow->findFlag (foname);
+               if (fo)
+               {
+                       fo=addFlag (fo);
+                       fo->activate();
+                       if (exclusive) 
+                       {
+                               deactivateGroup (fo);
+                               updateToolbar();
+                       }
+               } else
+                       qWarning ("FlagRowObj ("+name+")::toggle ("+foname+")  failed - could not find it in parentRow");
+       }       
+       calcBBoxSize();
+       positionBBox(); 
+}
+
+void FlagRowObj::activate (const QString &foname)
+{
+       // Note: "activate" is also called during loading of a map
+       // Here we do not check for exclusive flags!
+       FlagObj *fo=findFlag (foname);
+       if (parentRow)
+       {
+               if (!fo)
+               {
+                       // FlagObj is not present in this row.
+                       // Copy it from parentRow and activate there
+                       fo=parentRow->findFlag (foname);
+                       if (fo)
+                       {
+                               fo=addFlag (fo);
+                               fo->activate();
+                               if (showFlags) 
+                                       fo->setVisibility (visible);
+                               else
+                                       fo->setVisibility (false);
+                               calcBBoxSize();
+                       } else
+                               qWarning ("FlagRowObj ("+name+")::activate ("+foname+")  failed - could not find it in parentRow");
+               }       
+       } else
+       {
+               // I am the parentRow, mark flag as used
+               if (fo)
+               {
+                       fo->setUsed(true);
+                       fo->activate();
+               }       
+               else
+                       qWarning ("FlagRowObj::activate no FlagObj \""+foname+"\" found in parentRow");
+       }
+}
+
+
+void FlagRowObj::deactivate (const QString &foname)
+{
+       FlagObj *fo=findFlag (foname);
+       if (fo) 
+       {
+               flag.remove(fo);
+               delete (fo);
+       }       
+       calcBBoxSize();
+       positionBBox();
+}
+
+void FlagRowObj::deactivateAll ()
+{
+       if (!parentRow)
+       {
+               for (int i=0; i<flag.size(); ++i)
+                       if (flag.at(i)->isActive()) flag.at(i)->deactivate();
+       } else
+       {
+               while (!flag.isEmpty())
+                       delete flag.takeFirst();
+               calcBBoxSize();
+               positionBBox();
+       }
+}
+
+void FlagRowObj::deactivateGroup (FlagObj *keepfo)
+{
+       // deactivate all flags in keepof, but keep keepfo [sic!]
+       if (keepfo)
+       {
+               QString g=keepfo->getGroup();
+               if (g!="undefined")
+               {
+                       for (int i=0; i<flag.size(); ++i)
+                               if (g==flag.at(i)->getGroup() && keepfo!=flag.at(i)) 
+                               {
+                                       FlagObj *fo=flag.at(i);
+                                       flag.remove (fo);
+                                       delete (fo);
+                               }       
+               }               
+       }       
+}
+
+void FlagRowObj::setToolBar(QToolBar *tb)
+{
+       toolbar=tb;
+}
+
+void FlagRowObj::setEnabled (bool b)
+{
+       if (toolbar)
+       {
+               toolbar->setEnabled (b);
+       }
+}
+
+void FlagRowObj::setShowFlags (bool b)
+{
+       showFlags=b;
+}
+
+void FlagRowObj::resetUsedCounter()
+{
+       for (int i=0; i<flag.size(); ++i)
+               flag.at(i)->setUsed (false);
+}
+
+QString FlagRowObj::saveToDir (const QString &tmpdir,const QString &prefix, bool writeflags)
+{
+       // Build xml string
+       QString s;
+       if (parentRow)
+               for (int i=0; i<flag.size(); ++i)
+               {
+                       // save flag to xml, if flag is set 
+                       s+=valueElement("standardflag",flag.at(i)->getName() );
+
+                       // and tell parentRow, that this flag is used
+                       parentRow->activate(flag.at(i)->getName() );
+               }       
+       else
+               // Save icons to dir, if verbose is set (xml export)
+               // and I am a parentRow 
+               // and this flag is really used somewhere
+               if (writeflags)
+                       for (int i=0; i<flag.size(); ++i)
+                               if (flag.at(i)->isUsed()) flag.at(i)->saveToDir (tmpdir,prefix);
+       return s;               
+
+}
+
+void FlagRowObj::setName (const QString &n)
+{
+       name=n;
+}
+
+void  FlagRowObj::updateToolbar()
+{
+       if (parentRow)
+       {
+               // We are just a branch, not the toolbar default
+               // but state has to be copied from ourselves to parentrow!
+               parentRow->deactivateAll();
+               // In parentRow activate all existing (==active) flags
+               for (int i=0; i<flag.size(); ++i)
+                       parentRow->activate(flag.at(i)->getName());
+               parentRow->updateToolbar();     
+       } else
+       {
+               // We are the toolbar default
+               if (toolbar)
+               {
+                       // Update state of actions in toolbar
+                       for (int i=0; i<flag.size(); ++i)
+                               flag.at(i)->updateAction();
+               }       
+       }
+}
+
+FlagObj* FlagRowObj::findFlag (const QString &name)
+{
+       for (int i=0; i<flag.size(); ++i)
+               if (flag.at(i)->getName()==name) return flag.at(i);
+       return NULL;
+}
+