Programmable real-time audio signal processing application
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

cmGr2dFltk.cpp 3.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150
  1. //| Copyright: (C) 2019-2020 Kevin Larke <contact AT larke DOT org>
  2. //| License: GNU GPL version 3.0 or above. See the accompanying LICENSE file.
  3. #include <FL/Fl.H>
  4. #include <Fl/fl_draw.h>
  5. #include <FL/Fl_Widget.H>
  6. #include <FL/Fl_Double_Window.H>
  7. #include <Fl/Fl_Output.H>
  8. #include <Fl/Fl_Menu_Bar.H>
  9. #include <vector>
  10. #include "Fl_CbLinker.h"
  11. #include "cmGlobal.h"
  12. #include "cmFloatTypes.h"
  13. #include "cmRpt.h"
  14. #include "cmErr.h"
  15. #include "cmCtx.h"
  16. #include "cmMem.h"
  17. #include "cmMallocDebug.h"
  18. #include "cmLinkedHeap.h"
  19. #include "cmText.h"
  20. #include "cmGr.h"
  21. #include "cmGrDevCtx.h"
  22. #include "cmGrPlot.h"
  23. #include "cmGrPage.h"
  24. #include "cmGrFltk.h"
  25. #include "cmGr2dFltk.h"
  26. cmGr2dFltk::cmGr2dFltk(cmCtx_t* ctx, Fl_Menu_Bar* menuBar, int x, int y, int w, int h)
  27. : cmGrPlotFltk(ctx,x,y,w,h),
  28. _x(0),_y(0),_radius(0),_angle(0),
  29. _objId(0)
  30. {
  31. cmErrSetup(&_err,&ctx->rpt,"cmGr2dFltk");
  32. if( cmGrPageIsValid(pageHandle()) == false )
  33. return;
  34. initViews(1,1);
  35. unsigned vwIdx = 0;
  36. cmGrPgH_t pgH = pageHandle();
  37. cmGrVwH_t vwH = cmGrPageViewHandle( pgH, vwIdx);
  38. cmGrH_t cvH = cmGrViewGrHandle( vwH );
  39. cmGrVExt_t limExt;
  40. cmGrVExtSetD(&limExt,-kWidth,-kHeight,kWidth, kHeight);
  41. cmGrObjSetWorldExt( cvH, cmGrRootObjH(cvH), &limExt );
  42. cmGrObjSetWorldLimitExt(cvH, cmGrRootObjH(cvH), &limExt, kLeftGrFl | kRightGrFl | kTopGrFl | kBottomGrFl );
  43. _createObj();
  44. cmGrSetViewExtentsE( cvH, &limExt );
  45. }
  46. cmGr2dFltk::~cmGr2dFltk()
  47. {
  48. }
  49. bool cmGr2dFltk::on_plot_object( cmGrPlotCbArg_t* arg )
  50. {
  51. if( arg->selId==kEventCbSelGrPlId && cmIsFlag(arg->eventFlags,kMsDragGrFl ) )
  52. {
  53. cmGrVExt_t vext;
  54. cmGrPlotObjVExt(arg->objH,&vext);
  55. //cmGrVExtPrint("",&vext);
  56. _x = cmGrVExtMinX(&vext);
  57. _y = cmGrVExtMinY(&vext);
  58. _radius = sqrtf(_x*_x + _y*_y)/kWidth;
  59. _angle = -( atan2f(_y,_x) - M_PI/2.0);
  60. if( _angle < 0 )
  61. _angle += 2.0 * M_PI;
  62. _angle = 360.0f * _angle / (2.0*M_PI);
  63. setStatusText(cmTsPrintfS("r:%f angle:%f",_radius,_angle));
  64. callback()(this,user_data());
  65. }
  66. return true;
  67. }
  68. double cmGr2dFltk::x() const
  69. { return _x; }
  70. double cmGr2dFltk::y() const
  71. { return _y; }
  72. double cmGr2dFltk::radius() const
  73. { return _radius; }
  74. double cmGr2dFltk::angle() const
  75. { return _angle; }
  76. void cmGr2dFltk::_createObj()
  77. {
  78. cmGrPlH_t plH = plotHandle();
  79. cmGrPgH_t pgH = pageHandle();
  80. unsigned vwIdx = 0;
  81. cmGrVwH_t vwH = cmGrPageViewHandle( pgH, vwIdx );
  82. cmGrH_t cvH = cmGrViewGrHandle( vwH );
  83. cmGrPlObjH_t parentObjH = cmGrPlObjNullHandle;
  84. cmGrPlObjH_t xAnchorObjH = cmGrPlObjNullHandle;
  85. cmGrPlObjH_t yAnchorObjH = cmGrPlObjNullHandle;
  86. cmGrPlObjH_t objH = cmGrPlObjNullHandle;
  87. cmGrPlObjTypeId_t objTypeId = kRectGrPlId;
  88. cmReal_t x = 0;
  89. cmReal_t y = 0;
  90. cmReal_t w = 0;
  91. cmReal_t h = 0;
  92. unsigned flags = 0; //kNoDragGrPlFl;
  93. cmGrVExt_t* wext = NULL;
  94. if( cmGrPlotObjCreate(plH, cvH, &objH, _objId++, parentObjH, xAnchorObjH, yAnchorObjH, objTypeId, flags | kNoDragGrPlFl, x, y, w, h, NULL, wext ) != kOkGrPlRC )
  95. {
  96. cmErrMsg(&_err,kCreateObjRC,"Plot origin object create failed.");
  97. }
  98. else
  99. {
  100. cmGrPlotObjSetPhysExt(objH, -2, -2, 2, 2 );
  101. cmGrPlotObjSetFontSize(objH,8);
  102. }
  103. objH = cmGrPlObjNullHandle;
  104. if( cmGrPlotObjCreate(plH, cvH, &objH, _objId++, parentObjH, xAnchorObjH, yAnchorObjH, objTypeId, flags, x, y, w, h, NULL, wext ) != kOkGrPlRC )
  105. {
  106. cmErrMsg(&_err,kCreateObjRC,"Plot object create failed.");
  107. }
  108. else
  109. {
  110. //unsigned f = 0 ? (kNorthJsGrFl | kTopJsGrFl) : (kSouthJsGrFl | kBottomJsGrFl);
  111. //cmGrPlotObjSetLabelAttr( objH, f | kWestJsGrFl | kTopJsGrFl | kRightJsGrFl, 0, kBlackGrId );
  112. cmGrPlotObjSetLineColor( objH, kEnablePlGrId, kGreenGrId );
  113. cmGrPlotObjSetPhysExt(objH, -4, -4, 4, 4 );
  114. cmGrPlotObjSetFontSize(objH,8);
  115. }
  116. }