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