diff --git a/src/app/Glyphs.cpp b/src/app/Glyphs.cpp index e9adc84..b9ab474 100644 --- a/src/app/Glyphs.cpp +++ b/src/app/Glyphs.cpp @@ -109,6 +109,12 @@ QString svgPathFor(Glyph t) "2 0 0 0-.73-2.73l-.15-.08a2 2 0 0 1-1-1.74v-.5a2 2 0 0 1 1-1.74l.15-.09a2 2 0 0 0 " ".73-2.73l-.22-.38a2 2 0 0 0-2.73-.73l-.15.08a2 2 0 0 1-2 0l-.43-.25a2 2 0 0 " "1-1-1.73V4a2 2 0 0 0-2-2z'/>"); + case Glyph::Minus: + return QStringLiteral(""); + case Glyph::Fit: + return QStringLiteral( + ""); } return QString(); } diff --git a/src/app/Glyphs.hpp b/src/app/Glyphs.hpp index d405a34..6d0c262 100644 --- a/src/app/Glyphs.hpp +++ b/src/app/Glyphs.hpp @@ -38,6 +38,8 @@ enum class Glyph { Help, // 帮助(?) Bell, // 通知(铃铛) Gear, // 设置(齿轮) + Minus, // 缩小(减号) + Fit, // 适配/复位(四角框) }; // 「图标+文字」按钮的图标→文字间距补丁:Fusion 内置约 4px,本值补到规范 §6.7 的 6px。 diff --git a/src/app/VtkViewToolbar.cpp b/src/app/VtkViewToolbar.cpp index 5715f5c..65636cb 100644 --- a/src/app/VtkViewToolbar.cpp +++ b/src/app/VtkViewToolbar.cpp @@ -1,29 +1,58 @@ #include "VtkViewToolbar.hpp" +#include +#include #include #include +#include "Glyphs.hpp" +#include "Theme.hpp" + using geopro::controller::ViewDir; namespace geopro::app { +namespace { +constexpr int kIconPx = 18; +} + VtkViewToolbar::VtkViewToolbar(QWidget* parent) : QWidget(parent) { auto* col = new QVBoxLayout(this); - col->setContentsMargins(2, 2, 2, 2); + col->setContentsMargins(space::kSm, space::kSm, space::kSm, space::kSm); col->setSpacing(2); - auto addBtn = [&](const QString& text) { + const QColor ic = tokenColor("text/secondary"); + auto iconBtn = [&](Glyph g, const QString& tip) { auto* b = new QToolButton(this); - b->setText(text); + b->setIcon(makeGlyph(g, ic, kIconPx)); + b->setIconSize(QSize(kIconPx, kIconPx)); b->setAutoRaise(true); - b->setFixedWidth(34); - col->addWidget(b); + b->setToolTip(tip); + b->setFixedSize(30, 30); + col->addWidget(b, 0, Qt::AlignHCenter); return b; }; + auto textBtn = [&](const QString& t) { + auto* b = new QToolButton(this); + b->setText(t); + b->setAutoRaise(true); + b->setFixedSize(30, 24); + col->addWidget(b, 0, Qt::AlignHCenter); + return b; + }; + auto sep = [&]() { + auto* line = new QFrame(this); + line->setFrameShape(QFrame::HLine); + line->setFrameShadow(QFrame::Plain); + applyTokenizedStyleSheet(line, QStringLiteral("color:{{border/default}};")); + col->addWidget(line); + }; - connect(addBtn(QStringLiteral("设置")), &QToolButton::clicked, this, + // ── 段1:设置(坐标轴)── + connect(iconBtn(Glyph::Gear, QStringLiteral("坐标轴设置")), &QToolButton::clicked, this, &VtkViewToolbar::axesSettingsRequested); - + sep(); + // ── 段2:快捷视图(前/后/上/下/左/右)── struct V { const char* t; ViewDir d; @@ -32,14 +61,27 @@ VtkViewToolbar::VtkViewToolbar(QWidget* parent) : QWidget(parent) { {"下", ViewDir::Bottom}, {"左", ViewDir::Left}, {"右", ViewDir::Right}}; for (const V& v : views) { const ViewDir d = v.d; - connect(addBtn(QString::fromUtf8(v.t)), &QToolButton::clicked, this, + connect(textBtn(QString::fromUtf8(v.t)), &QToolButton::clicked, this, [this, d] { emit viewRequested(d); }); } + sep(); + // ── 段3:缩放 / 复位 ── + connect(iconBtn(Glyph::Plus, QStringLiteral("放大")), &QToolButton::clicked, this, + &VtkViewToolbar::zoomInRequested); + connect(iconBtn(Glyph::Minus, QStringLiteral("缩小")), &QToolButton::clicked, this, + &VtkViewToolbar::zoomOutRequested); + connect(iconBtn(Glyph::Fit, QStringLiteral("适配 / 复位")), &QToolButton::clicked, this, + &VtkViewToolbar::fitRequested); - connect(addBtn(QStringLiteral("放大")), &QToolButton::clicked, this, &VtkViewToolbar::zoomInRequested); - connect(addBtn(QStringLiteral("缩小")), &QToolButton::clicked, this, &VtkViewToolbar::zoomOutRequested); - connect(addBtn(QStringLiteral("复位")), &QToolButton::clicked, this, &VtkViewToolbar::fitRequested); - col->addStretch(1); + // 悬浮样式:圆角面板浮于画布上(main 把本控件 setParent(vtkWidget) 叠加定位)。 + setAttribute(Qt::WA_StyledBackground, true); + applyTokenizedStyleSheet( + this, QStringLiteral("QWidget{background:{{bg/panel-subtle}};" + "border:1px solid {{border/default}};border-radius:8px;}" + "QToolButton{border:none;border-radius:4px;color:{{text/secondary}};}" + "QToolButton:hover{background:{{bg/hover}};color:{{accent/primary}};}")); + setFixedWidth(44); + adjustSize(); } } // namespace geopro::app diff --git a/src/app/main.cpp b/src/app/main.cpp index c414485..1516173 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -380,22 +380,21 @@ void buildWorkbench(QMainWindow& window, geopro::data::LocalSampleRepository& re } fieldDict->setArrayTypeEnum(std::move(e)); }); - // 左侧抽屉 | 右侧(工具条+画布)用 QSplitter,左面板可拖动改宽(不可拖没;右侧伸缩)。 + // 左侧抽屉 | 右侧画布用 QSplitter(左面板可拖改宽);工具条悬浮于画布上(不占布局)。 auto* split = new QSplitter(Qt::Horizontal); split->setChildrenCollapsible(false); split->setHandleWidth(4); split->addWidget(drawer); - auto* rightWrap = new QWidget(); - auto* rl = new QHBoxLayout(rightWrap); - rl->setContentsMargins(0, 0, 0, 0); - rl->setSpacing(0); - rl->addWidget(viewToolbar); // 画布工具条 - rl->addWidget(vtkWidget, 1); // GL 画布 - split->addWidget(rightWrap); + split->addWidget(vtkWidget); split->setStretchFactor(0, 0); split->setStretchFactor(1, 1); centerLayout->addWidget(viewHeader); centerLayout->addWidget(split, 1); + // 工具条悬浮于画布左上角(overlay;左上固定,画布 resize 无需重定位)。 + viewToolbar->setParent(vtkWidget); + viewToolbar->move(12, 12); + viewToolbar->raise(); + viewToolbar->show(); // 3b:三维分析栏勾选的已保存切片(dd_slice) id 集合 + 调和函数。 // syncSlices:按"当前活动体 dsId"调和 InteractionManager 上显示的已保存切片——