Change active tracing to use correct glyph instead of dot (#890)

* Change active tracing to use correct glyph instead of dot

* make the pointer on the glyph line up correctly
This commit is contained in:
Eric Wong 2020-01-03 12:08:02 -08:00 committed by GitHub
parent 3b916dcec3
commit 234ac8deb3
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
11 changed files with 32 additions and 133 deletions

View File

@ -424,6 +424,18 @@
</Button>
</StackPanel>
</Border>
<Border x:Name="TracePointer"
Width="16"
Height="18"
Margin="48,50,0,0"
HorizontalAlignment="Left"
VerticalAlignment="Top"
Visibility="Collapsed">
<FontIcon Foreground="Red"
FontFamily="{StaticResource CalculatorFontFamily}"
FontSize="18"
Glyph="&#xE3B3;"/>
</Border>
<Border MinWidth="36"
Margin="0,0,12,12"
HorizontalAlignment="Right"

View File

@ -67,6 +67,9 @@ GraphingCalculator::GraphingCalculator()
// And when the actual trace value changes
GraphingControl->TracingValueChangedEvent += ref new TracingValueChangedEventHandler(this, &GraphingCalculator::OnTracePointChanged);
// Update where the pointer value is (ie: where the user cursor from keyboard inputs moves the point to)
GraphingControl->PointerValueChangedEvent += ref new PointerValueChangedEventHandler(this, &GraphingCalculator::OnPointerPointChanged);
// OemMinus and OemAdd aren't declared in the VirtualKey enum, we can't add this accelerator XAML-side
auto virtualKey = ref new KeyboardAccelerator();
virtualKey->Key = (VirtualKey)187; //OemMinus key
@ -177,6 +180,13 @@ void GraphingCalculator::OnTracePointChanged(Windows::Foundation::Point newPoint
PositionGraphPopup();
}
void CalculatorApp::GraphingCalculator::OnPointerPointChanged(Windows::Foundation::Point newPoint)
{
// Move the pointer glyph to where it is supposed to be.
// because the glyph is centered and has some spacing, to get the point to properly line up with the glyph, move the x point over 2 px
TracePointer->Margin = Thickness(newPoint.X - 2, newPoint.Y, 0, 0);
}
GraphingCalculatorViewModel ^ GraphingCalculator::ViewModel::get()
{
return m_viewModel;
@ -479,6 +489,8 @@ void CalculatorApp::GraphingCalculator::ActiveTracing_Checked(Platform::Object ^
this, &CalculatorApp::GraphingCalculator::ActiveTracing_KeyUp);
KeyboardShortcutManager::IgnoreEscape(false);
TracePointer->Visibility = ::Visibility::Visible;
}
void CalculatorApp::GraphingCalculator::ActiveTracing_Unchecked(Platform::Object ^ sender, Windows::UI::Xaml::RoutedEventArgs ^ e)
@ -495,6 +507,8 @@ void CalculatorApp::GraphingCalculator::ActiveTracing_Unchecked(Platform::Object
m_activeTracingKeyUpToken.Value = 0;
}
KeyboardShortcutManager::HonorEscape();
TracePointer->Visibility = ::Visibility::Collapsed;
}
void CalculatorApp::GraphingCalculator::ActiveTracing_KeyUp(Windows::UI::Core::CoreWindow ^ sender, Windows::UI::Core::KeyEventArgs ^ args)

View File

@ -55,6 +55,7 @@ public ref class GraphingCalculator sealed : public Windows::UI::Xaml::Data::INo
void OnShowTracePopupChanged(bool newValue);
void OnTracePointChanged(Windows::Foundation::Point newPoint);
void OnPointerPointChanged(Windows::Foundation::Point newPoint);
private:
void OnDataRequested(
Windows::ApplicationModel::DataTransfer::DataTransferManager ^ sender,

View File

@ -844,6 +844,7 @@ void Grapher::HandleTracingMovementTick(Object ^ sender, Object ^ e)
else
{
ActiveTraceCursorPosition = curPos;
PointerValueChangedEvent(curPos);
}
}

