[Libreoffice-commits] core.git: chart2/source

xukai xukai at multicorewareinc.com
Tue Sep 23 07:57:38 PDT 2014


 chart2/source/view/charttypes/GL3DBarChart.cxx |   64 +++++++++++++++++--------
 chart2/source/view/inc/GL3DBarChart.hxx        |    5 +
 2 files changed, 50 insertions(+), 19 deletions(-)

New commits:
commit 221c2eb24b5eeeadb265cfd010fd6851715b24b5
Author: xukai <xukai at multicorewareinc.com>
Date:   Mon Sep 22 18:18:35 2014 +0800

    Show values of bars in selected row
    
    Change-Id: I18fbdcb05e3c95c20c96b426bf93e85657209f34
    Reviewed-on: https://gerrit.libreoffice.org/11584
    Reviewed-by: Kohei Yoshida <libreoffice at kohei.us>
    Tested-by: Kohei Yoshida <libreoffice at kohei.us>

diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx
index 96f1019..d244c6f 100644
--- a/chart2/source/view/charttypes/GL3DBarChart.cxx
+++ b/chart2/source/view/charttypes/GL3DBarChart.cxx
@@ -34,6 +34,7 @@
 #define SHOW_VALUE_COUNT 15
 #define SHOW_SCROLL_TEXT_DISTANCE 1000
 #define FLY_THRESHOLD 20
+#define DISPLAY_BARS_NUM 3
 
 
 using namespace com::sun::star;
@@ -473,7 +474,8 @@ GL3DBarChart::GL3DBarChart(
     miDataUpdateCounter(0),
     mnColorRate(0),
     mbBenchMarkMode(false),
-    maHistoryCounter(0)
+    mnHistoryCounter(0),
+    mnBarsInRow(0)
 {
     maFPSRenderStartTime.Seconds = maFPSRenderStartTime.Nanosec = 0;
     maFPSRenderEndTime.Seconds = maFPSRenderEndTime.Nanosec = 0;
@@ -573,6 +575,8 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer
     sal_Int32 nSeriesIndex = 0;
     sal_Int32 nMaxPointCount = 0;
     double nMaxVal = findMaxValue(rDataSeriesContainer)/100;
+    const VDataSeries& rFirstRow = *(rDataSeriesContainer.begin());
+    mnBarsInRow = rFirstRow.getTotalPointCount();
     for (boost::ptr_vector<VDataSeries>::const_iterator itr = rDataSeriesContainer.begin(),
             itrEnd = rDataSeriesContainer.end(); itr != itrEnd; ++itr)
     {
@@ -767,7 +771,7 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer
         spawnRenderThread(new RenderBenchMarkThread(this));
     }
     miDataUpdateCounter++;
-    maHistoryCounter++;
+    mnHistoryCounter++;
     mbNeedsNewRender = true;
 }
 
@@ -1131,12 +1135,45 @@ void GL3DBarChart::recordBarHistory(sal_uInt32 &nBarID, float &nVal)
     aList.push_back(nVal);
 }
 
