flagrowobj.cpp
author insilmaril
Thu May 07 08:48:53 2009 +0000 (2009-05-07)
changeset 766 7a71a914afdb
parent 754 db0ec4bcf416
child 767 6d2b32f305f9
permissions -rw-r--r--
Started to reanimate flags
insilmaril@766
     1
#include <QToolBar>
insilmaril@766
     2
insilmaril@766
     3
#include <iostream>
insilmaril@766
     4
using namespace std;
insilmaril@766
     5
insilmaril@0
     6
#include "flagrowobj.h"
insilmaril@766
     7
insilmaril@644
     8
#include "geometry.h"
insilmaril@0
     9
insilmaril@0
    10
/////////////////////////////////////////////////////////////////
insilmaril@0
    11
// FlagRowObj
insilmaril@0
    12
/////////////////////////////////////////////////////////////////
insilmaril@0
    13
FlagRowObj::FlagRowObj()
insilmaril@0
    14
{
insilmaril@166
    15
//    cout << "Const FlagRowObj ()\n";
insilmaril@0
    16
    init ();
insilmaril@0
    17
}
insilmaril@0
    18
insilmaril@408
    19
FlagRowObj::FlagRowObj(QGraphicsScene* s):MapObj(s) 
insilmaril@0
    20
{
insilmaril@408
    21
//    cout << "Const FlagRowObj (s)\n";
insilmaril@0
    22
    init ();
insilmaril@0
    23
}
insilmaril@0
    24
insilmaril@0
    25
FlagRowObj::~FlagRowObj()
insilmaril@0
    26
{
insilmaril@425
    27
	//cout << "Destr FlagRowObj\n";
insilmaril@406
    28
	while (!flag.isEmpty())
insilmaril@425
    29
		delete (flag.takeFirst() );
insilmaril@0
    30
}
insilmaril@0
    31
insilmaril@0
    32
void FlagRowObj::init ()
insilmaril@0
    33
{
insilmaril@0
    34
	parentRow=NULL;
insilmaril@256
    35
	showFlags=true;
insilmaril@0
    36
}
insilmaril@0
    37
insilmaril@0
    38
void FlagRowObj::copy (FlagRowObj* other)
insilmaril@0
    39
{
insilmaril@0
    40
    MapObj::copy(other);
insilmaril@0
    41
	parentRow=other->parentRow;
insilmaril@0
    42
	flag.clear();
insilmaril@406
    43
	for (int i=0; i<flag.size(); ++i)
insilmaril@406
    44
		addFlag (flag.at(i));
insilmaril@0
    45
}
insilmaril@0
    46
insilmaril@0
    47
void FlagRowObj::clone (FlagRowObj* pr)
insilmaril@0
    48
{
insilmaril@0
    49
	// Difference to copy:
insilmaril@0
    50
	// We don't copy the flags here, they
insilmaril@0
    51
	// are created on the fly by toggle and activate
insilmaril@0
    52
	// This saves lots of canvas objects.
insilmaril@0
    53
	MapObj::copy(pr);
insilmaril@0
    54
	flag.clear();
insilmaril@0
    55
	parentRow=pr;
insilmaril@0
    56
}
insilmaril@0
    57
insilmaril@0
    58
void FlagRowObj::move(double x, double y)
insilmaril@0
    59
{
insilmaril@0
    60
    MapObj::move(x,y);
insilmaril@408
    61
	qreal dx=0;
insilmaril@406
    62
	for (int i=0; i<flag.size(); ++i)
insilmaril@0
    63
	{
insilmaril@406
    64
		flag.at(i)->move(x+dx,y);
insilmaril@408
    65
		dx+=QSizeF(flag.at(i)->getSize() ).width();
insilmaril@0
    66
	}
insilmaril@0
    67
}
insilmaril@0
    68
insilmaril@0
    69
void FlagRowObj::moveBy(double x, double y)
insilmaril@0
    70
{
insilmaril@0
    71
    move (x+absPos.x(),y+absPos.y() );
insilmaril@0
    72
}
insilmaril@0
    73
insilmaril@0
    74
void FlagRowObj::setVisibility (bool v)
insilmaril@0
    75
{
insilmaril@0
    76
	MapObj::setVisibility(v);
insilmaril@406
    77
	for (int i=0; i<flag.size(); ++i)
insilmaril@406
    78
		flag.at(i)->setVisibility (v);
insilmaril@0
    79
}
insilmaril@0
    80
insilmaril@0
    81
