]> Devoid-pointer.net GitWeb - anyanka.git/commitdiff
Adjust the logic of ruler drawing to prevent the ticks to be too densely
authorMichal Malý <madcatxster@devoid-pointer.net>
Tue, 3 Mar 2015 00:36:38 +0000 (01:36 +0100)
committerMichal Malý <madcatxster@devoid-pointer.net>
Tue, 3 Mar 2015 00:36:38 +0000 (01:36 +0100)
or too sparsely placed.

signalcontroller.cpp
signalcontroller.h
signaldrawer.cpp
signaldrawer.h

index f04c0e843ff7a51a6565383229345d8f9b75f7c7..caeb12e75bd30f9c520b9641939d8115cb7c8b03 100644 (file)
@@ -167,12 +167,18 @@ std::vector<PeakDrawData> SignalController::getPeaksDrawData(const double fromX,
   return peaks;
 }
 
-RulerDrawData SignalController::getRulerDrawData(const double from, const double to, Axis axis)
+RulerDrawData SignalController::getRulerDrawData(const double from, const double to, Axis axis, const int pixelLength, const int minPixelStep, const int maxPixelStep)
 {
   double diffAbs, diffRel;
   double fromAbs, toAbs;
   double step, relStep;
   double firstTickAbs, firstTickRel;
+  double pixelStep;
+  double numSteps;
+
+  /* Don't bother doing anything for an invisible chart */
+  if (pixelLength < 1)
+    return RulerDrawData();
 
   diffRel = to - from;
 
@@ -192,6 +198,18 @@ RulerDrawData SignalController::getRulerDrawData(const double from, const double
   /* Calculate step */
   diffAbs = toAbs - fromAbs;
   step = 1 / pow(10, floor(log10(1 / (diffAbs))) + 1); // Magic - you want to love it but you better not touch!
+  numSteps = diffAbs / step;
+  pixelStep = pixelLength / numSteps + 1;
+  Logger::log(Logger::Level::DEBUG, ME_SENDER_STR, __QFUNC__ + QString("pixelStep %1, step %2, pixelLength %3, numSteps %4").arg(pixelStep).arg(step).arg(pixelLength).arg(numSteps));
+  if (pixelStep < minPixelStep) {
+    const double upscaleFactor = ceil(minPixelStep / pixelStep);
+    step *= upscaleFactor;
+    Logger::log(Logger::Level::DEBUG, ME_SENDER_STR, __QFUNC__ + QString("Corrected step %1, upscaleFactor %2").arg(step).arg(upscaleFactor));
+  } else if (pixelStep > maxPixelStep) {
+    const double downscaleFactor = ceil(pixelStep / maxPixelStep);
+    step /= downscaleFactor;
+    Logger::log(Logger::Level::DEBUG, ME_SENDER_STR, __QFUNC__ + QString("Corrected step %1, downscaleFactor %2").arg(step).arg(downscaleFactor));
+  }
   relStep = (diffRel * step) / (diffAbs);
   //Logger::log(Logger::Level::DEBUG, ME_SENDER_STR, __QFUNC__ + QString(" rD %1 aD %2").arg(diffRel).arg(diffAbs));
   //Logger::log(Logger::Level::DEBUG, ME_SENDER_STR, __QFUNC__ + QString(" fA %1 tA %2 fR %3 tR %4").arg(fromAbs).arg(toAbs).arg(from).arg(to));
index ea8bf6dff9bb4f54fbcbdaa4beec018447847c77..d8105c3396ff6550466337dc46615ff0151e4ed0 100644 (file)
@@ -85,14 +85,15 @@ struct PeakDrawData {
 };
 
 struct RulerDrawData {
-  RulerDrawData() : firstTickAbs(0), firstTickRel(0), step(0), relStep(0) {}
-  RulerDrawData(const double fta, const double ftr, const double s, const double rs) : firstTickAbs(fta), firstTickRel(ftr), step(s), relStep(rs)
+  RulerDrawData() : firstTickAbs(0), firstTickRel(0), step(0), relStep(0), valid(false) {}
+  RulerDrawData(const double fta, const double ftr, const double s, const double rs) : firstTickAbs(fta), firstTickRel(ftr), step(s), relStep(rs), valid(true)
   {}
 
   const double firstTickAbs;
   const double firstTickRel;
   const double step;
   const double relStep;
+  const bool valid;
 };
 
 class SignalController : public QObject, public JSONSerializable
@@ -109,7 +110,7 @@ public:
   Signal::TimeValuePair getXYValues(const double x);
   std::shared_ptr<GraphDrawData> getGraphDrawData(const double fromX, const double toX);
   std::vector<PeakDrawData> getPeaksDrawData(const double fromX, const double fromY, const double toX, const double toY);
-  RulerDrawData getRulerDrawData(const double from, const double to, SignalController::Axis axis);
+  RulerDrawData getRulerDrawData(const double from, const double to, SignalController::Axis axis, const int pixelLength, const int minPixelStep, const int maxPixelStep);
   GUIViewport guiViewport() const { return m_guiViewport; }
   double fromXAbs() const { return m_signal->timeAt(0); }
   double toXAbs() const { return m_signal->timeAt(m_signal->count()-1); }
index b42cbf5cb5299c4ed167da64e5e4f6514b955c27..b0262c97126730df23d684599e587c8afdeb5d67 100644 (file)
@@ -29,6 +29,8 @@
 const QString SignalDrawer::ME_SENDER_STR("SignalDrawer");
 const int SignalDrawer::AXIS_LABEL_BORDER_OFFSET(2);
 const int SignalDrawer::AXIS_LABEL_SCALE_OFFSET(3);
+const int SignalDrawer::MAXIMAL_AXIS_BIGTICK_STEP(75);
+const int SignalDrawer::MINIMAL_AXIS_BIGTICK_STEP(25);
 const int SignalDrawer::SCALE_MARGIN_TIME(16);
 const int SignalDrawer::SCALE_MARGIN_VALUE(12);
 
@@ -237,10 +239,9 @@ void SignalDrawer::drawLeadingSubticks(const RulerDrawData& rd, std::function<vo
   const double subAbsStep = subStep(rd.step);
   double subRel = rd.firstTickRel;
   double subAbs = rd.firstTickAbs;
-  int ctr = 0;
 
   while (subRel >= relMin) {
-    drawFunc(subRel, subAbs, (ctr++ == 5) ? TickType::TICK : TickType::SUBTICK);
+    drawFunc(subRel, subAbs, TickType::SUBTICK);
     subRel -= subRelStep;
     subAbs -= subAbsStep;
   }
@@ -254,11 +255,8 @@ void SignalDrawer::drawScaleBySubticks(const RulerDrawData& rd, std::function<vo
   double subRel = fromSubRel;
   double absVal = fromAbsVal;
 
-  int ctr = 10 - floor(((toSubRel - fromSubRel) / subRelStep) + 0.5);
-  //Logger::log(Logger::Level::DEBUG, ME_SENDER_STR, __QFUNC__ + QString("ctr %1, tsr %2, fsr %3 srs %4").arg(ctr).arg(fromSubRel).arg(toSubRel).arg(subRelStep));
-
   while (subRel < toSubRel) {
-    drawFunc(subRel, absVal, (ctr++ == 5) ? TickType::TICK : TickType::SUBTICK);
+    drawFunc(subRel, absVal, TickType::SUBTICK);
     subRel += subRelStep;
     absVal += subAbsStep;
   }
@@ -286,7 +284,9 @@ void SignalDrawer::drawTimeScale(QPainter* const p)
   textDrawFunc = std::bind(&SignalDrawer::renderTimeScaleText, this, p, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
   tickDrawFunc = std::bind(&SignalDrawer::renderTimeScaleTick, this, p, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
 
-  RulerDrawData rd = m_controller->getRulerDrawData(m_relXMin, m_relXMax, SignalController::Axis::TIME);
+  RulerDrawData rd = m_controller->getRulerDrawData(m_relXMin, m_relXMax, SignalController::Axis::TIME, m_gWidth, MINIMAL_AXIS_BIGTICK_STEP, MAXIMAL_AXIS_BIGTICK_STEP);
+  if (!rd.valid)
+    return;
 
   /* Draw text first - we need to know how wide is the largest numeric cue */
   drawScaleByTicks(rd, textDrawFunc, m_relXMax, false);
@@ -306,7 +306,9 @@ void SignalDrawer::drawValueScale(QPainter* const p)
   textDrawFunc = std::bind(&SignalDrawer::renderValueScaleText, this, p, std::ref(maxCueWidth), std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
   tickDrawFunc = std::bind(&SignalDrawer::renderValueScaleTick, this, p, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3);
 
-  RulerDrawData rd = m_controller->getRulerDrawData(m_relYMin, m_relYMax, SignalController::Axis::VALUE);
+  RulerDrawData rd = m_controller->getRulerDrawData(m_relYMin, m_relYMax, SignalController::Axis::VALUE, m_gHeight, MINIMAL_AXIS_BIGTICK_STEP, MAXIMAL_AXIS_BIGTICK_STEP);
+  if (!rd.valid)
+    return;
 
   /* Draw text first - we need to know how wide is the largest numeric cue */
   drawScaleByTicks(rd, textDrawFunc, m_relYMax, false);
@@ -378,9 +380,6 @@ void SignalDrawer::renderTimeScaleTick(QPainter* const p, const double rel, cons
   case TickType::BIGTICK:
     p->drawLine(xPix, m_gHeight + 2, xPix, m_gHeight + 8);
     break;
-  case TickType::TICK:
-    p->drawLine(xPix, m_gHeight + 2, xPix, m_gHeight + 6);
-    break;
   case TickType::SUBTICK:
     p->drawLine(xPix, m_gHeight + 2, xPix , m_gHeight + 4);
     break;
@@ -396,9 +395,6 @@ void SignalDrawer::renderValueScaleTick(QPainter* const p, const double rel, con
   case TickType::BIGTICK:
     p->drawLine(m_leftGraphOffset - 8, yPix, m_leftGraphOffset - 1, yPix);
     break;
-  case TickType::TICK:
-    p->drawLine(m_leftGraphOffset - 6, yPix, m_leftGraphOffset - 1, yPix);
-    break;
   case TickType::SUBTICK:
     p->drawLine(m_leftGraphOffset - 4, yPix, m_leftGraphOffset - 1, yPix);
     break;
@@ -696,7 +692,7 @@ void SignalDrawer::setNewRelativeConstraints(const double fromX, const double fr
 
 double SignalDrawer::subStep(const double step)
 {
-  return step / 10;
+  return step / 5;
 }
 
 SignalDrawer::~SignalDrawer()
index d72edaddc35b28c42ec7acd2369b036bc13777ef..31ef120a3c78fd4b29892b4d106fc8804ee4dd2f 100644 (file)
@@ -68,7 +68,7 @@ public:
   bool setDimensions(const int width, const int height);
 
 protected:
-  enum class TickType { BIGTICK, TICK, SUBTICK };
+  enum class TickType { BIGTICK, SUBTICK };
 
   std::shared_ptr<SignalController> m_controller;
   QLocale m_locale;
@@ -103,6 +103,8 @@ protected:
 
   static const int AXIS_LABEL_BORDER_OFFSET;
   static const int AXIS_LABEL_SCALE_OFFSET;
+  static const int MAXIMAL_AXIS_BIGTICK_STEP;
+  static const int MINIMAL_AXIS_BIGTICK_STEP;
   static const int SCALE_MARGIN_TIME;
   static const int SCALE_MARGIN_VALUE;