--- a/src/mainwindow.cpp Sat Apr 08 16:12:12 2023 +0300 +++ b/src/mainwindow.cpp Sat Apr 08 16:41:40 2023 +0300 @@ -1,17 +1,33 @@ -/* - * LDForge: LDraw parts authoring CAD - * Copyright (C) 2013 - 2020 Teemu Piippo - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see <http://www.gnu.org/licenses/>. - */ +#include "mainwindow.h" + +static constexpr MemberData<MainWindow, QAction*, gl::RenderStyle> renderStyleButtons[] = { + { offsetof(MainWindow, actionRenderStyleNormal), gl::RenderStyle::Normal }, + { offsetof(MainWindow, actionRenderStyleBfc), gl::RenderStyle::BfcRedGreen }, + { offsetof(MainWindow, actionRenderStyleRandom), gl::RenderStyle::RandomColors }, + { offsetof(MainWindow, actionRenderStylePickScene), gl::RenderStyle::PickScene }, +}; + +MainWindow::MainWindow(QWidget *parent) +: QMainWindow{parent} +{ + this->setupUi(this); + for (const auto& memberData : ::renderStyleButtons) + { + QAction* action = memberData.memberInstance(this); + const gl::RenderStyle newStyle = memberData.payload; + QObject::connect(action, &QAction::triggered, [this, newStyle]{ + Q_EMIT this->renderStyleSelected(newStyle); + this->setRenderStyle(newStyle); + }); + } +} + +void MainWindow::setRenderStyle(gl::RenderStyle style) +{ + for (const auto& memberData : ::renderStyleButtons) + { + QAction* const action = memberData.memberInstance(this); + const gl::RenderStyle buttonRenderStyle = memberData.payload; + action->setChecked(style == buttonRenderStyle); + } +}