Reactos
at master 313 lines 7.3 kB view raw
1/* 2 * PROJECT: PAINT for ReactOS 3 * LICENSE: LGPL-2.0-or-later (https://spdx.org/licenses/LGPL-2.0-or-later) 4 * PURPOSE: Keep track of tool parameters, notify listeners 5 * COPYRIGHT: Copyright 2015 Benedikt Freisen <b.freisen@gmx.net> 6 */ 7 8#include "precomp.h" 9 10ToolsModel toolsModel; 11 12/* FUNCTIONS ********************************************************/ 13 14ToolsModel::ToolsModel() 15{ 16 m_lineWidth = m_penWidth = 1; 17 m_brushWidth = 4; 18 m_shapeStyle = 0; 19 m_brushStyle = BrushStyleRound; 20 m_oldActiveTool = m_activeTool = TOOL_PEN; 21 m_airBrushRadius = 5; 22 m_rubberRadius = 4; 23 m_transpBg = FALSE; 24 m_zoom = 1000; 25 m_pToolObject = GetOrCreateTool(m_activeTool); 26} 27 28ToolsModel::~ToolsModel() 29{ 30 delete m_pToolObject; 31 m_pToolObject = NULL; 32} 33 34ToolBase *ToolsModel::GetOrCreateTool(TOOLTYPE nTool) 35{ 36 delete m_pToolObject; 37 m_pToolObject = ToolBase::createToolObject(nTool); 38 return m_pToolObject; 39} 40 41BOOL ToolsModel::IsSelection() const 42{ 43 return (GetActiveTool() == TOOL_RECTSEL || GetActiveTool() == TOOL_FREESEL); 44} 45 46int ToolsModel::GetLineWidth() const 47{ 48 return m_lineWidth; 49} 50 51void ToolsModel::SetLineWidth(int nLineWidth) 52{ 53 m_lineWidth = nLineWidth; 54 NotifyToolSettingsChanged(); 55 imageModel.NotifyImageChanged(); 56} 57 58INT ToolsModel::GetPenWidth() const 59{ 60 return m_penWidth; 61} 62 63void ToolsModel::SetPenWidth(INT nPenWidth) 64{ 65 m_penWidth = nPenWidth; 66 NotifyToolSettingsChanged(); 67 imageModel.NotifyImageChanged(); 68} 69 70INT ToolsModel::GetBrushWidth() const 71{ 72 return m_brushWidth; 73} 74 75void ToolsModel::SetBrushWidth(INT nBrushWidth) 76{ 77 m_brushWidth = nBrushWidth; 78 NotifyToolSettingsChanged(); 79 imageModel.NotifyImageChanged(); 80} 81 82void ToolsModel::MakeLineThickerOrThinner(BOOL bThinner) 83{ 84 INT thickness = GetLineWidth(); 85 SetLineWidth(bThinner ? max(1, thickness - 1) : (thickness + 1)); 86} 87 88void ToolsModel::MakePenThickerOrThinner(BOOL bThinner) 89{ 90 INT thickness = GetPenWidth(); 91 SetPenWidth(bThinner ? max(1, thickness - 1) : (thickness + 1)); 92} 93 94void ToolsModel::MakeBrushThickerOrThinner(BOOL bThinner) 95{ 96 INT thickness = GetBrushWidth(); 97 SetBrushWidth(bThinner ? max(1, thickness - 1) : (thickness + 1)); 98} 99 100void ToolsModel::MakeAirBrushThickerOrThinner(BOOL bThinner) 101{ 102 INT thickness = GetAirBrushRadius(); 103 SetAirBrushRadius(bThinner ? max(1, thickness - 1) : (thickness + 1)); 104} 105 106void ToolsModel::MakeRubberThickerOrThinner(BOOL bThinner) 107{ 108 INT thickness = GetRubberRadius(); 109 SetRubberRadius(bThinner ? max(1, thickness - 1) : (thickness + 1)); 110} 111 112int ToolsModel::GetShapeStyle() const 113{ 114 return m_shapeStyle; 115} 116 117void ToolsModel::SetShapeStyle(int nShapeStyle) 118{ 119 m_shapeStyle = nShapeStyle; 120 NotifyToolSettingsChanged(); 121} 122 123BrushStyle ToolsModel::GetBrushStyle() const 124{ 125 return m_brushStyle; 126} 127 128void ToolsModel::SetBrushStyle(BrushStyle nBrushStyle) 129{ 130 m_brushStyle = nBrushStyle; 131 NotifyToolSettingsChanged(); 132} 133 134TOOLTYPE ToolsModel::GetActiveTool() const 135{ 136 return m_activeTool; 137} 138 139TOOLTYPE ToolsModel::GetOldActiveTool() const 140{ 141 return m_oldActiveTool; 142} 143 144void ToolsModel::SetActiveTool(TOOLTYPE nActiveTool) 145{ 146 OnEndDraw(FALSE); 147 148 selectionModel.Landing(); 149 150 m_activeTool = nActiveTool; 151 152 switch (m_activeTool) 153 { 154 case TOOL_FREESEL: 155 case TOOL_RECTSEL: 156 case TOOL_COLOR: 157 case TOOL_ZOOM: 158 case TOOL_TEXT: 159 // The active tool is not an actually drawing tool 160 break; 161 162 case TOOL_LINE: 163 case TOOL_BEZIER: 164 case TOOL_RECT: 165 case TOOL_SHAPE: 166 case TOOL_ELLIPSE: 167 case TOOL_FILL: 168 case TOOL_AIRBRUSH: 169 case TOOL_RRECT: 170 case TOOL_RUBBER: 171 case TOOL_BRUSH: 172 case TOOL_PEN: 173 // The active tool is an actually drawing tool. Save it for TOOL_COLOR to restore 174 m_oldActiveTool = nActiveTool; 175 break; 176 } 177 178 m_pToolObject = GetOrCreateTool(m_activeTool); 179 180 NotifyToolChanged(); 181} 182 183INT ToolsModel::GetAirBrushRadius() const 184{ 185 return m_airBrushRadius; 186} 187 188void ToolsModel::SetAirBrushRadius(INT nAirBrushRadius) 189{ 190 m_airBrushRadius = nAirBrushRadius; 191 NotifyToolSettingsChanged(); 192} 193 194int ToolsModel::GetRubberRadius() const 195{ 196 return m_rubberRadius; 197} 198 199void ToolsModel::SetRubberRadius(int nRubberRadius) 200{ 201 m_rubberRadius = nRubberRadius; 202 NotifyToolSettingsChanged(); 203} 204 205SIZE ToolsModel::GetToolSize() const 206{ 207 SIZE size; 208 switch (m_activeTool) 209 { 210 case TOOL_FREESEL: 211 case TOOL_RECTSEL: 212 size.cx = selectionModel.m_rc.Width(); 213 size.cy = selectionModel.m_rc.Height(); 214 break; 215 case TOOL_COLOR: 216 case TOOL_ZOOM: 217 case TOOL_TEXT: 218 case TOOL_FILL: 219 size.cx = size.cy = 1; 220 break; 221 case TOOL_LINE: 222 case TOOL_BEZIER: 223 case TOOL_RECT: 224 case TOOL_RRECT: 225 case TOOL_SHAPE: 226 case TOOL_ELLIPSE: 227 size.cx = size.cy = GetLineWidth(); 228 break; 229 case TOOL_AIRBRUSH: 230 size.cx = size.cy = GetAirBrushRadius() * 2; 231 break; 232 case TOOL_RUBBER: 233 size.cx = size.cy = GetRubberRadius() * 2; 234 break; 235 case TOOL_BRUSH: 236 size.cx = size.cy = GetBrushWidth(); 237 break; 238 case TOOL_PEN: 239 size.cx = size.cy = GetPenWidth(); 240 break; 241 } 242 if (size.cx < 1) 243 size.cx = 1; 244 if (size.cy < 1) 245 size.cy = 1; 246 return size; 247} 248 249BOOL ToolsModel::IsBackgroundTransparent() const 250{ 251 return m_transpBg; 252} 253 254void ToolsModel::SetBackgroundTransparent(BOOL bTransparent) 255{ 256 m_transpBg = bTransparent; 257 NotifyToolSettingsChanged(); 258 imageModel.NotifyImageChanged(); 259} 260 261int ToolsModel::GetZoom() const 262{ 263 return m_zoom; 264} 265 266void ToolsModel::SetZoom(int nZoom) 267{ 268 m_zoom = nZoom; 269 NotifyZoomChanged(); 270} 271 272void ToolsModel::NotifyToolChanged() 273{ 274 if (toolBoxContainer.IsWindow()) 275 toolBoxContainer.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 276 if (toolSettingsWindow.IsWindow()) 277 toolSettingsWindow.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 278 if (fontsDialog.IsWindow()) 279 fontsDialog.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 280 if (textEditWindow.IsWindow()) 281 textEditWindow.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 282} 283 284void ToolsModel::NotifyToolSettingsChanged() 285{ 286 if (toolSettingsWindow.IsWindow()) 287 toolSettingsWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); 288 if (textEditWindow.IsWindow()) 289 textEditWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); 290} 291 292void ToolsModel::NotifyZoomChanged() 293{ 294 if (toolSettingsWindow.IsWindow()) 295 toolSettingsWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); 296 if (textEditWindow.IsWindow()) 297 textEditWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); 298 if (canvasWindow.IsWindow()) 299 canvasWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); 300} 301 302void ToolsModel::resetTool() 303{ 304 m_pToolObject->reset(); 305} 306 307void ToolsModel::selectAll() 308{ 309 SetActiveTool(TOOL_RECTSEL); 310 OnButtonDown(TRUE, 0, 0, FALSE); 311 OnMouseMove(TRUE, imageModel.GetWidth(), imageModel.GetHeight()); 312 OnButtonUp(TRUE, imageModel.GetWidth(), imageModel.GetHeight()); 313}