Skip to content

Commit 3f130ed

Browse files
Fix error in DrawBinOp::drawPort in text flip handling. For #1744.
Expose DrawBin class for using in IntOp Use DrawBin::drawPort to correct port flipping in IntOps. For #1745
1 parent 906d1e6 commit 3f130ed

File tree

3 files changed

+90
-94
lines changed

3 files changed

+90
-94
lines changed

model/intOp.cc

Lines changed: 19 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,7 @@ namespace minsky
4141
{
4242
// if rotation is in 1st or 3rd quadrant, rotate as
4343
// normal, otherwise flip the text so it reads L->R
44-
const double angle=rotation() * M_PI / 180.0;
45-
const bool textFlipped=flipped(rotation());
44+
auto [angle,textFlipped]=rotationAsRadians();
4645
double coupledIntTranslation=0;
4746
const float z=zoomFactor();
4847

@@ -55,34 +54,33 @@ namespace minsky
5554

5655
if (coupled())
5756
{
57+
cairo::CairoSave cs(cairo);
5858
auto& iv=*intVar;
5959
const RenderVariable rv(iv,cairo);
6060
// we need to add some translation if the variable is bound
61-
cairo_rotate(cairo,rotation()*M_PI/180.0);
61+
cairo_rotate(cairo,angle);
6262
coupledIntTranslation=-0.5*(intVarOffset+2*rv.width()+2+r)*z;
6363
if (rv.width()<iv.iWidth()) coupledIntTranslation=-0.5*(intVarOffset+2*iv.iWidth()+2+r)*z;
64-
cairo_rotate(cairo,-rotation()*M_PI/180.0);
6564
}
6665

67-
cairo_save(cairo);
68-
cairo_rotate(cairo, angle);
6966

67+
{
68+
cairo::CairoSave cs(cairo);
69+
cairo_rotate(cairo, angle);
70+
cairo_scale(cairo,z,z);
71+
if (textFlipped) cairo_rotate(cairo, M_PI);
72+
const double sf = scaleFactor();
73+
cairo_scale(cairo,sf,sf);
74+
cairo_move_to(cairo,-7,3.5);
75+
cairo_show_text(cairo,"∫dt");
76+
}
77+
DrawBinOp d(cairo, zoomFactor());
78+
d.drawPort([&](){d.drawSymbol("0");}, l,h,rotation());
79+
d.drawPort([&](){d.drawSymbol("f");}, l,-h,rotation());
80+
7081
cairo_save(cairo);
71-
cairo_scale(cairo,z,z);
72-
if (textFlipped) cairo_rotate(cairo, M_PI);
73-
const double sf = scaleFactor();
74-
cairo_scale(cairo,sf,sf);
75-
cairo_move_to(cairo,-7,3.5);
76-
cairo_show_text(cairo,"\xE2\x88\xAB");
77-
cairo_show_text(cairo,"dt");
78-
// label the initial condition port
79-
cairo_scale(cairo,0.5,0.5);
80-
cairo_move_to(cairo,-19,19);
81-
cairo_show_text(cairo,"0");
82-
cairo_move_to(cairo,-19,-15);
83-
cairo_show_text(cairo,"f");
84-
cairo_restore(cairo);
85-
82+
cairo_rotate(cairo, angle);
83+
8684
int intVarWidth=0;
8785

8886

model/operation.cc

Lines changed: 0 additions & 73 deletions
Original file line numberDiff line numberDiff line change
@@ -39,79 +39,6 @@
3939
using namespace ecolab;
4040
using ecolab::cairo::CairoSave;
4141

42-
namespace
43-
{
44-
struct DrawBinOp
45-
{
46-
cairo_t *cairo;
47-
double zoomFactor;
48-
DrawBinOp(cairo_t *cairo, double z=1): cairo(cairo), zoomFactor(z) {}
49-
50-
void drawPlus() const
51-
{
52-
cairo_move_to(cairo,0,-5);
53-
cairo_line_to(cairo,0,5);
54-
cairo_move_to(cairo,-5,0);
55-
cairo_line_to(cairo,5,0);
56-
cairo_stroke(cairo);
57-
}
58-
59-
void drawMinus() const
60-
{
61-
cairo_move_to(cairo,-5,0);
62-
cairo_line_to(cairo,5,0);
63-
cairo_stroke(cairo);
64-
}
65-
66-
void drawMultiply() const
67-
{
68-
cairo_move_to(cairo,-5,-5);
69-
cairo_line_to(cairo,5,5);
70-
cairo_move_to(cairo,-5,5);
71-
cairo_line_to(cairo,5,-5);
72-
cairo_stroke(cairo);
73-
}
74-
75-
void drawDivide() const
76-
{
77-
cairo_move_to(cairo,-5,0);
78-
cairo_line_to(cairo,5,0);
79-
cairo_new_sub_path(cairo);
80-
cairo_arc(cairo,0,3,1,0,2*M_PI);
81-
cairo_new_sub_path(cairo);
82-
cairo_arc(cairo,0,-3,1,0,2*M_PI);
83-
cairo_stroke(cairo);
84-
}
85-
86-
void drawSymbol(const char* s) const
87-
{
88-
cairo_scale(cairo,zoomFactor,zoomFactor);
89-
cairo_move_to(cairo,-5,0);
90-
cairo_show_text(cairo,s);
91-
}
92-
93-
// puts a small symbol to identify port
94-
// x, y = position of symbol
95-
template <class F>
96-
void drawPort(F f, float x, float y, float rotation) const
97-
{
98-
const CairoSave cs(cairo);
99-
100-
const double angle=rotation * M_PI / 180.0;
101-
if (rotation)
102-
y=-y;
103-
cairo_rotate(cairo, angle);
104-
105-
cairo_translate(cairo,0.7*x,0.6*y);
106-
cairo_scale(cairo,0.5,0.5);
107-
108-
// and counter-rotate
109-
cairo_rotate(cairo, -angle);
110-
f();
111-
}
112-
};
113-
}
114-
11542
namespace minsky
11643
{
11744
namespace

model/operation.h

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -115,6 +115,77 @@ namespace minsky
115115
/// @}
116116

117117
};
118+
119+
/// helper class to draw port label symbols
120+
struct DrawBinOp
121+
{
122+
cairo_t *cairo;
123+
double zoomFactor;
124+
DrawBinOp(cairo_t *cairo, double z=1): cairo(cairo), zoomFactor(z) {}
125+
126+
void drawPlus() const
127+
{
128+
cairo_move_to(cairo,0,-5);
129+
cairo_line_to(cairo,0,5);
130+
cairo_move_to(cairo,-5,0);
131+
cairo_line_to(cairo,5,0);
132+
cairo_stroke(cairo);
133+
}
134+
135+
void drawMinus() const
136+
{
137+
cairo_move_to(cairo,-5,0);
138+
cairo_line_to(cairo,5,0);
139+
cairo_stroke(cairo);
140+
}
141+
142+
void drawMultiply() const
143+
{
144+
cairo_move_to(cairo,-5,-5);
145+
cairo_line_to(cairo,5,5);
146+
cairo_move_to(cairo,-5,5);
147+
cairo_line_to(cairo,5,-5);
148+
cairo_stroke(cairo);
149+
}
150+
151+
void drawDivide() const
152+
{
153+
cairo_move_to(cairo,-5,0);
154+
cairo_line_to(cairo,5,0);
155+
cairo_new_sub_path(cairo);
156+
cairo_arc(cairo,0,3,1,0,2*M_PI);
157+
cairo_new_sub_path(cairo);
158+
cairo_arc(cairo,0,-3,1,0,2*M_PI);
159+
cairo_stroke(cairo);
160+
}
161+
162+
void drawSymbol(const char* s) const
163+
{
164+
cairo_scale(cairo,zoomFactor,zoomFactor);
165+
cairo_move_to(cairo,-5,0);
166+
cairo_show_text(cairo,s);
167+
}
168+
169+
// puts a small symbol to identify port
170+
// x, y = position of symbol
171+
template <class F>
172+
void drawPort(F f, float x, float y, float rotation) const
173+
{
174+
const ecolab::cairo::CairoSave cs(cairo);
175+
176+
const double angle=rotation * M_PI / 180.0;
177+
if (minsky::flipped(rotation))
178+
y=-y;
179+
cairo_rotate(cairo, angle);
180+
181+
cairo_translate(cairo,0.7*x,0.6*y);
182+
cairo_scale(cairo,0.5,0.5);
183+
184+
// and counter-rotate
185+
cairo_rotate(cairo, -angle);
186+
f();
187+
}
188+
};
118189
}
119190

120191
#include "operation.cd"

0 commit comments

Comments
 (0)