Files
EzUI/sources/ProgressBar.cpp

118 lines
3.3 KiB
C++
Raw Normal View History

2026-01-24 22:42:46 +08:00
#include "ProgressBar.h"
namespace ezui {
ProgressBar::ProgressBar(Object* parentObject) : Control(parentObject) {
// 设置默认大小
SetFixedSize(Size(200, 25));
}
ProgressBar::~ProgressBar() {
}
void ProgressBar::SetProgress(float progress) {
// 限制进度值在 0.0f - 1.0f 范围内
float newProgress = (((0.0f) > ((((1.0f) < (progress)) ? (1.0f) : (progress)))) ? (0.0f) : ((((1.0f) < (progress)) ? (1.0f) : (progress))));
if (m_progress != newProgress) {
m_progress = newProgress;
Invalidate(); // 触发重绘
}
}
float ProgressBar::GetProgress() const {
return m_progress;
}
void ProgressBar::SetProgressColor(const Color& color) {
if (m_progressColor.GetValue() != color.GetValue()) {
m_progressColor = color;
Invalidate(); // 触发重绘
}
}
Color ProgressBar::GetProgressColor() const {
return m_progressColor;
}
void ProgressBar::SetBackgroundColor(const Color& color) {
if (m_backgroundColor.GetValue() != color.GetValue()) {
m_backgroundColor = color;
Invalidate(); // 触发重绘
}
}
Color ProgressBar::GetBackgroundColor() const {
return m_backgroundColor;
}
void ProgressBar::SetAttribute(const UIString& attrName, const UIString& attrValue) {
if (attrName == "progress") {
// 设置进度值,支持百分比和小数
float progress = 0.0f;
if (attrValue.find("%") != UIString::npos) {
// 百分比格式,如 "50%"
progress = std::atof(attrValue.substr(0, attrValue.length() - 1).c_str()) / 100.0f;
} else {
// 小数格式,如 "0.5"
progress = std::atof(attrValue.c_str());
}
SetProgress(progress);
} else if (attrName == "progress-color") {
// 设置进度条颜色
bool isGood = false;
Color color = Color::Make(attrValue, &isGood);
if (isGood) {
SetProgressColor(color);
}
} else {
// 调用基类方法处理其他属性
Control::SetAttribute(attrName, attrValue);
}
}
bool ProgressBar::ApplyStyleProperty(const UIString& key, const UIString& value) {
if (key == "progress") {
// CSS 样式中的进度设置
SetAttribute("progress", value);
return true;
} else if (key == "progress-color") {
// CSS 样式中的进度条颜色设置
SetAttribute("progress-color", value);
return true;
} else if (key == "background-color") {
// 背景颜色
bool isGood = false;
Color color = Color::Make(value, &isGood);
if (isGood) {
SetBackgroundColor(color);
return true;
}
}
// 调用基类方法处理其他样式
return Control::ApplyStyleProperty(key, value);
}
void ProgressBar::OnPaint(PaintEventArgs& args) {
// 获取控件矩形
RectF rect(0, 0, (float)Width(), (float)Height());
// 绘制背景
args.Graphics.SetColor(m_backgroundColor);
args.Graphics.FillRectangle(rect);
// 绘制进度
if (m_progress > 0.0f) {
args.Graphics.SetColor(m_progressColor);
float progressWidth = rect.Width * m_progress;
RectF progressRect(0, 0, progressWidth, rect.Height);
args.Graphics.FillRectangle(progressRect);
}
// 绘制边框(如果有设置)
Border border = GetStyle(State).Border;
if (border.Style != StrokeStyle::None && (border.Left > 0 || border.Top > 0 || border.Right > 0 || border.Bottom > 0)) {
OnBorderPaint(args, border);
}
}
}