Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#include "toonzqt/paletteviewergui.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzQt includes
Toshihiro Shimizu 890ddd
#include "toonzqt/styleselection.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/trepetitionguard.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/gutil.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/paletteviewer.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/selectioncommandids.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/stylenameeditor.h"
Toshihiro Shimizu 890ddd
#include "toonzqt/viewcommandids.h"
Toshihiro Shimizu 890ddd
#include "palettedata.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzLib includes
Toshihiro Shimizu 890ddd
#include "toonz/palettecmd.h"
Toshihiro Shimizu 890ddd
#include "toonz/txshlevel.h"
Toshihiro Shimizu 890ddd
#include "toonz/studiopalette.h"
Toshihiro Shimizu 890ddd
#include "toonz/txsheethandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/tframehandle.h"
Toshihiro Shimizu 890ddd
#include "toonz/imagestyles.h"
Toshihiro Shimizu 890ddd
#include "toonz/preferences.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// TnzCore includes
Toshihiro Shimizu 890ddd
#include "tcolorstyles.h"
Toshihiro Shimizu 890ddd
#include "tundo.h"
Toshihiro Shimizu 890ddd
#include "tenv.h"
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// Qt includes
Toshihiro Shimizu 890ddd
#include <qpainter></qpainter>
Toshihiro Shimizu 890ddd
#include <qmouseevent></qmouseevent>
Toshihiro Shimizu 890ddd
#include <qkeyevent></qkeyevent>
Toshihiro Shimizu 890ddd
#include <qmenubar></qmenubar>
Toshihiro Shimizu 890ddd
#include <qtooltip></qtooltip>
Toshihiro Shimizu 890ddd
#include <qdrag></qdrag>
Toshihiro Shimizu 890ddd
#include <qaction></qaction>
Toshihiro Shimizu 890ddd
#include <qshortcut></qshortcut>
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
// enable to set font size for style name separately from other texts
Shinya Kitaoka 120a6e
TEnv::IntVar EnvSoftwareCurrentFontSize_StyleName(
Shinya Kitaoka 120a6e
    "SoftwareCurrentFontSize_StyleName", 11);
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
using namespace PaletteViewerGUI;
Toshihiro Shimizu 890ddd
using namespace DVGui;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
/*! \namespace PaletteViewerGUI
Shinya Kitaoka 120a6e
                \brief Provides a collection of widget to show \b palette.
Shinya Kitaoka 120a6e
                */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
/*! \enum PaletteViewerGUI::PaletteViewType
Shinya Kitaoka 120a6e
                \brief Useful to mark different palette viewer type.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
                There are three possible palette to view:
Shinya Kitaoka 120a6e
                \li level palette, palette of current level;
Shinya Kitaoka 120a6e
                \li cleanup palette, current scene cleanup palette;
Shinya Kitaoka 120a6e
                \li studio palette.
Shinya Kitaoka 120a6e
                */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
/*! \class PaletteViewerGUI::PageViewer
Shinya Kitaoka 120a6e
                \brief The PageViewer class provides an object to view and
Shinya Kitaoka 120a6e
   manage palettes page.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                Inherits \b QFrame and \b TSelection::View.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                This object allows to show and manage a single palette page. An
Shinya Kitaoka 120a6e
   enum type
Shinya Kitaoka 120a6e
                \b PaletteViewerGUI::PageViewer::ViewMode, getViewMode(),
Shinya Kitaoka 120a6e
   specify visualization
Shinya Kitaoka 120a6e
                mode, it is possible set it using setViewMode(). Class manage
Shinya Kitaoka 120a6e
   all mouse event,
Shinya Kitaoka 120a6e
                move, press, drag and drop.
Shinya Kitaoka 120a6e
                */
Toshihiro Shimizu 890ddd
/*! \enum PaletteViewerGUI::PageViewer::ViewMode
Shinya Kitaoka 120a6e
                Useful to mark different page view moed:
Shinya Kitaoka 120a6e
                \li SmallChips: displays styles as small squares; the name of
Shinya Kitaoka 120a6e
   the style is
Shinya Kitaoka 120a6e
                displayed as tooltip.
Shinya Kitaoka 120a6e
                \li SmallChipsWithName:
Shinya Kitaoka 120a6e
                displays styles as small squares with the name insde.
Shinya Kitaoka 120a6e
                \li LargeChips: displays the styles on top of the name of the
Shinya Kitaoka 120a6e
   style.
Shinya Kitaoka 120a6e
                \li List:				List displays style
Shinya Kitaoka 120a6e
   thumbnails next to their names in a list;
Shinya Kitaoka 120a6e
                if the palette styles are referring to a studio palette, its
Shinya Kitaoka 120a6e
                path will be displayed along with the style name.
Shinya Kitaoka 120a6e
                */
Toshihiro Shimizu 890ddd
/*!	\fn TPalette::Page* PageViewer::getPage() const
Shinya Kitaoka 120a6e
                Return current page.
Shinya Kitaoka 120a6e
                */
Toshihiro Shimizu 890ddd
/*!	\fn ViewMode PageViewer::getViewMode() const
Shinya Kitaoka 120a6e
                Return current page view mode \b
Shinya Kitaoka 120a6e
   PaletteViewerGUI::PageViewer::ViewMode.
Shinya Kitaoka 120a6e
                */
Toshihiro Shimizu 890ddd
/*! \fn void TPalette::onSelectionChanged()
Shinya Kitaoka 120a6e
                Update current page view.
Shinya Kitaoka 120a6e
                */
Shinya Kitaoka 120a6e
PageViewer::PageViewer(QWidget *parent, PaletteViewType viewType,
Shinya Kitaoka 120a6e
                       bool hasPasteColors)
Shinya Kitaoka 120a6e
    : QFrame(parent)
Shinya Kitaoka 120a6e
    , m_page(0)
Shinya Kitaoka 120a6e
    , m_chipsOrigin(2, 2)
Shinya Kitaoka 120a6e
    , m_chipPerRow(0)
Shinya Kitaoka 120a6e
    , m_viewMode(SmallChips)
Shinya Kitaoka 120a6e
    , m_styleSelection(new TStyleSelection())
Shinya Kitaoka 120a6e
    , m_frameHandle(0)
Shinya Kitaoka 120a6e
    , m_renameTextField(new LineEdit(this))
Shinya Kitaoka 120a6e
    , m_dropPositionIndex(-1)
Shinya Kitaoka 120a6e
    , m_dropPageCreated(false)
Shinya Kitaoka 120a6e
    , m_startDrag(false)
Shinya Kitaoka 120a6e
    , m_viewType(viewType)
Shinya Kitaoka 120a6e
    , m_nameDisplayMode(Style)
Shinya Kitaoka 120a6e
    , m_hasPasteColors(hasPasteColors)
