File indexing completed on 2024-12-08 06:46:39

0001 /***************************************************************************
0002                           cmapmanager.h  -  description
0003                              -------------------
0004     begin                : Wed Mar 7 2001
0005     copyright            : (C) 2001 by KMud Development 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 #ifndef CMAPMANAGER_H
0019 #define CMAPMANAGER_H
0020 
0021 
0022 #include <qfont.h>
0023 #include <qstring.h>
0024 #include <qcolor.h>
0025 #include <qpoint.h>
0026 #include <qobject.h>
0027 #include <QStringList>
0028 #include <qcursor.h>
0029 
0030 #include <kconfig.h>
0031 #include <kselectaction.h>
0032 #include <ktoggleaction.h>
0033 #include <kconfiggroup.h>
0034 
0035 #include "cactionbase.h"
0036 
0037 #include "cmapcommand.h"
0038 #include "cmapdata.h"
0039 
0040 #include <vector>
0041 
0042 #include <kmuddy_export.h>
0043 
0044 class CMapPath;
0045 class CMapText;
0046 class CMapRoom;
0047 class CMapView;
0048 class CMapLevel;
0049 class CMapToolBase;
0050 class CMapPluginBase;
0051 class CMapFilter;
0052 class CMapCmdGroup;
0053 class CMapFileFilterBase;
0054 class CMapClipboard;
0055 class CMapElementUtil;
0056 class CMapPropertiesPaneBase;
0057 class CMapZoneManager;
0058 
0059 class DlgMapRoomProperties;
0060 class DlgMapTextProperties;
0061 class DlgMapPathProperties;
0062 class DlgSpeedwalkProgress;
0063 class DlgMapDirections;
0064 class DlgMapMovement;
0065 class DlgMapColor;
0066 class DlgMapSpeedwalk;
0067 
0068 class KMuddyMapper;
0069 
0070 class QActionGroup;
0071 class QUndoStack;
0072 
0073 /**This is used to make the mapper perform different tasks
0074   *@author KMud Development Team
0075   */
0076 
0077 class KMUDDY_EXPORT CMapManager : public QObject, public cActionBase
0078 {
0079         Q_OBJECT
0080 public:
0081   /** Constructor used to creat the map manager */
0082   CMapManager (QWidget *parent, KMuddyMapper *mapper, int sess);
0083   ~CMapManager() override;
0084 
0085   void eventStringHandler (QString event, int, QString &par1, const QString &) override;
0086 
0087   /** Used to get a list of the plugins */
0088   std::vector<CMapPluginBase *> getPluginList();
0089   /**
0090    * Used to create a new view of the map
0091    * actually returns a CMapView*,  dynamic_cast if necessary
0092    */
0093   void openMapView();
0094   /**
0095    * Used to change the view to the given level
0096    */
0097   void displayLevel(CMapLevel *level, bool centerView);
0098   /**
0099    * Used to create a new view of the a given level and
0100    * center the view on the given position.
0101    */
0102   void openNewMapView(QPoint pos,CMapLevel *level);
0103   /** Create new map */
0104   void createNewMap();
0105   /** Used to set properties of the view widget */
0106   void setPropertiesAllViews(QCursor *cursor,bool mouseTracking);
0107   /** Create new bottom or top level depending on the given direction */
0108   CMapLevel *createLevel(directionTyp dir);
0109   /** Used to create a new room */
0110   void createRoom(QPoint pos,CMapLevel *level);
0111   /** Used to create a new path, this method will display the path properties
0112    * dialog to obtain the porperties of the path to be created               */
0113   CMapPath *createPath(CMapRoom *srcRoom,CMapRoom *destRoom);
0114   /** Used to create a new path*/
0115   CMapPath *createPath(QPoint srcPos,CMapLevel *srcLevel,directionTyp srcDir,
0116                        QPoint destPos,CMapLevel *destLevel,directionTyp destDir);
0117   /** Used to create a new path*/
0118   CMapPath *createPath (CMapRoom *srcRoom,directionTyp srcDir,CMapRoom *destRoom,directionTyp destDir,bool undoable = true,bool twoWay = true);
0119   /** Used to create a new text label */
0120   void createText(QPoint pos,CMapLevel *level,QString str,QFont font,QColor col);
0121   /** Used to create a new text label */
0122   void createText(QPoint pos,CMapLevel *level,QString str="");
0123 
0124   bool isClean() const;
0125   CMapFileFilterBase *nativeFilter(bool isLoad = true);
0126   /** Used to load a map */
0127   void importMap(const QString& url,CMapFileFilterBase *filter);
0128   /** Used to save a map */
0129   void exportMap(const QString& url,CMapFileFilterBase *filter);
0130 
0131   void setDefaultOptions();
0132   /** Used to read the map options */
0133   void readOptions();
0134   /** Used to write the map options */
0135   void saveGlobalConfig();
0136 
0137   /** Used to alter the path properties */
0138   bool propertiesPath(CMapPath *path);
0139   /** Used to alter the room properties */
0140   bool propertiesRoom(CMapRoom *room);
0141   /** Used to alter the text properties */
0142   bool propertiesText(CMapText *text);
0143 
0144   /** This method is used to covert cords so that they snap to the grid */
0145   QPoint cordsSnapGrid(QPoint oldPos);
0146 
0147   /** Used to get a pointer to the map data */
0148   CMapData *getMapData() const;
0149   /** Pointer to the zone info that stores levels */
0150   CMapZone *getZone(bool noCreate = false);
0151 
0152   /** Used to set the login room */
0153   void setLoginRoom(CMapRoom *room);
0154   /** Uesd to return teh login room */
0155   CMapRoom *getLoginRoom();
0156   /** Used to set the current room */
0157   void setCurrentRoom(CMapRoom *room);
0158   /** Uesd to return the current room */
0159   CMapRoom *getCurrentRoom();
0160   /** move the player relative to the current position of the player
0161     * This command has support for special paths, but can only move
0162     * anlong exsiting special paths. In other words, it is unable to
0163     * create special paths.
0164     */
0165   void movePlayerBy(directionTyp dir,bool create,QString specialCmd);
0166   /** move the player relative to the current position of the player
0167     * @param cmd The move command used to move the player */
0168   void movePlayerBy(QString cmd);
0169   /** This method is used to convert a direction into a offset */
0170   void directionToCord(directionTyp dir, QSize distance,QPoint *pos);
0171   /** This method is used to move the elements in a zone by the given vector */
0172   void moveMap(QPoint inc,CMapZone *zone);
0173   /** This method is used to make a path one way */
0174   void makePathOneWay(CMapPath *path);
0175   /** This method is used to make a path two way */
0176   void makePathTwoWay(CMapPath *path);
0177 
0178   /** Used to convert a text direction to a direction type */
0179   directionTyp textToDirection(QString text);
0180   /** Used to convert a direction type to a text direction */
0181   QString directionToText(directionTyp dir, QString specialCmd, bool shortName = false);
0182 
0183   /** Get the level that has focues at the moment */
0184   CMapView *getActiveView();
0185   /** Used to inform the various parts of the mapper that a element has changed */
0186   void changedElement(CMapElement *element);
0187   /** Used to inform the various parts of the mapper that a element has added */
0188   void addedElement(CMapElement *element);
0189   /** Used to walk the player in the mud to a given room */
0190   void walkPlayerTo(CMapRoom *toRoom);
0191   /** Used to inform to change the state of the navigation tools */
0192   void activeViewChanged(void);
0193 
0194   /** Used to cound the diffent elements of the map */
0195   void getCounts(int *levels,int *rooms,int *paths,int *labels);
0196 
0197   /** Get the opsite direction */
0198   directionTyp getOpsiteDirection(directionTyp dir);
0199 
0200   /** Used to add a command to the command history */
0201   void addCommand(CMapCommand *command);
0202 
0203   /** Used to set the current tool */
0204   void setCurrentTool(CMapToolBase *tool);
0205   /** Usd to get the current tool */
0206   CMapToolBase *getCurrentTool(void);
0207   /** Used to unselect all the elements in a level */
0208   void unselectElements(CMapLevel *level);
0209   /** Used to tell that map views that a level has chaned */
0210   void levelChanged(CMapLevel *level);
0211   /** This method puts a element into edit state */
0212   void setEditElement(CMapElement *element);
0213   /** This is used to remove edit state from element being edited */
0214   void unsetEditElement(void);
0215   /** This gets the element that is being edited */
0216   CMapElement *getEditElement(void);
0217   /** This cancels any editing */
0218   void stopEditing(void);
0219   /** Check to see if a string is a valid move command
0220     * @param dirCmd The command that was typed
0221     * @return True, if a valid command otherwise false */
0222   bool validMoveCmd(QString dirCmd);
0223   /** This is used to find a level with a given id
0224     * @param id The id of the level to find
0225     * @return Null if no level is found otherwise a pointer to the level */
0226   CMapLevel *findLevel(unsigned int id);
0227 
0228   /** Obtain the command history */
0229   QUndoStack *getCommandHistory() { return commandHistory; };
0230   /** Used to create a new command group */
0231   void openCommandGroup(QString name);
0232   /** Used to close a command group */
0233   void closeCommandGroup(void);
0234   /** Should only be called by CMapRoom.setCurrentRoom() */
0235   void setCurrentRoomWithoutUndo(CMapRoom *room);
0236   /** Should only be called by CMapRoom.setLoginRoom() */
0237   void setLoginRoomWithoutUndo(CMapRoom *room);
0238   /** Delete a level from the map */
0239   void deleteLevel(CMapLevel *level);
0240   /** Find the first room in the map,if one can't be found then create one */
0241   CMapRoom *findFirstRoom(CMapRoom *exsitingRoom);
0242   /** This is used to tell the mapper if commands should be added to the history list */
0243   void setUndoActive(bool active);
0244   int getUndoActive(void);
0245   /** Used to erase the map. This will erase all elements and can't be undone */
0246   void eraseMap(void);
0247   void eraseZone(CMapZone *zone);
0248 
0249   CMapZoneManager *zoneManager() { return m_zoneManager; }
0250 
0251   /** Used to repaint all the views */
0252   void redrawAllViews(void);
0253 
0254   /** This method is used to find a element from a list of properties
0255       * @param properties The list of proerties
0256       * @return The element if it's found otherwise NULL */
0257   CMapElement *findElement(KConfigGroup properties);
0258 
0259   void createGlobalConfigPanes();
0260   void createProfileConfigPanes();
0261 
0262   /** Return property panes from all the plugins */
0263   virtual QList<CMapPropertiesPaneBase *> createPropertyPanes(elementTyp type,CMapElement *element,QWidget *parent);
0264 
0265   QString defaultSavePath () const;
0266 
0267 public:
0268   /** A count of the number of levels created */
0269   unsigned int m_levelCount;
0270   /** A count of the number of zones created */
0271   unsigned int m_zoneCount;
0272 
0273 public slots:
0274   /** Used to delete a element from the map */
0275   void deleteElement(CMapElement *element,bool delOpsite = true);
0276   /** Used to abort a speedwalk that is in progress */
0277   void slotAbortSpeedwalk(void);
0278   
0279 
0280 private slots:
0281   void slotWalkPlayerAlongPath(void);
0282   
0283 private:
0284   /** Used to delete a element from the map, should only be used by the deleteElementMethod() */
0285   void deleteElementWithoutGroup(CMapElement *element,bool delOpsite = true);
0286   /** This will setup the import/export file filters */
0287   void initFileFilters();
0288   /** Used to create the plugins */
0289   void initPlugins();
0290 
0291 private:
0292   /** A list of import/export filters */
0293   std::vector<CMapFileFilterBase *> m_fileFilter;
0294   /** If this is true then commands are added to the history, otherwise they are not */
0295   bool m_commandsActive;
0296   /** The filter used to proces mud input/output */
0297   CMapFilter *filter;
0298   /** list of all the zones */
0299   CMapZoneManager *m_zoneManager;
0300   /** out session */
0301   int m_sessId;
0302   /** The element currenly being edited */
0303   CMapElement *elementEdit;
0304   /** The current tool */
0305   CMapToolBase *currentTool;
0306   /** A list of all loaded tools */
0307   std::vector<CMapToolBase *> toolList;
0308   /** The undo/redo history */
0309   QUndoStack *commandHistory;
0310   /** Points the command history currently being used */
0311   CMapCmdGroup *historyGroup;
0312   /** Used to store the amount of steps taken in the speedwalk */
0313   int speedwalkProgress;
0314   /** A pointer to the active map view */
0315   CMapView *activeView;
0316   /** The zone combo box */
0317   KSelectAction *zoneMenu;
0318   /** A pointer to the current room */
0319   CMapRoom *currentRoom;
0320   /** A pointer to the login room */
0321   CMapRoom *loginRoom;
0322   /** A pointer to the map data */
0323   CMapData *mapData;
0324   /** A list of all the plugins */
0325   std::vector<CMapPluginBase *> pluginList;
0326   /** pointer to the speedwalk status indicaor */
0327   DlgSpeedwalkProgress *speedwalkProgressDlg;
0328 
0329   // config pages:
0330   DlgMapDirections *mapDirection;
0331   DlgMapMovement *mapMovement;
0332   DlgMapColor *mapColor;
0333   DlgMapSpeedwalk *mapSpeedwalk;
0334 
0335   /** Used to tell if speedwalk is active */
0336   bool speedwalkActive;
0337   /** The rooms that are to be speed walked */
0338   QStringList pathToWalk;
0339 
0340   KMuddyMapper *mapperPlugin;
0341 private:
0342 
0343   /** This is a debug function and not for genreal use */
0344   void changeProperties(CMapElement *element,QString key,QString oldData,QString newData);
0345   /** This is a debug function and not for genreal use */
0346   void changeProperties(CMapElement *element,QString key,int oldData,int newData);
0347 
0348 public:
0349   /** This is a debug function and not for genreal use */
0350   void generateTestMap();
0351 };
0352 
0353 #endif