FlagObj* FlagRowObj::addFlag (FlagObj *fo)
insilmaril@0
    82
{
insilmaril@408
    83
	FlagObj *newfo=new FlagObj (scene);
insilmaril@408
    84
	newfo->copy (fo);	// create a deep copy of fo
insilmaril@0
    85
	newfo->move (absPos.x() + bbox.width(), absPos.y() );
insilmaril@0
    86
	flag.append(newfo);
insilmaril@0
    87
	calcBBoxSize();
insilmaril@0
    88
	positionBBox();
insilmaril@0
    89
	return newfo;
insilmaril@0
    90
}
insilmaril@0
    91
insilmaril@0
    92
void FlagRowObj::positionBBox()
insilmaril@0
    93
{
insilmaril@173
    94
    bbox.moveTopLeft(absPos );
insilmaril@173
    95
    clickBox.moveTopLeft(absPos );
insilmaril@0
    96
}
insilmaril@0
    97
insilmaril@0
    98
void FlagRowObj::calcBBoxSize()
insilmaril@0
    99
{
insilmaril@408
   100
	QSizeF size(0,0);
insilmaril@408
   101
	QSizeF boxsize(0,0);
insilmaril@406
   102
	for (int i=0; i<flag.size(); ++i)
insilmaril@0
   103
	{
insilmaril@406
   104
		size=flag.at(i)->getSize();
insilmaril@0
   105
		// add widths
insilmaril@0
   106
		boxsize.setWidth(boxsize.width() + size.width() );
insilmaril@0
   107
		// maximize height
insilmaril@0
   108
		if (size.height() > boxsize.height() ) 
insilmaril@0
   109
			boxsize.setHeight(size.height() );
insilmaril@0
   110
	}
insilmaril@173
   111
	bbox.setSize (boxsize);
insilmaril@173
   112
	clickBox.setSize (boxsize);
insilmaril@0
   113
}
insilmaril@0
   114
insilmaril@408
   115
QString FlagRowObj::getFlagName (const QPointF &p)
insilmaril@0
   116
{
insilmaril@754
   117
	if (!isInBox (p,clickBox)) return "";
insilmaril@406
   118
	for (int i=0; i<flag.size(); ++i)
insilmaril@754
   119
		if (isInBox (p,flag.at(i)->getClickBox ())) return flag.at(i)->getName();
insilmaril@0
   120
	return "";	
insilmaril@0
   121
insilmaril@0
   122
	
insilmaril@0
   123
}
insilmaril@0
   124
insilmaril@0
   125
bool FlagRowObj::isActive (const QString &foname)
insilmaril@0
   126
{
insilmaril@0
   127
	FlagObj *fo=findFlag (foname);
insilmaril@236
   128
	if (parentRow && fo)
insilmaril@236
   129
		return fo->isActive();
insilmaril@236
   130
	else
insilmaril@0
   131
		if (fo) return true;
insilmaril@0
   132
	return false;
insilmaril@0
   133
}
insilmaril@0
   134
insilmaril@766
   135
void FlagRowObj::toggle (const QString &foname)
insilmaril@0
   136
{
insilmaril@0
   137
	FlagObj *fo=findFlag (foname);
insilmaril@0
   138
	if (fo)
insilmaril@0
   139
	{
insilmaril@0
   140
		// FlagObj is here, it will be active, too.
insilmaril@0
   141
		// Deactivate it by removing it from this row.
insilmaril@0
   142
		flag.remove (fo);
insilmaril@408
   143
		delete (fo);
insilmaril@0
   144
	} else
insilmaril@0
   145
	{
insilmaril@0
   146
		// FlagObj is not present in this row.
insilmaril@0
   147
		// Copy it from parentRow
insilmaril@0
   148
		fo=parentRow->findFlag (foname);
insilmaril@0
   149
		if (fo)
insilmaril@0
   150
		{
insilmaril@0
   151
			fo=addFlag (fo);
insilmaril@0
   152
			fo->activate();
insilmaril@766
   153
			/*FIXME-0 move to VM if (exclusive) 
insilmaril@103
   154
			{
insilmaril@103
   155
				deactivateGroup (fo);
insilmaril@103
   156
				updateToolbar();
insilmaril@103
   157
			}
insilmaril@766
   158
			*/
insilmaril@0
   159
		} else
insilmaril@0
   160
			qWarning ("FlagRowObj ("+name+")::toggle ("+foname+")  failed - could not find it in parentRow");
insilmaril@0
   161
	}	
insilmaril@0
   162
	calcBBoxSize();
insilmaril@0
   163
	positionBBox();	
insilmaril@0
   164
}
insilmaril@0
   165
