|
manongjohn |
8404a6 |
#include "toonz/navigationtags.h"
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
#include "tstream.h"
|
|
manongjohn |
8404a6 |
#include "texception.h"
|
|
manongjohn |
8404a6 |
#include "tenv.h"
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
#ifndef _WIN32
|
|
manongjohn |
8404a6 |
#include <limits.h></limits.h>
|
|
manongjohn |
8404a6 |
#endif
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
TEnv::IntVar NavigationTagLastColorR("NavigationTagLastColorR", 255);
|
|
manongjohn |
8404a6 |
TEnv::IntVar NavigationTagLastColorG("NavigationTagLastColorG", 0);
|
|
manongjohn |
8404a6 |
TEnv::IntVar NavigationTagLastColorB("NavigationTagLastColorB", 255);
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
NavigationTags::NavigationTags() {
|
|
manongjohn |
8404a6 |
m_lastTagColorUsed = QColor(NavigationTagLastColorR, NavigationTagLastColorG,
|
|
manongjohn |
8404a6 |
NavigationTagLastColorB);
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
int NavigationTags::getCount() const {
|
|
manongjohn |
8404a6 |
if (m_tags.empty()) return 0;
|
|
manongjohn |
8404a6 |
return m_tags.size();
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
NavigationTags::Tag NavigationTags::getTag(int frame) {
|
|
manongjohn |
8404a6 |
for (int i = 0; i < m_tags.size(); i++)
|
|
manongjohn |
8404a6 |
if (m_tags[i].m_frame == frame) return m_tags[i];
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
return Tag();
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
void NavigationTags::addTag(int frame, QString label) {
|
|
manongjohn |
8404a6 |
if (frame < 0 || isTagged(frame)) return;
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
m_tags.push_back(Tag(frame, label, m_lastTagColorUsed));
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
std::sort(m_tags.begin(), m_tags.end());
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
void NavigationTags::removeTag(int frame) {
|
|
manongjohn |
8404a6 |
if (frame < 0) return;
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
Tag tag = getTag(frame);
|
|
manongjohn |
8404a6 |
if (tag.m_frame == -1) return;
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
std::vector<tag>::iterator it;</tag>
|
|
manongjohn |
8404a6 |
for (it = m_tags.begin(); it != m_tags.end(); it++)
|
|
manongjohn |
8404a6 |
if (it->m_frame == frame) {
|
|
manongjohn |
8404a6 |
m_tags.erase(it);
|
|
manongjohn |
8404a6 |
break;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
void NavigationTags::clearTags() { m_tags.clear(); }
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
bool NavigationTags::isTagged(int frame) {
|
|
manongjohn |
8404a6 |
if (frame < 0) return false;
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
for (int i = 0; i < m_tags.size(); i++)
|
|
manongjohn |
8404a6 |
if (m_tags[i].m_frame == frame) return true;
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
return false;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
void NavigationTags::moveTag(int fromFrame, int toFrame) {
|
|
manongjohn |
8404a6 |
if (fromFrame < 0 || toFrame < 0 || isTagged(toFrame)) return;
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
for (int i = 0; i < m_tags.size(); i++)
|
|
manongjohn |
8404a6 |
if (m_tags[i].m_frame == fromFrame) {
|
|
manongjohn |
8404a6 |
m_tags[i].m_frame = toFrame;
|
|
manongjohn |
8404a6 |
std::sort(m_tags.begin(), m_tags.end());
|
|
manongjohn |
8404a6 |
break;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
// WARNING: When shifting left, shiftTag callers MUST take care of shifting tags
|
|
manongjohn |
8404a6 |
// to frame < 0 or handle possible frame collisions. This will not do it
|
|
manongjohn |
8404a6 |
// for you!
|
|
manongjohn |
8404a6 |
void NavigationTags::shiftTags(int startFrame, int shift) {
|
|
manongjohn |
8404a6 |
if (!m_tags.size()) return;
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
for (int i = 0; i < m_tags.size(); i++) {
|
|
manongjohn |
8404a6 |
if (m_tags[i].m_frame < startFrame) continue;
|
|
manongjohn |
8404a6 |
m_tags[i].m_frame += shift;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
int NavigationTags::getPrevTag(int currentFrame) {
|
|
manongjohn |
8404a6 |
if (currentFrame < 0) return -1;
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
int index = -1;
|
|
manongjohn |
8404a6 |
int closestFrame = -1;
|
|
manongjohn |
8404a6 |
for (int i = 0; i < m_tags.size(); i++)
|
|
manongjohn |
8404a6 |
if (m_tags[i].m_frame < currentFrame && m_tags[i].m_frame > closestFrame) {
|
|
manongjohn |
8404a6 |
index = i;
|
|
manongjohn |
8404a6 |
closestFrame = m_tags[i].m_frame;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
return index >= 0 ? m_tags[index].m_frame : -1;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
int NavigationTags::getNextTag(int currentFrame) {
|
|
manongjohn |
8404a6 |
int index = -1;
|
|
manongjohn |
8404a6 |
int closestFrame = INT_MAX;
|
|
manongjohn |
8404a6 |
for (int i = 0; i < m_tags.size(); i++)
|
|
manongjohn |
8404a6 |
if (m_tags[i].m_frame > currentFrame && m_tags[i].m_frame < closestFrame) {
|
|
manongjohn |
8404a6 |
index = i;
|
|
manongjohn |
8404a6 |
closestFrame = m_tags[i].m_frame;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
return index >= 0 ? m_tags[index].m_frame : -1;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
QString NavigationTags::getTagLabel(int frame) {
|
|
manongjohn |
8404a6 |
Tag tag = getTag(frame);
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
return tag.m_label;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
void NavigationTags::setTagLabel(int frame, QString label) {
|
|
manongjohn |
8404a6 |
if (frame < 0) return;
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
for (int i = 0; i < m_tags.size(); i++)
|
|
manongjohn |
8404a6 |
if (m_tags[i].m_frame == frame) {
|
|
manongjohn |
8404a6 |
m_tags[i].m_label = label;
|
|
manongjohn |
8404a6 |
break;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
QColor NavigationTags::getTagColor(int frame) {
|
|
manongjohn |
8404a6 |
Tag tag = getTag(frame);
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
return (tag.m_frame == -1) ? m_lastTagColorUsed : tag.m_color;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
void NavigationTags::setTagColor(int frame, QColor color) {
|
|
manongjohn |
8404a6 |
if (frame < 0) return;
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
for (int i = 0; i < m_tags.size(); i++)
|
|
manongjohn |
8404a6 |
if (m_tags[i].m_frame == frame) {
|
|
manongjohn |
8404a6 |
m_tags[i].m_color = color;
|
|
manongjohn |
8404a6 |
break;
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
m_lastTagColorUsed = color;
|
|
manongjohn |
8404a6 |
NavigationTagLastColorR = color.red();
|
|
manongjohn |
8404a6 |
NavigationTagLastColorG = color.green();
|
|
manongjohn |
8404a6 |
NavigationTagLastColorB = color.blue();
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
void NavigationTags::saveData(TOStream &os) {
|
|
manongjohn |
8404a6 |
int i;
|
|
manongjohn |
8404a6 |
os.openChild("Tags");
|
|
manongjohn |
8404a6 |
for (i = 0; i < getCount(); i++) {
|
|
manongjohn |
8404a6 |
os.openChild("tag");
|
|
manongjohn |
8404a6 |
Tag tag = m_tags.at(i);
|
|
manongjohn |
8404a6 |
os << tag.m_frame;
|
|
manongjohn |
8404a6 |
os << tag.m_label;
|
|
manongjohn |
8404a6 |
os << tag.m_color.red();
|
|
manongjohn |
8404a6 |
os << tag.m_color.green();
|
|
manongjohn |
8404a6 |
os << tag.m_color.blue();
|
|
manongjohn |
8404a6 |
os.closeChild();
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
os.closeChild();
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
//-----------------------------------------------------------------------------
|
|
manongjohn |
8404a6 |
|
|
manongjohn |
8404a6 |
void NavigationTags::loadData(TIStream &is) {
|
|
manongjohn |
8404a6 |
while (!is.eos()) {
|
|
manongjohn |
8404a6 |
std::string tagName;
|
|
manongjohn |
8404a6 |
if (is.matchTag(tagName)) {
|
|
manongjohn |
8404a6 |
if (tagName == "Tags") {
|
|
manongjohn |
8404a6 |
while (!is.eos()) {
|
|
manongjohn |
8404a6 |
std::string tagName;
|
|
manongjohn |
8404a6 |
if (is.matchTag(tagName)) {
|
|
manongjohn |
8404a6 |
if (tagName == "tag") {
|
|
manongjohn |
8404a6 |
Tag tag;
|
|
manongjohn |
8404a6 |
is >> tag.m_frame;
|
|
manongjohn |
8404a6 |
std::wstring text;
|
|
manongjohn |
8404a6 |
is >> text;
|
|
manongjohn |
8404a6 |
tag.m_label = QString::fromStdWString(text);
|
|
manongjohn |
8404a6 |
int r, g, b;
|
|
manongjohn |
8404a6 |
is >> r;
|
|
manongjohn |
8404a6 |
is >> g;
|
|
manongjohn |
8404a6 |
is >> b;
|
|
manongjohn |
8404a6 |
tag.m_color = QColor(r, g, b);
|
|
manongjohn |
8404a6 |
m_tags.push_back(tag);
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
} else
|
|
manongjohn |
8404a6 |
throw TException("expected <tag>");</tag>
|
|
manongjohn |
8404a6 |
is.closeChild();
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
} else
|
|
manongjohn |
8404a6 |
throw TException("expected <tags>");</tags>
|
|
manongjohn |
8404a6 |
is.closeChild();
|
|
manongjohn |
8404a6 |
} else
|
|
manongjohn |
8404a6 |
throw TException("expected tag");
|
|
manongjohn |
8404a6 |
}
|
|
manongjohn |
8404a6 |
}
|