File indexing completed on 2023-10-01 04:14:06

0001 /***************************************************************************
0002                                cmapelementutil.cpp
0003                              -------------------
0004     begin                : Thu Jan 10 2002
0005     copyright            : (C) 2002 by Kmud Developer Team
0006                            (C) 2014-2015 by Tomas Mecir <mecirt@gmail.com>
0007     email                : kmud-devel@kmud.de
0008  ***************************************************************************/
0009 
0010 /***************************************************************************
0011  *                                                                         *
0012  *   This program is free software; you can redistribute it and/or modify  *
0013  *   it under the terms of the GNU General Public License as published by  *
0014  *   the Free Software Foundation; either version 2 of the License, or     *
0015  *   (at your option) any later version.                                   *
0016  *                                                                         *
0017  ***************************************************************************/
0018 
0019 #include "cmapelementutil.h"
0020 
0021 #include "cmapmanager.h"
0022 #include "cmaplevel.h"
0023 #include "cmaproom.h"
0024 #include "cmaptext.h"
0025 #include "cmapzone.h"
0026 #include "cmappath.h"
0027 #include "cmapelement.h"
0028 #include "cmapview.h"
0029 
0030 #include "dialogs/dlgmappathproperties.h"
0031 
0032 #include <kdebug.h>
0033 
0034 CMapElementUtil::CMapElementUtil(CMapManager *mapManager)
0035 {
0036     manager = mapManager;
0037 }
0038 
0039 CMapElementUtil::~CMapElementUtil()
0040 {
0041 }
0042 
0043 void CMapElementUtil::deleteElement(KConfigGroup grp,bool delOpsite)
0044 {
0045     CMapElement *element = manager->findElement(grp);
0046 
0047     if (element)
0048     {
0049         switch (element->getElementType())
0050         {
0051             case PATH : deletePath((CMapPath *)element,delOpsite); break;
0052             case ZONE : delete ((CMapZone *)element); break;
0053             case TEXT : delete ((CMapText *)element); break;
0054             case ROOM : delete ((CMapRoom *)element); break;
0055             default: break;
0056         }
0057     }
0058 }
0059 
0060 CMapElement *CMapElementUtil::createElement(KConfigGroup grp)
0061 {
0062     CMapElement *result = nullptr;
0063     QString text;
0064 
0065     elementTyp type  = (elementTyp)grp.readEntry("Type",(int)OTHER);
0066     
0067     if (type!=OTHER)
0068     {
0069         if  (type==PATH)
0070         {
0071             CMapLevel *srcLevel = manager->findLevel(grp.readEntry("SrcLevel",-1));
0072             CMapLevel *destLevel = manager->findLevel(grp.readEntry("DestLevel",-1));
0073             CMapRoom *srcRoom = srcLevel->findRoom(grp.readEntry("SrcRoom",-1));
0074             CMapRoom *destRoom = destLevel->findRoom(grp.readEntry("DestRoom",-1));
0075 
0076             directionTyp srcDir  = (directionTyp)grp.readEntry("SrcDir",0);
0077             directionTyp destDir = (directionTyp)grp.readEntry("DestDir",0);
0078             bool twoWay = grp.readEntry("PathTwoWay", manager->getMapData()->defaultPathTwoWay);
0079 
0080             result = new CMapPath(manager,srcRoom,srcDir,destRoom,destDir,twoWay);
0081 
0082             ((CMapPath *)result)->loadProperties(grp);
0083         }
0084         else
0085         {   
0086             CMapLevel *level = nullptr;
0087             if (grp.hasKey("Level"))
0088             {
0089                 level = manager->findLevel(grp.readEntry("Level",-1));
0090             }
0091 
0092             QPoint lowPos(-5,-5);
0093             lowPos.setX(grp.readEntry("X",-5));
0094             lowPos.setY(grp.readEntry("Y",-5));
0095 
0096             switch (type)
0097             {
0098                 case ROOM : result = createRoom(manager,lowPos,level);
0099                             if (result)
0100                             {
0101                                 if (!grp.hasKey("RoomID"))
0102                                 {
0103                                     grp.writeEntry("RoomID",((CMapRoom *)result)->getRoomID());
0104                                 }
0105                                 else
0106                                 {
0107                                     ((CMapRoom *)result)->setRoomID(grp.readEntry("RoomID",-1));
0108                                 }
0109                             }
0110                             break;
0111                 case TEXT : text = grp.readEntry("Text","");
0112                             if (grp.hasKey("Font") && grp.hasKey("Color"))
0113                             {
0114                                 QColor color=Qt::black;
0115                                 color=grp.readEntry("Color",color);
0116                                 QFont font = manager->getMapData()->defaultTextFont;
0117                                 font = grp.readEntry("Font",font);
0118                                                 result = createText(manager, lowPos, level, text, font, color);
0119                             }
0120                             else
0121                             {
0122                                                 result = createText(manager, lowPos, level, text);
0123                             }
0124                         if (!grp.hasKey("TextID"))
0125                             grp.writeEntry("TextID",((CMapText *)result)->getTextID());                                 
0126                         else
0127                             ((CMapText *)result)->setTextID(grp.readEntry("TextID",-1));
0128                             break;
0129                 default : ;
0130             }
0131 
0132             // FIXME_jp: This should problay load the elements propties into the new element.
0133             //           Calls to loadProperties else were in the code will not then be need after
0134             //           creating the new element
0135         }
0136     }
0137 
0138     return result;
0139 }
0140 
0141 /** Used to create a new room */
0142 CMapRoom *CMapElementUtil::createRoom(CMapManager *manager, QPoint pos, CMapLevel *level)
0143 {
0144   if ((!level) || level->findElementAt(pos))
0145     return nullptr;
0146 
0147   QRect rect(pos,manager->getMapData()->gridSize);
0148 
0149   CMapRoom *room = new CMapRoom(manager,rect,level);
0150 
0151   return room;
0152 }
0153 
0154 CMapText *CMapElementUtil::createText(CMapManager *manager, QPoint pos, CMapLevel *level, QString str)
0155 {
0156   return new CMapText(str, manager, pos, level);
0157 }
0158 
0159 CMapText *CMapElementUtil::createText(CMapManager *manager, QPoint pos, CMapLevel *level, QString str, QFont f, QColor col)
0160 {
0161   return new CMapText(str, f, col, manager, pos, level);
0162 }
0163 
0164 /** Delete a path map element */
0165 void CMapElementUtil::deletePath(CMapPath *path,bool delOpsite)
0166 {
0167   if (!delOpsite) path->setOpsitePath(nullptr);
0168   delete path;
0169 }