Minsky
minsky::GodleyTableWindow Class Reference

#include <godleyTableWindow.h>

Inheritance diagram for minsky::GodleyTableWindow:
Inheritance graph
Collaboration diagram for minsky::GodleyTableWindow:
Collaboration graph

Public Member Functions

 GodleyTableWindow (GodleyIcon &g)
 
void requestRedraw ()
 
void requestRedrawCanvas () override
 
void mouseDown (float x, float y) override
 
void mouseUp (float x, float y) override
 
void mouseMove (float x, float y) override
 
void zoom (double, double, double z) override
 
double zoomFactor () const override
 
bool keyPress (const EventInterface::KeyPressArgs &args) override
 handle key press over current itemFocus, More...
 
bool hasScrollBars () const override
 return whether this window has scrollbars (needed for MacOSX). More...
 
void draw (cairo_t *cairo)
 
- Public Member Functions inherited from minsky::RenderNativeWindow
const RenderFrameArgsframeArgs () const
 
 ~RenderNativeWindow () override
 
virtual void init ()
 perform any initialisation of any subclasses of this More...
 
void renderFrame (const RenderFrameArgs &args)
 
void destroyFrame ()
 
void draw ()
 
void requestRedraw ()
 
void macOSXRedraw ()
 
RenderNativeWindowoperator= (const RenderNativeWindow &x)
 
 RenderNativeWindow ()=default
 
 RenderNativeWindow (const RenderNativeWindow &)=default
 
- Public Member Functions inherited from minsky::EventInterface
virtual void controlMouseDown (float x, float y)
 
virtual void moveTo (float x, float y)
 move this so that (x,y) is centred More...
 
virtual std::vector< float > position () const
 current centre coordinates More...
 
virtual bool getItemAt (float x, float y)
 item or wire obtained by get*At() calls More...
 
virtual bool getWireAt (float x, float y)
 item or wire obtained by get*At() calls More...
 
- Public Member Functions inherited from minsky::GodleyTableEditor
GodleyIcongodleyIcon ()
 
const GodleyIcongodleyIcon () const
 
void disableButtons ()
 
void enableButtons ()
 
bool selectedCellInTable () const
 
 GodleyTableEditor (GodleyIcon &g)
 
void draw (cairo_t *cairo)
 
double width () const
 
double height () const
 
void mouseDown (double x, double y)
 event handling More...
 
void mouseUp (double x, double y)
 
void mouseMoveB1 (double x, double y)
 mouse motion with button 1 pressed More...
 
void mouseMove (double x, double y)
 
void keyPress (int keySym, const std::string &utf8)
 
ClickType clickTypeZoomed (double x, double y) const
 returns the clickType in zoomed coordinates More...
 
void addStockVar (double x)
 add/delete rows/columns at x,y More...
 
void addStockVarByCol (int c)
 
void importStockVar (const std::string &name, double x)
 
void importStockVarByCol (const std::string &name, int c)
 
void deleteStockVar (double x)
 
void deleteStockVarByCol (int c)
 
void addFlow (double y)
 
void addFlowByRow (int r)
 
void deleteFlow (double y)
 
void deleteFlowByRow (int r)
 
int colXZoomed (double x) const
 
int rowYZoomed (double y) const
 
std::string moveAssetClass (double x, double y)
 
std::string swapAssetClass (double x, double y)
 
void highlightColumn (cairo_t *cairo, unsigned col)
 
void highlightRow (cairo_t *cairo, unsigned row)
 
void highlightCell (cairo_t *cairo, unsigned row, unsigned col)
 
void delSelection ()
 
void cut ()
 
void copy ()
 
void paste ()
 
int textIdx (double x) const
 
void pushHistory ()
 
void undo (int changes)
 restore to state changes ago More...
 
void adjustWidgets ()
 ensure button widgets are synced with current table data More...
 
void update ()
 update canvas godleyIcon, and any related godley icons. Can throw More...
 
ClickType clickType (double x, double y) const
 
std::set< string > matchingTableColumns (double x)
 return list of matching table columns for column at x More...
 
std::set< string > matchingTableColumnsByCol (int c)
 
void navigateRight ()
 move selected cell right, left, up or down, moving to next line and wrapping if at end of row or col More...
 
void navigateLeft ()
 move selected cell right, left, up or down, moving to next line and wrapping if at end of row or col More...
 
