From 48a32c1bec23aa7e753a94ee16eab35362b4e85f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=9B=B7=E7=94=B5=E8=8A=BD=E8=A1=A3?= Date: Mon, 5 Oct 2026 15:43:44 -0400 Subject: [PATCH] WIP components (as built) --- PRD.md | 462 ------------------ TASKS.md | 47 -- candle_countdown.go | 15 +- candle_countdown_test.go | 41 ++ candlestick_chart.go | 61 ++- candlestick_chart_test.go | 1 - candlestick_paint.go | 23 +- chart_frame.go | 10 +- chart_sync.go | 56 ++- chart_sync_test.go | 54 ++ chart_type_switcher.go | 4 +- chart_type_switcher_test.go | 41 ++ compare_symbol_test.go | 71 +++ depth_chart.go | 30 +- docs/components/141-candlestick-chart.md | 42 ++ docs/components/142-ohlc-chart.md | 42 ++ docs/components/143-heikin-ashi-chart.md | 43 ++ docs/components/144-line-quote-chart.md | 37 ++ docs/components/145-volume-chart.md | 42 ++ docs/components/146-depth-chart.md | 37 ++ docs/components/147-volume-profile.md | 36 ++ docs/components/148-multi-chart-layout.md | 38 ++ docs/components/149-chart-sync.md | 44 ++ docs/components/150-time-range-selector.md | 36 ++ docs/components/151-interval-selector.md | 37 ++ docs/components/152-chart-type-switcher.md | 36 ++ docs/components/153-indicator-overlay.md | 43 ++ docs/components/154-indicator-pane.md | 43 ++ docs/components/155-indicator-selector.md | 37 ++ docs/components/156-drawing-tools.md | 43 ++ docs/components/157-drawing-toolbar.md | 36 ++ docs/components/158-compare-symbol.md | 44 ++ docs/components/159-price-alert-line.md | 47 ++ docs/components/160-candle-countdown.md | 35 ++ docs/prd/ext-1.md | 232 --------- docs/prd/ext-2.md | 155 ------ docs/prd/ext-3.md | 130 ----- drawing_toolbar.go | 13 +- drawing_toolbar_test.go | 41 ++ drawing_tools.go | 68 +-- drawing_tools_paint.go | 12 +- drawing_tools_test.go | 101 ++++ example_mktchart_test.go | 265 ++++++++++ examples/gallery/pages_mktchart.go | 27 +- examples/gallery/pages_mktchart_code.go | 219 +++++++++ examples/gallery/pages_mktchart_demo.go | 214 ++++++++ examples/gallery/pages_mktchart_state.go | 98 ++++ examples/gallery/pages_mktchart_test.go | 75 +++ heikin_ashi_chart_test.go | 58 +++ indicator_overlay.go | 34 +- indicator_overlay_test.go | 95 ++++ indicator_pane.go | 72 ++- indicator_selector.go | 4 +- indicator_selector_test.go | 77 +++ indicators.go | 18 +- indicators_test.go | 7 +- interval_selector.go | 4 +- interval_selector_test.go | 61 +++ line_quote_chart.go | 46 +- market_boundary_test.go | 68 +++ market_data.go | 28 +- market_input.go | 46 +- market_keyboard_test.go | 54 ++ market_large_test.go | 49 ++ market_layers.go | 63 ++- market_regression_test.go | 89 ++++ market_review_regression_test.go | 192 ++++++++ market_states_test.go | 115 +++++ messages_mktchart.go | 8 +- multi_chart_layout.go | 20 +- multi_chart_layout_test.go | 64 +++ ohlc_chart_test.go | 44 ++ overlay_layers.go | 14 +- price_alert_line_test.go | 56 +++ .../darwin/candle_countdown-dark.png | Bin 0 -> 1427 bytes .../darwin/candle_countdown-light.png | Bin 0 -> 1351 bytes testdata/snapshots/darwin/chart_sync-dark.png | Bin 0 -> 16916 bytes .../snapshots/darwin/chart_sync-light.png | Bin 0 -> 16341 bytes .../darwin/chart_type_switcher-dark.png | Bin 0 -> 5599 bytes .../darwin/chart_type_switcher-light.png | Bin 0 -> 5419 bytes .../snapshots/darwin/compare_symbol-dark.png | Bin 0 -> 36372 bytes .../snapshots/darwin/compare_symbol-light.png | Bin 0 -> 35339 bytes .../snapshots/darwin/drawing_toolbar-dark.png | Bin 0 -> 2848 bytes .../darwin/drawing_toolbar-light.png | Bin 0 -> 2865 bytes .../snapshots/darwin/drawing_tools-dark.png | Bin 0 -> 17429 bytes .../snapshots/darwin/drawing_tools-light.png | Bin 0 -> 16996 bytes .../darwin/heikin_ashi_chart-dark.png | Bin 0 -> 17974 bytes .../darwin/heikin_ashi_chart-light.png | Bin 0 -> 17356 bytes .../darwin/indicator_overlay-dark.png | Bin 0 -> 46361 bytes .../darwin/indicator_overlay-light.png | Bin 0 -> 45208 bytes .../snapshots/darwin/indicator_pane-dark.png | Bin 34670 -> 36872 bytes .../snapshots/darwin/indicator_pane-light.png | Bin 33684 -> 35839 bytes .../darwin/indicator_selector-dark.png | Bin 0 -> 3073 bytes .../darwin/indicator_selector-light.png | Bin 0 -> 2927 bytes .../darwin/interval_selector-dark.png | Bin 0 -> 2519 bytes .../darwin/interval_selector-light.png | Bin 0 -> 2385 bytes .../darwin/line_quote_chart-dark.png | Bin 33643 -> 34306 bytes .../darwin/line_quote_chart-light.png | Bin 32427 -> 33268 bytes .../darwin/multi_chart_layout-dark.png | Bin 0 -> 8796 bytes .../darwin/multi_chart_layout-light.png | Bin 0 -> 8491 bytes testdata/snapshots/darwin/ohlc_chart-dark.png | Bin 0 -> 14441 bytes .../snapshots/darwin/ohlc_chart-light.png | Bin 0 -> 13940 bytes .../darwin/price_alert_line-dark.png | Bin 0 -> 18918 bytes .../darwin/price_alert_line-light.png | Bin 0 -> 18427 bytes .../darwin/time_range_selector-dark.png | Bin 0 -> 5215 bytes .../darwin/time_range_selector-light.png | Bin 0 -> 4943 bytes .../snapshots/darwin/volume_profile-dark.png | Bin 17821 -> 17790 bytes .../snapshots/darwin/volume_profile-light.png | Bin 17201 -> 17198 bytes time_range_selector.go | 8 +- time_range_selector_test.go | 48 ++ volume_chart.go | 7 +- volume_profile.go | 35 +- 112 files changed, 3607 insertions(+), 1241 deletions(-) delete mode 100644 PRD.md delete mode 100644 TASKS.md create mode 100644 candle_countdown_test.go create mode 100644 chart_sync_test.go create mode 100644 chart_type_switcher_test.go create mode 100644 compare_symbol_test.go create mode 100644 docs/components/141-candlestick-chart.md create mode 100644 docs/components/142-ohlc-chart.md create mode 100644 docs/components/143-heikin-ashi-chart.md create mode 100644 docs/components/144-line-quote-chart.md create mode 100644 docs/components/145-volume-chart.md create mode 100644 docs/components/146-depth-chart.md create mode 100644 docs/components/147-volume-profile.md create mode 100644 docs/components/148-multi-chart-layout.md create mode 100644 docs/components/149-chart-sync.md create mode 100644 docs/components/150-time-range-selector.md create mode 100644 docs/components/151-interval-selector.md create mode 100644 docs/components/152-chart-type-switcher.md create mode 100644 docs/components/153-indicator-overlay.md create mode 100644 docs/components/154-indicator-pane.md create mode 100644 docs/components/155-indicator-selector.md create mode 100644 docs/components/156-drawing-tools.md create mode 100644 docs/components/157-drawing-toolbar.md create mode 100644 docs/components/158-compare-symbol.md create mode 100644 docs/components/159-price-alert-line.md create mode 100644 docs/components/160-candle-countdown.md delete mode 100644 docs/prd/ext-1.md delete mode 100644 docs/prd/ext-2.md delete mode 100644 docs/prd/ext-3.md create mode 100644 drawing_toolbar_test.go create mode 100644 drawing_tools_test.go create mode 100644 example_mktchart_test.go create mode 100644 examples/gallery/pages_mktchart_code.go create mode 100644 examples/gallery/pages_mktchart_demo.go create mode 100644 examples/gallery/pages_mktchart_state.go create mode 100644 examples/gallery/pages_mktchart_test.go create mode 100644 heikin_ashi_chart_test.go create mode 100644 indicator_overlay_test.go create mode 100644 indicator_selector_test.go create mode 100644 interval_selector_test.go create mode 100644 market_boundary_test.go create mode 100644 market_keyboard_test.go create mode 100644 market_large_test.go create mode 100644 market_regression_test.go create mode 100644 market_review_regression_test.go create mode 100644 market_states_test.go create mode 100644 multi_chart_layout_test.go create mode 100644 ohlc_chart_test.go create mode 100644 price_alert_line_test.go create mode 100644 testdata/snapshots/darwin/candle_countdown-dark.png create mode 100644 testdata/snapshots/darwin/candle_countdown-light.png create mode 100644 testdata/snapshots/darwin/chart_sync-dark.png create mode 100644 testdata/snapshots/darwin/chart_sync-light.png create mode 100644 testdata/snapshots/darwin/chart_type_switcher-dark.png create mode 100644 testdata/snapshots/darwin/chart_type_switcher-light.png create mode 100644 testdata/snapshots/darwin/compare_symbol-dark.png create mode 100644 testdata/snapshots/darwin/compare_symbol-light.png create mode 100644 testdata/snapshots/darwin/drawing_toolbar-dark.png create mode 100644 testdata/snapshots/darwin/drawing_toolbar-light.png create mode 100644 testdata/snapshots/darwin/drawing_tools-dark.png create mode 100644 testdata/snapshots/darwin/drawing_tools-light.png create mode 100644 testdata/snapshots/darwin/heikin_ashi_chart-dark.png create mode 100644 testdata/snapshots/darwin/heikin_ashi_chart-light.png create mode 100644 testdata/snapshots/darwin/indicator_overlay-dark.png create mode 100644 testdata/snapshots/darwin/indicator_overlay-light.png create mode 100644 testdata/snapshots/darwin/indicator_selector-dark.png create mode 100644 testdata/snapshots/darwin/indicator_selector-light.png create mode 100644 testdata/snapshots/darwin/interval_selector-dark.png create mode 100644 testdata/snapshots/darwin/interval_selector-light.png create mode 100644 testdata/snapshots/darwin/multi_chart_layout-dark.png create mode 100644 testdata/snapshots/darwin/multi_chart_layout-light.png create mode 100644 testdata/snapshots/darwin/ohlc_chart-dark.png create mode 100644 testdata/snapshots/darwin/ohlc_chart-light.png create mode 100644 testdata/snapshots/darwin/price_alert_line-dark.png create mode 100644 testdata/snapshots/darwin/price_alert_line-light.png create mode 100644 testdata/snapshots/darwin/time_range_selector-dark.png create mode 100644 testdata/snapshots/darwin/time_range_selector-light.png create mode 100644 time_range_selector_test.go diff --git a/PRD.md b/PRD.md deleted file mode 100644 index 96ec51b..0000000 --- a/PRD.md +++ /dev/null @@ -1,462 +0,0 @@ -# MujicaUI 产品需求文档 - -版本:1.1 -日期:2026-10-05 -交付范围:500 个组件、两套主题、三种密度、原生 Gallery、文档与测试。001—100 见本文第 4 节;101—500 见 `docs/prd/ext-1.md`、`ext-2.md`、`ext-3.md`。 - -## 1. 产品定义 - -MujicaUI 是基于 MyGo 原生 UI 的 Go 桌面组件库。采用古典宫廷与哥特风格,覆盖 Windows、macOS、Linux。面向开发桌面工具、设置界面和数据应用的 Go 开发者。 - -MyGo 原生 UI 使用 Go 构建并自绘界面,不依赖 HTML、JavaScript 或 WebView。MujicaUI 复用该路线,不开发网页组件库。[^native] - -首版交付本文及扩展文件规定的全部功能。已有组件换肤、已有能力组合和新增组件合计 500 个,不是在 MyGo 之外再增加 500 个。尺寸、颜色、状态、子部件和模式不单独计数。 - -不包含浏览器端适配、新渲染引擎、新布局引擎、独立状态管理框架、业务后端和上传服务。图表与行情组件以 MyGo Painter 绘制,不建通用图表引擎;媒体组件只提供播放与采集界面,解码与设备访问由调用方完成;文档类组件只提供显示与轻量编辑,不建富文本编辑引擎。 - -## 2. MyGo 复用规则 - -| 情况 | 实现要求 | -| --- | --- | -| 只需调整颜色、字体、尺寸 | 封装现有组件,使用主题与公开样式接口。 | -| 需要改变外形或内部布局 | 使用已公开的 Base,重做外观,保留输入、焦点和无障碍行为。 | -| 需要组合交互 | 组合 MyGo 与 MujicaUI 组件;仅补充缺失的状态和行为。 | -| 系统窗口操作、文件选择 | 调用 MyGo 桌面 API;系统控制的外观保持系统样式。 | -| 公开接口不足 | 提交上游扩展;合入后固定依赖版本。不访问上游 internal,不另建渲染或输入实现。 | - -已核验的 Base 包括 Button、Checkbox、Switch、Toggle、Radio、Slider、Tabs、Segmented、Collapsible、Select、Combobox、Popover、Dialog、TextInput 和 TextArea 对应的 Base。不得假设存在未公开的 TableBase、TreeBase 等接口。[^bases] - -应用内 Menubar、DropdownMenu、ContextMenu 使用 MujicaUI 自绘样式。系统菜单、系统文件对话框和系统窗口按钮不承诺换肤;不得把系统菜单直接显示为已完成的哥特样式菜单。 - -MyGo 的主题可调整颜色、字体、间距与圆角,也可读取高对比度、文本缩放和减少动画设置。MujicaUI 扩展设计变量,不另建 CSS 或样式解释器。[^theme] - -## 3. 视觉规范 - -### 3.1 风格与装饰 - -视觉参考为用户提供的宫廷场景图片:象牙白墙面、黑红服装、金色细节与衬线标题。只提取配色、线条和字形,不使用人物、海报、Logo 或照片作为组件素材。 - -页面以象牙白或炭黑为底。酒红表示主要操作与选中状态。旧金用于分隔线、角饰和面板标题,不用于正文。成功、警告和错误使用独立语义颜色。 - -按钮、输入框和数据行不加花纹。Heading、Divider 可使用单个菱形或对称细线。Card、Dialog 的双线边框与角饰通过 `Decorated` 开启,默认关闭。装饰不占焦点、不遮挡内容、不缩小点击区域。 - -不使用背景纹理、仿皮革、仿金属、发光、玻璃效果和装饰性渐变。颜色选择器中的色谱不受此限制。 - -### 3.2 颜色 - -以下为首版默认设计值,不是从参考图精确取色的结果。 - -| 变量 | 浅色主题 | 深色主题 | 用途 | -| --- | --- | --- | --- | -| Background | `#F2EBDD` | `#191618` | 窗口背景 | -| Surface | `#FBF7EF` | `#242024` | 卡片与弹层 | -| SurfaceHover | `#E8DFD0` | `#342C32` | 悬停背景 | -| Text | `#211C1D` | `#F2EBDD` | 正文与标题 | -| TextMuted | `#6A5B55` | `#BCAEAA` | 说明与占位文字 | -| Border | `#D2C3AF` | `#51424A` | 非交互分隔线 | -| ControlBorder | `#877662` | `#968278` | 输入框等交互边界 | -| Accent | `#7D2034` | `#9C3C53` | 主按钮填充 | -| AccentHover | `#651729` | `#AA425C` | 主按钮悬停 | -| AccentPressed | `#511020` | `#813047` | 主按钮按下 | -| OnAccent | `#FFF8EE` | `#FFF8EE` | 主按钮文字与图标 | -| AccentText | `#7D2034` | `#E4A0AE` | 链接与强调文字 | -| Selection | `#EAD7D9` | `#492A36` | 选中项背景 | -| Focus | `#7D2034` | `#E4A0AE` | 焦点环 | -| Ornament | `#AD9164` | `#BDA172` | 非语义装饰 | -| Success | `#326247` | `#94C6A4` | 成功文字与图标 | -| Warning | `#805714` | `#DFC080` | 警告文字与图标 | -| Danger | `#A12635` | `#F0A1AA` | 错误文字与图标 | -| Info | `#355E80` | `#9DBDDA` | 信息文字与图标 | - -语义颜色默认用于文字、图标和边界,不直接拿浅色主题值填满深色主题控件。危险按钮的底色与前景色单独定义并检查对比度。焦点环与控件之间保留背景色间隔。 - -### 3.3 字体、尺寸与密度 - -标题使用衬线字体,中文标题使用宋体类字形。正文、表单、表格使用系统无衬线字体。代码与快捷键使用系统等宽字体。装饰字形不用于控件标签。 - -标题默认 28、22、18 DIP;正文 14 DIP;说明文字 12 DIP;正文行高为字号的 1.5 倍。字体允许由应用注册与覆盖;缺失字体使用系统回退,不显示空白或方框替代正常文字。MyGo 提供字体注册与字体回退接口。[^text] - -| 密度 | 单行控件最小高度 | 数据行最小高度 | 基础间距单位 | -| --- | --- | --- | --- | -| Compact | 28 DIP | 28 DIP | 3 DIP | -| Default | 36 DIP | 36 DIP | 4 DIP | -| Comfortable | 44 DIP | 44 DIP | 5 DIP | - -默认间距采用 4、8、12、16、24、32、48 DIP。输入框与按钮圆角 2 DIP;卡片 4 DIP;弹层 6 DIP。边框 1 DIP;焦点环 2 DIP,外留 2 DIP 间隔。图标采用 16、20、24 DIP,独立操作的命中区域不小于 28 × 28 DIP。 - -高度是下限,不是固定值。文本放大、换行或字体回退时允许增长。切换密度不缩小字号,也不改变组件语义。细线须按设备像素对齐。 - -### 3.4 组件外观与主题行为 - -Button 使用酒红填充、象牙白文字与小圆角。TextInput 使用实色背景与细边框。Checkbox 保留方框和勾选、半选含义;Radio 保留单选圆形。Slider 可使用菱形滑块,命中区域仍为矩形。Tabs 与 Sidebar 使用背景、边线和文字共同标记当前项。 - -Card 与 Dialog 的装饰只出现在边缘和标题区。DataTable 表头、行分隔和选中行不添加纹样。Button、TextInput、Checkbox、Tabs、Card、Dialog 作为视觉回归基准。 - -主题提供 `System`、`Light`、`Dark`,默认跟随系统。每个窗口可独立设置主题与密度。切换主题不得重置表单值、展开状态、选择、焦点或滚动位置。 - -样式覆盖顺序为局部参数、窗口主题、库默认值。系统高对比度、文本缩放与减少动画要求仍须生效。主色默认保留酒红,不自动替换为系统强调色;高对比度模式以可读性为先。 - -状态过渡默认 120 毫秒,弹层过渡 160 毫秒。不使用弹跳或装饰性循环动画。减少动画模式直接切换状态;加载标记保留静态说明。 - -## 4. 组件清单 - -以下每行是一个公开组件及其首版最低功能。全部适用组件同时遵守第 5 节的交互要求。 - -### 4.1 布局与桌面 · 10 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 001 | AppShell | 标题栏、侧栏、主内容、状态栏插槽;侧栏折叠;内容区独立滚动。 | -| 002 | TitleBar | 应用标题与工具插槽;窗口拖动;为系统窗口按钮留出空间。 | -| 003 | StatusBar | 左右分区;状态文字、进度与操作;宽度不足时折叠次要内容。 | -| 004 | Container | 内边距、最大宽度、居中、填充;内容裁剪可配置。 | -| 005 | Stack | 横向或纵向排列;间距、对齐、换行;隐藏项不占间距。 | -| 006 | Grid | 行列尺寸、间距、跨行跨列;固定尺寸与剩余空间分配。 | -| 007 | ScrollArea | 横纵滚动;滚动条;滚动到指定位置;保留滚动位置。 | -| 008 | SplitPane | 横纵分栏;拖动分隔条;最小尺寸;折叠;键盘调整。 | -| 009 | AspectRatio | 保持指定宽高比;在父容器约束下缩放;不拉伸子内容。 | -| 010 | Divider | 横纵分隔;文字插槽;可选菱形装饰;不获取焦点。 | - -### 4.2 基础展示 · 10 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 011 | Text | 换行、省略、选择复制;可编辑模式支持确认、取消和外部保存结果。 | -| 012 | Heading | 三级标题;衬线字形;可选副标题和分隔线;支持文本缩放。 | -| 013 | Icon | SVG 图标;尺寸与语义颜色;图标名称;加载失败回退。 | -| 014 | Image | 位图与 SVG;包含或裁切;占位、加载、错误;替代说明。 | -| 015 | Avatar | 图片、姓名首字母与默认图标回退;尺寸可配置。 | -| 016 | AvatarGroup | 头像排列;最大显示数量;剩余数量;展开完整名单。 | -| 017 | Badge | 文字或计数;上限显示;位置可配置;朗读完整数值。 | -| 018 | Tag | 标签文字、图标;可关闭;关闭动作与标签点击分离。 | -| 019 | Link | 外部地址或应用内动作;键盘激活;文本下划线;打开失败反馈。 | -| 020 | Kbd | 单键与组合键展示;按平台显示 Command 或 Ctrl;仅展示、不注册快捷键。 | - -### 4.3 基础输入 · 10 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 021 | Button | 主按钮、次按钮、描边、无底色、危险变体;图标;加载与禁用。 | -| 022 | IconButton | 仅图标按钮;必填操作名称;提示文字;加载与禁用。 | -| 023 | ButtonGroup | 横纵组合;统一边界与尺寸;组内方向键移动;逐项禁用。 | -| 024 | TextInput | 单行编辑;占位、前后插槽、清空;选择、撤销、剪贴板与输入法。 | -| 025 | TextArea | 多行编辑;最小与最大高度;滚动;字数提示;提交快捷键可配置。 | -| 026 | NumberInput | 数值输入与步进;范围、步长、精度、空值;支持仅步进按钮模式。 | -| 027 | PasswordInput | 密码遮蔽;显隐切换;粘贴;默认不朗读或记录密码内容。 | -| 028 | SearchInput | 搜索与清空;提交;查找栏模式提供匹配数量、上一项和下一项。 | -| 029 | Checkbox | 选中、未选、半选;关联标签;组内全选;键盘操作。 | -| 030 | RadioGroup | 横纵单选组;稳定选项值;方向键选择;逐项禁用。 | - -### 4.4 选择控件 · 10 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 031 | Switch | 开关值;标签;禁用;切换后回传结果;不自行调用业务接口。 | -| 032 | Toggle | 保持按下状态的按钮;文字或图标;选中状态可辨认。 | -| 033 | ToggleGroup | 单选或多选;是否允许空选;键盘导航;逐项禁用。 | -| 034 | Slider | 数值范围、步长、刻度、值提示;拖动、方向键、Home 和 End。 | -| 035 | RangeSlider | 双端范围;步长;两端不交叉;分别提供焦点和数值说明。 | -| 036 | Select | 单选列表;占位、清空、禁用项、空状态;方向键与输入定位。 | -| 037 | MultiSelect | 多选、搜索、全选、数量限制;标签折叠;无结果状态。 | -| 038 | Combobox | 输入筛选与选项选择;可允许自定义值;异步结果由调用方提供。 | -| 039 | Cascader | 多级选择;完整路径;叶节点限制;外部加载子项;加载失败重试。 | -| 040 | TreeSelect | 树形单选或多选;搜索、展开、半选;父子选择规则可配置。 | - -### 4.5 表单组合 · 10 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 041 | Form | 字段注册;校验;提交、重置;提交中防重入;错误字段定位。 | -| 042 | FormField | 标签、必填标记、说明、错误;标签关联控件;上下或左右布局。 | -| 043 | InputGroup | 输入框与前后文字、按钮组合;统一边框;各操作保留独立焦点。 | -| 044 | PinInput | 位数限制;输入与退格;整段粘贴;完成事件;允许前导零。 | -| 045 | TagsInput | 标签增删、粘贴分隔、去重、数量限制;提交前校验。 | -| 046 | Rating | 评分与只读展示;步长配置;键盘调整;数值说明。 | -| 047 | ColorPicker | HEX、RGB、透明度;颜色选择;预设色;输入校验;透明度背景格。 | -| 048 | FilePicker | 调用系统文件或目录选择器;单选、多选、扩展名筛选;取消不报错。 | -| 049 | FileDropZone | 文件拖入提示;文件列表;类型、数量和大小检查;移除与错误提示。 | -| 050 | Transfer | 两侧列表;搜索、选择、移动、批量移动;禁用项;保留稳定条目 ID。 | - -### 4.6 日期与时间 · 8 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 051 | Calendar | 月视图;日期选择;今日标记;不可选日期;周起始日可配置。 | -| 052 | DatePicker | 日期输入与日历弹层;格式、范围、清空;无效输入提示。 | -| 053 | DateRangePicker | 起止日期;范围预览;起止限制;确认与清空。 | -| 054 | TimePicker | 时分秒;12/24 小时;步长与范围;输入与选择。 | -| 055 | TimeRangePicker | 起止时间;范围校验;跨午夜须显式开启。 | -| 056 | DateTimePicker | 日期与时间组合;时区由调用方指定;范围限制;确认与取消。 | -| 057 | MonthPicker | 年份切换;月份选择;范围、禁用与清空。 | -| 058 | YearPicker | 年份区间浏览;键盘选择;范围、禁用与清空。 | - -### 4.7 导航 · 10 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 059 | Tabs | 标签与面板关联;横纵布局;方向键导航;禁用项;溢出滚动。 | -| 060 | SegmentedControl | 分段单选;文字或图标;等宽或自适应;键盘导航。 | -| 061 | Breadcrumb | 路径导航;当前项;中间项折叠;完整名称提示。 | -| 062 | Pagination | 页码、上一页、下一页、页容量、跳页;总数变化时修正有效页码。 | -| 063 | Steps | 当前、完成、等待、错误;横纵布局;是否可点击由调用方控制。 | -| 064 | Sidebar | 分组与嵌套;图标、计数、选中项;展开折叠;紧凑模式。 | -| 065 | NavigationMenu | 层级导航;当前路径;可选前进、后退按钮;接入已有导航状态。 | -| 066 | Menubar | 应用窗口内菜单栏;子菜单;勾选和单选项;快捷键提示;键盘导航。 | -| 067 | Toolbar | 操作分组;分隔;窄宽溢出菜单;方向键导航;图标名称。 | -| 068 | CommandPalette | 快捷键打开;搜索、分组、无结果;方向键选择;执行后关闭。 | - -### 4.8 内容与数据 · 12 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 069 | Card | 标题、内容、页脚插槽;描边;可选角饰;不默认增加点击行为。 | -| 070 | List | 虚拟化列表与网格模式;稳定条目键;单选、多选;键盘导航与空状态。 | -| 071 | DataTable | 虚拟化;排序、筛选、多选;列宽、列顺序、列显隐;自定义单元格。 | -| 072 | Tree | 节点展开;选择;键盘导航;外部加载子项;空状态;大量节点虚拟化。 | -| 073 | TreeTable | 树形层级与列组合;展开、选择、列宽、排序状态;可见行虚拟化。 | -| 074 | Accordion | 单项或多项展开;是否允许全部关闭;键盘操作;展开状态受控。 | -| 075 | Collapsible | 触发区与内容区;外部控制展开;隐藏内容退出焦点序列。 | -| 076 | Timeline | 时间、标题、内容、状态;纵向排列;长内容换行。 | -| 077 | DescriptionList | 名称与值;多列、跨列、复制值;窄宽时改为单列。 | -| 078 | Statistic | 数值、单位、前后缀、精度;变化值说明;不计算业务指标。 | -| 079 | ImageViewer | 放大、缩小、平移、适应窗口、切换图片;键盘操作与关闭。 | -| 080 | Carousel | 上一项、下一项、位置指示;默认不自动播放;开启后支持暂停。 | - -### 4.9 浮层与菜单 · 10 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 081 | Dialog | 标题、说明、内容、操作区;焦点限制与恢复;关闭规则可配置。 | -| 082 | AlertDialog | 危险操作确认;默认聚焦取消;默认不允许点击遮罩关闭。 | -| 083 | Drawer | 四侧展开;尺寸限制;模态或非模态;关闭与焦点恢复。 | -| 084 | Popover | 锚点定位;自动避让窗口边缘;外部点击与 Escape 关闭。 | -| 085 | Tooltip | 悬停或聚焦显示;延迟;边缘避让;不放交互内容。 | -| 086 | HoverCard | 悬停或聚焦预览;允许移入内容;键盘可进入;延迟关闭。 | -| 087 | DropdownMenu | 按钮触发菜单;分组、子菜单、勾选、禁用;操作后按规则关闭。 | -| 088 | ContextMenu | 应用内右键菜单;键盘触发;按指针或焦点定位;边缘避让。 | -| 089 | Popconfirm | 锚点旁确认与取消;说明关联;可聚焦操作;不替代高风险确认框。 | -| 090 | Overlay | 窗口内覆盖层;定位、遮罩、模态行为;与现有 MyGo 浮层协作。 | - -### 4.10 反馈与状态 · 10 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 091 | Alert | 信息、成功、警告、错误;标题、内容、操作;可关闭。 | -| 092 | Toast | 消息队列;去重 ID;操作、关闭、时长;悬停或聚焦时暂停计时。 | -| 093 | Progress | 确定与不确定进度;线形与环形;计量模式支持范围和阈值。 | -| 094 | Spinner | 加载标记;尺寸与说明;隐藏或停止加载后停止动画。 | -| 095 | Skeleton | 文字、圆形、矩形占位;固定内容尺寸;减少动画模式使用静态填充。 | -| 096 | EmptyState | 标题、说明、可选图标与操作;区分无数据和无搜索结果。 | -| 097 | Result | 成功、失败、无权限等结果页;说明与下一步操作;不执行业务跳转。 | -| 098 | StatusIndicator | 状态标记与文字;成功、警告、错误、离线、处理中;不能只靠颜色。 | -| 099 | NotificationCenter | 应用内消息列表;已读、未读、清除、操作;消息与持久化由调用方管理。 | -| 100 | LoadingOverlay | 容器范围加载遮罩;阻止该范围重复操作;说明;可选取消动作。 | - -### 4.11 上游组件归并 - -MyGo 已有能力按以下方式纳入清单,不增加计数。其余同类组件按第 2 节复用。[^native] - -| MyGo 能力 | MujicaUI 对应项 | -| --- | --- | -| Primary button、Menu button | Button 的主按钮变体、DropdownMenu | -| Stepper、Number input | NumberInput 的步进模式与输入模式 | -| Search field、Find bar | SearchInput 的搜索模式与查找栏模式 | -| Autocomplete、Combobox | Combobox 的自由输入与选项选择模式 | -| Token field、Editable text | TagsInput、Text 的可编辑模式 | -| List、Grid view | List 的列表模式与网格模式 | -| Table、Outline、Tree | DataTable、TreeTable、Tree | -| Date input、Time input | DatePicker、TimePicker | -| Back and forward buttons | NavigationMenu 的历史导航操作 | -| Meter、Progress bar | Progress 的计量模式与进度模式 | - -## 5. 交互与状态 - -### 5.1 通用状态 - -| 状态 | 要求 | -| --- | --- | -| 默认 | 内容、边界与可操作性可辨认。 | -| 悬停 | 改变背景或边界,不改变布局尺寸。 | -| 按下 | 显示按下反馈;释放在无效区域时不误触发。 | -| 聚焦 | 键盘焦点可见;选中或错误状态不能覆盖焦点环。 | -| 选中 | 同时使用标记、形状或文字,不只改变颜色。 | -| 禁用 | 不修改值,不执行操作,退出常规 Tab 序列;仍向辅助技术报告禁用。 | -| 只读 | 不修改值;文字仍可聚焦、选择和复制;不得等同于禁用。 | -| 加载 | 保留尺寸与标签;阻止重复提交;完成或失败后恢复操作。 | -| 错误 | 保留输入;显示具体字段错误;提供修正或重试入口。 | - -只为适用组件提供对应状态。展示与布局组件不添加无用途的 Loading、Disabled 等参数。 - -### 5.2 键盘与无障碍 - -所有操作必须能通过键盘完成。Tab 与 Shift+Tab 跨组移动;方向键在 Tabs、菜单、单选组和工具栏内部移动。快捷键遵循平台习惯,不抢占文本编辑和输入法按键。MyGo 已提供焦点组、平台快捷键映射和输入法处理,封装时不得移除。[^input] - -无文字的操作必须提供名称。字段关联标签、说明与错误。复合组件提供对应角色、值、选中、展开和禁用状态。装饰不进入无障碍树。沿用 MyGo 的角色、Label、Description 与 Error 机制。[^accessibility] - -项目对比度下限:正常文字与占位文字 4.5:1;用于识别控件、状态和焦点的图形 3:1。纯装饰边框与禁用状态不按正文处理。采用 WCAG 的对比度计算方法;不以此代替整套无障碍验收。[^text-contrast][^ui-contrast] - -### 5.3 输入与表单 - -文本组件必须保留中文输入法、组合输入、选择、剪贴板、撤销和重做。输入法组合期间不自动提交、不跳到下一格、不拆分尚未提交的文本。PasswordInput 不在日志、测试报告或无障碍值中泄露明文。 - -Form 支持同步校验与调用方提供的异步校验结果;支持失焦和提交时校验。首次提交前不持续显示未触碰字段错误。提交失败保留所有值并定位第一个错误字段。异步旧结果不得覆盖更新后的字段值;提交中不得重复触发。 - -Form 不自带业务模型、远程接口或持久化。跨字段规则由调用方提供。重置恢复调用方给定的初始值,并清除提交与校验状态。 - -### 5.4 数据组件 - -DataTable 以稳定行 ID 和列 ID 保存状态。排序、筛选、列调整后,选择仍指向同一条数据。提供受控模式与可选本地排序、筛选辅助函数;外部数据查询由调用方负责。 - -MyGo Table 提供排序状态和界面交互,但数据仍按调用方提供的顺序显示。MujicaUI 不能只显示排序箭头而不完成排序或向调用方发出排序请求。[^table] - -List、DataTable、Tree、TreeTable 使用虚拟化;不能为全部数据逐项创建界面元素。排序与筛选只在数据或条件变化时执行,不在每帧重复执行。异步加载分别展示首次加载、追加加载、失败和无数据。 - -### 5.5 浮层与消息 - -模态窗口限制焦点并阻止背景交互;非模态浮层不锁住整个窗口。Escape 优先交给输入法和当前编辑控件,再关闭最上层可关闭浮层。关闭后恢复到触发控件;触发控件消失时回到有效父级。复用 MyGo 的浮层和焦点机制。[^overlays] - -弹层在窗口边缘翻转或限高滚动。嵌套 Select、菜单或 Popover 时,不提前关闭父 Dialog。危险操作默认聚焦取消;不得通过 Enter 在未确认目标时执行。 - -Toast 默认显示 5 秒,同一窗口最多同时显示 3 条,其余排队。含操作的消息在悬停或聚焦时暂停计时;错误消息默认保留到用户关闭。消息不得抢走正在输入的焦点。 - -### 5.6 日期、文件与本地化 - -日期选择保存日期值,不因隐式 UTC 转换改变日期。时间范围默认不跨午夜;日期时间由调用方指定时区。无法表示或无法确定的日期时间须提示,不静默修正。 - -FilePicker 只负责选择并返回结果。FileDropZone 只负责接收、校验与展示,不包含上传。文件内容读取、图片解码和网络访问不得阻塞界面线程。取消文件选择不作为错误。 - -组件内置文案提供 `zh-CN` 与 `en-US`,应用可覆盖。日期格式、周起始日、12/24 小时制和数字格式可配置。业务文案由调用方传入,不写死在组件内部。 - -## 6. API 与实现约束 - -### 6.1 API 约定 - -对外包名为 `mujica`。函数首参使用 `*ui.Context`;值通过状态指针或专用状态结构传入;配置使用有类型的 Options。基础组件返回 `*ui.Element`;复合组件按需返回命名部件或状态结果。不用 `map[string]any` 作为常规配置接口。 - -下列为 MujicaUI 的目标接口,不是 MyGo 现有接口: - -```go -func Button(c *ui.Context, label string, opts ButtonOptions) *ui.Element -func TextInput(c *ui.Context, value *string, opts TextInputOptions) *ui.Element -func Checkbox(c *ui.Context, value *bool, label string, opts CheckboxOptions) *ui.Element -``` - -事件沿用 `.Clicked()`、`.Changed()`、`.Submitted()` 的调用习惯。一次操作只产生一次业务事件。禁用、只读、范围等会影响行为的参数须在处理输入前生效,不依赖事后换色。 - -零值 Options 提供默认样式。必填参数、有效范围和空值规则必须写入 API 文档。子内容使用回调或命名插槽,不为每种组合另建组件。原生 MyGo 组件可以与 MujicaUI 混用。 - -### 6.2 状态与生命周期 - -业务状态由应用持有;组件只保留输入、展开、焦点、动画等界面状态。临时状态使用 MyGo 已有机制,不建立第二套全局状态仓库。 - -MyGo 的视图按帧构建,Element 只属于当前帧。不得跨帧缓存 Element,也不得在 goroutine 中操作它。异步结果通过 `Window.Update` 回到界面线程;窗口关闭后取消任务或忽略结果。动态项目使用稳定键;需即时处理输入的组件通过外层有键容器保持身份。[^views] - -缓存只覆盖字体、图标、装饰路径和必要的布局结果。主题、缩放、字体或数据变化时使相关缓存失效。隐藏组件不持续请求重绘。 - -### 6.3 项目结构 - -单仓库、单 Go 模块。组件放在根包,测试与实现同目录;不按组件拆成 100 个包。 - -```text -mujicaui/ -├── go.mod -├── go.sum -├── button.go -├── button_test.go -├── ... 其余组件及对应测试 -├── theme/ 主题、设计变量与对比度测试 -├── icons/ 图标接口与必要资源 -├── internal/ 少量共享实现与上游适配 -├── examples/gallery/ 原生演示应用 -├── docs/components/ 100 个组件文档 -├── testdata/ 测试数据与视觉基准 -├── README.md -├── LICENSE -└── THIRD_PARTY_NOTICES.md -``` - -固定 MyGo 的已验证 tag 或 commit,并提交 go.mod 与 go.sum。Go 最低版本与系统依赖以该版本为准,写入兼容表。不使用浮动 main,不为 Go 库运行引入 Node.js、WebView 或浏览器依赖。 - -## 7. 平台与资源 - -Windows、macOS、Linux 均需运行同一套组件 API。允许字体栅格化、系统窗口按钮和系统对话框不同;不允许缺失组件功能。 - -TitleBar 使用 MyGo 提供的窗口控制预留区域与拖动接口,不覆盖系统按钮。原生路线在 Windows 不要求 WebView2,在 Linux 仍有 GTK 3 等系统依赖,不能把“不使用 WebView”写成“没有运行时依赖”。[^windows] - -测试 100%、125%、150%、200% 显示缩放,以及跨不同缩放显示器移动窗口。文本缩放到 200% 后,不裁掉标签、字段错误和主要操作。Gallery 默认窗口为 1200 × 800 DIP,最小为 800 × 600 DIP;窄宽时折叠导航,长表格横向滚动。 - -发布说明列出已实测的操作系统版本、CPU 架构与 Linux 会话类型。X11、原生 Wayland 和 XWayland 分别记录,不把 XWayland 结果标成原生 Wayland 支持。 - -库和 Gallery 默认离线可用,无遥测、账号和强制网络字体。应用未请求时,不读取文件内容、不连接网络、不写入业务配置。字体可由应用提供;自带资源须记录来源与许可,图标和角饰不得依赖远程请求。 - -## 8. Gallery 与文档 - -Gallery 必须使用 MujicaUI 本身构建,不用网页或截图替代原生组件。提供组件分类、中英文搜索、主题切换、密度切换和示例代码复制。 - -每个组件页面包含可交互示例、适用状态展示、参数控制、事件结果和键盘说明。事件展示不得记录密码。提供设置页、文件列表、表单提交三个组合示例,验证跨组件协作,不接业务后端。 - -文档包含安装、最小运行示例、主题配置、MyGo 兼容版本和平台依赖。每个组件单独一页,列明参数、默认值、状态、事件、键盘操作、可复制代码和限制。所有 Go 示例必须通过编译检查。 - -文档中的组件截图由原生 Gallery 或渲染测试生成。文档可作为静态站发布,但浏览器页面不宣称能运行 Go 原生组件。API 名称与代码使用英文,首版说明文档使用中文。 - -## 9. 测试与性能 - -### 9.1 功能测试 - -使用 MyGo `ui.NewTester` 执行无窗口点击、键盘、输入、滚动与状态测试;使用图像快照检查渲染。MyGo 测试接口还提供缩放、主题、偏好和输入法组合模拟。[^testing] - -每个组件均需覆盖适用的正常、边界、错误与键盘路径。复用上游不免除封装层测试;新增样式不能破坏点击区域、焦点与无障碍名称。 - -快照覆盖全部组件的浅色、深色默认状态。六个视觉基准组件额外覆盖三种密度和全部适用交互状态。各平台使用独立字体与快照基准,不要求不同系统逐像素相同。 - -真机补测系统文件选择、窗口控制、中文输入法、跨屏缩放与屏幕阅读器。无窗口测试不能替代这些项目。发布测试记录包含 VoiceOver、Windows Narrator 或 NVDA,以及 Linux Orca 的结果。 - -### 9.2 性能要求 - -以下为验收目标,不是已测量结果。三个平台各固定一台基准设备,记录 CPU、GPU、内存、系统、驱动、字体、显示缩放与 MyGo 版本;使用发布构建,关闭 Inspector。 - -| 场景 | 验收要求 | -| --- | --- | -| 大列表 | 100,000 条固定高度记录可滚动、搜索和选择;每帧创建的元素数量由可见区域与预取范围决定。 | -| 大表格 | 100,000 行、10 列纯文本数据;排序与筛选后保留有效选择;不逐帧重算排序。 | -| 大树 | 100,000 个节点;折叠子树不创建界面元素;展开、搜索与滚动不阻塞输入。 | -| 渲染开销 | 同设备、同尺寸、同内容,对有等价上游实现的控件比较;MujicaUI 的界面构建与绘制 P95 耗时增幅不超过 20%。 | -| 空闲 | 关闭加载和过渡动画后,连续观察 60 秒,无组件定时器或自身逻辑持续触发重绘。 | -| 生命周期 | 连续打开、关闭同一弹层 100 次;回收后无持续增加的组件实例、后台任务或事件订阅。 | - -持续集成执行格式检查、静态检查、单元测试、示例编译与快照检查。支持的环境运行竞态检测。平台集成与性能结果随发布保存,不用单一平台的结果代替三平台验证。 - -## 10. 发布验收 - -代码采用 MIT 许可证。仓库保留第三方声明;任何复制的上游代码须保留其声明。发布 Go 模块、源码、三平台 Gallery 构建产物、文档和兼容表。 - -| 验收项 | 通过条件 | -| --- | --- | -| 数量 | 001—500 均有实现、文档、Gallery 示例与测试;变体不重复计数。 | -| 功能 | 每项最低功能可操作;不存在占位按钮、空事件或仅静态展示的交互组件。 | -| 样式 | 全部组件覆盖浅深主题;无 MyGo 默认外观混入;系统控制的界面按已声明例外处理。 | -| 主题与密度 | 切换无需重启;业务状态、焦点与滚动位置不丢失;无文字裁切。 | -| 输入与无障碍 | 键盘、中文输入法、焦点恢复、标签关联与屏幕阅读器测试通过。 | -| 数据与生命周期 | 大数据测试通过;无状态串行、重复提交、后台任务或订阅泄漏。 | -| 三平台 | 兼容表内的平台及架构均完成构建和实机验证;限制写入对应文档。 | -| 交付 | 固定依赖、示例可编译、Gallery 可运行、默认离线可用、资源许可齐全。 | - -首次公开发布须满足全部验收项,不以占位组件或后续补齐代替首版范围。 - -## 参考资料 - -上游能力核验日期:2026-10-05。实现与发布以固定依赖版本的代码为准。 - -[^native]: MyGo — [Native UI](https://mygo.egoist.dev/docs/ui). -[^bases]: MyGo — [Custom widgets](https://mygo.egoist.dev/docs/ui/custom-widgets). -[^theme]: MyGo — [Styling and themes](https://mygo.egoist.dev/docs/ui/styling). -[^text]: MyGo — [Text](https://mygo.egoist.dev/docs/ui/text). -[^input]: MyGo — [Input](https://mygo.egoist.dev/docs/ui/input). -[^accessibility]: MyGo — [Accessibility](https://mygo.egoist.dev/docs/ui/accessibility). -[^table]: MyGo — [Table](https://mygo.egoist.dev/docs/ui/table). -[^overlays]: MyGo — [Overlays](https://mygo.egoist.dev/docs/ui/overlays). -[^views]: MyGo — [Views](https://mygo.egoist.dev/docs/ui/views). -[^windows]: MyGo — [Windows with native UI](https://mygo.egoist.dev/docs/ui/windows). -[^testing]: MyGo — [Testing](https://mygo.egoist.dev/docs/ui/testing). -[^text-contrast]: W3C — [Contrast (Minimum)](https://www.w3.org/WAI/WCAG22/Understanding/contrast-minimum.html). -[^ui-contrast]: W3C — [Non-text Contrast](https://www.w3.org/WAI/WCAG22/Understanding/non-text-contrast.html). diff --git a/TASKS.md b/TASKS.md deleted file mode 100644 index d3c27b5..0000000 --- a/TASKS.md +++ /dev/null @@ -1,47 +0,0 @@ -# TASKS - -Ordered by PRD sections. Check an item only after its codex review passes. Review rounds noted as `r1`, `r2`, `r3`. - -- [x] T01 §1–2 Module, MyGo v0.2.10 pin, reuse rules, AGENTS.md — r1 FAIL (line height, enum checks), r2 PASS -- [x] T02 §3 Tokens, density, type, motion, contrast tests, `Use`, icons, i18n — r1 FAIL, r2 PASS -- [x] T03 §4.1 Layout 001–010 — r1 FAIL 8, r2 FAIL 2, r3 FAIL 1 (folded focus); fixed b34958b, verified by coordinator red/green after cap -- [x] T04 §4.2 Display 011–020 — r1 FAIL 5, r2 FAIL 5, r3 FAIL 2 (image sizing, Retry clip); fixed e922651, verified by coordinator tests and snapshot after cap -- [x] T05 §4.3 Inputs 021–030 — r1 FAIL 10, r2 FAIL 5, r3 FAIL 2 (float grid, password in test output); fixed 07a90f4, verified by coordinator red/green after cap -- [x] T06 §4.4 Choices 031–040 — r1 FAIL 16, r2 FAIL 5, r3 FAIL 1 (tiny-step direction); fixed 9e78900, verified by coordinator red/green after cap -- [x] T07 §4.5 Forms 041–050 — r1 FAIL 7, r2 FAIL 4, r3 FAIL 1 (disabled cut); fixed 49b3b78, coordinator red/green verified -- [x] T08 §4.6 Date and time 051–058 — r1 FAIL 9, r2 FAIL 5, r3 FAIL 2 (popup pick commit, selection mark); fixed e3eaef7, coordinator red/green verified -- [x] T09 §4.7 Navigation 059–068 — r1 FAIL 5, r2 FAIL 5, r3 FAIL 1 (Tab out of menubar); fixed 7e4d862, coordinator red/green verified -- [x] T10 §4.8 Content and data 069–080 — r1 FAIL 9, r2 FAIL 4, r3 PASS -- [x] T11 §4.9 Overlays and menus 081–090 — r1 FAIL 12, r2 FAIL 5, r3 PASS -- [x] T12 §4.10 Feedback 091–100 — r1 FAIL 5, r2 FAIL 4, r3 PASS -- [ ] T12.01 §4.12 Charts I 101–120 (docs/prd) -- [ ] T12.02 §4.13 Charts II 121–140 (docs/prd) -- [ ] T12.03 §4.14 Market Charts 141–160 (docs/prd) -- [ ] T12.04 §4.15 Trading 161–180 (docs/prd) -- [ ] T12.05 §4.16 Markets 181–200 (docs/prd) -- [ ] T12.06 §4.17 Chat Messages 201–220 (docs/prd) -- [ ] T12.07 §4.18 Chat Input 221–240 (docs/prd) -- [ ] T12.08 §4.19 Chat Sessions 241–260 (docs/prd) -- [ ] T12.09 §4.20 Agent 261–280 (docs/prd) -- [ ] T12.10 §4.21 Agent Ops & Motion 281–300 (docs/prd) -- [ ] T12.11 §4.22 Git 301–320 (docs/prd) -- [ ] T12.12 §4.23 Terminal & Code 321–340 (docs/prd) -- [ ] T12.13 §4.24 Media 341–360 (docs/prd) -- [ ] T12.14 §4.25 Projects 361–380 (docs/prd) -- [ ] T12.15 §4.26 Files & Collaboration 381–400 (docs/prd) -- [ ] T12.16 §4.27 Messaging & Mail 401–420 (docs/prd) -- [ ] T12.17 §4.28 Calendar 421–440 (docs/prd) -- [ ] T12.18 §4.29 Dashboards & Dev Tools 441–460 (docs/prd) -- [ ] T12.19 §4.30 Settings & Account 461–480 (docs/prd) -- [ ] T12.20 §4.31 Essentials 481–500 (docs/prd) -- [ ] T13 §4.11 Upstream mapping documented -- [ ] T14 §5 States, keyboard, a11y, input, overlays: cross-cutting tests -- [ ] T15 §6 API and lifecycle audit; README, LICENSE, THIRD_PARTY_NOTICES -- [ ] T16 §7 Platform table, offline, resources -- [ ] T17 §8 Native Gallery: categories, zh/en search, theme, density, code copy, three composite demos -- [ ] T18 §8 Web mirror of the Gallery (user request) -- [ ] T19 §8 Docs: install, minimal example, theme, compat; 100 component pages; examples compile -- [ ] T20 §9 Snapshots, density baselines, large-data and lifecycle tests -- [ ] T21 §9 CI workflow -- [ ] T22 §6.3 Split into category sub-packages after 001–500 land (user decision 2026-10-05); update PRD §6.3, docs, Gallery, CI -- [ ] T23 §10 Acceptance checklist diff --git a/candle_countdown.go b/candle_countdown.go index 7f5f566..e4561c5 100644 --- a/candle_countdown.go +++ b/candle_countdown.go @@ -11,17 +11,22 @@ import ( // CandleCountdownOptions configure a CandleCountdown. type CandleCountdownOptions struct { - // Location aligns days and weeks; nil is UTC, as exchanges count. + // Location defaults to UTC. Location *time.Location + // Now freezes the clock; zero uses the frame time. + Now time.Time } -// CandleCountdown shows the time left until the current candle of interval closes; it wakes once a second only while shown. +// CandleCountdown displays closing time and schedules visible updates. func CandleCountdown(c *ui.Context, interval Interval, opts CandleCountdownOptions) *ui.Element { loc := opts.Location if loc == nil { loc = time.UTC } - now := c.Now() + now := opts.Now + if now.IsZero() { + now = c.Now() + } left := interval.Close(now, loc).Sub(now) k := Tokens(c) text := candleCountdownText(left) @@ -31,7 +36,9 @@ func CandleCountdown(c *ui.Context, interval Interval, opts CandleCountdownOptio ui.Text(c, text).FontFeatures("tnum").FontWeight(500).TextColor(k.Text).SingleLine() }) // The next whole second, so the text never skips one. - c.After(left - left.Truncate(time.Second) + time.Millisecond) + if opts.Now.IsZero() { + e.DrawOver(func(_ *ui.Painter, _ ui.Rect) { c.After(left - left.Truncate(time.Second) + time.Millisecond) }) + } return e } diff --git a/candle_countdown_test.go b/candle_countdown_test.go new file mode 100644 index 0000000..2b42c7b --- /dev/null +++ b/candle_countdown_test.go @@ -0,0 +1,41 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "testing" + "time" +) + +func TestCandleCountdownIntervalsAndClock(t *testing.T) { + now := time.Date(2026, 10, 5, 12, 34, 5, 0, time.UTC) + iv := Interval("1m") + tt := ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); CandleCountdown(c, iv, CandleCountdownOptions{Now: now}) }, 300, 100) + if !tt.HasText("00:55") { + t.Fatalf("countdown %q", tt.Texts()) + } + iv = "1h" + tt.Frame() + if !tt.HasText("25:55") { + t.Fatalf("hour %q", tt.Texts()) + } + for _, period := range Intervals { + if !period.Close(now, time.UTC).After(now) { + t.Fatalf("close %s", period) + } + } + for _, tc := range []struct { + d time.Duration + want string + }{{time.Second, "00:01"}, {time.Hour + time.Second, "1:00:01"}, {48*time.Hour + time.Hour, "2d 01:00:00"}} { + if got := candleCountdownText(tc.d); got != tc.want { + t.Fatalf("text %q", got) + } + } +} +func TestCandleCountdownSnapshot(t *testing.T) { + snapshot(t, "candle_countdown", 300, 80, func(c *ui.Context) { + ui.Row(c).Padding(12).Children(func() { + CandleCountdown(c, "1h", CandleCountdownOptions{Now: time.Date(2026, 10, 5, 12, 34, 5, 0, time.UTC)}) + }) + }) +} diff --git a/candlestick_chart.go b/candlestick_chart.go index 94180b0..0d05997 100644 --- a/candlestick_chart.go +++ b/candlestick_chart.go @@ -12,7 +12,7 @@ import ( "mujicaui/theme" ) -// ChartType is how a price chart draws candles. The zero value is ChartCandles. +// ChartType selects the price chart shape. type ChartType int const ( @@ -31,26 +31,29 @@ type CandlestickOptions struct { Decimals int // Overlays draw indicators over the prices. Overlays []IndicatorOverlay - // Compare overlays other symbols in percent; the chart turns to percent while any show. + // Compare switches the chart to normalized percent prices. Compare *[]CompareSymbol - // Alerts are draggable price lines; OnAlert runs when the last close crosses one. + // Alerts provides draggable lines and price-crossing callbacks. Alerts *[]PriceAlertLine OnAlert func(a PriceAlertLine, last Candle) // Drawings, when set, takes clicks for the current tool. Drawings *DrawingTools - // Sync links the view and crosshair to other charts under SyncID. + // Sync links the window and crosshair under SyncID. Sync *ChartSync SyncID string } // mktState is a price chart's own frame-to-frame state. type mktState struct { - drawn int // candles painted last frame - dragRest float32 // pan drag left over, under a candle - lastClose float64 - alertSeen bool - grab int // alert index dragged, -1 none - focus int // keyboard mark last frame, to follow only when it moves + drawn int // candles painted last frame + dragRest float32 // pan drag left over, under a candle + lastClose float64 + alertSeen bool + grab int // alert index dragged, -1 none + focus int // keyboard mark last frame, to follow only when it moves + alertFocus int + plot ui.Rect + ys internal.Linear // the price scale as last painted } // mktCore is one price chart being built. @@ -77,7 +80,7 @@ type mktLine struct { shape int } -// CandlestickChart draws candles of the view's window, building and painting only those; rises and falls use the window's Trend colors and hollow or filled bodies. +// CandlestickChart paints visible candles with hollow rises and filled falls. func CandlestickChart(c *ui.Context, candles []Candle, view *MarketView, opts CandlestickOptions) ChartResult { if view == nil { panic("mujica: CandlestickChart needs a view") @@ -97,7 +100,14 @@ func CandlestickChart(c *ui.Context, candles []Candle, view *MarketView, opts Ca return candles }) m := &mktCore{c: c, k: Tokens(c), ch: ch, candles: shown, view: view, opts: opts, dec: priceDecimals("CandlestickChart", opts.Decimals)} - m.st = *ui.Local(ch.res.Element, "mujica.mkt", func() *mktState { return &mktState{grab: -1, focus: -1} }) + m.st = *ui.Local(ch.res.Element, "mujica.mkt", func() *mktState { return &mktState{grab: -1, focus: -1, alertFocus: -1} }) + if ch.res.Element.IsDisabled() { + copy := *view + view = © + m.view = view + m.opts.Sync = nil + opts.Sync = nil + } if s := opts.Sync; s != nil { s.load(opts.SyncID, shown, view) } @@ -122,7 +132,7 @@ func OHLCChart(c *ui.Context, candles []Candle, view *MarketView, opts Candlesti return CandlestickChart(c, candles, view, opts) } -// HeikinAshiChart is CandlestickChart of Heikin-Ashi candles computed from candles; *raw switches back to them. +// HeikinAshiChart switches between smoothed candles and raw OHLC. func HeikinAshiChart(c *ui.Context, candles []Candle, view *MarketView, raw *bool, opts CandlestickOptions) ChartResult { if raw == nil { panic("mujica: HeikinAshiChart needs raw") @@ -136,8 +146,8 @@ func HeikinAshiChart(c *ui.Context, candles []Candle, view *MarketView, raw *boo col.Children(func() { ui.Row(c).Children(func() { v := []bool{*raw} - if ToggleGroup(c, &v, []ToggleItem[bool]{{Value: false, Label: msg(c, "heikin_ashi.smoothed")}, {Value: true, Label: msg(c, "heikin_ashi.raw")}}, - ToggleGroupOptions{Label: msg(c, "heikin_ashi.switch")}).Changed() { + if ToggleGroup(c, &v, []ToggleItem[bool]{{Value: false, Label: msg(c, "heikin_ashi_chart.smoothed")}, {Value: true, Label: msg(c, "heikin_ashi_chart.raw")}}, + ToggleGroupOptions{Label: msg(c, "heikin_ashi_chart.switch")}).Changed() { *raw = v[0] slog.Debug("mujica: heikin_ashi switch", "raw", *raw) } @@ -148,7 +158,7 @@ func HeikinAshiChart(c *ui.Context, candles []Candle, view *MarketView, raw *boo return res } -// window resolves the shown candles from the view and last frame's width. +// window resolves visible candles using the last measured width. func (m *mktCore) window() { m.from, m.to = marketWindow(*m.view, len(m.candles), m.room()) } @@ -162,7 +172,7 @@ func (m *mktCore) room() int { return max(10, int(w/3)) } -// yDomain spans the window's lows and highs, overlays and alerts, recomputed only when they change. +// yDomain caches visible prices, indicators, and alerts. func (m *mktCore) yDomain() { if m.to <= m.from { return @@ -195,7 +205,7 @@ func (m *mktCore) yDomain() { m.lo, m.hi = d[0], d[1] } -// val maps a price to what the axis shows: itself, or percent from base. +// val converts price to the current axis unit. func (m *mktCore) val(p float64) float64 { if m.base == 0 { return p @@ -238,6 +248,12 @@ func (m *mktCore) spec() chartSpec { for _, l := range m.overlays { keys = append(keys, chartKey{Name: l.name, Color: l.color, Shape: l.shape}) } + if n == 0 && m.opts.Compare != nil { + pal := internal.Palette(m.k) + for i, s := range *m.opts.Compare { + keys = append(keys, chartKey{Name: s.Name, Color: pal[(i+1)%len(pal)], Shape: i + 1}) + } + } spec := chartSpec{n: n, keys: keys} if m.to <= m.from { spec.n = 0 @@ -256,12 +272,19 @@ func (m *mktCore) spec() chartSpec { } return min(i+1, n-1) } + if d := m.opts.Drawings; d != nil { + spec.keyActivate = func(i int) { + if !d.Locked && d.Tool != ToolSelect { + d.place(m, DrawingPoint{m.candles[i].Time, m.candles[i].Close}) + } + } + } spec.readout = m.readout spec.draw = func(p *ui.Painter, r ui.Rect, active int) { m.paint(p, r, active) } return spec } -// readout says the candle's time, prices, change and direction, and the overlays there. +// readout describes time, OHLC, volume, direction, and indicators. func (m *mktCore) readout(i int) string { c := m.candles[i] f := func(v float64) string { return priceUngrouped(v, m.dec) } diff --git a/candlestick_chart_test.go b/candlestick_chart_test.go index 505f68f..6b4c554 100644 --- a/candlestick_chart_test.go +++ b/candlestick_chart_test.go @@ -41,7 +41,6 @@ func TestCandlestickChartDrawsOnlyVisible(t *testing.T) { if st.drawn != 120 { t.Fatalf("drew %d candles of 100000", st.drawn) } - // Zooming out is capped by the width: three DIPs a candle. tt.Key(0, ui.KeyTab) for range 40 { tt.Key(0, ui.KeyMinus) diff --git a/candlestick_paint.go b/candlestick_paint.go index 5bc89d1..436f8f7 100644 --- a/candlestick_paint.go +++ b/candlestick_paint.go @@ -10,9 +10,10 @@ import ( "mujicaui/theme" ) -// paint draws axes, the window's candles, layers and the crosshair at active. +// paint draws axes, visible candles, layers, and the crosshair. func (m *mktCore) paint(p *ui.Painter, r ui.Rect, active int) { g := m.geom(r) + m.st.plot, m.st.ys = g.plot, g.ys k := m.k size := FontSize(m.c, theme.CaptionSize) label := func(v float64) string { @@ -25,8 +26,8 @@ func (m *mktCore) paint(p *ui.Painter, r ui.Rect, active int) { m.paintTimeAxis(p, g, size) p.Clip(g.plot, 0, func() { m.st.drawn = m.paintCandles(p, g) - for i, l := range m.overlays { - mktPaintLine(p, g, m, l.values, l.color, i) + for _, l := range m.overlays { + mktPaintLine(p, g, m, l.values, l.color, l.shape) } m.paintAlerts(p, g, size) if d := m.opts.Drawings; d != nil { @@ -49,7 +50,7 @@ func (m *mktCore) paint(p *ui.Painter, r ui.Rect, active int) { // paintTimeAxis labels candles about 90 DIPs apart. func (m *mktCore) paintTimeAxis(p *ui.Painter, g mktGeom, size float32) { every := max(1, int(math.Ceil(float64(90/g.band.Step())))) - layout := "Jan 2" + layout := msg(m.c, "candlestick_chart.daily_time") if m.to-m.from > 1 && m.candles[m.from+1].Time.Sub(m.candles[m.from].Time) < 24*time.Hour { layout = "15:04" } @@ -62,18 +63,14 @@ func (m *mktCore) paintTimeAxis(p *ui.Painter, g mktGeom, size float32) { internal.AxisX(p, g.plot, xs, labels, size, m.k) } -// paintCandles draws the window as the chart's type and returns how many candles it drew. +// paintCandles returns the number of visible candles painted. func (m *mktCore) paintCandles(p *ui.Painter, g mktGeom) int { k := m.k w := max(1, g.band.Width()) if m.opts.Type == ChartLine || m.opts.Type == ChartArea { - closes := make([]float64, len(m.candles)) - for i := m.from; i < m.to; i++ { - closes[i] = m.val(m.candles[i].Close) - } var line, fill ui.Path for i := m.from; i < m.to; i++ { - x, y := internal.Snap(p, g.x(m, i)), internal.Snap(p, g.ys.Map(closes[i])) + x, y := internal.Snap(p, g.x(m, i)), internal.Snap(p, g.ys.Map(m.val(m.candles[i].Close))) if i == m.from { line.MoveTo(x, y) fill.MoveTo(x, g.plot.Y+g.plot.H).LineTo(x, y) @@ -109,7 +106,7 @@ func (m *mktCore) paintCandles(p *ui.Painter, g mktGeom) int { body := ui.Rect{X: x - w/2, Y: top, W: w, H: max(1, bot-top)} p.Line(x, yh, x, top, 1, col) p.Line(x, bot, x, yl, 1, col) - // Rises are hollow and falls filled, so direction reads without color. + // Rises are hollow; falls are filled. if up && w >= 3 { p.Fill(body, k.Surface, 0) p.Stroke(body, col, 0, 1) @@ -120,7 +117,7 @@ func (m *mktCore) paintCandles(p *ui.Painter, g mktGeom) int { return m.to - m.from } -// mktPaintLine draws values over the window with sparse markers of shape. +// mktPaintLine draws visible values with distinct series markers. func mktPaintLine(p *ui.Painter, g mktGeom, m *mktCore, values []float64, col ui.Color, shape int) { var path ui.Path open := false @@ -147,7 +144,7 @@ func mktPaintLine(p *ui.Painter, g mktGeom, m *mktCore, values []float64, col ui } } -// mktTag draws a price label at the plot's right edge, centered on y. +// mktTag centers a price label on the right edge. func mktTag(p *ui.Painter, right, y float32, s string, size float32, fg, bg ui.Color) { w, h := p.MeasureText(0, ui.Span{Text: s, Size: size}) b := ui.Rect{X: right - w - 8, Y: y - h/2 - 2, W: w + 8, H: h + 4} diff --git a/chart_frame.go b/chart_frame.go index 9fdad75..2005a50 100644 --- a/chart_frame.go +++ b/chart_frame.go @@ -65,7 +65,8 @@ type chartSpec struct { // move steps from mark i; nil steps in order. move func(i int, key ui.Key) int // activate runs on Enter, Space or a click. - activate func(i int) + keyActivate func(i int) + activate func(i int) } type chartState struct { @@ -116,7 +117,7 @@ func (ch *chart) build(spec chartSpec) (ChartResult, *ui.Element) { }) }) ch.res.Point = -1 - ui.Box(c).Height(u * 5) + ui.Box(c).Height(max(u*5, FontSize(c, theme.CaptionSize)*theme.LineHeight)) return } plot = box.Focusable().Label(ch.frame.Label).Role(ui.RoleGroup) @@ -137,7 +138,7 @@ func (ch *chart) build(spec chartSpec) (ChartResult, *ui.Element) { if active >= 0 { text, col = spec.readout(active), k.Text } - ui.Text(c, text).FontSize(FontSize(c, theme.CaptionSize)).TextColor(col).Role(ui.RoleStatus).SingleLine().Height(u * 5) + ui.Text(c, text).FontSize(FontSize(c, theme.CaptionSize)).TextColor(col).Role(ui.RoleStatus).SingleLine().Height(max(u*5, FontSize(c, theme.CaptionSize)*theme.LineHeight)) }) ch.res.changed = ch.res.Point != st.last st.last = ch.res.Point @@ -183,6 +184,9 @@ func (ch *chart) input(plot *ui.Element, spec chartSpec) { slog.Debug("mujica: chart focus", "label", ch.frame.Label, "mark", to) } act := st.focus >= 0 && (plot.Shortcut(0, ui.KeyEnter) || plot.Shortcut(0, ui.KeySpace)) + if act && spec.keyActivate != nil { + spec.keyActivate(st.focus) + } if plot.Clicked() { plot.Focus() x, y, _ := plot.PointerPosition() diff --git a/chart_sync.go b/chart_sync.go index a8170ad..82e43ab 100644 --- a/chart_sync.go +++ b/chart_sync.go @@ -2,6 +2,7 @@ package mujica import ( "log/slog" + "sort" "time" "github.com/egoist/mygo/ui" @@ -10,22 +11,26 @@ import ( "mujicaui/theme" ) -// ChartSync links charts by time: the same window, zoom and crosshair. The caller holds it. +// ChartSync shares time windows and crosshairs across linked charts. type ChartSync struct { - // Count is the linked zoom in candles; zero is the default 120. + // Count is linked zoom; zero defaults to 120. Count int - // End is the newest linked time shown; zero follows each chart's newest candle. + // End is inclusive; zero follows each chart's latest candle. End time.Time + // Start is the inclusive left edge across candle intervals. + Start time.Time // Cursor is the crosshair time; zero shows none. Cursor time.Time // Unlinked charts keep their own view and crosshair. - Unlinked map[string]bool - owner string + Unlinked map[string]bool + owner string + rangeOwner string + loaded map[string]MarketView } func (s *ChartSync) linked(id string) bool { return !s.Unlinked[id] } -// load puts the linked window into view before a chart builds. +// load applies the shared time window to linked charts. func (s *ChartSync) load(id string, candles []Candle, view *MarketView) { if !s.linked(id) { return @@ -36,17 +41,44 @@ func (s *ChartSync) load(id string, candles []Candle, view *MarketView) { view.End = max(1, i+1) } } + if s.rangeOwner == "" { + s.rangeOwner = id + } + if len(candles) > 0 && (s.Start.IsZero() || s.End.IsZero() && s.rangeOwner == id) { + from, _ := marketWindow(*view, len(candles), len(candles)) + s.Start = candles[from].Time + } + if !s.Start.IsZero() && len(candles) > 0 { + from := sort.Search(len(candles), func(i int) bool { return !candles[i].Time.Before(s.Start) }) + to := len(candles) + if view.End > 0 { + to = view.End + } + if from < to { + view.Count = to - from + } + } + if s.loaded == nil { + s.loaded = map[string]MarketView{} + } + s.loaded[id] = *view } -// store writes a linked chart's window and crosshair back after it builds. +// store updates the shared window and active crosshair. func (s *ChartSync) store(id string, candles []Candle, view *MarketView, active int) { if !s.linked(id) { return } - s.Count = view.Count - s.End = time.Time{} - if view.End > 0 && view.End <= len(candles) { - s.End = candles[view.End-1].Time + loaded, ok := s.loaded[id] + if !ok || *view != loaded { + s.Count, s.End, s.rangeOwner = view.Count, time.Time{}, id + if view.End > 0 && view.End <= len(candles) { + s.End = candles[view.End-1].Time + } + if len(candles) > 0 { + from, _ := marketWindow(*view, len(candles), len(candles)) + s.Start = candles[from].Time + } } switch { case active >= 0: @@ -64,7 +96,7 @@ func (s *ChartSync) cursorIndex(id string, candles []Candle) int { return marketIndexAt(candles, s.Cursor) } -// Link builds a toggle that links or unlinks chart id; Changed reports a switch. +// Link toggles synchronization for a stable chart ID. func (s *ChartSync) Link(c *ui.Context, id string) ChoiceResult { if id == "" { panic("mujica: ChartSync.Link needs an id") diff --git a/chart_sync_test.go b/chart_sync_test.go new file mode 100644 index 0000000..b1547f4 --- /dev/null +++ b/chart_sync_test.go @@ -0,0 +1,54 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "testing" +) + +func TestChartSyncRangeCursorAndUnlink(t *testing.T) { + cs := sampleCandles(300) + sync := ChartSync{} + v := MarketView{Count: 40, End: 200} + sync.store("a", cs, &v, 150) + var other MarketView + sync.load("b", cs, &other) + if other != v || sync.cursorIndex("b", cs) != 150 { + t.Fatalf("sync %+v %+v", other, sync) + } + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Row(c).Disabled(disabled).Children(func() { sync.Link(c, "b") }) + }, 300, 90) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeySpace) + if sync.linked("b") || sync.cursorIndex("b", cs) != -1 { + t.Fatal("unlink failed") + } + other = MarketView{Count: 12} + sync.load("b", cs, &other) + if other.Count != 12 { + t.Fatal("unlinked view overwritten") + } + disabled = true + tt.Frame() + tt.Key(0, ui.KeySpace) + if sync.linked("b") { + t.Fatal("disabled link changed") + } + sync.store("a", cs, &v, -1) + if !sync.Cursor.IsZero() { + t.Fatal("cursor remained after leaving owner") + } +} +func TestChartSyncSnapshot(t *testing.T) { + cs := sampleCandles(50) + sync := ChartSync{Cursor: cs[25].Time, owner: "a"} + v := MarketView{Count: 50} + snapshot(t, "chart_sync", 640, 340, func(c *ui.Context) { + ui.Column(c).Padding(12).Children(func() { + sync.Link(c, "b") + CandlestickChart(c, cs, &v, CandlestickOptions{Frame: ChartFrame{Label: "Linked", Height: 230}, Sync: &sync, SyncID: "b"}) + }) + }) +} diff --git a/chart_type_switcher.go b/chart_type_switcher.go index 7102cf4..ee105af 100644 --- a/chart_type_switcher.go +++ b/chart_type_switcher.go @@ -2,6 +2,7 @@ package mujica import ( "fmt" + "log/slog" "github.com/egoist/mygo/ui" ) @@ -11,7 +12,7 @@ type ChartTypeSwitcherOptions struct { Disabled bool } -// ChartTypeSwitcher chooses how CandlestickChart draws: candles, OHLC bars, line, area or Heikin-Ashi. +// ChartTypeSwitcher chooses candles, OHLC, line, area, or Heikin-Ashi. func ChartTypeSwitcher(c *ui.Context, value *ChartType, opts ChartTypeSwitcherOptions) ChoiceResult { if value == nil { panic("mujica: ChartTypeSwitcher needs a value") @@ -30,6 +31,7 @@ func ChartTypeSwitcher(c *ui.Context, value *ChartType, opts ChartTypeSwitcherOp }) if r.Changed() { *value = sel[0] + slog.Debug("mujica: chart_type_switcher changed", "type", *value) } return r } diff --git a/chart_type_switcher_test.go b/chart_type_switcher_test.go new file mode 100644 index 0000000..f810fa2 --- /dev/null +++ b/chart_type_switcher_test.go @@ -0,0 +1,41 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "testing" +) + +func TestChartTypeSwitcherKeyboardAndDisabled(t *testing.T) { + value := ChartCandles + disabled := false + changes := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if ChartTypeSwitcher(c, &value, ChartTypeSwitcherOptions{Disabled: disabled}).Changed() { + changes++ + } + }, 800, 100) + tt.Key(0, ui.KeyTab) + for _, want := range []ChartType{ChartOHLC, ChartLine, ChartArea, ChartHeikinAshi} { + tt.Key(0, ui.KeyRight) + tt.Key(0, ui.KeySpace) + if value != want { + t.Fatalf("type %v, want %v", value, want) + } + } + if changes != 4 { + t.Fatalf("changes %d", changes) + } + disabled = true + tt.Frame() + tt.Key(0, ui.KeyLeft) + if value != ChartHeikinAshi || changes != 4 { + t.Fatal("disabled type changed") + } +} +func TestChartTypeSwitcherSnapshot(t *testing.T) { + value := ChartCandles + snapshot(t, "chart_type_switcher", 680, 90, func(c *ui.Context) { + ui.Row(c).Padding(12).Children(func() { ChartTypeSwitcher(c, &value, ChartTypeSwitcherOptions{}) }) + }) +} diff --git a/compare_symbol_test.go b/compare_symbol_test.go new file mode 100644 index 0000000..138c83f --- /dev/null +++ b/compare_symbol_test.go @@ -0,0 +1,71 @@ +package mujica + +import ( + "strings" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestCompareSymbolPercentAndRemove(t *testing.T) { + candles := sampleCandles(100) + view := MarketView{Count: 50} + eth := make([]float64, 100) + for i := range eth { + eth[i] = 20 + float64(i)*0.1 + } + cmp := []CompareSymbol{{Name: "ETH", Closes: eth}} + removed := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if CompareLegend(c, &cmp).Changed() { + removed++ + } + CandlestickChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "BTC"}, Compare: &cmp}) + }, 800, 420) + tt.Key(0, ui.KeyTab) // remove ETH + tt.Key(0, ui.KeyTab) // the chart + tt.Key(0, ui.KeyEnd) + // Normalized from the first shown candle, index 50: (29.9/25 - 1) = 19.6%. + want := "ETH 19.60" + found := false + for _, s := range tt.Texts() { + found = found || strings.Contains(s, want) + } + if !found { + t.Fatalf("readout lacks %q: %q", want, tt.Texts()) + } + if err := tt.Click("Remove ETH"); err != nil { + t.Fatal(err) + } + if len(cmp) != 0 || removed != 1 { + t.Fatalf("remove: %v %d", cmp, removed) + } + defer func() { + if recover() == nil { + t.Fatal("short closes accepted") + } + }() + bad := []CompareSymbol{{Name: "X", Closes: []float64{1}}} + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + CandlestickChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "x"}, Compare: &bad}) + }, 300, 200) +} + +func TestCompareSymbolSnapshot(t *testing.T) { + candles := sampleCandles(100) + view := MarketView{Count: 80} + eth, sol := make([]float64, 100), make([]float64, 100) + for i := range eth { + eth[i] = 20 + float64(i)*0.08 + float64(i%7)*0.2 + sol[i] = 5 - float64(i)*0.01 + float64(i%5)*0.05 + } + cmp := []CompareSymbol{{Name: "ETH", Closes: eth}, {Name: "SOL", Closes: sol}} + snapshot(t, "compare_symbol", 640, 360, func(c *ui.Context) { + ui.Column(c).Padding(12).Gap(8).Children(func() { + CompareLegend(c, &cmp) + CandlestickChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "BTC", Height: 240}, Type: ChartLine, Compare: &cmp}) + }) + }) +} diff --git a/depth_chart.go b/depth_chart.go index 9d45717..770f8e1 100644 --- a/depth_chart.go +++ b/depth_chart.go @@ -2,6 +2,8 @@ package mujica import ( "fmt" + "math" + "sort" "strings" "github.com/egoist/mygo/ui" @@ -21,14 +23,14 @@ type DepthChartOptions struct { Decimals int } -// depthData is the book's cumulative sizes, bids then asks, from the mid outward. +// depthData holds cumulative bids and asks around the midpoint. type depthData struct { price, total []float64 nBids int mid, maxSize float64 } -// DepthChart draws cumulative bid and ask depth as stepped areas around the mid price; arrows walk the levels. +// DepthChart paints cumulative depth and supports keyboard level readouts. func DepthChart(c *ui.Context, bids, asks []DepthLevel, opts DepthChartOptions) ChartResult { dec := priceDecimals("DepthChart", opts.Decimals) ch := newChart(c, opts.Frame) @@ -36,6 +38,7 @@ func DepthChart(c *ui.Context, bids, asks []DepthLevel, opts DepthChartOptions) d := chartMemo(ch, "depth", [2]string{chartID(bids), chartID(asks)}, func() depthData { return depthBuild(bids, asks) }) bidCol, askCol := trendColor(c, 1), trendColor(c, -1) keys := []chartKey{{Name: msg(c, "depth_chart.bids"), Color: bidCol, Shape: 1}, {Name: msg(c, "depth_chart.asks"), Color: askCol, Shape: 3}} + drawn := ui.Local(ch.res.Element, "mujica.depth.drawn", func() int { return 0 }) size := FontSize(c, theme.CaptionSize) geom := func(r ui.Rect) (ui.Rect, internal.Linear, internal.Linear) { plot := chartInset(r, 56, 26) @@ -47,7 +50,7 @@ func DepthChart(c *ui.Context, bids, asks []DepthLevel, opts DepthChartOptions) if len(bids) == 0 || len(asks) == 0 { spec.n = 0 } - // Left and Right walk by price: lower bids to the left, higher asks to the right. + // Arrows move by ascending price. order := func(i int) int { if i < d.nBids { return d.nBids - 1 - i @@ -68,7 +71,12 @@ func DepthChart(c *ui.Context, bids, asks []DepthLevel, opts DepthChartOptions) if !plot.Contains(x, y) { return -1 } - return internal.Nearest(len(d.price), func(i int) (float32, float32) { return xs.Map(d.price[i]), 0 }, x, 0, plot.W, true) + v := xs.Invert(x) + pos := sort.Search(len(d.price), func(i int) bool { return d.price[order(i)] >= v }) + if pos == len(d.price) || pos > 0 && v-d.price[order(pos-1)] < d.price[order(pos)]-v { + pos-- + } + return order(pos) } spec.readout = func(i int) string { side := msg(c, "depth_chart.bid") @@ -90,6 +98,7 @@ func DepthChart(c *ui.Context, bids, asks []DepthLevel, opts DepthChartOptions) } internal.AxisX(p, plot, tx, tl, size, k) base := plot.Y + plot.H + *drawn = 0 for side, idx := range [][2]int{{0, d.nBids}, {d.nBids, len(d.price)}} { col := []ui.Color{bidCol, askCol}[side] var area, edge ui.Path @@ -97,7 +106,12 @@ func DepthChart(c *ui.Context, bids, asks []DepthLevel, opts DepthChartOptions) area.MoveTo(mx, base) edge.MoveTo(mx, base) prevY := base - for i := idx[0]; i < idx[1]; i++ { + indices := chartMemo(ch, fmt.Sprint("depth.indices.", side), [3]any{chartID(d.price), plot.X, plot.W}, func() []int { + return internal.Columns(idx[1]-idx[0], func(i int) float32 { return xs.Map(d.price[idx[0]+i]) }, func(i int) float64 { return d.total[idx[0]+i] }) + }) + *drawn += len(indices) + for _, at := range indices { + i := idx[0] + at x, y := internal.Snap(p, xs.Map(d.price[i])), internal.Snap(p, ys.Map(d.total[i])) area.LineTo(x, prevY).LineTo(x, y) edge.LineTo(x, prevY).LineTo(x, y) @@ -133,15 +147,15 @@ func DepthChart(c *ui.Context, bids, asks []DepthLevel, opts DepthChartOptions) return res } -// depthBuild checks the book's order and sums sizes outward from the mid. +// depthBuild validates price order and computes cumulative volume. func depthBuild(bids, asks []DepthLevel) depthData { for i, l := range bids { - if !(l.Size > 0) || i > 0 && !(l.Price < bids[i-1].Price) { + if math.IsNaN(l.Price) || math.IsInf(l.Price, 0) || math.IsInf(l.Size, 0) || !(l.Size > 0) || i > 0 && !(l.Price < bids[i-1].Price) { panic(fmt.Sprintf("mujica: DepthChart bid %d needs a positive size and a price below the one before", i)) } } for i, l := range asks { - if !(l.Size > 0) || i > 0 && !(l.Price > asks[i-1].Price) { + if math.IsNaN(l.Price) || math.IsInf(l.Price, 0) || math.IsInf(l.Size, 0) || !(l.Size > 0) || i > 0 && !(l.Price > asks[i-1].Price) { panic(fmt.Sprintf("mujica: DepthChart ask %d needs a positive size and a price above the one before", i)) } } diff --git a/docs/components/141-candlestick-chart.md b/docs/components/141-candlestick-chart.md new file mode 100644 index 0000000..4cfdd0e --- /dev/null +++ b/docs/components/141-candlestick-chart.md @@ -0,0 +1,42 @@ +# 141 CandlestickChart + +## 用途 + +K 线;涨跌色可配置(红涨或绿涨);缩放平移;万根级只绘可见区。 + +## 最小示例 + +```go + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +`candles` 按时间递增;`MarketView.Count=0` 显示 120 根,`End=0` 跟随最新。`Frame.Height=0` 为 240 DIP。`Type` 控制形态,`Decimals=0` 为两位。涨跌配色通过 `UseTrend` 设置。 + +## 状态 + +图表通过 Frame 显示默认、加载、空数据、错误和重试;祖先 Disabled 阻止输入;浅深主题沿用窗口设置。 + +## 事件 + +ChartResult.Point 提供读数索引;Changed 表示读数变化;Retried 表示重试。 + +## 键盘操作 + +Tab 聚焦图表;方向键移动数据读数并朗读;Home/End 到首尾;Escape 清除读数。行情主图通过 +/- 缩放、Shift+左右方向键平移。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/142-ohlc-chart.md b/docs/components/142-ohlc-chart.md new file mode 100644 index 0000000..733ae36 --- /dev/null +++ b/docs/components/142-ohlc-chart.md @@ -0,0 +1,42 @@ +# 142 OHLCChart + +## 用途 + +美国线;与 K 线共用数据接口。 + +## 最小示例 + +```go + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.OHLCChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +与 CandlestickChart 共用 Candle、MarketView 和 CandlestickOptions;函数将 Type 设置为 ChartOHLC。 + +## 状态 + +图表通过 Frame 显示默认、加载、空数据、错误和重试;祖先 Disabled 阻止输入;浅深主题沿用窗口设置。 + +## 事件 + +ChartResult.Point 提供读数索引;Changed 表示读数变化;Retried 表示重试。 + +## 键盘操作 + +Tab 聚焦图表;方向键移动数据读数并朗读;Home/End 到首尾;Escape 清除读数。行情主图通过 +/- 缩放、Shift+左右方向键平移。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/143-heikin-ashi-chart.md b/docs/components/143-heikin-ashi-chart.md new file mode 100644 index 0000000..3893d3c --- /dev/null +++ b/docs/components/143-heikin-ashi-chart.md @@ -0,0 +1,43 @@ +# 143 HeikinAshiChart + +## 用途 + +平均 K 线;由调用方 OHLC 计算;与原 K 线可切换。 + +## 最小示例 + +```go + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + raw := false + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.HeikinAshiChart(c, candles, &window, &raw, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +`raw=false` 显示 Heikin-Ashi;`raw=true` 显示原始数据。辅助函数 `HeikinAshi` 从调用方 OHLC 计算平滑序列。 + +## 状态 + +图表通过 Frame 显示默认、加载、空数据、错误和重试;祖先 Disabled 阻止输入;浅深主题沿用窗口设置。 + +## 事件 + +ChartResult.Point 提供读数索引;Changed 表示读数变化;Retried 表示重试。 + +## 键盘操作 + +Tab 聚焦图表;方向键移动数据读数并朗读;Home/End 到首尾;Escape 清除读数。行情主图通过 +/- 缩放、Shift+左右方向键平移。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/144-line-quote-chart.md b/docs/components/144-line-quote-chart.md new file mode 100644 index 0000000..7b610b2 --- /dev/null +++ b/docs/components/144-line-quote-chart.md @@ -0,0 +1,37 @@ +# 144 LineQuoteChart + +## 用途 + +分时图;昨收基线;均价线;盘前盘后分段。 + +## 最小示例 + +```go + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + points := []mujica.QuotePoint{{Time: at, Price: 101, Volume: 100}, {Time: at.Add(time.Hour), Price: 103, Volume: 200}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.LineQuoteChart(c, points, mujica.LineQuoteChartOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, PrevClose: 100, RegularOpen: at.Add(30 * time.Minute), RegularClose: at.Add(45 * time.Minute)}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +`PrevClose` 为必填正数;RegularOpen、RegularClose 成对提供,零值展示同一时段。均价使用 Price × Volume 累计。 + +## 状态 + +图表通过 Frame 显示默认、加载、空数据、错误和重试;祖先 Disabled 阻止输入;浅深主题沿用窗口设置。 + +## 事件 + +ChartResult.Point 提供读数索引;Changed 表示读数变化;Retried 表示重试。 + +## 键盘操作 + +Tab 聚焦图表;方向键移动数据读数并朗读;Home/End 到首尾;Escape 清除读数。行情主图通过 +/- 缩放、Shift+左右方向键平移。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/145-volume-chart.md b/docs/components/145-volume-chart.md new file mode 100644 index 0000000..9721a7e --- /dev/null +++ b/docs/components/145-volume-chart.md @@ -0,0 +1,42 @@ +# 145 VolumeChart + +## 用途 + +成交量柱;涨跌着色;与主图共享时间轴。 + +## 最小示例 + +```go + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.VolumeChart(c, candles, &window, mujica.VolumeChartOptions{Frame: mujica.ChartFrame{Label: "Volume"}}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +传入与主图相同的 MarketView 共享时间窗口;Frame.Height 默认 120;Sync 与 SyncID 可关联光标。 + +## 状态 + +图表通过 Frame 显示默认、加载、空数据、错误和重试;祖先 Disabled 阻止输入;浅深主题沿用窗口设置。 + +## 事件 + +ChartResult.Point 提供读数索引;Changed 表示读数变化;Retried 表示重试。 + +## 键盘操作 + +Tab 聚焦图表;方向键移动数据读数并朗读;Home/End 到首尾;Escape 清除读数。行情主图通过 +/- 缩放、Shift+左右方向键平移。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/146-depth-chart.md b/docs/components/146-depth-chart.md new file mode 100644 index 0000000..11cfcf1 --- /dev/null +++ b/docs/components/146-depth-chart.md @@ -0,0 +1,37 @@ +# 146 DepthChart + +## 用途 + +买卖深度累计面积;中间价;悬停读数。 + +## 最小示例 + +```go + bids := []mujica.DepthLevel{{Price: 99, Size: 10}, {Price: 98, Size: 20}} + asks := []mujica.DepthLevel{{Price: 101, Size: 15}, {Price: 102, Size: 25}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DepthChart(c, bids, asks, mujica.DepthChartOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +买盘价格递减,卖盘递增,Size 为正数;最优买价小于最优卖价。Decimals 默认两位。 + +## 状态 + +图表通过 Frame 显示默认、加载、空数据、错误和重试;祖先 Disabled 阻止输入;浅深主题沿用窗口设置。 + +## 事件 + +ChartResult.Point 提供读数索引;Changed 表示读数变化;Retried 表示重试。 + +## 键盘操作 + +Tab 聚焦图表;方向键移动数据读数并朗读;Home/End 到首尾;Escape 清除读数。行情主图通过 +/- 缩放、Shift+左右方向键平移。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/147-volume-profile.md b/docs/components/147-volume-profile.md new file mode 100644 index 0000000..14cb854 --- /dev/null +++ b/docs/components/147-volume-profile.md @@ -0,0 +1,36 @@ +# 147 VolumeProfile + +## 用途 + +价格分布成交量;价值区与控制点。 + +## 最小示例 + +```go + bins := []mujica.ProfileBin{{Low: 99, High: 100, Volume: 30}, {Low: 100, High: 101, Volume: 80}, {Low: 101, High: 102, Volume: 40}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.VolumeProfile(c, bins, mujica.VolumeProfileOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +ProfileBin 按价格递增排列;Volume 非负。ValueArea 默认 0.7;VolumeProfileOf 可按 OHLC 区间生成分布。 + +## 状态 + +图表通过 Frame 显示默认、加载、空数据、错误和重试;祖先 Disabled 阻止输入;浅深主题沿用窗口设置。 + +## 事件 + +ChartResult.Point 提供读数索引;Changed 表示读数变化;Retried 表示重试。 + +## 键盘操作 + +Tab 聚焦图表;方向键移动数据读数并朗读;Home/End 到首尾;Escape 清除读数。行情主图通过 +/- 缩放、Shift+左右方向键平移。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/148-multi-chart-layout.md b/docs/components/148-multi-chart-layout.md new file mode 100644 index 0000000..718ae22 --- /dev/null +++ b/docs/components/148-multi-chart-layout.md @@ -0,0 +1,38 @@ +# 148 MultiChartLayout + +## 用途 + +1、2、4、6 宫格多图;独立品种与周期;布局切换不丢状态。 + +## 最小示例 + +```go + state := mujica.MultiChartState{Count: 2} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.MultiChartLayout(c, &state, mujica.MultiChartLayoutOptions{Height: 200}, func(i int, cell *mujica.ChartCell) { + mujica.TextInput(c, &cell.Symbol, mujica.TextInputOptions{Label: "Symbol"}) + }) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +Count 支持 1、2、4、6,零值为 1;Cells 保存六个独立品种、周期与窗口;Active 指向可见单元。Height 默认 480。 + +## 状态 + +浅深主题沿用窗口设置;交互组件遵循祖先 Disabled;调用方持有选择及展开状态。 + +## 事件 + +ChoiceResult.Changed() 表示选择变化。 + +## 键盘操作 + +Tab 进入布局组,方向键移动焦点,Space 切换;Tab 进入各图表独立操作。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/149-chart-sync.md b/docs/components/149-chart-sync.md new file mode 100644 index 0000000..391f64f --- /dev/null +++ b/docs/components/149-chart-sync.md @@ -0,0 +1,44 @@ +# 149 ChartSync + +## 用途 + +多图十字光标与时间范围同步;可逐图解除。 + +## 最小示例 + +```go + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + var sync mujica.ChartSync + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + sync.Link(c, "price") + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Sync: &sync, SyncID: "price"}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +Count、Start、End 保存共享时间窗口;不同周期按时间边界映射;Cursor 保存时间光标;Unlinked 按稳定图表 ID 解联。通过 CandlestickOptions 或 VolumeChartOptions 的 Sync 接入。 + +## 状态 + +浅深主题沿用窗口设置;交互组件遵循祖先 Disabled;调用方持有选择及展开状态。 + +## 事件 + +ChoiceResult.Changed() 表示选择变化;ChartSync.Link 返回 ChoiceResult。 + +## 键盘操作 + +Tab 聚焦 Link 开关,Space 切换关联;图表方向键移动同步光标。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/150-time-range-selector.md b/docs/components/150-time-range-selector.md new file mode 100644 index 0000000..25cfaca --- /dev/null +++ b/docs/components/150-time-range-selector.md @@ -0,0 +1,36 @@ +# 150 TimeRangeSelector + +## 用途 + +1D、5D、1M、3M、YTD、1Y、5Y、自定义;键盘导航。 + +## 最小示例 + +```go + value := mujica.MarketRange{Preset: mujica.Range1M} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.TimeRangeSelector(c, &value, mujica.TimeRangeSelectorOptions{}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +MarketRange.Preset 默认 Range1D;Custom 保存 DateRange。Today 零值跟随系统日期,Bounds 使用调用方时间和时区。 + +## 状态 + +浅深主题沿用窗口设置;交互组件遵循祖先 Disabled;调用方持有选择及展开状态。 + +## 事件 + +ChoiceResult.Changed() 表示选择变化。 + +## 键盘操作 + +Tab 进入预设组,左右方向键移动焦点,Space 选择;自定义日期通过 DateRangePicker 键盘操作。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/151-interval-selector.md b/docs/components/151-interval-selector.md new file mode 100644 index 0000000..e64c82a --- /dev/null +++ b/docs/components/151-interval-selector.md @@ -0,0 +1,37 @@ +# 151 IntervalSelector + +## 用途 + +1m 至 1M 周期;分组;收藏周期。 + +## 最小示例 + +```go + value := mujica.Interval("1h") + favorites := []mujica.Interval{"1m", "1h", "1D"} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IntervalSelector(c, &value, &favorites, mujica.IntervalSelectorOptions{}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +value 为 Intervals 中的周期;favorites 保存收藏列表;Disabled 禁用选择与收藏。 + +## 状态 + +浅深主题沿用窗口设置;交互组件遵循祖先 Disabled;调用方持有选择及展开状态。 + +## 事件 + +ChoiceResult.Changed() 表示选择变化。 + +## 键盘操作 + +Tab 进入收藏组,方向键移动焦点,Space 选择;Tab 遍历弹层周期和收藏按钮,Enter 激活,Escape 关闭。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/152-chart-type-switcher.md b/docs/components/152-chart-type-switcher.md new file mode 100644 index 0000000..29d8291 --- /dev/null +++ b/docs/components/152-chart-type-switcher.md @@ -0,0 +1,36 @@ +# 152 ChartTypeSwitcher + +## 用途 + +K 线、美国线、折线、面积、平均 K 线切换。 + +## 最小示例 + +```go + value := mujica.ChartCandles + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ChartTypeSwitcher(c, &value, mujica.ChartTypeSwitcherOptions{}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +ChartType 默认 ChartCandles;支持 ChartOHLC、ChartLine、ChartArea、ChartHeikinAshi;Disabled 禁用操作。 + +## 状态 + +浅深主题沿用窗口设置;交互组件遵循祖先 Disabled;调用方持有选择及展开状态。 + +## 事件 + +ChoiceResult.Changed() 表示选择变化。 + +## 键盘操作 + +Tab 进入分组,左右方向键移动焦点,Space 选择。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/153-indicator-overlay.md b/docs/components/153-indicator-overlay.md new file mode 100644 index 0000000..00e4897 --- /dev/null +++ b/docs/components/153-indicator-overlay.md @@ -0,0 +1,43 @@ +# 153 IndicatorOverlay + +## 用途 + +主图叠加 MA、EMA、BOLL、VWAP;参数可配;计算由调用方或内置辅助函数。 + +## 最小示例 + +```go + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + overlays := []mujica.IndicatorOverlay{{Kind: mujica.IndicatorMA, Params: []float64{2}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Overlays: overlays}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +Kind 支持 MA、EMA、BOLL、VWAP;Params 为 nil 使用默认参数;Values 可覆盖内置计算,长度等于 candles,NaN 表示缺测。 + +## 状态 + +图表通过 Frame 显示默认、加载、空数据、错误和重试;祖先 Disabled 阻止输入;浅深主题沿用窗口设置。 + +## 事件 + +ChartResult.Point 提供读数索引;Changed 表示读数变化;Retried 表示重试。 + +## 键盘操作 + +Tab 聚焦图表;方向键移动数据读数并朗读;Home/End 到首尾;Escape 清除读数。行情主图通过 +/- 缩放、Shift+左右方向键平移。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/154-indicator-pane.md b/docs/components/154-indicator-pane.md new file mode 100644 index 0000000..0dbb6fb --- /dev/null +++ b/docs/components/154-indicator-pane.md @@ -0,0 +1,43 @@ +# 154 IndicatorPane + +## 用途 + +副图 MACD、RSI、KDJ、OBV;多副图堆叠与高度调整。 + +## 最小示例 + +```go + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + panes := mujica.IndicatorPanes{Panes: []mujica.IndicatorPaneSpec{{Kind: mujica.IndicatorRSI, Params: []float64{2}}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IndicatorPane(c, candles, &window, &panes, mujica.IndicatorPaneOptions{Height: 200, Label: "BTC"}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +Panes 为 MACD、RSI、KDJ、OBV 配置;Sizes 保存高度比例;Height 默认每副图 140 DIP,最小高度覆盖标题、图例、读数和 40 DIP 绘图区;Label 为无障碍名称前缀;Status、Error、Empty 设置等尺寸占位。 + +## 状态 + +浅深主题沿用窗口设置;交互组件遵循祖先 Disabled;调用方持有选择及展开状态。 + +## 事件 + +IndicatorPaneResult.Removed 为移除索引,默认 -1;Resized 表示高度调整完成;Point、Pane 为活跃读数和副图索引,PointChanged 表示读数变化。 + +## 键盘操作 + +Tab 聚焦图表;方向键移动数据读数并朗读;Home/End 到首尾;Escape 清除读数。主图与副图通过 +/- 缩放、Shift+左右方向键平移。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/155-indicator-selector.md b/docs/components/155-indicator-selector.md new file mode 100644 index 0000000..f9fa444 --- /dev/null +++ b/docs/components/155-indicator-selector.md @@ -0,0 +1,37 @@ +# 155 IndicatorSelector + +## 用途 + +指标搜索、添加、移除、参数编辑。 + +## 最小示例 + +```go + var overlays []mujica.IndicatorOverlay + var panes mujica.IndicatorPanes + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IndicatorSelector(c, &overlays, &panes, mujica.IndicatorSelectorOptions{}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +overlays 与 panes 均由调用方持有;添加默认参数,可搜索、移除和编辑。Disabled 关闭面板并阻止编辑。 + +## 状态 + +浅深主题沿用窗口设置;交互组件遵循祖先 Disabled;调用方持有选择及展开状态。 + +## 事件 + +ChoiceResult.Changed() 表示选择变化。 + +## 键盘操作 + +Tab 聚焦按钮,Enter 打开;Tab 到搜索和参数字段;方向键步进参数;Escape 关闭。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/156-drawing-tools.md b/docs/components/156-drawing-tools.md new file mode 100644 index 0000000..bd3e095 --- /dev/null +++ b/docs/components/156-drawing-tools.md @@ -0,0 +1,43 @@ +# 156 DrawingTools + +## 用途 + +趋势线、水平线、斐波那契、矩形、文字标注;选中、移动、删除、撤销。 + +## 最小示例 + +```go + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + drawings := mujica.DrawingTools{Tool: mujica.ToolTrendLine} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Drawings: &drawings}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +Items 保存时间和价格锚点;Tool 默认选择工具;Text 为文字标注内容;Locked 阻止编辑;Selected、Delete、Undo、Clear 管理画线。 + +## 状态 + +图表通过 Frame 显示默认、加载、空数据、错误和重试;祖先 Disabled 阻止输入;浅深主题沿用窗口设置。 + +## 事件 + +ChartResult.Point 提供读数索引;Changed 表示读数变化;Retried 表示重试。 + +## 键盘操作 + +聚焦图表后方向键移动读数;Enter 在当前读数放置锚点,双点工具按两次 Enter;Alt+Enter 循环选择画线;点击放置锚点;Alt+方向键移动选中画线;Delete/Backspace 删除;Command/Ctrl+Z 撤销;Escape 取消。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 图形锚点使用已有 Candle 时间。 diff --git a/docs/components/157-drawing-toolbar.md b/docs/components/157-drawing-toolbar.md new file mode 100644 index 0000000..931b8a5 --- /dev/null +++ b/docs/components/157-drawing-toolbar.md @@ -0,0 +1,36 @@ +# 157 DrawingToolbar + +## 用途 + +画线工具栏;当前工具;锁定与清除;键盘快捷键提示。 + +## 最小示例 + +```go + var drawings mujica.DrawingTools + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DrawingToolbar(c, &drawings, mujica.DrawingToolbarOptions{Horizontal: true}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +传入 DrawingTools;Horizontal=true 横向,默认纵向;工具名称附快捷键提示。 + +## 状态 + +浅深主题沿用窗口设置;交互组件遵循祖先 Disabled;调用方持有选择及展开状态。 + +## 事件 + +ChoiceResult.Changed() 表示选择变化。 + +## 键盘操作 + +Tab 进入工具栏;方向键移动焦点,Enter 激活;Alt+1 至 Alt+6 选择工具。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/158-compare-symbol.md b/docs/components/158-compare-symbol.md new file mode 100644 index 0000000..8774375 --- /dev/null +++ b/docs/components/158-compare-symbol.md @@ -0,0 +1,44 @@ +# 158 CompareSymbol + +## 用途 + +叠加对比品种;百分比归一;序列颜色与移除。 + +## 最小示例 + +```go + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + symbols := []mujica.CompareSymbol{{Name: "ETH", Closes: []float64{20, 21, 23}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CompareLegend(c, &symbols) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Compare: &symbols}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +Name 为稳定品种名称;Closes 与主图逐根对齐,正数或 NaN;CompareLegend 提供形状图例和移除。 + +## 状态 + +图表通过 Frame 显示默认、加载、空数据、错误和重试;祖先 Disabled 阻止输入;浅深主题沿用窗口设置。 + +## 事件 + +ChartResult.Point 提供读数索引;Changed 表示读数变化;Retried 表示重试。 + +## 键盘操作 + +Tab 聚焦图表;方向键移动数据读数并朗读;Home/End 到首尾;Escape 清除读数。行情主图通过 +/- 缩放、Shift+左右方向键平移。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/components/159-price-alert-line.md b/docs/components/159-price-alert-line.md new file mode 100644 index 0000000..67175ea --- /dev/null +++ b/docs/components/159-price-alert-line.md @@ -0,0 +1,47 @@ +# 159 PriceAlertLine + +## 用途 + +价格预警线;拖动调整;触发回调;不自行通知。 + +## 最小示例 + +```go + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + alerts := []mujica.PriceAlertLine{{ID: "take-profit", Price: 105}} + triggered := "" + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Alerts: &alerts, OnAlert: func(alert mujica.PriceAlertLine, last mujica.Candle) { + triggered = alert.ID + }}) + ui.Text(c, triggered) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +ID 为唯一非空字符串;Price 为有限价格;Label 可选。CandlestickOptions.Alerts 接入主图;OnAlert 接收预警和最新 Candle。 + +## 状态 + +图表通过 Frame 显示默认、加载、空数据、错误和重试;祖先 Disabled 阻止输入;浅深主题沿用窗口设置。 + +## 事件 + +ChartResult.Point 提供读数索引;Changed 表示读数变化;Retried 表示重试。 OnAlert 在最新收盘价格跨线时触发一次;拖动直接更新 Alerts。 + +## 键盘操作 + +聚焦图表后方向键查看价格;PageUp/PageDown 选择预警线;Alt+上下方向键按价格精度步进;拖动预警线调整价格。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 百分比对比模式展示归一后的品种曲线,预警使用价格模式。 diff --git a/docs/components/160-candle-countdown.md b/docs/components/160-candle-countdown.md new file mode 100644 index 0000000..9023ad9 --- /dev/null +++ b/docs/components/160-candle-countdown.md @@ -0,0 +1,35 @@ +# 160 CandleCountdown + +## 用途 + +当前 K 线收盘倒计时;随周期变化;隐藏时停止计时重绘。 + +## 最小示例 + +```go + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandleCountdown(c, "1h", mujica.CandleCountdownOptions{Location: time.UTC}) + } + ui.Render(view, 640, 400, 1) +``` + +## 参数 + +interval 为 Intervals 中的周期;Location 默认 UTC;Now 零值读取帧时钟,指定值冻结时间。 + +## 状态 + +随周期和时间更新;指定 Now 显示冻结读数;移出可见区域停止安排计时帧。 + +## 事件 + +返回 Element;时间由帧时钟或调用方指定。 + +## 键盘操作 + +展示型组件;周期由调用方选择控件调整。 + +## 限制 + +数据由调用方提供;更新数据时替换切片,缓存按切片身份失效。行情读取、交易及持久化由调用方负责。 diff --git a/docs/prd/ext-1.md b/docs/prd/ext-1.md deleted file mode 100644 index 4726b5c..0000000 --- a/docs/prd/ext-1.md +++ /dev/null @@ -1,232 +0,0 @@ -# MujicaUI PRD 扩展一:101—280 - -版本:1.1 -日期:2026-10-05 -来源:ELY GPUI 组件清单(`Ely-GPUI-Components/gpui-components.md`)中与本库路线相符的条目。 - -本扩展沿用 PRD 第 2、3、5、6、8、9、10 节的全部规则。每行一个公开组件;子部件、变体、尺寸不单独计数。图表、行情与媒体组件以 MyGo Painter 绘制,不建图表引擎、音视频解码或富文本编辑引擎:数据、帧与解码由调用方提供。 - -## 4.12 通用图表一 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 101 | LineChart | 多序列折线;数值与时间轴;缺值断开;悬停读数;序列显隐。 | -| 102 | AreaChart | 面积图;单序列与堆叠;基线可配置;悬停读数。 | -| 103 | BarChart | 纵横向柱状;分组与堆叠;负值;柱标签;键盘逐柱读数。 | -| 104 | PieChart | 饼图与环形;扇区标签;最小角合并为“其他”;中心总计。 | -| 105 | ScatterChart | 散点;点大小映射(气泡);分组颜色;框选。 | -| 106 | RadarChart | 多维雷达;多序列;刻度环;悬停读数。 | -| 107 | HeatmapChart | 二维矩阵热力;色阶图例;单元格读数;空值样式。 | -| 108 | CalendarHeatmap | 按日贡献图;年份切换;周起始可配置;色阶与读数。 | -| 109 | Histogram | 分箱计数;箱宽与箱数可配置;累计模式。 | -| 110 | BoxPlot | 四分位、须线、离群点;多组对比。 | -| 111 | WaterfallChart | 增减累计;小计与总计柱;正负语义色。 | -| 112 | FunnelChart | 漏斗阶段;转化率;阶段读数。 | -| 113 | BulletChart | 实际值、目标值、区间带;纵横向。 | -| 114 | Sparkline | 行内迷你折线、柱形与面积;末值标记;无坐标轴。 | -| 115 | Gauge | 半圆或整圆仪表;阈值分段;数值与单位;不能只靠颜色表达区间。 | -| 116 | Treemap | 层级矩形;点击下钻与返回;标签按面积省略。 | -| 117 | Sunburst | 层级环形;下钻;路径面包屑。 | -| 118 | SankeyChart | 节点与流量带;悬停高亮路径;节点排序稳定。 | -| 119 | NetworkGraph | 节点与边;调用方给定或简单力导布局;拖动节点;缩放平移。 | -| 120 | RealtimeChart | 实时追加数据;固定窗口滚动;暂停;隐藏时停止重绘。 | - -## 4.13 通用图表二与图表部件 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 121 | ChartLegend | 序列图例;点击显隐;键盘切换;横纵布局与溢出折叠。 | -| 122 | ChartTooltip | 跟随指针或焦点的读数浮层;多序列同点读数;边缘避让。 | -| 123 | ChartCrosshair | 十字光标;轴上读数标签;吸附最近数据点。 | -| 124 | ChartAxis | 数值、时间、类别轴;刻度自动与指定;格式化函数;对数轴。 | -| 125 | ChartGrid | 网格线;主次刻度;按设备像素对齐。 | -| 126 | ChartBrush | 区间选择与缩放;拖动、调整两端;键盘移动;回调区间。 | -| 127 | ChartAnnotation | 水平线、垂直线、区间带与文字标注;拖动可选。 | -| 128 | ChartExport | 以当前主题渲染图表为 PNG 字节;尺寸与缩放可配置;不写文件。 | -| 129 | ViolinPlot | 核密度轮廓;中位数与四分位;多组。 | -| 130 | ParallelCoordinates | 多维平行轴;轴上刷选;线高亮。 | -| 131 | ChordDiagram | 关系矩阵弦图;悬停高亮;组弧标签。 | -| 132 | SparkBar | 行内迷你柱;正负值;高亮末项。 | -| 133 | TrendIndicator | 趋势箭头与变化值;正负语义;不只靠颜色。 | -| 134 | MetricCard | 指标名、值、变化、迷你图插槽;加载与错误状态。 | -| 135 | ProgressChart | 多目标完成度环或条;目标线;百分比读数。 | -| 136 | StackedPercentBar | 百分比堆叠条;分段标签;悬停读数。 | -| 137 | DualAxisChart | 左右双轴组合(柱与线);各自刻度与格式。 | -| 138 | DensityPlot | 一维核密度曲线;带宽可配置;多组叠加。 | -| 139 | QuadrantChart | 四象限散点;象限标题与中线可配置。 | -| 140 | ChartEmptyState | 图表的无数据、加载、错误与重试占位;保持图表尺寸。 | - -## 4.14 行情图表与技术分析 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 141 | CandlestickChart | K 线;涨跌色可配置(红涨或绿涨);缩放平移;万根级只绘可见区。 | -| 142 | OHLCChart | 美国线;与 K 线共用数据接口。 | -| 143 | HeikinAshiChart | 平均 K 线;由调用方 OHLC 计算;与原 K 线可切换。 | -| 144 | LineQuoteChart | 分时图;昨收基线;均价线;盘前盘后分段。 | -| 145 | VolumeChart | 成交量柱;涨跌着色;与主图共享时间轴。 | -| 146 | DepthChart | 买卖深度累计面积;中间价;悬停读数。 | -| 147 | VolumeProfile | 价格分布成交量;价值区与控制点。 | -| 148 | MultiChartLayout | 1、2、4、6 宫格多图;独立品种与周期;布局切换不丢状态。 | -| 149 | ChartSync | 多图十字光标与时间范围同步;可逐图解除。 | -| 150 | TimeRangeSelector | 1D、5D、1M、3M、YTD、1Y、5Y、自定义;键盘导航。 | -| 151 | IntervalSelector | 1m 至 1M 周期;分组;收藏周期。 | -| 152 | ChartTypeSwitcher | K 线、美国线、折线、面积、平均 K 线切换。 | -| 153 | IndicatorOverlay | 主图叠加 MA、EMA、BOLL、VWAP;参数可配;计算由调用方或内置辅助函数。 | -| 154 | IndicatorPane | 副图 MACD、RSI、KDJ、OBV;多副图堆叠与高度调整。 | -| 155 | IndicatorSelector | 指标搜索、添加、移除、参数编辑。 | -| 156 | DrawingTools | 趋势线、水平线、斐波那契、矩形、文字标注;选中、移动、删除、撤销。 | -| 157 | DrawingToolbar | 画线工具栏;当前工具;锁定与清除;键盘快捷键提示。 | -| 158 | CompareSymbol | 叠加对比品种;百分比归一;序列颜色与移除。 | -| 159 | PriceAlertLine | 价格预警线;拖动调整;触发回调;不自行通知。 | -| 160 | CandleCountdown | 当前 K 线收盘倒计时;随周期变化;隐藏时停止计时重绘。 | - -## 4.15 报价、盘口与交易 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 161 | TickerTape | 滚动行情条;悬停与聚焦暂停;减少动画时静态分页。 | -| 162 | QuoteCard | 代码、名称、现价、涨跌、迷你图插槽。 | -| 163 | PriceText | 价格精度与千分位;涨跌色;变化闪烁一次(减少动画时无闪烁)。 | -| 164 | PriceChangeBadge | 涨跌额与幅度;箭头与符号;不只靠颜色。 | -| 165 | OrderBook | 买卖档位;深度条;价格聚合档位;点击价格回传。 | -| 166 | Level2Quotes | 多档买卖与委托量;逐档变化高亮。 | -| 167 | TimeAndSales | 逐笔成交;大单标记;虚拟化;暂停跟随。 | -| 168 | DepthLadder | 价格阶梯(DOM);买卖量列;当前价居中;点击下单回调。 | -| 169 | SpreadIndicator | 买卖价差与百分比;阈值提示。 | -| 170 | BidAskBar | 买卖力量对比条;数值标签。 | -| 171 | OrderEntry | 限价、市价、止损、条件单;数量、价格、有效期;校验与预估金额;提交防重入。 | -| 172 | QuickTradeButtons | 快速买卖;数量预设;危险操作确认可配置。 | -| 173 | PositionTable | 持仓;成本、市值、浮动盈亏;平仓操作回调;稳定行 ID。 | -| 174 | OrderTable | 委托;状态筛选;撤单回调;部分成交进度。 | -| 175 | TradeHistoryTable | 成交记录;时间范围筛选;导出回调。 | -| 176 | PnLDisplay | 已实现、未实现、当日盈亏;正负语义;隐私遮蔽切换。 | -| 177 | LeverageSlider | 杠杆档位;风险提示区间;确认后生效。 | -| 178 | MarginIndicator | 保证金率;警戒与强平线;不只靠颜色。 | -| 179 | RiskMeter | 风险等级刻度与说明文字。 | -| 180 | OrderConfirmDialog | 下单摘要与风险提示;默认聚焦取消;二次确认可配置。 | - -## 4.16 市场与资产 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 181 | OptionChain | 行权价居中的认购认沽表;到期日切换;价内高亮。 | -| 182 | GreeksTable | Delta、Gamma、Theta、Vega、Rho;精度与说明。 | -| 183 | PayoffDiagram | 期权组合到期损益;盈亏平衡点;当前价标记。 | -| 184 | Watchlist | 自选分组;拖动排序;实时刷新不丢选择;列可配置。 | -| 185 | SymbolSearch | 代码与名称搜索;市场筛选;最近搜索;异步结果由调用方提供。 | -| 186 | SymbolBadge | 代码、市场、类型标签;可点击。 | -| 187 | MarketHeatmap | 板块与个股热力;面积映射市值;涨跌色阶;下钻。 | -| 188 | Screener | 条件构建(字段、比较、值);结果表;保存条件回调。 | -| 189 | MarketOverview | 指数卡片组与涨跌家数;时间戳。 | -| 190 | IndexCard | 指数现价、涨跌、迷你图。 | -| 191 | MarketStatus | 开盘、收盘、盘前、盘后、休市;下一状态时间。 | -| 192 | TradingSessionClock | 多市场交易时段时钟;时区由调用方指定。 | -| 193 | EconomicCalendar | 经济事件;重要性;预期、前值、实际;国家筛选。 | -| 194 | EarningsCalendar | 财报日程;盘前盘后;预期与实际。 | -| 195 | NewsFeed | 新闻流;来源、时间、相关代码;已读状态;虚拟化。 | -| 196 | SentimentGauge | 情绪刻度(恐惧到贪婪);数值与文字。 | -| 197 | PortfolioSummary | 总资产、当日盈亏、累计收益;分账户。 | -| 198 | AssetAllocationChart | 资产配置环形与列表;目标与偏离。 | -| 199 | PerformanceChart | 收益曲线、基准对比、最大回撤区间。 | -| 200 | CurrencyConverter | 币种选择与互换;汇率由调用方提供;精度规则。 | - -## 4.17 AI 对话:消息 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 201 | ChatContainer | 消息区、输入区、侧栏插槽;新消息自动滚底,用户上翻时停止跟随。 | -| 202 | MessageList | 虚拟化消息列表;稳定消息 ID;新消息提示;按日期分隔。 | -| 203 | MessageBubble | 用户、助手、系统、错误四种;头像与名称插槽;宽度限制。 | -| 204 | MessageHeader | 模型名、时间、状态。 | -| 205 | StreamingText | 流式追加文本;平滑出字可关闭;流式光标;减少动画时直接显示。 | -| 206 | MarkdownView | Markdown 子集渲染:标题、段落、强调、列表、引用、链接、代码、表格、分隔线;流式增量渲染不重排已完成块。 | -| 207 | CodeBlock | 语言标签、行号、基础语法着色、复制、折叠、换行切换。 | -| 208 | TableBlock | 消息内表格;横向滚动;复制为 TSV。 | -| 209 | ImageGrid | 1 至 9 张图片网格;点击打开 ImageViewer;加载与失败。 | -| 210 | FileMessage | 文件名、类型图标、大小、打开与下载回调。 | -| 211 | AudioMessage | 语音条;波形;播放进度;时长;播放由调用方驱动。 | -| 212 | LinkPreviewCard | 标题、描述、站点、缩略图;元数据由调用方提供。 | -| 213 | QuoteReply | 引用原消息摘要;点击跳转原消息。 | -| 214 | MessageActions | 复制、重新生成、编辑、赞、踩、朗读、分享;按角色显示。 | -| 215 | MessageEditor | 编辑已发送消息;保存与取消;保存后产生新分支回调。 | -| 216 | BranchNavigator | 分支切换(< 2/3 >);键盘操作。 | -| 217 | ErrorMessage | 失败原因、重试;限流倒计时(RateLimit);不吞掉原错误文本。 | -| 218 | ThinkingBlock | 可折叠思考过程;思考中动画与耗时;默认折叠可配置。 | -| 219 | ScrollToBottomButton | 离开底部时出现;未读计数;点击回到底部。 | -| 220 | TypingIndicator | 对方正在输入三点动画;减少动画时显示静态文字。 | - -## 4.18 AI 对话:输入与引用 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 221 | PromptComposer | 多行输入;Enter 发送、Shift+Enter 换行可配置;输入法组合期间不发送;附件与工具插槽。 | -| 222 | AttachmentChip | 附件名、类型、大小、上传进度、移除;失败重试。 | -| 223 | PasteImagePreview | 粘贴或拖入图片的预览缩略图;移除。 | -| 224 | DragDropOverlay | 拖入文件时的全区域遮罩与提示;类型检查回调。 | -| 225 | VoiceInputButton | 录音开始与停止;录音时长;权限失败提示;录音由调用方实现。 | -| 226 | VoiceWaveform | 输入电平波形;静音提示。 | -| 227 | SlashCommandMenu | 输入“/”弹出命令;筛选;方向键选择;Tab 补全。 | -| 228 | ContextMentionMenu | 输入“@”选择文件、文档、网页等上下文;分组;异步结果。 | -| 229 | ContextChips | 已附加上下文列表;移除;溢出折叠。 | -| 230 | ModelSelector | 模型列表;能力标签与上下文长度;不可用项说明。 | -| 231 | ModeSelector | 对话、搜索、深度研究、Agent 模式切换。 | -| 232 | ToolToggleMenu | 联网、代码执行等工具开关;需授权项标记。 | -| 233 | ParameterPanel | 温度、Top-p、最大长度等参数;范围与默认值;重置。 | -| 234 | TokenCounter | 当前输入 token 数与上限;估算值由调用方提供。 | -| 235 | ContextWindowMeter | 上下文使用率条;分段(系统、历史、附件);阈值警告。 | -| 236 | SendButton | 发送与停止两态;禁用条件;快捷键提示。 | -| 237 | CitationBadge | 行内引用编号;悬停预览来源;点击定位来源。 | -| 238 | SourceCard | 来源标题、站点、摘要、时间;打开回调。 | -| 239 | SourcesPanel | 来源列表;按引用顺序;与正文引用联动高亮。 | -| 240 | SearchProgress | 搜索中关键词与已读来源数;阶段列表;完成后折叠。 | - -## 4.19 AI 对话:会话与引导 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 241 | ConversationList | 按今天、昨天、7 天内、更早分组;置顶;虚拟化。 | -| 242 | ConversationItem | 标题、时间、重命名、删除、置顶、导出回调;行内重命名。 | -| 243 | ConversationSearch | 标题与内容搜索;匹配高亮;异步结果。 | -| 244 | ProjectList | 项目与文件夹;会话归属;拖动移入。 | -| 245 | ProjectKnowledgePanel | 项目知识文件列表;添加、移除、容量提示。 | -| 246 | WelcomeScreen | 问候、能力卡片、起始提示插槽。 | -| 247 | SuggestionChips | 起始提示与追问建议;点击填入或直接发送可配置。 | -| 248 | PromptLibrary | 提示模板分类、搜索、预览、插入;变量占位符填写。 | -| 249 | CapabilityCards | 能力说明卡片;点击示例。 | -| 250 | FeedbackForm | 赞踩后的原因选项与文字;提交与取消。 | -| 251 | DateSeparator | 消息日期分隔;今天、昨天与日期格式本地化。 | -| 252 | ThinkingIndicator | 思考中状态动画与阶段文字;减少动画时静态。 | -| 253 | StopGeneratingButton | 停止生成;生成结束后隐藏;快捷键。 | -| 254 | SystemPromptEditor | 系统提示多行编辑;字数;恢复默认;未保存标记。 | -| 255 | CostEstimator | 输入、输出 token 与费用估算;单价由调用方提供。 | -| 256 | SharedConversationView | 只读会话视图;分享者与时间;复制链接回调。 | -| 257 | ConversationExport | 导出为 Markdown、JSON、纯文本;范围选择;内容由组件生成,写文件由调用方完成。 | -| 258 | RegenerateMenu | 重新生成;换模型重试;更长、更短等变体选项。 | -| 259 | ArtifactCard | 消息内产物卡片(代码、文档、网页);打开产物面板回调。 | -| 260 | ChatEmptyState | 新会话、无搜索结果、离线三种空状态。 | - -## 4.20 AI Agent 与工具调用 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 261 | ToolCallCard | 工具名、参数、结果、耗时、状态;参数与结果折叠;JSON 高亮。 | -| 262 | ToolCallGroup | 连续调用折叠为一组;总耗时与失败数。 | -| 263 | ToolApprovalDialog | 执行前审批;参数预览;允许、拒绝;默认聚焦拒绝。 | -| 264 | PermissionPrompt | 允许一次、始终允许、拒绝;作用范围说明。 | -| 265 | AgentStepList | 执行步骤时间线;当前步;步骤展开详情;失败步重试回调。 | -| 266 | AgentPlan | 计划清单;实时勾选;新增与跳过项;进度。 | -| 267 | AgentStatus | 规划中、执行中、等待、完成、失败;不只靠颜色;状态动画可关闭。 | -| 268 | AgentProgress | 总体进度与当前动作文字;不确定模式。 | -| 269 | SubAgentTree | 子 Agent 层级;各自状态;展开查看。 | -| 270 | FileChangeCard | 文件变更预览;增删统计;接受与拒绝;打开差异。 | -| 271 | MultiFileDiffReview | 多文件审阅;逐文件接受拒绝;全部接受;进度。 | -| 272 | CommandExecutionCard | 命令、工作目录、输出(ANSI)、退出码、耗时;中止回调。 | -| 273 | ScreenshotStream | Agent 画面帧序列查看;帧由调用方提供;暂停与逐帧。 | -| 274 | ArtifactPanel | 产物面板;代码、文档、网页预览插槽;复制与导出回调。 | -| 275 | ArtifactVersionSwitcher | 产物版本切换与差异入口。 | -| 276 | SandboxStatus | 沙箱运行状态、资源与剩余时间。 | -| 277 | MCPServerList | 服务器列表;连接状态;启停与重连回调;工具数。 | -| 278 | MemoryPanel | 记忆条目列表;搜索;编辑与删除。 | -| 279 | CheckpointList | 检查点;回滚确认;当前点标记。 | -| 280 | HumanInputRequest | Agent 请求用户输入;问题、选项与自由回答;超时提示。 | diff --git a/docs/prd/ext-2.md b/docs/prd/ext-2.md deleted file mode 100644 index c14aced..0000000 --- a/docs/prd/ext-2.md +++ /dev/null @@ -1,155 +0,0 @@ -# MujicaUI PRD 扩展二:281—400 - -版本:1.1 -日期:2026-10-05 -规则同扩展一。动画组件服从 PRD 3.4:状态过渡 120 毫秒、弹层 160 毫秒,不用弹跳与装饰性循环,减少动画模式直接切换或显示静态说明。 - -## 4.21 Agent 运维与动效 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 281 | InterruptButton | 中断运行中的 Agent;确认可配置;中断中状态。 | -| 282 | TokenUsageChart | 按会话或步骤的 token 用量柱线图;输入输出分色。 | -| 283 | CostBreakdown | 按模型、工具、步骤的费用分解表与合计。 | -| 284 | TraceViewer | 调用链树与时间轴;跨度耗时;选中查看属性。 | -| 285 | EvalResultTable | 评测用例、得分、通过与失败;差异查看回调。 | -| 286 | ToolRegistryPanel | 可用工具列表;参数模式预览;启停。 | -| 287 | DotsLoader | 三点加载;尺寸与说明;减少动画时静态。 | -| 288 | BarsLoader | 条形加载;同上。 | -| 289 | PulseLoader | 单点呼吸式加载;强度受限,不发光;减少动画时静态。 | -| 290 | OrbitLoader | 菱形环绕加载;与 Spinner 同一视觉语言。 | -| 291 | WaveLoader | 波形加载;同上。 | -| 292 | Shimmer | 占位扫光;仅用于加载中;减少动画时静态填充。 | -| 293 | CountUp | 数字从旧值过渡到新值;时长与精度;减少动画时直接显示。 | -| 294 | Typewriter | 逐字显示文本;速度;完成回调;跳过;减少动画时直接显示。 | -| 295 | ShimmerText | 处理中文字扫光(如“思考中”);减少动画时静态。 | -| 296 | Stagger | 子项依次进场;间隔可配;只在出现时执行一次。 | -| 297 | ReorderTransition | 列表重排时元素移动过渡;稳定键。 | -| 298 | LayoutTransition | 布局尺寸与位置变化过渡(FLIP)。 | -| 299 | Presence | 元素进出场过渡(淡入淡出、滑动、缩放);退出完成后移除。 | -| 300 | BlinkHighlight | 数值变化单次高亮;方向色;减少动画时改为静态标记。 | - -## 4.22 版本控制 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 301 | DiffViewer | 并排与统一视图;行号;增删高亮;折叠未变更区;大文件只构建可见行。 | -| 302 | InlineDiff | 行内词级差异高亮。 | -| 303 | ThreeWayMerge | 本地、基准、远端三栏与结果栏;逐块采纳。 | -| 304 | ConflictResolver | 冲突块列表;采纳当前、传入、两者;已解决计数。 | -| 305 | ChangesList | 暂存与未暂存分组;逐文件与全部暂存;状态标记。 | -| 306 | CommitInput | 提交标题与正文;标题长度提示;提交与修订;防重入。 | -| 307 | CommitGraph | 提交图谱泳道;分支与合并线;虚拟化。 | -| 308 | CommitList | 提交列表;作者、时间、哈希、消息;选择查看。 | -| 309 | BranchSelector | 本地与远端分支搜索选择;新建分支入口。 | -| 310 | BranchList | 分支列表;当前分支、上游、领先落后数;操作回调。 | -| 311 | TagList | 标签列表;注释;跳转提交。 | -| 312 | StashList | 贮藏列表;应用、弹出、删除回调。 | -| 313 | BlameView | 逐行作者与提交;同提交行合并;悬停详情。 | -| 314 | FileHistory | 单文件提交历史与差异入口。 | -| 315 | PullRequestCard | 标题、作者、状态、检查、评审人、差异统计。 | -| 316 | ReviewComment | 行级评审评论;回复;解决与重开。 | -| 317 | DiffStat | +增 −删 统计与比例条。 | -| 318 | GitStatusBadge | M、A、D、U、R、C 状态标记;不只靠颜色。 | -| 319 | CommandBlock | 命令分块(输入、输出、退出码、耗时);折叠;复制。 | -| 320 | AnsiText | ANSI 16 色、256 色、真彩与粗斜下划线渲染;未知序列原样保留并记录。 | - -## 4.23 终端、代码与调试 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 321 | Terminal | 终端网格:ANSI 光标移动与清屏、滚动缓冲、选择复制、输入回调;PTY 由调用方提供。 | -| 322 | TerminalTabs | 多终端标签;重命名;关闭确认。 | -| 323 | TerminalSearch | 滚动缓冲内搜索;匹配数与上下跳转。 | -| 324 | CommandHistory | 命令历史列表;搜索;重放回调。 | -| 325 | LogViewer | 日志级别过滤、跟随尾部、关键字高亮、虚拟化十万行。 | -| 326 | ProcessList | 进程表;CPU、内存排序;结束进程回调与确认。 | -| 327 | CodeViewer | 只读代码视图:行号、基础语法着色、折叠、当前行、选择复制;大文件虚拟化。 | -| 328 | Minimap | 代码缩略图;可见区框;拖动跳转。 | -| 329 | FindWidget | 查找与替换;大小写、整词、正则;匹配数。 | -| 330 | SearchPanel | 多文件搜索结果;按文件分组;匹配预览;包含与排除模式。 | -| 331 | ProblemsPanel | 错误、警告、信息列表;按文件分组;跳转回调。 | -| 332 | OutputPanel | 多通道输出;清空;跟随尾部。 | -| 333 | SymbolOutline | 符号大纲树;类型图标;筛选;跟随光标。 | -| 334 | CompletionMenu | 补全候选;类型图标与详情;方向键与 Tab 接受。 | -| 335 | DebugToolbar | 继续、单步、步入、步出、重启、停止;状态禁用规则。 | -| 336 | BreakpointList | 断点列表;启用开关;条件断点编辑。 | -| 337 | CallStack | 调用栈帧;当前帧;线程分组。 | -| 338 | VariablesPanel | 变量树形展开;值修改回调;变化高亮。 | -| 339 | HexViewer | 十六进制与 ASCII 对照;偏移列;选择同步;虚拟化。 | -| 340 | Flamegraph | 火焰图;点击放大子树;搜索高亮;耗时读数。 | - -## 4.24 媒体 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 341 | ImageCropper | 裁剪框;比例锁定;旋转 90 度;输出裁剪矩形。 | -| 342 | ImageAnnotator | 矩形、箭头、文字标注;选择与删除;导出标注数据。 | -| 343 | ImageThumbnail | 缩略图;比例裁切;选中与加载失败状态。 | -| 344 | Lightbox | 全窗图片浏览;左右切换;说明文字;Escape 关闭与焦点恢复。 | -| 345 | VideoPlayer | 帧由调用方提供的播放器外壳:播放、进度、倍速、字幕、全屏、画中画回调。 | -| 346 | VideoScrubber | 时间轴拖动;缓冲段;悬停时间与缩略图插槽。 | -| 347 | VideoThumbnailStrip | 缩略帧条;当前帧;点击跳转。 | -| 348 | AudioPlayer | 播放、暂停、进度、时长;播放由调用方驱动。 | -| 349 | AudioWaveform | 波形绘制;播放进度覆盖;区间选择。 | -| 350 | AudioSpectrum | 频谱柱;数据由调用方提供;隐藏时停止重绘。 | -| 351 | VolumeControl | 音量滑块与静音;方向键。 | -| 352 | PlaybackSpeedControl | 倍速选择 0.5×—2×。 | -| 353 | MediaControls | 上一首、播放、下一首、循环、随机;键盘。 | -| 354 | Playlist | 播放列表;当前项;拖动排序;移除。 | -| 355 | SubtitleEditor | 字幕条目时间与文本编辑;时间重叠校验。 | -| 356 | ScreenRecorderControls | 开始、暂停、停止、计时;录制由调用方实现。 | -| 357 | CameraPreview | 摄像头帧预览外壳;无信号状态;镜像切换。 | -| 358 | MicLevelMeter | 麦克风电平条;峰值保持。 | -| 359 | DeviceSelector | 麦克风、摄像头、扬声器选择;设备列表由调用方提供。 | -| 360 | ImageCompare | 前后对比滑块;键盘调整。 | - -## 4.25 项目与任务管理 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 361 | KanbanBoard | 列与卡片;拖动跨列移动与排序;列 WIP 上限;键盘移动卡片。 | -| 362 | TaskList | 任务列表;分组;完成过滤;虚拟化。 | -| 363 | TaskItem | 复选、标题、优先级、截止日期、负责人;行内编辑。 | -| 364 | TaskDetailPanel | 任务详情侧栏;字段编辑;活动记录插槽。 | -| 365 | SubtaskList | 子任务;进度;增删与排序。 | -| 366 | GanttChart | 任务条、依赖线、里程碑;拖动调整日期;今日线;时间缩放。 | -| 367 | Roadmap | 季度或月度路线图;泳道;条目拖动。 | -| 368 | SprintBoard | 迭代信息、剩余天数、看板。 | -| 369 | BurndownChart | 理想线与实际线;剩余工作量。 | -| 370 | PriorityIndicator | 紧急、高、中、低、无;图形与文字。 | -| 371 | StatusSelect | 工作流状态选择;状态分组。 | -| 372 | AssigneePicker | 成员搜索与多选;头像。 | -| 373 | DueDatePicker | 截止日期快捷项(今天、明天、下周)与日历;逾期标记。 | -| 374 | LabelManager | 标签创建、编辑颜色、删除、选择。 | -| 375 | IssueCard | 编号、标题、状态、优先级、负责人、标签。 | -| 376 | IssueIdBadge | ENG-123 样式编号;复制。 | -| 377 | MilestoneProgress | 里程碑完成度与日期。 | -| 378 | WorkloadView | 成员负载条;超载提示。 | -| 379 | TimeTracker | 计时开始停止;累计时长;手动修正。 | -| 380 | PomodoroTimer | 专注与休息周期;暂停;完成回调;隐藏时停止重绘。 | - -## 4.26 文件与协作 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 381 | FileExplorer | 文件夹树与文件列表组合;导航历史;选择。 | -| 382 | FileGrid | 文件网格视图;缩略图插槽;多选。 | -| 383 | FileIcon | 按扩展名与类型的图标;文件夹开合。 | -| 384 | FilePreview | 快速预览外壳:图片、文本、代码、不支持类型说明。 | -| 385 | PathBar | 路径分段;点击跳转;长路径中间折叠。 | -| 386 | RenameInline | 行内重命名;默认选中扩展名前部分;校验回调。 | -| 387 | FileOperationProgress | 复制、移动、删除进度;取消;冲突询问。 | -| 388 | TransferQueue | 上传下载队列;暂停、继续、重试、移除。 | -| 389 | StorageUsage | 存储占用分段条与明细。 | -| 390 | RecentFiles | 最近文件;时间分组;清除。 | -| 391 | ArchiveViewer | 压缩包条目树;大小与压缩率;条目由调用方提供。 | -| 392 | PresenceAvatars | 在线协作者头像;溢出计数;跟随入口。 | -| 393 | CommentThread | 评论与回复;编辑、删除、解决;提及插槽。 | -| 394 | Reactions | 表情回应与计数;添加回应选择器。 | -| 395 | ShareDialog | 分享对象、权限、链接复制回调。 | -| 396 | PermissionSelect | 可查看、可评论、可编辑。 | -| 397 | ActivityLog | 操作记录;按日分组;过滤。 | -| 398 | VersionHistory | 版本列表;预览与恢复回调;命名版本。 | -| 399 | LiveIndicator | 实时同步状态;断线提示。 | -| 400 | RemoteCursor | 远程光标与选区标记;姓名标签。 | diff --git a/docs/prd/ext-3.md b/docs/prd/ext-3.md deleted file mode 100644 index 003c5cd..0000000 --- a/docs/prd/ext-3.md +++ /dev/null @@ -1,130 +0,0 @@ -# MujicaUI PRD 扩展三:401—500 - -版本:1.1 -日期:2026-10-05 -规则同扩展一。账户类组件只负责界面与输入,不实现认证、不保存凭据;凭据只经调用方回调传出,不进日志、无障碍值或测试报告。 - -## 4.27 即时通讯与邮件 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 401 | ChannelList | 频道与私信;未读数、静音、置顶;分组折叠。 | -| 402 | ChatMessage | 连续消息合并、时间戳、编辑标记、回复与回应插槽。 | -| 403 | UnreadDivider | 未读分隔线与计数。 | -| 404 | ReadReceipt | 已发送、已送达、已读;多人已读头像。 | -| 405 | MemberList | 成员分组(在线、离线);角色。 | -| 406 | UserProfileCard | 头像、名称、状态、角色、操作插槽。 | -| 407 | OnlineStatus | 在线、离开、忙碌、离线;形状加文字。 | -| 408 | StatusSetter | 自定义状态文字与表情;清除时间。 | -| 409 | CallControls | 静音、摄像头、共享、挂断;状态与快捷键。 | -| 410 | VideoCallGrid | 参与者宫格;发言者高亮;帧由调用方提供。 | -| 411 | IncomingCallDialog | 来电接听与拒绝;默认聚焦拒绝可配置。 | -| 412 | EmojiPicker | 分类、搜索、最近使用、肤色。 | -| 413 | PinnedMessages | 置顶消息列表;跳转;取消置顶。 | -| 414 | ThreadPanel | 话题侧栏;原消息与回复。 | -| 415 | MailList | 未读粗体、星标、附件图标;多选;虚拟化。 | -| 416 | MailReader | 邮件头、正文(纯文本与安全子集)、附件。 | -| 417 | MailComposer | 收件人、抄送、密送、主题、正文、附件;草稿保存回调。 | -| 418 | RecipientInput | 收件人标签输入;地址校验;联系人建议。 | -| 419 | QuotedText | 引用文字折叠与展开。 | -| 420 | SnoozePicker | 稍后提醒快捷项与自定义时间。 | - -## 4.28 日历与时间 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 421 | CalendarMonthView | 月视图事件格;溢出“+N”;拖动改期。 | -| 422 | CalendarWeekView | 周视图时间网格;全天行;拖动创建与调整。 | -| 423 | CalendarDayView | 日视图;重叠事件并列。 | -| 424 | AgendaView | 日程列表;按日分组。 | -| 425 | YearView | 年视图;事件密度标记。 | -| 426 | EventChip | 事件块;颜色、时间、标题;截断。 | -| 427 | EventEditor | 标题、时间、地点、参与者、提醒、重复;校验。 | -| 428 | EventPopover | 事件摘要浮层;编辑、删除入口。 | -| 429 | CurrentTimeIndicator | 当前时间线;隐藏时停止更新。 | -| 430 | RecurrenceEditor | 每日、每周、每月、每年与自定义;结束条件。 | -| 431 | AvailabilityPicker | 空闲时段选择网格;多人重叠。 | -| 432 | TimezoneSelect | 时区搜索;偏移显示;常用时区。 | -| 433 | ReminderPicker | 提前提醒选项。 | -| 434 | AttendeeList | 参与者与回复状态。 | -| 435 | WeekPicker | 周选择;周起始可配置。 | -| 436 | DurationPicker | 时长输入(时分秒);范围。 | -| 437 | CronEditor | Cron 表达式编辑与可视化;校验;下次运行时间预览。 | -| 438 | RelativeTime | 相对时间文本;自动更新频率随时间远近;隐藏时停止。 | -| 439 | Countdown | 倒计时;结束回调;格式。 | -| 440 | Stopwatch | 秒表;计次;暂停与复位。 | - -## 4.29 仪表盘与开发工具 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 441 | DashboardGrid | 卡片网格;拖动与调整尺寸;布局保存回调。 | -| 442 | StatCard | 统计卡片;值、变化、迷你图;加载与错误。 | -| 443 | AlertList | 告警列表;级别、来源、时间;确认与静默回调。 | -| 444 | IncidentCard | 事件标题、状态、影响、时间线。 | -| 445 | UptimeBar | 按日可用性条;悬停详情。 | -| 446 | ServiceStatus | 服务状态列表;正常、降级、中断。 | -| 447 | LogStream | 实时日志流;暂停;级别过滤;虚拟化。 | -| 448 | TraceWaterfall | 请求瀑布图;跨度层级与耗时。 | -| 449 | ResourceGauge | CPU、内存、磁盘仪表;阈值。 | -| 450 | SystemMonitor | 多资源实时折线组合;采样数据由调用方提供。 | -| 451 | RefreshIntervalSelector | 刷新间隔选择;手动刷新。 | -| 452 | DashboardFilterBar | 时间范围、环境、标签过滤;清除。 | -| 453 | JsonViewer | JSON 树;展开折叠;路径复制;搜索。 | -| 454 | JsonEditor | JSON 文本编辑;格式化;解析错误定位。 | -| 455 | SchemaTree | 数据库、表、列、索引树。 | -| 456 | ApiRequestBuilder | 方法、URL、参数、请求头、正文;发送回调。 | -| 457 | ResponseViewer | 状态码、耗时、大小、正文(JSON 与文本)、响应头。 | -| 458 | KeyValueInput | 键值对行编辑;启用开关;增删。 | -| 459 | EnvironmentSelector | 环境切换;变量预览。 | -| 460 | RegexTester | 正则输入、测试文本、匹配高亮与分组;语法错误提示。 | - -## 4.30 设置、账户与引导 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 461 | SettingsLayout | 设置分区导航、分节、设置行(标签、说明、控件)。 | -| 462 | SettingsSearch | 设置项搜索;匹配高亮;跳转。 | -| 463 | ThemeSelector | 系统、浅色、深色预览卡选择。 | -| 464 | AccentColorPicker | 主色候选;对比度不足的候选标记。 | -| 465 | ShortcutRecorder | 录制快捷键;冲突提示;平台修饰键显示。 | -| 466 | KeyboardShortcutsList | 快捷键表;分组;搜索。 | -| 467 | LoginForm | 账号、密码、记住我;提交中与错误;凭据仅经回调传出。 | -| 468 | OAuthButtons | 第三方登录按钮组;名称由调用方提供,不使用商标图形。 | -| 469 | TwoFactorInput | 六位验证码;粘贴;重发倒计时。 | -| 470 | ProfileEditor | 头像、名称、简介;未保存标记。 | -| 471 | AccountSwitcher | 多账户切换;添加账户入口。 | -| 472 | WorkspaceSwitcher | 工作区搜索与切换。 | -| 473 | UserMenu | 用户头像菜单;状态、设置、退出。 | -| 474 | SessionList | 登录会话;设备与位置;注销其他会话回调。 | -| 475 | ApiKeyManager | 密钥列表;创建时只显示一次;撤销确认;明文不入日志。 | -| 476 | UsageQuota | 用量与配额条;重置时间。 | -| 477 | OnboardingWizard | 多步引导;进度;跳过;完成回调。 | -| 478 | Coachmark | 功能提示锚点;步骤导航;Escape 关闭。 | -| 479 | WhatsNewDialog | 更新内容列表;不再显示。 | -| 480 | FeedbackWidget | 反馈类型、文字、截图附件插槽;提交回调。 | - -## 4.31 通用补充 · 20 个 - -| 编号 | 组件 | 首版功能 | -| --- | --- | --- | -| 481 | SplitButton | 主操作与下拉菜单;两部分独立焦点。 | -| 482 | CopyButton | 复制并短暂显示已复制;屏幕阅读器播报。 | -| 483 | HoldToConfirm | 按住确认危险操作;进度;键盘按住空格;减少动画时显示计时文字。 | -| 484 | BulkActionBar | 多选后出现的批量操作条;选中数;清除选择。 | -| 485 | ScrubInput | 拖动标签调整数值;精度与范围;输入模式。 | -| 486 | CurrencyInput | 货币金额输入;币种符号;千分位;精度。 | -| 487 | MaskedInput | 格式掩码输入(电话、卡号等);输入法安全。 | -| 488 | MentionInput | @ 提及输入;候选;提及标记为整体删除。 | -| 489 | ChoiceChips | 单选或多选筛选芯片;键盘导航。 | -| 490 | Knob | 旋钮;拖动与方向键;刻度与数值。 | -| 491 | VerticalSlider | 纵向滑块;同 Slider 规则。 | -| 492 | ColorPalette | 预设色板;选择与键盘导航;自定义色入口。 | -| 493 | SignaturePad | 手写签名画板;清除;导出路径数据。 | -| 494 | Banner | 页面顶部横幅;信息、警告、错误;操作与关闭。 | -| 495 | UndoToast | 可撤销操作的消息;倒计时;撤销回调。 | -| 496 | Masonry | 瀑布流布局;列数随宽度;稳定键。 | -| 497 | ResizablePanelGroup | 多面板可调尺寸;最小值;折叠;尺寸保存回调。 | -| 498 | DockPanel | 可停靠面板区;拖动标签到边缘停靠;布局状态由调用方保存。 | -| 499 | QRCode | 文本生成二维码;纠错级别;尺寸;离线生成。 | -| 500 | ActivityFeed | 活动流;参与者、动作、对象、时间;按日分组。 | diff --git a/drawing_toolbar.go b/drawing_toolbar.go index 9341640..6dbaaf0 100644 --- a/drawing_toolbar.go +++ b/drawing_toolbar.go @@ -13,11 +13,11 @@ import ( // DrawingToolbarOptions configure a DrawingToolbar. type DrawingToolbarOptions struct { - // Horizontal lays the tools in a row; the default is a column beside the chart. + // Horizontal uses a row; the default uses a column. Horizontal bool } -// DrawingToolbar picks the drawing tool, locks, clears and undoes; Alt+1 to Alt+6 pick tools anywhere in the window. +// DrawingToolbar selects tools and manages lock, clear, and undo. func DrawingToolbar(c *ui.Context, d *DrawingTools, opts DrawingToolbarOptions) ChoiceResult { if d == nil { panic("mujica: DrawingToolbar needs drawings") @@ -38,6 +38,7 @@ func DrawingToolbar(c *ui.Context, d *DrawingTools, opts DrawingToolbarOptions) pick := func(t DrawingTool) { if !d.Locked && d.Tool != t && !bar.IsDisabled() { d.Tool, changed = t, true + d.pending, d.moving = nil, false slog.Debug("mujica: drawing_toolbar tool", "tool", t) } } @@ -85,12 +86,12 @@ func DrawingToolbar(c *ui.Context, d *DrawingTools, opts DrawingToolbarOptions) d.Tool = ToolSelect slog.Debug("mujica: drawing_toolbar lock", "locked", d.Locked) } - undo := iconAction(c, icons.Must("rotate-ccw"), msg(c, "drawing_toolbar.undo")).Tooltip(msg(c, "drawing_toolbar.undo")).Disabled(!d.CanUndo()) - if undo.Clicked() && d.Undo() { + undo := iconAction(c, icons.Must("rotate-ccw"), msg(c, "drawing_toolbar.undo")).Tooltip(msg(c, "drawing_toolbar.undo")).Disabled(d.Locked || !d.CanUndo()) + if undo.Clicked() && !bar.IsDisabled() && d.Undo() { changed = true } clear := iconAction(c, icons.Must("trash-2"), msg(c, "drawing_toolbar.clear")).Tooltip(msg(c, "drawing_toolbar.clear")).Disabled(d.Locked || len(d.Items) == 0) - if clear.Clicked() && d.Clear() { + if clear.Clicked() && !bar.IsDisabled() && d.Clear() { changed = true } }) @@ -107,7 +108,7 @@ func drawingToolGlyph(p *ui.Painter, r ui.Rect, t DrawingTool, col ui.Color) { path.MoveTo(cx-5, cy-7).LineTo(cx+5, cy+1).LineTo(cx, cy+1).LineTo(cx+3, cy+7).LineTo(cx+1, cy+8).LineTo(cx-2, cy+2).LineTo(cx-5, cy+5).Close() p.FillPath(&path, col) case ToolTrendLine: - p.Line(cx-s, cy+s, cx+s, cy-s, 1.5, col) + drawingStroke(p, cx-s, cy+s, cx+s, cy-s, 1.5, col) p.FillPath(internal.Diamond(cx-s, cy+s, 5), col) p.FillPath(internal.Diamond(cx+s, cy-s, 5), col) case ToolHorizontal: diff --git a/drawing_toolbar_test.go b/drawing_toolbar_test.go new file mode 100644 index 0000000..142cd0c --- /dev/null +++ b/drawing_toolbar_test.go @@ -0,0 +1,41 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "testing" +) + +func TestDrawingToolbarShortcutsLockAndDisabled(t *testing.T) { + d := DrawingTools{} + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Row(c).Disabled(disabled).Children(func() { DrawingToolbar(c, &d, DrawingToolbarOptions{Horizontal: true}) }) + }, 550, 90) + tt.Key(ui.Alt, ui.Key4) + if d.Tool != ToolFibonacci { + t.Fatalf("tool %v", d.Tool) + } + if err := tt.Click("Lock drawings"); err != nil { + t.Fatal(err) + } + tt.Key(ui.Alt, ui.Key3) + if !d.Locked || d.Tool != ToolSelect { + t.Fatal("locked tool changed") + } + if err := tt.Click("Unlock drawings"); err != nil { + t.Fatal(err) + } + disabled = true + tt.Frame() + tt.Key(ui.Alt, ui.Key2) + if d.Tool != ToolSelect { + t.Fatal("disabled tool changed") + } +} +func TestDrawingToolbarSnapshot(t *testing.T) { + d := DrawingTools{Tool: ToolTrendLine} + snapshot(t, "drawing_toolbar", 440, 90, func(c *ui.Context) { + ui.Row(c).Padding(12).Children(func() { DrawingToolbar(c, &d, DrawingToolbarOptions{Horizontal: true}) }) + }) +} diff --git a/drawing_tools.go b/drawing_tools.go index 7f30e8d..1a13889 100644 --- a/drawing_tools.go +++ b/drawing_tools.go @@ -10,7 +10,7 @@ import ( "github.com/egoist/mygo/ui" ) -// DrawingTool is what clicks on a price chart do. The zero value selects and moves drawings. +// DrawingTool selects annotation creation or selection behavior. type DrawingTool int const ( @@ -22,7 +22,7 @@ const ( ToolText ) -// DrawingPoint anchors a drawing at a candle time and a price, so it survives panning and new data. +// DrawingPoint anchors annotations to candle time and price. type DrawingPoint struct { Time time.Time Price float64 @@ -35,7 +35,7 @@ type Drawing struct { Text string } -// DrawingTools is the caller-held set of drawings, the current tool and an undo history. +// DrawingTools holds annotations, the current tool, and undo history. type DrawingTools struct { Items []Drawing Tool DrawingTool @@ -50,7 +50,7 @@ type DrawingTools struct { moving bool } -// fibLevels are the retracement ratios drawn between a Fibonacci's two points. +// fibLevels lists Fibonacci retracement ratios. var fibLevels = []float64{0, 0.236, 0.382, 0.5, 0.618, 0.786, 1} // Selected returns the selected drawing's index, or -1. @@ -63,10 +63,10 @@ func (d *DrawingTools) save() { d.undo = append(d.undo, slices.Clone(d.Items)) } -// Undo restores the drawings before the last change and reports whether there was one. +// Undo restores the preceding annotations unless locked. func (d *DrawingTools) Undo() bool { n := len(d.undo) - if n == 0 { + if d.Locked || n == 0 { return false } d.Items, d.undo = d.undo[n-1], d.undo[:n-1] @@ -103,12 +103,12 @@ func (t DrawingTool) twoPoint() bool { return t == ToolTrendLine || t == ToolFibonacci || t == ToolRectangle } -// point turns a plot position into a drawing point on the nearest candle. +// point maps plot coordinates onto the nearest candle. func (d *DrawingTools) point(m *mktCore, g mktGeom, x, y float32) DrawingPoint { return DrawingPoint{Time: m.candles[g.index(m, x)].Time, Price: m.priceAt(g.ys.Invert(y))} } -// priceAt turns an axis value back into a price, rounded to the decimals. +// priceAt resolves an axis value into a rounded price. func (m *mktCore) priceAt(v float64) float64 { if m.base != 0 { v = m.base * (1 + v/100) @@ -123,11 +123,19 @@ func (d *DrawingTools) xy(m *mktCore, g mktGeom, pt DrawingPoint) (float32, floa return g.x(m, i), g.ys.Map(m.val(pt.Price)) } -// input places, selects, drags, nudges and deletes drawings; it reports taking the pointer. +// input places, selects, moves, and deletes chart annotations. func (d *DrawingTools) input(m *mktCore, plot *ui.Element, g mktGeom, x, y float32, over, held bool, dx, dy float32) bool { if d.Tool < ToolSelect || d.Tool > ToolText { panic(fmt.Sprintf("mujica: unknown DrawingTool %d", d.Tool)) } + if d.pending != nil && d.pending.Tool != d.Tool { + d.pending, d.moving = nil, false + } + if plot.Shortcut(ui.Alt, ui.KeyEnter) && !d.Locked && len(d.Items) > 0 { + d.sel = d.sel%len(d.Items) + 1 + m.st.alertFocus = -1 + m.c.Announce(fmt.Sprintf(msg(m.c, "drawing_tools.selected"), d.sel)) + } if plot.Shortcut(ui.Cmd, ui.KeyZ) { d.Undo() } @@ -155,22 +163,7 @@ func (d *DrawingTools) input(m *mktCore, plot *ui.Element, g mktGeom, x, y float } if plot.Clicked() && d.Tool != ToolSelect { pt := d.point(m, g, x, y) - switch { - case d.Tool.twoPoint() && d.pending == nil: - d.pending = &Drawing{Tool: d.Tool, A: pt, B: pt} - default: - item := Drawing{Tool: d.Tool, A: pt, B: pt, Text: d.Text} - if d.pending != nil { - item.A = d.pending.A - } - if d.Tool == ToolText && item.Text == "" { - item.Text = msg(m.c, "drawing_tools.note") - } - d.save() - d.Items = append(slices.Clone(d.Items), item) - d.sel, d.pending, d.Tool = len(d.Items), nil, ToolSelect - slog.Debug("mujica: drawing_tools add", "tool", item.Tool) - } + d.place(m, pt) return true } if d.pending != nil { @@ -203,7 +196,7 @@ func (d *DrawingTools) input(m *mktCore, plot *ui.Element, g mktGeom, x, y float return true } -// nudge moves item i by candles and price, keeping it on the chart's candles. +// nudge moves annotations by candles and price. func (d *DrawingTools) nudge(m *mktCore, i, candles int, price float64) { it := &d.Items[i] move := func(pt *DrawingPoint) { @@ -214,7 +207,7 @@ func (d *DrawingTools) nudge(m *mktCore, i, candles int, price float64) { move(&it.B) } -// hit returns the drawing within 6 DIPs of (x, y), newest first, or -1. +// hit finds the newest annotation within 6 DIPs. func (d *DrawingTools) hit(m *mktCore, g mktGeom, x, y float32) int { for i := len(d.Items) - 1; i >= 0; i-- { it := d.Items[i] @@ -239,7 +232,7 @@ func (d *DrawingTools) hit(m *mktCore, g mktGeom, x, y float32) int { return -1 } -// drawingSegmentDist is the distance from (x, y) to the segment a-b. +// drawingSegmentDist measures distance to a line segment. func drawingSegmentDist(x, y, ax, ay, bx, by float32) float64 { vx, vy := float64(bx-ax), float64(by-ay) t := 0.0 @@ -248,3 +241,22 @@ func drawingSegmentDist(x, y, ax, ay, bx, by float32) float64 { } return math.Hypot(float64(x-ax)-t*vx, float64(y-ay)-t*vy) } + +func (d *DrawingTools) place(m *mktCore, pt DrawingPoint) { + if d.Tool.twoPoint() && d.pending == nil { + d.pending = &Drawing{Tool: d.Tool, A: pt, B: pt} + } else { + item := Drawing{Tool: d.Tool, A: pt, B: pt, Text: d.Text} + if d.pending != nil { + item.A = d.pending.A + } + if d.Tool == ToolText && item.Text == "" { + item.Text = msg(m.c, "drawing_tools.note") + } + d.save() + d.Items = append(slices.Clone(d.Items), item) + d.sel, d.pending, d.Tool = len(d.Items), nil, ToolSelect + slog.Debug("mujica: drawing_tools add", "tool", item.Tool) + } + m.c.Invalidate() +} diff --git a/drawing_tools_paint.go b/drawing_tools_paint.go index 7ee541e..fc894b5 100644 --- a/drawing_tools_paint.go +++ b/drawing_tools_paint.go @@ -8,7 +8,7 @@ import ( "mujicaui/internal" ) -// paint draws every drawing, the one being placed, and the selected one's handles. +// paint draws annotations, previews, and selected handles. func (d *DrawingTools) paint(p *ui.Painter, g mktGeom, m *mktCore, size float32) { k := m.k items := d.Items @@ -27,7 +27,7 @@ func (d *DrawingTools) paint(p *ui.Painter, g mktGeom, m *mktCore, size float32) ax, ay, bx, by = internal.Snap(p, ax), internal.Snap(p, ay), internal.Snap(p, bx), internal.Snap(p, by) switch it.Tool { case ToolTrendLine: - p.Line(ax, ay, bx, by, width, col) + drawingStroke(p, ax, ay, bx, by, width, col) case ToolHorizontal: p.Line(g.plot.X, ay, g.plot.X+g.plot.W, ay, width, col) chartText(p, priceUngrouped(it.A.Price, m.dec), g.plot.X+4, ay-2, size, col, 0, 1) @@ -42,7 +42,7 @@ func (d *DrawingTools) paint(p *ui.Painter, g mktGeom, m *mktCore, size float32) p.Line(min(ax, bx), y, max(ax, bx), y, 1, col) chartText(p, strconv.FormatFloat(lv, 'f', -1, 64)+" · "+priceUngrouped(price, m.dec), max(ax, bx)+4, y, size, col, 0, 0.5) } - p.Line(ax, ay, bx, by, 1, col.Alpha(0.5)) + drawingStroke(p, ax, ay, bx, by, 1, col.Alpha(0.5)) case ToolText: w, h := chartText(p, it.Text, ax, ay, size, k.Text, 0.5, 0.5) p.Stroke(ui.Rect{X: ax - w/2 - 4, Y: ay - h/2 - 2, W: w + 8, H: h + 4}, col, 2, width/1.5) @@ -55,3 +55,9 @@ func (d *DrawingTools) paint(p *ui.Painter, g mktGeom, m *mktCore, size float32) } } } + +func drawingStroke(p *ui.Painter, ax, ay, bx, by, width float32, col ui.Color) { + var path ui.Path + path.MoveTo(internal.Snap(p, ax), internal.Snap(p, ay)).LineTo(internal.Snap(p, bx), internal.Snap(p, by)) + p.StrokePath(&path, width, col) +} diff --git a/drawing_tools_test.go b/drawing_tools_test.go new file mode 100644 index 0000000..13e9902 --- /dev/null +++ b/drawing_tools_test.go @@ -0,0 +1,101 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "mujicaui/internal" + "mujicaui/theme" + "testing" +) + +func TestDrawingToolsPlaceMoveDeleteUndo(t *testing.T) { + cs := sampleCandles(60) + v := MarketView{Count: 60} + d := DrawingTools{Tool: ToolHorizontal} + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + CandlestickChart(c, cs, &v, CandlestickOptions{Frame: ChartFrame{Label: "Drawing"}, Drawings: &d}) + }) + }, 640, 340) + tt.ClickAt(300, 100) + if len(d.Items) != 1 || d.Items[0].Tool != ToolHorizontal || d.Selected() != 0 { + t.Fatalf("drawings %+v", d) + } + before := d.Items[0].A.Price + tt.Key(ui.Alt, ui.KeyUp) + if d.Items[0].A.Price <= before { + t.Fatal("keyboard move failed") + } + tt.Key(0, ui.KeyDelete) + if len(d.Items) != 0 { + t.Fatal("delete failed") + } + tt.Key(ui.Cmd, ui.KeyZ) + if len(d.Items) != 1 { + t.Fatal("undo failed") + } + disabled = true + tt.Frame() + tt.Key(0, ui.KeyDelete) + tt.ClickAt(200, 150) + if len(d.Items) != 1 { + t.Fatal("disabled drawing changed") + } +} +func TestDrawingToolsSnapshot(t *testing.T) { + cs := sampleCandles(60) + v := MarketView{Count: 60} + d := DrawingTools{Items: []Drawing{{Tool: ToolTrendLine, A: DrawingPoint{cs[10].Time, 98}, B: DrawingPoint{cs[45].Time, 105}}, {Tool: ToolHorizontal, A: DrawingPoint{cs[20].Time, 100}}}, sel: 1} + snapshot(t, "drawing_tools", 640, 320, func(c *ui.Context) { + ui.Column(c).Padding(12).Children(func() { + CandlestickChart(c, cs, &v, CandlestickOptions{Frame: ChartFrame{Label: "Drawings", Height: 260}, Drawings: &d}) + }) + }) +} + +func TestDrawingToolsTrendLinePaint(t *testing.T) { + cs := sampleCandles(2) + img := ui.Render(func(c *ui.Context) { + Use(c, Settings{Mode: Light}) + m := &mktCore{c: c, k: Tokens(c), candles: cs, from: 0, to: 2} + g := mktGeom{plot: ui.Rect{W: 200, H: 200}, band: internal.Band{N: 2, R0: 0, R1: 200}, ys: internal.Linear{D0: 0, D1: 10, R0: 180, R1: 20}} + d := DrawingTools{Items: []Drawing{{Tool: ToolTrendLine, A: DrawingPoint{cs[0].Time, 0}, B: DrawingPoint{cs[1].Time, 10}}}} + ui.Box(c).Size(200, 200).Draw(func(p *ui.Painter, _ ui.Rect) { d.paint(p, g, m, 12) }) + }, 200, 200, 1) + bg := theme.Light().Background + pixel := img.RGBAAt(100, 100) + if int(bg.R)-int(pixel.R) < 40 || int(bg.G)-int(pixel.G) < 20 { + t.Fatalf("diagonal midpoint lacks the stroke: %v", pixel) + } +} + +func TestDrawingToolsAllTools(t *testing.T) { + for _, tool := range []DrawingTool{ToolTrendLine, ToolHorizontal, ToolFibonacci, ToolRectangle, ToolText} { + t.Run(string(rune('0'+tool)), func(t *testing.T) { + cs := sampleCandles(30) + v := MarketView{Count: 30} + d := DrawingTools{Tool: tool, Text: "Note"} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + CandlestickChart(c, cs, &v, CandlestickOptions{Frame: ChartFrame{Label: "Drawing"}, Drawings: &d}) + }, 640, 340) + tt.ClickAt(200, 120) + if tool.twoPoint() { + if d.pending == nil || len(d.Items) != 0 { + t.Fatal("missing first anchor") + } + tt.ClickAt(400, 160) + } + if len(d.Items) != 1 || d.Items[0].Tool != tool || d.Selected() != 0 { + t.Fatalf("created %+v", d.Items) + } + if tool == ToolText && d.Items[0].Text != "Note" { + t.Fatal("annotation text lost") + } + if !d.Clear() || len(d.Items) != 0 || !d.Undo() || len(d.Items) != 1 { + t.Fatal("clear or undo failed") + } + }) + } +} diff --git a/example_mktchart_test.go b/example_mktchart_test.go new file mode 100644 index 0000000..4ef3be8 --- /dev/null +++ b/example_mktchart_test.go @@ -0,0 +1,265 @@ +package mujica_test + +import ( + "github.com/egoist/mygo/ui" + mujica "mujicaui" + "time" +) + +func ExampleCandlestickChart() { + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleOHLCChart() { + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.OHLCChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleHeikinAshiChart() { + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + raw := false + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.HeikinAshiChart(c, candles, &window, &raw, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleLineQuoteChart() { + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + points := []mujica.QuotePoint{{Time: at, Price: 101, Volume: 100}, {Time: at.Add(time.Hour), Price: 103, Volume: 200}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.LineQuoteChart(c, points, mujica.LineQuoteChartOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, PrevClose: 100, RegularOpen: at.Add(30 * time.Minute), RegularClose: at.Add(45 * time.Minute)}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleVolumeChart() { + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.VolumeChart(c, candles, &window, mujica.VolumeChartOptions{Frame: mujica.ChartFrame{Label: "Volume"}}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleDepthChart() { + bids := []mujica.DepthLevel{{Price: 99, Size: 10}, {Price: 98, Size: 20}} + asks := []mujica.DepthLevel{{Price: 101, Size: 15}, {Price: 102, Size: 25}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DepthChart(c, bids, asks, mujica.DepthChartOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleVolumeProfile() { + bins := []mujica.ProfileBin{{Low: 99, High: 100, Volume: 30}, {Low: 100, High: 101, Volume: 80}, {Low: 101, High: 102, Volume: 40}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.VolumeProfile(c, bins, mujica.VolumeProfileOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleMultiChartLayout() { + state := mujica.MultiChartState{Count: 2} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.MultiChartLayout(c, &state, mujica.MultiChartLayoutOptions{Height: 200}, func(i int, cell *mujica.ChartCell) { + mujica.TextInput(c, &cell.Symbol, mujica.TextInputOptions{Label: "Symbol"}) + }) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleChartSync() { + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + var sync mujica.ChartSync + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + sync.Link(c, "price") + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Sync: &sync, SyncID: "price"}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleTimeRangeSelector() { + value := mujica.MarketRange{Preset: mujica.Range1M} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.TimeRangeSelector(c, &value, mujica.TimeRangeSelectorOptions{}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleIntervalSelector() { + value := mujica.Interval("1h") + favorites := []mujica.Interval{"1m", "1h", "1D"} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IntervalSelector(c, &value, &favorites, mujica.IntervalSelectorOptions{}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleChartTypeSwitcher() { + value := mujica.ChartCandles + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ChartTypeSwitcher(c, &value, mujica.ChartTypeSwitcherOptions{}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleIndicatorOverlay() { + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + overlays := []mujica.IndicatorOverlay{{Kind: mujica.IndicatorMA, Params: []float64{2}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Overlays: overlays}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleIndicatorPane() { + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + panes := mujica.IndicatorPanes{Panes: []mujica.IndicatorPaneSpec{{Kind: mujica.IndicatorRSI, Params: []float64{2}}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IndicatorPane(c, candles, &window, &panes, mujica.IndicatorPaneOptions{Height: 200, Label: "BTC"}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleIndicatorSelector() { + var overlays []mujica.IndicatorOverlay + var panes mujica.IndicatorPanes + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IndicatorSelector(c, &overlays, &panes, mujica.IndicatorSelectorOptions{}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleDrawingTools() { + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + drawings := mujica.DrawingTools{Tool: mujica.ToolTrendLine} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Drawings: &drawings}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleDrawingToolbar() { + var drawings mujica.DrawingTools + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DrawingToolbar(c, &drawings, mujica.DrawingToolbarOptions{Horizontal: true}) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleCompareSymbol() { + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + symbols := []mujica.CompareSymbol{{Name: "ETH", Closes: []float64{20, 21, 23}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CompareLegend(c, &symbols) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Compare: &symbols}) + } + ui.Render(view, 640, 400, 1) +} + +func ExamplePriceAlertLine() { + at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + alerts := []mujica.PriceAlertLine{{ID: "take-profit", Price: 105}} + triggered := "" + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Alerts: &alerts, OnAlert: func(alert mujica.PriceAlertLine, last mujica.Candle) { + triggered = alert.ID + }}) + ui.Text(c, triggered) + } + ui.Render(view, 640, 400, 1) +} + +func ExampleCandleCountdown() { + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandleCountdown(c, "1h", mujica.CandleCountdownOptions{Location: time.UTC}) + } + ui.Render(view, 640, 400, 1) +} diff --git a/examples/gallery/pages_mktchart.go b/examples/gallery/pages_mktchart.go index 0f60886..e495179 100644 --- a/examples/gallery/pages_mktchart.go +++ b/examples/gallery/pages_mktchart.go @@ -1,3 +1,28 @@ package main -var mktchartPages = []page{} +import "github.com/egoist/mygo/ui" + +var mktchartPages = []page{ + {ID: "141", Name: "CandlestickChart", ZhName: "K 线", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "141") }, Code: mktCode141, Keys: mktKeys}, + {ID: "142", Name: "OHLCChart", ZhName: "美国线", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "142") }, Code: mktCode142, Keys: mktKeys}, + {ID: "143", Name: "HeikinAshiChart", ZhName: "平均 K 线", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "143") }, Code: mktCode143, Keys: mktKeys}, + {ID: "144", Name: "LineQuoteChart", ZhName: "分时图", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "144") }, Code: mktCode144, Keys: mktKeys}, + {ID: "145", Name: "VolumeChart", ZhName: "成交量", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "145") }, Code: mktCode145, Keys: mktKeys}, + {ID: "146", Name: "DepthChart", ZhName: "深度图", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "146") }, Code: mktCode146, Keys: mktKeys}, + {ID: "147", Name: "VolumeProfile", ZhName: "成交量分布", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "147") }, Code: mktCode147, Keys: mktKeys}, + {ID: "148", Name: "MultiChartLayout", ZhName: "多图布局", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "148") }, Code: mktCode148, Keys: mktKeys}, + {ID: "149", Name: "ChartSync", ZhName: "图表同步", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "149") }, Code: mktCode149, Keys: mktKeys}, + {ID: "150", Name: "TimeRangeSelector", ZhName: "时间范围", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "150") }, Code: mktCode150, Keys: mktKeys}, + {ID: "151", Name: "IntervalSelector", ZhName: "周期选择", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "151") }, Code: mktCode151, Keys: mktKeys}, + {ID: "152", Name: "ChartTypeSwitcher", ZhName: "图表类型", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "152") }, Code: mktCode152, Keys: mktKeys}, + {ID: "153", Name: "IndicatorOverlay", ZhName: "主图指标", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "153") }, Code: mktCode153, Keys: mktKeys}, + {ID: "154", Name: "IndicatorPane", ZhName: "指标副图", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "154") }, Code: mktCode154, Keys: mktKeys}, + {ID: "155", Name: "IndicatorSelector", ZhName: "指标选择", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "155") }, Code: mktCode155, Keys: mktKeys}, + {ID: "156", Name: "DrawingTools", ZhName: "画线", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "156") }, Code: mktCode156, Keys: mktKeys}, + {ID: "157", Name: "DrawingToolbar", ZhName: "画线工具栏", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "157") }, Code: mktCode157, Keys: mktKeys}, + {ID: "158", Name: "CompareSymbol", ZhName: "品种对比", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "158") }, Code: mktCode158, Keys: mktKeys}, + {ID: "159", Name: "PriceAlertLine", ZhName: "价格预警", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "159") }, Code: mktCode159, Keys: mktKeys}, + {ID: "160", Name: "CandleCountdown", ZhName: "K 线倒计时", Category: "Market Charts", Demo: func(c *ui.Context, log func(string)) { mktDemo(c, log, "160") }, Code: mktCode160, Keys: mktKeys}, +} + +const mktKeys = "Tab focuses controls and charts; arrows move focus or chart readouts; Space selects; Home/End jump; +/- zoom; Shift+arrows pan; Alt+1–6 pick drawing tools; Delete removes; Ctrl/Command+Z undoes; Escape closes panels." diff --git a/examples/gallery/pages_mktchart_code.go b/examples/gallery/pages_mktchart_code.go new file mode 100644 index 0000000..c81078d --- /dev/null +++ b/examples/gallery/pages_mktchart_code.go @@ -0,0 +1,219 @@ +package main + +const mktCode141 = ` at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode142 = ` at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.OHLCChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode143 = ` at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + raw := false + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.HeikinAshiChart(c, candles, &window, &raw, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode144 = ` at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + points := []mujica.QuotePoint{{Time: at, Price: 101, Volume: 100}, {Time: at.Add(time.Hour), Price: 103, Volume: 200}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.LineQuoteChart(c, points, mujica.LineQuoteChartOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, PrevClose: 100, RegularOpen: at.Add(30 * time.Minute), RegularClose: at.Add(45 * time.Minute)}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode145 = ` at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.VolumeChart(c, candles, &window, mujica.VolumeChartOptions{Frame: mujica.ChartFrame{Label: "Volume"}}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode146 = ` bids := []mujica.DepthLevel{{Price: 99, Size: 10}, {Price: 98, Size: 20}} + asks := []mujica.DepthLevel{{Price: 101, Size: 15}, {Price: 102, Size: 25}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DepthChart(c, bids, asks, mujica.DepthChartOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode147 = ` bins := []mujica.ProfileBin{{Low: 99, High: 100, Volume: 30}, {Low: 100, High: 101, Volume: 80}, {Low: 101, High: 102, Volume: 40}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.VolumeProfile(c, bins, mujica.VolumeProfileOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode148 = ` state := mujica.MultiChartState{Count: 2} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.MultiChartLayout(c, &state, mujica.MultiChartLayoutOptions{Height: 200}, func(i int, cell *mujica.ChartCell) { + mujica.TextInput(c, &cell.Symbol, mujica.TextInputOptions{Label: "Symbol"}) + }) + } + ui.Render(view, 640, 400, 1)` + +const mktCode149 = ` at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + var sync mujica.ChartSync + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + sync.Link(c, "price") + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Sync: &sync, SyncID: "price"}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode150 = ` value := mujica.MarketRange{Preset: mujica.Range1M} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.TimeRangeSelector(c, &value, mujica.TimeRangeSelectorOptions{}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode151 = ` value := mujica.Interval("1h") + favorites := []mujica.Interval{"1m", "1h", "1D"} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IntervalSelector(c, &value, &favorites, mujica.IntervalSelectorOptions{}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode152 = ` value := mujica.ChartCandles + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.ChartTypeSwitcher(c, &value, mujica.ChartTypeSwitcherOptions{}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode153 = ` at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + overlays := []mujica.IndicatorOverlay{{Kind: mujica.IndicatorMA, Params: []float64{2}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Overlays: overlays}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode154 = ` at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + panes := mujica.IndicatorPanes{Panes: []mujica.IndicatorPaneSpec{{Kind: mujica.IndicatorRSI, Params: []float64{2}}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IndicatorPane(c, candles, &window, &panes, mujica.IndicatorPaneOptions{Height: 200, Label: "BTC"}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode155 = ` var overlays []mujica.IndicatorOverlay + var panes mujica.IndicatorPanes + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.IndicatorSelector(c, &overlays, &panes, mujica.IndicatorSelectorOptions{}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode156 = ` at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + drawings := mujica.DrawingTools{Tool: mujica.ToolTrendLine} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Drawings: &drawings}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode157 = ` var drawings mujica.DrawingTools + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.DrawingToolbar(c, &drawings, mujica.DrawingToolbarOptions{Horizontal: true}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode158 = ` at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + symbols := []mujica.CompareSymbol{{Name: "ETH", Closes: []float64{20, 21, 23}}} + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CompareLegend(c, &symbols) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Compare: &symbols}) + } + ui.Render(view, 640, 400, 1)` + +const mktCode159 = ` at := time.Date(2026, 10, 5, 9, 0, 0, 0, time.UTC) + candles := []mujica.Candle{ + {Time: at, Open: 100, High: 103, Low: 99, Close: 102, Volume: 1200}, + {Time: at.Add(time.Hour), Open: 102, High: 104, Low: 100, Close: 101, Volume: 1600}, + {Time: at.Add(2 * time.Hour), Open: 101, High: 105, Low: 100, Close: 104, Volume: 900}, + } + var window mujica.MarketView + alerts := []mujica.PriceAlertLine{{ID: "take-profit", Price: 105}} + triggered := "" + view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandlestickChart(c, candles, &window, mujica.CandlestickOptions{Frame: mujica.ChartFrame{Label: "BTC", Height: 200}, Alerts: &alerts, OnAlert: func(alert mujica.PriceAlertLine, last mujica.Candle) { + triggered = alert.ID + }}) + ui.Text(c, triggered) + } + ui.Render(view, 640, 400, 1)` + +const mktCode160 = ` view := func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + mujica.CandleCountdown(c, "1h", mujica.CandleCountdownOptions{Location: time.UTC}) + } + ui.Render(view, 640, 400, 1)` diff --git a/examples/gallery/pages_mktchart_demo.go b/examples/gallery/pages_mktchart_demo.go new file mode 100644 index 0000000..f0fc07b --- /dev/null +++ b/examples/gallery/pages_mktchart_demo.go @@ -0,0 +1,214 @@ +package main + +import ( + "fmt" + "time" + + "github.com/egoist/mygo/ui" + mujica "mujicaui" +) + +func mktDemo(c *ui.Context, log func(string), id string) { + s := ui.Local(c.Root(), id, mktInitial) + ui.Column(c).Gap(12).FillWidth().Children(func() { + frame := mktControls(c, s, log) + candles, points, bids, asks, bins := s.candles, s.points, s.bids, s.asks, s.bins + if s.status == "Empty" { + candles = nil + points = nil + bids = nil + asks = nil + bins = nil + } + ui.Column(c).Disabled(s.disabled).Gap(12).FillWidth().Children(func() { + opts := mujica.CandlestickOptions{Frame: frame, Type: s.chartType} + chart := func() { mktLog(log, id, mujica.CandlestickChart(c, candles, &s.window, opts)) } + switch id { + case "141": + if mujica.ChartTypeSwitcher(c, &s.chartType, mujica.ChartTypeSwitcherOptions{}).Changed() { + log(fmt.Sprintf("Chart type: %d", s.chartType)) + } + opts.Type = s.chartType + chart() + case "142": + mktLog(log, id, mujica.OHLCChart(c, candles, &s.window, opts)) + case "143": + before := s.raw + mktLog(log, id, mujica.HeikinAshiChart(c, candles, &s.window, &s.raw, opts)) + if before != s.raw { + log(fmt.Sprintf("Raw: %v", s.raw)) + } + case "144": + if mujica.NumberInput(c, &s.previous, mujica.NumberInputOptions{Min: 80, Max: 120, Step: 0.5, Label: "Previous close"}).Changed() { + log(fmt.Sprintf("Previous close: %.2f", s.previous)) + } + if mujica.Checkbox(c, &s.extended, "Extended sessions", mujica.CheckboxOptions{}).Changed() { + log(fmt.Sprintf("Extended sessions: %v", s.extended)) + } + o := mujica.LineQuoteChartOptions{Frame: frame, PrevClose: s.previous} + if s.extended { + o.RegularOpen = s.points[0].Time.Add(90 * time.Minute) + o.RegularClose = s.points[0].Time.Add(8 * time.Hour) + } + mktLog(log, id, mujica.LineQuoteChart(c, points, o)) + case "145": + opts.Frame.Height = 150 + chart() + frame.Label = "Volume" + frame.Height = 100 + mktLog(log, id, mujica.VolumeChart(c, candles, &s.window, mujica.VolumeChartOptions{Frame: frame})) + case "146": + mktLog(log, id, mujica.DepthChart(c, bids, asks, mujica.DepthChartOptions{Frame: frame})) + case "147": + if mujica.NumberInput(c, &s.fraction, mujica.NumberInputOptions{Min: 0.1, Max: 1, Step: 0.1, Label: "Value area fraction"}).Changed() { + log(fmt.Sprintf("Value area: %.1f", s.fraction)) + } + mktLog(log, id, mujica.VolumeProfile(c, bins, mujica.VolumeProfileOptions{Frame: frame, ValueArea: s.fraction})) + case "148": + if mujica.MultiChartLayout(c, &s.layout, mujica.MultiChartLayoutOptions{Height: 420}, func(i int, cell *mujica.ChartCell) { + if mujica.TextInput(c, &cell.Symbol, mujica.TextInputOptions{Label: fmt.Sprintf("Symbol %d", i+1)}).Changed() { + log(fmt.Sprintf("Cell %d: %s", i+1, cell.Symbol)) + } + items := make([]mujica.SelectOption[mujica.Interval], len(mujica.Intervals)) + for j, iv := range mujica.Intervals { + items[j] = mujica.SelectOption[mujica.Interval]{Value: iv, Label: string(iv)} + } + if mujica.Select(c, &cell.Interval, items, mujica.SelectOptions{Label: fmt.Sprintf("Interval %d", i+1)}).Changed() { + log(fmt.Sprintf("Cell %d: %s", i+1, cell.Interval)) + } + f := frame + f.Label = cell.Symbol + f.Height = 70 + mktLog(log, fmt.Sprint(i), mujica.CandlestickChart(c, candles, &cell.View, mujica.CandlestickOptions{Frame: f})) + }).Changed() { + log(fmt.Sprintf("Layout: %d, active %d", s.layout.Count, s.layout.Active)) + } + case "149": + for _, chartID := range []string{"price", "other"} { + ui.Column(c).Key(chartID).Children(func() { + if s.sync.Link(c, chartID).Changed() { + log("Sync: " + chartID) + } + v := &s.window + if chartID == "other" { + v = &s.second + } + o := opts + o.Frame.Height = 100 + o.Frame.Label = chartID + o.Sync = &s.sync + o.SyncID = chartID + mktLog(log, chartID, mujica.CandlestickChart(c, candles, v, o)) + }) + } + case "150": + if mujica.TimeRangeSelector(c, &s.rangeValue, mujica.TimeRangeSelectorOptions{}).Changed() { + log(fmt.Sprintf("Range: %d", s.rangeValue.Preset)) + } + from, to := s.rangeValue.Bounds(c.Now(), time.UTC) + ui.Text(c, from.Format("2006-01-02")+" — "+to.Format("2006-01-02")) + case "151": + before := fmt.Sprint(s.favorites) + if mujica.IntervalSelector(c, &s.interval, &s.favorites, mujica.IntervalSelectorOptions{}).Changed() { + log("Interval: " + string(s.interval)) + } + if before != fmt.Sprint(s.favorites) { + log("Favorites: " + fmt.Sprint(s.favorites)) + } + mujica.CandleCountdown(c, s.interval, mujica.CandleCountdownOptions{}) + case "152": + if mujica.ChartTypeSwitcher(c, &s.chartType, mujica.ChartTypeSwitcherOptions{}).Changed() { + log(fmt.Sprintf("Chart type: %d", s.chartType)) + } + opts.Type = s.chartType + chart() + case "153": + if mujica.IndicatorSelector(c, &s.overlays, &s.panes, mujica.IndicatorSelectorOptions{}).Changed() { + log("Overlays changed") + } + opts.Overlays = s.overlays + chart() + case "154": + if mujica.IndicatorSelector(c, &s.overlays, &s.panes, mujica.IndicatorSelectorOptions{}).Changed() { + log("Indicators changed") + } + r := mujica.IndicatorPane(c, candles, &s.window, &s.panes, mujica.IndicatorPaneOptions{Label: "BTC", Height: 320, Status: frame.Status, Error: frame.Error}) + if r.PointChanged { + log(fmt.Sprintf("Pane %d: point %d", r.Pane, r.Point)) + } + if r.Removed >= 0 { + log(fmt.Sprintf("Removed pane %d", r.Removed)) + } + if r.Resized { + log("Panes resized") + } + case "155": + if mujica.IndicatorSelector(c, &s.overlays, &s.panes, mujica.IndicatorSelectorOptions{}).Changed() { + log("Indicators changed") + } + opts.Overlays = s.overlays + chart() + case "156", "157": + if mujica.TextInput(c, &s.drawings.Text, mujica.TextInputOptions{Label: "Annotation text"}).Changed() { + log("Annotation text changed") + } + if mujica.DrawingToolbar(c, &s.drawings, mujica.DrawingToolbarOptions{Horizontal: true}).Changed() { + log(fmt.Sprintf("Tool: %d, locked: %v", s.drawings.Tool, s.drawings.Locked)) + } + before := fmt.Sprint(s.drawings.Items) + opts.Drawings = &s.drawings + chart() + if before != fmt.Sprint(s.drawings.Items) { + log(fmt.Sprintf("Drawings: %d", len(s.drawings.Items))) + } + case "158": + if mujica.CompareLegend(c, &s.compare).Changed() { + log("Compared symbol removed") + } + if mujica.Button(c, "Restore ETH", mujica.ButtonOptions{Variant: mujica.Secondary}).Clicked() { + s.compare = mktInitial().compare + log("Restored ETH") + } + if len(candles) > 0 { + opts.Compare = &s.compare + } + chart() + case "159": + before := s.alerts[0].Price + opts.Alerts = &s.alerts + opts.OnAlert = func(a mujica.PriceAlertLine, last mujica.Candle) { + log(fmt.Sprintf("Alert %s crossed %.2f", a.ID, last.Close)) + } + if mujica.Button(c, "Append crossing candle", mujica.ButtonOptions{Variant: mujica.Secondary}).Clicked() { + last := s.candles[len(s.candles)-1] + next := last + next.Time = last.Time.Add(time.Hour) + next.Open = last.Close + next.Close = s.alerts[0].Price + 2 + if last.Close > s.alerts[0].Price { + next.Close = s.alerts[0].Price - 2 + } + next.High = max(next.Open, next.Close) + 1 + next.Low = min(next.Open, next.Close) - 1 + s.candles = append(s.candles[:len(s.candles):len(s.candles)], next) + candles = s.candles + log("Appended candle") + } + chart() + if before != s.alerts[0].Price { + log(fmt.Sprintf("Alert price: %.2f", s.alerts[0].Price)) + } + case "160": + if mujica.IntervalSelector(c, &s.interval, &s.favorites, mujica.IntervalSelectorOptions{}).Changed() { + log("Interval: " + string(s.interval)) + } + if mujica.Checkbox(c, &s.hidden, "Hide countdown", mujica.CheckboxOptions{}).Changed() { + log(fmt.Sprintf("Hidden: %v", s.hidden)) + } + if !s.hidden { + mujica.CandleCountdown(c, s.interval, mujica.CandleCountdownOptions{}) + } + } + }) + }) +} diff --git a/examples/gallery/pages_mktchart_state.go b/examples/gallery/pages_mktchart_state.go new file mode 100644 index 0000000..8cd822d --- /dev/null +++ b/examples/gallery/pages_mktchart_state.go @@ -0,0 +1,98 @@ +package main + +import ( + "fmt" + "math" + "time" + + "github.com/egoist/mygo/ui" + mujica "mujicaui" +) + +type mktDemoState struct { + candles []mujica.Candle + points []mujica.QuotePoint + bids, asks []mujica.DepthLevel + bins []mujica.ProfileBin + window mujica.MarketView + second mujica.MarketView + sync mujica.ChartSync + layout mujica.MultiChartState + interval mujica.Interval + favorites []mujica.Interval + rangeValue mujica.MarketRange + chartType mujica.ChartType + overlays []mujica.IndicatorOverlay + panes mujica.IndicatorPanes + drawings mujica.DrawingTools + compare []mujica.CompareSymbol + alerts []mujica.PriceAlertLine + status string + disabled, raw, redUp, hidden, extended bool + previous, fraction float64 +} + +func mktInitial() mktDemoState { + s := mktDemoState{status: "Ready", interval: "1h", favorites: []mujica.Interval{"1m", "1h", "1D"}, previous: 100, fraction: 0.7, extended: true} + start := time.Date(2026, 10, 5, 8, 0, 0, 0, time.UTC) + price := 100.0 + compare := make([]float64, 180) + for i := range 180 { + closeAt := price + math.Sin(float64(i)*0.7)*1.5 + math.Cos(float64(i)*0.13)*0.8 + s.candles = append(s.candles, mujica.Candle{Time: start.Add(time.Duration(i) * time.Hour), Open: price, High: max(price, closeAt) + 0.8, Low: min(price, closeAt) - 0.7, Close: closeAt, Volume: 1000 + float64(i%17)*130}) + s.points = append(s.points, mujica.QuotePoint{Time: start.Add(time.Duration(i) * 5 * time.Minute), Price: 100 + 2*math.Sin(float64(i)/10), Volume: 100 + float64(i%7)*20}) + compare[i] = 20 + float64(i)*0.08 + price = closeAt + } + for i := range 40 { + s.bids = append(s.bids, mujica.DepthLevel{Price: 99.9 - float64(i)*0.1, Size: float64(10 + i*3)}) + s.asks = append(s.asks, mujica.DepthLevel{Price: 100.1 + float64(i)*0.1, Size: float64(8 + i*4)}) + } + s.bins = mujica.VolumeProfileOf(s.candles, 24) + s.compare = []mujica.CompareSymbol{{Name: "ETH", Closes: compare}} + s.alerts = []mujica.PriceAlertLine{{ID: "target", Price: 104, Label: "Target"}} + s.overlays = []mujica.IndicatorOverlay{{Kind: mujica.IndicatorMA, Params: []float64{10}}} + s.panes = mujica.IndicatorPanes{Panes: []mujica.IndicatorPaneSpec{{Kind: mujica.IndicatorMACD}, {Kind: mujica.IndicatorRSI}}} + s.layout.Count = 2 + for i := range s.layout.Cells { + s.layout.Cells[i] = mujica.ChartCell{Symbol: fmt.Sprintf("Symbol %d", i+1), Interval: "1h"} + } + return s +} + +func mktControls(c *ui.Context, s *mktDemoState, log func(string)) mujica.ChartFrame { + ui.Row(c).Gap(12).Wrap().Children(func() { + if mujica.Select(c, &s.status, []mujica.SelectOption[string]{{Value: "Ready", Label: "Ready"}, {Value: "Loading", Label: "Loading"}, {Value: "Failed", Label: "Failed"}, {Value: "Empty", Label: "Empty"}}, mujica.SelectOptions{Label: "Data state"}).Changed() { + log("Data state: " + s.status) + } + if mujica.Checkbox(c, &s.disabled, "Disabled", mujica.CheckboxOptions{}).Changed() { + log(fmt.Sprintf("Disabled: %v", s.disabled)) + } + if mujica.Checkbox(c, &s.redUp, "Red up", mujica.CheckboxOptions{}).Changed() { + log(fmt.Sprintf("Red up: %v", s.redUp)) + } + }) + trend := mujica.GreenUp + if s.redUp { + trend = mujica.RedUp + } + mujica.UseTrend(c, trend) + f := mujica.ChartFrame{Label: "BTC", Height: 220} + switch s.status { + case "Loading": + f.Status = mujica.DataLoading + case "Failed": + f.Status = mujica.DataFailed + f.Error = "Archive unavailable" + } + return f +} + +func mktLog(log func(string), name string, r mujica.ChartResult) { + if r.Changed() { + log(fmt.Sprintf("%s: point %d", name, r.Point)) + } + if r.Retried() { + log(name + ": retry") + } +} diff --git a/examples/gallery/pages_mktchart_test.go b/examples/gallery/pages_mktchart_test.go new file mode 100644 index 0000000..af5ec52 --- /dev/null +++ b/examples/gallery/pages_mktchart_test.go @@ -0,0 +1,75 @@ +package main + +import ( + "strings" + "testing" + + "github.com/egoist/mygo/ui" + mujica "mujicaui" +) + +func mktDemoTester(t *testing.T, id string) (*ui.Tester, *[]string) { + t.Helper() + events := &[]string{} + tt := ui.NewTester(func(c *ui.Context) { + mujica.Use(c, mujica.Settings{}) + ui.Scroll(c).Fill().Padding(12).Children(func() { mktDemo(c, func(s string) { *events = append(*events, s) }, id) }) + }, 900, 800) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + return tt, events +} + +func TestMarketChartPagesHaveInteractiveControls(t *testing.T) { + if len(mktchartPages) != 20 { + t.Fatalf("pages %d", len(mktchartPages)) + } + for _, p := range mktchartPages { + t.Run(p.ID, func(t *testing.T) { + if p.Category != "Market Charts" || p.Code == "" || p.Keys == "" { + t.Fatal("incomplete page") + } + tt, events := mktDemoTester(t, p.ID) + if err := tt.Click("Red up"); err != nil { + t.Fatal(err) + } + if len(*events) == 0 || (*events)[len(*events)-1] != "Red up: true" { + t.Fatalf("control events %q", *events) + } + if err := tt.Click("Disabled"); err != nil { + t.Fatal(err) + } + if (*events)[len(*events)-1] != "Disabled: true" { + t.Fatalf("disabled event %q", *events) + } + }) + } +} + +func TestMarketChartDemosLogKeyboardAndAlerts(t *testing.T) { + for _, id := range []string{"141", "142", "143", "144", "145", "146", "147", "153", "155", "156", "157", "158", "159"} { + t.Run(id, func(t *testing.T) { + tt, events := mktDemoTester(t, id) + tabUntil(t, tt, "BTC") + tt.Key(0, ui.KeyRight) + want := id + ": point 0" + found := false + for _, e := range *events { + found = found || e == want + } + if !found { + t.Fatalf("keyboard event %q, want %s", *events, want) + } + }) + } + tt, events := mktDemoTester(t, "159") + if err := tt.Click("Append crossing candle"); err != nil { + t.Fatal(err) + } + found := false + for _, e := range *events { + found = found || strings.HasPrefix(e, "Alert target crossed ") + } + if !found { + t.Fatalf("alert events %q", *events) + } +} diff --git a/heikin_ashi_chart_test.go b/heikin_ashi_chart_test.go new file mode 100644 index 0000000..40c9f2f --- /dev/null +++ b/heikin_ashi_chart_test.go @@ -0,0 +1,58 @@ +package mujica + +import ( + "strings" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestHeikinAshiChartSwitchesToRaw(t *testing.T) { + candles := sampleCandles(30) + view := MarketView{Count: 30} + raw := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + HeikinAshiChart(c, candles, &view, &raw, CandlestickOptions{Frame: ChartFrame{Label: "HA"}}) + }, 600, 360) + ha := HeikinAshi(candles) + readout := func() string { + for _, s := range tt.Texts() { + if strings.HasPrefix(s, "2026-01-01 00:00") { + return s + } + } + return "" + } + tt.Key(0, ui.KeyTab) // the switch + tt.Key(0, ui.KeyTab) // the plot + tt.Key(0, ui.KeyHome) + if want := "O " + priceUngrouped(ha[0].Open, 2); !strings.Contains(readout(), want) { + t.Fatalf("Heikin-Ashi readout %q, want %q", readout(), want) + } + if err := tt.Click("Candles"); err != nil || !raw { + t.Fatalf("switch: %v %v", err, raw) + } + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyHome) + if want := "O " + priceUngrouped(candles[0].Open, 2); !strings.Contains(readout(), want) { + t.Fatalf("raw readout %q, want %q", readout(), want) + } + defer func() { + if recover() == nil { + t.Fatal("nil raw accepted") + } + }() + ui.NewTester(func(c *ui.Context) { Use(c, Settings{}); HeikinAshiChart(c, candles, &view, nil, CandlestickOptions{}) }, 200, 100) +} + +func TestHeikinAshiChartSnapshot(t *testing.T) { + candles := sampleCandles(70) + view := MarketView{Count: 60} + raw := false + snapshot(t, "heikin_ashi_chart", 640, 340, func(c *ui.Context) { + ui.Column(c).Padding(12).Children(func() { + HeikinAshiChart(c, candles, &view, &raw, CandlestickOptions{Frame: ChartFrame{Label: "HA", Height: 230}}) + }) + }) +} diff --git a/indicator_overlay.go b/indicator_overlay.go index 0484e58..8531155 100644 --- a/indicator_overlay.go +++ b/indicator_overlay.go @@ -2,6 +2,8 @@ package mujica import ( "fmt" + "log/slog" + "math" "strconv" "strings" @@ -24,7 +26,7 @@ const ( IndicatorOBV ) -// indicatorInfo is a kind's name, default parameters and where it draws. +// indicatorInfo describes names, default parameters, and plotting locations. var indicatorInfo = []struct { name string params []float64 @@ -47,17 +49,18 @@ func (k IndicatorKind) DefaultParams() []float64 { return append([]float64(nil), indicatorInfo[k].params...) } -// IndicatorOverlay is an indicator drawn over the price chart: MA, EMA, BOLL or VWAP. +// IndicatorOverlay configures MA, EMA, BOLL, or VWAP. type IndicatorOverlay struct { Kind IndicatorKind - // Params are the periods (and BOLL's width); nil uses the kind's defaults. + // Params nil uses the indicator's defaults. Params []float64 - // Values, when set, are the caller's own series, one per candle, drawn instead of the built-in result. + // Values overrides calculation; supply one value per candle. Values []float64 } // indicatorParams resolves and checks params for kind. func indicatorParams(k IndicatorKind, params []float64) []float64 { + _ = k.String() want := indicatorInfo[k].params if params == nil { return want @@ -66,10 +69,13 @@ func indicatorParams(k IndicatorKind, params []float64) []float64 { panic(fmt.Sprintf("mujica: %v takes %d parameters, not %d", k, len(want), len(params))) } for i, p := range params { - if !(p > 0) || (k != IndicatorBOLL || i == 0) && p != float64(int(p)) { + if math.IsInf(p, 0) || !(p > 0) || (k != IndicatorBOLL || i == 0) && p != float64(int(p)) { panic(fmt.Sprintf("mujica: %v parameter %v must be a positive whole number", k, p)) } } + if k == IndicatorMACD && params[0] >= params[1] { + panic("mujica: MACD fast period must be below slow period") + } return params } @@ -85,7 +91,7 @@ func indicatorName(k IndicatorKind, params []float64) string { return k.String() + "(" + strings.Join(parts, ",") + ")" } -// indicatorSeries computes kind over candles: named lines, one value per candle. +// indicatorSeries computes named indicator lines from candles. func indicatorSeries(k IndicatorKind, params []float64, candles []Candle) []ChartSeries { p := indicatorParams(k, params) closes := make([]float64, len(candles)) @@ -115,7 +121,7 @@ func indicatorSeries(k IndicatorKind, params []float64, candles []Candle) []Char return []ChartSeries{{name, OBV(candles)}} } -// mktOverlayLines resolves the chart's overlays, computing each only when its candles or settings change. +// mktOverlayLines caches indicators until data or parameters change. func mktOverlayLines(ch *chart, m *mktCore, candles []Candle) []mktLine { pal := internal.Palette(m.k) var out []mktLine @@ -123,7 +129,7 @@ func mktOverlayLines(ch *chart, m *mktCore, candles []Candle) []mktLine { if _ = o.Kind.String(); !indicatorInfo[o.Kind].overlay { panic(fmt.Sprintf("mujica: %v is not an overlay indicator", o.Kind)) } - col := pal[(len(pal)-2-i+len(pal))%len(pal)] + col := pal[[]int{3, 1, 5, 2, 4}[i%5]] if o.Values != nil { if len(o.Values) != len(candles) { panic("mujica: IndicatorOverlay Values need one value per candle") @@ -140,16 +146,21 @@ func mktOverlayLines(ch *chart, m *mktCore, candles []Candle) []mktLine { return out } -// IndicatorParamsField edits one indicator's parameters in place; Changed reports a valid new value. +// IndicatorParamsField edits validated indicator parameters in place. func IndicatorParamsField(c *ui.Context, kind IndicatorKind, params *[]float64) ChoiceResult { if params == nil { panic("mujica: IndicatorParamsField needs params") } + row := ui.Row(c).Gap(Density(c).Unit() * 2).AlignItems(ui.Center).Role(ui.RoleGroup).Label(kind.String()) + if row.IsDisabled() { + copy := append([]float64(nil), (*params)...) + params = © + } if *params == nil { *params = kind.DefaultParams() } changed := false - row := ui.Row(c).Gap(Density(c).Unit() * 2).AlignItems(ui.Center).Role(ui.RoleGroup).Label(kind.String()) + indicatorParams(kind, *params) row.Children(func() { for i := range *params { v := (*params)[i] @@ -165,5 +176,8 @@ func IndicatorParamsField(c *ui.Context, kind IndicatorKind, params *[]float64) } } }) + if changed { + slog.Debug("mujica: indicator_overlay params", "kind", kind) + } return ChoiceResult{row, changed} } diff --git a/indicator_overlay_test.go b/indicator_overlay_test.go new file mode 100644 index 0000000..06d7c32 --- /dev/null +++ b/indicator_overlay_test.go @@ -0,0 +1,95 @@ +package mujica + +import ( + "strings" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestIndicatorOverlayValuesInReadoutAndMemo(t *testing.T) { + candles := sampleCandles(200) + view := MarketView{Count: 60} + overlays := []IndicatorOverlay{{Kind: IndicatorMA, Params: []float64{5}}, {Kind: IndicatorBOLL}} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + CandlestickChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "BTC"}, Overlays: overlays}) + }, 800, 400) + if !tt.HasText("MA(5)") || !tt.HasText("BOLL(20,2) ↑") { + t.Fatalf("legend %q", tt.Texts()) + } + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnd) + ma := SMA(closesOf(candles), 5) + want := "MA(5) " + priceUngrouped(ma[199], 2) + found := false + for _, s := range tt.Texts() { + found = found || strings.Contains(s, want) + } + if !found { + t.Fatalf("readout lacks %q: %q", want, tt.Texts()) + } + // Caller values replace the computation. + own := make([]float64, 200) + for i := range own { + own[i] = 42 + } + overlays = []IndicatorOverlay{{Kind: IndicatorEMA, Values: own}} + tt.Frame() + tt.Frame() + if !tt.HasText("EMA(20) 42.00") { + t.Fatalf("own values %q", tt.Texts()) + } + for name, o := range map[string]IndicatorOverlay{ + "pane kind": {Kind: IndicatorMACD}, + "params": {Kind: IndicatorMA, Params: []float64{0}}, + "values size": {Kind: IndicatorMA, Values: []float64{1}}, + } { + func() { + defer func() { + if recover() == nil { + t.Errorf("%s: no panic", name) + } + }() + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + CandlestickChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "x"}, Overlays: []IndicatorOverlay{o}}) + }, 300, 200) + }() + } +} + +func closesOf(cs []Candle) []float64 { + out := make([]float64, len(cs)) + for i, c := range cs { + out[i] = c.Close + } + return out +} + +func TestIndicatorParamsField(t *testing.T) { + var params []float64 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + IndicatorParamsField(c, IndicatorMACD, ¶ms) + }, 500, 100) + if len(params) != 3 || params[0] != 12 { + t.Fatalf("defaults %v", params) + } + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyUp) + if params[0] != 13 { + t.Fatalf("Up on fast %v", params) + } +} + +func TestIndicatorOverlaySnapshot(t *testing.T) { + candles := sampleCandles(120) + view := MarketView{Count: 90} + snapshot(t, "indicator_overlay", 640, 340, func(c *ui.Context) { + ui.Column(c).Padding(12).Children(func() { + CandlestickChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "BTC", Height: 250}, + Overlays: []IndicatorOverlay{{Kind: IndicatorMA, Params: []float64{10}}, {Kind: IndicatorBOLL}}}) + }) + }) +} diff --git a/indicator_pane.go b/indicator_pane.go index 547d864..f719bb5 100644 --- a/indicator_pane.go +++ b/indicator_pane.go @@ -20,37 +20,53 @@ type IndicatorPaneSpec struct { Params []float64 } -// IndicatorPanes is the caller-held stack of panes and their height shares. +// IndicatorPanes holds stacked indicators and their height shares. type IndicatorPanes struct { Panes []IndicatorPaneSpec - // Sizes are the panes' height shares; they reset to equal when the pane count changes. + // Sizes reset to equal shares when pane count changes. Sizes []float32 } // IndicatorPaneOptions configure an IndicatorPane. type IndicatorPaneOptions struct { - // Height is the whole stack's height; zero is 140 per pane. + // Height defaults to 140 per pane. Height float32 // Label prefixes each pane's accessible name, as the symbol. Label string Disabled bool + Status DataStatus + Error string + Empty string } // IndicatorPaneResult reports the stack's events. type IndicatorPaneResult struct { Element *ui.Element - // Removed is the index of the pane closed this frame, -1 for none. + // Removed reports the closed pane; -1 means none. Removed int // Resized reports finished height changes, for saving. - Resized bool + Resized bool + Point int + Pane int + PointChanged bool } -// IndicatorPane stacks indicator panes under a price chart, sharing its view; dividers between them resize. +// IndicatorPane stacks resizable technical indicators using the shared window. func IndicatorPane(c *ui.Context, candles []Candle, view *MarketView, panes *IndicatorPanes, opts IndicatorPaneOptions) IndicatorPaneResult { if view == nil || panes == nil { panic("mujica: IndicatorPane needs a view and panes") } - res := IndicatorPaneResult{Removed: -1} + box := ui.Column(c).FillWidth().Disabled(opts.Disabled) + if box.IsDisabled() { + copy := *panes + copy.Panes = append([]IndicatorPaneSpec(nil), panes.Panes...) + copy.Sizes = append([]float32(nil), panes.Sizes...) + panes = © + } + if opts.Height < 0 { + panic("mujica: IndicatorPane Height must be non-negative") + } + res := IndicatorPaneResult{Removed: -1, Point: -1, Pane: -1} n := len(panes.Panes) for _, p := range panes.Panes { if _ = p.Kind.String(); indicatorInfo[p.Kind].overlay { @@ -59,12 +75,16 @@ func IndicatorPane(c *ui.Context, candles []Candle, view *MarketView, panes *Ind indicatorParams(p.Kind, p.Params) } if n == 0 { - res.Element = ui.Column(c) + res.Element = box return res } if len(panes.Sizes) != n { panes.Sizes = nil } + u := Density(c).Unit() + lineH := FontSize(c, theme.CaptionSize) * theme.LineHeight + chrome := 2*max(theme.MinHitSize, lineH) + max(u*5, lineH) + 4*u + minimum := chrome + 40 h := opts.Height if h == 0 { h = 140 * float32(n) @@ -74,17 +94,21 @@ func IndicatorPane(c *ui.Context, candles []Candle, view *MarketView, panes *Ind col := ui.Column(c).Fill().MinHeight(0) b := col.Bounds() internal.Remeasure(c, col, b.W, b.H) - u := Density(c).Unit() - // The plot takes what the title, legend and readout rows leave. - plotH := max(40, b.H-2*theme.MinHitSize-u*12) + plotH := max(40, b.H-chrome) col.Children(func() { - if indicatorPaneOne(c, candles, view, panes.Panes[i], opts, plotH) { + closed, point := indicatorPaneOne(c, candles, view, panes.Panes[i], opts, plotH) + if point.Point >= 0 { + res.Point = point.Point + res.Pane = i + } + res.PointChanged = res.PointChanged || point.Changed() + if closed { res.Removed = i } }) } } - box := ui.Column(c).Height(h).FillWidth().Disabled(opts.Disabled) + box.Height(h).MinHeight(float32(n)*minimum + float32(n-1)*theme.BorderWidth) box.Children(func() { if n == 1 { build(0)() @@ -92,7 +116,7 @@ func IndicatorPane(c *ui.Context, candles []Candle, view *MarketView, panes *Ind } list := make([]ResizablePanel, n) for i, p := range panes.Panes { - list[i] = ResizablePanel{Label: indicatorName(p.Kind, indicatorParams(p.Kind, p.Params)), Min: 60, Build: build(i)} + list[i] = ResizablePanel{Label: indicatorName(p.Kind, indicatorParams(p.Kind, p.Params)), Min: minimum, Build: build(i)} } r := ResizablePanelGroup(c, &panes.Sizes, list, ResizablePanelGroupOptions{Vertical: true}) r.Element.Fill() @@ -108,8 +132,8 @@ func IndicatorPane(c *ui.Context, candles []Candle, view *MarketView, panes *Ind return res } -// indicatorPaneOne draws one pane's lines over the view's window; it reports the close button. -func indicatorPaneOne(c *ui.Context, candles []Candle, view *MarketView, spec IndicatorPaneSpec, opts IndicatorPaneOptions, height float32) bool { +// indicatorPaneOne draws one indicator and reports its events. +func indicatorPaneOne(c *ui.Context, candles []Candle, view *MarketView, spec IndicatorPaneSpec, opts IndicatorPaneOptions, height float32) (bool, ChartResult) { k := Tokens(c) params := indicatorParams(spec.Kind, spec.Params) name := indicatorName(spec.Kind, params) @@ -119,7 +143,7 @@ func indicatorPaneOne(c *ui.Context, candles []Candle, view *MarketView, spec In closed = iconAction(c, icons.Must("x"), fmt.Sprintf(msg(c, "indicator_pane.remove"), name)).Clicked() }) label := strings.TrimSpace(opts.Label + " " + name) - ch := newChart(c, ChartFrame{Label: label, Height: height}) + ch := newChart(c, ChartFrame{Label: label, Height: height, Status: opts.Status, Error: opts.Error, Empty: opts.Empty}) series := chartMemo(ch, "series", fmt.Sprintf("%s|%v|%v", chartID(candles), spec.Kind, params), func() []ChartSeries { marketCheckCandles(candles) return indicatorSeries(spec.Kind, params, candles) @@ -133,7 +157,7 @@ func indicatorPaneOne(c *ui.Context, candles []Candle, view *MarketView, spec In lines[i] = mktLine{name: s.Name, values: s.Values, color: pal[(i+1)%len(pal)], shape: i} keys[i] = chartKey{Name: s.Name, Color: lines[i].color, Shape: i} } - yr := chartMemo(ch, "y", [3]any{chartID(candles), m.from, m.to}, func() [2]float64 { + yr := chartMemo(ch, "y", [5]any{chartID(candles), m.from, m.to, spec.Kind, fmt.Sprint(params)}, func() [2]float64 { lo, hi := math.Inf(1), math.Inf(-1) for _, l := range lines { for i := m.from; i < m.to; i++ { @@ -185,8 +209,16 @@ func indicatorPaneOne(c *ui.Context, candles []Candle, view *MarketView, spec In p.Line(x, g.plot.Y, x, g.plot.Y+g.plot.H, 1, k.TextMuted) } } - ch.build(spec2) - return closed && !ch.res.Element.IsDisabled() + m.st = *ui.Local(ch.res.Element, "mujica.mkt", func() *mktState { return &mktState{grab: -1, focus: -1, alertFocus: -1} }) + if ch.res.Element.IsDisabled() { + copy := *view + m.view = © + } + result, plot := ch.build(spec2) + if plot != nil { + m.input(plot) + } + return closed && !ch.res.Element.IsDisabled(), result } // paneGeom is geom without the time axis, for lower panes. diff --git a/indicator_selector.go b/indicator_selector.go index 7e82067..2e687ba 100644 --- a/indicator_selector.go +++ b/indicator_selector.go @@ -17,7 +17,7 @@ type IndicatorSelectorOptions struct { Disabled bool } -// IndicatorSelector opens a panel to search, add, remove and tune indicators: overlays go on the price chart, the rest into panes. +// IndicatorSelector searches, adds, removes, and configures chart indicators. func IndicatorSelector(c *ui.Context, overlays *[]IndicatorOverlay, panes *IndicatorPanes, opts IndicatorSelectorOptions) ChoiceResult { if overlays == nil || panes == nil { panic("mujica: IndicatorSelector needs overlays and panes") @@ -97,7 +97,7 @@ func IndicatorSelector(c *ui.Context, overlays *[]IndicatorOverlay, panes *Indic return ChoiceResult{box, changed} } -// indicatorSelectorActive is one added indicator with its parameters and a remove button; it reports removal. +// indicatorSelectorActive edits parameters and reports removal of an indicator. func indicatorSelectorActive(c *ui.Context, u float32, key string, kind IndicatorKind, params *[]float64, changed *bool) bool { removed := false ui.Row(c).Key(key).AlignItems(ui.Center).Gap(u * 2).Wrap().Children(func() { diff --git a/indicator_selector_test.go b/indicator_selector_test.go new file mode 100644 index 0000000..b826a25 --- /dev/null +++ b/indicator_selector_test.go @@ -0,0 +1,77 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "testing" +) + +func TestIndicatorSelectorSearchAddRemoveAndDisabled(t *testing.T) { + var overlays []IndicatorOverlay + var panes IndicatorPanes + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + IndicatorSelector(c, &overlays, &panes, IndicatorSelectorOptions{Disabled: disabled}) + }, 640, 740) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + if err := tt.Click("Indicators (0)"); err != nil { + t.Fatal(err) + } + if err := tt.Click("Search indicators"); err != nil { + t.Fatal(err) + } + tt.Type("RSI") + if tt.HasText("Add MA") || !tt.HasText("RSI") { + t.Fatalf("search %q", tt.Texts()) + } + if err := tt.Click("Add RSI"); err != nil { + t.Fatal(err) + } + if len(panes.Panes) != 1 || panes.Panes[0].Kind != IndicatorRSI { + t.Fatalf("panes %+v", panes.Panes) + } + if err := tt.Click("Remove RSI(14)"); err != nil { + t.Fatal(err) + } + if len(panes.Panes) != 0 { + t.Fatal("pane not removed") + } + disabled = true + tt.Frame() + if tt.HasText("Search indicators") { + t.Fatal("disabled panel remained open") + } +} +func TestIndicatorSelectorSnapshot(t *testing.T) { + overlays := []IndicatorOverlay{{Kind: IndicatorMA}} + panes := IndicatorPanes{Panes: []IndicatorPaneSpec{{Kind: IndicatorRSI}}} + snapshot(t, "indicator_selector", 360, 100, func(c *ui.Context) { + ui.Row(c).Padding(12).Children(func() { IndicatorSelector(c, &overlays, &panes, IndicatorSelectorOptions{}) }) + }) +} + +func TestIndicatorSelectorOverlayParams(t *testing.T) { + var overlays []IndicatorOverlay + var panes IndicatorPanes + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + IndicatorSelector(c, &overlays, &panes, IndicatorSelectorOptions{}) + }, 640, 740) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + if err := tt.Click("Indicators (0)"); err != nil { + t.Fatal(err) + } + if err := tt.Click("Add MA"); err != nil { + t.Fatal(err) + } + if len(overlays) != 1 || overlays[0].Kind != IndicatorMA || overlays[0].Params[0] != 20 { + t.Fatalf("overlay %+v", overlays) + } + if err := tt.Click("MA 1"); err != nil { + t.Fatal(err) + } + tt.Key(0, ui.KeyUp) + if overlays[0].Params[0] != 21 { + t.Fatalf("params %v", overlays[0].Params) + } +} diff --git a/indicators.go b/indicators.go index a11e475..f4321df 100644 --- a/indicators.go +++ b/indicators.go @@ -5,7 +5,7 @@ import ( "math" ) -// Indicator functions are pure: same input, same output, NaN until enough data. +// Indicator helpers are pure; NaN marks insufficient data. // indicatorCheck panics on a period below one. func indicatorCheck(name string, n int) { @@ -22,7 +22,7 @@ func indicatorNaN(n int) []float64 { return out } -// SMA is the simple moving average of the last n values. +// SMA computes the n-period simple moving average. func SMA(vals []float64, n int) []float64 { indicatorCheck("SMA", n) out := indicatorNaN(len(vals)) @@ -39,7 +39,7 @@ func SMA(vals []float64, n int) []float64 { return out } -// EMA is the exponential moving average, k = 2/(n+1), seeded with the SMA of the first n values. +// EMA uses 2/(n+1), seeded by the first n-period SMA. func EMA(vals []float64, n int) []float64 { indicatorCheck("EMA", n) out := indicatorNaN(len(vals)) @@ -60,7 +60,7 @@ func EMA(vals []float64, n int) []float64 { return out } -// Bollinger returns the n-period SMA and the bands width population deviations away. +// Bollinger returns SMA and population-deviation bands. func Bollinger(vals []float64, n int, width float64) (mid, upper, lower []float64) { indicatorCheck("Bollinger", n) if !(width > 0) { @@ -79,7 +79,7 @@ func Bollinger(vals []float64, n int, width float64) (mid, upper, lower []float6 return mid, upper, lower } -// VWAP is the cumulative volume-weighted average of the typical price (H+L+C)/3. +// VWAP averages typical prices weighted by cumulative volume. func VWAP(candles []Candle) []float64 { out := indicatorNaN(len(candles)) var pv, vol float64 @@ -93,7 +93,7 @@ func VWAP(candles []Candle) []float64 { return out } -// MACD returns DIF (fast EMA - slow EMA), DEA (signal EMA of DIF) and the histogram DIF - DEA. +// MACD returns DIF, signal EMA, and their difference. func MACD(vals []float64, fast, slow, signal int) (dif, dea, hist []float64) { if fast >= slow { panic("mujica: MACD fast period must be shorter than slow") @@ -115,7 +115,7 @@ func MACD(vals []float64, fast, slow, signal int) (dif, dea, hist []float64) { return dif, dea, hist } -// RSI is Wilder's relative strength index over n periods, 0 to 100. +// RSI computes Wilder's relative strength index. func RSI(vals []float64, n int) []float64 { indicatorCheck("RSI", n) out := indicatorNaN(len(vals)) @@ -143,7 +143,7 @@ func RSI(vals []float64, n int) []float64 { return out } -// KDJ is the stochastic oscillator: RSV over n, K and D smoothed by m1 and m2 from 50, J = 3K - 2D. +// KDJ computes stochastic K, D, and J from RSV. func KDJ(candles []Candle, n, m1, m2 int) (k, d, j []float64) { indicatorCheck("KDJ", n) indicatorCheck("KDJ m1", m1) @@ -166,7 +166,7 @@ func KDJ(candles []Candle, n, m1, m2 int) (k, d, j []float64) { return k, d, j } -// OBV is on-balance volume: volume added on up closes, subtracted on down closes. +// OBV accumulates signed volume according to close direction. func OBV(candles []Candle) []float64 { out := make([]float64, len(candles)) for i := 1; i < len(candles); i++ { diff --git a/indicators_test.go b/indicators_test.go index d1ad5cd..c73b94a 100644 --- a/indicators_test.go +++ b/indicators_test.go @@ -23,7 +23,6 @@ var nan = math.NaN() func TestSMAAndEMA(t *testing.T) { v := []float64{1, 2, 3, 4, 5, 6} approx(t, "SMA", SMA(v, 3), []float64{nan, nan, 2, 3, 4, 5}) - // k = 0.5: seed 2, then 4*0.5+2*0.5 = 3, 5*0.5+3*0.5 = 4, 6*0.5+4*0.5 = 5. approx(t, "EMA", EMA(v, 3), []float64{nan, nan, 2, 3, 4, 5}) approx(t, "EMA2", EMA([]float64{10, 20, 10}, 1), []float64{10, 20, 10}) approx(t, "EMA3", EMA([]float64{2, 4, 8}, 2), []float64{nan, 3, 3 + (8-3)*2.0/3}) @@ -65,27 +64,23 @@ func TestMACD(t *testing.T) { t.Fatalf("dif[%d]", i) } } - // DEA is the EMA(2) of DIF from index 2: seed is the mean of dif[2], dif[3]. want := EMA(dif[2:], 2) approx(t, "dea", dea[2:], want) if !math.IsNaN(dea[1]) || math.Abs(hist[6]-(dif[6]-dea[6])) > 1e-12 { t.Fatal("hist or warm-up wrong") } - // A straight line: both EMAs trail by a constant, DIF = 0.5, DEA = 0.5, hist = 0. approx(t, "dif line", dif[2:], []float64{0.5, 0.5, 0.5, 0.5, 0.5}) approx(t, "hist line", hist[3:], []float64{0, 0, 0, 0}) } func TestRSI(t *testing.T) { - // Gains 1,1 then a loss of 1: first RSI (n=2) at i=2 is all gains = 100; then Wilder smoothing. r := RSI([]float64{1, 2, 3, 2}, 2) - approx(t, "RSI", r, []float64{nan, nan, 100, 100 - 100/(1+0.5/0.5)}) + approx(t, "RSI", r, []float64{nan, nan, 100, 50}) } func TestKDJ(t *testing.T) { cs := candlesOf([5]float64{1, 2, 0, 1, 0}, [5]float64{1, 4, 0, 4, 0}, [5]float64{4, 4, 2, 3, 0}) k, d, j := KDJ(cs, 2, 3, 3) - // i=1: range 0..4, RSV 100, K = (2*50+100)/3, D = (2*50+K)/3. k1 := 200.0 / 3 d1 := (100 + k1) / 3 // i=2: range 0..4, RSV 75. diff --git a/interval_selector.go b/interval_selector.go index 693ebcf..b7e430c 100644 --- a/interval_selector.go +++ b/interval_selector.go @@ -27,7 +27,7 @@ type IntervalSelectorOptions struct { Disabled bool } -// IntervalSelector picks a candle period: favorites show as quick buttons, and a grouped list holds all, each with a star. +// IntervalSelector groups candle periods and preserves caller-owned favorites. func IntervalSelector(c *ui.Context, value *Interval, favorites *[]Interval, opts IntervalSelectorOptions) ChoiceResult { if value == nil || favorites == nil { panic("mujica: IntervalSelector needs a value and favorites") @@ -81,7 +81,7 @@ func IntervalSelector(c *ui.Context, value *Interval, favorites *[]Interval, opt return ChoiceResult{row, changed} } -// intervalSelectorRow is one interval with its star; it reports choosing the interval. +// intervalSelectorRow shows a selectable period and its favorite toggle. func intervalSelectorRow(c *ui.Context, k theme.Tokens, u float32, iv Interval, on, fav bool, favorites *[]Interval) bool { chosen := false ui.Row(c).Key(string(iv)).AlignItems(ui.Center).Gap(u).Children(func() { diff --git a/interval_selector_test.go b/interval_selector_test.go new file mode 100644 index 0000000..910c87a --- /dev/null +++ b/interval_selector_test.go @@ -0,0 +1,61 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "testing" +) + +func TestIntervalSelectorGroupsFavoritesAndDisabled(t *testing.T) { + value := Interval("1h") + favorites := []Interval{"1m", "1h"} + disabled := false + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + IntervalSelector(c, &value, &favorites, IntervalSelectorOptions{Disabled: disabled}) + }, 500, 700) + tt.SetPreferences(ui.Preferences{ReduceMotion: true, TextScale: 1}) + if err := tt.Click("All intervals"); err != nil { + t.Fatal(err) + } + if !tt.HasText("Minutes") || !tt.HasText("Hours") || !tt.HasText("Days and longer") { + t.Fatalf("groups %q", tt.Texts()) + } + if err := tt.Click("Add 4h to favorites"); err != nil { + t.Fatal(err) + } + if len(favorites) != 3 || favorites[2] != "4h" { + t.Fatalf("favorites %v", favorites) + } + for range 50 { + if tt.Focused("1M") { + break + } + tt.Key(0, ui.KeyTab) + } + if !tt.Focused("1M") { + t.Fatal("keyboard could not reach 1M") + } + tt.Key(0, ui.KeyEnter) + if value != "1M" { + t.Fatalf("interval %v", value) + } + if err := tt.Click("All intervals"); err != nil { + t.Fatal(err) + } + disabled = true + tt.Frame() + if tt.HasText("Days and longer") { + t.Fatal("disabled popup remained open") + } + tt.Key(ui.Alt, ui.KeyDown) + if value != "1M" || len(favorites) != 3 { + t.Fatal("disabled interval changed") + } +} +func TestIntervalSelectorSnapshot(t *testing.T) { + value := Interval("1h") + favorites := []Interval{"1m", "5m", "1h", "1D"} + snapshot(t, "interval_selector", 460, 90, func(c *ui.Context) { + ui.Row(c).Padding(12).Children(func() { IntervalSelector(c, &value, &favorites, IntervalSelectorOptions{}) }) + }) +} diff --git a/line_quote_chart.go b/line_quote_chart.go index 82dafc1..3d890a5 100644 --- a/line_quote_chart.go +++ b/line_quote_chart.go @@ -2,6 +2,7 @@ package mujica import ( "fmt" + "math" "strings" "time" @@ -11,7 +12,7 @@ import ( "mujicaui/theme" ) -// QuotePoint is one tick of an intraday line: time, price and the volume traded since the last point. +// QuotePoint holds time, price, and incremental volume. type QuotePoint struct { Time time.Time Price float64 @@ -21,14 +22,14 @@ type QuotePoint struct { // LineQuoteChartOptions configure a LineQuoteChart. type LineQuoteChartOptions struct { Frame ChartFrame - // PrevClose draws the baseline the day's change is measured from; required. + // PrevClose is the required positive baseline price. PrevClose float64 - // RegularOpen and RegularClose bound the regular session; points outside are pre- and after-market. Zero draws one session. + // RegularOpen and RegularClose optionally delimit extended trading sessions. RegularOpen, RegularClose time.Time Decimals int } -// lineQuoteSession names a point's session: -1 pre, 0 regular, 1 after. +// lineQuoteSession returns pre-market, regular, or after-market. func lineQuoteSession(t time.Time, opts LineQuoteChartOptions) int { switch { case opts.RegularOpen.IsZero(): @@ -41,9 +42,9 @@ func lineQuoteSession(t time.Time, opts LineQuoteChartOptions) int { return 0 } -// LineQuoteChart is an intraday line with the previous close as baseline, the average price, and shaded extended sessions. +// LineQuoteChart draws price, weighted average, and extended sessions. func LineQuoteChart(c *ui.Context, points []QuotePoint, opts LineQuoteChartOptions) ChartResult { - if !(opts.PrevClose > 0) { + if math.IsInf(opts.PrevClose, 0) || !(opts.PrevClose > 0) { panic("mujica: LineQuoteChart needs a positive PrevClose") } if opts.RegularOpen.IsZero() != opts.RegularClose.IsZero() || opts.RegularClose.Before(opts.RegularOpen) { @@ -56,7 +57,7 @@ func LineQuoteChart(c *ui.Context, points []QuotePoint, opts LineQuoteChartOptio out := make([]float64, len(points)) var pv, v float64 for i, p := range points { - if p.Time.IsZero() || i > 0 && !p.Time.After(points[i-1].Time) || !(p.Price > 0) || p.Volume < 0 { + if p.Time.IsZero() || i > 0 && !p.Time.After(points[i-1].Time) || !(p.Price > 0) || p.Volume < 0 || math.IsNaN(p.Volume) || math.IsInf(p.Volume, 0) || math.IsInf(p.Price, 0) { panic(fmt.Sprintf("mujica: LineQuoteChart point %d is out of order or invalid", i)) } pv += p.Price * p.Volume @@ -68,12 +69,12 @@ func LineQuoteChart(c *ui.Context, points []QuotePoint, opts LineQuoteChartOptio } return out }) - dom := chartMemo(ch, "y", chartID(points), func() [2]float64 { + dom := chartMemo(ch, "y", [2]any{chartID(points), opts.PrevClose}, func() [2]float64 { lo, hi := opts.PrevClose, opts.PrevClose for i, p := range points { lo, hi = min(lo, p.Price, avg[i]), max(hi, p.Price, avg[i]) } - // Symmetric around the previous close, so the baseline sits in the middle. + // Center the scale on the previous close. d := max(hi-opts.PrevClose, opts.PrevClose-lo) return [2]float64{opts.PrevClose - d, opts.PrevClose + d} }) @@ -124,6 +125,9 @@ func LineQuoteChart(c *ui.Context, points []QuotePoint, opts LineQuoteChartOptio if len(points) > 1 { ts, layout := internal.TimeTicks(points[0].Time, points[len(points)-1].Time, max(2, int(plot.W/90))) for _, t := range ts { + if layout == "Jan 2" { + layout = msg(c, "candlestick_chart.daily_time") + } tx, tl = append(tx, xs.Map(float64(t.Unix()))), append(tl, t.Format(layout)) } } @@ -132,14 +136,22 @@ func LineQuoteChart(c *ui.Context, points []QuotePoint, opts LineQuoteChartOptio for xx := plot.X; xx < plot.X+plot.W; xx += 6 { p.Line(xx, by, min(xx+3, plot.X+plot.W), by, 1, k.TextMuted) } - price := make([]float64, len(points)) - for i, pt := range points { - price[i] = pt.Price - } + price := chartMemo(ch, "prices", chartID(points), func() []float64 { + out := make([]float64, len(points)) + for i, pt := range points { + out[i] = pt.Price + } + return out + }) at := func(i int) float32 { return x(xs, i) } for li, vals := range [][]float64{price, avg} { col := []ui.Color{k.AccentText, k.Warning}[li] - chartRuns(vals, at, func(idx []int) { + runs := chartMemo(ch, fmt.Sprint("quote.runs.", li), [3]any{chartID(points), plot.X, plot.W}, func() [][]int { + var out [][]int + chartRuns(vals, at, func(idx []int) { out = append(out, idx) }) + return out + }) + for _, idx := range runs { var line ui.Path for j, i := range idx { px, py := internal.Snap(p, at(i)), internal.Snap(p, ys.Map(vals[i])) @@ -150,7 +162,11 @@ func LineQuoteChart(c *ui.Context, points []QuotePoint, opts LineQuoteChartOptio } } p.StrokePath(&line, []float32{1.75, 1.25}[li], col) - }) + for j := 0; j < len(idx); j += max(1, len(idx)/12) { + i := idx[j] + internal.Marker(p, []int{0, 3}[li], at(i), ys.Map(vals[i]), 5, col) + } + } } if active >= 0 { ax := internal.Snap(p, at(active)) diff --git a/market_boundary_test.go b/market_boundary_test.go new file mode 100644 index 0000000..91c9a79 --- /dev/null +++ b/market_boundary_test.go @@ -0,0 +1,68 @@ +package mujica + +import ( + "bytes" + "math" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestMarketIndicatorDomainChangesWithParams(t *testing.T) { + cs := sampleCandles(300) + v := MarketView{Count: 80} + panes := IndicatorPanes{Panes: []IndicatorPaneSpec{{Kind: IndicatorRSI}}} + build := func(c *ui.Context) { + Use(c, Settings{}) + IndicatorPane(c, cs, &v, &panes, IndicatorPaneOptions{Label: "BTC"}) + } + tt := ui.NewTester(build, 640, 400) + panes.Panes[0].Kind = IndicatorOBV + tt.Frame() + fresh := ui.NewTester(build, 640, 400) + if !bytes.Equal(encode(t, tt.Image()), encode(t, fresh.Image())) { + t.Fatal("changed indicator retained its previous scale") + } + +} + +func TestMarketRejectsInvalidLayers(t *testing.T) { + for _, kind := range []string{"compare zero", "compare infinity", "alert infinity", "alert duplicate", "profile NaN", "depth NaN", "indicator infinity"} { + t.Run(kind, func(t *testing.T) { + defer func() { + if recover() == nil { + t.Fatal("invalid data accepted") + } + }() + cs := sampleCandles(2) + v := MarketView{} + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + o := CandlestickOptions{Frame: ChartFrame{Label: "Price"}} + switch kind { + case "compare zero": + x := []CompareSymbol{{Name: "X", Closes: []float64{0, 1}}} + o.Compare = &x + case "compare infinity": + x := []CompareSymbol{{Name: "X", Closes: []float64{1, math.Inf(1)}}} + o.Compare = &x + case "alert infinity": + x := []PriceAlertLine{{ID: "a", Price: math.Inf(1)}} + o.Alerts = &x + case "alert duplicate": + x := []PriceAlertLine{{ID: "a", Price: 1}, {ID: "a", Price: 2}} + o.Alerts = &x + case "profile NaN": + VolumeProfile(c, []ProfileBin{{1, 2, math.NaN()}}, VolumeProfileOptions{Frame: o.Frame}) + return + case "depth NaN": + DepthChart(c, []DepthLevel{{math.NaN(), 1}}, []DepthLevel{{2, 1}}, DepthChartOptions{Frame: o.Frame}) + return + case "indicator infinity": + o.Overlays = []IndicatorOverlay{{Kind: IndicatorBOLL, Params: []float64{2, math.Inf(1)}}} + } + CandlestickChart(c, cs, &v, o) + }, 500, 320) + }) + } +} diff --git a/market_data.go b/market_data.go index 90961a5..87293a9 100644 --- a/market_data.go +++ b/market_data.go @@ -7,38 +7,46 @@ import ( "time" ) -// Candle is one period of trading: open, high, low, close and volume. +// Candle holds OHLC prices, time, and volume. type Candle struct { Time time.Time Open, High, Low, Close float64 Volume float64 } -// marketCheckCandles panics on candles out of time order or with impossible prices. +// marketCheckCandles validates chronological candles and finite OHLC values. func marketCheckCandles(candles []Candle) { for i, c := range candles { if c.Time.IsZero() || i > 0 && !c.Time.After(candles[i-1].Time) { panic(fmt.Sprintf("mujica: candle %d time is zero or not after the one before", i)) } + for _, v := range []float64{c.Open, c.High, c.Low, c.Close, c.Volume} { + if math.IsNaN(v) || math.IsInf(v, 0) { + panic("mujica: candle values must be finite") + } + } if !(c.Low <= min(c.Open, c.Close)) || !(c.High >= max(c.Open, c.Close)) || c.Volume < 0 || math.IsNaN(c.Volume) { panic(fmt.Sprintf("mujica: candle %d has impossible prices or volume", i)) } } } -// MarketView is the caller-held window of a market chart: zoom and pan. +// MarketView holds the visible candle window. type MarketView struct { // Count is how many candles show; zero shows 120. Count int - // End is one past the last shown candle; zero follows the newest. + // End is exclusive; zero follows the newest candle. End int } -// marketWindow resolves the view to [from, to) over n candles, at most room wide. +// marketWindow resolves the visible range, bounded by room. func marketWindow(v MarketView, n, room int) (from, to int) { if v.Count < 0 || v.End < 0 { panic("mujica: MarketView Count and End must not be negative") } + if n == 0 { + return 0, 0 + } count := v.Count if count == 0 { count = 120 @@ -51,7 +59,7 @@ func marketWindow(v MarketView, n, room int) (from, to int) { return to - count, to } -// marketPan moves the view by delta candles; reaching the newest follows it again. +// marketPan moves the window; the newest edge enables following. func marketPan(v *MarketView, n, room, delta int) { from, to := marketWindow(*v, n, room) v.Count = to - from @@ -63,7 +71,7 @@ func marketPan(v *MarketView, n, room, delta int) { } } -// marketZoom scales the shown count by f, keeping the newest shown candle, within 10 and room. +// marketZoom changes visible count while preserving the right edge. func marketZoom(v *MarketView, n, room int, f float64) { from, to := marketWindow(*v, n, room) count := int(math.Round(float64(to-from) * f)) @@ -76,18 +84,18 @@ func marketZoom(v *MarketView, n, room int, f float64) { } } -// marketIndexAt finds the candle at or before t, or -1 before the first. +// marketIndexAt finds the candle at or before t. func marketIndexAt(candles []Candle, t time.Time) int { return sort.Search(len(candles), func(i int) bool { return candles[i].Time.After(t) }) - 1 } -// Interval names a candle period: 1m 3m 5m 15m 30m 1h 2h 4h 6h 12h 1D 3D 1W 1M. +// Interval names a supported candle period. type Interval string // Intervals lists every Interval, shortest first. var Intervals = []Interval{"1m", "3m", "5m", "15m", "30m", "1h", "2h", "4h", "6h", "12h", "1D", "3D", "1W", "1M"} -// Close returns when the candle holding t closes: periods align to the clock in loc, weeks start Monday. +// Close aligns periods locally; weeks start Monday. func (iv Interval) Close(t time.Time, loc *time.Location) time.Time { t = t.In(loc) day := time.Date(t.Year(), t.Month(), t.Day(), 0, 0, 0, 0, loc) diff --git a/market_input.go b/market_input.go index 141facb..8fb7428 100644 --- a/market_input.go +++ b/market_input.go @@ -1,12 +1,14 @@ package mujica import ( + "fmt" "log/slog" + "math" "github.com/egoist/mygo/ui" ) -// input pans, zooms, drags alerts and drawings, and keeps the focused candle in view. +// input handles pan, zoom, alerts, drawings, and keyboard following. func (m *mktCore) input(plot *ui.Element) { if plot.IsDisabled() { return @@ -39,7 +41,7 @@ func (m *mktCore) input(plot *ui.Element) { marketZoom(m.view, n, room, 1.25) changed = true } - // The keyboard mark may leave the window: the view follows it. + // Keep the keyboard mark visible. f := m.ch.st.focus if f >= 0 && f != m.st.focus && !changed && (f < m.from || f >= m.to) { if f < m.from { @@ -60,6 +62,7 @@ func (m *mktCore) input(plot *ui.Element) { used = d.input(m, plot, g, x, y, over, held, dx, dy) } if !used { + m.alertsKeyboard(plot) used = m.alertsInput(g, x, y, held, dy) } if !used && held && dx != 0 && g.band.Step() > 0 { @@ -78,3 +81,42 @@ func (m *mktCore) input(plot *ui.Element) { m.c.Invalidate() } } + +func (m *mktCore) alertsKeyboard(plot *ui.Element) { + if m.opts.Alerts == nil || len(*m.opts.Alerts) == 0 || m.base != 0 { + return + } + a := *m.opts.Alerts + m.st.alertFocus = min(m.st.alertFocus, len(a)-1) + selected := false + if plot.Shortcut(0, ui.KeyPageDown) { + m.st.alertFocus = (m.st.alertFocus + 1) % len(a) + selected = true + } + if plot.Shortcut(0, ui.KeyPageUp) { + m.st.alertFocus = (max(m.st.alertFocus, 0) - 1 + len(a)) % len(a) + selected = true + } + if selected && m.opts.Drawings != nil { + d := m.opts.Drawings + d.sel, d.pending, d.Tool = 0, nil, ToolSelect + } + delta := 0 + if m.opts.Drawings == nil || m.opts.Drawings.Selected() < 0 { + if plot.Shortcut(ui.Alt, ui.KeyUp) { + delta = 1 + } + if plot.Shortcut(ui.Alt, ui.KeyDown) { + delta = -1 + } + } + if i := m.st.alertFocus; i >= 0 && (selected || delta != 0) { + spec := numberInputResolve(NumberInputOptions{Step: math.Pow10(-m.dec), Precision: m.dec}) + if delta != 0 { + a[i].Price = spec.stepBy(a[i].Price, delta) + slog.Debug("mujica: price_alert_line moved", "id", a[i].ID) + } + m.c.Announce(fmt.Sprintf(msg(m.c, "price_alert_line.tag"), priceUngrouped(a[i].Price, m.dec))) + m.c.Invalidate() + } +} diff --git a/market_keyboard_test.go b/market_keyboard_test.go new file mode 100644 index 0000000..a4f99b3 --- /dev/null +++ b/market_keyboard_test.go @@ -0,0 +1,54 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "testing" +) + +func TestDrawingToolsKeyboardCreateAndSelect(t *testing.T) { + cs := sampleCandles(30) + v := MarketView{Count: 30} + d := DrawingTools{Tool: ToolTrendLine} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + CandlestickChart(c, cs, &v, CandlestickOptions{Frame: ChartFrame{Label: "Drawing"}, Drawings: &d}) + }, 640, 340) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyHome) + tt.Key(0, ui.KeyEnter) + tt.Key(0, ui.KeyRight) + tt.Key(0, ui.KeyEnter) + if len(d.Items) != 1 || d.Items[0].A.Time != cs[0].Time || d.Items[0].B.Time != cs[1].Time { + t.Fatalf("keyboard drawing %+v", d) + } + tt.Key(0, ui.KeyEscape) + tt.Key(ui.Alt, ui.KeyEnter) + if d.Selected() != 0 { + t.Fatalf("selection %d", d.Selected()) + } + tt.Key(0, ui.KeyDelete) + if len(d.Items) != 0 { + t.Fatal("keyboard deletion failed") + } +} + +func TestPriceAlertLineKeyboard(t *testing.T) { + cs := sampleCandles(30) + v := MarketView{Count: 30} + alerts := []PriceAlertLine{{ID: "a", Price: 100}, {ID: "b", Price: 105}} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + CandlestickChart(c, cs, &v, CandlestickOptions{Frame: ChartFrame{Label: "Alerts"}, Alerts: &alerts}) + }, 640, 340) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyPageDown) + tt.Key(ui.Alt, ui.KeyUp) + if alerts[0].Price != 100.01 || alerts[1].Price != 105 { + t.Fatalf("first alert %+v", alerts) + } + tt.Key(0, ui.KeyPageDown) + tt.Key(ui.Alt, ui.KeyDown) + if alerts[1].Price != 104.99 { + t.Fatalf("second alert %+v", alerts) + } +} diff --git a/market_large_test.go b/market_large_test.go new file mode 100644 index 0000000..826edd1 --- /dev/null +++ b/market_large_test.go @@ -0,0 +1,49 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "testing" +) + +func TestDepthChartLargeDataBounded(t *testing.T) { + bids, asks := make([]DepthLevel, 100000), make([]DepthLevel, 100000) + for i := range bids { + bids[i] = DepthLevel{100 - float64(i)*0.0001, 1} + asks[i] = DepthLevel{101 + float64(i)*0.0001, 2} + } + var res ChartResult + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + res = DepthChart(c, bids, asks, DepthChartOptions{Frame: ChartFrame{Label: "Depth"}}) + }, 640, 340) + drawn := *ui.Local(res.Element, "mujica.depth.drawn", func() int { return 0 }) + if drawn <= 0 || drawn > 4*640+8 { + t.Fatalf("painted %d depth vertices", drawn) + } + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnd) + if res.Point != 199999 { + t.Fatalf("last point %d", res.Point) + } +} + +func TestVolumeProfileLargeDataBounded(t *testing.T) { + bins := make([]ProfileBin, 100000) + for i := range bins { + bins[i] = ProfileBin{float64(i), float64(i + 1), float64(i%19 + 1)} + } + var res ChartResult + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + res = VolumeProfile(c, bins, VolumeProfileOptions{Frame: ChartFrame{Label: "Profile"}}) + }, 640, 340) + drawn := *ui.Local(res.Element, "mujica.profile.drawn", func() int { return 0 }) + if drawn <= 0 || drawn > 4*340+4 { + t.Fatalf("painted %d profile bins", drawn) + } + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnd) + if res.Point != 99999 { + t.Fatalf("last bin %d", res.Point) + } +} diff --git a/market_layers.go b/market_layers.go index 881121c..c98aefb 100644 --- a/market_layers.go +++ b/market_layers.go @@ -11,7 +11,7 @@ import ( "mujicaui/internal" ) -// PriceAlertLine is a caller-held price alert drawn as a dashed line that the pointer drags. +// PriceAlertLine holds a draggable, caller-owned price threshold. type PriceAlertLine struct { ID string Price float64 @@ -19,40 +19,63 @@ type PriceAlertLine struct { Label string } -// CompareSymbol is another symbol's closes, aligned to the chart's candles, shown in percent. +// CompareSymbol holds aligned closes for percent comparison. type CompareSymbol struct { Name string Closes []float64 } -// compareLines adds the compare symbols' percent lines and sets percent mode. +// compareLines normalizes prices and compared symbols into percentages. func (m *mktCore) compareLines() { if m.opts.Compare == nil || len(*m.opts.Compare) == 0 || m.to <= m.from { return } m.base = m.candles[m.from].Close + if m.base == 0 { + panic("mujica: percent comparison needs a nonzero base close") + } pal := internal.Palette(m.k) + for i := range m.overlays { + line := &m.overlays[i] + values := line.values + base := m.base + line.values = chartMemo(m.ch, fmt.Sprint("compare.overlay.", i), [2]any{chartID(values), base}, func() []float64 { + out := make([]float64, len(values)) + for j, v := range values { + out[j] = (v/base - 1) * 100 + } + return out + }) + } for i, s := range *m.opts.Compare { if s.Name == "" || len(s.Closes) != len(m.candles) { panic(fmt.Sprintf("mujica: CompareSymbol %q needs a Name and one close per candle", s.Name)) } + chartMemo(m.ch, "compare.check."+s.Name, chartID(s.Closes), func() bool { + for _, v := range s.Closes { + if math.IsInf(v, 0) || (!math.IsNaN(v) && v <= 0) { + panic("mujica: compared closes must be positive or NaN") + } + } + return true + }) base := math.NaN() for j := m.from; j < m.to && math.IsNaN(base); j++ { base = s.Closes[j] } closes := s.Closes - vals := chartMemo(m.ch, "compare."+s.Name, [2]any{chartID(closes), base}, func() []float64 { + vals := chartMemo(m.ch, "compare."+s.Name, [2]any{chartID(closes), math.Float64bits(base)}, func() []float64 { out := make([]float64, len(closes)) for j, v := range closes { out[j] = (v/base - 1) * 100 } return out }) - m.overlays = append(m.overlays, mktLine{name: s.Name, values: vals, color: pal[(i+1)%len(pal)], shape: len(m.overlays)}) + m.overlays = append(m.overlays, mktLine{name: s.Name, values: vals, color: pal[(i+1)%len(pal)], shape: i + 1}) } } -// CompareLegend lists the compare symbols with their colors and a remove button each; Changed reports a removal. +// CompareLegend shows series markers and removal actions. func CompareLegend(c *ui.Context, symbols *[]CompareSymbol) ChoiceResult { if symbols == nil { panic("mujica: CompareLegend needs symbols") @@ -81,13 +104,22 @@ func CompareLegend(c *ui.Context, symbols *[]CompareSymbol) ChoiceResult { return ChoiceResult{row, removed >= 0} } -// alertsCheck runs OnAlert for each alert the newest close crossed since the last frame. +// alertsCheck fires callbacks when the latest close crosses thresholds. func (m *mktCore) alertsCheck() { + if m.opts.Alerts != nil { + seen := map[string]bool{} + for _, a := range *m.opts.Alerts { + if a.ID == "" || seen[a.ID] || math.IsNaN(a.Price) || math.IsInf(a.Price, 0) { + panic("mujica: alerts need unique IDs and finite prices") + } + seen[a.ID] = true + } + } if m.opts.Alerts == nil || len(m.candles) == 0 { return } last := m.candles[len(m.candles)-1] - if m.st.alertSeen && last.Close != m.st.lastClose && m.opts.OnAlert != nil { + if !m.ch.res.Element.IsDisabled() && m.st.alertSeen && last.Close != m.st.lastClose && m.opts.OnAlert != nil { for _, a := range *m.opts.Alerts { if (m.st.lastClose-a.Price)*(last.Close-a.Price) <= 0 && m.st.lastClose != a.Price { slog.Debug("mujica: price_alert_line crossed", "id", a.ID) @@ -98,7 +130,7 @@ func (m *mktCore) alertsCheck() { m.st.lastClose, m.st.alertSeen = last.Close, true } -// alertsInput drags an alert line that the press started on; it reports taking the drag. +// alertsInput drags the threshold captured by the initial press. func (m *mktCore) alertsInput(g mktGeom, x, y float32, held bool, dy float32) bool { if m.opts.Alerts == nil || m.base != 0 { return false @@ -110,7 +142,7 @@ func (m *mktCore) alertsInput(g mktGeom, x, y float32, held bool, dy float32) bo } if m.st.grab < 0 { for i, a := range alerts { - if math.Abs(float64(g.ys.Map(a.Price)-(y-dy))) <= 5 { + if g.plot.Contains(x, y-dy) && math.Abs(float64(g.ys.Map(a.Price)-(y-dy))) <= 14 { m.st.grab = i } } @@ -118,19 +150,22 @@ func (m *mktCore) alertsInput(g mktGeom, x, y float32, held bool, dy float32) bo if m.st.grab < 0 || m.st.grab >= len(alerts) { return false } - p := math.Pow(10, float64(m.dec)) - alerts[m.st.grab].Price = math.Round(g.ys.Invert(y)*p) / p + spec := numberInputResolve(NumberInputOptions{Step: math.Pow10(-m.dec), Precision: m.dec}) + alerts[m.st.grab].Price = spec.round(g.ys.Invert(y)) slog.Debug("mujica: price_alert_line moved", "id", alerts[m.st.grab].ID) return true } -// paintAlerts draws each alert as a dashed line with its price tag. +// paintAlerts draws dashed thresholds and price labels. func (m *mktCore) paintAlerts(p *ui.Painter, g mktGeom, size float32) { if m.opts.Alerts == nil || m.base != 0 { return } - for _, a := range *m.opts.Alerts { + for i, a := range *m.opts.Alerts { y := internal.Snap(p, g.ys.Map(a.Price)) + if i == m.st.alertFocus { + p.FillPath(internal.Diamond(internal.Snap(p, g.plot.X+8), y, 9), m.k.Warning) + } for x := g.plot.X; x < g.plot.X+g.plot.W; x += 8 { p.Line(x, y, min(x+4, g.plot.X+g.plot.W), y, 1, m.k.Warning) } diff --git a/market_regression_test.go b/market_regression_test.go new file mode 100644 index 0000000..db4267d --- /dev/null +++ b/market_regression_test.go @@ -0,0 +1,89 @@ +package mujica + +import ( + "math" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestMarketEmptyWindow(t *testing.T) { + from, to := marketWindow(MarketView{}, 0, 200) + if from != 0 || to != 0 { + t.Fatalf("empty window %d..%d", from, to) + } +} + +func TestMarketDisabledAlert(t *testing.T) { + cs := sampleCandles(2) + v := MarketView{} + alerts := []PriceAlertLine{{ID: "a", Price: cs[1].Close + 1}} + disabled, fired := false, 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(disabled).Children(func() { + CandlestickChart(c, cs, &v, CandlestickOptions{Frame: ChartFrame{Label: "Price"}, Alerts: &alerts, + OnAlert: func(PriceAlertLine, Candle) { fired++ }}) + }) + }, 500, 320) + disabled = true + next := cs[1] + next.Time = next.Time.Add(3600e9) + next.Close += 2 + next.High = max(next.High, next.Close) + cs = append(cs, next) + tt.Frame() + if fired != 0 { + t.Fatalf("disabled alert fired %d times", fired) + } +} + +func TestMarketDisabledLayoutCopy(t *testing.T) { + state := MultiChartState{Count: 2} + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(true).Children(func() { + MultiChartLayout(c, &state, MultiChartLayoutOptions{}, func(_ int, cell *ChartCell) { + cell.Symbol = "changed" + }) + }) + }, 600, 600) + if state.Cells[0].Symbol != "" || state.Cells[1].Symbol != "" { + t.Fatalf("disabled layout wrote cells: %+v", state.Cells) + } +} + +func TestMarketDisabledParamsCopy(t *testing.T) { + var params []float64 + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Disabled(true).Children(func() { IndicatorParamsField(c, IndicatorMA, ¶ms) }) + }, 500, 100) + if params != nil { + t.Fatalf("disabled field initialized caller parameters: %v", params) + } +} + +func TestMarketInvalidFiniteData(t *testing.T) { + for _, v := range []float64{math.Inf(1), math.Inf(-1), math.NaN()} { + func() { + defer func() { + if recover() == nil { + t.Errorf("nonfinite candle accepted: %v", v) + } + }() + cs := sampleCandles(1) + cs[0].High = v + marketCheckCandles(cs) + }() + } +} + +func TestMarketLockedUndo(t *testing.T) { + d := DrawingTools{Items: []Drawing{{Tool: ToolHorizontal}}} + d.Clear() + d.Locked = true + if d.Undo() || len(d.Items) != 0 { + t.Fatal("locked drawings accepted undo") + } +} diff --git a/market_review_regression_test.go b/market_review_regression_test.go new file mode 100644 index 0000000..04ddf07 --- /dev/null +++ b/market_review_regression_test.go @@ -0,0 +1,192 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "image" + "math" + "testing" + "time" +) + +func TestMarketSyncRange(t *testing.T) { + cs := sampleCandles(300) + short := cs[:200] + s := ChartSync{Count: 40, End: cs[249].Time} + var a, b MarketView + ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Children(func() { + CandlestickChart(c, cs, &a, CandlestickOptions{Frame: ChartFrame{Label: "A", Height: 100}, Sync: &s, SyncID: "a"}) + CandlestickChart(c, short, &b, CandlestickOptions{Frame: ChartFrame{Label: "B", Height: 100}, Sync: &s, SyncID: "b"}) + }) + }, 640, 400) + t.Logf("A=%+v B=%+v sync.End=%v", a, b, s.End) + if a.End != 250 || s.End != cs[249].Time { + t.Error("B erased A's explicit historical range") + } +} +func TestMarketPaneKeyboardGeometry(t *testing.T) { + cs := sampleCandles(300) + v := MarketView{Count: 40} + panes := IndicatorPanes{Panes: []IndicatorPaneSpec{{Kind: IndicatorOBV}}} + var r IndicatorPaneResult + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r = IndicatorPane(c, cs, &v, &panes, IndicatorPaneOptions{Label: "BTC", Height: 220}) + }, 640, 300) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyHome) + tt.Frame() + from, to := marketWindow(v, 300, 192) + t.Logf("Point=%d visible=%d..%d view=%+v", r.Point, from, to, v) + if r.Point < from || r.Point >= to { + t.Error("focused readout has no visible crosshair") + } +} +func TestMarketAlertsWithDrawingTools(t *testing.T) { + cs := sampleCandles(30) + v := MarketView{} + a := []PriceAlertLine{{ID: "a", Price: 100}} + d := DrawingTools{} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + CandlestickChart(c, cs, &v, CandlestickOptions{Frame: ChartFrame{Label: "A"}, Alerts: &a, Drawings: &d}) + }, 640, 300) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyPageDown) + tt.Key(ui.Alt, ui.KeyUp) + t.Logf("alert=%v", a[0].Price) + if a[0].Price != 100.01 { + t.Error("alert keyboard adjustment inaccessible with idle drawing tools") + } +} +func TestMarketDrawingSwitchCancelsPending(t *testing.T) { + cs := sampleCandles(30) + v := MarketView{} + d := DrawingTools{Tool: ToolTrendLine} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Row(c).Children(func() { + DrawingToolbar(c, &d, DrawingToolbarOptions{}) + CandlestickChart(c, cs, &v, CandlestickOptions{Frame: ChartFrame{Label: "A"}, Drawings: &d}).Element.Grow(1) + }) + }, 640, 450) + tt.ClickAt(250, 100) + if d.pending == nil { + t.Fatal("setup missing pending point") + } + tt.Key(ui.Alt, ui.Key1) + t.Logf("Tool=%d pending=%+v", d.Tool, d.pending) + before := v + tt.Press(300, 150) + tt.Move(400, 150) + tt.Release(400, 150) + t.Logf("before=%+v after=%+v pending=%+v", before, v, d.pending) + if d.Tool == ToolSelect && d.pending != nil { + t.Error("Select retains previous tool preview and captures pan input") + } +} +func TestMarketCountdownDST(t *testing.T) { + loc, err := time.LoadLocation("America/New_York") + if err != nil { + t.Fatal(err) + } + now := time.Date(2026, 3, 8, 23, 30, 0, 0, loc) + close := Interval("1h").Close(now, loc) + t.Logf("now=%s closes=%s", now, close) + if close.Hour() != 0 { + t.Error("hourly candle closes off the wall-clock hour") + } +} +func TestMarketPaneResizeGeometry(t *testing.T) { + cs := sampleCandles(300) + v := MarketView{Count: 40} + p := IndicatorPanes{Panes: []IndicatorPaneSpec{{Kind: IndicatorMACD}, {Kind: IndicatorRSI}}} + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + IndicatorPane(c, cs, &v, &p, IndicatorPaneOptions{Label: "BTC", Height: 320}) + }, 640, 400) + for i := 0; i < 12; i++ { + tt.Key(0, ui.KeyTab) + if tt.Focused("Resize MACD(12,26,9) and RSI(14)") { + break + } + } + t.Logf("texts=%q", tt.Texts()) + tt.Key(0, ui.KeyHome) + tt.Frame() + top, _ := tt.Find("MACD(12,26,9)") + plot, _ := tt.Find("BTC MACD(12,26,9)") + t.Logf("sizes=%v top=%+v plot=%+v", p.Sizes, top, plot) + if plot.H == 0 { + t.Error("resizing to advertised minimum completely hides the chart") + } +} +func TestMarketMissingComparisonCache(t *testing.T) { + cs := sampleCandles(100000) + v := MarketView{} + s := []CompareSymbol{{Name: "missing", Closes: make([]float64, len(cs))}} + for i := range s[0].Closes { + s[0].Closes[i] = math.NaN() + } + var r ChartResult + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + r = CandlestickChart(c, cs, &v, CandlestickOptions{Frame: ChartFrame{Label: "A"}, Compare: &s}) + }, 640, 320) + memo := ui.Local(r.Element, "mujica.memo.compare.missing", func() chartMemoEntry { return chartMemoEntry{} }) + before := chartID(memo.val.([]float64)) + tt.Frame() + memo = ui.Local(r.Element, "mujica.memo.compare.missing", func() chartMemoEntry { return chartMemoEntry{} }) + after := chartID(memo.val.([]float64)) + t.Logf("before=%s after=%s", before, after) + if before != after { + t.Error("unchanged missing comparison allocated and recomputed 100000 values") + } +} + +func TestMarketDailyAxisLocale(t *testing.T) { + candles := sampleCandles(30) + for i := range candles { + candles[i].Time = candles[0].Time.AddDate(0, 0, i) + } + render := func(locale Locale) *image.RGBA { + view := MarketView{} + return ui.Render(func(c *ui.Context) { + Use(c, Settings{Locale: locale}) + CandlestickChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "BTC", Height: 240}}) + }, 640, 320, 1) + } + en, zh := render(EnUS), render(ZhCN) + for y := 214; y < 240; y++ { + for x := 60; x < 620; x++ { + if en.RGBAAt(x, y) != zh.RGBAAt(x, y) { + return + } + } + } + t.Fatal("Chinese daily time axis retained English labels") +} + +func TestMarketSyncDifferentIntervals(t *testing.T) { + cs := sampleCandles(300) + var slower []Candle + for i := 0; i < len(cs); i += 2 { + slower = append(slower, cs[i]) + } + s := ChartSync{Count: 40, End: cs[199].Time} + var a, b MarketView + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + ui.Column(c).Children(func() { + CandlestickChart(c, cs, &a, CandlestickOptions{Frame: ChartFrame{Label: "A", Height: 100}, Sync: &s, SyncID: "a"}) + CandlestickChart(c, slower, &b, CandlestickOptions{Frame: ChartFrame{Label: "B", Height: 100}, Sync: &s, SyncID: "b"}) + }) + }, 640, 400) + tt.Frame() + from, to := marketWindow(b, len(slower), 200) + if b.Count != 20 || slower[from].Time != cs[160].Time || slower[to-1].Time != cs[198].Time || s.End != cs[199].Time { + t.Fatalf("intervals drifted: a=%+v b=%+v sync=%+v", a, b, s) + } +} diff --git a/market_states_test.go b/market_states_test.go new file mode 100644 index 0000000..90f3d53 --- /dev/null +++ b/market_states_test.go @@ -0,0 +1,115 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "mujicaui/theme" + "testing" +) + +func TestMarketChartsStatesDisabledAndBoundaries(t *testing.T) { + for _, name := range []string{"Candlestick", "OHLC", "HeikinAshi", "Quote", "Volume", "Depth", "Profile", "Overlay", "Compare", "Alerts", "Drawings"} { + t.Run(name, func(t *testing.T) { + cs := sampleCandles(30) + v := MarketView{Count: 30} + raw := false + bids, asks := sampleBook() + bins := VolumeProfileOf(cs, 12) + quotes, _, _ := samplePoints() + symbols := []CompareSymbol{{Name: "Other", Closes: closesOf(cs)}} + alerts := []PriceAlertLine{{ID: "a", Price: 100}} + drawings := DrawingTools{} + status := DataReady + disabled, empty := false, false + var r ChartResult + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{Density: theme.Compact}) + ui.Column(c).Disabled(disabled).Width(600).Children(func() { + candles := cs + if empty { + candles = nil + } + frame := ChartFrame{Label: "Market", Height: 180, Status: status, Error: "Archive unavailable"} + opts := CandlestickOptions{Frame: frame} + switch name { + case "OHLC": + r = OHLCChart(c, candles, &v, opts) + case "HeikinAshi": + r = HeikinAshiChart(c, candles, &v, &raw, opts) + case "Quote": + q := quotes + if empty { + q = nil + } + r = LineQuoteChart(c, q, LineQuoteChartOptions{Frame: frame, PrevClose: 100}) + case "Volume": + r = VolumeChart(c, candles, &v, VolumeChartOptions{Frame: frame}) + case "Depth": + b, a := bids, asks + if empty { + b = nil + a = nil + } + r = DepthChart(c, b, a, DepthChartOptions{Frame: frame}) + case "Profile": + b := bins + if empty { + b = nil + } + r = VolumeProfile(c, b, VolumeProfileOptions{Frame: frame}) + default: + if name == "Overlay" { + opts.Overlays = []IndicatorOverlay{{Kind: IndicatorMA}} + } + if name == "Compare" { + opts.Compare = &symbols + } + if name == "Alerts" { + opts.Alerts = &alerts + } + if name == "Drawings" { + opts.Drawings = &drawings + } + r = CandlestickChart(c, candles, &v, opts) + } + }) + }, 620, 350) + for range 10 { + if tt.Focused("Market") { + break + } + tt.Key(0, ui.KeyTab) + } + tt.Key(0, ui.KeyHome) + tt.Key(0, ui.KeyRight) + if r.Point < 0 || len(tt.Announcements()) == 0 { + t.Fatalf("keyboard path point %d", r.Point) + } + tt.Key(0, ui.KeyHome) + first := r.Point + tt.Key(0, ui.KeyLeft) + if name != "Depth" && name != "Profile" && r.Point != first { + t.Fatalf("left boundary %d", r.Point) + } + disabled = true + before := v + tt.Frame() + tt.Key(0, ui.KeyEqual) + tt.Scroll(200, 120, 0, 20) + tt.ClickAt(200, 120) + if v != before { + t.Fatalf("disabled window changed: %+v", v) + } + disabled = false + tt.Frame() + height := r.Element.Bounds().H + for _, st := range []DataStatus{DataLoading, DataFailed, DataReady} { + status = st + empty = st == DataReady + tt.Frame() + if r.Point != -1 || r.Element.Bounds().H != height { + t.Fatalf("state %v: point %d height %v want %v", st, r.Point, r.Element.Bounds().H, height) + } + } + }) + } +} diff --git a/messages_mktchart.go b/messages_mktchart.go index 3930344..61c3fef 100644 --- a/messages_mktchart.go +++ b/messages_mktchart.go @@ -2,11 +2,12 @@ package mujica func init() { addMessages(map[string][2]string{ + "candlestick_chart.daily_time": {"Jan 2", "1月2日"}, "candlestick_chart.ohlc": {"O %s H %s L %s C %s", "开 %s 高 %s 低 %s 收 %s"}, "candlestick_chart.volume": {"Vol", "量"}, - "heikin_ashi.smoothed": {"Heikin-Ashi", "平均 K 线"}, - "heikin_ashi.raw": {"Candles", "原 K 线"}, - "heikin_ashi.switch": {"Candle style", "K 线样式"}, + "heikin_ashi_chart.smoothed": {"Heikin-Ashi", "平均 K 线"}, + "heikin_ashi_chart.raw": {"Candles", "原 K 线"}, + "heikin_ashi_chart.switch": {"Candle style", "K 线样式"}, "compare_symbol.label": {"Compared symbols", "对比品种"}, "compare_symbol.remove": {"Remove %s", "移除 %s"}, "price_alert_line.tag": {"Alert %s", "预警 %s"}, @@ -69,6 +70,7 @@ func init() { "indicator_selector.add": {"Add", "添加"}, "indicator_selector.add_named": {"Add %s", "添加 %s"}, "indicator_selector.none": {"No indicator matches", "没有匹配的指标"}, + "drawing_tools.selected": {"Drawing %d selected", "已选择画线 %d"}, "drawing_tools.note": {"Note", "标注"}, }) } diff --git a/multi_chart_layout.go b/multi_chart_layout.go index 1543892..977b422 100644 --- a/multi_chart_layout.go +++ b/multi_chart_layout.go @@ -10,18 +10,18 @@ import ( "mujicaui/theme" ) -// ChartCell is one chart of a MultiChartLayout: its symbol, period and view. +// ChartCell holds one chart's symbol, interval, and window. type ChartCell struct { Symbol string Interval Interval View MarketView } -// MultiChartState is the caller-held grid: how many cells show, all six cells' settings, and the active one. +// MultiChartState preserves six cells across layout changes. type MultiChartState struct { // Count is 1, 2, 4 or 6; zero is 1. Count int - // Cells keep their settings while hidden, so changing the layout loses nothing. + // Cells preserve their settings while hidden. Cells [6]ChartCell Active int } @@ -32,11 +32,19 @@ type MultiChartLayoutOptions struct { Height float32 } -// MultiChartLayout shows 1, 2, 4 or 6 charts in a grid, each built by cell with its own settings. +// MultiChartLayout builds 1, 2, 4, or 6 independent charts. func MultiChartLayout(c *ui.Context, state *MultiChartState, opts MultiChartLayoutOptions, cell func(i int, cell *ChartCell)) ChoiceResult { if state == nil || cell == nil { panic("mujica: MultiChartLayout needs a state and a cell builder") } + root := ui.Column(c).Gap(Density(c).Unit() * 2).FillWidth() + if root.IsDisabled() { + copy := *state + state = © + } + if opts.Height < 0 { + panic("mujica: MultiChartLayout Height must be non-negative") + } if state.Count == 0 { state.Count = 1 } @@ -54,7 +62,6 @@ func MultiChartLayout(c *ui.Context, state *MultiChartState, opts MultiChartLayo h = 480 } changed := false - root := ui.Column(c).Gap(u * 2).FillWidth() root.Children(func() { sel := []int{state.Count} var items []ToggleItem[int] @@ -68,6 +75,7 @@ func MultiChartLayout(c *ui.Context, state *MultiChartState, opts MultiChartLayo slog.Debug("mujica: multi_chart_layout count", "count", state.Count) } }) + cols = map[int]int{1: 1, 2: 2, 4: 2, 6: 3}[state.Count] rows := (state.Count + cols - 1) / cols grid := ui.Box(c).Grid().Columns(cols).Gap(u * 2).Height(h).FillWidth() grid.Children(func() { @@ -81,7 +89,7 @@ func MultiChartLayout(c *ui.Context, state *MultiChartState, opts MultiChartLayo } else { box.Border(theme.BorderWidth, k.Border) } - if box.FocusWithin() || box.Clicked() { + if !box.IsDisabled() && (box.FocusWithin() || box.Clicked()) { if state.Active != i { state.Active, changed = i, true } diff --git a/multi_chart_layout_test.go b/multi_chart_layout_test.go new file mode 100644 index 0000000..9a85df6 --- /dev/null +++ b/multi_chart_layout_test.go @@ -0,0 +1,64 @@ +package mujica + +import ( + "github.com/egoist/mygo/ui" + "testing" +) + +func TestMultiChartLayoutKeepsCellsAndDisabled(t *testing.T) { + state := MultiChartState{Count: 6, Active: 5} + for i := range state.Cells { + state.Cells[i] = ChartCell{Symbol: "BTC", Interval: "1h", View: MarketView{Count: 20 + i}} + } + disabled := false + built := 0 + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + built = 0 + ui.Column(c).Disabled(disabled).Children(func() { + MultiChartLayout(c, &state, MultiChartLayoutOptions{Height: 200}, func(_ int, cell *ChartCell) { built++; ui.Text(c, cell.Symbol) }) + }) + }, 700, 300) + if built != 6 { + t.Fatalf("built %d", built) + } + if err := tt.Click("6 charts"); err != nil { + t.Fatal(err) + } + tt.Key(0, ui.KeyLeft) + tt.Key(0, ui.KeySpace) + if state.Count != 4 || state.Active != 3 || built != 4 { + t.Fatalf("layout %+v built %d", state, built) + } + if state.Cells[5].View.Count != 25 { + t.Fatal("hidden state lost") + } + tt.Key(0, ui.KeyLeft) + tt.Key(0, ui.KeySpace) + tt.Key(0, ui.KeyLeft) + tt.Key(0, ui.KeySpace) + tt.Key(0, ui.KeyRight) + tt.Key(0, ui.KeySpace) + tt.Key(0, ui.KeyRight) + tt.Key(0, ui.KeySpace) + tt.Key(0, ui.KeyRight) + tt.Key(0, ui.KeySpace) + if state.Count != 6 || state.Cells[5].View.Count != 25 { + t.Fatal("restored state lost") + } + disabled = true + tt.Frame() + tt.Key(0, ui.KeyLeft) + tt.Key(0, ui.KeySpace) + if state.Count != 6 { + t.Fatal("disabled layout changed") + } +} +func TestMultiChartLayoutSnapshot(t *testing.T) { + state := MultiChartState{Count: 4} + snapshot(t, "multi_chart_layout", 640, 360, func(c *ui.Context) { + ui.Column(c).Padding(12).Children(func() { + MultiChartLayout(c, &state, MultiChartLayoutOptions{Height: 280}, func(i int, cell *ChartCell) { ui.Text(c, "BTC · 1h") }) + }) + }) +} diff --git a/ohlc_chart_test.go b/ohlc_chart_test.go new file mode 100644 index 0000000..8bd948f --- /dev/null +++ b/ohlc_chart_test.go @@ -0,0 +1,44 @@ +package mujica + +import ( + "bytes" + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestOHLCChartSharesDataAndDiffersInLook(t *testing.T) { + candles := sampleCandles(60) + view := MarketView{Count: 40} + ohlc := true + var res ChartResult + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + if ohlc { + res = OHLCChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "Bars"}}) + } else { + res = CandlestickChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "Bars"}}) + } + }, 600, 320) + tt.Key(0, ui.KeyTab) + tt.Key(0, ui.KeyEnd) + if res.Point != 59 || mktState0(res).drawn != 40 { + t.Fatalf("point %d drawn %d", res.Point, mktState0(res).drawn) + } + a := encode(t, tt.Image()) + ohlc = false + tt.Frame() + if bytes.Equal(a, encode(t, tt.Image())) { + t.Fatal("OHLC bars look the same as candles") + } +} + +func TestOHLCChartSnapshot(t *testing.T) { + candles := sampleCandles(60) + view := MarketView{Count: 50} + snapshot(t, "ohlc_chart", 640, 300, func(c *ui.Context) { + ui.Column(c).Padding(12).Children(func() { + OHLCChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "Bars", Height: 240}}) + }) + }) +} diff --git a/overlay_layers.go b/overlay_layers.go index 6b9c419..381fc35 100644 --- a/overlay_layers.go +++ b/overlay_layers.go @@ -53,7 +53,19 @@ func overlayEscape(c *ui.Context, key any) bool { // The root is around every focus, so it takes Escape before MyGo's overlays. byFocus := c.Root().Shortcut(0, ui.KeyEscape) byWindow := c.Shortcut(0, ui.KeyEscape) - return byFocus || byWindow + if byFocus || byWindow { + s := ui.Local(c.Root(), overlayLayersKey{}, func() overlayLayers { return overlayLayers{} }) + for i, k := range s.keys { + if k == key { + s.keys = append(s.keys[:i], s.keys[i+1:]...) + s.seen = append(s.seen[:i], s.seen[i+1:]...) + break + } + } + c.Invalidate() + return true + } + return false } // overlaySiteState follows the focus of a layer after it closes. diff --git a/price_alert_line_test.go b/price_alert_line_test.go new file mode 100644 index 0000000..d138d26 --- /dev/null +++ b/price_alert_line_test.go @@ -0,0 +1,56 @@ +package mujica + +import ( + "testing" + + "github.com/egoist/mygo/ui" +) + +func TestPriceAlertLineDragAndTrigger(t *testing.T) { + candles := sampleCandles(60) + view := MarketView{Count: 60} + alerts := []PriceAlertLine{{ID: "a", Price: 100, Label: "Buy"}} + var fired []string + var res ChartResult + _ = res + tt := ui.NewTester(func(c *ui.Context) { + Use(c, Settings{}) + res = CandlestickChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "BTC"}, Alerts: &alerts, + OnAlert: func(a PriceAlertLine, last Candle) { fired = append(fired, a.ID) }}) + }, 800, 400) + if !tt.HasText("BTC") { + t.Fatal("not built") + } + // Drag the line from its own y, as painted. + st := mktState0(res) + plot := st.plot + y := st.ys.Map(100) + tt.Press(plot.X+100, y) + tt.Move(plot.X+100, y-40) + tt.Release(plot.X+100, y-40) + if alerts[0].Price <= 100 || view.End != 0 { + t.Fatalf("drag did not move the alert up, or panned: %+v %+v", alerts, view) + } + // A new close crossing the alert fires it once. + alerts[0].Price = candles[59].Close + 0.5 + next := candles[59] + next.Time = next.Time.Add(3600e9) + next.Open, next.Close, next.High, next.Low = next.Close, next.Close+1, next.Close+1.2, next.Close-0.1 + candles = append(candles, next) + tt.Frame() + tt.Frame() + if len(fired) != 1 || fired[0] != "a" { + t.Fatalf("fired %v", fired) + } +} + +func TestPriceAlertLineSnapshot(t *testing.T) { + candles := sampleCandles(60) + view := MarketView{Count: 60} + alerts := []PriceAlertLine{{ID: "a", Price: 104, Label: "Take profit"}, {ID: "b", Price: 96}} + snapshot(t, "price_alert_line", 640, 320, func(c *ui.Context) { + ui.Column(c).Padding(12).Children(func() { + CandlestickChart(c, candles, &view, CandlestickOptions{Frame: ChartFrame{Label: "BTC", Height: 260}, Alerts: &alerts}) + }) + }) +} diff --git a/testdata/snapshots/darwin/candle_countdown-dark.png b/testdata/snapshots/darwin/candle_countdown-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0670f01eeb033b8e194d1fc40f30ea7c3f55423f GIT binary patch literal 1427 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!12~v~q)x|uAcr-|)5S5QV$Pe})j7dmrH_A1 z*FBm4M16a2q?(c5qhnc`Q@WjYOk3To_;`_{$uSRu6`e65Aq9?lQVBa&C@gSbSykWR zr(nR;wBcfu`LR=ah8fS^>AX24cC9z}?yaO-@BVCTl@Yrlaq9Qy*iFUro}auKzrN=3 zd%xYTc6aMB3rT5oPsQ#Vycf*T?=C9{Y4ZZ5Muy{+< zS@+r3b!W({|EsW>cZBzLP~WmHkBSKS-Cvg&-H^L{L(W;<#1# z+pC+&KfU#NuJe2Uu~_*g>gXj`&YL@b9`~Oc_-n55U7O5PM$>-gax9J^dXw>d)?)kSAWBSG`wny0=T(`8m7Nu6C{e77es{RnN*T4jhLb zxL6c8{NI|t@7|-Vt3MV`xte71N?JN!wRV%W?%jFQ^5$EoAKNfvVKckCsE9~w`%jL@ z+?nmV?o&Q~>ybB4yRd+9vRa?F<*Zdk%Puh~ax@DkF7cZ_@u|h^GQ-T^MM0Af1~PBU zi@0vCqx1jO`)WR!tlaEit9@IQE6?{mvE8RFI9D$z;mTsU{^g4v?dqRUFMs*CTQuLh zt{2kt-k$hfbpPQ2^<(Gv-~j(jx8}RV)}Ek=NTowoWu(95nr0c49;`SGpjug{n_#Kbezb< zs`SIhc;ElX-t_)}x#iCNbN44ie~LLY&G)@z`|)q@?!KN`xj8!e_L^-xf|e;i|Ahq? zzgoFjX%R4LlQzEFz4YzJ|Ls#=?_N@!k#UFT^Uv;WK;x!#K3*Rl_V;7@!j2xp-Var_ zeRufu*PNMU`Ss*RHNlt5yCsZL5*{4SI<2Flqp7?1Sx$zGecqQD7nPHe+OA!>vaafN z^PWGem4c$9)3>IEgkA0EI5oqo+dQoz`I%#7^0W8utFOAbe*M0~_SOHW0Lj;ngdKpH z`kthsqKd%T{r|*4JnCd|$_oh!O)xkiNZ2PI;@y5+XGoP*yb}A;@EfqOW$<+Mb6Mw< G&;$TtLv&~W literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/candle_countdown-light.png b/testdata/snapshots/darwin/candle_countdown-light.png new file mode 100644 index 0000000000000000000000000000000000000000..661c931aef5ebfcd52ec1aaaca5a43681d8920a2 GIT binary patch literal 1351 zcmeAS@N?(olHy`uVBq!ia0y~yVAKJ!12~v~q)x|uAcvLD)5S5QV$Pepu|Bg?C60aE zUE`}EKRH#iEw4k+Fz*MW z)})oQXRr#JPF}&TCChCraFgMzS=G2XU*0(n=|6cpK=*#2E z&jk(_wv>8sC~nthJjK?cz@o_E$l)Z=BtR+im+m2j)MD>PC06Y0?S~FI2@5@%GOPOR z`SaShkFv0{Ye&yNR#U^o;rL=ZhkLvGVdX=Mue)fo>c9N=>h`Ny%4NUTbR0SUa(0~k zq!|+LUwXW&J$hZ1FEwCG)Z6d2v8R^TFE)DiSlEHX>Az#f_S^ooHLLco-~VansTZaf z@5YxcU$*?&lcySgm+ma7d=hZATY7WP)2FH7>tfd0|8hHe@YT6KVI?EulJ>n`0HW-Qka~zie!rd_C*1T26hJhhtq_;={kEek9esd~03%Y)zbe@(GV% z$>7XJftG)r1zAN}`wi|V7+ndus$sgZFH-uow7QyF(B+`=sc*SBcD(FMFFv^JEbDBW z=$W%;zus@L;QH~5t%*uWp9Q4mZ?OINWb?Jc=w&xIEZ?JJWaQ)`SNFnk^T`QQrmV1A zcIi>sl-q&-_sIHs`JFm<_F9LV=8o$>?|pVX>S|r~{>A&(+yCSQo{B5lu`My@%&z?R za_7}I-c)mavNieayZelejq1_%ceekZaQNZAjEfm2Cr_5^R)hhaT_{u}^y|6j3)7i5 zXKJq0RJ!y#`2E(^*Qb2CwCCoXU#{Wb&&|E<-Nk)$a_DNOGiisD`|T#}y{Mv8`qel0 z?Od_bt!s1^fAT%u^YaIbpOc@{e@o82YFVXM9z8p^Lc0Ebz$x>mm(TB-bwBIu>C<(~ zUNr8bPT&R4%L-{GxvdwcH1m)B;Um45YV_PkXq?)|R#`Q=Oe zap`C!r9-{Tcmy>y_2$f(qosRSO-UcvW~DrRBfksI$DYlF-XdtJZXWc%y- zK#RHO9!|XP?EJo?_oC+3|7MVsEl}m|!4c_kK=(f<^>QWU`IK!keFMYAzygxN)78&qol`;+0Ik_SJpcdz literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/chart_sync-dark.png b/testdata/snapshots/darwin/chart_sync-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..9f518b5b7f00d080b37fa5a27f62fa7f5bc7104e GIT binary patch literal 16916 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/chart_sync-light.png b/testdata/snapshots/darwin/chart_sync-light.png new file mode 100644 index 0000000000000000000000000000000000000000..d996b23bda867fe8bb3d9d7f54863f5a63561657 GIT binary patch literal 16341 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 cPx# literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/chart_type_switcher-light.png b/testdata/snapshots/darwin/chart_type_switcher-light.png new file mode 100644 index 0000000000000000000000000000000000000000..6543cecbcc9d88b9d0966b3dff00f8454a3017ed GIT binary patch literal 5419 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/compare_symbol-light.png b/testdata/snapshots/darwin/compare_symbol-light.png new file mode 100644 index 0000000000000000000000000000000000000000..d19651382650b65da5412c43a84a7249f2723b95 GIT binary patch literal 35339 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 z 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 X{_UWDz56SVODAB8yk%I1aE<;qlhrC5 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/drawing_toolbar-light.png b/testdata/snapshots/darwin/drawing_toolbar-light.png new file mode 100644 index 0000000000000000000000000000000000000000..02168e9e1af246789f642e73723ffe4ad052dfdc GIT binary patch literal 2865 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%0D44XU+ zQlu#^jff1VXTWu%OTI=?XxsbEMvf5Bqq@Ii$N!ngu=&apvij}CWeGkSMsM!6hBfLYBRX@lpP!WQt8GmRQlFV=@{lkGM6 zxneWr+J)nm2Lu`NX6;xO%;nk~ua{`6KOLW}$D=n?h1TbccA0R8as)RkTx~Qfy}Oi8 zsfBc^CNnTWiMvc5jsht|gS8E2()qOxji*#0KVAw&4tCe#O$T#wZueUq8X~$)N~WCh z`P#Ex*u)ou-W*)R)J*PX1HZ&OpU+P^tCnzXe0o|wD@ z*Yw-s9R3cU>_zxyVIn}3C0}{>@R$X$>dgcxh*FWplHgu@aUEPF|1w5!B%G}}Rw=PQ zBqWYbOEa(#3O4W?%3y0YxopfVPqQ+WjNaR8OKj&KRVSvyQa}4aAvXXA%uR3-3Fvh2 zlql$d!NBhd2YFZ7Or{)h&sL^$S^bKYicQQOW{}`km5gSjWfRuqI!mWxdT(QC?`b;B zK!sgbpa0OTsrgG3o`HhY!3&d|8SG%3kWX3ezEq zeYDy+a|>hpz^SF zI9Dp*!|U7df{EAOzJM=ZzC6oF-oNqzVE$g-9{;hW^dDOz|KC;@{vS}q()?lMKQ{*d g4|pZT2fVHVE{WPTzHRaM0U(!*graz*s8Qhm1*J*|;{X5v literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/drawing_tools-light.png b/testdata/snapshots/darwin/drawing_tools-light.png new file mode 100644 index 0000000000000000000000000000000000000000..9d7aad2d707ff70d34dd72208f7fac0ebb291bc6 GIT binary patch literal 16996 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�SDshh@!TK?7jCF5%V!nLskmT~GBlKPNk# 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/heikin_ashi_chart-dark.png b/testdata/snapshots/darwin/heikin_ashi_chart-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..d8d8a5438fab63a0932a038e0f656e9c28a7f6b2 GIT binary patch literal 17974 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/indicator_overlay-light.png b/testdata/snapshots/darwin/indicator_overlay-light.png new file mode 100644 index 0000000000000000000000000000000000000000..98f7c6a4892d5de69b20e322474b5f8ca94e955a GIT binary patch literal 45208 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/indicator_pane-dark.png b/testdata/snapshots/darwin/indicator_pane-dark.png index 5e3cda3b48387268df44e6272c67b90af1daaac1..2600ec04b54beff684b70ead86457c952afd9b3b 100644 GIT binary patch delta 31495 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�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 GLjD(CObWvQ delta 26761 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 diff --git a/testdata/snapshots/darwin/indicator_selector-dark.png b/testdata/snapshots/darwin/indicator_selector-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..b7bd63b24ccd029bc36a83d888760dd9b65129e0 GIT binary patch literal 3073 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/interval_selector-dark.png b/testdata/snapshots/darwin/interval_selector-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..1c18b0db71527da963bc62c4d318bcae112581b0 GIT binary patch literal 2519 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/line_quote_chart-dark.png b/testdata/snapshots/darwin/line_quote_chart-dark.png index a2e815481408a2e76113a8c5bed9e2f001644633..093d1e0494d80e0b841b6c1775f1395bd308de68 100644 GIT binary patch delta 31130 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 ahLm*{x&3-&S_|gHA@b5HQl*ln0sjxpM2xTi delta 29324 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 Qa*l)KrB$RVB}@bVAI@qI{{R30 diff --git a/testdata/snapshots/darwin/multi_chart_layout-dark.png b/testdata/snapshots/darwin/multi_chart_layout-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..0c574e0c09d566feb17e3df7ef8cf02641c31bf7 GIT binary patch literal 8796 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 Y0EZZZ_}xOU2LN)(NGeKHh#3X_AMPiUe*gdg literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/ohlc_chart-light.png b/testdata/snapshots/darwin/ohlc_chart-light.png new file mode 100644 index 0000000000000000000000000000000000000000..7ffe790695315d3320d2866c1765555987a289fa GIT binary patch literal 13940 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/price_alert_line-dark.png b/testdata/snapshots/darwin/price_alert_line-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..a356e5eab068095b20188d8633c271974cf6a478 GIT binary patch literal 18918 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 literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/time_range_selector-dark.png b/testdata/snapshots/darwin/time_range_selector-dark.png new file mode 100644 index 0000000000000000000000000000000000000000..05ff743457094d08d18f22b6d44a993b632c5e29 GIT binary patch literal 5215 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 P|K?FyNkg$3X!`D7uhU3| literal 0 HcmV?d00001 diff --git a/testdata/snapshots/darwin/time_range_selector-light.png b/testdata/snapshots/darwin/time_range_selector-light.png new file mode 100644 index 0000000000000000000000000000000000000000..05275da2c81fa8360a1c991e7bcff5cf38377cdf GIT binary patch literal 4943 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 y=J(hglmT|5Oz<6-wn_`2QEP8c`bn delta 7490 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 0 && frac <= 1) { panic("mujica: ValueArea needs bins and a fraction in (0, 1]") } var total float64 for i, b := range bins { + if b.Volume < 0 || math.IsNaN(b.Volume) || math.IsInf(b.Volume, 0) { + panic("mujica: profile volumes must be finite and non-negative") + } total += b.Volume if b.Volume > bins[poc].Volume { poc = i @@ -95,24 +100,27 @@ func ValueArea(bins []ProfileBin, frac float64) (poc, lo, hi int) { // VolumeProfileOptions configure a VolumeProfile. type VolumeProfileOptions struct { Frame ChartFrame - // ValueArea is the share of volume in the value area; zero is 0.7. + // ValueArea defaults to 0.7. ValueArea float64 Decimals int } -// VolumeProfile draws volume by price as horizontal bars, marking the point of control and the value area. +// VolumeProfile draws volume distribution, value area, and POC. func VolumeProfile(c *ui.Context, bins []ProfileBin, opts VolumeProfileOptions) ChartResult { frac := opts.ValueArea if frac == 0 { frac = 0.7 } + if !(frac > 0 && frac <= 1) { + panic("mujica: VolumeProfile ValueArea must be in (0, 1]") + } dec := priceDecimals("VolumeProfile", opts.Decimals) ch := newChart(c, opts.Frame) k := Tokens(c) va := chartMemo(ch, "va", [2]any{chartID(bins), frac}, func() [4]float64 { vmax := 0.0 for i, b := range bins { - if !(b.High > b.Low) || b.Volume < 0 || i > 0 && b.Low < bins[i-1].High-1e-9 { + if math.IsNaN(b.Volume) || math.IsInf(b.Volume, 0) || math.IsInf(b.High, 0) || math.IsInf(b.Low, 0) || !(b.High > b.Low) || b.Volume < 0 || i > 0 && b.Low < bins[i-1].High-1e-9 { panic(fmt.Sprintf("mujica: VolumeProfile bin %d is empty, negative or out of order", i)) } vmax = max(vmax, b.Volume) @@ -126,6 +134,7 @@ func VolumeProfile(c *ui.Context, bins []ProfileBin, opts VolumeProfileOptions) poc, vlo, vhi, vmax := int(va[0]), int(va[1]), int(va[2]), va[3] inArea, outArea := k.AccentText, k.TextMuted keys := []chartKey{{Name: msg(c, "volume_profile.value_area"), Color: inArea, Shape: 1}, {Name: msg(c, "volume_profile.other"), Color: outArea, Shape: 4}} + drawn := ui.Local(ch.res.Element, "mujica.profile.drawn", func() int { return 0 }) size := FontSize(c, theme.CaptionSize) geom := func(r ui.Rect) (ui.Rect, internal.Linear, internal.Linear) { plot := chartInset(r, 60, 26) @@ -145,10 +154,9 @@ func VolumeProfile(c *ui.Context, bins []ProfileBin, opts VolumeProfileOptions) return -1 } v := ys.Invert(y) - for i, b := range bins { - if v >= b.Low && v <= b.High { - return i - } + i := sort.Search(len(bins), func(i int) bool { return bins[i].High >= v }) + if i < len(bins) && v >= bins[i].Low { + return i } return -1 } @@ -174,12 +182,17 @@ func VolumeProfile(c *ui.Context, bins []ProfileBin, opts VolumeProfileOptions) tx, tl = append(tx, xs.Map(t)), append(tl, volumeShort(t, xstep)) } internal.AxisX(p, plot, tx, tl, size, k) - for i, b := range bins { + indices := chartMemo(ch, "profile.indices", [3]any{chartID(bins), plot.Y, plot.H}, func() []int { + return internal.Columns(len(bins), func(i int) float32 { return ys.Map(bins[i].Low) }, func(i int) float64 { return bins[i].Volume }) + }) + *drawn = len(indices) + for _, i := range indices { + b := bins[i] y0, y1 := ys.Map(b.High), ys.Map(b.Low) bar := ui.Rect{X: plot.X, Y: y0 + 1, W: xs.Map(b.Volume) - plot.X, H: max(1, y1-y0-2)} // Value-area bars are filled, the rest outlined. if i >= vlo && i <= vhi { - p.Fill(bar, inArea.Alpha(0.75), 0) + p.Fill(bar, inArea, 0) } else { p.Stroke(bar, outArea, 0, 1) }