View File

@ -20,6 +20,8 @@ public
public
delegate void TracingValueChangedEventHandler(Windows::Foundation::Point value);
public
delegate void PointerValueChangedEventHandler(Windows::Foundation::Point value);
[Windows::UI::Xaml::Markup::ContentPropertyAttribute(Name = L"Equations")] public ref class Grapher sealed
: public Windows::UI::Xaml::Controls::Control,
@ -27,6 +29,7 @@ public
{
public:
event TracingValueChangedEventHandler ^ TracingValueChangedEvent;
event PointerValueChangedEventHandler ^ PointerValueChangedEvent;
event TracingChangedEventHandler ^ TracingChangedEvent;
virtual event Windows::UI::Xaml::Data::PropertyChangedEventHandler ^ PropertyChanged;

View File

@ -1,81 +0,0 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#include "pch.h"
#include "ActiveTracingPointRenderer.h"
#include "DirectXHelper.h"
using namespace D2D1;
using namespace GraphControl::DX;
using namespace std;
using namespace Windows::Foundation;
namespace
{
const ColorF c_DefaultPointColor = ColorF::Red;
constexpr float c_ActiveTracingPointRadius = 2;
}
ActiveTracingPointRenderer::ActiveTracingPointRenderer(DeviceResources* deviceResources)
: m_deviceResources{ deviceResources }
, m_color{ c_DefaultPointColor }
{
m_RoundedRect.rect.bottom = 0;
m_RoundedRect.rect.left = 0;
m_RoundedRect.rect.right = 10;
m_RoundedRect.rect.top = 10;
m_width = (int)(m_RoundedRect.rect.right - m_RoundedRect.rect.left);
m_height = (int)(m_RoundedRect.rect.top - m_RoundedRect.rect.bottom);
m_RoundedRect.radiusX = c_ActiveTracingPointRadius;
m_RoundedRect.radiusY = c_ActiveTracingPointRadius;
CreateDeviceDependentResources();
}
void ActiveTracingPointRenderer::CreateDeviceDependentResources()
{
CreateBrush();
}
void ActiveTracingPointRenderer::ReleaseDeviceDependentResources()
{
m_brush.Reset();
}
void ActiveTracingPointRenderer::Render(const Point& location)
{
// We want to center this around the location
if (ID2D1DeviceContext* context = m_deviceResources->GetD2DDeviceContext())
{
m_RoundedRect.rect.bottom = location.Y - m_height / 2;
m_RoundedRect.rect.left = location.X - m_width / 2;
m_RoundedRect.rect.top = m_RoundedRect.rect.bottom + m_height;
m_RoundedRect.rect.right = m_RoundedRect.rect.left + m_width;
context->BeginDraw();
context->FillRoundedRectangle(m_RoundedRect, m_brush.Get());
// Ignore D2DERR_RECREATE_TARGET here. This error indicates that the device
// is lost. It will be handled during the next call to Present.
HRESULT hr = context->EndDraw();
if (hr != D2DERR_RECREATE_TARGET)
{
ThrowIfFailed(hr);
}
}
}
void ActiveTracingPointRenderer::SetColor(const ColorF& color)
{
m_color = color;
CreateBrush();
}
void ActiveTracingPointRenderer::CreateBrush()
{
m_brush.Reset();
ThrowIfFailed(
m_deviceResources->GetD2DDeviceContext()->CreateSolidColorBrush(m_color, &m_brush)
);
}

View File

@ -1,35 +0,0 @@
// Copyright (c) Microsoft Corporation. All rights reserved.
// Licensed under the MIT License.
#pragma once
namespace GraphControl::DX
{
class DeviceResources;
class ActiveTracingPointRenderer
{
public:
ActiveTracingPointRenderer(DeviceResources* deviceResources);
void CreateDeviceDependentResources();
void ReleaseDeviceDependentResources();
void Render(const Windows::Foundation::Point& location);
void SetColor(const D2D1::ColorF& color);
private:
void CreateBrush();
private:
DeviceResources* const m_deviceResources;
D2D1::ColorF m_color;
D2D1_ROUNDED_RECT m_RoundedRect;
int m_width;
int m_height;
// Resources related to rendering.
Microsoft::WRL::ComPtr<ID2D1SolidColorBrush> m_brush;
};
}

View File

@ -37,7 +37,6 @@ namespace GraphControl::DX
, m_TraceValue(Point(0, 0))
, m_TraceLocation(Point(0, 0))
, m_Tracing(false)
, m_ActiveTracingPointRenderer{ &m_deviceResources }
{
// Register to be notified if the Device is lost or recreated
m_deviceResources.RegisterDeviceNotify(this);
@ -177,8 +176,6 @@ namespace GraphControl::DX
{
// Active tracing takes over for draw nearest point input from the mouse pointer.
trackPoint = m_activeTracingPointerLocation;
m_ActiveTracingPointRenderer.Render(m_activeTracingPointerLocation);
}
int formulaId;

View File

@ -7,7 +7,6 @@
#include "DeviceResources.h"
#include "NearestPointRenderer.h"
#include "ActiveTracingPointRenderer.h"
#include "IGraph.h"
// Renders Direct2D and 3D content on the screen.
@ -67,7 +66,6 @@ namespace GraphControl::DX
if (m_activeTracingPointerLocation != newValue)
{
m_activeTracingPointerLocation = newValue;
m_ActiveTracingPointRenderer.Render(m_activeTracingPointerLocation);
RunRenderPass();
}
}
@ -123,7 +121,6 @@ namespace GraphControl::DX
private:
DX::DeviceResources m_deviceResources;
NearestPointRenderer m_nearestPointRenderer;
ActiveTracingPointRenderer m_ActiveTracingPointRenderer;
// Cached Graph object with Renderer property.
std::shared_ptr<Graphing::IGraph> m_graph = nullptr;

View File

@ -285,7 +285,6 @@
</ItemDefinitionGroup>
<ItemGroup>
<ClInclude Include="Control\Grapher.h" />
<ClInclude Include="DirectX\ActiveTracingPointRenderer.h" />
<ClInclude Include="DirectX\DeviceResources.h" />
<ClInclude Include="DirectX\DirectXHelper.h" />
<ClInclude Include="DirectX\NearestPointRenderer.h" />
@ -299,7 +298,6 @@
</ItemGroup>
<ItemGroup>
<ClCompile Include="Control\Grapher.cpp" />
<ClCompile Include="DirectX\ActiveTracingPointRenderer.cpp" />
<ClCompile Include="DirectX\DeviceResources.cpp" />
<ClCompile Include="DirectX\NearestPointRenderer.cpp" />
<ClCompile Include="DirectX\RenderMain.cpp" />

View File

@ -28,9 +28,6 @@
<ClCompile Include="DirectX\NearestPointRenderer.cpp">
<Filter>DirectX</Filter>
</ClCompile>
<ClCompile Include="DirectX\ActiveTracingPointRenderer.cpp">
<Filter>DirectX</Filter>
</ClCompile>
<ClCompile Include="Models\KeyGraphFeaturesInfo.cpp" />
<ClCompile Include="Models\Equation.cpp">
<Filter>Models</Filter>
@ -54,9 +51,6 @@
<ClInclude Include="DirectX\NearestPointRenderer.h">
<Filter>DirectX</Filter>
</ClInclude>
<ClInclude Include="DirectX\ActiveTracingPointRenderer.h">
<Filter>DirectX</Filter>
</ClInclude>
<ClInclude Include="Utils.h" />
<ClInclude Include="Models\KeyGraphFeaturesInfo.h" />
<ClInclude Include="Models\Equation.h">
@ -77,7 +71,5 @@
<ItemGroup>
<CopyFileToFolders Include="$(GraphingImplDll)" />
<CopyFileToFolders Include="$(GraphingEngineDll)" />
<CopyFileToFolders Include="$(GraphingImplDll)" />
<CopyFileToFolders Include="$(GraphingEngineDll)" />
</ItemGroup>
</Project>