mirror of
https://github.com/aseprite/aseprite.git
synced 2025-02-06 21:39:57 +00:00
Add ability to change the properties of several frames (a range of frames) at once
This commit is contained in:
parent
9650e1df27
commit
85523ba63a
@ -20,12 +20,15 @@
|
||||
#include "config.h"
|
||||
#endif
|
||||
|
||||
#include "app/app.h"
|
||||
#include "app/commands/command.h"
|
||||
#include "app/commands/params.h"
|
||||
#include "app/context_access.h"
|
||||
#include "app/document_api.h"
|
||||
#include "app/find_widget.h"
|
||||
#include "app/load_widget.h"
|
||||
#include "app/ui/main_window.h"
|
||||
#include "app/ui/timeline.h"
|
||||
#include "app/undo_transaction.h"
|
||||
#include "base/convert_to.h"
|
||||
#include "raster/sprite.h"
|
||||
@ -48,11 +51,11 @@ protected:
|
||||
private:
|
||||
enum Target {
|
||||
ALL_FRAMES = -1,
|
||||
CURRENT_FRAME = 0,
|
||||
CURRENT_RANGE = 0,
|
||||
SPECIFIC_FRAME = 1
|
||||
};
|
||||
|
||||
// Frame to be shown. It can be ALL_FRAMES, CURRENT_FRAME, or a
|
||||
// Frame to be shown. It can be ALL_FRAMES, CURRENT_RANGE, or a
|
||||
// number indicating a specific frame (1 is the first frame).
|
||||
Target m_target;
|
||||
FrameNumber m_frame;
|
||||
@ -72,7 +75,7 @@ void FramePropertiesCommand::onLoadParams(Params* params)
|
||||
m_target = ALL_FRAMES;
|
||||
}
|
||||
else if (frame == "current") {
|
||||
m_target = CURRENT_FRAME;
|
||||
m_target = CURRENT_RANGE;
|
||||
}
|
||||
else {
|
||||
m_target = SPECIFIC_FRAME;
|
||||
@ -95,48 +98,51 @@ void FramePropertiesCommand::onExecute(Context* context)
|
||||
Widget* frlen = app::find_widget<Widget>(window, "frlen");
|
||||
Widget* ok = app::find_widget<Widget>(window, "ok");
|
||||
|
||||
FrameNumber sprite_frame(0);
|
||||
FrameNumber firstFrame(0);
|
||||
FrameNumber lastFrame(0);
|
||||
|
||||
switch (m_target) {
|
||||
|
||||
case ALL_FRAMES:
|
||||
lastFrame = sprite->getLastFrame();
|
||||
break;
|
||||
|
||||
case CURRENT_FRAME:
|
||||
sprite_frame = reader.frame();
|
||||
case CURRENT_RANGE: {
|
||||
// TODO the range of selected frames should be in the DocumentLocation.
|
||||
Timeline::Range range = App::instance()->getMainWindow()->getTimeline()->range();
|
||||
if (range.enabled()) {
|
||||
firstFrame = range.frameBegin();
|
||||
lastFrame = range.frameEnd();
|
||||
}
|
||||
else {
|
||||
firstFrame = lastFrame = reader.frame();
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case SPECIFIC_FRAME:
|
||||
sprite_frame = m_frame;
|
||||
firstFrame = lastFrame = m_frame;
|
||||
break;
|
||||
}
|
||||
|
||||
if (m_target == ALL_FRAMES)
|
||||
frame->setText("All");
|
||||
if (firstFrame != lastFrame)
|
||||
frame->setTextf("%d-%d", (int)firstFrame+1, (int)lastFrame+1);
|
||||
else
|
||||
frame->setTextf("%d", (int)sprite_frame+1);
|
||||
frame->setTextf("%d", (int)firstFrame+1);
|
||||
|
||||
frlen->setTextf("%d", sprite->getFrameDuration(reader.frame()));
|
||||
frlen->setTextf("%d", sprite->getFrameDuration(firstFrame));
|
||||
|
||||
window->openWindowInForeground();
|
||||
if (window->getKiller() == ok) {
|
||||
int num = frlen->getTextInt();
|
||||
|
||||
if (m_target == ALL_FRAMES) {
|
||||
if (Alert::show("Warning"
|
||||
"<<Do you want to change the duration of all frames?"
|
||||
"||&Yes||&No") == 1) {
|
||||
ContextWriter writer(reader);
|
||||
UndoTransaction undoTransaction(writer.context(), "Constant Frame-Rate");
|
||||
writer.document()->getApi().setConstantFrameRate(writer.sprite(), num);
|
||||
undoTransaction.commit();
|
||||
}
|
||||
}
|
||||
else {
|
||||
ContextWriter writer(reader);
|
||||
UndoTransaction undoTransaction(writer.context(), "Frame Duration");
|
||||
writer.document()->getApi().setFrameDuration(writer.sprite(), sprite_frame, num);
|
||||
undoTransaction.commit();
|
||||
}
|
||||
ContextWriter writer(reader);
|
||||
UndoTransaction undoTransaction(writer.context(), "Frame Duration");
|
||||
if (firstFrame != lastFrame)
|
||||
writer.document()->getApi().setConstantFrameRate(writer.sprite(), firstFrame, lastFrame, num);
|
||||
else
|
||||
writer.document()->getApi().setFrameDuration(writer.sprite(), firstFrame, num);
|
||||
undoTransaction.commit();
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -381,11 +381,15 @@ void DocumentApi::setFrameDuration(Sprite* sprite, FrameNumber frame, int msecs)
|
||||
m_document->notifyObservers<DocumentEvent&>(&DocumentObserver::onFrameDurationChanged, ev);
|
||||
}
|
||||
|
||||
void DocumentApi::setConstantFrameRate(Sprite* sprite, int msecs)
|
||||
void DocumentApi::setConstantFrameRate(Sprite* sprite, FrameNumber from, FrameNumber to, int msecs)
|
||||
{
|
||||
ASSERT(from >= FrameNumber(0));
|
||||
ASSERT(from < to);
|
||||
ASSERT(to <= sprite->getLastFrame());
|
||||
|
||||
// Add undoers.
|
||||
if (undoEnabled()) {
|
||||
for (FrameNumber fr(0); fr<sprite->getTotalFrames(); ++fr)
|
||||
for (FrameNumber fr(from); fr<=to; ++fr)
|
||||
m_undoers->pushUndoer(new undoers::SetFrameDuration(
|
||||
getObjects(), sprite, fr));
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ namespace app {
|
||||
void removeFrame(Sprite* sprite, FrameNumber frame);
|
||||
void setTotalFrames(Sprite* sprite, FrameNumber frames);
|
||||
void setFrameDuration(Sprite* sprite, FrameNumber frame, int msecs);
|
||||
void setConstantFrameRate(Sprite* sprite, int msecs);
|
||||
void setConstantFrameRate(Sprite* sprite, FrameNumber from, FrameNumber to, int msecs);
|
||||
void moveFrameBefore(Sprite* sprite, FrameNumber frame, FrameNumber beforeFrame);
|
||||
|
||||
// Cels API
|
||||
|
Loading…
x
Reference in New Issue
Block a user