From 76708e9191b2afce8d59e98dc90472cfb98d3f16 Mon Sep 17 00:00:00 2001 From: DanS Date: Sun, 12 Jul 2026 11:54:08 -0500 Subject: [PATCH] feat(market): line/candle toggle + ~50% taller chart - Add a chart-style toggle (line vs candlestick) next to the interval buttons, shown only when the selected range has per-exchange candles (the aggregate / Live view is line-only). It flips s_mkt.chartStyle; candles draw when OHLC exists AND the user hasn't switched to the line. Icon reflects the current style; tooltip says what a click switches to. Two i18n keys across 8 languages. - Make the price chart ~50% taller: scale the height floor / desired / viewport cap (110->165, x1.5 desired, 0.22->0.33 of available) for a roomier plot. Verified via a forced-OHLC render: the taller chart, the toggle button, and candles with a correct week/day x-axis. Co-Authored-By: Claude Opus 4.8 (1M context) --- res/fonts/NotoSansCJK-Subset.ttf | Bin 618560 -> 619068 bytes res/lang/de.json | 2 ++ res/lang/es.json | 2 ++ res/lang/fr.json | 2 ++ res/lang/ja.json | 2 ++ res/lang/ko.json | 2 ++ res/lang/pt.json | 2 ++ res/lang/ru.json | 2 ++ res/lang/zh.json | 2 ++ scripts/add_missing_translations.py | 12 +++++++++++ src/ui/windows/market_tab.cpp | 30 ++++++++++++++++++++++++++-- src/util/i18n.cpp | 2 ++ 12 files changed, 58 insertions(+), 2 deletions(-) diff --git a/res/fonts/NotoSansCJK-Subset.ttf b/res/fonts/NotoSansCJK-Subset.ttf index 71b0d1b0f24fc6e3191cf7051170676b0f69b49e..44b72f4aec7867de1134a7be56ed2d7f98b0e1d3 100644 GIT binary patch delta 16121 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 delta 15709 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�$ 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 diff --git a/res/lang/de.json b/res/lang/de.json index aeb94cc..d5ba97f 100644 --- a/res/lang/de.json +++ b/res/lang/de.json @@ -548,6 +548,8 @@ "market_price_loading": "Preisdaten werden geladen...", "market_price_unavailable": "Preisdaten nicht verfügbar", "market_refresh_price": "Preisdaten aktualisieren", + "market_style_candle": "Zu Kerzenchart wechseln", + "market_style_line": "Zum Liniendiagramm wechseln", "market_trade_on": "Handeln auf %s", "market_updated": "\\xc2\\xb7 Aktualisiert %s", "market_vol_short": "Vol.", diff --git a/res/lang/es.json b/res/lang/es.json index 197b511..c4e5024 100644 --- a/res/lang/es.json +++ b/res/lang/es.json @@ -548,6 +548,8 @@ "market_price_loading": "Cargando datos de precio...", "market_price_unavailable": "Datos de precio no disponibles", "market_refresh_price": "Actualizar datos de precio", + "market_style_candle": "Cambiar a velas", + "market_style_line": "Cambiar a gráfico de líneas", "market_trade_on": "Operar en %s", "market_updated": "\\xc2\\xb7 Actualizado %s", "market_vol_short": "Vol", diff --git a/res/lang/fr.json b/res/lang/fr.json index 3f0ad45..4ec159e 100644 --- a/res/lang/fr.json +++ b/res/lang/fr.json @@ -548,6 +548,8 @@ "market_price_loading": "Chargement des données de prix...", "market_price_unavailable": "Données de prix indisponibles", "market_refresh_price": "Actualiser les données de prix", + "market_style_candle": "Passer aux chandeliers", + "market_style_line": "Passer au graphique en ligne", "market_trade_on": "Échanger sur %s", "market_updated": "\\xc2\\xb7 Mis à jour %s", "market_vol_short": "Vol", diff --git a/res/lang/ja.json b/res/lang/ja.json index e78bc8d..f3c09f8 100644 --- a/res/lang/ja.json +++ b/res/lang/ja.json @@ -548,6 +548,8 @@ "market_price_loading": "価格データを読み込み中...", "market_price_unavailable": "価格データが利用できません", "market_refresh_price": "価格データを更新", + "market_style_candle": "ローソク足に切り替え", + "market_style_line": "折れ線チャートに切り替え", "market_trade_on": "%s で取引", "market_updated": "\\xc2\\xb7 更新: %s", "market_vol_short": "出来高", diff --git a/res/lang/ko.json b/res/lang/ko.json index 3e1a982..5270867 100644 --- a/res/lang/ko.json +++ b/res/lang/ko.json @@ -548,6 +548,8 @@ "market_price_loading": "가격 데이터를 불러오는 중...", "market_price_unavailable": "가격 데이터를 사용할 수 없습니다", "market_refresh_price": "가격 데이터 새로고침", + "market_style_candle": "캔들차트로 전환", + "market_style_line": "선형 차트로 전환", "market_trade_on": "%s에서 거래", "market_updated": "\\xc2\\xb7 업데이트됨 %s", "market_vol_short": "거래량", diff --git a/res/lang/pt.json b/res/lang/pt.json index ae07b6c..92eb8b8 100644 --- a/res/lang/pt.json +++ b/res/lang/pt.json @@ -548,6 +548,8 @@ "market_price_loading": "Carregando dados de preço...", "market_price_unavailable": "Dados de preço indisponíveis", "market_refresh_price": "Atualizar dados de preço", + "market_style_candle": "Mudar para velas", + "market_style_line": "Mudar para gráfico de linhas", "market_trade_on": "Negociar no %s", "market_updated": "\\xc2\\xb7 Atualizado %s", "market_vol_short": "Vol", diff --git a/res/lang/ru.json b/res/lang/ru.json index 211d945..e16ee91 100644 --- a/res/lang/ru.json +++ b/res/lang/ru.json @@ -548,6 +548,8 @@ "market_price_loading": "Загрузка данных о ценах...", "market_price_unavailable": "Данные о ценах недоступны", "market_refresh_price": "Обновить данные о ценах", + "market_style_candle": "Переключить на свечи", + "market_style_line": "Переключить на линейный график", "market_trade_on": "Торговать на %s", "market_updated": "\\xc2\\xb7 Обновлено %s", "market_vol_short": "Объём", diff --git a/res/lang/zh.json b/res/lang/zh.json index c1d4d01..9a42a8a 100644 --- a/res/lang/zh.json +++ b/res/lang/zh.json @@ -548,6 +548,8 @@ "market_price_loading": "正在加载价格数据...", "market_price_unavailable": "价格数据不可用", "market_refresh_price": "刷新价格数据", + "market_style_candle": "切换到蜡烛图", + "market_style_line": "切换到折线图", "market_trade_on": "在 %s 交易", "market_updated": "\\xc2\\xb7 已更新 %s", "market_vol_short": "成交量", diff --git a/scripts/add_missing_translations.py b/scripts/add_missing_translations.py index 486bfa2..008880b 100644 --- a/scripts/add_missing_translations.py +++ b/scripts/add_missing_translations.py @@ -2260,6 +2260,18 @@ TRANSLATIONS = { "ru": "Загрузка истории цен", "zh": "正在加载价格历史", "ja": "価格履歴を読み込み中", "ko": "가격 기록 불러오는 중" }, + "market_style_line": { + "es": "Cambiar a gráfico de líneas", "de": "Zum Liniendiagramm wechseln", + "fr": "Passer au graphique en ligne", "pt": "Mudar para gráfico de linhas", + "ru": "Переключить на линейный график", "zh": "切换到折线图", + "ja": "折れ線チャートに切り替え", "ko": "선형 차트로 전환" + }, + "market_style_candle": { + "es": "Cambiar a velas", "de": "Zu Kerzenchart wechseln", + "fr": "Passer aux chandeliers", "pt": "Mudar para velas", + "ru": "Переключить на свечи", "zh": "切换到蜡烛图", + "ja": "ローソク足に切り替え", "ko": "캔들차트로 전환" + }, } def main(): diff --git a/src/ui/windows/market_tab.cpp b/src/ui/windows/market_tab.cpp index 22c0313..5daf6cd 100644 --- a/src/ui/windows/market_tab.cpp +++ b/src/ui/windows/market_tab.cpp @@ -44,6 +44,7 @@ struct MarketViewState { int pairIdx = 0; bool stateLoaded = false; int chartInterval = 4; // main chart range: 0=Live 1=1H 2=1D 3=1W 4=1M (default 1M) + int chartStyle = 1; // 0 = line, 1 = candlestick (only applies when per-exchange OHLC exists) }; static MarketViewState s_mkt; @@ -1412,6 +1413,29 @@ static void mktDrawPriceChart(const MktCtx& cx) bx += bw + Layout::spacingXs(); } + // Line/candle toggle — only when the selected range has per-exchange candles (the aggregate / + // Live view is line-only, so the toggle is hidden there). + if (cx.chartCandles && cx.chartCandles->size() >= 2) { + bx += Layout::spacingSm(); + ImFont* icoF = material::Typography::instance().iconSmall(); + const bool isCandle = (s_mkt.chartStyle == 1); + const char* styleIcon = isCandle ? ICON_MD_CANDLESTICK_CHART : ICON_MD_SHOW_CHART; + ImVec2 tmn(bx, rowTop), tmx(bx + pillH, rowTop + pillH); + bool thov = material::IsRectHovered(tmn, tmx); + if (thov) { dl->AddRectFilled(tmn, tmx, IM_COL32(255, 255, 255, 20), 4.0f); + ImGui::SetMouseCursor(ImGuiMouseCursor_Hand); } + ImVec2 tiSz = icoF->CalcTextSizeA(icoF->LegacySize, FLT_MAX, 0, styleIcon); + dl->AddText(icoF, icoF->LegacySize, + ImVec2(tmn.x + (pillH - tiSz.x) * 0.5f, tmn.y + (pillH - tiSz.y) * 0.5f), + thov ? OnSurface() : OnSurfaceMedium(), styleIcon); + ImGui::SetCursorScreenPos(tmn); + if (ImGui::InvisibleButton("##ChartStyle", ImVec2(pillH, pillH))) + s_mkt.chartStyle = isCandle ? 0 : 1; + if (ImGui::IsItemHovered()) + material::Tooltip("%s", TR(isCandle ? "market_style_line" : "market_style_candle")); + bx += pillH; + } + // Refresh button (far right). float rEdge = chartMax.x - chartPad; ImFont* iconSmall = material::Typography::instance().iconSmall(); @@ -1465,7 +1489,8 @@ static void mktDrawPriceChart(const MktCtx& cx) float plotH = plotBottom - plotTop; const auto& candles = *cx.chartCandles; - const bool hasCandles = candles.size() >= 2; // per-exchange OHLC -> candlesticks, else a line + // Candlesticks when per-exchange OHLC exists AND the user hasn't switched to the line view. + const bool hasCandles = candles.size() >= 2 && s_mkt.chartStyle == 1; if (hasCandles || s_mkt.history.size() >= 2) { // Compute Y range with padding — candles span low..high, the line spans close..close. double yMin, yMax; @@ -1941,7 +1966,8 @@ void RenderMarketTab(App* app) float mktDp = Layout::dpiScale(); // -- Compact price chart: a modest responsive height, no longer stretched to fill the tab. -- - float chartH = std::max(110.0f * vs, std::min(chartElem.height * vs, marketAvail.y * 0.22f)); + // ~50% taller than before (floor / desired / viewport-cap all scaled) — a roomier price chart. + float chartH = std::max(165.0f * vs, std::min(chartElem.height * 1.5f * vs, marketAvail.y * 0.33f)); // -- Hero header: size to the ACTUAL content (price row + separator gap + stats row) so the // chart starts right after "24H VOLUME"/"Market Cap" instead of below a reserved empty band. -- diff --git a/src/util/i18n.cpp b/src/util/i18n.cpp index 627bdf2..bd70570 100644 --- a/src/util/i18n.cpp +++ b/src/util/i18n.cpp @@ -1348,6 +1348,8 @@ void I18n::loadBuiltinEnglish() strings_["market_btc_price"] = "BTC PRICE"; strings_["market_no_history"] = "No price history available"; strings_["market_chart_loading"] = "Loading price history"; + strings_["market_style_line"] = "Switch to line chart"; + strings_["market_style_candle"] = "Switch to candlesticks"; strings_["market_no_price"] = "No price data"; strings_["market_now"] = "Now"; strings_["market_pct_shielded"] = "%.0f%% Shielded";