Something went wrong. Try again.
Reactos
Something went wrong. Try again.
7.3 kB · 313 lines
C++
at master
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314/* * PROJECT: PAINT for ReactOS * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later) * PURPOSE: Keep track of tool parameters, notify listeners * COPYRIGHT: Copyright 2015 Benedikt Freisen <b.freisen@gmx.net> */
#include "precomp.h"
ToolsModel toolsModel;
/* FUNCTIONS ********************************************************/
ToolsModel::ToolsModel(){ m_lineWidth = m_penWidth = 1; m_brushWidth = 4; m_shapeStyle = 0; m_brushStyle = BrushStyleRound; m_oldActiveTool = m_activeTool = TOOL_PEN; m_airBrushRadius = 5; m_rubberRadius = 4; m_transpBg = FALSE; m_zoom = 1000; m_pToolObject = GetOrCreateTool(m_activeTool);}
ToolsModel::~ToolsModel(){ delete m_pToolObject; m_pToolObject = NULL;}
ToolBase *ToolsModel::GetOrCreateTool(TOOLTYPE nTool){ delete m_pToolObject; m_pToolObject = ToolBase::createToolObject(nTool); return m_pToolObject;}
BOOL ToolsModel::IsSelection() const{ return (GetActiveTool() == TOOL_RECTSEL || GetActiveTool() == TOOL_FREESEL);}
int ToolsModel::GetLineWidth() const{ return m_lineWidth;}
void ToolsModel::SetLineWidth(int nLineWidth){ m_lineWidth = nLineWidth; NotifyToolSettingsChanged(); imageModel.NotifyImageChanged();}
INT ToolsModel::GetPenWidth() const{ return m_penWidth;}
void ToolsModel::SetPenWidth(INT nPenWidth){ m_penWidth = nPenWidth; NotifyToolSettingsChanged(); imageModel.NotifyImageChanged();}
INT ToolsModel::GetBrushWidth() const{ return m_brushWidth;}
void ToolsModel::SetBrushWidth(INT nBrushWidth){ m_brushWidth = nBrushWidth; NotifyToolSettingsChanged(); imageModel.NotifyImageChanged();}
void ToolsModel::MakeLineThickerOrThinner(BOOL bThinner){ INT thickness = GetLineWidth(); SetLineWidth(bThinner ? max(1, thickness - 1) : (thickness + 1));}
void ToolsModel::MakePenThickerOrThinner(BOOL bThinner){ INT thickness = GetPenWidth(); SetPenWidth(bThinner ? max(1, thickness - 1) : (thickness + 1));}
void ToolsModel::MakeBrushThickerOrThinner(BOOL bThinner){ INT thickness = GetBrushWidth(); SetBrushWidth(bThinner ? max(1, thickness - 1) : (thickness + 1));}
void ToolsModel::MakeAirBrushThickerOrThinner(BOOL bThinner){ INT thickness = GetAirBrushRadius(); SetAirBrushRadius(bThinner ? max(1, thickness - 1) : (thickness + 1));}
void ToolsModel::MakeRubberThickerOrThinner(BOOL bThinner){ INT thickness = GetRubberRadius(); SetRubberRadius(bThinner ? max(1, thickness - 1) : (thickness + 1));}
int ToolsModel::GetShapeStyle() const{ return m_shapeStyle;}
void ToolsModel::SetShapeStyle(int nShapeStyle){ m_shapeStyle = nShapeStyle; NotifyToolSettingsChanged();}
BrushStyle ToolsModel::GetBrushStyle() const{ return m_brushStyle;}
void ToolsModel::SetBrushStyle(BrushStyle nBrushStyle){ m_brushStyle = nBrushStyle; NotifyToolSettingsChanged();}
TOOLTYPE ToolsModel::GetActiveTool() const{ return m_activeTool;}
TOOLTYPE ToolsModel::GetOldActiveTool() const{ return m_oldActiveTool;}
void ToolsModel::SetActiveTool(TOOLTYPE nActiveTool){ OnEndDraw(FALSE);
selectionModel.Landing();
m_activeTool = nActiveTool;
switch (m_activeTool) { case TOOL_FREESEL: case TOOL_RECTSEL: case TOOL_COLOR: case TOOL_ZOOM: case TOOL_TEXT: // The active tool is not an actually drawing tool break;
case TOOL_LINE: case TOOL_BEZIER: case TOOL_RECT: case TOOL_SHAPE: case TOOL_ELLIPSE: case TOOL_FILL: case TOOL_AIRBRUSH: case TOOL_RRECT: case TOOL_RUBBER: case TOOL_BRUSH: case TOOL_PEN: // The active tool is an actually drawing tool. Save it for TOOL_COLOR to restore m_oldActiveTool = nActiveTool; break; }
m_pToolObject = GetOrCreateTool(m_activeTool);
NotifyToolChanged();}
INT ToolsModel::GetAirBrushRadius() const{ return m_airBrushRadius;}
void ToolsModel::SetAirBrushRadius(INT nAirBrushRadius){ m_airBrushRadius = nAirBrushRadius; NotifyToolSettingsChanged();}
int ToolsModel::GetRubberRadius() const{ return m_rubberRadius;}
void ToolsModel::SetRubberRadius(int nRubberRadius){ m_rubberRadius = nRubberRadius; NotifyToolSettingsChanged();}
SIZE ToolsModel::GetToolSize() const{ SIZE size; switch (m_activeTool) { case TOOL_FREESEL: case TOOL_RECTSEL: size.cx = selectionModel.m_rc.Width(); size.cy = selectionModel.m_rc.Height(); break; case TOOL_COLOR: case TOOL_ZOOM: case TOOL_TEXT: case TOOL_FILL: size.cx = size.cy = 1; break; case TOOL_LINE: case TOOL_BEZIER: case TOOL_RECT: case TOOL_RRECT: case TOOL_SHAPE: case TOOL_ELLIPSE: size.cx = size.cy = GetLineWidth(); break; case TOOL_AIRBRUSH: size.cx = size.cy = GetAirBrushRadius() * 2; break; case TOOL_RUBBER: size.cx = size.cy = GetRubberRadius() * 2; break; case TOOL_BRUSH: size.cx = size.cy = GetBrushWidth(); break; case TOOL_PEN: size.cx = size.cy = GetPenWidth(); break; } if (size.cx < 1) size.cx = 1; if (size.cy < 1) size.cy = 1; return size;}
BOOL ToolsModel::IsBackgroundTransparent() const{ return m_transpBg;}
void ToolsModel::SetBackgroundTransparent(BOOL bTransparent){ m_transpBg = bTransparent; NotifyToolSettingsChanged(); imageModel.NotifyImageChanged();}
int ToolsModel::GetZoom() const{ return m_zoom;}
void ToolsModel::SetZoom(int nZoom){ m_zoom = nZoom; NotifyZoomChanged();}
void ToolsModel::NotifyToolChanged(){ if (toolBoxContainer.IsWindow()) toolBoxContainer.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); if (toolSettingsWindow.IsWindow()) toolSettingsWindow.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); if (fontsDialog.IsWindow()) fontsDialog.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); if (textEditWindow.IsWindow()) textEditWindow.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool);}
void ToolsModel::NotifyToolSettingsChanged(){ if (toolSettingsWindow.IsWindow()) toolSettingsWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); if (textEditWindow.IsWindow()) textEditWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED);}
void ToolsModel::NotifyZoomChanged(){ if (toolSettingsWindow.IsWindow()) toolSettingsWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); if (textEditWindow.IsWindow()) textEditWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); if (canvasWindow.IsWindow()) canvasWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED);}
void ToolsModel::resetTool(){ m_pToolObject->reset();}
void ToolsModel::selectAll(){ SetActiveTool(TOOL_RECTSEL); OnButtonDown(TRUE, 0, 0, FALSE); OnMouseMove(TRUE, imageModel.GetWidth(), imageModel.GetHeight()); OnButtonUp(TRUE, imageModel.GetWidth(), imageModel.GetHeight());}