1 // Aseprite
2 // Copyright (C) 2001-2018  David Capello
3 //
4 // This program is distributed under the terms of
5 // the End-User License Agreement for Aseprite.
6 
7 #ifndef APP_DOC_RANGE_H_INCLUDED
8 #define APP_DOC_RANGE_H_INCLUDED
9 #pragma once
10 
11 #include "doc/frame.h"
12 #include "doc/selected_frames.h"
13 #include "doc/selected_layers.h"
14 
15 #include <iosfwd>
16 
17 namespace doc {
18   class Cel;
19   class Sprite;
20 }
21 
22 namespace app {
23   using namespace doc;
24 
25   class DocRange {
26   public:
27     enum Type { kNone = 0,
28                 kCels = 1,
29                 kFrames = 2,
30                 kLayers = 4 };
31 
32     DocRange();
33     DocRange(Cel* cel);
34 
type()35     Type type() const { return m_type; }
enabled()36     bool enabled() const { return m_type != kNone; }
layers()37     layer_t layers() const { return int(m_selectedLayers.size()); }
frames()38     frame_t frames() const { return int(m_selectedFrames.size()); }
selectedLayers()39     const SelectedLayers& selectedLayers() const  { return m_selectedLayers; }
selectedFrames()40     const SelectedFrames& selectedFrames() const  { return m_selectedFrames; }
41 
42     void displace(layer_t layerDelta, frame_t frameDelta);
43 
44     bool contains(const Layer* layer) const;
contains(const frame_t frame)45     bool contains(const frame_t frame) const {
46       return m_selectedFrames.contains(frame);
47     }
48     bool contains(const Layer* layer,
49                   const frame_t frame) const;
50 
51     void clearRange();
52     void startRange(Layer* fromLayer, frame_t fromFrame, Type type);
53     void endRange(Layer* toLayer, frame_t toFrame);
54 
55     void selectLayer(Layer* layer);
56     void selectLayers(const SelectedLayers& selLayers);
57 
firstFrame()58     frame_t firstFrame() const { return m_selectedFrames.firstFrame(); }
lastFrame()59     frame_t lastFrame() const { return m_selectedFrames.lastFrame(); }
60 
61     bool operator==(const DocRange& o) const {
62       return (m_type == o.m_type &&
63               m_selectedLayers == o.m_selectedLayers &&
64               m_selectedFrames == o.m_selectedFrames);
65     }
66 
67     bool convertToCels(const Sprite* sprite);
68 
69     bool write(std::ostream& os) const;
70     bool read(std::istream& is);
71 
72   private:
73     void selectLayerRange(Layer* fromLayer, Layer* toLayer);
74     void selectFrameRange(frame_t fromFrame, frame_t toFrame);
75 
76     Type m_type;                // Last used type of the range
77     int m_flags;                // All used types in startRange()
78     SelectedLayers m_selectedLayers;
79     SelectedFrames m_selectedFrames;
80     Layer* m_selectingFromLayer;
81     frame_t m_selectingFromFrame;
82   };
83 
84 } // namespace app
85 
86 #endif
87