[MSPAINT] Polymorphism on tools (#4210)

- Introduce polymorphism on tools and mouse actions.
- Implement double-clicking on TOOL_SHAPE.
- Fix some bugs about mouse handling.
CORE-17931
This commit is contained in:
Katayama Hirofumi MZ 2022-01-01 22:02:36 +09:00 committed by GitHub
parent e0a47b7b5f
commit ee132a05ba
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
12 changed files with 790 additions and 635 deletions

View file

@ -17,11 +17,27 @@ ToolsModel::ToolsModel()
m_lineWidth = 1;
m_shapeStyle = 0;
m_brushStyle = 0;
m_activeTool = TOOL_PEN;
m_oldActiveTool = m_activeTool = TOOL_PEN;
m_airBrushWidth = 5;
m_rubberRadius = 4;
m_transpBg = FALSE;
m_zoom = 1000;
ZeroMemory(&m_tools, sizeof(m_tools));
m_pToolObject = GetOrCreateTool(m_activeTool);
}
ToolsModel::~ToolsModel()
{
for (size_t i = 0; i < TOOL_MAX + 1; ++i)
delete m_tools[i];
}
ToolBase *ToolsModel::GetOrCreateTool(TOOLTYPE nTool)
{
if (!m_tools[nTool])
m_tools[nTool] = ToolBase::createToolObject(nTool);
return m_tools[nTool];
}
int ToolsModel::GetLineWidth() const
@ -62,9 +78,29 @@ TOOLTYPE ToolsModel::GetActiveTool() const
return m_activeTool;
}
TOOLTYPE ToolsModel::GetOldActiveTool() const
{
return m_oldActiveTool;
}
void ToolsModel::SetActiveTool(TOOLTYPE nActiveTool)
{
switch (m_activeTool)
{
case TOOL_FREESEL:
case TOOL_RECTSEL:
case TOOL_RUBBER:
case TOOL_COLOR:
case TOOL_ZOOM:
case TOOL_TEXT:
break;
default:
m_oldActiveTool = m_activeTool;
break;
}
m_activeTool = nActiveTool;
m_pToolObject = GetOrCreateTool(m_activeTool);
NotifyToolChanged();
}
@ -129,3 +165,47 @@ void ToolsModel::NotifyZoomChanged()
{
toolSettingsWindow.SendMessage(WM_TOOLSMODELZOOMCHANGED);
}
void ToolsModel::OnButtonDown(BOOL bLeftButton, LONG x, LONG y, BOOL bDoubleClick)
{
m_pToolObject->beginEvent();
updateStartAndLast(x, y);
m_pToolObject->OnButtonDown(bLeftButton, x, y, bDoubleClick);
m_pToolObject->endEvent();
}
void ToolsModel::OnMouseMove(BOOL bLeftButton, LONG x, LONG y)
{
m_pToolObject->beginEvent();
m_pToolObject->OnMouseMove(bLeftButton, x, y);
updateLast(x, y);
m_pToolObject->endEvent();
}
void ToolsModel::OnButtonUp(BOOL bLeftButton, LONG x, LONG y)
{
m_pToolObject->beginEvent();
m_pToolObject->OnButtonUp(bLeftButton, x, y);
updateLast(x, y);
m_pToolObject->endEvent();
}
void ToolsModel::OnCancelDraw()
{
m_pToolObject->beginEvent();
m_pToolObject->OnCancelDraw();
m_pToolObject->endEvent();
}
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());
}