File indexing completed on 2023-09-24 04:17:32
0001 /*************************************************************************** 0002 cmapzone.cpp 0003 ------------------- 0004 begin : Sat Mar 10 2001 0005 copyright : (C) 2001 by Kmud Developer Team 0006 email : kmud-devel@kmud.de 0007 ***************************************************************************/ 0008 0009 /*************************************************************************** 0010 * * 0011 * This program is free software; you can redistribute it and/or modify * 0012 * it under the terms of the GNU General Public License as published by * 0013 * the Free Software Foundation; either version 2 of the License, or * 0014 * (at your option) any later version. * 0015 * * 0016 ***************************************************************************/ 0017 0018 #include "cmapzone.h" 0019 0020 #include <klocale.h> 0021 0022 #include <qfontmetrics.h> 0023 0024 #include "cmapmanager.h" 0025 #include "cmaplevel.h" 0026 #include "cmaptext.h" 0027 #include "cmappath.h" 0028 #include "cmapelementutil.h" 0029 0030 #include <kdebug.h> 0031 0032 CMapZone::CMapZone(CMapManager *manager) : CMapElement(manager,QRect(-1,-1,0,0),nullptr) 0033 { 0034 label = i18n("Unnamed Zone"); 0035 m_room_id_count = 0; 0036 m_text_id_count = 0; 0037 manager->m_zoneCount ++; 0038 m_ID = manager->m_zoneCount; 0039 description = ""; 0040 0041 color = QColor(192,192,192); 0042 backgroundCol = QColor(192,192,192); 0043 useDefaultCol = true; 0044 useDefaultBackground = true; 0045 0046 textRemove(); 0047 0048 // Set the root zone if not already set 0049 if (!manager->getMapData()->rootZone) // can't use getZone() here, as we'd end up in a loop 0050 manager->getMapData()->rootZone = this; 0051 manager->createLevel(UP); 0052 } 0053 0054 CMapZone::~CMapZone() 0055 { 0056 //FIXME_jp : when this is undone there are extra levels, this needs fixing 0057 // Delete the levels in the zone 0058 while (levelCount()) { 0059 kWarning() << "deleteing a zone and found levels that should already have been deleted!!"; 0060 delete firstLevel(); 0061 } 0062 } 0063 0064 void CMapZone::setLevel(CMapLevel *level) 0065 { 0066 CMapElement::setLevel(level); 0067 } 0068 0069 0070 void CMapZone::setLabel(QString zoneLabel) 0071 { 0072 label = zoneLabel; 0073 } 0074 0075 void CMapZone::dragPaint(QPoint offset,QPainter *p,CMapZone *) 0076 { 0077 p->setPen(QColor(255, 255, 255, 128)); 0078 p->setBrush(QColor(0, 255, 255, 64)); 0079 p->drawRect(getX() + offset.x(),getY() + offset.y(),getWidth(),getHeight()); 0080 } 0081 0082 /** This is used to paint the sub boxes displayed when the element is painted */ 0083 void CMapZone::paintSubBox(QPainter *p,int x,int y,int width,int height) 0084 { 0085 QColor background; 0086 0087 if (getUseDefaultCol()) 0088 { 0089 background = getManager()->getMapData()->defaultZoneColor; 0090 } 0091 else 0092 { 0093 background = getColor(); 0094 } 0095 0096 p->setPen(Qt::white); 0097 p->drawLine(x,y,x+width,y); 0098 p->drawLine(x,y,x,y+height); 0099 p->setPen(Qt::black); 0100 p->drawLine(x+1,y+height,x+width,y+height); 0101 p->drawLine(x+width,y+1,x+width,y+height); 0102 0103 p->setBrush(background); 0104 p->setPen(background); 0105 0106 p->drawRect(x+1,y+1,width-1,height-1); 0107 } 0108 0109 /** Used to paint the element at a given location and size 0110 * @param p The painer to paint the element to 0111 * @param pos The position to paint the elmenet 0112 * @param size The size the element should be draw 0113 * @param zone The current zone being viewed */ 0114 void CMapZone::paintElementResize(QPainter *p,QPoint pos,QSize size,CMapZone *) 0115 { 0116 signed int y1,x1; 0117 0118 x1 = pos.x()+1; 0119 y1 = pos.y()+1; 0120 0121 int boxWidth = size.width()/2; 0122 int boxHeight = size.height()/2; 0123 int boxOffsetX = boxWidth/2-1; 0124 int boxOffsetY = boxHeight/2-1; 0125 boxWidth--; 0126 boxHeight--; 0127 0128 paintSubBox(p,x1,y1,boxWidth,boxHeight); 0129 paintSubBox(p,x1+boxOffsetX,y1+boxOffsetY,boxWidth,boxHeight); 0130 paintSubBox(p,x1+boxOffsetX+boxOffsetX,y1+boxOffsetY+boxOffsetY,boxWidth,boxHeight); 0131 } 0132 0133 void CMapZone::lowerPaint(QPainter *p,CMapZone *) 0134 { 0135 signed int y1,x1; 0136 0137 x1 = getX()+1-5; 0138 y1 = getY()+1-5; 0139 int boxWidth = getSize().width()/2; 0140 int boxHeight = getSize().height()/2; 0141 int boxOffsetX = boxWidth/2-1; 0142 int boxOffsetY = boxHeight/2-1; 0143 boxWidth--; 0144 boxHeight--; 0145 0146 p->setPen(getManager()->getMapData()->lowerZoneColor); 0147 QBrush brush(getManager()->getMapData()->lowerZoneColor); 0148 brush.setStyle(Qt::Dense3Pattern); 0149 p->setBrush(brush); 0150 p->drawRect(x1,y1,boxWidth,boxHeight); 0151 p->drawRect(x1+boxOffsetX,y1+boxOffsetY,boxWidth,boxHeight); 0152 p->drawRect(x1+boxOffsetX+boxOffsetX,y1+boxOffsetY+boxOffsetY,boxWidth,boxHeight); 0153 } 0154 0155 void CMapZone::higherPaint(QPainter *p,CMapZone *) 0156 { 0157 signed int y1,x1; 0158 0159 x1 = getX()+6; 0160 y1 = getY()+6; 0161 int boxWidth = getSize().width()/2; 0162 int boxHeight = getSize().height()/2; 0163 int boxOffsetX = boxWidth/2-1; 0164 int boxOffsetY = boxHeight/2-1; 0165 boxWidth--; 0166 boxHeight--; 0167 0168 p->setPen(getManager()->getMapData()->higherZoneColor); 0169 QBrush brush(getManager()->getMapData()->higherZoneColor); 0170 brush.setStyle(Qt::Dense3Pattern); 0171 p->setBrush(brush); 0172 p->drawRect(x1,y1,boxWidth,boxHeight); 0173 p->drawRect(x1+boxOffsetX,y1+boxOffsetY,boxWidth,boxHeight); 0174 p->drawRect(x1+boxOffsetX+boxOffsetX,y1+boxOffsetY+boxOffsetY,boxWidth,boxHeight); 0175 } 0176 0177 CMapElement *CMapZone::copy(void) 0178 { 0179 return nullptr; 0180 } 0181 0182 void CMapZone::setLabelPosition(labelPosTyp pos) 0183 { 0184 if (getLabel()=="") pos=HIDE; 0185 0186 if (pos!=HIDE) 0187 { 0188 labelPosition = pos; 0189 QPoint p; 0190 0191 QFont font; 0192 font = kapp->font(); 0193 0194 QFontMetrics fm(font); 0195 int width = fm.width(getLabel()); 0196 int height = fm.height(); 0197 0198 switch (pos) 0199 { 0200 case CUSTOM : break; 0201 case NORTH : p.setX((getX()+(getWidth()/2)) -(width /2)); p.setY(getY() - height - 10); break; 0202 case NORTHEAST : p.setX(getHighX()+10); p.setY(getY() - height - 10); break; 0203 case EAST : p.setX(getHighX()+10); p.setY((getY()+(getHeight()/2)) - (height/2)); break; 0204 case SOUTHEAST : p.setX(getHighX()+10); p.setY(getHighY() + 10); break; 0205 case SOUTH : p.setX((getX()+(getWidth()/2)) -(width /2)); p.setY(getHighY() + 10); break; 0206 case SOUTHWEST : p.setX(getX()-width-10); p.setY(getHighY() + 10); break; 0207 case WEST : p.setX(getX()-width-10); p.setY((getY()+(getHeight()/2)) - (height/2)); break; 0208 case NORTHWEST : p.setX(getX()-width-10); p.setY(getY() - height - 10); break; 0209 default : 0210 return; 0211 } 0212 0213 } 0214 } 0215 0216 void CMapZone::setLabelPosition(labelPosTyp pos,CMapText *text) 0217 { 0218 if (getLabel()=="" || text == nullptr) pos=HIDE; 0219 setLabelPosition(pos); 0220 } 0221 0222 void CMapZone::geometryChanged(void) 0223 { 0224 setLabelPosition(getLabelPosition()); 0225 } 0226 0227 void CMapZone::textRemove(void) 0228 { 0229 labelPosition = HIDE; 0230 } 0231 0232 /** Used to load the properties of the element from a list of properties */ 0233 void CMapZone::loadProperties(KConfigGroup properties) 0234 { 0235 CMapElement::loadProperties(properties); 0236 setLabel(properties.readEntry("Label",getLabel())); 0237 setDescription(properties.readEntry("Description",getDescription())); 0238 0239 QColor color=getColor(); 0240 color=properties.readEntry("Color",color); 0241 setColor(color); 0242 setUseDefaultCol(properties.readEntry("DefaultColor",getUseDefaultCol())); 0243 0244 QColor bgcol=getBackgroundColor(); 0245 bgcol=properties.readEntry("BackgroundColor",bgcol); 0246 setBackgroundColor(bgcol); 0247 setUseDefaultBackground(properties.readEntry("DefaultBackground",getUseDefaultBackground())); 0248 0249 setZoneID(properties.readEntry("ZoneID",m_ID)); 0250 0251 setLabelPosition((CMapZone::labelPosTyp)properties.readEntry("LabelPos",(int)getLabelPosition())); 0252 } 0253 0254 /** Used to save the properties of the element to a list of properties */ 0255 void CMapZone::saveProperties(KConfigGroup properties) 0256 { 0257 CMapElement::saveProperties(properties); 0258 properties.writeEntry("Label",getLabel()); 0259 properties.writeEntry("Description",getDescription()); 0260 properties.writeEntry("Color",getColor()); 0261 properties.writeEntry("DefaultColor",getUseDefaultCol()); 0262 properties.writeEntry("BackgroundColor",getBackgroundColor()); 0263 properties.writeEntry("LabelPos",(int)getLabelPosition()); 0264 properties.writeEntry("ZoneID",getZoneID()); 0265 } 0266 0267 /** Used to save the element as an XML object 0268 * @param properties The XML object to save the properties too */ 0269 void CMapZone::saveQDomElement(QDomDocument *doc,QDomElement *properties) 0270 { 0271 CMapElement::saveQDomElement(doc,properties); 0272 0273 properties->setAttribute("Label",getLabel()); 0274 properties->setAttribute("Description",getDescription()); 0275 writeColor(doc,properties,"Color",getColor()); 0276 writeColor(doc,properties,"BackgroundColor",getBackgroundColor()); 0277 properties->setAttribute("DefaultColor",getUseDefaultCol()); 0278 properties->setAttribute("LabelPos",(int)getLabelPosition()); 0279 properties->setAttribute("ZoneID",getZoneID()); 0280 properties->setAttribute("NumLevels",levelCount()); 0281 if (getUseDefaultCol()) 0282 { 0283 properties->setAttribute("UseDefaultCol","true"); 0284 } 0285 else 0286 { 0287 properties->setAttribute("UseDefaultCol","false"); 0288 } 0289 0290 } 0291 0292 /** Used to load the properties from a XML object 0293 * @param properties The XML object to load the properties from */ 0294 void CMapZone::loadQDomElement(QDomElement *properties) 0295 { 0296 CMapElement::loadQDomElement(properties); 0297 0298 setLabel(properties->attribute("Label",getLabel())); 0299 setDescription(properties->attribute("Description",getDescription())); 0300 setUseDefaultCol(readBool(properties,"UseDefaultCol",getUseDefaultCol())); 0301 // setLabelPosition((labelPosTyp)readInt(properties,"LabelPos",(int)getLabelPosition())); 0302 setZoneID(readInt(properties,"ZoneID",getZoneID())); 0303 setColor(readColor(properties,"Color",getColor())); 0304 setBackgroundColor(readColor(properties,"BackgroundColor",getBackgroundColor())); 0305 0306 } 0307 0308 0309 void CMapZone::setZoneID(unsigned int id) 0310 { 0311 if (id > getManager()->m_zoneCount) 0312 getManager()->m_zoneCount = id; 0313 0314 m_ID = id; 0315 } 0316 0317 void CMapZone::setUseDefaultCol(bool b) 0318 { 0319 useDefaultCol = b; 0320 } 0321 0322 bool CMapZone::getUseDefaultCol(void) 0323 { 0324 return useDefaultCol; 0325 } 0326 0327 void CMapZone::setUseDefaultBackground(bool b) 0328 { 0329 useDefaultBackground = b; 0330 } 0331 0332 bool CMapZone::getUseDefaultBackground(void) 0333 { 0334 return true; 0335 } 0336 0337 void CMapZone::setColor(QColor col) 0338 { 0339 color = col; 0340 } 0341 0342 QColor CMapZone::getColor(void) 0343 { 0344 return color; 0345 } 0346 0347 void CMapZone::setBackgroundColor(QColor col) 0348 { 0349 backgroundCol = col; 0350 } 0351 0352 QColor CMapZone::getBackgroundColor(void) 0353 { 0354 return backgroundCol; 0355 } 0356 0357 unsigned int CMapZone::levelCount() const 0358 { 0359 return mapLevelModel.rowCount(); 0360 } 0361 0362 CMapLevel *CMapZone::getLevel(int idx) const 0363 { 0364 QModelIndex index = mapLevelModel.index(idx, 0); 0365 if (!index.isValid()) return nullptr; 0366 CMapLevel *lvl = static_cast<CMapLevel*>(index.data(Qt::UserRole + 1).value<void *>()); 0367 return lvl; 0368 } 0369 0370 int CMapZone::levelIndex(const CMapLevel *level) const 0371 { 0372 for (unsigned int i = 0; i < levelCount(); ++i) 0373 if (getLevel(i) == level) 0374 return i; 0375 return -1; 0376 } 0377 0378 void CMapZone::addLevel(CMapLevel *level) 0379 { 0380 insertLevel(level, -1); 0381 } 0382 0383 void CMapZone::insertLevel(CMapLevel *level, int pos) 0384 { 0385 QStandardItem *item = new QStandardItem(level->getName()); 0386 item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEnabled); 0387 item->setData(QVariant(qVariantFromValue((void *) level)), Qt::UserRole + 1); 0388 0389 if ((pos >= 0) && (pos < (int)levelCount())) 0390 mapLevelModel.insertRow(pos, item); 0391 else 0392 mapLevelModel.appendRow(item); 0393 } 0394 0395 void CMapZone::removeLevel(CMapLevel *level) 0396 { 0397 int idx = levelIndex(level); 0398 if (idx < 0) return; 0399 mapLevelModel.removeRows(idx, 1); 0400 } 0401 0402 void CMapZone::setLevelName(CMapLevel *level, const QString &name) 0403 { 0404 int idx = levelIndex(level); 0405 if (idx < 0) return; 0406 0407 QStandardItem *item = mapLevelModel.item(idx); 0408 if (item && (item->text() != name)) item->setText(name); 0409 } 0410