Блоки кода: убрано время, чистый Telegram-пузырь без времени

- Убран timeStr и нижний блок с 20:31 ✓✓, теперь пузырь только с кодом и кнопкой 📋 Копировать справа вверху
- Фон #2e4d6a radius 14, внутренний rgba(0,0,0,0.22) radius 9, JetBrains Mono 13/1.5/tab 4, copybtn hover/active через <style> .copybtn:hover/active
- Сохранены редактор-фичи: авто-закрытие ()[]{}""''<>, тег </tag>, Tab 4 пробела, Enter сохраняет indent, Backspace удаляет 4, подсветка пары o ↔ m
This commit is contained in:
2026-09-01 20:56:21 +03:00
parent c861fcc763
commit 79b76c8c42
+14 -25
View File
@@ -478,46 +478,35 @@ private:
const char *info = cmark_node_get_fence_info(n);
const QString lang = normalizeLang(QString::fromUtf8(info ? info : ""));
const QString code = QString::fromUtf8(cmark_node_get_literal(n));
// Telegram-стиль как на скрине: тёмно-синий пузырь (#2e4d6a) с кодом, время и галочки внизу справа
// Сохраняем оригинал для копирования
QString codeId;
if (m_impl) {
codeId = QStringLiteral("code_%1").arg(m_impl->codeCounter++);
m_impl->codeBlocks.insert(codeId, code);
}
// Форсируем тёмную тему подсветки для контраста на синем фоне Telegram-пузыря
// Подсветка — тёмная тема для контраста на синем фоне (как в Telegram)
CodeHighlighter hl(m_repo);
const QString highlighted = hl.highlight(code, lang, true);
// Переопределяем lang после highlight (highlight уже сделал)
const QString langDisplay = lang.isEmpty() ? "text" : esc(lang);
const QString cls = lang.isEmpty() ? QString() : QStringLiteral(" class=\"language-%1\"").arg(esc(lang));
// Время как в Telegram — текущее время рендера (можно заменить на lastModified)
const QString timeStr = QTime::currentTime().toString("hh:mm");
// Telegram bubble: #3a5068 или #2e4d6a, скругления 12, тень, max-width 85%
const QString bubbleBg = "#3b5a7a"; // тёмно-синий как на скрине #2e4d6a → #3b5a7a чуть светлее
const QString codeColor = "#ffffff";
// Кнопка копирования — в правом верхнем углу пузыря, как в ТГ при наведении
// Делаем её заметной: полупрозрачная, скруглённая, с hover/active через CSS
// Telegram-пузырь как на скрине: #2e4d6a / #3b5a7a, скругления 12-16, без времени
const QString bubbleBg = "#2e4d6a";
// Кнопка копирования — строго справа вверху, hover/active через CSS
const QString copyLink = codeId.isEmpty() ? QString()
: QStringLiteral("<a href=\"flora://copycode/%1\" style=\"display:inline-block;background:rgba(255,255,255,0.15);color:#ffffff;text-decoration:none;font-size:12px;padding:3px 8px;border-radius:12px;border:1px solid rgba(255,255,255,0.2);font-family:-apple-system,sans-serif;\" title=\"Копировать\">📋</a>").arg(codeId);
: QStringLiteral("<a href=\"flora://copycode/%1\" class=\"copybtn\" style=\"display:inline-block;background:rgba(255,255,255,0.12);color:#e0e0e0;text-decoration:none;font-size:12px;padding:4px 10px;border-radius:14px;border:1px solid rgba(255,255,255,0.18);font-family:-apple-system,sans-serif;\" title=\"Копировать\">📋 Копировать</a>").arg(codeId);
// Пузырь Telegram: используем таблицу для совместимости с QTextDocument (не поддерживает position:absolute)
// Верхняя строка — язык слева и кнопка справа, средняя — код, нижняя — время и галочки справа
// Чистый пузырь без времени, только код + кнопка
return QStringLiteral(
"<div style=\"background:%1;border-radius:12px;padding:10px 14px 6px 14px;margin:12px 0;max-width:88%%;box-shadow:0 1px 2px rgba(0,0,0,0.15)\">"
"<table width=\"100%%\" cellspacing=\"0\" cellpadding=\"0\" style=\"margin-bottom:6px\">"
"<tr>"
"<td style=\"text-align:left;color:#8a9ba8;font-size:10px;font-weight:600;letter-spacing:0.4px;text-transform:uppercase;opacity:0.9\">%2</td>"
"<td style=\"text-align:right\">%3</td>"
"</tr></table>"
"<div style=\"background:rgba(0,0,0,0.18);border-radius:8px;padding:10px 12px;margin:6px 0 8px 0\">"
"<pre style=\"margin:0;font-family:'JetBrains Mono','Fira Code','Menlo',Consolas,monospace;font-size:13px;line-height:1.45;tab-size:4;color:%4;white-space:pre-wrap;word-wrap:break-word\">"
"<code%6>%5</code></pre>"
"<style>.copybtn:hover{background:rgba(255,255,255,0.22) !important;border-color:rgba(255,255,255,0.28) !important;color:#ffffff !important;}"
".copybtn:active{background:rgba(255,255,255,0.30) !important;}</style>"
"<div style=\"background:%1;border-radius:14px;padding:12px 14px 12px 14px;margin:12px 0;max-width:88%%;box-shadow:0 1px 2px rgba(0,0,0,0.18)\">"
"<div style=\"text-align:right;margin-bottom:8px\">%2</div>"
"<div style=\"background:rgba(0,0,0,0.22);border-radius:9px;padding:12px 14px\">"
"<pre style=\"margin:0;font-family:'JetBrains Mono','Fira Code','Menlo',Consolas,monospace;font-size:13px;line-height:1.5;tab-size:4;white-space:pre-wrap;word-wrap:break-word;color:#ffffff\">"
"<code%4>%3</code></pre>"
"</div>"
"<div style=\"text-align:right;color:#8a9ba8;font-size:11px;margin-top:2px;opacity:0.95\">%7 <span style=\"color:#5eb1f6\">✓✓</span></div>"
"</div>"
).arg(bubbleBg, langDisplay, copyLink, codeColor, highlighted, cls, timeStr);
).arg(bubbleBg, copyLink, highlighted, cls);
}
QString inlineAll(cmark_node *n)