Shinya Kitaoka 120a6e
    , m_changeStyleCommand(0) {
Shinya Kitaoka 120a6e
  setFrameStyle(QFrame::StyledPanel);
Shinya Kitaoka 120a6e
  setObjectName("PageViewer");
Shinya Kitaoka 120a6e
  setFocusPolicy(Qt::StrongFocus);
Shinya Kitaoka 120a6e
  CommandManager *cmd    = CommandManager::instance();
Shinya Kitaoka 120a6e
  QAction *pasteValueAct = cmd->getAction(MI_PasteInto);
Shinya Kitaoka 120a6e
  addAction(pasteValueAct);
Shinya Kitaoka 120a6e
  if (m_hasPasteColors) {
Shinya Kitaoka 120a6e
    QAction *pasteColorsAct = cmd->getAction(MI_PasteColors);
Shinya Kitaoka 120a6e
    addAction(pasteColorsAct);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_styleNameEditor = new StyleNameEditor(this);
Shinya Kitaoka 120a6e
  m_styleNameEditor->hide();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_renameTextField->hide();
Shinya Kitaoka 120a6e
  m_renameTextField->setObjectName("RenameColorTextField");
Shinya Kitaoka 120a6e
  connect(m_renameTextField, SIGNAL(editingFinished()), this,
Shinya Kitaoka 120a6e
          SLOT(onStyleRenamed()));
Shinya Kitaoka 120a6e
  m_styleSelection->setView(this);
Shinya Kitaoka 120a6e
  setAcceptDrops(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // applying default chip sizes
Shinya Kitaoka 120a6e
  ViewMode defaultChipSize;
Shinya Kitaoka 120a6e
  switch (m_viewType) {
Shinya Kitaoka 120a6e
  case LEVEL_PALETTE:
Shinya Kitaoka 120a6e
    defaultChipSize = (ViewMode)ChipSizeManager::instance()->chipSize_Palette;
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case CLEANUP_PALETTE:
Shinya Kitaoka 120a6e
    defaultChipSize = (ViewMode)ChipSizeManager::instance()->chipSize_Cleanup;
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case STUDIO_PALETTE:
Shinya Kitaoka 120a6e
    defaultChipSize = (ViewMode)ChipSizeManager::instance()->chipSize_Studio;
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  default:
Shinya Kitaoka 120a6e
    defaultChipSize = (ViewMode)2;
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  setViewMode(defaultChipSize);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
PageViewer::~PageViewer() { delete m_styleSelection; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::setPaletteHandle(TPaletteHandle *paletteHandle) {
Shinya Kitaoka 120a6e
  TPaletteHandle *previousPalette = getPaletteHandle();
Shinya Kitaoka 120a6e
  if (previousPalette == paletteHandle) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (previousPalette)
Shinya Kitaoka 120a6e
    disconnect(previousPalette, SIGNAL(colorStyleChanged()), this,
Shinya Kitaoka 120a6e
               SLOT(update()));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_styleSelection->setPaletteHandle(paletteHandle);
Shinya Kitaoka 120a6e
  connect(paletteHandle, SIGNAL(colorStyleChanged()), SLOT(update()));
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_styleNameEditor->setPaletteHandle(paletteHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TPaletteHandle *PageViewer::getPaletteHandle() const {
Shinya Kitaoka 120a6e
  return m_styleSelection->getPaletteHandle();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::setXsheetHandle(TXsheetHandle *xsheetHandle) {
Shinya Kitaoka 120a6e
  m_styleSelection->setXsheetHandle(xsheetHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TXsheetHandle *PageViewer::getXsheetHandle() const {
Shinya Kitaoka 120a6e
  return m_styleSelection->getXsheetHandle();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
/*! for clearing the cache when executing paste style command from
Shinya Kitaoka 120a6e
 * StyleSelection
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::setLevelHandle(TXshLevelHandle *levelHandle) {
Shinya Kitaoka 120a6e
  m_styleSelection->setLevelHandle(levelHandle);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::setFrameHandle(TFrameHandle *frameHandle) {
Shinya Kitaoka 120a6e
  m_frameHandle = frameHandle;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
TFrameHandle *PageViewer::getFrameHandle() const { return m_frameHandle; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::setCurrentStyleIndex(int index) {
Shinya Kitaoka 120a6e
  getPaletteHandle()->setStyleIndex(index);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
int PageViewer::getCurrentStyleIndex() const {
Shinya Kitaoka 120a6e
  return getPaletteHandle()->getStyleIndex();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set current page to \b page and update view.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::setPage(TPalette::Page *page) {
Shinya Kitaoka 120a6e
  m_page = page;
Shinya Kitaoka 120a6e
  computeSize();
Shinya Kitaoka 120a6e
  update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Return chip count contained in current page.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
int PageViewer::getChipCount() const {
Shinya Kitaoka 120a6e
  return m_page ? m_page->getStyleCount() : 0;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
/*! Set current view mode \b PaletteViewerGUI::PageViewer::ViewMode to \b
Shinya Kitaoka 120a6e
 * viewMode and update view.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::setViewMode(ViewMode viewMode) {
Shinya Kitaoka 120a6e
  if (m_viewMode == viewMode) return;
Shinya Kitaoka 120a6e
  m_viewMode = viewMode;
Shinya Kitaoka 120a6e
  computeSize();
Shinya Kitaoka 120a6e
  update();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // keep new view mode for reproducing the same mode when a new palette is made
Shinya Kitaoka 120a6e
  switch (m_viewType) {
Shinya Kitaoka 120a6e
  case LEVEL_PALETTE:
Shinya Kitaoka 120a6e
    ChipSizeManager::instance()->chipSize_Palette = (int)m_viewMode;
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case CLEANUP_PALETTE:
Shinya Kitaoka 120a6e
    ChipSizeManager::instance()->chipSize_Cleanup = (int)m_viewMode;
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  case STUDIO_PALETTE:
Shinya Kitaoka 120a6e
    ChipSizeManager::instance()->chipSize_Studio = (int)m_viewMode;
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  default:
Shinya Kitaoka 120a6e
    break;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Return current chip index by position \b pos.
Shinya Kitaoka 120a6e
                N.B. Cannot return chip index > max.
Shinya Kitaoka 120a6e
                */
Shinya Kitaoka 120a6e
int PageViewer::posToIndex(const QPoint &pos) const {
Shinya Kitaoka 120a6e
  if (m_chipPerRow == 0) return -1;
Shinya Kitaoka 120a6e
  QSize chipSize = getChipSize();
Shinya Kitaoka 120a6e
  int j          = (pos.x() - m_chipsOrigin.x()) / chipSize.width();
Shinya Kitaoka 120a6e
  int i          = (pos.y() - m_chipsOrigin.y()) / chipSize.height();
Shinya Kitaoka 120a6e
  int index      = i * m_chipPerRow + j;
Shinya Kitaoka 120a6e
  // if(index<0 || index>=getChipCount()) return -1;
Shinya Kitaoka 120a6e
  return index;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Return item rect of chip identified by \b index. Item rect is the rect of
Shinya Kitaoka 120a6e
                chip + name.
Shinya Kitaoka 120a6e
                */
Shinya Kitaoka 120a6e
QRect PageViewer::getItemRect(int index) const {
Shinya Kitaoka 120a6e
  if (m_chipPerRow == 0) return QRect();
Shinya Kitaoka 120a6e
  int row        = index / m_chipPerRow;
Shinya Kitaoka 120a6e
  int col        = index - (row * m_chipPerRow);
Shinya Kitaoka 120a6e
  int x0         = m_chipsOrigin.x();
Shinya Kitaoka 120a6e
  int y0         = m_chipsOrigin.y();
Shinya Kitaoka 120a6e
  QSize chipSize = getChipSize();
Shinya Kitaoka 120a6e
  int chipLx     = chipSize.width();
Shinya Kitaoka 120a6e
  int chipLy     = chipSize.height();
Shinya Kitaoka 120a6e
  QRect rect(x0 + chipLx * col, y0 + chipLy * row, chipLx, chipLy);
Shinya Kitaoka 120a6e
  return rect;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Return rect of color area of chip identified by \b index.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
QRect PageViewer::getColorChipRect(int index) const {
Shinya Kitaoka 120a6e
  QRect rect = getItemRect(index);
Shinya Kitaoka 120a6e
  if (rect.isNull()) return rect;
Shinya Kitaoka 120a6e
  if (m_viewMode == LargeChips)
Shinya Kitaoka 120a6e
    rect.setHeight(20);
Shinya Kitaoka 120a6e
  else if (m_viewMode == List)
Shinya Kitaoka 120a6e
    rect.setWidth(rect.height());
Shinya Kitaoka 120a6e
  return rect;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Return rect of chip identified by \b index name. (Not in \b SmallChips).
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
QRect PageViewer::getColorNameRect(int index) const {
Shinya Kitaoka 120a6e
  QRect rect = getItemRect(index);
Shinya Kitaoka 120a6e
  if (rect.isNull()) return rect;
Shinya Kitaoka 120a6e
  if (m_viewMode == LargeChips)
Shinya Kitaoka 120a6e
    rect.adjust(-10, 14, 10, -14);
Shinya Kitaoka 120a6e
  else if (m_viewMode == MediumChips)
Shinya Kitaoka 120a6e
    rect.adjust(-15, 7, 15, -7);
Shinya Kitaoka 120a6e
  else if (m_viewMode == List)
Shinya Kitaoka 120a6e
    rect.setLeft(rect.left() + rect.height());
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    return rect;
Shinya Kitaoka 120a6e
  return rect;
Shinya Kitaoka 120a6e
}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
/*! Add color to current page; if indexInPage == -1 add color at the bottom of
Shinya Kitaoka 120a6e
 * page.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::drop(int dstIndexInPage, const QMimeData *mimeData) {
Shinya Kitaoka 120a6e
  assert(m_page);
Shinya Kitaoka 120a6e
  TPalette *palette = m_page->getPalette();
Shinya Kitaoka 120a6e
  if (!palette) return;
Shinya Kitaoka 120a6e
  int dstPageIndex = m_page->getIndex();
Shinya Kitaoka 120a6e
  if ((m_page->getStyleId(0) == 0 || m_page->getStyleId(1) == 1) &&
Shinya Kitaoka 120a6e
      dstIndexInPage < 2)
Shinya Kitaoka 120a6e
    dstIndexInPage                       = 2;
Shinya Kitaoka 120a6e
  if (dstIndexInPage < 0) dstIndexInPage = m_page->getStyleCount();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  const PaletteData *paletteData = dynamic_cast<const *="" palettedata="">(mimeData);</const>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!paletteData || !paletteData->hasStyleIndeces()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  TPalette *srcPalette           = paletteData->getPalette();
Shinya Kitaoka 120a6e
  int srcPageIndex               = paletteData->getPageIndex();
Shinya Kitaoka 120a6e
  std::set<int> srcIndicesInPage = paletteData->getIndicesInPage();</int>
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_dropPageCreated) {
Shinya Kitaoka 120a6e
    // Rimuovo e reinserisco la pagina inizializzando l'undo.
Shinya Kitaoka 120a6e
    palette->setDirtyFlag(true);
Shinya Kitaoka 120a6e
    int pageIndex = palette->getPageCount() - 1;
Shinya Kitaoka 120a6e
    palette->erasePage(pageIndex);
Shinya Kitaoka 120a6e
    if (dstPageIndex != srcPageIndex && pageIndex == dstPageIndex) {
Shinya Kitaoka 120a6e
      TUndoManager::manager()->beginBlock();
Shinya Kitaoka 120a6e
      PaletteCmd::addPage(getPaletteHandle());
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      m_dropPageCreated = false;
Shinya Kitaoka 120a6e
    getPaletteHandle()->notifyPaletteChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (srcPalette == palette) {
Shinya Kitaoka 120a6e
    PaletteCmd::arrangeStyles(getPaletteHandle(), dstPageIndex, dstIndexInPage,
Shinya Kitaoka 120a6e
                              srcPageIndex, srcIndicesInPage);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    // seleziono gli stili spostati
Shinya Kitaoka 120a6e
    clearSelection();
Shinya Kitaoka 120a6e
    std::set<int>::const_reverse_iterator i;</int>
Shinya Kitaoka 120a6e
    int k = 0;
Shinya Kitaoka 120a6e
    for (i = srcIndicesInPage.rbegin(); i != srcIndicesInPage.rend();
Shinya Kitaoka 120a6e
         ++i, ++k) {
Shinya Kitaoka 120a6e
      int index = 0;
Shinya Kitaoka 120a6e
      if (*i <= dstIndexInPage)
Shinya Kitaoka 120a6e
        index = dstIndexInPage - k - 1;
Shinya Kitaoka 120a6e
      else
Shinya Kitaoka 120a6e
        index = dstIndexInPage + k;
Shinya Kitaoka 120a6e
      m_styleSelection->select(dstPageIndex, index, true);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else  // when dropping the style into another palette
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
    std::vector<tcolorstyle *=""> styles;</tcolorstyle>
Shinya Kitaoka 120a6e
    std::set<int>::iterator it;</int>
Shinya Kitaoka 120a6e
    for (it = srcIndicesInPage.begin(); it != srcIndicesInPage.end(); ++it) {
Shinya Kitaoka 120a6e
      int indexInPage = *it;
Shinya Kitaoka 120a6e
      styles.push_back(
Shinya Kitaoka 120a6e
          srcPalette->getPage(srcPageIndex)->getStyle(indexInPage));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    PaletteCmd::addStyles(getPaletteHandle(), dstPageIndex, dstIndexInPage,
Shinya Kitaoka 120a6e
                          styles);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_dropPageCreated) {
Shinya Kitaoka 120a6e
    m_dropPageCreated = false;
Shinya Kitaoka 120a6e
    TUndoManager::manager()->endBlock();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Create an empty page to receive drop.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::createDropPage() {
Shinya Kitaoka 120a6e
  if (m_dropPageCreated) return;
Shinya Kitaoka 120a6e
  m_dropPageCreated = true;
Shinya Kitaoka 120a6e
  assert(m_page);
Shinya Kitaoka 120a6e
  TPalette *palette = m_page->getPalette();
Shinya Kitaoka 120a6e
  if (palette) PaletteCmd::addPage(getPaletteHandle(), L"", false);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::clearSelection() { m_styleSelection->selectNone(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
/*! Return page chip size, it depend from current \b
Shinya Kitaoka 120a6e
 * PaletteViewerGUI::PageViewer::ViewMode.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
QSize PageViewer::getChipSize() const {
Shinya Kitaoka 120a6e
  if (m_viewMode == SmallChips || m_viewMode == SmallChipsWithName)
Shinya Kitaoka 120a6e
    return QSize(48, 33);
Shinya Kitaoka 120a6e
  else if (m_viewMode == MediumChips)
Shinya Kitaoka 120a6e
    return QSize(98, 38);
Shinya Kitaoka 120a6e
  else if (m_viewMode == LargeChips)
Shinya Kitaoka 120a6e
    return QSize(155, 53);
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    return QSize(width(), 22);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Draw a single chip style \b style in \b chipRect.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::drawColorChip(QPainter &p, QRect &chipRect,
Shinya Kitaoka 120a6e
                               TColorStyle *style) {
Shinya Kitaoka 120a6e
  TRaster32P icon = style->getIcon(qsize2Dimension(chipRect.size()));
Shinya Kitaoka 120a6e
  p.drawPixmap(chipRect.left(), chipRect.top(), rasterToQPixmap(icon, false));
Shinya Kitaoka 120a6e
  p.drawRect(chipRect);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Draw style \b style name in \b nameRect.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::drawColorName(QPainter &p, QRect &nameRect, TColorStyle *style,
Shinya Kitaoka 120a6e
                               int styleIndex) {
Shinya Kitaoka 120a6e
  if (m_viewMode == SmallChips && style->getFlags() == 0) return;
Shinya Kitaoka 120a6e
  TPalette *palette = (m_page) ? m_page->getPalette() : 0;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  QString name = QString::fromStdWString(style->getName());
Shinya Kitaoka 120a6e
  if (m_viewMode == List) {
Shinya Kitaoka 120a6e
    p.setPen(getTextColor());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    std::pair<tfilepath, int=""> g =</tfilepath,>
Shinya Kitaoka 120a6e
        StudioPalette::instance()->getSourceStyle(style);
Shinya Kitaoka 120a6e
    if (g.first != TFilePath() && g.second >= 0)
Shinya Kitaoka 120a6e
      name += "  " + toQString(g.first) + ":" + QString::number(g.second);
Shinya Kitaoka 120a6e
    if (style->getFlags() != 0) name += "(autopaint)";
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    p.drawText(nameRect.adjusted(6, 4, -6, -4), name);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QColor borderCol(getTextColor());
Shinya Kitaoka 120a6e
    borderCol.setAlphaF(0.3);
Shinya Kitaoka 120a6e
    p.setPen(borderCol);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_viewMode == SmallChips && style->getFlags() != 0) {
Shinya Kitaoka 120a6e
    QRect rect(nameRect.left(), nameRect.top(), 9, 9);
Shinya Kitaoka 120a6e
    p.fillRect(rect, QBrush(Qt::white));
Shinya Kitaoka 120a6e
    p.drawRect(rect);
Shinya Kitaoka 120a6e
    p.drawText(rect, Qt::AlignCenter, "a");
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (m_viewMode == SmallChipsWithName && name != "" && name != "color") {
Shinya Kitaoka 120a6e
    QRect rect     = nameRect;
Shinya Kitaoka 120a6e
    QPen oldPen    = p.pen();
Shinya Kitaoka 120a6e
    TPixel32 color = style->getMainColor();
Shinya Kitaoka 120a6e
    int v          = (int)(0.299 * color.r + 0.587 * color.g + 0.114 * color.b);
Shinya Kitaoka 120a6e
    p.setPen(v > 127 ? Qt::black : Qt::white);
Shinya Kitaoka 120a6e
    int textWidth = QFontMetrics(p.font()).width(name);
Shinya Kitaoka 120a6e
    if (textWidth < rect.width() - 2)
Shinya Kitaoka 120a6e
      p.drawText(rect, Qt::AlignCenter, name);
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      p.drawText(rect.adjusted(2, 0, 0, 0), Qt::AlignLeft | Qt::AlignVCenter,
Shinya Kitaoka 120a6e
                 name);
Shinya Kitaoka 120a6e
    p.setPen(oldPen);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_viewMode == LargeChips) {
Shinya Kitaoka 120a6e
    QString index                = QString::number(styleIndex);
Shinya Kitaoka 120a6e
    QFont font                   = p.font();
Shinya Kitaoka 120a6e
    int fontSize                 = font.pointSize();
Shinya Kitaoka 120a6e
    if (fontSize == -1) fontSize = font.pixelSize();
Shinya Kitaoka 120a6e
    int lenght                   = index.length() * fontSize;
Shinya Kitaoka 120a6e
    int w                        = (lenght > 11) ? (lenght) : 11;
Shinya Kitaoka 120a6e
    int h                        = 11;
Shinya Kitaoka 120a6e
    int x0                       = nameRect.right() - w + 1;
Shinya Kitaoka 120a6e
    int y0                       = nameRect.top() - h - 1;
Shinya Kitaoka 120a6e
    p.drawText(nameRect.adjusted(6, 1, -6, -1), name);
Shinya Kitaoka 120a6e
    QRect indexRect(x0, y0, w, h);
Shinya Kitaoka 120a6e
    p.fillRect(indexRect, QBrush(Qt::white));
Shinya Kitaoka 120a6e
    p.drawRect(indexRect);
Shinya Kitaoka 120a6e
    p.drawText(indexRect, Qt::AlignCenter, index);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    QFont f = p.font();
Shinya Kitaoka 120a6e
    f.setFamily("Calibri");
Shinya Kitaoka 120a6e
    p.setFont(f);
Shinya Kitaoka 120a6e
    if (style->getFlags() != 0) {
Shinya Kitaoka 120a6e
      QRect rect(nameRect.left(), y0, w, h);
Shinya Kitaoka 120a6e
      p.fillRect(rect, QBrush(Qt::white));
Shinya Kitaoka 120a6e
      p.drawRect(rect);
Shinya Kitaoka 120a6e
      p.drawText(rect.adjusted(0, +1, 0, +1), Qt::AlignCenter, "A");
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    TTextureStyle *ts = dynamic_cast<ttexturestyle *="">(style);</ttexturestyle>
Shinya Kitaoka 120a6e
    if (ts) {
Shinya Kitaoka 120a6e
      QRect rect(nameRect.left() + ((style->getFlags() != 0) ? w : 0), y0, w,
Shinya Kitaoka 120a6e
                 h);
Shinya Kitaoka 120a6e
      p.fillRect(rect, QBrush(Qt::white));
Shinya Kitaoka 120a6e
      p.drawRect(rect);
Shinya Kitaoka 120a6e
      p.drawText(rect.adjusted(0, +1, 0, +1), Qt::AlignCenter,
Shinya Kitaoka 120a6e
                 ts->isPattern() ? "P" : "T");
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  p.drawRect(nameRect);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Draw the toggle to know if \b style is linked to a studio palette.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::drawToggleLink(QPainter &p, QRect &chipRect,
Shinya Kitaoka 120a6e
                                TColorStyle *style) {
Shinya Kitaoka 120a6e
  std::wstring globalName = style->getGlobalName();
Shinya Kitaoka 120a6e
  if (globalName != L"" && (globalName[0] == L'-' || globalName[0] == L'+')) {
Shinya Kitaoka 120a6e
    TPixel32 c = style->getMainColor();
Shinya Kitaoka 120a6e
    int x      = chipRect.topRight().x() - 6;
Shinya Kitaoka 120a6e
    int y      = chipRect.topRight().y();
Shinya Kitaoka 120a6e
    QRect rect(x, y, 7, 7);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    p.fillRect(rect, QBrush(Qt::white));
Shinya Kitaoka 120a6e
    p.setPen(Qt::black);
Shinya Kitaoka 120a6e
    p.drawRect(rect);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (globalName[0] == L'+') {
Shinya Kitaoka 120a6e
      QPointF a(x + 2, y + 2);
Shinya Kitaoka 120a6e
      QPointF b(x + 2, y + 5);
Shinya Kitaoka 120a6e
      QPointF c(x + 5, y + 2);
Shinya Kitaoka 120a6e
      QPointF d(x + 5, y + 5);
Shinya Kitaoka 120a6e
      p.drawLine(a, b);
Shinya Kitaoka 120a6e
      p.drawLine(a, c);
Shinya Kitaoka 120a6e
      p.drawLine(a, d);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Pain current page styles using current view mode.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::paintEvent(QPaintEvent *e) {
Shinya Kitaoka 120a6e
  QPainter p(this);
Shinya Kitaoka 120a6e
  if (m_chipPerRow == 0) {
Shinya Kitaoka 120a6e
    p.drawText(QPoint(5, 25), tr("- No Styles -"));
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // currentStyle e palette
Shinya Kitaoka 120a6e
  TPalette *palette = (m_page) ? m_page->getPalette() : 0;
Shinya Kitaoka 120a6e
  if (!palette) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // [i0,i1] = range celle visibili
Shinya Kitaoka 120a6e
  QRect visibleRect            = e->rect();
Shinya Kitaoka 120a6e
  int i0                       = posToIndex(visibleRect.topLeft());
Shinya Kitaoka 120a6e
  if (i0 < 0) i0               = 0;
Shinya Kitaoka 120a6e
  int i1                       = posToIndex(visibleRect.bottomRight());
Shinya Kitaoka 120a6e
  if (i1 >= getChipCount()) i1 = getChipCount() - 1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_viewMode == List) {
Shinya Kitaoka 120a6e
    // disegno le celle
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    int currentStyleIndexInPage = -1;
Shinya Kitaoka 120a6e
    for (i = i0; i <= i1; i++) {
Shinya Kitaoka 120a6e
      TColorStyle *style = m_page->getStyle(i);
Shinya Kitaoka 120a6e
      int styleIndex     = m_page->getStyleId(i);
Shinya Kitaoka 120a6e
      if (getCurrentStyleIndex() == styleIndex) currentStyleIndexInPage = i;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      QRect chipRect = getColorChipRect(i);
Shinya Kitaoka 120a6e
      drawColorChip(p, chipRect, style);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // name, index and shortcut
Shinya Kitaoka 120a6e
      QRect nameRect = getColorNameRect(i);
Shinya Kitaoka 120a6e
      drawColorName(p, nameRect, style, styleIndex);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // selezione
Shinya Kitaoka 120a6e
      if (m_styleSelection->isSelected(m_page->getIndex(), i)) {
Shinya Kitaoka 120a6e
        p.setPen(Qt::white);
Shinya Kitaoka 120a6e
        QRect itemRect = getItemRect(i);
Shinya Kitaoka 120a6e
        p.drawRect(itemRect);
Shinya Kitaoka 120a6e
        p.drawRect(chipRect.adjusted(1, 1, -1, -1));
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      // stile corrente
Shinya Kitaoka 120a6e
      if (i == currentStyleIndexInPage && 0 <= i && i < getChipCount()) {
Shinya Kitaoka 120a6e
        QRect rect = getItemRect(i);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        p.setPen(QColor(180, 210, 255));
Shinya Kitaoka 120a6e
        p.drawRect(rect.adjusted(1, 1, -1, -1));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        p.setPen(Qt::white);
Shinya Kitaoka 120a6e
        p.drawRect(rect.adjusted(2, 2, -2, -2));
Shinya Kitaoka 120a6e
        p.setPen(Qt::black);
Shinya Kitaoka 120a6e
        p.drawRect(rect.adjusted(3, 3, -3, -3));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        if (!m_styleSelection->isSelected(m_page->getIndex(), i)) {
Shinya Kitaoka 120a6e
          p.setPen(QColor(225, 225, 225));
Shinya Kitaoka 120a6e
          p.drawRect(rect.adjusted(1, 1, -1, -1));
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // toggle link
Shinya Kitaoka 120a6e
      drawToggleLink(p, chipRect, m_page->getStyle(i));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    int currentStyleIndex = getCurrentStyleIndex();
Shinya Kitaoka 120a6e
    int i;
Shinya Kitaoka 120a6e
    for (i = i0; i <= i1; i++) {
Shinya Kitaoka 120a6e
      TColorStyle *style = m_page->getStyle(i);
Shinya Kitaoka 120a6e
      int styleIndex     = m_page->getStyleId(i);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // draw white frame if the style is selected or current
Shinya Kitaoka 120a6e
      if (m_styleSelection->isSelected(m_page->getIndex(), i) ||
Shinya Kitaoka 120a6e
          currentStyleIndex == styleIndex) {
Shinya Kitaoka 120a6e
        QRect itemRect = getItemRect(i).adjusted(-1, -2, 1, 2);
Shinya Kitaoka 120a6e
        p.setPen(Qt::NoPen);
Shinya Kitaoka 120a6e
        p.setBrush(Qt::white);
Shinya Kitaoka 120a6e
        p.drawRoundRect(itemRect, 7, 25);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      // paint style
Shinya Kitaoka 120a6e
      QRect chipRect = getItemRect(i).adjusted(4, 4, -5, -5);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      QColor styleColor((int)style->getMainColor().r,
Shinya Kitaoka 120a6e
                        (int)style->getMainColor().g,
Shinya Kitaoka 120a6e
                        (int)style->getMainColor().b);
Shinya Kitaoka 120a6e
      // draw with MainColor for TSolidColorStyle(3), TColorCleanupStyle(2001)
Shinya Kitaoka 120a6e
      // and TBlackCleanupStyle(2002)
Shinya Kitaoka 120a6e
      if (style->getTagId() == 3 || style->getTagId() == 2001 ||
Shinya Kitaoka 120a6e
          style->getTagId() == 2002) {
Shinya Kitaoka 120a6e
        // iwsw commented out temporaly
Shinya Kitaoka 120a6e
        // if
Shinya Kitaoka 120a6e
        // (Preferences::instance()->isDoColorCorrectionByUsing3DLutEnabled())
Shinya Kitaoka 120a6e
        //	Ghibli3DLutConverter::instance()->convert(styleColor);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        p.fillRect(chipRect, QBrush(styleColor));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        // if the style is not 100% opac, draw the bottom part of the chip with
Shinya Kitaoka 120a6e
        // the pixmap with alpha
Shinya Kitaoka 120a6e
        if ((int)style->getMainColor().m !=
Shinya Kitaoka 120a6e
            (int)style->getMainColor().maxChannelValue) {
Shinya Kitaoka 120a6e
          QRect bottomRect = chipRect;
Shinya Kitaoka 120a6e
          if (m_viewMode == LargeChips) {
Shinya Kitaoka 120a6e
            bottomRect.adjust(0, bottomRect.height() - 12, 0, 0);
Shinya Kitaoka 120a6e
          } else
Shinya Kitaoka 120a6e
            bottomRect.adjust(0, bottomRect.height() - 6, 0, 0);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          TRaster32P icon = style->getIcon(qsize2Dimension(bottomRect.size()));
Shinya Kitaoka 120a6e
          p.drawPixmap(bottomRect.left(), bottomRect.top(),
Shinya Kitaoka 120a6e
                       rasterToQPixmap(icon));
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
        // Use white line for dark color. Use black line for light color.
Shinya Kitaoka 120a6e
        int val = (int)style->getMainColor().r * 30 +
Shinya Kitaoka 120a6e
                  (int)style->getMainColor().g * 59 +
Shinya Kitaoka 120a6e
                  (int)style->getMainColor().b * 11;
Shinya Kitaoka 120a6e
        if (val < 12800)
Shinya Kitaoka 120a6e
          p.setPen(Qt::white);
Shinya Kitaoka 120a6e
        else
Shinya Kitaoka 120a6e
          p.setPen(Qt::black);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      } else {
Shinya Kitaoka 120a6e
        TRaster32P icon = style->getIcon(qsize2Dimension(chipRect.size()));
Shinya Kitaoka 120a6e
        p.drawPixmap(chipRect.left(), chipRect.top(), rasterToQPixmap(icon));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        if (m_viewMode == LargeChips) {
Shinya Kitaoka 120a6e
          p.setPen(Qt::NoPen);
Shinya Kitaoka 120a6e
          p.setBrush(QColor(0, 0, 0, 140));
Shinya Kitaoka 120a6e
          QRect zabutonRect = chipRect.adjusted(0, 12, 0, -12);
Shinya Kitaoka 120a6e
          p.drawRect(zabutonRect);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
        p.setPen(Qt::white);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      p.setBrush(Qt::NoBrush);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // diagonal line indicates that the style color is changed after linked
Shinya Kitaoka 120a6e
      // from studio palette
Shinya Kitaoka 120a6e
      if (style->getIsEditedFlag()) {
Shinya Kitaoka 120a6e
        // draw diagonal line
Shinya Kitaoka 120a6e
        p.drawLine(chipRect.topRight(), chipRect.bottomLeft());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        // keep center blank for style name
Shinya Kitaoka 120a6e
        if (m_viewMode != SmallChips) {
Shinya Kitaoka 120a6e
          QRect colorNameRect = chipRect;
Shinya Kitaoka 120a6e
          if (m_viewMode == MediumChips)
Shinya Kitaoka 120a6e
            colorNameRect.adjust(2, 9, -2, -8);
Shinya Kitaoka 120a6e
          else  // LargeChip
Shinya Kitaoka 120a6e
            colorNameRect.adjust(2, 16, -2, -13);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          p.fillRect(colorNameRect, QBrush(styleColor));
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // draw style name
Shinya Kitaoka 120a6e
      QFont preFont = p.font();
Shinya Kitaoka 120a6e
      QFont tmpFont = p.font();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      if (m_viewMode != SmallChips) {
Shinya Kitaoka 120a6e
        if (m_viewMode == MediumChips) {
Shinya Kitaoka 120a6e
          tmpFont.setPixelSize(EnvSoftwareCurrentFontSize_StyleName);
Shinya Kitaoka 120a6e
          p.setFont(tmpFont);
Shinya Kitaoka 120a6e
        } else if (m_viewMode == LargeChips) {
Shinya Kitaoka 120a6e
          tmpFont.setPixelSize(EnvSoftwareCurrentFontSize_StyleName + 2);
Shinya Kitaoka 120a6e
          p.setFont(tmpFont);
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        std::wstring name     = style->getName();
Shinya Kitaoka 120a6e
        std::wstring origName = style->getOriginalName();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        // display the name (style name and original name) according to the name
Shinya Kitaoka 120a6e
        // display mode
Shinya Kitaoka 120a6e
        if (m_nameDisplayMode == Style)
Shinya Kitaoka 120a6e
          p.drawText(chipRect, Qt::AlignCenter, QString::fromStdWString(name));
Shinya Kitaoka 120a6e
        else if (m_nameDisplayMode == Original) {
Shinya Kitaoka 120a6e
          if (origName != L"") {
Shinya Kitaoka 120a6e
            tmpFont.setItalic(true);
Shinya Kitaoka 120a6e
            p.setFont(tmpFont);
Shinya Kitaoka 120a6e
            p.drawText(chipRect, Qt::AlignCenter,
Shinya Kitaoka 120a6e
                       QString::fromStdWString(origName));
Shinya Kitaoka 120a6e
          } else  // if there is no original name, then display the style name
Shinya Kitaoka 120a6e
                  // in brackets
Shinya Kitaoka 120a6e
            p.drawText(chipRect, Qt::AlignCenter,
Shinya Kitaoka 120a6e
                       QString::fromStdWString(L"( " + name + L" )"));
Shinya Kitaoka 120a6e
        } else if (m_nameDisplayMode == StyleAndOriginal) {
Shinya Kitaoka 120a6e
          p.drawText(chipRect, Qt::AlignCenter, QString::fromStdWString(name));
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
          // display original name only whne LargeChip view
Shinya Kitaoka 120a6e
          if (m_viewMode == LargeChips && origName != L"") {
Shinya Kitaoka 120a6e
            tmpFont.setItalic(true);
Shinya Kitaoka 120a6e
            tmpFont.setPixelSize(tmpFont.pixelSize() - 3);
Shinya Kitaoka 120a6e
            p.setFont(tmpFont);
Shinya Kitaoka 120a6e
            p.drawText(chipRect.adjusted(4, 4, -4, -4),
Shinya Kitaoka 120a6e
                       Qt::AlignLeft | Qt::AlignTop,
Shinya Kitaoka 120a6e
                       QString::fromStdWString(origName));
Shinya Kitaoka 120a6e
          }
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // draw the frame border if the style is selected or current
Shinya Kitaoka 120a6e
      if (m_styleSelection->isSelected(m_page->getIndex(), i) ||
Shinya Kitaoka 120a6e
          currentStyleIndex == styleIndex) {
Shinya Kitaoka 120a6e
        p.setBrush(Qt::NoBrush);
Shinya Kitaoka 120a6e
        p.drawRect(chipRect.adjusted(3, 3, -3, -3));
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // draw border
Shinya Kitaoka 120a6e
      p.setPen(Qt::black);
Shinya Kitaoka 120a6e
      p.setBrush(Qt::NoBrush);
Shinya Kitaoka 120a6e
      p.drawRect(chipRect);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // draw style index
Shinya Kitaoka 120a6e
      tmpFont.setPointSize(9);
Shinya Kitaoka 120a6e
      tmpFont.setItalic(false);
Shinya Kitaoka 120a6e
      p.setFont(tmpFont);
Shinya Kitaoka 120a6e
      int indexWidth = fontMetrics().width(QString().setNum(styleIndex)) + 4;
Shinya Kitaoka 120a6e
      QRect indexRect(chipRect.bottomRight() + QPoint(-indexWidth, -14),
Shinya Kitaoka 120a6e
                      chipRect.bottomRight());
Shinya Kitaoka 120a6e
      p.setPen(Qt::black);
Shinya Kitaoka 120a6e
      p.setBrush(Qt::white);
Shinya Kitaoka 120a6e
      p.drawRect(indexRect);
Shinya Kitaoka 120a6e
      p.drawText(indexRect, Qt::AlignCenter, QString().setNum(styleIndex));
Shinya Kitaoka 120a6e
      // revert font set
Shinya Kitaoka 120a6e
      p.setFont(preFont);
Shinya Kitaoka 120a6e
      // revert brush
Shinya Kitaoka 120a6e
      p.setBrush(Qt::NoBrush);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
      // draw link indicator
Shinya Kitaoka 120a6e
      drawToggleLink(p, chipRect, style);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // indicatore di drop
Shinya Kitaoka 120a6e
  if (m_dropPositionIndex >= 0) {
Shinya Kitaoka 120a6e
    QRect itemRect = getItemRect(m_dropPositionIndex);
Shinya Kitaoka 120a6e
    QRect rect;
Shinya Kitaoka 120a6e
    if (m_viewMode == List)
Shinya Kitaoka 120a6e
      rect = QRect(itemRect.left(), itemRect.top() - 1, itemRect.width(), 2);
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      rect = QRect(itemRect.left() - 1, itemRect.top(), 2, itemRect.height());
Shinya Kitaoka 120a6e
    p.setPen(Qt::black);
Shinya Kitaoka 120a6e
    p.drawRect(rect);
Shinya Kitaoka 120a6e
    p.setPen(Qt::white);
Shinya Kitaoka 120a6e
    p.drawRect(rect.adjusted(-1, -1, 1, 1));
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Recall computeSize().
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::resizeEvent(QResizeEvent *) { computeSize(); }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! If current page is empty return; otherwise select or unselect chip in regard
Shinya Kitaoka 120a6e
                to event position.
Shinya Kitaoka 120a6e
                */
Shinya Kitaoka 120a6e
void PageViewer::mousePressEvent(QMouseEvent *event) {
Shinya Kitaoka 120a6e
  if (!m_page) return;
Shinya Kitaoka 120a6e
  TPalette *palette = m_page->getPalette();
Shinya Kitaoka 120a6e
  QPoint pos        = event->pos();
Shinya Kitaoka 120a6e
  int indexInPage   = posToIndex(pos);
Shinya Kitaoka 120a6e
  m_startDrag       = false;
Shinya Kitaoka 120a6e
  if (!m_page) return;
Shinya Kitaoka 120a6e
  int pageIndex = m_page->getIndex();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // disable style selection in the cleanup palette in order to avoid editing
Shinya Kitaoka 120a6e
  // the styles by mistake.
Shinya Kitaoka 120a6e
  if (m_viewType == CLEANUP_PALETTE) {
Shinya Kitaoka 120a6e
    if (0 <= indexInPage && indexInPage < getChipCount()) {
Shinya Kitaoka 120a6e
      // Right-click is available
Shinya Kitaoka 120a6e
      if (event->button() == Qt::RightButton) {
Shinya Kitaoka 120a6e
        m_styleSelection->makeCurrent();
Shinya Kitaoka 120a6e
        m_styleSelection->selectNone();
Shinya Kitaoka 120a6e
        m_styleSelection->select(pageIndex);
Shinya Kitaoka 120a6e
        m_styleSelection->select(pageIndex, indexInPage, true);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      // Changing the current style is still available
Shinya Kitaoka 120a6e
      setCurrentStyleIndex(m_page->getStyleId(indexInPage));
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    update();
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (event->button() == Qt::RightButton) {
Shinya Kitaoka 120a6e
    m_styleSelection->makeCurrent();
Shinya Kitaoka 120a6e
    // if you are clicking on the color chip
Shinya Kitaoka 120a6e
    if (0 <= indexInPage && indexInPage < getChipCount()) {
Shinya Kitaoka 120a6e
      // Se pageIndex non e' selezionato lo seleziono
Shinya Kitaoka 120a6e
      if (!m_styleSelection->isSelected(pageIndex, indexInPage)) {
Shinya Kitaoka 120a6e
        m_styleSelection->select(pageIndex);
Shinya Kitaoka 120a6e
        m_styleSelection->select(pageIndex, indexInPage, true);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
      // Cambio l'indice corrente
Shinya Kitaoka 120a6e
      setCurrentStyleIndex(m_page->getStyleId(indexInPage));
Shinya Kitaoka 120a6e
    } else {
Shinya Kitaoka 120a6e
      m_styleSelection->selectNone();
Shinya Kitaoka 120a6e
      m_styleSelection->select(pageIndex);
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    update();
Shinya Kitaoka 120a6e
    // update locks when the styleSelection becomes current
Shinya Kitaoka 120a6e
    updateCommandLocks();
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  m_dragStartPosition = pos;
Shinya Kitaoka 120a6e
  if (indexInPage < 0 || indexInPage >= getChipCount()) {
Shinya Kitaoka 120a6e
    // l'utente ha fatto click fuori dai color chip. vuole deselezionare tutto
Shinya Kitaoka 120a6e
    // (lasciando la selezione attiva, per un eventuale paste)
Shinya Kitaoka 120a6e
    m_styleSelection->select(pageIndex);
Shinya Kitaoka 120a6e
    m_styleSelection->makeCurrent();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    update();
Shinya Kitaoka 120a6e
    // update locks when the styleSelection becomes current
Shinya Kitaoka 120a6e
    updateCommandLocks();
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    // O si sta selezonando un nuovo item O si vuole iniziare un drag
Shinya Kitaoka 120a6e
    if (m_styleSelection->isSelected(pageIndex, indexInPage) &&
Shinya Kitaoka 120a6e
        event->modifiers() == Qt::ControlModifier &&
Shinya Kitaoka 120a6e
        !m_page->getPalette()->isLocked())
Shinya Kitaoka 120a6e
      m_startDrag = true;
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      select(indexInPage, event);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! If left botton is pressed start drag.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::mouseMoveEvent(QMouseEvent *event) {
Shinya Kitaoka 120a6e
  if (!m_page) return;
Shinya Kitaoka 120a6e
  if (m_viewType == CLEANUP_PALETTE) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // continuo solo se e' un drag (bottone sinistro premuto)
Shinya Kitaoka 120a6e
  if (!(event->buttons() & Qt::LeftButton)) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_page->getPalette()->isLocked()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Se spingo ctrl mentre mi sto muovendo con almeno un item selezionato
Shinya Kitaoka 120a6e
  // abilito la possibilita' di fare drag.
Shinya Kitaoka 120a6e
  if (!m_startDrag && event->modifiers() == Qt::ControlModifier &&
Shinya Kitaoka 120a6e
      !m_styleSelection->isEmpty() &&
Shinya Kitaoka 120a6e
      (event->pos() - m_dragStartPosition).manhattanLength() > 12)
Shinya Kitaoka 120a6e
    m_startDrag = true;
Shinya Kitaoka 120a6e
  // faccio partire il drag&drop solo se mi sono mosso di una certa quantita'
Shinya Kitaoka 120a6e
  if ((event->pos() - m_dragStartPosition).manhattanLength() > 20 &&
Shinya Kitaoka 120a6e
      m_startDrag) {
Shinya Kitaoka 120a6e
    assert(m_styleSelection && !m_styleSelection->isEmpty());
Shinya Kitaoka 120a6e
    startDragDrop();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::mouseReleaseEvent(QMouseEvent *event) {
Shinya Kitaoka 120a6e
  if (!m_page) return;
Shinya Kitaoka 120a6e
  TPalette *palette = m_page->getPalette();
Shinya Kitaoka 120a6e
  QPoint pos        = event->pos();
Shinya Kitaoka 120a6e
  int indexInPage   = posToIndex(pos);
Shinya Kitaoka 120a6e
  if (m_startDrag && m_dropPositionIndex == -1 &&
Shinya Kitaoka 120a6e
      event->modifiers() == Qt::ControlModifier)
Shinya Kitaoka 120a6e
    select(indexInPage, event);
Shinya Kitaoka 120a6e
  m_startDrag = false;
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! If double click position is not in a chip rect return; otherwise if is in
Shinya Kitaoka 120a6e
                name rect open a text field, if is in color rect open a style
Shinya Kitaoka 120a6e
   editor.
Shinya Kitaoka 120a6e
                */
Shinya Kitaoka 120a6e
void PageViewer::mouseDoubleClickEvent(QMouseEvent *e) {
Shinya Kitaoka 120a6e
  int index = posToIndex(e->pos());
Shinya Kitaoka 120a6e
  if (index < 0 || index >= getChipCount()) return;
Shinya Kitaoka 120a6e
  TColorStyle *style = m_page->getStyle(index);
Shinya Kitaoka 120a6e
  if (!style) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_page->getPalette()->isLocked()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (m_viewMode != SmallChips) {
Shinya Kitaoka 120a6e
    QRect nameRect = getColorNameRect(index);
Shinya Kitaoka 120a6e
    if (nameRect.contains(e->pos())) {
Shinya Kitaoka 120a6e
      std::wstring styleName = style->getName();
Shinya Kitaoka 120a6e
      LineEdit *fld          = m_renameTextField;
Shinya Kitaoka 120a6e
      fld->setText(QString::fromStdWString(styleName));
Shinya Kitaoka 120a6e
      fld->setGeometry(nameRect);
Shinya Kitaoka 120a6e
      fld->show();
Shinya Kitaoka 120a6e
      fld->selectAll();
Shinya Kitaoka 120a6e
      fld->setFocus(Qt::OtherFocusReason);
Shinya Kitaoka 120a6e
      fld->setAlignment(Qt::AlignCenter);
Shinya Kitaoka 120a6e
      return;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  m_styleNameEditor->show();
Shinya Kitaoka 120a6e
  m_styleNameEditor->raise();
Shinya Kitaoka 120a6e
  m_styleNameEditor->activateWindow();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
void PageViewer::createMenuAction(QMenu &menu, const char *id, QString name,
Shinya Kitaoka 120a6e
                                  const char *slot) {
Shinya Kitaoka 120a6e
  bool ret     = true;
Shinya Kitaoka 120a6e
  QAction *act = menu.addAction(name);
Shinya Kitaoka 120a6e
  std::string slotName(slot);
Shinya Kitaoka 120a6e
  slotName = std::string("1") + slotName;
Shinya Kitaoka 120a6e
  ret      = connect(act, SIGNAL(triggered()), slotName.c_str());
Shinya Kitaoka 120a6e
  assert(ret);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::addNewColor() {
Shinya Kitaoka 120a6e
  PaletteCmd::createStyle(getPaletteHandle(), getPage());
Shinya Kitaoka 120a6e
  computeSize();
Shinya Kitaoka 120a6e
  update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::addNewPage() {
Shinya Kitaoka 120a6e
  PaletteCmd::addPage(getPaletteHandle());
Shinya Kitaoka 120a6e
  update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*! Create and open the Right-click menu in page.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::contextMenuEvent(QContextMenuEvent *event) {
Shinya Kitaoka 120a6e
  QMenu menu(this);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  CommandManager *cmd = CommandManager::instance();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  menu.addAction(cmd->getAction(MI_Copy));
Shinya Kitaoka 120a6e
  QAction *pasteValueAct = cmd->getAction(MI_PasteValues);
Shinya Kitaoka 120a6e
  menu.addAction(pasteValueAct);
Shinya Kitaoka 120a6e
  QAction *pasteColorsAct = cmd->getAction(MI_PasteColors);
Shinya Kitaoka 120a6e
  menu.addAction(pasteColorsAct);
Shinya Kitaoka 120a6e
  QAction *pasteNamesAct = cmd->getAction(MI_PasteNames);
Shinya Kitaoka 120a6e
  menu.addAction(pasteNamesAct);
Shinya Kitaoka 120a6e
  QAction *pasteAct = cmd->getAction(MI_Paste);
Shinya Kitaoka 120a6e
  menu.addAction(pasteAct);
Shinya Kitaoka 120a6e
  QAction *cutAct = cmd->getAction(MI_Cut);
Shinya Kitaoka 120a6e
  menu.addAction(cutAct);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  menu.addSeparator();
Shinya Kitaoka 120a6e
  QAction *clearAct = cmd->getAction(MI_Clear);
Shinya Kitaoka 120a6e
  menu.addAction(clearAct);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  menu.addSeparator();
Shinya Kitaoka 120a6e
  QAction *openPltGizmoAct = cmd->getAction("MI_OpenPltGizmo");
Shinya Kitaoka 120a6e
  menu.addAction(openPltGizmoAct);
Shinya Kitaoka 120a6e
  QAction *openStyleControlAct = cmd->getAction("MI_OpenStyleControl");
Shinya Kitaoka 120a6e
  menu.addAction(openStyleControlAct);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // Verifica se lo stile e' link.
Shinya Kitaoka 120a6e
  // Abilita e disabilita le voci di menu' in base a dove si e' cliccato.
Shinya Kitaoka 120a6e
  int index     = posToIndex(event->pos());
Shinya Kitaoka 120a6e
  int indexPage = m_page ? m_page->getIndex() : -1;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool isLocked = m_page ? m_page->getPalette()->isLocked() : false;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // remove links from studio palette
Shinya Kitaoka 120a6e
  if (m_viewType == LEVEL_PALETTE && m_styleSelection &&
Shinya Kitaoka 120a6e
      !m_styleSelection->isEmpty() && !isLocked) {
Shinya Kitaoka 120a6e
    menu.addSeparator();
Shinya Kitaoka 120a6e
    QAction *removeLinkAct = menu.addAction(tr("Remove Links"));
Shinya Kitaoka 120a6e
    connect(removeLinkAct, SIGNAL(triggered()), this, SLOT(removeLink()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (((indexPage == 0 && index > 0) || (indexPage > 0 && index >= 0)) &&
Shinya Kitaoka 120a6e
      index < getChipCount() && !isLocked) {
Shinya Kitaoka 120a6e
    // iwsw commented out temporarly
Shinya Kitaoka 120a6e
    /*
Shinya Kitaoka 120a6e
    wstring globalName = m_page->getStyle(index)->getGlobalName();
Shinya Kitaoka 120a6e
    if (m_viewType != STUDIO_PALETTE &&
Shinya Kitaoka 120a6e
            globalName != L"" &&
Shinya Kitaoka 120a6e
            (globalName[0] == L'-' || globalName[0] == L'+'))
Shinya Kitaoka 120a6e
    {
Shinya Kitaoka 120a6e
            createMenuAction(menu, "MI_ToggleLinkToStudioPalette", tr("Toggle
Shinya Kitaoka 120a6e
    Link to Studio Palette"), "toggleLink()");
Shinya Kitaoka 120a6e
            createMenuAction(menu, "MI_RemoveReferenceToStudioPalette",
Shinya Kitaoka 120a6e
    tr("Remove Reference to Studio Palette"), "eraseToggleLink()");
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    */
Shinya Kitaoka 120a6e
    if (pasteValueAct) pasteValueAct->setEnabled(true);
Shinya Kitaoka 120a6e
    if (pasteColorsAct) pasteColorsAct->setEnabled(true);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    pasteNamesAct->setEnabled(true);
Shinya Kitaoka 120a6e
    pasteAct->setEnabled(true);
Shinya Kitaoka 120a6e
    cutAct->setEnabled(true);
Shinya Kitaoka 120a6e
    clearAct->setEnabled(true);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    if (pasteValueAct) pasteValueAct->setEnabled(false);
Shinya Kitaoka 120a6e
    if (pasteColorsAct) pasteColorsAct->setEnabled(false);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    pasteNamesAct->setEnabled(false);
Shinya Kitaoka 120a6e
    pasteAct->setEnabled(!isLocked);
Shinya Kitaoka 120a6e
    cutAct->setEnabled(false);
Shinya Kitaoka 120a6e
    clearAct->setEnabled(false);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // get color from the original studio palette
Shinya Kitaoka 120a6e
  if (m_viewType == LEVEL_PALETTE && m_styleSelection &&
Shinya Kitaoka 120a6e
      !m_styleSelection->isEmpty() && !isLocked) {
Shinya Kitaoka 120a6e
    menu.addSeparator();
Shinya Kitaoka 120a6e
    QAction *getBackOriginalAct =
Shinya Kitaoka 120a6e
        cmd->getAction("MI_GetColorFromStudioPalette");
Shinya Kitaoka 120a6e
    menu.addAction(getBackOriginalAct);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  // iwsw commented out temporarly
Shinya Kitaoka 120a6e
  /*
Shinya Kitaoka 120a6e
  if (m_viewType != STUDIO_PALETTE)
Shinya Kitaoka 120a6e
  {
Shinya Kitaoka 120a6e
          menu.addSeparator();
Shinya Kitaoka 120a6e
          menu.addAction(cmd->getAction(MI_EraseUnusedStyles));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  */
Shinya Kitaoka 120a6e
  if (m_page) {
Shinya Kitaoka 120a6e
    QAction *newStyle = menu.addAction(tr("New Style"));
Shinya Kitaoka 120a6e
    connect(newStyle, SIGNAL(triggered()), SLOT(addNewColor()));
Shinya Kitaoka 120a6e
    QAction *newPage = menu.addAction(tr("New Page"));
Shinya Kitaoka 120a6e
    connect(newPage, SIGNAL(triggered()), SLOT(addNewPage()));
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  menu.exec(event->globalPos());
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
/*! Accept drag enter event if evant data ha format \b
Shinya Kitaoka 120a6e
 * TStyleSelection::getMimeType().
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::dragEnterEvent(QDragEnterEvent *event) {
Shinya Kitaoka 120a6e
  if (!m_page) return;
Shinya Kitaoka 120a6e
  const PaletteData *paletteData =
Shinya Kitaoka 120a6e
      dynamic_cast<const *="" palettedata="">(event->mimeData());</const>
Shinya Kitaoka 120a6e
  if (paletteData && paletteData->hasStyleIndeces()) {
Shinya Kitaoka 120a6e
    if ((m_viewType == CLEANUP_PALETTE &&
Shinya Kitaoka 120a6e
         !paletteData->getPalette()->isCleanupPalette()) ||
Shinya Kitaoka 120a6e
        (m_viewType == LEVEL_PALETTE &&
Shinya Kitaoka 120a6e
         paletteData->getPalette()->isCleanupPalette())) {
Shinya Kitaoka 120a6e
      event->ignore();
Shinya Kitaoka 120a6e
      return;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    int index = posToIndex(event->pos());
Shinya Kitaoka 120a6e
    // non si puo' spostare qualcosa nelle prime due posizioni di pagina 0
Shinya Kitaoka 120a6e
    // (occupate da BG e FG)
Shinya Kitaoka 120a6e
    if (m_page->getIndex() == 0 && index < 2) index = 2;
Shinya Kitaoka 120a6e
    if (index < 0)
Shinya Kitaoka 120a6e
      index = 0;
Shinya Kitaoka 120a6e
    else if (index > m_page->getStyleCount())
Shinya Kitaoka 120a6e
      index             = m_page->getStyleCount();
Shinya Kitaoka 120a6e
    m_dropPositionIndex = index;
Shinya Kitaoka 120a6e
    update();
Shinya Kitaoka 120a6e
    event->acceptProposedAction();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! If current page exist and index in event position is different from dropped
Shinya Kitaoka 120a6e
                index set right drop position index and accept event.
Shinya Kitaoka 120a6e
                */
Shinya Kitaoka 120a6e
void PageViewer::dragMoveEvent(QDragMoveEvent *event) {
Shinya Kitaoka 120a6e
  if (!m_page) return;
Shinya Kitaoka 120a6e
  int index = posToIndex(event->pos());
Shinya Kitaoka 120a6e
  if (index != m_dropPositionIndex) {
Shinya Kitaoka 120a6e
    if ((m_page->getStyleId(0) == 0 || m_page->getStyleId(1) == 1) && index < 2)
Shinya Kitaoka 120a6e
      index = 2;
Shinya Kitaoka 120a6e
    if (index < 0)
Shinya Kitaoka 120a6e
      index = 0;
Shinya Kitaoka 120a6e
    else if (index > m_page->getStyleCount())
Shinya Kitaoka 120a6e
      index             = m_page->getStyleCount();
Shinya Kitaoka 120a6e
    m_dropPositionIndex = index;
Shinya Kitaoka 120a6e
    update();
Shinya Kitaoka 120a6e
    event->acceptProposedAction();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! If event data has correct format drop it in current drop position index.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::dropEvent(QDropEvent *event) {
Shinya Kitaoka 120a6e
  int dstIndexInPage  = m_dropPositionIndex;
Shinya Kitaoka 120a6e
  m_dropPositionIndex = -1;
Shinya Kitaoka 120a6e
  update();
Shinya Kitaoka 120a6e
  if (!dynamic_cast<const *="" palettedata="">(event->mimeData())) return;</const>
Shinya Kitaoka 120a6e
  drop(dstIndexInPage, event->mimeData());
Shinya Kitaoka 120a6e
  event->acceptProposedAction();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set to -1 drag position index and update view.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::dragLeaveEvent(QDragLeaveEvent *event) {
Shinya Kitaoka 120a6e
  m_dropPositionIndex = -1;
Shinya Kitaoka 120a6e
  update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Start drag and drop; if current page exist set drag and drop event data.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::startDragDrop() {
Shinya Kitaoka 120a6e
  TRepetitionGuard guard;
Shinya Kitaoka 120a6e
  if (!guard.hasLock()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  assert(m_page);
Shinya Kitaoka 120a6e
  TPalette *palette = m_page->getPalette();
Shinya Kitaoka 120a6e
  if (!palette || !m_page || !m_styleSelection) return;
Shinya Kitaoka 120a6e
  int pageIndex = m_page->getIndex();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (!m_styleSelection->canHandleStyles()) return;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  PaletteData *paletteData = new PaletteData();
Shinya Kitaoka 120a6e
  paletteData->setPaletteData(palette, pageIndex,
Shinya Kitaoka 120a6e
                              m_styleSelection->getIndicesInPage());
Shinya Kitaoka 120a6e
  QDrag *drag = new QDrag(this);
Shinya Kitaoka 120a6e
  drag->setMimeData(paletteData);
Shinya Kitaoka 120a6e
  Qt::DropAction dropAction = drag->exec(Qt::MoveAction);
Shinya Kitaoka 120a6e
  if (m_dropPageCreated) {
Shinya Kitaoka 120a6e
    m_dropPageCreated = false;
Shinya Kitaoka 120a6e
    int pageIndex     = palette->getPageCount() - 1;
Shinya Kitaoka 120a6e
    if (palette->getPage(pageIndex)->getStyleCount() == 0) {
Shinya Kitaoka 120a6e
      palette->erasePage(pageIndex);
Shinya Kitaoka 120a6e
      getPaletteHandle()->notifyPaletteChanged();
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      palette->setDirtyFlag(true);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::keyPressEvent(QKeyEvent *e) {
Shinya Kitaoka 120a6e
  int key = e->key();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  if (key == Qt::Key_Up) {  // Row = frame precedente a quello settato
Shinya Kitaoka 120a6e
    int frameIndex = m_frameHandle->getFrameIndex() - 1;
Shinya Kitaoka 120a6e
    if (frameIndex < 0) return;
Shinya Kitaoka 120a6e
    m_frameHandle->setFrameIndex(frameIndex);
Shinya Kitaoka 120a6e
  } else if (key == Qt::Key_Down) {  // Row = frame successivo a quello settato
Shinya Kitaoka 120a6e
    int frameIndex = m_frameHandle->getFrameIndex() + 1;
Shinya Kitaoka 120a6e
    m_frameHandle->setFrameIndex(frameIndex);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    CommandManager *cManager = CommandManager::instance();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    if (key ==
Shinya Kitaoka 120a6e
        cManager->getKeyFromShortcut(cManager->getShortcutFromId(V_ZoomIn)))
Shinya Kitaoka 120a6e
      zoomInChip();
Shinya Kitaoka 120a6e
    else if (key ==
Shinya Kitaoka 120a6e
             cManager->getKeyFromShortcut(
Shinya Kitaoka 120a6e
                 cManager->getShortcutFromId(V_ZoomOut)))
Shinya Kitaoka 120a6e
      zoomOutChip();
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      e->ignore();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::showEvent(QShowEvent *) {
Shinya Kitaoka 120a6e
  TPaletteHandle *paletteHandle = getPaletteHandle();
Shinya Kitaoka 120a6e
  if (!paletteHandle) return;
Shinya Kitaoka 120a6e
  connect(paletteHandle, SIGNAL(colorStyleChanged()), SLOT(update()),
Shinya Kitaoka 120a6e
          Qt::UniqueConnection);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::hideEvent(QHideEvent *) {
Shinya Kitaoka 120a6e
  TPaletteHandle *paletteHandle = getPaletteHandle();
Shinya Kitaoka 120a6e
  if (!paletteHandle) return;
Shinya Kitaoka 120a6e
  disconnect(paletteHandle, SIGNAL(colorStyleChanged()), this, SLOT(update()));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Manage page tooltip.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
bool PageViewer::event(QEvent *e) {
Shinya Kitaoka 120a6e
  if (m_page && e->type() == QEvent::ToolTip) {
Shinya Kitaoka 120a6e
    QHelpEvent *helpEvent = dynamic_cast<qhelpevent *="">(e);</qhelpevent>
Shinya Kitaoka 120a6e
    QString toolTip;
Shinya Kitaoka 120a6e
    QPoint pos      = helpEvent->pos();
Shinya Kitaoka 120a6e
    int indexInPage = posToIndex(pos);
Shinya Kitaoka 120a6e
    if (0 <= indexInPage && indexInPage < m_page->getStyleCount()) {
Shinya Kitaoka 120a6e
      TColorStyle *style = m_page->getStyle(indexInPage);
Shinya Kitaoka 120a6e
      if (style) {
Shinya Kitaoka 120a6e
        int styleIndex = m_page->getStyleId(indexInPage);
Shinya Kitaoka 120a6e
        toolTip        = "#" + QString::number(styleIndex) + " " +
Shinya Kitaoka 120a6e
                  QString::fromStdWString(style->getName());
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
        int shortcutKey = m_page->getPalette()->getStyleShortcut(styleIndex);
Shinya Kitaoka 120a6e
        if (shortcutKey > 0)
Shinya Kitaoka 120a6e
          toolTip += QString::fromStdWString(std::wstring(L" (") +
Shinya Kitaoka 120a6e
                                             (wchar_t)shortcutKey + L")");
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
    if (toolTip != "")
Shinya Kitaoka 120a6e
      QToolTip::showText(helpEvent->globalPos(), toolTip);
Shinya Kitaoka 120a6e
    else
Shinya Kitaoka 120a6e
      QToolTip::hideText();
Shinya Kitaoka 120a6e
    e->accept();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  return QFrame::event(e);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Add chip identified by \b indexInPage to style selection if it was not
Shinya Kitaoka 120a6e
                selected; remove it from style selection otherwise. Manage CTRL
Shinya Kitaoka 120a6e
   SHIFT
Shinya Kitaoka 120a6e
                pressed case.
Shinya Kitaoka 120a6e
                */
Shinya Kitaoka 120a6e
void PageViewer::select(int indexInPage, QMouseEvent *event) {
Shinya Kitaoka 120a6e
  bool selected = false;
Shinya Kitaoka 120a6e
  assert(m_page);
Shinya Kitaoka 120a6e
  TPalette *palette = m_page->getPalette();
Shinya Kitaoka 120a6e
  int pageIndex     = m_page->getIndex();
Shinya Kitaoka 120a6e
  bool on           = true;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool wasSelected = m_styleSelection->isSelected(pageIndex, indexInPage);
Shinya Kitaoka 120a6e
  if (event->modifiers() == Qt::NoModifier)
Shinya Kitaoka 120a6e
    m_styleSelection->selectNone();
Shinya Kitaoka 120a6e
  else if (event->modifiers() == Qt::CTRL && wasSelected)
Shinya Kitaoka 120a6e
    on = false;
Shinya Kitaoka 120a6e
  else if (event->modifiers() == Qt::SHIFT && !m_styleSelection->isEmpty()) {
Shinya Kitaoka 120a6e
    // premuto shift. la selezione si estende fino ai piu' vicini colori
Shinya Kitaoka 120a6e
    // selezionati (prima e dopo)
Shinya Kitaoka 120a6e
    // a e' b diventeranno gli estremi della selezione
Shinya Kitaoka 120a6e
    int a = -1, b = -1, i = 0;
Shinya Kitaoka 120a6e
    for (i = 0; i < m_page->getStyleCount(); i++)
Shinya Kitaoka 120a6e
      if (m_styleSelection->isSelected(pageIndex, i)) {
Shinya Kitaoka 120a6e
        if (i < indexInPage)
Shinya Kitaoka 120a6e
          a = i;
Shinya Kitaoka 120a6e
        else if (i > indexInPage) {
Shinya Kitaoka 120a6e
          b = i;
Shinya Kitaoka 120a6e
          break;
Shinya Kitaoka 120a6e
        }
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    if (a >= 0 && b >= 0) {
Shinya Kitaoka 120a6e
      assert(a < indexInPage && indexInPage < b);
Shinya Kitaoka 120a6e
      a++;
Shinya Kitaoka 120a6e
      b--;
Shinya Kitaoka 120a6e
    } else if (a >= 0) {
Shinya Kitaoka 120a6e
      assert(b < 0 && a < indexInPage);
Shinya Kitaoka 120a6e
      a++;
Shinya Kitaoka 120a6e
      b = indexInPage;
Shinya Kitaoka 120a6e
    } else if (b >= 0) {
Shinya Kitaoka 120a6e
      assert(a < 0 && indexInPage < b);
Shinya Kitaoka 120a6e
      b--;
Shinya Kitaoka 120a6e
      a = indexInPage;
Shinya Kitaoka 120a6e
    } else
Shinya Kitaoka 120a6e
      a = b = indexInPage;
Shinya Kitaoka 120a6e
    for (i = a; i <= b; i++) {
Shinya Kitaoka 120a6e
      m_styleSelection->select(pageIndex, i, true);
Shinya Kitaoka 120a6e
      selected = true;
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool isStyleChanged = false;
Shinya Kitaoka 120a6e
  if (on) selected    = true;
Shinya Kitaoka 120a6e
  int styleIndex      = m_page->getStyleId(indexInPage);
Shinya Kitaoka 120a6e
  if (selected) {
Shinya Kitaoka 120a6e
    setCurrentStyleIndex(styleIndex);
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    ChangeStyleCommand *changeStyleCommand = getChangeStyleCommand();
Shinya Kitaoka 120a6e
    if (changeStyleCommand)
Shinya Kitaoka 120a6e
      isStyleChanged = changeStyleCommand->onStyleChanged();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  if (!isStyleChanged) {
Shinya Kitaoka 120a6e
    m_styleSelection->select(pageIndex, indexInPage, on);
Shinya Kitaoka 120a6e
    m_styleSelection->makeCurrent();
Shinya Kitaoka 120a6e
    updateCommandLocks();
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Compute page size in regard to chip count.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::computeSize() {
Shinya Kitaoka 120a6e
  if (!m_page) {
Shinya Kitaoka 120a6e
    m_chipPerRow = 0;
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  int w          = parentWidget()->width();
Shinya Kitaoka 120a6e
  int chipCount  = getChipCount();
Shinya Kitaoka 120a6e
  QSize chipSize = getChipSize();
Shinya Kitaoka 120a6e
  m_chipPerRow   = m_viewMode == List ? 1 : (w - 8) / chipSize.width();
Shinya Kitaoka 120a6e
  if (m_chipPerRow == 0) m_chipPerRow = 1;
Shinya Kitaoka 120a6e
  int rowCount = (chipCount + m_chipPerRow - 1) / m_chipPerRow;
Shinya Kitaoka 120a6e
  setMinimumSize(w, rowCount * chipSize.height() + 10);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! If palette, referred to current page, exist and is animated set it to
Shinya Kitaoka 120a6e
                current frame.
Shinya Kitaoka 120a6e
                */
Shinya Kitaoka 120a6e
void PageViewer::onFrameChanged() {
Shinya Kitaoka 120a6e
  TPalette *palette = (m_page) ? m_page->getPalette() : 0;
Shinya Kitaoka 120a6e
  if (palette && palette->isAnimated()) update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Rename current style and update its view in current page.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
// recall from m_renameTextField
Shinya Kitaoka 120a6e
void PageViewer::onStyleRenamed() {
Shinya Kitaoka 120a6e
  m_renameTextField->hide();
Shinya Kitaoka 120a6e
  std::wstring newName = m_renameTextField->text().toStdWString();
Shinya Kitaoka 120a6e
  assert(getPaletteHandle());
Shinya Kitaoka 120a6e
  PaletteCmd::renamePaletteStyle(getPaletteHandle(), newName);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Recall \b TStyleSelection::toggleLink() to current page style selection.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::toggleLink() {
Shinya Kitaoka 120a6e
  if (!m_page || !m_styleSelection || m_styleSelection->isEmpty()) return;
Shinya Kitaoka 120a6e
  m_styleSelection->toggleLink();
Shinya Kitaoka 120a6e
  update();
Shinya Kitaoka 120a6e
  emit changeWindowTitleSignal();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Shinya Kitaoka 120a6e
/*! Recall \b TStyleSelection::eraseToggleLink() to current page style
Shinya Kitaoka 120a6e
 * selection.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::eraseToggleLink() {
Shinya Kitaoka 120a6e
  if (!m_page || !m_styleSelection || m_styleSelection->isEmpty()) return;
Shinya Kitaoka 120a6e
  m_styleSelection->eraseToggleLink();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
/*! \class PaletteViewerGUI::PaletteTabBar
Shinya Kitaoka 120a6e
                \brief The PaletteTabBar class provides a bar with tab to show
Shinya Kitaoka 120a6e
   and manage palette
Shinya Kitaoka 120a6e
                page.
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
                Inherits \b QTabBar.
Shinya Kitaoka 120a6e
                This object allows to move a tab with mouseMoveEvent, rename a
Shinya Kitaoka 120a6e
   tab in
Shinya Kitaoka 120a6e
                doubleClickevent and create a new tab in drag and drop.
Shinya Kitaoka 120a6e
                */
Toshihiro Shimizu 890ddd
/*!	\fn void PaletteTabBar::setPageViewer(PageViewer *pageViewer)
Shinya Kitaoka 120a6e
                Set current tab bar page to \b pageViewer.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
                \fn void PaletteTabBar::tabTextChanged(int index)
Shinya Kitaoka 120a6e
                This signal is emitted when tab associated text change.
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
                \fn void PaletteTabBar::movePage(int srcIndex, int dstIndex)
Shinya Kitaoka 120a6e
                This signal is emitted to notify tab position change.
Shinya Kitaoka 120a6e
                */
Toshihiro Shimizu 890ddd
PaletteTabBar::PaletteTabBar(QWidget *parent, bool hasPageCommand)
Shinya Kitaoka 120a6e
    : QTabBar(parent)
Shinya Kitaoka 120a6e
    , m_renameTextField(new LineEdit(this))
Shinya Kitaoka 120a6e
    , m_renameTabIndex(-1)
Shinya Kitaoka 120a6e
    , m_pageViewer(0)
Shinya Kitaoka 120a6e
    , m_hasPageCommand(hasPageCommand) {
Shinya Kitaoka 120a6e
  setObjectName("PaletteTabBar");
Shinya Kitaoka 120a6e
  setDrawBase(false);
Shinya Kitaoka 120a6e
  m_renameTextField->hide();
Shinya Kitaoka 120a6e
  connect(m_renameTextField, SIGNAL(editingFinished()), this,
Shinya Kitaoka 120a6e
          SLOT(updateTabName()));
Shinya Kitaoka 120a6e
  if (m_hasPageCommand) setAcceptDrops(true);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Hide rename text field and recall \b QTabBar::mousePressEvent().
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PaletteTabBar::mousePressEvent(QMouseEvent *event) {
Shinya Kitaoka 120a6e
  m_renameTextField->hide();
Shinya Kitaoka 120a6e
  QTabBar::mousePressEvent(event);
Shinya Kitaoka 120a6e
  m_pageViewer->getSelection()->select(currentIndex());
Shinya Kitaoka 120a6e
  m_pageViewer->getSelection()->makeCurrent();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! If left button is pressed and a tab is selected emit signal \b movePage.
Shinya Kitaoka 120a6e
                In any case recall \b QTabBar::mousePressEvent().
Shinya Kitaoka 120a6e
                */
Shinya Kitaoka 120a6e
void PaletteTabBar::mouseMoveEvent(QMouseEvent *event) {
Shinya Kitaoka 120a6e
  if (event->buttons() == Qt::LeftButton &&
Shinya Kitaoka 120a6e
      event->modifiers() == Qt::ControlModifier &&
Shinya Kitaoka 120a6e
      !m_pageViewer->getPage()->getPalette()->isLocked()) {
Shinya Kitaoka 120a6e
    int srcIndex = currentIndex();
Shinya Kitaoka 120a6e
    int dstIndex = tabAt(event->pos());
Shinya Kitaoka 120a6e
    if (dstIndex >= 0 && dstIndex < count() && dstIndex != srcIndex) {
Shinya Kitaoka 120a6e
      QRect rect = tabRect(srcIndex);
Shinya Kitaoka 120a6e
      int x      = event->pos().x();
Shinya Kitaoka 120a6e
      if (x < rect.left() || x > rect.right()) {
Shinya Kitaoka 120a6e
        emit movePage(srcIndex, dstIndex);
Shinya Kitaoka 120a6e
      }
Shinya Kitaoka 120a6e
    }
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  QTabBar::mouseMoveEvent(event);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Set a text field with focus in event position to edit tab name.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PaletteTabBar::mouseDoubleClickEvent(QMouseEvent *event) {
Shinya Kitaoka 120a6e
  if (!m_hasPageCommand) return;
Shinya Kitaoka 120a6e
  if (m_pageViewer->getPage()->getPalette()->isLocked()) return;
Shinya Kitaoka 120a6e
  int index = tabAt(event->pos());
Shinya Kitaoka 120a6e
  if (index < 0) return;
Shinya Kitaoka 120a6e
  m_renameTabIndex = index;
Shinya Kitaoka 120a6e
  LineEdit *fld    = m_renameTextField;
Shinya Kitaoka 120a6e
  fld->setText(tabText(index));
Shinya Kitaoka 120a6e
  fld->setGeometry(tabRect(index));
Shinya Kitaoka 120a6e
  fld->setAlignment(Qt::AlignCenter);
Shinya Kitaoka 120a6e
  fld->show();
Shinya Kitaoka 120a6e
  fld->selectAll();
Shinya Kitaoka 120a6e
  fld->setFocus(Qt::OtherFocusReason);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! If event data is a paletteData accept drag event; otherwise return.
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PaletteTabBar::dragEnterEvent(QDragEnterEvent *event) {
Shinya Kitaoka 120a6e
  if (!m_hasPageCommand) return;
Shinya Kitaoka 120a6e
  const PaletteData *paletteData =
Shinya Kitaoka 120a6e
      dynamic_cast<const *="" palettedata="">(event->mimeData());</const>
Shinya Kitaoka 120a6e
  if (!paletteData) return;
Shinya Kitaoka 120a6e
  if ((m_pageViewer->getViewType() == CLEANUP_PALETTE &&
Shinya Kitaoka 120a6e
       !paletteData->getPalette()->isCleanupPalette()) ||
Shinya Kitaoka 120a6e
      (m_pageViewer->getViewType() == LEVEL_PALETTE &&
Shinya Kitaoka 120a6e
       paletteData->getPalette()->isCleanupPalette())) {
Shinya Kitaoka 120a6e
    event->ignore();
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  event->acceptProposedAction();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! If tab in event position exist set it as current, otherwise create a new tab
Shinya Kitaoka 120a6e
                recalling PageViewer::createDropPage().
Shinya Kitaoka 120a6e
                */
Shinya Kitaoka 120a6e
void PaletteTabBar::dragMoveEvent(QDragMoveEvent *event) {
Shinya Kitaoka 120a6e
  if (!m_hasPageCommand) return;
Shinya Kitaoka 120a6e
  const PaletteData *paletteData =
Shinya Kitaoka 120a6e
      dynamic_cast<const *="" palettedata="">(event->mimeData());</const>
Shinya Kitaoka 120a6e
  if (!paletteData) return;
Shinya Kitaoka 120a6e
  if (paletteData->getPalette() == m_pageViewer->getPage()->getPalette() &&
Shinya Kitaoka 120a6e
      paletteData->hasOnlyPalette())
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  int tabIndex = tabAt(event->pos());
Shinya Kitaoka 120a6e
  if (0 <= tabIndex && tabIndex < count())
Shinya Kitaoka 120a6e
    setCurrentIndex(tabIndex);
Shinya Kitaoka 120a6e
  else
Shinya Kitaoka 120a6e
    m_pageViewer->createDropPage();
Shinya Kitaoka 120a6e
  event->acceptProposedAction();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! Recall PageViewer::drop().
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PaletteTabBar::dropEvent(QDropEvent *event) {
Shinya Kitaoka 120a6e
  if (!m_hasPageCommand) return;
Shinya Kitaoka 120a6e
  if (!dynamic_cast<const *="" palettedata="">(event->mimeData())) return;</const>
Shinya Kitaoka 120a6e
  m_pageViewer->drop(-1, event->mimeData());
Shinya Kitaoka 120a6e
  event->acceptProposedAction();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! If current rename tab index is a valid index, set tab text to rename text
Shinya Kitaoka 120a6e
                field text; hide the rename text field and emit tabTextChanged()
Shinya Kitaoka 120a6e
   signal.
Shinya Kitaoka 120a6e
                */
Shinya Kitaoka 120a6e
void PaletteTabBar::updateTabName() {
Shinya Kitaoka 120a6e
  int index = m_renameTabIndex;
Shinya Kitaoka 120a6e
  if (index < 0) return;
Shinya Kitaoka 120a6e
  m_renameTabIndex = -1;
Shinya Kitaoka 120a6e
  if (m_renameTextField->text() != "")
Shinya Kitaoka 120a6e
    setTabText(index, m_renameTextField->text());
Shinya Kitaoka 120a6e
  m_renameTextField->hide();
Shinya Kitaoka 120a6e
  emit tabTextChanged(index);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//=============================================================================
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
/*!
Toshihiro Shimizu 890ddd
  \class  PaletteViewerGUI::PaletteIconWidget
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
  \brief  PaletteIconWidget class provides a widget to show a palette icon.
Toshihiro Shimizu 890ddd
  */
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#if QT_VERSION >= 0x050500
Toshihiro Shimizu 890ddd
PaletteIconWidget::PaletteIconWidget(QWidget *parent, Qt::WindowFlags flags)
Toshihiro Shimizu 890ddd
#else
Toshihiro Shimizu 890ddd
PaletteIconWidget::PaletteIconWidget(QWidget *parent, Qt::WFlags flags)
Toshihiro Shimizu 890ddd
#endif
Shinya Kitaoka 120a6e
    : QWidget(parent, flags), m_isOver(false) {
Shinya Kitaoka 120a6e
  setFixedSize(30, 20);
Shinya Kitaoka 120a6e
  setToolTip(QObject::tr("Palette"));
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
PaletteIconWidget::~PaletteIconWidget() {}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PaletteIconWidget::paintEvent(QPaintEvent *) {
Shinya Kitaoka 120a6e
  QPainter p(this);
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (m_isOver) {
Shinya Kitaoka 120a6e
    static QPixmap dragPaletteIconPixmapOver(":Resources/dragpalette_over.png");
Shinya Kitaoka 120a6e
    p.drawPixmap(5, 2, dragPaletteIconPixmapOver);
Shinya Kitaoka 120a6e
  } else {
Shinya Kitaoka 120a6e
    static QPixmap dragPaletteIconPixmap(":Resources/dragpalette.png");
Shinya Kitaoka 120a6e
    p.drawPixmap(5, 2, dragPaletteIconPixmap);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PaletteIconWidget::mousePressEvent(QMouseEvent *me) {
Shinya Kitaoka 120a6e
  if (me->button() != Qt::LeftButton) {
Shinya Kitaoka 120a6e
    me->ignore();
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  m_mousePressPos = me->pos();
Shinya Kitaoka 120a6e
  m_dragged       = false;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  me->accept();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PaletteIconWidget::mouseMoveEvent(QMouseEvent *me) {
Shinya Kitaoka 120a6e
  if ((me->pos() - m_mousePressPos).manhattanLength() > 20 && !m_dragged) {
Shinya Kitaoka 120a6e
    m_dragged = true;
Shinya Kitaoka 120a6e
    emit startDrag();
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  me->accept();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PaletteIconWidget::enterEvent(QEvent *event) { m_isOver = true; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PaletteIconWidget::leaveEvent(QEvent *event) { m_isOver = false; }
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::zoomInChip() {
Shinya Kitaoka 120a6e
  ViewMode currentView = getViewMode();
Shinya Kitaoka 120a6e
  if (currentView == List || currentView == LargeChips)
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  else if (currentView == SmallChips)
Shinya Kitaoka 120a6e
    setViewMode(MediumChips);
Shinya Kitaoka 120a6e
  else if (currentView == MediumChips)
Shinya Kitaoka 120a6e
    setViewMode(LargeChips);
Toshihiro Shimizu 890ddd
}
Shinya Kitaoka 120a6e
void PageViewer::zoomOutChip() {
Shinya Kitaoka 120a6e
  ViewMode currentView = getViewMode();
Shinya Kitaoka 120a6e
  if (currentView == List || currentView == SmallChips)
Shinya Kitaoka 120a6e
    return;
Shinya Kitaoka 120a6e
  else if (currentView == LargeChips)
Shinya Kitaoka 120a6e
    setViewMode(MediumChips);
Shinya Kitaoka 120a6e
  else if (currentView == MediumChips)
Shinya Kitaoka 120a6e
    setViewMode(SmallChips);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
void PageViewer::setNameDisplayMode(NameDisplayMode mode) {
Shinya Kitaoka 120a6e
  if (m_nameDisplayMode == mode) return;
Shinya Kitaoka 120a6e
  m_nameDisplayMode = mode;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  update();
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! lock the commands when the styleSelection set to current
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::updateCommandLocks() {
Shinya Kitaoka 120a6e
  if (!m_page) return;
Shinya Kitaoka 120a6e
  // iwasawa
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool isLocked = m_page->getPalette()->isLocked();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  CommandManager *cmd = CommandManager::instance();
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  cmd->getAction("MI_Paste")->setEnabled(!isLocked);
Shinya Kitaoka 120a6e
  cmd->getAction("MI_PasteValues")->setEnabled(!isLocked);
Shinya Kitaoka 120a6e
  cmd->getAction("MI_PasteColors")->setEnabled(!isLocked);
Shinya Kitaoka 120a6e
  cmd->getAction("MI_Clear")->setEnabled(!isLocked);
Shinya Kitaoka 120a6e
  cmd->getAction("MI_BlendColors")->setEnabled(!isLocked);
Shinya Kitaoka 120a6e
  cmd->getAction("MI_PasteNames")->setEnabled(!isLocked);
Shinya Kitaoka 120a6e
  cmd->getAction("MI_GetColorFromStudioPalette")->setEnabled(!isLocked);
Toshihiro Shimizu 890ddd
}
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//-----------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
/*! remove link and revert to the normal style
Toshihiro Shimizu 890ddd
*/
Shinya Kitaoka 120a6e
void PageViewer::removeLink() {
Shinya Kitaoka 120a6e
  if (!m_page || !m_styleSelection || m_styleSelection->isEmpty()) return;
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  if (m_styleSelection->removeLink()) emit changeWindowTitleSignal();
Toshihiro Shimizu 890ddd
}