| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| StylePickerTool::StylePickerTool() |
| : TTool("T_StylePicker") |
| , m_currentStyleId(0) |
| , m_colorType("Mode:") |
| , m_passivePick("Passive Pick", false) |
| , m_organizePalette("Organize Palette", false) |
| , m_paletteToBeOrganized(NULL) { |
| m_prop.bind(m_colorType); |
| m_colorType.addValue(AREAS); |
| m_colorType.addValue(LINES); |
| m_colorType.addValue(ALL); |
| m_colorType.setId("Mode"); |
| bind(TTool::CommonLevels); |
| |
| m_prop.bind(m_passivePick); |
| m_passivePick.setId("PassivePick"); |
| |
| m_prop.bind(m_organizePalette); |
| m_organizePalette.setId("OrganizePalette"); |
| } |
| |
| void StylePickerTool::leftButtonDown(const TPointD &pos, const TMouseEvent &e) { |
| m_oldStyleId = m_currentStyleId = |
| getApplication()->getCurrentLevelStyleIndex(); |
| pick(pos, e); |
| } |
| |
| void StylePickerTool::leftButtonDrag(const TPointD &pos, const TMouseEvent &e) { |
| pick(pos, e); |
| } |
| |
| void StylePickerTool::pick(const TPointD &pos, const TMouseEvent &e) { |
| |
| int modeValue = m_colorType.getIndex(); |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| if (Preferences::instance()->isMultiLayerStylePickerEnabled() && |
| getApplication()->getCurrentFrame()->isEditingScene()) { |
| int superPickedColumnId = getViewer()->posToColumnIndex( |
| e.m_pos, getPixelSize() * getPixelSize(), false); |
| |
| if (superPickedColumnId >= 0 |
| && |
| getApplication()->getCurrentColumn()->getColumnIndex() != |
| superPickedColumnId) |
| { |
| |
| int currentFrame = getApplication()->getCurrentFrame()->getFrame(); |
| TXshCell pickedCell = |
| getApplication()->getCurrentXsheet()->getXsheet()->getCell( |
| currentFrame, superPickedColumnId); |
| TImageP pickedImage = pickedCell.getImage(false).getPointer(); |
| TToonzImageP picked_ti = pickedImage; |
| TVectorImageP picked_vi = pickedImage; |
| TXshSimpleLevel *picked_level = pickedCell.getSimpleLevel(); |
| if ((picked_ti || picked_vi) && picked_level) { |
| TPointD tmpMousePosition = getColumnMatrix(superPickedColumnId).inv() * |
| getViewer()->winToWorld(e.m_pos); |
| |
| TPointD tmpDpiScale = getCurrentDpiScale(picked_level, getCurrentFid()); |
| |
| tmpMousePosition.x /= tmpDpiScale.x; |
| tmpMousePosition.y /= tmpDpiScale.y; |
| |
| StylePicker superPicker(pickedImage); |
| int picked_subsampling = |
| picked_level->getImageSubsampling(pickedCell.getFrameId()); |
| int superPicked_StyleId = superPicker.pickStyleId( |
| TScale(1.0 / picked_subsampling) * tmpMousePosition + |
| TPointD(-0.5, -0.5), |
| getPixelSize() * getPixelSize(), modeValue); |
| |
| if (superPicked_StyleId > 0) { |
| |
| getApplication()->getCurrentLevel()->setLevel(picked_level); |
| |
| getApplication()->getCurrentColumn()->setColumnIndex( |
| superPickedColumnId); |
| |
| if (getApplication()->getCurrentSelection()->getSelection()) |
| getApplication() |
| ->getCurrentSelection() |
| ->getSelection() |
| ->selectNone(); |
| |
| getApplication()->setCurrentLevelStyleIndex(superPicked_StyleId); |
| return; |
| } |
| } |
| } |
| } |
| |
| |
| TImageP image = getImage(false); |
| TToonzImageP ti = image; |
| TVectorImageP vi = image; |
| TXshSimpleLevel *level = |
| getApplication()->getCurrentLevel()->getSimpleLevel(); |
| if ((!ti && !vi) || !level) return; |
| |
| |
| if (!m_viewer->getGeometry().contains(pos)) return; |
| |
| int subsampling = level->getImageSubsampling(getCurrentFid()); |
| StylePicker picker(image); |
| int styleId = |
| picker.pickStyleId(TScale(1.0 / subsampling) * pos + TPointD(-0.5, -0.5), |
| getPixelSize() * getPixelSize(), modeValue); |
| |
| if (styleId < 0) return; |
| |
| if (modeValue == 1) |
| { |
| |
| |
| if (styleId == 0) return; |
| |
| |
| |
| if (ti && |
| picker.pickTone(TScale(1.0 / subsampling) * pos + |
| TPointD(-0.5, -0.5)) == 255) |
| return; |
| } |
| |
| |
| TSelection *selection = |
| TTool::getApplication()->getCurrentSelection()->getSelection(); |
| if (selection) { |
| TStyleSelection *styleSelection = |
| dynamic_cast<TStyleSelection *>(selection); |
| if (styleSelection) styleSelection->selectNone(); |
| } |
| |
| getApplication()->setCurrentLevelStyleIndex(styleId); |
| } |
| |
| void StylePickerTool::mouseMove(const TPointD &pos, const TMouseEvent &e) { |
| if (!m_passivePick.getValue()) return; |
| |
| PaletteController *controller = |
| TTool::getApplication()->getPaletteController(); |
| |
| TImageP image = getImage(false); |
| TToonzImageP ti = image; |
| TVectorImageP vi = image; |
| TXshSimpleLevel *level = |
| getApplication()->getCurrentLevel()->getSimpleLevel(); |
| if ((!ti && !vi) || !level || !m_viewer->getGeometry().contains(pos)) { |
| controller->notifyStylePassivePicked(-1, -1, -1); |
| return; |
| } |
| |
| int subsampling = level->getImageSubsampling(getCurrentFid()); |
| StylePicker picker(image); |
| TPointD pickPos(TScale(1.0 / subsampling) * pos + TPointD(-0.5, -0.5)); |
| int inkStyleId = |
| picker.pickStyleId(pickPos, getPixelSize() * getPixelSize(), 1); |
| int paintStyleId = |
| picker.pickStyleId(pickPos, getPixelSize() * getPixelSize(), 0); |
| int tone = picker.pickTone(pickPos); |
| controller->notifyStylePassivePicked(inkStyleId, paintStyleId, tone); |
| } |
| |
| int StylePickerTool::getCursorId() const { |
| bool isBlackBG = ToonzCheck::instance()->getChecks() & ToonzCheck::eBlackBg; |
| |
| |
| if (m_organizePalette.getValue()) |
| return (isBlackBG) ? ToolCursor::PickerCursorWhiteOrganize |
| : ToolCursor::PickerCursorOrganize; |
| |
| if (m_colorType.getValue() == LINES) |
| return (isBlackBG) ? ToolCursor::PickerCursorWhiteLine |
| : ToolCursor::PickerCursorLine; |
| else if (m_colorType.getValue() == AREAS) |
| return (isBlackBG) ? ToolCursor::PickerCursorWhiteArea |
| : ToolCursor::PickerCursorArea; |
| else |
| return (isBlackBG) ? ToolCursor::PickerCursorWhite |
| : ToolCursor::PickerCursor; |
| } |
| |
| bool StylePickerTool::onPropertyChanged(std::string propertyName) { |
| if (propertyName == m_organizePalette.getName()) { |
| if (m_organizePalette.getValue()) { |
| if (!startOrganizePalette()) { |
| m_organizePalette.setValue(false); |
| getApplication()->getCurrentTool()->notifyToolChanged(); |
| return false; |
| } |
| } else { |
| std::cout << "End Organize Palette" << std::endl; |
| m_paletteToBeOrganized = NULL; |
| } |
| } |
| return true; |
| } |
| |
| bool StylePickerTool::startOrganizePalette() { |
| |
| TXshLevel *level = getApplication()->getCurrentLevel()->getLevel(); |
| if (!level) { |
| DVGui::error(tr("No current level.")); |
| return false; |
| } |
| if (level->getType() != PLI_XSHLEVEL && level->getType() != TZP_XSHLEVEL && |
| level->getType() != PLT_XSHLEVEL) { |
| DVGui::error(tr("Current level has no available palette.")); |
| return false; |
| } |
| |
| TPalette *pal = NULL; |
| if (level->getType() == PLT_XSHLEVEL) |
| pal = level->getPaletteLevel()->getPalette(); |
| else |
| pal = level->getSimpleLevel()->getPalette(); |
| if (!pal || pal->getPageCount() < 2) { |
| DVGui::error( |
| tr("Palette must have more than one palette to be organized.")); |
| return false; |
| } |
| |
| m_paletteToBeOrganized = pal; |
| |
| std::cout << "Start Organize Palette" << std::endl; |
| |
| return true; |
| } |
| |
| |
| |
| |
| |
| void StylePickerTool::onImageChanged() { |
| std::cout << "StylePickerTool::onImageChanged" << std::endl; |
| if (!m_organizePalette.getValue() || !m_paletteToBeOrganized) return; |
| |
| TXshLevel *level = getApplication()->getCurrentLevel()->getLevel(); |
| if (!level) { |
| m_organizePalette.setValue(false); |
| getApplication()->getCurrentTool()->notifyToolChanged(); |
| return; |
| } |
| TPalette *pal = NULL; |
| if (level->getType() == PLT_XSHLEVEL) |
| pal = level->getPaletteLevel()->getPalette(); |
| else if (level->getSimpleLevel()) { |
| pal = level->getSimpleLevel()->getPalette(); |
| } |
| if (!pal || pal != m_paletteToBeOrganized) { |
| m_organizePalette.setValue(false); |
| getApplication()->getCurrentTool()->notifyToolChanged(); |
| return; |
| } |
| } |
| |
| StylePickerTool stylePickerTool; |