WIP components (as built)

This commit is contained in:
ZacharyZhang-NY committed 2026-10-05 15:51:57 -04:00
1 parent 73df90b9b1
commit b4798a6287
110 files changed
+3975 -273

No files matched your search

+40
View File
@@ -0,0 +1,40 @@
# 181 OptionChain
## 用途
期权链。
## 最小示例
```go
var state mujica.OptionChainState
rows := []mujica.OptionStrike{{Strike: 100, Call: mujica.OptionQuote{Bid: 3, Ask: 3.2, Last: 3.1}, Put: mujica.OptionQuote{Bid: 2, Ask: 2.2, Last: 2.1}}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.OptionChain(c, &state, []string{"Oct 17", "Nov 21"}, rows, mujica.OptionChainOptions{Spot: 100.4})
if r.Changed || r.Submitted || r.ExpiryChanged {
fmt.Println(state.Expiry, state.Strike, state.Side)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`s` 保存到期日和合约;`expiries` 至少一个;`strikes` 升序。`Spot` 默认 0 隐藏现价;`Decimals` 默认 2;`Disabled` 默认 false。
## 状态
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
## 事件
if r.Changed || r.Submitted || r.ExpiryChanged { 调用方回调(state.Expiry, state.Strike, state.Side) }
## 键盘操作
Tab 切换到期日或列表;上下、Home/End 选择行;左右切换认购认沽;Enter 确认。
## 限制
到期日切换后,由调用方更换对应报价;排序与稳定合约标识由调用方保证。
+38
View File
@@ -0,0 +1,38 @@
# 182 GreeksTable
## 用途
希腊值表。
## 最小示例
```go
rows := []mujica.GreeksRow{{Label: "AAPL 100 C", Greeks: mujica.OptionGreeks{Delta: 0.5, Gamma: 0.03, Theta: -0.1, Vega: 0.2, Rho: 0.05}}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.GreeksTable(c, rows, mujica.GreeksTableOptions{Notes: true})
}
ui.Render(view, 960, 440, 1)
```
## 参数
小数位范围 0—12;0 表示默认 4 位。
`rows` 为合约与五个数值;NaN 显示破折号。`Decimals` 默认 4;`Notes` 默认 false。
## 状态
默认与数据边界。
## 事件
展示组件;数据由调用方更新。
## 键盘操作
展示组件;表头提供说明和悬停提示。
## 限制
通过虚拟列表构建可见行;精度为显示规则,数值计算由调用方提供。
+39
View File
@@ -0,0 +1,39 @@
# 183 PayoffDiagram
## 用途
到期损益图。
## 最小示例
```go
legs := []mujica.OptionLeg{{Kind: mujica.LegCall, Strike: 100, Premium: 3, Quantity: 1}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.PayoffDiagram(c, legs, mujica.PayoffDiagramOptions{Frame: mujica.ChartFrame{Label: "Call payoff"}, Spot: 103})
if r.Changed() || r.Retried() {
fmt.Println(r.Point)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`legs` 为认购、认沽或标的组合;负数量表示卖出。`Frame.Label` 必填,`Height` 默认 240;`Spot` 默认 0;`Low/High` 默认行权价上下 30%;`Points` 默认 101;`Format` 可覆盖读数。
## 状态
默认与数据边界;图表的 Frame 支持加载、空、失败占位。
## 事件
if r.Changed() || r.Retried() { 调用方回调(r.Point) }
## 键盘操作
Tab 聚焦;方向键、Home/End 逐点读数;Escape 清除。
## 限制
计算到期损益,合约乘数由 Quantity 表达;价格采样数量由 Points 指定。
+40
View File
@@ -0,0 +1,40 @@
# 184 Watchlist
## 用途
自选列表。
## 最小示例
```go
var state mujica.WatchlistState
groups := []mujica.WatchGroup{{Name: "Technology", Items: []mujica.WatchItem{{Symbol: "AAPL", Name: "Apple", Price: 227.5, Change: 2.7, ChangePercent: 1.2}}}, {Name: "Energy", Items: []mujica.WatchItem{{Symbol: "XOM", Price: 117.4}}}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.Watchlist(c, &state, groups, mujica.WatchlistOptions{})
if r.Changed || r.Submitted || r.Moved {
fmt.Println(state.Selected, r.Rows, r.To)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`s` 保存分组、代码和隐藏列;`groups` 至少一个;`Decimals` 默认 2;`Disabled` 默认 false。
## 状态
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
## 事件
if r.Changed || r.Submitted || r.Moved { 调用方回调(state.Selected, r.Rows, r.To) }
## 键盘操作
Tab 切换分组或列菜单;上下、Home/End 选择;Enter 确认;菜单 Space 开关列。
## 限制
拖动仅返回 Moved;调用方应用 Rows/To 调整顺序;刷新采用稳定 Symbol。
+40
View File
@@ -0,0 +1,40 @@
# 185 SymbolSearch
## 用途
代码搜索。
## 最小示例
```go
var state mujica.SymbolSearchState
rows := []mujica.MarketSymbol{{Code: "AAPL", Name: "Apple", Market: "NASDAQ", Type: "Stock"}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.SymbolSearch(c, &state, rows, mujica.SymbolSearchOptions{Markets: []string{"NASDAQ", "NYSE"}, Recent: rows})
if r.Changed || r.Picked || r.Retry {
fmt.Println(state.Query, state.Market, r.Chosen.Code)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`s.Query/Market` 为调用方搜索条件;`results` 是调用方异步结果。`Markets` nil 隐藏过滤;`Recent` 为空查询时显示;`Loading/Error/Disabled` 默认零值。
## 状态
默认、聚焦、禁用;异步结果支持加载、失败和空。
## 事件
if r.Changed || r.Picked || r.Retry { 调用方回调(state.Query, state.Market, r.Chosen.Code) }
## 键盘操作
Tab 聚焦输入与市场;Down 进入结果;Tab 到达结果按钮,Enter 选择。
## 限制
调用方处理搜索、市场过滤和最近记录;组件提供异步加载、失败和重试界面。
+39
View File
@@ -0,0 +1,39 @@
# 186 SymbolBadge
## 用途
代码徽标。
## 最小示例
```go
symbol := mujica.MarketSymbol{Code: "AAPL", Name: "Apple", Market: "NASDAQ", Type: "Stock"}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.SymbolBadge(c, symbol, mujica.SymbolBadgeOptions{Clickable: true})
if r.Changed() {
fmt.Println(symbol.Code)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`MarketSymbol.Code` 必填,Name、Market、Type 为调用方标签。`Clickable/Disabled` 默认 false。
## 状态
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
## 事件
if r.Changed() { 调用方回调(symbol.Code) }
## 键盘操作
Clickable 开启时 Tab 聚焦,Enter/Space 激活。
## 限制
市场和类型属于业务标签,由调用方本地化。
+42
View File
@@ -0,0 +1,42 @@
# 187 MarketHeatmap
## 用途
市场热力图。
## 最小示例
```go
var path []string
root := mujica.HeatNode{Name: "Market", Children: []mujica.HeatNode{{Name: "Technology", Children: []mujica.HeatNode{{Name: "AAPL", Cap: 3000, Change: 1.2}, {Name: "MSFT", Cap: 2800, Change: -0.6}}}, {Name: "Energy", Cap: 450, Change: -2.1}}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.MarketHeatmap(c, &path, root, mujica.MarketHeatmapOptions{Frame: mujica.ChartFrame{Label: "Market"}})
if r.Changed() || r.ValueChanged() || r.Retried() {
fmt.Println(path, r.Point)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`Version` 在原地修改数据时递增。小于 4 DIP 的瓦片按屏幕网格汇总绘制,键盘仍逐项读取原始数据。
`path` 保存下钻路径;`root` 名称必填,子项名称唯一;`Cap` 为面积,`Change` 为百分比。`Frame.Label` 必填;`Scale` 默认 3。
## 状态
默认与数据边界;图表的 Frame 支持加载、空、失败占位。
## 事件
if r.Changed() || r.ValueChanged() || r.Retried() { 调用方回调(path, r.Point) }
## 键盘操作
Tab 聚焦图;方向键逐块读数;Enter 下钻;Backspace 返回;路径按钮可用 Tab。
## 限制
市场数据由调用方提供;原地修改数据后更换 Children 切片或递增 Version。
+41
View File
@@ -0,0 +1,41 @@
# 188 Screener
## 用途
选股器。
## 最小示例
```go
var state mujica.ScreenerState
fields := []mujica.ScreenerField{{ID: "pe", Label: "P/E", Decimals: 1}}
rows := []mujica.ScreenerRow{{Symbol: "AAPL", Values: map[string]float64{"pe": 34}}, {Symbol: "XOM", Values: map[string]float64{"pe": 13}}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.Screener(c, &state, fields, rows, mujica.ScreenerOptions{})
if r.Changed || r.Save || r.Table.Changed() || r.Table.Submitted() || r.Table.SortChanged() || r.Table.Retried() {
fmt.Println(state.Conditions)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`s.Conditions` 保存条件;`fields` 至少一项,ID 唯一;`rows.Values` 为字段值。`Version` 原地更新递增;`Status/Error/Disabled` 默认零值。
## 状态
默认、聚焦、禁用;异步结果支持加载、失败和空。
## 事件
if r.Changed || r.Save || r.Table.Changed() || r.Table.Submitted() || r.Table.SortChanged() || r.Table.Retried() { 调用方回调(state.Conditions) }
## 键盘操作
Tab 到达字段、比较、数值和保存;Select 方向键选择;NumberInput 方向键步进;表格方向键选择。
## 限制
全部条件取交集;保存由调用方处理;缺失值无法通过条件。
+39
View File
@@ -0,0 +1,39 @@
# 189 MarketOverview
## 用途
市场概览。
## 最小示例
```go
indices := []mujica.IndexQuote{{Name: "S&P 500", Price: 5751.07, Change: 51.13, ChangePercent: 0.9, Series: []float64{5700, 5730, 5720, 5751}}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.MarketOverview(c, indices, mujica.MarketOverviewOptions{Breadth: mujica.MarketBreadth{Advancing: 2100, Declining: 1400, Unchanged: 300}})
if r.Chosen >= 0 {
fmt.Println(indices[r.Chosen].Name)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`indices` 为指数报价组;`Breadth` 是非负涨跌家数;`AsOf` 零值隐藏时间戳;`Decimals` 默认 2;`Disabled` 默认 false。
## 状态
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
## 事件
if r.Chosen >= 0 { 调用方回调(indices[r.Chosen].Name) }
## 键盘操作
Tab 到达指数卡片;Enter/Space 选择。
## 限制
提供展示与点击事件;行情获取由调用方负责。
+39
View File
@@ -0,0 +1,39 @@
# 190 IndexCard
## 用途
指数卡片。
## 最小示例
```go
quote := mujica.IndexQuote{Name: "S&P 500", Price: 5751.07, Change: 51.13, ChangePercent: 0.9, Series: []float64{5700, 5730, 5720, 5751}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.IndexCard(c, quote, mujica.IndexCardOptions{Clickable: true})
if r.Changed() {
fmt.Println(quote.Name)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`q.Name` 必填;Price、Change、ChangePercent 和 Series 来自调用方。`Decimals` 默认 2;`Clickable/Disabled` 默认 false。
## 状态
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
## 事件
if r.Changed() { 调用方回调(quote.Name) }
## 键盘操作
Tab 聚焦卡片或迷你图;Enter/Space 激活卡片,图表方向键读数。
## 限制
迷你图复用 Sparkline;行情获取由调用方负责。
+36
View File
@@ -0,0 +1,36 @@
# 191 MarketStatus
## 用途
市场状态。
## 最小示例
```go
now := time.Date(2026, 10, 5, 14, 30, 0, 0, time.UTC)
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.MarketStatus(c, mujica.MarketOpen, mujica.MarketStatusOptions{Market: "NYSE", Now: now, Next: now.Add(5 * time.Hour), NextPhase: mujica.MarketAfterHours})
}
ui.Render(view, 960, 440, 1)
```
## 参数
`phase` 支持五个 MarketPhase;`Market` 默认空;`Next` 零值隐藏;`NextPhase` 默认 Closed;`Now` 零值使用窗口时间。
## 状态
默认与数据边界。
## 事件
展示组件;数据由调用方更新。
## 键盘操作
展示组件。
## 限制
使用窗口时间时每分钟刷新;传入 Now 时由调用方推进时间。
@@ -0,0 +1,37 @@
# 192 TradingSessionClock
## 用途
交易时段时钟。
## 最小示例
```go
now := time.Date(2026, 10, 5, 14, 30, 0, 0, time.UTC)
markets := []mujica.SessionMarket{{Name: "NYSE", Location: time.FixedZone("EDT", -4*3600), Sessions: []mujica.TradingSession{{Phase: mujica.MarketOpen, Start: 570, End: 960}}}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.TradingSessionClock(c, markets, mujica.TradingSessionClockOptions{Now: now})
}
ui.Render(view, 960, 440, 1)
```
## 参数
`markets` 每项包含 Name、Location 与有序时段;Start/End 是本地午夜后的分钟;`Holiday` 默认 false;`Now` 零值使用窗口时间。
## 状态
默认与数据边界。
## 事件
展示组件;数据由调用方更新。
## 键盘操作
展示组件。
## 限制
每天重复时段由调用方指定;节假日由 Holiday 指定;跨午夜时段拆分为两个日期的时段。
+40
View File
@@ -0,0 +1,40 @@
# 193 EconomicCalendar
## 用途
经济日历。
## 最小示例
```go
var state mujica.EconomicCalendarState
rows := []mujica.EconomicEvent{{ID: "jobs", Country: "US", Title: "Payrolls", Time: time.Date(2026, 10, 5, 14, 30, 0, 0, time.UTC), Importance: 3, Forecast: "150K", Previous: "142K", Actual: "254K"}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.EconomicCalendar(c, &state, rows, mujica.EconomicCalendarOptions{})
if r.Changed() || r.Submitted() || r.SortChanged() || r.Retried() {
fmt.Println(state.Table.Selected())
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`s` 保存国家、重要性和表格状态;`events` 的 ID 稳定且重要性 1—3。`Version` 原地更新递增;`Status/Error/Disabled` 默认零值。
## 状态
默认、聚焦、禁用;异步结果支持加载、失败和空。
## 事件
if r.Changed() || r.Submitted() || r.SortChanged() || r.Retried() { 调用方回调(state.Table.Selected()) }
## 键盘操作
Tab 到达国家过滤、重要性和表格;方向键选择;Enter 提交行。
## 限制
事件数据与发布结果由调用方提供;过滤与排序缓存直到数据或条件变更。
+40
View File
@@ -0,0 +1,40 @@
# 194 EarningsCalendar
## 用途
财报日历。
## 最小示例
```go
var state mujica.DataTableState[string]
rows := []mujica.EarningsEvent{{ID: "a", Symbol: "AAPL", Name: "Apple", Date: mujica.Date{Year: 2026, Month: 10, Day: 30}, Timing: mujica.EarningsAfterClose, EPSEstimate: 1.6, EPSActual: 1.64}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.EarningsCalendar(c, &state, rows, mujica.EarningsCalendarOptions{})
if r.Changed() || r.Submitted() || r.SortChanged() || r.Retried() {
fmt.Println(state.Selected())
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`s` 保存表格状态;`events` 使用稳定 ID、Date 和盘前盘后时段;EPSActual 的 NaN 表示待公布。`Version` 原地更新递增;`Status/Error/Disabled` 默认零值。
## 状态
默认、聚焦、禁用;异步结果支持加载、失败和空。
## 事件
if r.Changed() || r.Submitted() || r.SortChanged() || r.Retried() { 调用方回调(state.Selected()) }
## 键盘操作
Tab 聚焦表格;方向键及 Home/End 选择;Enter 提交;表头支持键盘排序。
## 限制
NaN 表示待公布;零预期仅显示金额差;财报数据由调用方提供。
+42
View File
@@ -0,0 +1,42 @@
# 195 NewsFeed
## 用途
新闻流。
## 最小示例
```go
var state mujica.NewsFeedState
rows := []mujica.NewsItem{{ID: "a", Title: "Apple unveils new chips", Source: "Wire", Time: time.Date(2026, 10, 5, 14, 30, 0, 0, time.UTC), Symbols: []string{"AAPL"}}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.NewsFeed(c, &state, rows, mujica.NewsFeedOptions{})
if r.Opened != "" || r.Symbol != "" || r.Retry {
fmt.Println(r.Opened, r.Symbol)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`Version` 在调用方原地修改新闻或已读映射时递增;`ReadChanged` 报告已读状态变化。
`s.Read` 以 ID 保存已读;`items` 按调用方给定顺序显示。`Today` 默认窗口日期;`Status/Error/Disabled` 默认零值。
## 状态
默认、聚焦、禁用;异步结果支持加载、失败和空。
## 事件
if r.Opened != "" || r.Symbol != "" || r.Retry { 调用方回调(r.Opened, r.Symbol) }
## 键盘操作
Tab 聚焦列表或相关代码;上下选择;Enter 打开并标记已读。
## 限制
虚拟化构建可见行;读取状态以稳定 ID 保存;链接打开由调用方负责。
+36
View File
@@ -0,0 +1,36 @@
# 196 SentimentGauge
## 用途
情绪仪表。
## 最小示例
```go
value := 72.0
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
mujica.SentimentGauge(c, value, mujica.SentimentGaugeOptions{Label: "Fear & Greed"})
}
ui.Render(view, 960, 440, 1)
```
## 参数
`value` 范围 0—100;`Label` 默认空;`Size` 默认 240 DIP,指定值至少 48 DIP。`Status/Error/Empty` 默认就绪、空文本、false,保留同一尺寸的加载、失败与空占位。
## 状态
默认与数据边界。
## 事件
`Retry` 回调报告错误占位的重试请求;数值由调用方更新。
## 键盘操作
Tab 聚焦仪表;方向键和 Home/End 朗读当前数值与区间文字。
## 限制
区间边界为 20、40、60、80;值域错误触发 panic。
+40
View File
@@ -0,0 +1,40 @@
# 197 PortfolioSummary
## 用途
资产总览。
## 最小示例
```go
account := ""
accounts := []mujica.PortfolioAccount{{ID: "a", Name: "Brokerage", Total: 120000, DayPnL: 1250, TotalReturn: 20000, Cost: 100000}, {ID: "b", Name: "Retirement", Total: 80000, DayPnL: -300, TotalReturn: 5000, Cost: 75000}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.PortfolioSummary(c, &account, accounts, mujica.PortfolioSummaryOptions{})
if r.Changed() {
fmt.Println(account)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`account` 空值汇总全部账户;`accounts` 使用稳定 ID。`Currency` 默认 $;`Decimals` 默认 2;`Disabled` 默认 false。
## 状态
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
## 事件
if r.Changed() { 调用方回调(account) }
## 键盘操作
Tab 聚焦账户组;方向键切换账户。
## 限制
收益、成本与资产数值由调用方计算;基数为 0 时隐藏比例。
@@ -0,0 +1,41 @@
# 198 AssetAllocationChart
## 用途
资产配置图。
## 最小示例
```go
items := []mujica.AllocationItem{{Name: "Stocks", Value: 60, Target: 50}, {Name: "Bonds", Value: 30, Target: 40}, {Name: "Cash", Value: 10, Target: 10}}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.AssetAllocationChart(c, items, mujica.AssetAllocationChartOptions{Frame: mujica.ChartFrame{Label: "Allocation"}})
if r.Changed() || r.Retried() {
fmt.Println(r.Point)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`Version` 在原地修改数据时递增。环形图合并小于 1 度的多个扇区;列表虚拟化保留每项的占比、目标与偏离。
`items` 包含 Name、Value、Target;目标总和为 100 或全部 0。`Frame.Label` 必填;`Tolerance` 默认 5 个百分点;`Format` 可覆盖数值。
## 状态
默认与数据边界;图表的 Frame 支持加载、空、失败占位。
## 事件
if r.Changed() || r.Retried() { 调用方回调(r.Point) }
## 键盘操作
Tab 聚焦环形图;方向键逐项读数;Home/End 到首尾。
## 限制
列表同时提供占比、目标、偏离;负资产值触发 panic。
+46
View File
@@ -0,0 +1,46 @@
# 199 PerformanceChart
## 用途
收益曲线。
## 最小示例
```go
values := []float64{100, 110, 95, 120}
benchmark := []float64{100, 105, 108, 112}
times := []time.Time{time.Date(2026, 1, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 2, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 3, 1, 0, 0, 0, 0, time.UTC), time.Date(2026, 4, 1, 0, 0, 0, 0, time.UTC)}
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.PerformanceChart(c, values, mujica.PerformanceChartOptions{Frame: mujica.ChartFrame{Label: "Performance"}, Times: times, Benchmark: benchmark})
if r.Changed() || r.Retried() {
fmt.Println(r.Point)
}
if name, ok := r.Toggled(); ok {
fmt.Println(name)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`Version` 在原地修改净值或基准时递增。
`values` 为正净值;`Times` 必填且递增;`Benchmark` nil 隐藏或与净值等长。`Frame.Label` 必填;`Name/BenchmarkName` 默认本地化名称。
## 状态
默认与数据边界;图表的 Frame 支持加载、空、失败占位。
## 事件
if r.Changed() || r.Retried() { 调用方回调(r.Point) }; if name, ok := r.Toggled(); ok { 调用方回调(name) }
## 键盘操作
Tab 聚焦图和图例;方向键读数;Space 切换序列。
## 限制
净值先归一化为累计收益;最大回撤取峰值到谷值;日期与报价由调用方提供。
+44
View File
@@ -0,0 +1,44 @@
# 200 CurrencyConverter
## 用途
货币换算。
## 最小示例
```go
state := mujica.CurrencyConverterState{Amount: 100, From: "USD", To: "JPY"}
currencies := []mujica.Currency{{Code: "USD", Name: "Dollar", Decimals: 2}, {Code: "JPY", Name: "Yen", Decimals: 0}}
rate := 149.37
view := func(c *ui.Context) {
mujica.Use(c, mujica.Settings{})
r := mujica.CurrencyConverter(c, &state, currencies, mujica.CurrencyConverterOptions{Rate: rate})
if r.PairChanged {
rate = 0
fmt.Println(state.From, state.To)
}
}
ui.Render(view, 960, 440, 1)
```
## 参数
`RateFrom/RateTo` 指定汇率所属货币对,支持数值相同的刷新结果;货币小数位范围 0—12。
`s` 保存金额及货币对;`currencies` 至少两种,Decimals 为最小单位精度。`Rate` 默认 0 表示待提供;`RateTime` 零值隐藏;`Disabled` 默认 false。
## 状态
默认;交互区域支持聚焦与选中,Disabled 参数控制禁用。
## 事件
if r.PairChanged { rate = 0; 调用方回调(state.From, state.To) }
## 键盘操作
Tab 到达金额、币种和互换;方向键步进、选择;Enter/Space 互换。
## 限制
币种切换产生 PairChanged,调用方立即将 Rate 置 0 并获取新汇率;结果按目标货币精度取整。