Files
maszyna/uiwidgets.cpp

105 lines
3.5 KiB
C++

/*
This Source Code Form is subject to the
terms of the Mozilla Public License, v.
2.0. If a copy of the MPL was not
distributed with this file, You can
obtain one at
http://mozilla.org/MPL/2.0/.
*/
#include "stdafx.h"
#include "uiwidgets.h"
#include "imgui_impl_glfw.h"
#ifdef EU07_USEIMGUIIMPLOPENGL2
#include "imgui_impl_opengl2.h"
#else
#include "imgui_impl_opengl3.h"
#endif
// by zfedoran, https://github.com/ocornut/imgui/issues/1901
namespace ImGui {
bool BufferingBar( const char* label, float value, const ImVec2& size_arg, const ImU32& bg_col, const ImU32& fg_col ) {
ImGuiWindow* window = GetCurrentWindow();
if( window->SkipItems )
return false;
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
const ImGuiID id = window->GetID( label );
ImVec2 pos = window->DC.CursorPos;
ImVec2 size = size_arg;
size.x -= style.FramePadding.x * 2;
const ImRect bb( pos, ImVec2( pos.x + size.x, pos.y + size.y ) );
ItemSize( bb, style.FramePadding.y );
if( !ItemAdd( bb, id ) )
return false;
// Render
const float circleStart = size.x * 0.7f;
const float circleEnd = size.x;
const float circleWidth = circleEnd - circleStart;
window->DrawList->AddRectFilled( bb.Min, ImVec2( pos.x + circleStart, bb.Max.y ), bg_col );
window->DrawList->AddRectFilled( bb.Min, ImVec2( pos.x + circleStart * value, bb.Max.y ), fg_col );
const float t = g.Time;
const float r = size.y / 2;
const float speed = 1.5f;
const float a = speed * 0;
const float b = speed * 0.333f;
const float c = speed * 0.666f;
const float o1 = ( circleWidth + r ) * ( t + a - speed * (int)( ( t + a ) / speed ) ) / speed;
const float o2 = ( circleWidth + r ) * ( t + b - speed * (int)( ( t + b ) / speed ) ) / speed;
const float o3 = ( circleWidth + r ) * ( t + c - speed * (int)( ( t + c ) / speed ) ) / speed;
window->DrawList->AddCircleFilled( ImVec2( pos.x + circleEnd - o1, bb.Min.y + r ), r, bg_col );
window->DrawList->AddCircleFilled( ImVec2( pos.x + circleEnd - o2, bb.Min.y + r ), r, bg_col );
window->DrawList->AddCircleFilled( ImVec2( pos.x + circleEnd - o3, bb.Min.y + r ), r, bg_col );
}
bool Spinner( const char* label, float radius, int thickness, const ImU32& color ) {
ImGuiWindow* window = GetCurrentWindow();
if( window->SkipItems )
return false;
ImGuiContext& g = *GImGui;
const ImGuiStyle& style = g.Style;
const ImGuiID id = window->GetID( label );
ImVec2 pos = window->DC.CursorPos;
ImVec2 size( ( radius ) * 2, ( radius + style.FramePadding.y ) * 2 );
const ImRect bb( pos, ImVec2( pos.x + size.x, pos.y + size.y ) );
ItemSize( bb, style.FramePadding.y );
if( !ItemAdd( bb, id ) )
return false;
// Render
window->DrawList->PathClear();
int num_segments = 30;
int start = abs( ImSin( g.Time*1.8f )*( num_segments - 5 ) );
const float a_min = IM_PI * 2.0f * ( (float)start ) / (float)num_segments;
const float a_max = IM_PI * 2.0f * ( (float)num_segments - 3 ) / (float)num_segments;
const ImVec2 centre = ImVec2( pos.x + radius, pos.y + radius + style.FramePadding.y );
for( int i = 0; i < num_segments; i++ ) {
const float a = a_min + ( (float)i / (float)num_segments ) * ( a_max - a_min );
window->DrawList->PathLineTo( ImVec2( centre.x + ImCos( a + g.Time * 8 ) * radius,
centre.y + ImSin( a + g.Time * 8 ) * radius ) );
}
window->DrawList->PathStroke( color, false, thickness );
}
} // namespace ImGui