2015-02-12 23:16:25 +08:00
|
|
|
// Aseprite
|
2020-04-07 21:40:56 +08:00
|
|
|
// Copyright (C) 2020 Igara Studio S.A.
|
2018-06-06 00:11:29 +08:00
|
|
|
// Copyright (C) 2001-2018 David Capello
|
2015-02-12 23:16:25 +08:00
|
|
|
//
|
2016-08-27 04:02:58 +08:00
|
|
|
// This program is distributed under the terms of
|
|
|
|
|
// the End-User License Agreement for Aseprite.
|
2014-08-08 07:19:31 +08:00
|
|
|
|
2018-07-07 21:07:21 +08:00
|
|
|
#ifndef APP_DOC_RANGE_H_INCLUDED
|
|
|
|
|
#define APP_DOC_RANGE_H_INCLUDED
|
2014-08-08 07:19:31 +08:00
|
|
|
#pragma once
|
|
|
|
|
|
2014-12-29 07:39:11 +08:00
|
|
|
#include "doc/frame.h"
|
2016-08-25 23:31:00 +08:00
|
|
|
#include "doc/selected_frames.h"
|
|
|
|
|
#include "doc/selected_layers.h"
|
2014-08-08 07:19:31 +08:00
|
|
|
|
2018-06-09 01:40:02 +08:00
|
|
|
#include <iosfwd>
|
|
|
|
|
|
2015-02-09 22:40:43 +08:00
|
|
|
namespace doc {
|
|
|
|
|
class Cel;
|
|
|
|
|
class Sprite;
|
|
|
|
|
}
|
|
|
|
|
|
2014-08-08 07:19:31 +08:00
|
|
|
namespace app {
|
2014-10-21 09:21:31 +08:00
|
|
|
using namespace doc;
|
2014-08-08 07:19:31 +08:00
|
|
|
|
2018-07-07 21:07:21 +08:00
|
|
|
class DocRange {
|
2014-08-08 07:19:31 +08:00
|
|
|
public:
|
2018-06-06 00:11:29 +08:00
|
|
|
enum Type { kNone = 0,
|
|
|
|
|
kCels = 1,
|
|
|
|
|
kFrames = 2,
|
|
|
|
|
kLayers = 4 };
|
2014-08-08 07:19:31 +08:00
|
|
|
|
2018-07-07 21:07:21 +08:00
|
|
|
DocRange();
|
|
|
|
|
DocRange(Cel* cel);
|
2020-04-17 06:19:18 +08:00
|
|
|
DocRange(const DocRange&) = default;
|
|
|
|
|
DocRange& operator=(const DocRange&) = default;
|
2014-08-08 07:19:31 +08:00
|
|
|
|
|
|
|
|
Type type() const { return m_type; }
|
|
|
|
|
bool enabled() const { return m_type != kNone; }
|
2016-08-25 23:31:00 +08:00
|
|
|
layer_t layers() const { return int(m_selectedLayers.size()); }
|
|
|
|
|
frame_t frames() const { return int(m_selectedFrames.size()); }
|
|
|
|
|
const SelectedLayers& selectedLayers() const { return m_selectedLayers; }
|
|
|
|
|
const SelectedFrames& selectedFrames() const { return m_selectedFrames; }
|
|
|
|
|
|
2020-04-17 06:19:18 +08:00
|
|
|
void setType(const Type type);
|
|
|
|
|
void setSelectedLayers(const SelectedLayers& layers);
|
|
|
|
|
void setSelectedFrames(const SelectedFrames& frames);
|
|
|
|
|
|
2016-08-25 23:31:00 +08:00
|
|
|
void displace(layer_t layerDelta, frame_t frameDelta);
|
2014-08-08 07:19:31 +08:00
|
|
|
|
2018-06-06 00:11:29 +08:00
|
|
|
bool contains(const Layer* layer) const;
|
|
|
|
|
bool contains(const frame_t frame) const {
|
2016-08-25 23:31:00 +08:00
|
|
|
return m_selectedFrames.contains(frame);
|
|
|
|
|
}
|
2018-06-06 00:11:29 +08:00
|
|
|
bool contains(const Layer* layer,
|
|
|
|
|
const frame_t frame) const;
|
2016-08-25 23:31:00 +08:00
|
|
|
|
2020-04-07 21:40:56 +08:00
|
|
|
// If the range includes the given layer, it will be erased from
|
|
|
|
|
// the selection and other candidates might be selected (e.g. a
|
|
|
|
|
// sibling, parent, etc.) using the
|
|
|
|
|
// candidate_if_layer_is_deleted() function.
|
|
|
|
|
void eraseAndAdjust(const Layer* layer);
|
|
|
|
|
|
2016-08-25 23:31:00 +08:00
|
|
|
void clearRange();
|
|
|
|
|
void startRange(Layer* fromLayer, frame_t fromFrame, Type type);
|
|
|
|
|
void endRange(Layer* toLayer, frame_t toFrame);
|
|
|
|
|
|
2016-12-26 23:42:49 +08:00
|
|
|
void selectLayer(Layer* layer);
|
2016-12-01 06:58:04 +08:00
|
|
|
void selectLayers(const SelectedLayers& selLayers);
|
|
|
|
|
|
2016-08-25 23:31:00 +08:00
|
|
|
frame_t firstFrame() const { return m_selectedFrames.firstFrame(); }
|
|
|
|
|
frame_t lastFrame() const { return m_selectedFrames.lastFrame(); }
|
2014-08-08 07:19:31 +08:00
|
|
|
|
2018-07-07 21:07:21 +08:00
|
|
|
bool operator==(const DocRange& o) const {
|
2016-08-25 23:31:00 +08:00
|
|
|
return (m_type == o.m_type &&
|
|
|
|
|
m_selectedLayers == o.m_selectedLayers &&
|
|
|
|
|
m_selectedFrames == o.m_selectedFrames);
|
2014-08-08 07:19:31 +08:00
|
|
|
}
|
|
|
|
|
|
2016-08-25 23:31:00 +08:00
|
|
|
bool convertToCels(const Sprite* sprite);
|
2015-02-09 22:40:43 +08:00
|
|
|
|
2018-06-09 01:40:02 +08:00
|
|
|
bool write(std::ostream& os) const;
|
|
|
|
|
bool read(std::istream& is);
|
|
|
|
|
|
2014-08-08 07:19:31 +08:00
|
|
|
private:
|
2016-08-25 23:31:00 +08:00
|
|
|
void selectLayerRange(Layer* fromLayer, Layer* toLayer);
|
|
|
|
|
void selectFrameRange(frame_t fromFrame, frame_t toFrame);
|
|
|
|
|
|
2018-06-06 00:11:29 +08:00
|
|
|
Type m_type; // Last used type of the range
|
|
|
|
|
int m_flags; // All used types in startRange()
|
2016-08-25 23:31:00 +08:00
|
|
|
SelectedLayers m_selectedLayers;
|
|
|
|
|
SelectedFrames m_selectedFrames;
|
|
|
|
|
Layer* m_selectingFromLayer;
|
|
|
|
|
frame_t m_selectingFromFrame;
|
2014-08-08 07:19:31 +08:00
|
|
|
};
|
|
|
|
|
|
|
|
|
|
} // namespace app
|
|
|
|
|
|
|
|
|
|
#endif
|