Start: Create 'First Start' screen
This commit is contained in:
238
src/Mod/Start/Gui/GeneralSettingsWidget.cpp
Normal file
238
src/Mod/Start/Gui/GeneralSettingsWidget.cpp
Normal file
@@ -0,0 +1,238 @@
|
||||
// SPDX-License-Identifier: LGPL-2.1-or-later
|
||||
/****************************************************************************
|
||||
* *
|
||||
* Copyright (c) 2024 The FreeCAD Project Association AISBL *
|
||||
* *
|
||||
* This file is part of FreeCAD. *
|
||||
* *
|
||||
* FreeCAD is free software: you can redistribute it and/or modify it *
|
||||
* under the terms of the GNU Lesser General Public License as *
|
||||
* published by the Free Software Foundation, either version 2.1 of the *
|
||||
* License, or (at your option) any later version. *
|
||||
* *
|
||||
* FreeCAD 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 *
|
||||
* Lesser General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU Lesser General Public *
|
||||
* License along with FreeCAD. If not, see *
|
||||
* <https://www.gnu.org/licenses/>. *
|
||||
* *
|
||||
***************************************************************************/
|
||||
|
||||
#include "PreCompiled.h"
|
||||
#ifndef _PreComp_
|
||||
#include <QApplication>
|
||||
#include <QComboBox>
|
||||
#include <QGridLayout>
|
||||
#include <QLabel>
|
||||
#include <QLayout>
|
||||
#include <QToolButton>
|
||||
#include <QVBoxLayout>
|
||||
#include <QWidget>
|
||||
#endif
|
||||
|
||||
#include "GeneralSettingsWidget.h"
|
||||
#include <gsl/pointers>
|
||||
#include <App/Application.h>
|
||||
#include <Base/Parameter.h>
|
||||
#include <Base/UnitsApi.h>
|
||||
#include <Gui/Language/Translator.h>
|
||||
#include <Gui/NavigationStyle.h>
|
||||
|
||||
using namespace StartGui;
|
||||
|
||||
GeneralSettingsWidget::GeneralSettingsWidget(QWidget* parent)
|
||||
: QWidget(parent)
|
||||
, _languageLabel {nullptr}
|
||||
, _unitSystemLabel {nullptr}
|
||||
, _navigationStyleLabel {nullptr}
|
||||
, _languageComboBox {nullptr}
|
||||
, _unitSystemComboBox {nullptr}
|
||||
, _navigationStyleComboBox {nullptr}
|
||||
{
|
||||
setObjectName(QLatin1String("GeneralSettingsWidget"));
|
||||
setupUi();
|
||||
qApp->installEventFilter(this);
|
||||
}
|
||||
|
||||
void GeneralSettingsWidget::setupUi()
|
||||
{
|
||||
if (layout()) {
|
||||
qDeleteAll(findChildren<QWidget*>(QString(), Qt::FindDirectChildrenOnly));
|
||||
delete layout();
|
||||
}
|
||||
_languageLabel = gsl::owner<QLabel*>(new QLabel);
|
||||
_navigationStyleLabel = gsl::owner<QLabel*>(new QLabel);
|
||||
_unitSystemLabel = gsl::owner<QLabel*>(new QLabel);
|
||||
createLanguageComboBox();
|
||||
createUnitSystemComboBox();
|
||||
createNavigationStyleComboBox();
|
||||
createHorizontalUi();
|
||||
retranslateUi();
|
||||
}
|
||||
|
||||
void GeneralSettingsWidget::createHorizontalUi()
|
||||
{
|
||||
auto mainLayout = gsl::owner<QHBoxLayout*>(new QHBoxLayout(this));
|
||||
const int extraSpace {36};
|
||||
mainLayout->addWidget(_languageLabel);
|
||||
mainLayout->addWidget(_languageComboBox);
|
||||
mainLayout->addSpacing(extraSpace);
|
||||
mainLayout->addWidget(_unitSystemLabel);
|
||||
mainLayout->addWidget(_unitSystemComboBox);
|
||||
mainLayout->addSpacing(extraSpace);
|
||||
mainLayout->addWidget(_navigationStyleLabel);
|
||||
mainLayout->addWidget(_navigationStyleComboBox);
|
||||
}
|
||||
|
||||
|
||||
QString GeneralSettingsWidget::createLabelText(const QString& translatedText) const
|
||||
{
|
||||
static const auto h2Start = QLatin1String("<h2>");
|
||||
static const auto h2End = QLatin1String("</h2>");
|
||||
return h2Start + translatedText + h2End;
|
||||
}
|
||||
|
||||
gsl::owner<QComboBox*> GeneralSettingsWidget::createLanguageComboBox()
|
||||
{
|
||||
ParameterGrp::handle hGrp =
|
||||
App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/General");
|
||||
auto langToStr = Gui::Translator::instance()->activeLanguage();
|
||||
QByteArray language = hGrp->GetASCII("Language", langToStr.c_str()).c_str();
|
||||
auto comboBox = gsl::owner<QComboBox*>(new QComboBox);
|
||||
comboBox->addItem(QString::fromLatin1("English"), QByteArray("English"));
|
||||
Gui::TStringMap list = Gui::Translator::instance()->supportedLocales();
|
||||
int index {0};
|
||||
for (auto it = list.begin(); it != list.end(); ++it, ++index) {
|
||||
QByteArray lang = it->first.c_str();
|
||||
QString langname = QString::fromLatin1(lang.constData());
|
||||
|
||||
if (it->second == "sr-CS") {
|
||||
// Qt does not treat sr-CS (Serbian, Latin) as a Latin-script variant by default: this
|
||||
// forces it to do so.
|
||||
it->second = "sr_Latn";
|
||||
}
|
||||
|
||||
QLocale locale(QString::fromLatin1(it->second.c_str()));
|
||||
QString native = locale.nativeLanguageName();
|
||||
if (!native.isEmpty()) {
|
||||
if (native[0].isLetter()) {
|
||||
native[0] = native[0].toUpper();
|
||||
}
|
||||
langname = native;
|
||||
}
|
||||
|
||||
comboBox->addItem(langname, lang);
|
||||
if (language == lang) {
|
||||
comboBox->setCurrentIndex(index);
|
||||
}
|
||||
}
|
||||
_languageComboBox = comboBox;
|
||||
connect(_languageComboBox,
|
||||
qOverload<int>(&QComboBox::currentIndexChanged),
|
||||
this,
|
||||
&GeneralSettingsWidget::onLanguageChanged);
|
||||
return comboBox;
|
||||
}
|
||||
|
||||
gsl::owner<QComboBox*> GeneralSettingsWidget::createUnitSystemComboBox()
|
||||
{
|
||||
// Contents are created in retranslateUi()
|
||||
auto comboBox = gsl::owner<QComboBox*>(new QComboBox);
|
||||
_unitSystemComboBox = comboBox;
|
||||
connect(_unitSystemComboBox,
|
||||
qOverload<int>(&QComboBox::currentIndexChanged),
|
||||
this,
|
||||
&GeneralSettingsWidget::onUnitSystemChanged);
|
||||
return comboBox;
|
||||
}
|
||||
|
||||
gsl::owner<QComboBox*> GeneralSettingsWidget::createNavigationStyleComboBox()
|
||||
{
|
||||
// Contents are created in retranslateUi()
|
||||
auto comboBox = gsl::owner<QComboBox*>(new QComboBox);
|
||||
_navigationStyleComboBox = comboBox;
|
||||
connect(_navigationStyleComboBox,
|
||||
qOverload<int>(&QComboBox::currentIndexChanged),
|
||||
this,
|
||||
&GeneralSettingsWidget::onNavigationStyleChanged);
|
||||
return comboBox;
|
||||
}
|
||||
|
||||
void GeneralSettingsWidget::onLanguageChanged(int index)
|
||||
{
|
||||
if (index < 0) {
|
||||
return; // happens when clearing the combo box in retranslateUi()
|
||||
}
|
||||
Gui::Translator::instance()->activateLanguage(
|
||||
_languageComboBox->itemData(index).toByteArray().data());
|
||||
ParameterGrp::handle hGrp =
|
||||
App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/General");
|
||||
auto langToStr = Gui::Translator::instance()->activeLanguage();
|
||||
hGrp->SetASCII("Language", langToStr.c_str());
|
||||
}
|
||||
|
||||
void GeneralSettingsWidget::onUnitSystemChanged(int index)
|
||||
{
|
||||
if (index < 0) {
|
||||
return; // happens when clearing the combo box in retranslateUi()
|
||||
}
|
||||
Base::UnitsApi::setSchema(static_cast<Base::UnitSystem>(index));
|
||||
ParameterGrp::handle hGrp =
|
||||
App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Units");
|
||||
hGrp->SetInt("UserSchema", index);
|
||||
}
|
||||
|
||||
void GeneralSettingsWidget::onNavigationStyleChanged(int index)
|
||||
{
|
||||
if (index < 0) {
|
||||
return; // happens when clearing the combo box in retranslateUi()
|
||||
}
|
||||
auto navStyleName = _navigationStyleComboBox->itemData(index).toByteArray().data();
|
||||
ParameterGrp::handle hGrp =
|
||||
App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View");
|
||||
hGrp->SetASCII("NavigationStyle", navStyleName);
|
||||
}
|
||||
|
||||
bool GeneralSettingsWidget::eventFilter(QObject* object, QEvent* event)
|
||||
{
|
||||
if (object == this && event->type() == QEvent::LanguageChange) {
|
||||
this->retranslateUi();
|
||||
}
|
||||
return QWidget::eventFilter(object, event);
|
||||
}
|
||||
|
||||
void GeneralSettingsWidget::retranslateUi()
|
||||
{
|
||||
_languageLabel->setText(createLabelText(tr("Language")));
|
||||
_unitSystemLabel->setText(createLabelText(tr("Unit System")));
|
||||
|
||||
_unitSystemComboBox->clear();
|
||||
ParameterGrp::handle hGrpUnits =
|
||||
App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/Units");
|
||||
auto userSchema = hGrpUnits->GetInt("UserSchema", 0);
|
||||
int num = static_cast<int>(Base::UnitSystem::NumUnitSystemTypes);
|
||||
for (int i = 0; i < num; i++) {
|
||||
QString item = Base::UnitsApi::getDescription(static_cast<Base::UnitSystem>(i));
|
||||
_unitSystemComboBox->addItem(item, i);
|
||||
}
|
||||
_unitSystemComboBox->setCurrentIndex(userSchema);
|
||||
|
||||
_navigationStyleLabel->setText(createLabelText(tr("Navigation Style")));
|
||||
_navigationStyleComboBox->clear();
|
||||
ParameterGrp::handle hGrpNav =
|
||||
App::GetApplication().GetParameterGroupByPath("User parameter:BaseApp/Preferences/View");
|
||||
auto navStyleName =
|
||||
hGrpNav->GetASCII("NavigationStyle", Gui::CADNavigationStyle::getClassTypeId().getName());
|
||||
std::map<Base::Type, std::string> styles = Gui::UserNavigationStyle::getUserFriendlyNames();
|
||||
for (const auto& style : styles) {
|
||||
QByteArray data(style.first.getName());
|
||||
QString name = QApplication::translate(style.first.getName(), style.second.c_str());
|
||||
_navigationStyleComboBox->addItem(name, data);
|
||||
if (navStyleName == style.first.getName()) {
|
||||
_navigationStyleComboBox->setCurrentIndex(_navigationStyleComboBox->count() - 1);
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user