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
}