void navigateUp ()
 move selected cell right, left, up or down, moving to next line and wrapping if at end of row or col More...
 
void navigateDown ()
 move selected cell right, left, up or down, moving to next line and wrapping if at end of row or col More...
 

Protected Member Functions

bool redraw (int, int, int width, int height) override
 
- Protected Member Functions inherited from minsky::GodleyTableEditor
int colX (double x) const
 column at x in unzoomed coordinates More...
 
int rowY (double y) const
 row at y in unzoomed coordinates More...
 
void checkCell00 ()
 check if cell (0,0) is selected, and deselect if so handle delete or backspace. Cell assumed selected More...
 
void handleBackspace ()
 
void handleDelete ()
 

Private Member Functions

 CLASSDESC_ACCESS (GodleyTableWindow)
 

Additional Inherited Members

- Public Types inherited from minsky::GodleyTableEditor
enum  ClickType {
  background, row0, col0, internal,
  importStock, rowWidget, colWidget
}
 
- Public Types inherited from minsky::ButtonWidgetEnums
enum  RowCol { row, col }
 
enum  Pos {
  first, second, middle, last,
  firstAndLast
}
 
- Public Types inherited from minsky::GodleyAssetClass
enum  AssetClass { noAssetClass, asset, liability, equity }
 
enum  DisplayStyle { DRCR, sign }
 
- Static Public Member Functions inherited from minsky::RenderNativeWindow
static double scaleFactor ()
 
- Public Attributes inherited from minsky::EventInterface
ItemPtr item
 item or wire obtained by get*At() calls More...
 
WirePtr wire
 item or wire obtained by get*At() calls More...
 
- Public Attributes inherited from minsky::GodleyTableEditor
double leftTableOffset =4*ButtonWidget<col>::buttonSpacing
 offset of the table within the window More...
 
double topTableOffset =30
 
bool drawButtons =true
 whether to draw row/column buttons More...
 
unsigned scrollRowStart =1
 starting row/col number of the scrolling region More...
 
unsigned scrollColStart =1
 
int selectedRow =-1
 which cell is active, none initially More...
 
int selectedCol =-1
 
int srcRow =-1
 src cell in the event of a move More...
 
int srcCol =-1
 
int hoverRow =-1
 
int hoverCol =-1
 
std::vector< double > colLeftMargin
 computed positions of the table columns More...
 
double rowHeight =0
 computed height of each row More...
 
unsigned insertIdx =0
 location of insertion pointer in selected cell, as well as other end of selection (if mouse-swiped) More...
 
unsigned selectIdx =0
 
double zoomFactor =1
 zoom the display More...
 
std::size_t maxHistory {100}
 maximum no. of history states to save More...
 
std::size_t historyPtr =0
 
- Static Public Attributes inherited from minsky::RenderNativeWindow
static ecolab::cairo::Colour backgroundColour {0.8,0.8,0.8,1}
 
- Static Public Attributes inherited from minsky::GodleyTableEditor
static constexpr double columnButtonsOffset =12
 
static constexpr double pulldownHot =12
 space for ▼ in stackVar cells minimum column width (for eg empty columns) More...
 
static constexpr double minColumnWidth =4*ButtonWidget<col>::buttonSpacing
 
- Protected Attributes inherited from minsky::GodleyTableEditor
std::vector< ButtonWidget< row > > rowWidgets
 
std::vector< ButtonWidget< col > > colWidgets
 
int motionRow =-1
 
int motionCol =-1
 current cell under mouse motion More...
 
std::deque< GodleyTablehistory
 

Detailed Description

Definition at line 216 of file godleyTableWindow.h.

Constructor & Destructor Documentation

◆ GodleyTableWindow()

minsky::GodleyTableWindow::GodleyTableWindow ( GodleyIcon g)
inline

Definition at line 229 of file godleyTableWindow.h.

229 : GodleyTableEditor(g) {}

Member Function Documentation

◆ CLASSDESC_ACCESS()

minsky::GodleyTableWindow::CLASSDESC_ACCESS ( GodleyTableWindow  )
private

◆ draw()

void minsky::GodleyTableEditor::draw

Definition at line 156 of file godleyTableWindow.cc.

