xref: /haiku/src/apps/icon-o-matic/shape/commands/NudgePointsCommand.cpp (revision a4e4beafe528e4bf368158a1876fe78eea755941)
1 /*
2  * Copyright 2006, Haiku.
3  * Distributed under the terms of the MIT License.
4  *
5  * Authors:
6  *		Stephan Aßmus <superstippi@gmx.de>
7  */
8 
9 #include "NudgePointsCommand.h"
10 
11 #include <new>
12 #include <stdio.h>
13 
14 #include <Catalog.h>
15 #include <Locale.h>
16 #include <StringFormat.h>
17 
18 #include "VectorPath.h"
19 
20 
21 #undef B_TRANSLATION_CONTEXT
22 #define B_TRANSLATION_CONTEXT "Icon-O-Matic-NudgePointsCommand"
23 
24 
25 using std::nothrow;
26 
27 
28 static BString
_GetName(int32 count)29 _GetName(int32 count)
30 {
31 	static BStringFormat format(B_TRANSLATE("Nudge {0, plural, "
32 		"one{vertex} other{vertices}}"));
33 	BString name;
34 	format.Format(name, count);
35 	return name;
36 }
37 
38 
39 // constructor
NudgePointsCommand(VectorPath * path,const int32 * indices,const control_point * points,int32 count)40 NudgePointsCommand::NudgePointsCommand(VectorPath* path,
41 									   const int32* indices,
42 									   const control_point* points,
43 									   int32 count)
44 	: TransformCommand(B_ORIGIN,
45 					   B_ORIGIN,
46 					   0.0,
47 					   1.0,
48 					   1.0,
49 					   _GetName(count)),
50 	  fPath(path),
51 	  fIndices(NULL),
52 	  fPoints(NULL),
53 	  fCount(count)
54 {
55 	if (fCount > 0 && indices) {
56 		fIndices = new (nothrow) int32[fCount];
57 		memcpy(fIndices, indices, fCount * sizeof(int32));
58 	}
59 	if (fCount > 0 && points) {
60 		fPoints = new (nothrow) control_point[fCount];
61 		memcpy((void*)fPoints, points, fCount * sizeof(control_point));
62 	}
63 }
64 
65 // destructor
~NudgePointsCommand()66 NudgePointsCommand::~NudgePointsCommand()
67 {
68 	delete[] fIndices;
69 	delete[] fPoints;
70 }
71 
72 // InitCheck
73 status_t
InitCheck()74 NudgePointsCommand::InitCheck()
75 {
76 	if (fPath && fIndices && fPoints)
77 		return TransformCommand::InitCheck();
78 	else
79 		return B_NO_INIT;
80 }
81 
82 // _SetTransformation
83 status_t
_SetTransformation(BPoint pivot,BPoint translation,double rotation,double xScale,double yScale) const84 NudgePointsCommand::_SetTransformation(BPoint pivot,
85 									   BPoint translation,
86 									   double rotation,
87 									   double xScale,
88 									   double yScale) const
89 {
90 	if (!fPath)
91 		return B_NO_INIT;
92 
93 	AutoNotificationSuspender _(fPath);
94 
95 	// restore original path
96 	for (int32 i = 0; i < fCount; i++) {
97 		fPath->SetPoint(fIndices[i], fPoints[i].point + translation,
98 									 fPoints[i].point_in + translation,
99 									 fPoints[i].point_out + translation,
100 									 fPoints[i].connected);
101 	}
102 
103 	return B_OK;
104 }
105 
106