diff options
author | crupest <crupest@outlook.com> | 2018-11-10 15:53:32 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2018-11-10 15:53:32 +0800 |
commit | 8d5a08e8d054e9504ca31e0bfbfff7a1018c23c0 (patch) | |
tree | fdd8ac836b266044de380fea26e8f5fc80a5d9d9 /src/ui/ui_manager.cpp | |
parent | ac4b0f8d438e7a7c2ecd836af8332b5da1e035c9 (diff) | |
download | cru-8d5a08e8d054e9504ca31e0bfbfff7a1018c23c0.tar.gz cru-8d5a08e8d054e9504ca31e0bfbfff7a1018c23c0.tar.bz2 cru-8d5a08e8d054e9504ca31e0bfbfff7a1018c23c0.zip |
Refactor predefine resources. Add check for dead recursion in singletons in debug mode.
Diffstat (limited to 'src/ui/ui_manager.cpp')
-rw-r--r-- | src/ui/ui_manager.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/src/ui/ui_manager.cpp b/src/ui/ui_manager.cpp new file mode 100644 index 00000000..3918b2d5 --- /dev/null +++ b/src/ui/ui_manager.cpp @@ -0,0 +1,96 @@ +#include "ui_manager.hpp" + +#include "application.hpp" +#include "border_property.hpp" +#include "graph/graph.hpp" +#include "exception.hpp" + + +namespace cru::ui +{ + namespace + { + void GetSystemCaretInfo(CaretInfo* caret_info) + { + caret_info->caret_blink_duration = std::chrono::milliseconds(::GetCaretBlinkTime()); + DWORD caret_width; + if (!::SystemParametersInfoW(SPI_GETCARETWIDTH, 0 , &caret_width, 0)) + throw Win32Error(::GetLastError(), "Failed to get system caret width."); + caret_info->half_caret_width = caret_width / 2.0f; + } + + Microsoft::WRL::ComPtr<ID2D1Brush> CreateSolidBrush(graph::GraphManager* graph_manager, const D2D1_COLOR_F& color) + { + const auto device_context = graph_manager->GetD2D1DeviceContext(); + Microsoft::WRL::ComPtr<ID2D1SolidColorBrush> solid_color_brush; + device_context->CreateSolidColorBrush(color, &solid_color_brush); + return solid_color_brush; + } + + Microsoft::WRL::ComPtr<IDWriteTextFormat> CreateDefaultTextFormat(graph::GraphManager* graph_manager) + { + const auto dwrite_factory = graph_manager->GetDWriteFactory(); + + Microsoft::WRL::ComPtr<IDWriteTextFormat> text_format; + + ThrowIfFailed(dwrite_factory->CreateTextFormat( + L"等线", nullptr, + DWRITE_FONT_WEIGHT_NORMAL, + DWRITE_FONT_STYLE_NORMAL, + DWRITE_FONT_STRETCH_NORMAL, + 24.0, L"zh-cn", + &text_format + )); + + ThrowIfFailed(text_format->SetTextAlignment(DWRITE_TEXT_ALIGNMENT_CENTER)); + ThrowIfFailed(text_format->SetParagraphAlignment(DWRITE_PARAGRAPH_ALIGNMENT_CENTER)); + + return text_format; + } + } + + + //!!! never use default constructor of border at here, because it will recursively call this method! + PredefineResources::PredefineResources(graph::GraphManager* graph_manager) : + border_property_brush{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::Black))}, + + button_normal_border{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::RoyalBlue)), 2, 6, 6}, + button_press_border{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::Blue)), 2, 6, 6}, + + text_control_selection_brush{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::LightSkyBlue))}, + + text_box_border{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::Black))}, + text_box_text_brush{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::Black))}, + text_box_text_format{CreateDefaultTextFormat(graph_manager)}, + text_box_caret_brush{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::Black))}, + + text_block_text_brush{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::Black))}, + text_block_text_format{CreateDefaultTextFormat(graph_manager)}, + + toggle_button_on_brush{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::DeepSkyBlue))}, + toggle_button_off_brush{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::LightGray))} + +#ifdef CRU_DEBUG_LAYOUT + , + debug_layout_out_border_brush{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::Crimson))}, + debug_layout_margin_brush{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::LightCoral, 0.25f))}, + debug_layout_padding_brush{CreateSolidBrush(graph_manager, D2D1::ColorF(D2D1::ColorF::SkyBlue, 0.25f))} +#endif + { + + } + + UiManager* UiManager::GetInstance() + { + return Application::GetInstance()->ResolveSingleton<UiManager>([](auto) + { + return new UiManager{}; + }); + } + + UiManager::UiManager() + : predefine_resources_(graph::GraphManager::GetInstance()) + { + GetSystemCaretInfo(&caret_info_); + } +} |