/* * Copyright (C) 2015-2022 Département de l'Instruction Publique (DIP-SEM) * * Copyright (C) 2013 Open Education Foundation * * Copyright (C) 2010-2013 Groupement d'Intérêt Public pour * l'Education Numérique en Afrique (GIP ENA) * * This file is part of OpenBoard. * * OpenBoard is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, version 3 of the License, * with a specific linking exception for the OpenSSL project's * "OpenSSL" library (or with modified versions of it that use the * same license as the "OpenSSL" library). * * OpenBoard is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with OpenBoard. If not, see . */ #include "UBDrawingController.h" #include "core/UBSettings.h" #include "core/UBApplication.h" #include "domain/UBGraphicsScene.h" #include "board/UBBoardController.h" #include "gui/UBMainWindow.h" #include "core/memcheck.h" UBDrawingController* UBDrawingController::sDrawingController = 0; UBDrawingController* UBDrawingController::drawingController() { if(!sDrawingController) sDrawingController = new UBDrawingController(); return sDrawingController; } void UBDrawingController::destroy() { if(sDrawingController) delete sDrawingController; sDrawingController = NULL; } UBDrawingController::UBDrawingController(QObject * parent) : QObject(parent) , mActiveRuler(NULL) , mStylusTool((UBStylusTool::Enum)-1) , mLatestDrawingTool((UBStylusTool::Enum)-1) , mIsDesktopMode(false) { connect(UBSettings::settings(), SIGNAL(colorContextChanged()), this, SIGNAL(colorPaletteChanged())); connect(UBApplication::mainWindow->actionPen, SIGNAL(triggered(bool)), this, SLOT(penToolSelected(bool))); connect(UBApplication::mainWindow->actionEraser, SIGNAL(triggered(bool)), this, SLOT(eraserToolSelected(bool))); connect(UBApplication::mainWindow->actionMarker, SIGNAL(triggered(bool)), this, SLOT(markerToolSelected(bool))); connect(UBApplication::mainWindow->actionSelector, SIGNAL(triggered(bool)), this, SLOT(selectorToolSelected(bool))); connect(UBApplication::mainWindow->actionPlay, SIGNAL(triggered(bool)), this, SLOT(playToolSelected(bool))); connect(UBApplication::mainWindow->actionHand, SIGNAL(triggered(bool)), this, SLOT(handToolSelected(bool))); connect(UBApplication::mainWindow->actionZoomIn, SIGNAL(triggered(bool)), this, SLOT(zoomInToolSelected(bool))); connect(UBApplication::mainWindow->actionZoomOut, SIGNAL(triggered(bool)), this, SLOT(zoomOutToolSelected(bool))); connect(UBApplication::mainWindow->actionPointer, SIGNAL(triggered(bool)), this, SLOT(pointerToolSelected(bool))); connect(UBApplication::mainWindow->actionLine, SIGNAL(triggered(bool)), this, SLOT(lineToolSelected(bool))); connect(UBApplication::mainWindow->actionVector, SIGNAL(triggered(bool)), this, SLOT(vectorToolSelected(bool))); connect(UBApplication::mainWindow->actionText, SIGNAL(triggered(bool)), this, SLOT(textToolSelected(bool))); connect(UBApplication::mainWindow->actionCapture, SIGNAL(triggered(bool)), this, SLOT(captureToolSelected(bool))); } UBDrawingController::~UBDrawingController() { // NOOP } int UBDrawingController::stylusTool() { return mStylusTool; } int UBDrawingController::latestDrawingTool() { return mLatestDrawingTool; } void UBDrawingController::setStylusTool(int tool) { if (tool != mStylusTool) { UBApplication::boardController->activeScene()->deselectAllItems(); if (mStylusTool == UBStylusTool::Pen || mStylusTool == UBStylusTool::Marker || mStylusTool == UBStylusTool::Line || mStylusTool == UBStylusTool::Vector) { mLatestDrawingTool = mStylusTool; } if (tool == UBStylusTool::Pen || tool == UBStylusTool::Line || tool == UBStylusTool::Vector) { emit lineWidthIndexChanged(UBSettings::settings()->penWidthIndex()); emit colorIndexChanged(UBSettings::settings()->penColorIndex()); } else if (tool == UBStylusTool::Marker) { emit lineWidthIndexChanged(UBSettings::settings()->markerWidthIndex()); emit colorIndexChanged(UBSettings::settings()->markerColorIndex()); } UBStylusTool::Enum previousTool = mStylusTool; mStylusTool = (UBStylusTool::Enum)tool; if (mStylusTool == UBStylusTool::Pen) UBApplication::mainWindow->actionPen->setChecked(true); else if (mStylusTool == UBStylusTool::Eraser) UBApplication::mainWindow->actionEraser->setChecked(true); else if (mStylusTool == UBStylusTool::Marker) UBApplication::mainWindow->actionMarker->setChecked(true); else if (mStylusTool == UBStylusTool::Selector) UBApplication::mainWindow->actionSelector->setChecked(true); else if (mStylusTool == UBStylusTool::Play) UBApplication::mainWindow->actionPlay->setChecked(true); else if (mStylusTool == UBStylusTool::Hand) UBApplication::mainWindow->actionHand->setChecked(true); else if (mStylusTool == UBStylusTool::ZoomIn) UBApplication::mainWindow->actionZoomIn->setChecked(true); else if (mStylusTool == UBStylusTool::ZoomOut) UBApplication::mainWindow->actionZoomOut->setChecked(true); else if (mStylusTool == UBStylusTool::Pointer) UBApplication::mainWindow->actionPointer->setChecked(true); else if (mStylusTool == UBStylusTool::Line) UBApplication::mainWindow->actionLine->setChecked(true); else if (mStylusTool == UBStylusTool::Vector) UBApplication::mainWindow->actionVector->setChecked(true); else if (mStylusTool == UBStylusTool::Text) UBApplication::mainWindow->actionText->setChecked(true); else if (mStylusTool == UBStylusTool::Capture) UBApplication::mainWindow->actionCapture->setChecked(true); emit stylusToolChanged(tool, previousTool); if (mStylusTool != UBStylusTool::Selector) emit colorPaletteChanged(); } } bool UBDrawingController::isDrawingTool() { return (stylusTool() == UBStylusTool::Pen) || (stylusTool() == UBStylusTool::Marker) || (stylusTool() == UBStylusTool::Vector) || (stylusTool() == UBStylusTool::Line); } int UBDrawingController::currentToolWidthIndex() { if (stylusTool() == UBStylusTool::Pen || stylusTool() == UBStylusTool::Line || stylusTool() == UBStylusTool::Vector) return UBSettings::settings()->penWidthIndex(); else if (stylusTool() == UBStylusTool::Marker) return UBSettings::settings()->markerWidthIndex(); else return -1; } qreal UBDrawingController::currentToolWidth() { if (stylusTool() == UBStylusTool::Pen || stylusTool() == UBStylusTool::Line || stylusTool() == UBStylusTool::Vector) return UBSettings::settings()->currentPenWidth(); else if (stylusTool() == UBStylusTool::Marker) return UBSettings::settings()->currentMarkerWidth(); else //failsafe return UBSettings::settings()->currentPenWidth(); } void UBDrawingController::setLineWidthIndex(int index) { if (stylusTool() == UBStylusTool::Marker) { UBSettings::settings()->setMarkerWidthIndex(index); } else { UBSettings::settings()->setPenWidthIndex(index); if(stylusTool() != UBStylusTool::Line && stylusTool() != UBStylusTool::Vector && stylusTool() != UBStylusTool::Selector) { setStylusTool(UBStylusTool::Pen); } } emit lineWidthIndexChanged(index); } int UBDrawingController::currentToolColorIndex() { if (stylusTool() == UBStylusTool::Pen || stylusTool() == UBStylusTool::Line || stylusTool() == UBStylusTool::Vector) { return UBSettings::settings()->penColorIndex(); } else if (stylusTool() == UBStylusTool::Marker) { return UBSettings::settings()->markerColorIndex(); } else { return -1; } } QColor UBDrawingController::currentToolColor() { return toolColor(UBSettings::settings()->isDarkBackground()); } QColor UBDrawingController::toolColor(bool onDarkBackground) { if (stylusTool() == UBStylusTool::Pen || stylusTool() == UBStylusTool::Line || stylusTool() == UBStylusTool::Vector) { return UBSettings::settings()->penColor(onDarkBackground); } else if (stylusTool() == UBStylusTool::Marker) { return UBSettings::settings()->markerColor(onDarkBackground); } else { //failsafe if (onDarkBackground) { return Qt::white; } else { return Qt::black; } } } void UBDrawingController::setColorIndex(int index) { Q_ASSERT(index >= 0 && index < UBSettings::settings()->colorPaletteSize); if (stylusTool() == UBStylusTool::Marker) { UBSettings::settings()->setMarkerColorIndex(index); } else { UBSettings::settings()->setPenColorIndex(index); } emit colorIndexChanged(index); } void UBDrawingController::setEraserWidthIndex(int index) { setStylusTool(UBStylusTool::Eraser); UBSettings::settings()->setEraserWidthIndex(index); } void UBDrawingController::setPenColor(bool onDarkBackground, const QColor& color, int pIndex) { if (onDarkBackground) { UBSettings::settings()->boardPenDarkBackgroundSelectedColors->setColor(pIndex, color); } else { UBSettings::settings()->boardPenLightBackgroundSelectedColors->setColor(pIndex, color); } emit colorPaletteChanged(); } void UBDrawingController::setMarkerColor(bool onDarkBackground, const QColor& color, int pIndex) { if (onDarkBackground) { UBSettings::settings()->boardMarkerDarkBackgroundSelectedColors->setColor(pIndex, color); } else { UBSettings::settings()->boardMarkerLightBackgroundSelectedColors->setColor(pIndex, color); } emit colorPaletteChanged(); } void UBDrawingController::setMarkerAlpha(qreal alpha) { UBSettings::settings()->boardMarkerLightBackgroundColors->setAlpha(alpha); UBSettings::settings()->boardMarkerLightBackgroundSelectedColors->setAlpha(alpha); UBSettings::settings()->boardMarkerDarkBackgroundColors->setAlpha(alpha); UBSettings::settings()->boardMarkerDarkBackgroundSelectedColors->setAlpha(alpha); UBSettings::settings()->boardMarkerAlpha->set(alpha); emit colorPaletteChanged(); } void UBDrawingController::penToolSelected(bool checked) { if (checked) { setStylusTool(UBStylusTool::Pen); } } void UBDrawingController::eraserToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::Eraser); } void UBDrawingController::markerToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::Marker); } void UBDrawingController::selectorToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::Selector); } void UBDrawingController::playToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::Play); } void UBDrawingController::handToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::Hand); } void UBDrawingController::zoomInToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::ZoomIn); } void UBDrawingController::zoomOutToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::ZoomOut); } void UBDrawingController::pointerToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::Pointer); } void UBDrawingController::lineToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::Line); } void UBDrawingController::vectorToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::Vector); } void UBDrawingController::textToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::Text); } void UBDrawingController::captureToolSelected(bool checked) { if (checked) setStylusTool(UBStylusTool::Capture); }