2015-02-12 23:16:25 +08:00
|
|
|
// Aseprite
|
|
|
|
|
// Copyright (C) 2001-2015 David Capello
|
|
|
|
|
//
|
|
|
|
|
// This program is free software; you can redistribute it and/or modify
|
|
|
|
|
// it under the terms of the GNU General Public License version 2 as
|
|
|
|
|
// published by the Free Software Foundation.
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2013-08-06 08:20:19 +08:00
|
|
|
#ifdef HAVE_CONFIG_H
|
2011-03-28 01:51:02 +08:00
|
|
|
#include "config.h"
|
2013-08-06 08:20:19 +08:00
|
|
|
#endif
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2013-08-06 08:20:19 +08:00
|
|
|
#include "app/context_flags.h"
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2013-08-06 08:20:19 +08:00
|
|
|
#include "app/context.h"
|
|
|
|
|
#include "app/document.h"
|
2015-08-14 04:25:39 +08:00
|
|
|
#include "app/modules/editors.h"
|
|
|
|
|
#include "app/ui/editor/editor.h"
|
2014-10-21 09:21:31 +08:00
|
|
|
#include "doc/cel.h"
|
|
|
|
|
#include "doc/layer.h"
|
2015-04-21 03:27:09 +08:00
|
|
|
#include "doc/site.h"
|
2014-10-21 09:21:31 +08:00
|
|
|
#include "doc/sprite.h"
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2013-08-06 08:20:19 +08:00
|
|
|
namespace app {
|
|
|
|
|
|
2011-03-28 01:51:02 +08:00
|
|
|
ContextFlags::ContextFlags()
|
|
|
|
|
{
|
|
|
|
|
m_flags = 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void ContextFlags::update(Context* context)
|
|
|
|
|
{
|
2015-04-21 03:27:09 +08:00
|
|
|
Site site = context->activeSite();
|
|
|
|
|
Document* document = static_cast<Document*>(site.document());
|
2011-03-28 01:51:02 +08:00
|
|
|
|
|
|
|
|
m_flags = 0;
|
|
|
|
|
|
|
|
|
|
if (document) {
|
|
|
|
|
m_flags |= HasActiveDocument;
|
|
|
|
|
|
2015-04-10 22:10:42 +08:00
|
|
|
if (document->lock(Document::ReadLock, 0)) {
|
2011-03-28 01:51:02 +08:00
|
|
|
m_flags |= ActiveDocumentIsReadable;
|
|
|
|
|
|
|
|
|
|
if (document->isMaskVisible())
|
2012-01-06 06:45:03 +08:00
|
|
|
m_flags |= HasVisibleMask;
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2015-08-14 04:25:39 +08:00
|
|
|
updateFlagsFromSite(site);
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2015-08-14 04:25:39 +08:00
|
|
|
if (document->lockToWrite(0))
|
|
|
|
|
m_flags |= ActiveDocumentIsWritable;
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2015-08-14 04:25:39 +08:00
|
|
|
document->unlock();
|
|
|
|
|
}
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2015-08-14 04:25:39 +08:00
|
|
|
// TODO this is a hack, try to find a better design to handle this
|
|
|
|
|
// "moving pixels" state.
|
|
|
|
|
if (current_editor &&
|
|
|
|
|
current_editor->document() == document &&
|
|
|
|
|
current_editor->isMovingPixels()) {
|
|
|
|
|
// Flags enabled when we are in MovingPixelsState
|
|
|
|
|
m_flags |=
|
|
|
|
|
HasVisibleMask |
|
|
|
|
|
ActiveDocumentIsReadable |
|
|
|
|
|
ActiveDocumentIsWritable;
|
|
|
|
|
|
|
|
|
|
updateFlagsFromSite(current_editor->getSite());
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2015-08-14 04:25:39 +08:00
|
|
|
void ContextFlags::updateFlagsFromSite(const Site& site)
|
|
|
|
|
{
|
|
|
|
|
const Sprite* sprite = site.sprite();
|
|
|
|
|
if (!sprite)
|
|
|
|
|
return;
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2015-08-14 04:25:39 +08:00
|
|
|
m_flags |= HasActiveSprite;
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2015-08-14 04:25:39 +08:00
|
|
|
if (sprite->backgroundLayer())
|
|
|
|
|
m_flags |= HasBackgroundLayer;
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2015-08-14 04:25:39 +08:00
|
|
|
const Layer* layer = site.layer();
|
|
|
|
|
frame_t frame = site.frame();
|
|
|
|
|
if (!layer)
|
|
|
|
|
return;
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2015-08-14 04:25:39 +08:00
|
|
|
m_flags |= HasActiveLayer;
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2015-08-14 04:25:39 +08:00
|
|
|
if (layer->isBackground())
|
|
|
|
|
m_flags |= ActiveLayerIsBackground;
|
2011-03-28 01:51:02 +08:00
|
|
|
|
2015-08-14 04:25:39 +08:00
|
|
|
if (layer->isVisible())
|
|
|
|
|
m_flags |= ActiveLayerIsVisible;
|
|
|
|
|
|
|
|
|
|
if (layer->isEditable())
|
|
|
|
|
m_flags |= ActiveLayerIsEditable;
|
|
|
|
|
|
|
|
|
|
if (layer->isImage()) {
|
|
|
|
|
m_flags |= ActiveLayerIsImage;
|
|
|
|
|
|
|
|
|
|
Cel* cel = layer->cel(frame);
|
|
|
|
|
if (cel) {
|
|
|
|
|
m_flags |= HasActiveCel;
|
|
|
|
|
|
|
|
|
|
if (cel->image())
|
|
|
|
|
m_flags |= HasActiveImage;
|
2011-03-28 01:51:02 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2013-08-06 08:20:19 +08:00
|
|
|
|
|
|
|
|
} // namespace app
|