1 /* 2 * PROJECT: PAINT for ReactOS 3 * LICENSE: LGPL 4 * FILE: base/applications/mspaint/toolsmodel.cpp 5 * PURPOSE: Keep track of tool parameters, notify listeners 6 * PROGRAMMERS: Benedikt Freisen 7 */ 8 9 #include "precomp.h" 10 11 ToolsModel toolsModel; 12 13 /* FUNCTIONS ********************************************************/ 14 15 ToolsModel::ToolsModel() 16 { 17 m_lineWidth = 1; 18 m_shapeStyle = 0; 19 m_brushStyle = 0; 20 m_oldActiveTool = m_activeTool = TOOL_PEN; 21 m_airBrushWidth = 5; 22 m_rubberRadius = 4; 23 m_transpBg = FALSE; 24 m_zoom = 1000; 25 ZeroMemory(&m_tools, sizeof(m_tools)); 26 m_pToolObject = GetOrCreateTool(m_activeTool); 27 } 28 29 ToolsModel::~ToolsModel() 30 { 31 for (size_t i = 0; i < TOOL_MAX + 1; ++i) 32 delete m_tools[i]; 33 } 34 35 ToolBase *ToolsModel::GetOrCreateTool(TOOLTYPE nTool) 36 { 37 if (!m_tools[nTool]) 38 m_tools[nTool] = ToolBase::createToolObject(nTool); 39 40 return m_tools[nTool]; 41 } 42 43 int ToolsModel::GetLineWidth() const 44 { 45 return m_lineWidth; 46 } 47 48 void ToolsModel::SetLineWidth(int nLineWidth) 49 { 50 m_lineWidth = nLineWidth; 51 NotifyToolSettingsChanged(); 52 } 53 54 int ToolsModel::GetShapeStyle() const 55 { 56 return m_shapeStyle; 57 } 58 59 void ToolsModel::SetShapeStyle(int nShapeStyle) 60 { 61 m_shapeStyle = nShapeStyle; 62 NotifyToolSettingsChanged(); 63 } 64 65 int ToolsModel::GetBrushStyle() const 66 { 67 return m_brushStyle; 68 } 69 70 void ToolsModel::SetBrushStyle(int nBrushStyle) 71 { 72 m_brushStyle = nBrushStyle; 73 NotifyToolSettingsChanged(); 74 } 75 76 TOOLTYPE ToolsModel::GetActiveTool() const 77 { 78 return m_activeTool; 79 } 80 81 TOOLTYPE ToolsModel::GetOldActiveTool() const 82 { 83 return m_oldActiveTool; 84 } 85 86 void ToolsModel::SetActiveTool(TOOLTYPE nActiveTool) 87 { 88 OnFinishDraw(); 89 90 if (m_activeTool == nActiveTool) 91 return; 92 93 switch (m_activeTool) 94 { 95 case TOOL_FREESEL: 96 case TOOL_RECTSEL: 97 case TOOL_RUBBER: 98 case TOOL_COLOR: 99 case TOOL_ZOOM: 100 case TOOL_TEXT: 101 break; 102 103 default: 104 m_oldActiveTool = m_activeTool; 105 break; 106 } 107 108 m_activeTool = nActiveTool; 109 m_pToolObject = GetOrCreateTool(m_activeTool); 110 NotifyToolChanged(); 111 } 112 113 int ToolsModel::GetAirBrushWidth() const 114 { 115 return m_airBrushWidth; 116 } 117 118 void ToolsModel::SetAirBrushWidth(int nAirBrushWidth) 119 { 120 m_airBrushWidth = nAirBrushWidth; 121 NotifyToolSettingsChanged(); 122 } 123 124 int ToolsModel::GetRubberRadius() const 125 { 126 return m_rubberRadius; 127 } 128 129 void ToolsModel::SetRubberRadius(int nRubberRadius) 130 { 131 m_rubberRadius = nRubberRadius; 132 NotifyToolSettingsChanged(); 133 } 134 135 BOOL ToolsModel::IsBackgroundTransparent() const 136 { 137 return m_transpBg; 138 } 139 140 void ToolsModel::SetBackgroundTransparent(BOOL bTransparent) 141 { 142 m_transpBg = bTransparent; 143 NotifyToolSettingsChanged(); 144 if (selectionWindow.IsWindow()) 145 selectionWindow.ForceRefreshSelectionContents(); 146 } 147 148 int ToolsModel::GetZoom() const 149 { 150 return m_zoom; 151 } 152 153 void ToolsModel::SetZoom(int nZoom) 154 { 155 m_zoom = nZoom; 156 NotifyZoomChanged(); 157 } 158 159 void ToolsModel::NotifyToolChanged() 160 { 161 if (toolBoxContainer.IsWindow()) 162 toolBoxContainer.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 163 if (toolSettingsWindow.IsWindow()) 164 toolSettingsWindow.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 165 if (fontsDialog.IsWindow()) 166 fontsDialog.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 167 if (textEditWindow.IsWindow()) 168 textEditWindow.SendMessage(WM_TOOLSMODELTOOLCHANGED, m_activeTool); 169 } 170 171 void ToolsModel::NotifyToolSettingsChanged() 172 { 173 if (toolSettingsWindow.IsWindow()) 174 toolSettingsWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); 175 if (selectionWindow.IsWindow()) 176 selectionWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); 177 if (textEditWindow.IsWindow()) 178 textEditWindow.SendMessage(WM_TOOLSMODELSETTINGSCHANGED); 179 } 180 181 void ToolsModel::NotifyZoomChanged() 182 { 183 if (toolSettingsWindow.IsWindow()) 184 toolSettingsWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); 185 if (textEditWindow.IsWindow()) 186 textEditWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); 187 if (selectionWindow.IsWindow()) 188 selectionWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED); 189 } 190 191 void ToolsModel::OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick) 192 { 193 m_pToolObject->beginEvent(); 194 updateStartAndLast(x, y); 195 m_pToolObject->OnButtonDown(bLeftButton, x, y, bDoubleClick); 196 m_pToolObject->endEvent(); 197 } 198 199 void ToolsModel::OnMouseMove(BOOL bLeftButton, LONG x, LONG y) 200 { 201 m_pToolObject->beginEvent(); 202 m_pToolObject->OnMouseMove(bLeftButton, x, y); 203 updateLast(x, y); 204 m_pToolObject->endEvent(); 205 } 206 207 void ToolsModel::OnButtonUp(BOOL bLeftButton, LONG x, LONG y) 208 { 209 m_pToolObject->beginEvent(); 210 m_pToolObject->OnButtonUp(bLeftButton, x, y); 211 updateLast(x, y); 212 m_pToolObject->endEvent(); 213 } 214 215 void ToolsModel::OnCancelDraw() 216 { 217 ATLTRACE("ToolsModel::OnCancelDraw()\n"); 218 m_pToolObject->beginEvent(); 219 m_pToolObject->OnCancelDraw(); 220 m_pToolObject->endEvent(); 221 } 222 223 void ToolsModel::OnFinishDraw() 224 { 225 ATLTRACE("ToolsModel::OnFinishDraw()\n"); 226 m_pToolObject->beginEvent(); 227 m_pToolObject->OnFinishDraw(); 228 m_pToolObject->endEvent(); 229 } 230 231 void ToolsModel::resetTool() 232 { 233 m_pToolObject->reset(); 234 } 235 236 void ToolsModel::selectAll() 237 { 238 SetActiveTool(TOOL_RECTSEL); 239 OnButtonDown(TRUE, 0, 0, FALSE); 240 OnMouseMove(TRUE, imageModel.GetWidth(), imageModel.GetHeight()); 241 OnButtonUp(TRUE, imageModel.GetWidth(), imageModel.GetHeight()); 242 } 243