1 /*
2  Copyright (C) 2010-2014 Kristian Duske
3 
4  This file is part of TrenchBroom.
5 
6  TrenchBroom is free software: you can redistribute it and/or modify
7  it under the terms of the GNU General Public License as published by
8  the Free Software Foundation, either version 3 of the License, or
9  (at your option) any later version.
10 
11  TrenchBroom is distributed in the hope that it will be useful,
12  but WITHOUT ANY WARRANTY; without even the implied warranty of
13  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  GNU General Public License for more details.
15 
16  You should have received a copy of the GNU General Public License
17  along with TrenchBroom. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef TrenchBroom_SelectionCommand
21 #define TrenchBroom_SelectionCommand
22 
23 #include "StringUtils.h"
24 #include "Model/ModelTypes.h"
25 #include "View/UndoableCommand.h"
26 #include "View/ViewTypes.h"
27 
28 namespace TrenchBroom {
29     namespace View {
30         class SelectionCommand : public UndoableCommand {
31         public:
32             static const CommandType Type;
33         private:
34             typedef enum {
35                 Action_SelectNodes,
36                 Action_SelectFaces,
37                 Action_SelectAllNodes,
38                 Action_SelectAllFaces,
39                 Action_ConvertToFaces,
40                 Action_DeselectNodes,
41                 Action_DeselectFaces,
42                 Action_DeselectAll
43             } Action;
44 
45             Action m_action;
46 
47             Model::NodeList m_nodes;
48             Model::BrushFaceList m_faces;
49 
50             Model::NodeList m_previouslySelectedNodes;
51             Model::BrushFaceList m_previouslySelectedFaces;
52         public:
53             static SelectionCommand* select(const Model::NodeList& nodes);
54             static SelectionCommand* select(const Model::BrushFaceList& faces);
55 
56             static SelectionCommand* convertToFaces();
57             static SelectionCommand* selectAllNodes();
58             static SelectionCommand* selectAllFaces();
59 
60             static SelectionCommand* deselect(const Model::NodeList& nodes);
61             static SelectionCommand* deselect(const Model::BrushFaceList& faces);
62             static SelectionCommand* deselectAll();
63         private:
64             SelectionCommand(Action action, const Model::NodeList& nodes, const Model::BrushFaceList& faces);
65             static String makeName(Action action, const Model::NodeList& nodes, const Model::BrushFaceList& faces);
66         private:
67             bool doPerformDo(MapDocumentCommandFacade* document);
68             bool doPerformUndo(MapDocumentCommandFacade* document);
69 
70             bool doIsRepeatDelimiter() const;
71             bool doIsRepeatable(MapDocumentCommandFacade* document) const;
72 
73             bool doCollateWith(UndoableCommand::Ptr command);
74         };
75     }
76 }
77 
78 #endif /* defined(TrenchBroom_SelectionCommand) */
79