insilmaril@0
   166
void FlagRowObj::activate (const QString &foname)
insilmaril@0
   167
{
insilmaril@766
   168
	cout << "FRO::activate  "<<foname.toStdString()<<endl;
insilmaril@311
   169
	// Note: "activate" is also called during loading of a map
insilmaril@311
   170
	// Here we do not check for exclusive flags!
insilmaril@0
   171
	FlagObj *fo=findFlag (foname);
insilmaril@0
   172
	if (parentRow)
insilmaril@0
   173
	{
insilmaril@0
   174
		if (!fo)
insilmaril@0
   175
		{
insilmaril@0
   176
			// FlagObj is not present in this row.
insilmaril@0
   177
			// Copy it from parentRow and activate there
insilmaril@0
   178
			fo=parentRow->findFlag (foname);
insilmaril@0
   179
			if (fo)
insilmaril@0
   180
			{
insilmaril@0
   181
				fo=addFlag (fo);
insilmaril@0
   182
				fo->activate();
insilmaril@256
   183
				if (showFlags) 
insilmaril@256
   184
					fo->setVisibility (visible);
insilmaril@256
   185
				else
insilmaril@256
   186
					fo->setVisibility (false);
insilmaril@0
   187
				calcBBoxSize();
insilmaril@0
   188
			} else
insilmaril@0
   189
				qWarning ("FlagRowObj ("+name+")::activate ("+foname+")  failed - could not find it in parentRow");
insilmaril@0
   190
		}	
insilmaril@0
   191
	} else
insilmaril@0
   192
	{
insilmaril@0
   193
		// I am the parentRow, mark flag as used
insilmaril@0
   194
		if (fo)
insilmaril@0
   195
		{
insilmaril@0
   196
			fo->setUsed(true);
insilmaril@0
   197
			fo->activate();
insilmaril@0
   198
		}	
insilmaril@0
   199
		else
insilmaril@0
   200
			qWarning ("FlagRowObj::activate no FlagObj \""+foname+"\" found in parentRow");
insilmaril@0
   201
	}
insilmaril@0
   202
}
insilmaril@0
   203
insilmaril@103
   204
insilmaril@0
   205
void FlagRowObj::deactivate (const QString &foname)
insilmaril@0
   206
{
insilmaril@0
   207
	FlagObj *fo=findFlag (foname);
insilmaril@408
   208
	if (fo) 
insilmaril@408
   209
	{
insilmaril@408
   210
		flag.remove(fo);
insilmaril@408
   211
		delete (fo);
insilmaril@408
   212
	}	
insilmaril@0
   213
	calcBBoxSize();
insilmaril@0
   214
	positionBBox();
insilmaril@0
   215
}
insilmaril@0
   216
insilmaril@0
   217
void FlagRowObj::deactivateAll ()
insilmaril@0
   218
{
insilmaril@0
   219
	if (!parentRow)
insilmaril@0
   220
	{
insilmaril@406
   221
		for (int i=0; i<flag.size(); ++i)
insilmaril@408
   222
			if (flag.at(i)->isActive()) flag.at(i)->deactivate();
insilmaril@0
   223
	} else
insilmaril@446
   224
	{
insilmaril@446
   225
		while (!flag.isEmpty())
insilmaril@446
   226
			delete flag.takeFirst();
insilmaril@446
   227
		calcBBoxSize();
insilmaril@446
   228
		positionBBox();
insilmaril@446
   229
	}
insilmaril@0
   230
}
insilmaril@0
   231
insilmaril@766
   232
void FlagRowObj::deactivateGroup (FlagObj *keepfo)	//FIXME-0 move to VM
insilmaril@103
   233
{
insilmaril@103
   234
	// deactivate all flags in keepof, but keep keepfo [sic!]
insilmaril@103
   235
	if (keepfo)
insilmaril@103
   236
	{
insilmaril@311
   237
		QString g=keepfo->getGroup();
insilmaril@311
   238
		if (g!="undefined")
insilmaril@311
   239
		{
insilmaril@406
   240
			for (int i=0; i<flag.size(); ++i)
insilmaril@406
   241
				if (g==flag.at(i)->getGroup() && keepfo!=flag.at(i)) 
insilmaril@408
   242
				{
insilmaril@411
   243
					FlagObj *fo=flag.at(i);
insilmaril@411
   244
					flag.remove (fo);
insilmaril@411
   245
					delete (fo);
insilmaril@408
   246
				}	
insilmaril@311
   247
		}		
insilmaril@103
   248
	}	
insilmaril@103
   249
}
insilmaril@103
   250
