summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorxukai <xukai@multicorewareinc.com>2014-09-19 15:38:19 +0800
committerKohei Yoshida <libreoffice@kohei.us>2014-09-23 15:12:15 +0000
commit7f895dfbf5fb084d747e52db678d75e3273cd825 (patch)
tree936ae8d5f62f4aa4bc44f544125fbaae7f73cb6e
parent9d97b1a7b1c7f3258335513518c762bd16745f17 (diff)
update camera when bar is clicked
Change-Id: Icf397070d1b17a282a07e166d1387881b854b337 Reviewed-on: https://gerrit.libreoffice.org/11541 Reviewed-by: Kohei Yoshida <libreoffice@kohei.us> Tested-by: Kohei Yoshida <libreoffice@kohei.us>
-rw-r--r--chart2/source/view/charttypes/GL3DBarChart.cxx68
-rw-r--r--chart2/source/view/inc/GL3DBarChart.hxx5
2 files changed, 57 insertions, 16 deletions
diff --git a/chart2/source/view/charttypes/GL3DBarChart.cxx b/chart2/source/view/charttypes/GL3DBarChart.cxx
index cf05724299fc..5a05323bdb78 100644
--- a/chart2/source/view/charttypes/GL3DBarChart.cxx
+++ b/chart2/source/view/charttypes/GL3DBarChart.cxx
@@ -42,7 +42,7 @@ using namespace com::sun::star;
namespace chart {
const size_t STEPS = 200;
-
+const size_t STEPS_UPDATE = 100;
namespace {
const float TEXT_HEIGHT = 10.0f;
@@ -211,6 +211,7 @@ private:
void MoveCamera();
void MoveCameraToBar();
void MoveToBar();
+ void MoveToSelectedBar();
void MoveToDefault();
void MoveToCorner();
void ProcessScroll();
@@ -336,6 +337,36 @@ void RenderBenchMarkThread::MoveToBar()
MoveCameraToBar();
}
+void RenderBenchMarkThread::MoveToSelectedBar()
+{
+ mpChart->mnSelectBarId = mpChart->mnUpdateBarId;
+ std::map<sal_uInt32, const GL3DBarChart::BarInformation>::const_iterator itr = mpChart->maBarMap.find(mpChart->mnSelectBarId);
+ if(itr == mpChart->maBarMap.end())
+ {
+ mpChart->mnSelectBarId = mpChart->mnPreSelectBarId;
+ mpChart->maRenderEvent = mpChart->maPreRenderEvent;
+ mpChart->maClickCond.set();
+ return;
+ }
+ mpChart->mpRenderer->EndClick();
+ const GL3DBarChart::BarInformation& rBarInfo = itr->second;
+ mnStep = 0;
+ mnStepsTotal = STEPS_UPDATE;
+ maTargetPosition = rBarInfo.maPos;
+ maTargetPosition.z += 240;
+ maTargetPosition.x += BAR_SIZE_X / 2.0f;
+ maTargetDirection = rBarInfo.maPos;
+ maTargetDirection.x += BAR_SIZE_X / 2.0f;
+ maTargetDirection.y += BAR_SIZE_Y / 2.0f;
+ maTargetPosition.y = maTargetDirection.y - 240;
+ maMatrixStep = mpChart->mpRenderer->GetDiffOfTwoCameras( maTargetPosition, maTargetDirection)/((float)mnStepsTotal);
+ mpChart->maClickCond.set();
+ mbExecuting = true;
+ mbNeedFlyBack = false;
+ mpChart->mpRenderer->StartClick(mpChart->mnSelectBarId);
+ mpChart->maRenderEvent = EVENT_CLICK;
+}
+
void RenderBenchMarkThread::AutoMoveToBar()
{
if (!mbAutoFlyExecuting)
@@ -403,7 +434,11 @@ void RenderBenchMarkThread::ProcessClickFlyBack()
void RenderBenchMarkThread::ProcessMouseEvent()
{
ProcessClickFlyBack();
- if (mpChart->maRenderEvent == EVENT_CLICK)
+ if (mpChart->maRenderEvent == EVENT_SELECTBAR_UPDEDATE)
+ {
+ MoveToSelectedBar();
+ }
+ else if (mpChart->maRenderEvent == EVENT_CLICK)
{
MoveToBar();
}
@@ -495,7 +530,8 @@ GL3DBarChart::GL3DBarChart(
mbBenchMarkMode(false),
mnHistoryCounter(0),
mnBarsInRow(0),
- mbAutoFly(false)
+ mbAutoFly(false),
+ mnUpdateBarId(0)
{
maFPSRenderStartTime.Seconds = maFPSRenderStartTime.Nanosec = 0;
maFPSRenderEndTime.Seconds = maFPSRenderEndTime.Nanosec = 0;
@@ -573,18 +609,22 @@ void GL3DBarChart::create3DShapes(const boost::ptr_vector<VDataSeries>& rDataSer
{
SharedResourceAccess(maCond1, maCond2);
osl::MutexGuard aGuard(maMutex);
- mnPreSelectBarId = mnSelectBarId;
- mnSelectBarId -= 10;
- sal_uInt32 nSelectRow = (mnSelectBarId - SHAPE_START_ID) / ID_STEP / (mnBarsInRow + 1);
- sal_uInt32 nPreSelectRow = (mnPreSelectBarId - SHAPE_START_ID) / ID_STEP / (mnBarsInRow + 1);
- if(nSelectRow != nPreSelectRow)
- {
- mnSelectBarId = mnPreSelectBarId;
- }
- else
+ if(mnSelectBarId)
{
- mpRenderer->EndClick();
- mpRenderer->StartClick(mnSelectBarId);
+ int nSelectBarId = mnSelectBarId;
+ int nPreSelectBarId = nSelectBarId;
+ nSelectBarId -= 10;
+ sal_uInt32 nSelectRow = (nSelectBarId - SHAPE_START_ID) / ID_STEP / (mnBarsInRow + 1);
+ sal_uInt32 nPreSelectRow = (nPreSelectBarId - SHAPE_START_ID) / ID_STEP / (mnBarsInRow + 1);
+ if(nSelectRow == nPreSelectRow)
+ {
+ std::map<sal_uInt32, const GL3DBarChart::BarInformation>::const_iterator itr = maBarMap.find(nSelectBarId);
+ if((maRenderEvent == EVENT_CLICK || maRenderEvent == EVENT_SHOW_SELECT || maRenderEvent == EVENT_AUTO_FLY)&&(itr != maBarMap.end()))
+ {
+ mnUpdateBarId = nSelectBarId;
+ maRenderEvent = EVENT_SELECTBAR_UPDEDATE;
+ }
+ }
}
mpRenderer->ReleaseShapes();
// Each series of data flows from left to right, and multiple series are
diff --git a/chart2/source/view/inc/GL3DBarChart.hxx b/chart2/source/view/inc/GL3DBarChart.hxx
index 4ae2385fc397..30607e627d82 100644
--- a/chart2/source/view/inc/GL3DBarChart.hxx
+++ b/chart2/source/view/inc/GL3DBarChart.hxx
@@ -49,7 +49,8 @@ enum RenderEventType
EVENT_SHOW_SCROLL,
EVENT_SHOW_SELECT,
EVENT_AUTO_FLY,
- EVENT_DIE
+ EVENT_DIE,
+ EVENT_SELECTBAR_UPDEDATE
};
class RenderThread;
@@ -193,7 +194,7 @@ private:
sal_uInt32 mnHistoryCounter;
sal_uInt32 mnBarsInRow;
bool mbAutoFly;
-
+ sal_Int32 mnUpdateBarId;
// these form a pair:
// main thread sets condition 1 and waits until it can take the mutex