| |
| |
|
|
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| using namespace DVGui; |
| |
| namespace |
| { |
| TPaletteHandle *getPaletteHandle() |
| { |
| return TApp::instance()->getPaletteController()->getCurrentLevelPalette(); |
| } |
| |
| } |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| ColorModelViewer::ColorModelViewer(QWidget *parent) |
| : FlipBook(parent, |
| QString(tr("Color Model")), |
| FlipConsole::cFullConsole & (~(FlipConsole::eFilterRgbm | FlipConsole::cFilterGRgb | FlipConsole::eRate | FlipConsole::eSound | FlipConsole::eSaveImg | FlipConsole::eHisto | FlipConsole::eCompare | FlipConsole::eCustomize | FlipConsole::eSave | FlipConsole::eFilledRaster | FlipConsole::eDefineLoadBox | FlipConsole::eUseLoadBox | FlipConsole::eDefineSubCamera)), |
| eDontKeepFilesOpened, true), |
| m_mode(0), m_currentRefImgPath(TFilePath()) |
| { |
| setObjectName("colormodel"); |
| |
| setToolCursor(m_imageViewer, ToolCursor::PickerCursor); |
| |
| |
| disconnect(parentWidget(), SIGNAL(closeButtonPressed()), this, SLOT(onCloseButtonPressed())); |
| |
| bool ret = connect(this, SIGNAL(refImageNotFound()), this, SLOT(onRefImageNotFound()), Qt::QueuedConnection); |
| assert(ret); |
| |
| m_imageViewer->setMouseTracking(true); |
| } |
| |
| |
| ColorModelViewer::~ColorModelViewer() |
| { |
| } |
| |
| |
| |
| |
| |
| void ColorModelViewer::dragEnterEvent(QDragEnterEvent *event) |
| { |
| TPalette *palette = getPaletteHandle()->getPalette(); |
| if (!palette) |
| return; |
| const QMimeData *mimeData = event->mimeData(); |
| if (!acceptResourceDrop(mimeData->urls())) |
| return; |
| |
| foreach (QUrl url, mimeData->urls()) { |
| TFilePath fp(url.toLocalFile().toStdWString()); |
| std::string type = fp.getType(); |
| if (type == "scr" || type == "tpl") |
| return; |
| } |
| event->acceptProposedAction(); |
| } |
| |
| |
| |
| |
| |
| void ColorModelViewer::dropEvent(QDropEvent *event) |
| { |
| const QMimeData *mimeData = event->mimeData(); |
| if (mimeData->hasUrls()) { |
| foreach (QUrl url, mimeData->urls()) { |
| TFilePath fp(url.toLocalFile().toStdWString()); |
| loadImage(fp); |
| setLevel(fp); |
| } |
| event->acceptProposedAction(); |
| } |
| } |
| |
| |
| |
| |
| |
| void ColorModelViewer::loadImage(const TFilePath &fp) |
| { |
| if (fp.isEmpty()) |
| return; |
| |
| TPaletteHandle *paletteHandle = getPaletteHandle(); |
| if (!paletteHandle->getPalette()) |
| return; |
| |
| std::string type(fp.getType()); |
| |
| QString question(QObject::tr("The color model palette is different from the destination palette.\nWhat do you want to do? ")); |
| QList<QString> list; |
| list.append(QObject::tr("Overwrite the destination palette.")); |
| list.append(QObject::tr("Keep the destination palette and apply it to the color model.")); |
| |
| if (type != "tlv" && type != "pli") |
| list.append(QObject::tr("Add color model's palette to the destination palette.")); |
| |
| int ret = DVGui::RadioButtonMsgBox(DVGui::WARNING, question, list); |
| |
| PaletteCmd::ColorModelPltBehavior pltBehavior; |
| switch (ret) |
| { |
| case 0: |
| return; |
| case 1: |
| pltBehavior = PaletteCmd::KeepColorModelPlt; |
| break; |
| case 2: |
| pltBehavior = PaletteCmd::ReplaceColorModelPlt; |
| break; |
| case 3: |
| pltBehavior = PaletteCmd::AddColorModelPlt; |
| break; |
| default: |
| pltBehavior = PaletteCmd::KeepColorModelPlt; |
| break; |
| } |
| |
| ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); |
| |
| int paletteFrame = 0; |
| |
| PaletteCmd::loadReferenceImage(paletteHandle, pltBehavior, fp, paletteFrame, scene); |
| |
| TXshLevel *level = TApp::instance()->getCurrentLevel()->getLevel(); |
| if (!level) |
| return; |
| std::vector<TFrameId> fids; |
| level->getFids(fids); |
| invalidateIcons(level, fids); |
| } |
| |
| |
| |
| |
| void ColorModelViewer::contextMenuEvent(QContextMenuEvent *event) |
| { |
| |
| TApp *app = TApp::instance(); |
| TXshLevel *xl = app->getCurrentLevel()->getLevel(); |
| if (!xl) |
| return; |
| TXshSimpleLevel *sl = xl->getSimpleLevel(); |
| if (!sl) |
| return; |
| TPalette *currentPalette = app->getPaletteController()->getCurrentLevelPalette()->getPalette(); |
| if (!currentPalette) |
| return; |
| |
| QMenu menu(this); |
| |
| menu.addAction(CommandManager::instance()->getAction(MI_LoadColorModel)); |
| |
| QAction *loadCurrentFrame = new QAction(QString(tr("Use Current Frame")), this); |
| connect(loadCurrentFrame, SIGNAL(triggered()), SLOT(loadCurrentFrame())); |
| menu.addAction(loadCurrentFrame); |
| |
| QAction *removeColorModel = new QAction(QString(tr("Remove Color Model")), this); |
| connect(removeColorModel, SIGNAL(triggered()), SLOT(removeColorModel())); |
| menu.addAction(removeColorModel); |
| |
| menu.addSeparator(); |
| |
| QString shortcut = QString::fromStdString(CommandManager::instance()->getShortcutFromId(V_ZoomReset)); |
| QAction *reset = menu.addAction(tr("Reset View") + "\t " + shortcut); |
| connect(reset, SIGNAL(triggered()), m_imageViewer, SLOT(resetView())); |
| |
| shortcut = QString::fromStdString(CommandManager::instance()->getShortcutFromId(V_ZoomFit)); |
| QAction *fit = menu.addAction(tr("Fit to Window") + "\t" + shortcut); |
| connect(fit, SIGNAL(triggered()), m_imageViewer, SLOT(fitView())); |
| |
| menu.exec(event->globalPos()); |
| } |
| |
| |
| |
| |
| void ColorModelViewer::mousePressEvent(QMouseEvent *event) |
| { |
| if (event->button() == Qt::LeftButton) |
| pick(event->pos()); |
| } |
| |
| |
| |
| |
| void ColorModelViewer::mouseMoveEvent(QMouseEvent *event) |
| { |
| if (event->buttons() & Qt::LeftButton) |
| pick(event->pos()); |
| } |
| |
| |
| |
| |
| void ColorModelViewer::pick(const QPoint &p) |
| { |
| TImageP img = m_imageViewer->getImage(); |
| if (!img) |
| return; |
| |
| TPaletteHandle *ph = TApp::instance()->getPaletteController()->getCurrentLevelPalette(); |
| TPalette *currentPalette = ph->getPalette(); |
| if (!currentPalette) |
| return; |
| |
| |
| if (!m_imageViewer->rect().contains(p)) |
| return; |
| |
| StylePicker picker(img, currentPalette); |
| |
| QPoint viewP = m_imageViewer->mapFrom(this, p); |
| TPointD pos = m_imageViewer->getViewAff().inv() * TPointD(viewP.x() - m_imageViewer->width() / 2, |
| -viewP.y() + m_imageViewer->height() / 2); |
| |
| |
| |
| |
| |
| int styleIndex = picker.pickStyleId(pos, 1, m_mode); |
| |
| if (styleIndex < 0) |
| return; |
| |
| |
| if (m_mode == 1) { |
| if (styleIndex == 0) |
| return; |
| TToonzImageP ti = img; |
| if (ti && picker.pickTone(pos) == 255) |
| return; |
| } |
| |
| TPalette::Page *page = currentPalette->getStylePage(styleIndex); |
| if (!page) |
| return; |
| |
| |
| TSelection *selection = TApp::instance()->getCurrentSelection()->getSelection(); |
| if (selection) { |
| TStyleSelection *styleSelection = dynamic_cast<TStyleSelection *>(selection); |
| if (styleSelection) |
| styleSelection->selectNone(); |
| } |
| |
| ph->setStyleIndex(styleIndex); |
| } |
| |
| |
| |
| void ColorModelViewer::hideEvent(QHideEvent *e) |
| { |
| TPaletteHandle *paletteHandle = getPaletteHandle(); |
| TXshLevelHandle *levelHandle = TApp::instance()->getCurrentLevel(); |
| ToolHandle *toolHandle = TApp::instance()->getCurrentTool(); |
| disconnect(paletteHandle, SIGNAL(paletteSwitched()), this, SLOT(showCurrentImage())); |
| disconnect(paletteHandle, SIGNAL(paletteChanged()), this, SLOT(showCurrentImage())); |
| disconnect(paletteHandle, SIGNAL(colorStyleChanged()), this, SLOT(showCurrentImage())); |
| |
| disconnect(toolHandle, SIGNAL(toolSwitched()), this, SLOT(changePickType())); |
| disconnect(toolHandle, SIGNAL(toolChanged()), this, SLOT(changePickType())); |
| |
| disconnect(levelHandle, SIGNAL(xshLevelViewChanged()), this, SLOT(updateViewer())); |
| } |
| |
| |
| |
| void ColorModelViewer::showEvent(QShowEvent *e) |
| { |
| TPaletteHandle *paletteHandle = getPaletteHandle(); |
| TXshLevelHandle *levelHandle = TApp::instance()->getCurrentLevel(); |
| ToolHandle *toolHandle = TApp::instance()->getCurrentTool(); |
| bool ret = connect(paletteHandle, SIGNAL(paletteSwitched()), this, SLOT(showCurrentImage())); |
| ret = ret && connect(paletteHandle, SIGNAL(paletteChanged()), this, SLOT(showCurrentImage())); |
| ret = ret && connect(paletteHandle, SIGNAL(colorStyleChanged()), this, SLOT(showCurrentImage())); |
| |
| ret = ret && connect(toolHandle, SIGNAL(toolSwitched()), this, SLOT(changePickType())); |
| ret = ret && connect(toolHandle, SIGNAL(toolChanged()), this, SLOT(changePickType())); |
| ret = ret && connect(levelHandle, SIGNAL(xshLevelViewChanged()), this, SLOT(updateViewer())); |
| assert(ret); |
| changePickType(); |
| showCurrentImage(); |
| } |
| |
| |
| |
| void ColorModelViewer::changePickType() |
| { |
| TPropertyGroup *propGroup = TApp::instance()->getCurrentTool()->getTool()->getProperties(0); |
| |
| if (!propGroup) { |
| m_mode = 2; |
| setToolCursor(m_imageViewer, ToolCursor::PickerCursor); |
| return; |
| } |
| |
| |
| TProperty *modeProp = propGroup->getProperty("Mode:"); |
| if (!modeProp) { |
| m_mode = 2; |
| setToolCursor(m_imageViewer, ToolCursor::PickerCursor); |
| return; |
| } |
| |
| else { |
| std::string var = modeProp->getValueAsString(); |
| if (var == LINES) { |
| m_mode = 1; |
| setToolCursor(m_imageViewer, ToolCursor::PickerCursorLine); |
| } else if (var == AREAS) { |
| m_mode = 0; |
| setToolCursor(m_imageViewer, ToolCursor::PickerCursorArea); |
| } else |
| { |
| m_mode = 2; |
| setToolCursor(m_imageViewer, ToolCursor::PickerCursor); |
| } |
| } |
| } |
| |
| |
| |
| |
| |
| |
| void ColorModelViewer::updateViewer() |
| { |
| getImageViewer()->repaint(); |
| } |
| |
| |
| |
| void ColorModelViewer::showCurrentImage() |
| { |
| TPalette *palette = getPaletteHandle()->getPalette(); |
| if (!palette) { |
| resetImageViewer(); |
| return; |
| } |
| TApp *app = TApp::instance(); |
| TXshLevel *xl = app->getCurrentLevel()->getLevel(); |
| if (!xl) { |
| resetImageViewer(); |
| return; |
| } |
| |
| if (palette->getRefImgPath() == xl->getPath()) { |
| TXshSimpleLevel *sl = xl->getSimpleLevel(); |
| if (!sl) { |
| resetImageViewer(); |
| return; |
| } |
| |
| if (m_currentRefImgPath == xl->getPath()) { |
| TImageP refImg = m_imageViewer->getImage(); |
| if (!refImg) { |
| resetImageViewer(); |
| return; |
| } |
| |
| TImageP refImg_clone = refImg->cloneImage(); |
| refImg_clone->setPalette(palette); |
| m_imageViewer->setImage(refImg_clone); |
| return; |
| } |
| |
| else { |
| reloadCurrentFrame(); |
| return; |
| } |
| } |
| |
| |
| resetImageViewer(); |
| |
| ToonzScene *scene = TApp::instance()->getCurrentScene()->getScene(); |
| TFilePath fp = scene->decodeFilePath(palette->getRefImgPath()); |
| if (TSystem::doesExistFileOrLevel(fp)) { |
| setLevel(fp, palette); |
| } else if (!fp.isEmpty()) |
| emit refImageNotFound(); |
| } |
| |
| |
| |
| |
| void ColorModelViewer::loadCurrentFrame() |
| { |
| TApp *app = TApp::instance(); |
| TXshLevel *xl = app->getCurrentLevel()->getLevel(); |
| if (!xl) |
| return; |
| TXshSimpleLevel *sl = xl->getSimpleLevel(); |
| if (!sl) |
| return; |
| |
| TFrameId fid; |
| if (app->getCurrentFrame()->isEditingLevel()) |
| fid = app->getCurrentFrame()->getFid(); |
| else if (app->getCurrentFrame()->isEditingScene()) { |
| int columnIndex = app->getCurrentColumn()->getColumnIndex(); |
| TXsheet *xsh = app->getCurrentXsheet()->getXsheet(); |
| if (!xsh) |
| return; |
| TXshColumn *column = xsh->getColumn(columnIndex); |
| if (!column) |
| return; |
| int frame = app->getCurrentFrame()->getFrame(); |
| fid = column->getCellColumn()->getCell(frame).getFrameId(); |
| } |
| TImageP img = sl->getFrame(fid, true); |
| |
| TPalette *currentPalette = app->getPaletteController()->getCurrentLevelPalette()->getPalette(); |
| if (!img || !currentPalette) |
| return; |
| TImageP refImg = img->cloneImage(); |
| currentPalette->setRefImg(TImageP()); |
| |
| currentPalette->setRefImgPath(xl->getPath()); |
| |
| std::vector<TFrameId> fids; |
| fids.push_back(fid); |
| currentPalette->setRefLevelFids(fids); |
| |
| m_currentRefImgPath = xl->getPath(); |
| |
| m_levels.clear(); |
| |
| m_levelNames.clear(); |
| m_framesCount = 1; |
| m_palette = 0; |
| m_lr = TLevelReaderP(); |
| m_dim = TDimension(0, 0); |
| m_loadbox = TRect(); |
| m_loadboxes.clear(); |
| m_flipConsole->enableProgressBar(false); |
| m_flipConsole->setProgressBarStatus(0); |
| m_flipConsole->setFrameRange(1, 1, 1); |
| m_title1 = m_viewerTitle + " :: " + m_currentRefImgPath.withoutParentDir().withFrame(fid); |
| m_title = " :: <Use Current Frame>"; |
| |
| m_imageViewer->setImage(refImg); |
| } |
| |
| |
| |
| void ColorModelViewer::reloadCurrentFrame() |
| { |
| |
| TApp *app = TApp::instance(); |
| TXshLevel *xl = app->getCurrentLevel()->getLevel(); |
| if (!xl) |
| return; |
| TXshSimpleLevel *sl = xl->getSimpleLevel(); |
| if (!sl) |
| return; |
| |
| TPalette *currentPalette = app->getPaletteController()->getCurrentLevelPalette()->getPalette(); |
| if (!currentPalette) |
| return; |
| |
| std::vector<TFrameId> fids = currentPalette->getRefLevelFids(); |
| |
| if (fids.size() != 1) |
| return; |
| |
| TImageP img = sl->getFrame(fids[0], true); |
| if (!img) |
| return; |
| |
| TImageP refImg = img->cloneImage(); |
| |
| currentPalette->setRefImg(TImageP()); |
| |
| currentPalette->setRefImgPath(xl->getPath()); |
| |
| |
| m_currentRefImgPath = xl->getPath(); |
| |
| m_levels.clear(); |
| |
| m_levelNames.clear(); |
| m_framesCount = 1; |
| m_palette = 0; |
| m_lr = TLevelReaderP(); |
| m_dim = TDimension(0, 0); |
| m_loadbox = TRect(); |
| m_loadboxes.clear(); |
| m_flipConsole->enableProgressBar(false); |
| m_flipConsole->setProgressBarStatus(0); |
| m_flipConsole->setFrameRange(1, 1, 1); |
| m_title1 = m_viewerTitle + " :: " + m_currentRefImgPath.withoutParentDir().withFrame(fids[0]); |
| m_title = " :: <Use Current Frame>"; |
| |
| m_imageViewer->setImage(refImg); |
| } |
| |
| |
| |
| |
| |
| void ColorModelViewer::removeColorModel() |
| { |
| PaletteCmd::removeReferenceImage(getPaletteHandle()); |
| resetImageViewer(); |
| m_currentRefImgPath = TFilePath(); |
| } |
| |
| |
| |
| void ColorModelViewer::onRefImageNotFound() |
| { |
| DVGui::info(tr("It is not possible to retrieve the color model set for the current level.")); |
| } |
| |
| |
| |
| OpenFloatingPanel openColorModelCommand(MI_OpenColorModel, "ColorModel", QObject::tr("Color Model")); |
| |