+void GL3DBarChart::getNeighborBarID(sal_uInt32 nSelectBarId, sal_uInt32 *pNeighborBarId)
+{
+    sal_uInt32 nSelectRow = (nSelectBarId - SHAPE_START_ID) / ID_STEP / (mnBarsInRow + 1);
+    for (sal_Int32 i = 0; i < DISPLAY_BARS_NUM; i++)
+    {
+        pNeighborBarId[i] = nSelectBarId + (i - DISPLAY_BARS_NUM / 2) * ID_STEP;
+        if (pNeighborBarId[i] == nSelectBarId)
+            continue;
+        if ((pNeighborBarId[i] - SHAPE_START_ID) / ID_STEP / (mnBarsInRow + 1) != nSelectRow)
+            pNeighborBarId[i] = 0;
+    }
+}
+
+void GL3DBarChart::addMovementScreenText(sal_uInt32 nBarId)
+{
+    if (nBarId == 0)
+        return;
+    std::map<sal_uInt32, const BarInformation>::const_iterator itr = maBarMap.find(nBarId);
+    if (itr == maBarMap.end())
+        return;
+    const BarInformation& rBarInfo = itr->second;
+    glm::vec3 aTextPos = glm::vec3(rBarInfo.maPos.x + BAR_SIZE_X / 2.0f,
+                                  rBarInfo.maPos.y + BAR_SIZE_Y / 2.0f,
+                                  rBarInfo.maPos.z);
+    OUString aBarValue = OUString("Value: ") + OUString::number(rBarInfo.mnVal);
+    maScreenTextShapes.push_back(new opengl3D::ScreenText(mpRenderer.get(), *mpTextCache, aBarValue, glm::vec4(0.0f, 0.0f, 1.0f, 0.0f), CALC_POS_EVENT_ID));
+    const opengl3D::TextCacheItem& rTextCache = mpTextCache->getText(aBarValue);
+    float nRectWidth = (float)rTextCache.maSize.Width() / (float)rTextCache.maSize.Height() * 0.03;
+    opengl3D::ScreenText* pScreenText = static_cast<opengl3D::ScreenText*>(&maScreenTextShapes.back());
+    pScreenText->setPosition(glm::vec2(-nRectWidth / 2, 0.03f), glm::vec2(nRectWidth / 2, -0.03f), aTextPos);
+}
+
 void GL3DBarChart::updateClickEvent()
 {
     if (maRenderEvent == EVENT_CLICK || maRenderEvent == EVENT_AUTO_FLY || maRenderEvent == EVENT_SHOW_SELECT)
     {
         std::list<float>& aList = maBarHistory[mnSelectBarId];
         sal_uInt32 nIdex = 0;
+        sal_uInt32 nBarIdArray[DISPLAY_BARS_NUM] = {0};
         OUString aTitle;
         OUString aBarValue;
         float nXCoordStart, nYCoordStart, nTextWidth, nMaxXCoord = 0.0f, nMinXCoord = 1.0f, nMaxHight = 0.0f;
@@ -1159,25 +1196,12 @@ void GL3DBarChart::updateClickEvent()
             nTextWidth = addScreenTextShape(aTitle, glm::vec2(0.55f, 0.99f), 0.07f, true, glm::vec4(0.0f, 1.0f, 1.0f, 0.5f));
             nMaxXCoord = std::max(nMaxXCoord, 0.55f + nTextWidth);
         }
+        getNeighborBarID(mnSelectBarId, nBarIdArray);
         for (std::list<float>::iterator it = aList.begin();it != aList.end();++it)
         {
-            if (nIdex + 1 == aList.size())
+            if (nIdex + 1 < aList.size())
             {
-                aBarValue = OUString("Value: ") + OUString::number(*it);
-                maScreenTextShapes.push_back(new opengl3D::ScreenText(mpRenderer.get(), *mpTextCache, aBarValue, glm::vec4(0.0f, 0.0f, 1.0f, 0.0f), CALC_POS_EVENT_ID));
-                const opengl3D::TextCacheItem& rTextCache = mpTextCache->getText(aBarValue);
-                float nRectWidth = (float)rTextCache.maSize.Width() / (float)rTextCache.maSize.Height() * 0.03;
-                std::map<sal_uInt32, const BarInformation>::const_iterator itr = maBarMap.find(mnSelectBarId);
-                const BarInformation& rBarInfo = itr->second;
-                glm::vec3 aTextPos = glm::vec3(rBarInfo.maPos.x + BAR_SIZE_X / 2.0f,
-                                              rBarInfo.maPos.y + BAR_SIZE_Y / 2.0f,
-                                              rBarInfo.maPos.z);
-                opengl3D::ScreenText* pScreenText = static_cast<opengl3D::ScreenText*>(&maScreenTextShapes.back());
-                pScreenText->setPosition(glm::vec2(-nRectWidth / 2, 0.03f), glm::vec2(nRectWidth / 2, -0.03f), aTextPos);
-            }
-            else
-            {
-                aTitle = OUString("[Time:") + OUString::number((maHistoryCounter - aList.size() + nIdex)) + "]: ";
+                aTitle = OUString("[Time:") + OUString::number((mnHistoryCounter - aList.size() + nIdex)) + "]: ";
                 if (nIdex == 0)
                 {
                     aTitle = OUString("Most Recent") + aTitle;
@@ -1201,6 +1225,10 @@ void GL3DBarChart::updateClickEvent()
             }
             nIdex++;
         }
+        for (sal_uInt32 i = 0; i < DISPLAY_BARS_NUM; i++)
+        {
+            addMovementScreenText(nBarIdArray[i]);
+        }
         //add translucent back ground
         aTitle = OUString(" ");
         maScreenTextShapes.push_back(new opengl3D::ScreenText(mpRenderer.get(), *mpTextCache, aTitle, glm::vec4(0.0f, 0.0f, 0.0f, 0.5f), 0));
diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx
index 7affc4b..bebca58 100644
--- a/chart2/source/view/inc/GL3DBarChart.hxx
+++ b/chart2/source/view/inc/GL3DBarChart.hxx
@@ -116,6 +116,8 @@ private:
     void getNearestBars(std::vector<sal_uInt32> &vectorNearest);
     void updateScroll();
     void processAutoFly(sal_uInt32 nId, sal_uInt32 nColor);
+    void getNeighborBarID(sal_uInt32 nSelectBarId, sal_uInt32 *pNeighborBarId);
+    void addMovementScreenText(sal_uInt32 nBarId);
     css::uno::Reference<css::chart2::XChartType> mxChartType;
     boost::ptr_vector<opengl3D::Renderable3DObject> maShapes;
 
@@ -188,7 +190,8 @@ private:
     std::map<sal_uInt32, sal_uInt32> maBarColorMap;
     int mnColorRate;
     bool mbBenchMarkMode;
-    sal_uInt32 maHistoryCounter;
+    sal_uInt32 mnHistoryCounter;
+    sal_uInt32 mnBarsInRow;
 
 
     // these form a pair:


More information about the Libreoffice-commits mailing list