insilmaril@366
   251
void FlagRowObj::setToolBar(QToolBar *tb)
insilmaril@366
   252
{
insilmaril@366
   253
	toolbar=tb;
insilmaril@366
   254
}
insilmaril@366
   255
insilmaril@0
   256
void FlagRowObj::setEnabled (bool b)
insilmaril@0
   257
{
insilmaril@366
   258
	if (toolbar)
insilmaril@0
   259
	{
insilmaril@366
   260
		toolbar->setEnabled (b);
insilmaril@0
   261
	}
insilmaril@0
   262
}
insilmaril@0
   263
insilmaril@256
   264
void FlagRowObj::setShowFlags (bool b)
insilmaril@256
   265
{
insilmaril@256
   266
	showFlags=b;
insilmaril@256
   267
}
insilmaril@256
   268
insilmaril@0
   269
void FlagRowObj::resetUsedCounter()
insilmaril@0
   270
{
insilmaril@406
   271
	for (int i=0; i<flag.size(); ++i)
insilmaril@406
   272
		flag.at(i)->setUsed (false);
insilmaril@0
   273
}
insilmaril@0
   274
insilmaril@0
   275
QString FlagRowObj::saveToDir (const QString &tmpdir,const QString &prefix, bool writeflags)
insilmaril@0
   276
{
insilmaril@0
   277
	// Build xml string
insilmaril@0
   278
	QString s;
insilmaril@0
   279
	if (parentRow)
insilmaril@406
   280
		for (int i=0; i<flag.size(); ++i)
insilmaril@0
   281
		{
insilmaril@0
   282
			// save flag to xml, if flag is set 
insilmaril@406
   283
			s+=valueElement("standardflag",flag.at(i)->getName() );
insilmaril@0
   284
insilmaril@0
   285
			// and tell parentRow, that this flag is used
insilmaril@406
   286
			parentRow->activate(flag.at(i)->getName() );
insilmaril@0
   287
		}	
insilmaril@0
   288
	else
insilmaril@0
   289
		// Save icons to dir, if verbose is set (xml export)
insilmaril@0
   290
		// and I am a parentRow 
insilmaril@0
   291
		// and this flag is really used somewhere
insilmaril@0
   292
		if (writeflags)
insilmaril@406
   293
			for (int i=0; i<flag.size(); ++i)
insilmaril@406
   294
				if (flag.at(i)->isUsed()) flag.at(i)->saveToDir (tmpdir,prefix);
insilmaril@0
   295
	return s;		
insilmaril@0
   296
insilmaril@0
   297
}
insilmaril@0
   298
insilmaril@0
   299
void FlagRowObj::setName (const QString &n)
insilmaril@0
   300
{
insilmaril@0
   301
	name=n;
insilmaril@0
   302
}
insilmaril@0
   303
insilmaril@746
   304
void  FlagRowObj::updateToolbar()	//FIXME-2 this needs to be changed with VM
insilmaril@0
   305
{
insilmaril@0
   306
	if (parentRow)
insilmaril@0
   307
	{
insilmaril@0
   308
		// We are just a branch, not the toolbar default
insilmaril@366
   309
		// but state has to be copied from ourselves to parentrow!
insilmaril@0
   310
		parentRow->deactivateAll();
insilmaril@0
   311
		// In parentRow activate all existing (==active) flags
insilmaril@406
   312
		for (int i=0; i<flag.size(); ++i)
insilmaril@406
   313
			parentRow->activate(flag.at(i)->getName());
insilmaril@103
   314
		parentRow->updateToolbar();	
insilmaril@0
   315
	} else
insilmaril@0
   316
	{
insilmaril@0
   317
		// We are the toolbar default
insilmaril@366
   318
		if (toolbar)
insilmaril@366
   319
		{
insilmaril@366
   320
			// Update state of actions in toolbar
insilmaril@406
   321
			for (int i=0; i<flag.size(); ++i)
insilmaril@406
   322
				flag.at(i)->updateAction();
insilmaril@366
   323
		}	
insilmaril@0
   324
	}
insilmaril@0
   325
}
insilmaril@0
   326
insilmaril@0
   327
FlagObj* FlagRowObj::findFlag (const QString &name)
insilmaril@0
   328
{
insilmaril@406
   329
	for (int i=0; i<flag.size(); ++i)
insilmaril@406
   330
		if (flag.at(i)->getName()==name) return flag.at(i);
insilmaril@0
   331
	return NULL;
insilmaril@0
   332
}
insilmaril@0
   333