157  {
158  const CairoSave cs(cairo);
159  cairo_scale(cairo,zoomFactor,zoomFactor);
160  Pango pango(cairo);
161  pango.setMarkup("Flows ↓ / Stock Vars →");
162  rowHeight=pango.height()+2;
163  const double tableHeight=(m_godleyIcon.table.rows()-scrollRowStart+1)*rowHeight;
164  double x=leftTableOffset;
165  double lastAssetBoundary=x;
166  auto assetClass=GodleyAssetClass::noAssetClass;
167  // only recalculate colmn widths when no cell is selected.
168  const bool resizeGrid=selectedCol<0 || selectedRow<0 || motionRow>=0 || motionCol>=0;
169  if (resizeGrid)
170  colLeftMargin.clear();
171 
172  for (unsigned col=0; col<m_godleyIcon.table.cols(); ++col)
173  {
174  // omit stock columns less than scrollColStart
175  if (col>0 && col<scrollColStart) continue;
176  // vertical lines & asset type tag
177  if (assetClass!=m_godleyIcon.table._assetClass(col))
178  {
179  if (assetClass!=GodleyAssetClass::noAssetClass)
180  {
181  pango.setMarkup(capitalise(enumKey<GodleyAssetClass::AssetClass>(assetClass)));
182  // increase column by enough to fit asset class label
183  if (x < pango.width()+lastAssetBoundary+3)
184  x=pango.width()+lastAssetBoundary+3;
185  cairo_move_to(cairo,0.5*(x+lastAssetBoundary-pango.width()),0);
186  showAsset(pango, cairo, assetClass);
187  }
188  lastAssetBoundary=x;
189 
190  assetClass=m_godleyIcon.table._assetClass(col);
191  cairo_move_to(cairo,x+3,topTableOffset);
192  cairo_rel_line_to(cairo,0,tableHeight);
193  }
194  cairo_move_to(cairo,x,topTableOffset);
195  cairo_rel_line_to(cairo,0,tableHeight);
196  cairo_set_line_width(cairo,0.5);
197  cairo_stroke(cairo);
198 
199  if (drawButtons && col>0 && col<colWidgets.size())
200  {
201  const CairoSave cs(cairo);
202  cairo_move_to(cairo, x, columnButtonsOffset);
203  colWidgets[col].draw(cairo);
204  }
205 
206  if (col>1)
207  {
208  cairo_move_to(cairo,x-pulldownHot,topTableOffset);
209  pango.setMarkup("▼");
210  pango.show();
211  }
212 
213  double y=topTableOffset;
214  double colWidth=minColumnWidth;
215  for (unsigned row=0; row<m_godleyIcon.table.rows(); ++row)
216  {
217  if (row>0 && row<scrollRowStart) continue;
218 
219  if (drawButtons && col==0 && row>0 && row<rowWidgets.size())
220  {
221  const CairoSave cs(cairo);
222  cairo_move_to(cairo, 0, y);
223  rowWidgets[row].draw(cairo);
224  }
225 
226  const CairoSave cs(cairo);
227  if (row!=0 || col!=0)
228  {
229  // Make sure non-utf8 chars converted to utf8 as far as possible. for ticket 1166.
230  string text=utf_to_utf<char>(m_godleyIcon.table.cell(row,col));
231  if (!text.empty())
232  {
233  string value;
234  FlowCoef fc(text);
235  if (cminsky().displayValues && col!=0) // Do not add value "= 0.0" to first column. For tickets 1064/1274
236  try
237  {
238  auto vv=cminsky().variableValues
239  [valueId(m_godleyIcon.group.lock(),utf_to_utf<char>(fc.name))];
240  if (vv->idx()>=0)
241  {
242  const double val=fc.coef*vv->value();
243  auto ee=engExp(val);
244  if (ee.engExp==-3) ee.engExp=0;
245  value=" = "+mantissa(val,ee)+expMultiplier(ee.engExp);
246  }
247  }
248  catch (const std::exception& ex)
249  {
250  value=string("= Err: ")+ex.what();
251  // highlight error in red
252  cairo_set_source_rgb(cairo,1,0,0);
253  }
254 
255  // the active cell renders as bare LaTeX code for
256  // editing, all other cells rendered as LaTeX
258  {
259  if (row>0 && col>0)
260  { // handle DR/CR mode and colouring of text
261  if (fc.coef<0)
262  cairo_set_source_rgb(cairo,1,0,0);
263  if (cminsky().displayStyle==GodleyTable::DRCR)
264  {
265  if (assetClass==GodleyAssetClass::asset ||
266  assetClass==GodleyAssetClass::noAssetClass)
267  text = (fc.coef<0)?"CR ":"DR ";
268  else
269  text = (fc.coef<0)?"DR ":"CR ";
270  fc.coef=abs(fc.coef);
271  text+=latexToPango(fc.str());
272  }
273  else
274  text = latexToPango(text);
275  }
276  else // is flow tag, stock var or initial condition
277  text = latexToPango(text);
278  text+=value;
279  }
280  else
281  //Display values of parameters used as initial conditions in Godley tables. for ticket 1126.
283  else text=defang(text);
284  }
285  pango.setMarkup(text);
286  }
287  // allow extra space for the ▼ in row 0
288  colWidth=max(colWidth,pango.width() + (row==0? pulldownHot:0));
289  cairo_move_to(cairo,x+3,y);
290  pango.show();
291  y+=rowHeight;
292  }
293  colWidth+=5;
294 
295  if (resizeGrid)
296  {
297  colLeftMargin.push_back(x);
298  x+=colWidth;
299  }
300  else if (col+1<colLeftMargin.size())
301  x=colLeftMargin[col+1];
302  }
303 
304  // display pulldown for last column
305  cairo_move_to(cairo,x-pulldownHot,topTableOffset);
306  pango.setMarkup("▼");
307  pango.show();
308 
309 
310  pango.setMarkup
311  (capitalise(enumKey<GodleyAssetClass::AssetClass>(assetClass)));
312  // increase column by enough to fit asset class label
313  if (x < pango.width()+lastAssetBoundary+3)
314  x=pango.width()+lastAssetBoundary+3;
315  cairo_move_to(cairo,0.5*(x+lastAssetBoundary-pango.width()),0);
316  showAsset(pango, cairo, assetClass);
317  // final column vertical line
318  colLeftMargin.push_back(x);
319  cairo_move_to(cairo,x,topTableOffset);
320  cairo_rel_line_to(cairo,0,tableHeight);
321  cairo_move_to(cairo,x+3,topTableOffset);
322  cairo_rel_line_to(cairo,0,tableHeight);
323  cairo_set_line_width(cairo,0.5);
324  cairo_stroke(cairo);
325 
326  cairo_move_to(cairo,x-pulldownHot,topTableOffset);
327 
328  // now row sum column
329  x+=3;
330  double y=topTableOffset;
331  cairo_move_to(cairo,x,0); // display A-L-E above the final column. for ticket 1285
332  pango.setMarkup("A-L-E");
333  pango.show();
334  double colWidth=pango.width();
335 
336  for (unsigned row=0; row<m_godleyIcon.table.rows(); ++row) // perform row sum on stock var heading column too. for ticket 1285
337  {
338  if (row >0 && row<scrollRowStart) continue;
339  pango.setMarkup(latexToPango(m_godleyIcon.rowSum(row)));
340  colWidth=max(colWidth,pango.width());
341  cairo_move_to(cairo,x,y);
342  pango.show();
343  y+=rowHeight;
344  }
345 
346  x+=colWidth;
347  y=topTableOffset;
348  for (unsigned row=0; row<=m_godleyIcon.table.rows(); ++row)
349  {
350  // horizontal lines
351  if (row>0 && row<scrollRowStart) continue;
352  cairo_move_to(cairo,leftTableOffset,y);
353  cairo_line_to(cairo,x,y);
354  cairo_set_line_width(cairo,0.5);
355  cairo_stroke(cairo);
356  y+=rowHeight;
357  }
358 
359  // final vertical line
360  colLeftMargin.push_back(x);
361  cairo_move_to(cairo,x,topTableOffset);
362  cairo_rel_line_to(cairo,0,tableHeight);
363  cairo_set_line_width(cairo,0.5);
364  cairo_stroke(cairo);
365 
366  // indicate cell mouse is hovering over
367  if ((hoverRow>0 || hoverCol>0) &&
368  size_t(hoverRow)<m_godleyIcon.table.rows() &&
369  size_t(hoverCol)<m_godleyIcon.table.cols())
370  {
371  const CairoSave cs(cairo);
372  cairo_rectangle(cairo,
375  cairo_set_line_width(cairo,1);
376  cairo_stroke(cairo);
377  }
378 
379  // indicate selected cells
380  {
381  const CairoSave cs(cairo);
383  {
384  size_t i=0, j=0;
386 
387  if (motionCol>=0 && selectedRow==0 && selectedCol>0) // whole col being moved
388  {
390  highlightColumn(cairo,motionCol);
391  }
392  else if (motionRow>=0 && selectedCol==0 && selectedRow>0) // whole Row being moved
393  {
394  highlightRow(cairo,selectedRow);
395  highlightRow(cairo,motionRow);
396  }
397  else if (selectedCol==0 || /* selecting individual cell */
399  {
400  if ((selectedRow>1 || selectedRow <0) || selectedCol!=0) // can't select flows/stockVars or Initial Conditions labels
401  {
403  const double xx=colLeftMargin[i], yy=j*rowHeight+topTableOffset;
404  {
405  const cairo::CairoSave cs(cairo);
406  cairo_set_source_rgba(cairo,1,1,1,1);
407  cairo_rectangle(cairo,xx,yy,colLeftMargin[i+1]-xx,rowHeight);
408  cairo_fill_preserve(cairo);
409  cairo_set_source_rgba(cairo,1,.55,0,1);
410  cairo_set_line_width(cairo,2);
411  cairo_stroke(cairo);
412  }
414  cairo_move_to(cairo,xx,yy);
415  pango.show();
416 
417  // show insertion cursor
418  cairo_move_to(cairo,xx+pango.idxToPos(insertIdx),yy);
419  cairo_rel_line_to(cairo,0,rowHeight);
420  cairo_set_line_width(cairo,1);
421  cairo_stroke(cairo);
422  if (motionRow>0 && motionCol>0)
424  if (selectIdx!=insertIdx)
425  {
426  // indicate some text has been selected
427  cairo_rectangle(cairo,xx+pango.idxToPos(insertIdx),yy,
428  pango.idxToPos(selectIdx)-pango.idxToPos(insertIdx),rowHeight);
429  cairo_set_source_rgba(cairo,0.5,0.5,0.5,0.5);
430  cairo_fill(cairo);
431  }
432  }
433  }
434  }
435  }
436  }
double leftTableOffset
offset of the table within the window
std::string expMultiplier(int exp)
string defang(char c)
Definition: latexMarkup.cc:842
std::size_t cols() const
Definition: godleyTable.h:115
static constexpr double pulldownHot
space for ▼ in stackVar cells minimum column width (for eg empty columns)
std::string latexToPango(const char *s)
Definition: latexMarkup.h:30
EngNotation engExp(double value)
return formatted mantissa and exponent in engineering format
bool drawButtons
whether to draw row/column buttons
VariableValues variableValues
Definition: minsky.h:200
bool displayValues
Definition: minsky.h:431
static constexpr double minColumnWidth
bool initialConditionRow(unsigned row) const
returns true if row is an "Initial Conditions" row
Definition: godleyTable.cc:37
std::string rowSum(int row) const
return the A-L-E row sum for row
Definition: godleyIcon.cc:522
string & cell(unsigned row, unsigned col)
Definition: godleyTable.h:144
string valueId(const string &name)
construct a valueId from fully qualified name @ name should not be canonicalised
Definition: valueId.cc:75
void highlightCell(cairo_t *cairo, unsigned row, unsigned col)
std::size_t rows() const
Definition: godleyTable.h:114
GodleyTable table
table data. Must be declared before editor
Definition: godleyIcon.h:80
double rowHeight
computed height of each row
std::vector< ButtonWidget< row > > rowWidgets
void highlightColumn(cairo_t *cairo, unsigned col)
std::vector< double > colLeftMargin
computed positions of the table columns
const Minsky & cminsky()
const version to help in const correctness
Definition: minsky.h:549
std::string mantissa(double value, const EngNotation &, int digits=3)
GodleyIcon & m_godleyIcon
Godley icon that owns this.
void showAsset(Pango &pango, cairo_t *cairo, GodleyAssetClass::AssetClass assetClass)
represents a numerical coefficient times a variable (a "flow")
Definition: flowCoef.h:27
const vector< AssetClass > & _assetClass() const
class of each column (used in DE compliant mode)
Definition: godleyTable.h:78
int selectedRow
which cell is active, none initially
void highlightRow(cairo_t *cairo, unsigned row)
unsigned scrollRowStart
starting row/col number of the scrolling region
int motionCol
current cell under mouse motion
double zoomFactor() const override
unsigned insertIdx
location of insertion pointer in selected cell, as well as other end of selection (if mouse-swiped) ...
std::vector< ButtonWidget< col > > colWidgets
static constexpr double columnButtonsOffset

◆ hasScrollBars()

bool minsky::GodleyTableWindow::hasScrollBars ( ) const
inlineoverridevirtual

return whether this window has scrollbars (needed for MacOSX).

Reimplemented from minsky::RenderNativeWindow.

Definition at line 240 of file godleyTableWindow.h.

240 {return true;}

◆ keyPress()

bool minsky::GodleyTableWindow::keyPress ( const EventInterface::KeyPressArgs )
inlineoverridevirtual

handle key press over current itemFocus,

Parameters
keySymthe X key sym code
utf8utf8 encoded character
statemodifer state 1=shift, 2=caps lock, 4=ctrl, 8=alt
x& y contain mouse coordinates
Returns
true if event handled

Reimplemented from minsky::EventInterface.

Definition at line 238 of file godleyTableWindow.h.

References minsky::GodleyTableEditor::keyPress(), minsky::EventInterface::KeyPressArgs::keySym, and minsky::EventInterface::KeyPressArgs::utf8.

239  {GodleyTableEditor::keyPress(args.keySym,args.utf8); return true;}
void keyPress(int keySym, const std::string &utf8)
Here is the call graph for this function:

◆ mouseDown()

void minsky::GodleyTableWindow::mouseDown ( float  x,
float  y 
)
inlineoverridevirtual

Reimplemented from minsky::EventInterface.

Definition at line 233 of file godleyTableWindow.h.

References minsky::GodleyTableEditor::mouseDown().

void mouseDown(double x, double y)
event handling
Here is the call graph for this function:

◆ mouseMove()

void minsky::GodleyTableWindow::mouseMove ( float  x,
float  y 
)
inlineoverridevirtual

Reimplemented from minsky::EventInterface.

Definition at line 235 of file godleyTableWindow.h.

References minsky::GodleyTableEditor::mouseMove().

void mouseMove(double x, double y)
Here is the call graph for this function:

◆ mouseUp()

void minsky::GodleyTableWindow::mouseUp ( float  x,
float  y 
)
inlineoverridevirtual

Reimplemented from minsky::EventInterface.

Definition at line 234 of file godleyTableWindow.h.

References minsky::GodleyTableEditor::mouseUp().

void mouseUp(double x, double y)
Here is the call graph for this function:

◆ redraw()

bool minsky::GodleyTableWindow::redraw ( int  ,
int  ,
int  width,
int  height 
)
inlineoverrideprotected

Definition at line 220 of file godleyTableWindow.h.

References minsky::RenderNativeWindow::draw().

220  {
221  if (surface.get()) {
222  draw(surface->cairo());
223  return true;
224  }
225  return false;
226  }
Here is the call graph for this function:

◆ requestRedraw()

void minsky::GodleyTableWindow::requestRedraw ( )
inline

Definition at line 230 of file godleyTableWindow.h.

Referenced by requestRedrawCanvas(), and zoom().

230 {if (surface.get()) surface->requestRedraw();}
Here is the caller graph for this function:

◆ requestRedrawCanvas()

void minsky::GodleyTableWindow::requestRedrawCanvas ( )
inlineoverridevirtual

Reimplemented from minsky::GodleyTableEditor.

Definition at line 231 of file godleyTableWindow.h.

References requestRedraw().

Here is the call graph for this function:

◆ zoom()

void minsky::GodleyTableWindow::zoom ( double  ,
double  ,
double  z 
)
inlineoverridevirtual

Reimplemented from minsky::EventInterface.

Definition at line 236 of file godleyTableWindow.h.

References requestRedraw(), and minsky::GodleyTableEditor::zoomFactor.

Here is the call graph for this function:

◆ zoomFactor()

double minsky::GodleyTableWindow::zoomFactor ( ) const
inlineoverridevirtual

Reimplemented from minsky::EventInterface.

Definition at line 237 of file godleyTableWindow.h.

References minsky::GodleyTableEditor::zoomFactor.

double zoomFactor
zoom the display

The documentation for this class was generated from the following file: