[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

@ -71,58 +71,42 @@ LRESULT CToolBox::OnSysColorChange(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL
return 0;
}
struct COMMAND_TO_TOOL
{
UINT id;
TOOLTYPE tool;
};
static const COMMAND_TO_TOOL CommandToToolMapping[] =
{
{ ID_FREESEL, TOOL_FREESEL },
{ ID_RECTSEL, TOOL_RECTSEL },
{ ID_RUBBER, TOOL_RUBBER },
{ ID_FILL, TOOL_FILL },
{ ID_COLOR, TOOL_COLOR },
{ ID_ZOOM, TOOL_ZOOM },
{ ID_PEN, TOOL_PEN },
{ ID_BRUSH, TOOL_BRUSH },
{ ID_AIRBRUSH, TOOL_AIRBRUSH },
{ ID_TEXT, TOOL_TEXT },
{ ID_LINE, TOOL_LINE },
{ ID_BEZIER, TOOL_BEZIER },
{ ID_RECT, TOOL_RECT },
{ ID_SHAPE, TOOL_SHAPE },
{ ID_ELLIPSE, TOOL_ELLIPSE },
{ ID_RRECT, TOOL_RRECT },
};
LRESULT CToolBox::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
switch (LOWORD(wParam))
UINT id = LOWORD(wParam);
for (size_t i = 0; i < _countof(CommandToToolMapping); ++i)
{
case ID_FREESEL:
toolsModel.SetActiveTool(TOOL_FREESEL);
break;
case ID_RECTSEL:
toolsModel.SetActiveTool(TOOL_RECTSEL);
break;
case ID_RUBBER:
toolsModel.SetActiveTool(TOOL_RUBBER);
break;
case ID_FILL:
toolsModel.SetActiveTool(TOOL_FILL);
break;
case ID_COLOR:
toolsModel.SetActiveTool(TOOL_COLOR);
break;
case ID_ZOOM:
toolsModel.SetActiveTool(TOOL_ZOOM);
break;
case ID_PEN:
toolsModel.SetActiveTool(TOOL_PEN);
break;
case ID_BRUSH:
toolsModel.SetActiveTool(TOOL_BRUSH);
break;
case ID_AIRBRUSH:
toolsModel.SetActiveTool(TOOL_AIRBRUSH);
break;
case ID_TEXT:
toolsModel.SetActiveTool(TOOL_TEXT);
break;
case ID_LINE:
toolsModel.SetActiveTool(TOOL_LINE);
break;
case ID_BEZIER:
toolsModel.SetActiveTool(TOOL_BEZIER);
break;
case ID_RECT:
toolsModel.SetActiveTool(TOOL_RECT);
break;
case ID_SHAPE:
toolsModel.SetActiveTool(TOOL_SHAPE);
break;
case ID_ELLIPSE:
toolsModel.SetActiveTool(TOOL_ELLIPSE);
break;
case ID_RRECT:
toolsModel.SetActiveTool(TOOL_RRECT);
if (CommandToToolMapping[i].id == id)
{
toolsModel.SetActiveTool(CommandToToolMapping[i].tool);
break;
}
}
return 0;
}
@ -130,6 +114,18 @@ LRESULT CToolBox::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHand
LRESULT CToolBox::OnToolsModelToolChanged(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled)
{
selectionWindow.ShowWindow(SW_HIDE);
pointSP = 0; // resets the point-buffer of the polygon and bezier functions
toolsModel.resetTool(); // resets the point-buffer of the polygon and bezier functions
// Check the toolbar button
TOOLTYPE tool = toolsModel.GetActiveTool();
for (size_t i = 0; i < _countof(CommandToToolMapping); ++i)
{
if (CommandToToolMapping[i].tool == tool)
{
toolbar.SendMessage(TB_CHECKBUTTON, CommandToToolMapping[i].id, TRUE);
break;
}
}
return 0;
}