fix: 修正滑块填充残留、数值内联输入与信号/分组重命名,拖拽虚影跟随鼠标
- 滑块最小值时不再有超出圆钮的填充残留,三处滑块统一为共享实现 - 透明度/RGB/色号支持点击或双击直接输入,整段高亮、首次键入替换、回车提交、Ctrl+C 复制 - 双击信号行或分组名进入重命名编辑;分组竖线改为绘制而非字符 - 拖拽信号时曲线虚影跟随鼠标纵向位移 - 数据层新增展示名覆盖,面板改为持有可写数据集合
This commit is contained in:
1 parent
542aa51e40
commit
261b8ac07d
13 files changed
+1074
-274
No files matched your search
@@ -99,12 +99,25 @@ namespace jdi
|
||||
bool OnLButtonUp();
|
||||
|
||||
/**
|
||||
* @brief 处理键盘按键(Esc 收起)。
|
||||
* @brief 处理键盘按键(Esc 收起、回车提交输入)。
|
||||
* @param [IN] key 虚拟键码。
|
||||
* @return 事件已被消费返回 true。
|
||||
*/
|
||||
bool OnKeyDown(WPARAM key);
|
||||
|
||||
/**
|
||||
* @brief 处理字符输入。
|
||||
* @param [IN] character 输入字符('\r' 提交、'\b' 退格、0x03 复制)。
|
||||
* @return 界面状态发生变化返回 true。
|
||||
*/
|
||||
bool OnChar(wchar_t character);
|
||||
|
||||
/**
|
||||
* @brief 判断面板是否处于内联文本输入状态。
|
||||
* @return 正在输入返回 true。
|
||||
*/
|
||||
bool IsEditing() const { return m_editField != EditField::NONE; }
|
||||
|
||||
/**
|
||||
* @brief 判断坐标是否落在拾色面板内部。
|
||||
* @param [IN] x 客户区横坐标。
|
||||
@@ -122,6 +135,18 @@ namespace jdi
|
||||
HCURSOR QueryCursor(int x, int y) const;
|
||||
|
||||
private:
|
||||
/**
|
||||
* @brief 面板内可进行内联文本输入的字段。
|
||||
*/
|
||||
enum class EditField : int
|
||||
{
|
||||
NONE = 0, /**< 未处于编辑状态。 */
|
||||
R = 1, /**< 红色分量(0-255)。 */
|
||||
G = 2, /**< 绿色分量(0-255)。 */
|
||||
B = 3, /**< 蓝色分量(0-255)。 */
|
||||
HEX = 4 /**< 十六进制色号。 */
|
||||
};
|
||||
|
||||
/**
|
||||
* @brief 依据锚点矩形与客户区计算面板矩形与内部控件矩形。
|
||||
* @param [IN] bounds 宿主客户区矩形。
|
||||
@@ -129,6 +154,26 @@ namespace jdi
|
||||
*/
|
||||
void BuildLayout(const gd::RectF& bounds, const gd::RectF& anchor);
|
||||
|
||||
/**
|
||||
* @brief 进入指定字段的内联输入状态。
|
||||
* @param [IN] field 目标字段。
|
||||
* @return 状态发生变化返回 true。
|
||||
*/
|
||||
bool BeginEdit(EditField field);
|
||||
|
||||
/**
|
||||
* @brief 结束内联输入状态。
|
||||
* @param [IN] commit 是否提交输入值。
|
||||
* @return 状态发生变化返回 true。
|
||||
*/
|
||||
bool EndEdit(bool commit);
|
||||
|
||||
/**
|
||||
* @brief 计算当前输入框的矩形。
|
||||
* @return 输入框矩形。
|
||||
*/
|
||||
gd::RectF EditFieldRect() const;
|
||||
|
||||
/**
|
||||
* @brief 查询坐标命中的滑块下标。
|
||||
* @param [IN] x 客户区横坐标。
|
||||
@@ -160,6 +205,10 @@ namespace jdi
|
||||
std::array<gd::RectF, 3> m_values; /**< 数值文本矩形。 */
|
||||
gd::RectF m_previewRect; /**< 预览色块矩形。 */
|
||||
gd::RectF m_hexRect; /**< 十六进制文本矩形。 */
|
||||
|
||||
EditField m_editField = EditField::NONE; /**< 当前处于输入状态的字段。 */
|
||||
bool m_editFresh = false; /**< 输入缓冲是否仍为初始值(首次键入应整体替换)。 */
|
||||
std::wstring m_editText; /**< 输入缓冲。 */
|
||||
};
|
||||
|
||||
} // namespace jdi
|
||||
|
||||
@@ -85,13 +85,20 @@ namespace jdi
|
||||
*/
|
||||
struct SignalData
|
||||
{
|
||||
std::wstring name; /**< 显示名称(已剥离 "[n]" 序号前缀)。 */
|
||||
std::wstring name; /**< 名称(取自文件列名,完全保留原样)。 */
|
||||
std::wstring displayName; /**< 用户重命名的显示名;为空时使用 name。 */
|
||||
std::wstring rawHeader; /**< 原始列名。 */
|
||||
std::wstring unit; /**< 从列名括号中提取的单位,可能为空。 */
|
||||
std::vector<double> values; /**< 采样值,缺失处为 NaN。 */
|
||||
double minValue = 0.0; /**< 有限采样值最小值。 */
|
||||
double maxValue = 0.0; /**< 有限采样值最大值。 */
|
||||
std::size_t finiteCount = 0; /**< 有限采样点数量。 */
|
||||
|
||||
/**
|
||||
* @brief 获取用于界面展示的名称。
|
||||
* @return 用户重命名后的显示名,未重命名时返回文件中的原始名称。
|
||||
*/
|
||||
const std::wstring& Title() const { return displayName.empty() ? name : displayName; }
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -99,14 +106,21 @@ namespace jdi
|
||||
*/
|
||||
struct DataFile
|
||||
{
|
||||
std::wstring filePath; /**< 文件完整路径。 */
|
||||
std::wstring filePath; /**< 文件完整路径(仅用于状态提示)。 */
|
||||
std::wstring fileName; /**< 文件名称。 */
|
||||
std::wstring displayName; /**< 用户重命名的分组名;为空时使用 fileName。 */
|
||||
std::wstring timeColumnName; /**< 时间列列名。 */
|
||||
std::vector<double> time; /**< 时间轴数值。 */
|
||||
std::vector<SignalData> signals; /**< 该文件包含的信号。 */
|
||||
double minTime = 0.0; /**< 时间轴最小值。 */
|
||||
double maxTime = 0.0; /**< 时间轴最大值。 */
|
||||
bool timeMonotonic = true; /**< 时间轴是否单调不减。 */
|
||||
|
||||
/**
|
||||
* @brief 获取用于界面展示的分组名。
|
||||
* @return 用户重命名后的显示名,未重命名时返回文件名。
|
||||
*/
|
||||
const std::wstring& Title() const { return displayName.empty() ? fileName : displayName; }
|
||||
};
|
||||
|
||||
/**
|
||||
@@ -168,6 +182,23 @@ namespace jdi
|
||||
*/
|
||||
const DataFile* FileAt(int fileIndex) const;
|
||||
|
||||
/**
|
||||
* @brief 修改某个信号在界面上的显示名称。
|
||||
* @param [IN] fileIndex 文件下标。
|
||||
* @param [IN] signalIndex 文件内信号下标。
|
||||
* @param [IN] name 新的显示名;传入空串表示恢复使用原始列名。
|
||||
* @return 修改成功返回 true。
|
||||
*/
|
||||
bool SetSignalDisplayName(int fileIndex, int signalIndex, const std::wstring& name);
|
||||
|
||||
/**
|
||||
* @brief 修改某个文件分组的显示名称。
|
||||
* @param [IN] fileIndex 文件下标。
|
||||
* @param [IN] name 新的分组名;传入空串表示恢复使用文件名。
|
||||
* @return 修改成功返回 true。
|
||||
*/
|
||||
bool SetFileDisplayName(int fileIndex, const std::wstring& name);
|
||||
|
||||
/**
|
||||
* @brief 解析信号引用。
|
||||
* @param [IN] ref 信号引用。
|
||||
|
||||
@@ -209,6 +209,34 @@ namespace jdi
|
||||
*/
|
||||
double UiSliderRatioFromX(const gd::RectF& trackRect, float x);
|
||||
|
||||
/**
|
||||
* @brief 绘制水平滑块(轨道 + 已填充部分 + 圆钮)。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] track 轨道矩形。
|
||||
* @param [IN] ratio 当前值比例(0-1)。
|
||||
* @param [IN] fillColor 已填充部分颜色。
|
||||
* @param [IN] active 是否处于悬停或拖拽状态(影响圆钮半径)。
|
||||
* @param [IN] scale DPI 缩放比例。
|
||||
*/
|
||||
void UiDrawSlider(gd::Graphics& g, const gd::RectF& track, double ratio, std::uint32_t fillColor,
|
||||
bool active, float scale);
|
||||
|
||||
/**
|
||||
* @brief 绘制内联数值输入框。
|
||||
*
|
||||
* 处于“首次输入整体替换”状态时以高亮底衬表示整段内容将被覆盖,
|
||||
* 交互观感与常见登录界面的账号/密码输入框一致;已在键入时显示插入符。
|
||||
*
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
* @param [IN] rect 输入框矩形。
|
||||
* @param [IN] text 当前文本(可为空)。
|
||||
* @param [IN] fresh 是否仍处于“首次输入整体替换”状态。
|
||||
* @param [IN] font 文本字体。
|
||||
* @param [IN] scale DPI 缩放比例。
|
||||
*/
|
||||
void UiDrawEditField(gd::Graphics& g, const gd::RectF& rect, const std::wstring& text, bool fresh,
|
||||
HFONT font, float scale);
|
||||
|
||||
/**
|
||||
* @brief 绘制一个带边框的复选框。
|
||||
* @param [IN,OUT] g 绘图上下文。
|
||||
|
||||
@@ -1,6 +1,8 @@
|
||||
#ifndef __UTF8_UTIL_HPP__
|
||||
#define __UTF8_UTIL_HPP__
|
||||
|
||||
#include <windows.h>
|
||||
|
||||
#include <cstddef>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
@@ -116,6 +118,14 @@ namespace jdi
|
||||
*/
|
||||
void BuildTicks(double minValue, double maxValue, double step, std::vector<double>& ticks);
|
||||
|
||||
/**
|
||||
* @brief 将文本复制到系统剪贴板。
|
||||
* @param [IN] owner 剪贴板所有者窗口句柄,允许为空。
|
||||
* @param [IN] text 待复制文本。
|
||||
* @return 复制成功返回 true。
|
||||
*/
|
||||
bool CopyTextToClipboard(HWND owner, const std::wstring& text);
|
||||
|
||||
} // namespace jdi
|
||||
|
||||
#endif // __UTF8_UTIL_HPP__
|
||||
Reference in new issue
Block a user