/*
Copyright 2006-2026 The QElectroTech Team
This file is part of QElectroTech.
QElectroTech 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 2 of the License, or
(at your option) any later version.
QElectroTech 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 QElectroTech. If not, see .
*/
#include "toolbarsettings.h"
#include
#include
#include
#include
namespace {
const QString ICON_SIZE = QStringLiteral("toolbars/icon_size");
const QString BUTTON_STYLE = QStringLiteral("toolbars/button_style");
const QString LOCKED = QStringLiteral("toolbars/locked");
//Set on a window by applyTo()
const char *const APPLIED = "qetToolbarSettings";
}
int ToolbarSettings::iconSize()
{
return QSettings().value(ICON_SIZE, 0).toInt();
}
Qt::ToolButtonStyle ToolbarSettings::buttonStyle()
{
const int style = QSettings().value(BUTTON_STYLE, int(Qt::ToolButtonIconOnly)).toInt();
switch (style) {
case Qt::ToolButtonTextBesideIcon:
case Qt::ToolButtonTextUnderIcon:
return Qt::ToolButtonStyle(style);
default:
return Qt::ToolButtonIconOnly;
}
}
bool ToolbarSettings::locked()
{
return QSettings().value(LOCKED, false).toBool();
}
/**
@brief ToolbarSettings::save
Store the three values; a default value removes its key.
*/
void ToolbarSettings::save(int icon_size, Qt::ToolButtonStyle style, bool locked)
{
QSettings settings;
if (icon_size > 0) settings.setValue(ICON_SIZE, icon_size);
else settings.remove(ICON_SIZE);
if (style != Qt::ToolButtonIconOnly) settings.setValue(BUTTON_STYLE, int(style));
else settings.remove(BUTTON_STYLE);
if (locked) settings.setValue(LOCKED, true);
else settings.remove(LOCKED);
}
/**
@brief ToolbarSettings::applyTo
Apply the settings to \a window and its toolbars. The window passes
its icon size and button style on to every toolbar that has none of
its own; an invalid size gives the style's default back. The window
is marked, so applyToAll() updates it again later.
*/
void ToolbarSettings::applyTo(QMainWindow *window)
{
if (!window) {
return;
}
window->setProperty(APPLIED, true);
const int size = iconSize();
window->setIconSize(size > 0 ? QSize(size, size) : QSize());
window->setToolButtonStyle(buttonStyle());
const bool movable = !locked();
for (QToolBar *toolbar : window->findChildren()) {
//Not a toolbar inside a panel: only the window's own
if (window->toolBarArea(toolbar) != Qt::NoToolBarArea) {
toolbar->setMovable(movable);
}
}
}
/**
@brief ToolbarSettings::applyToAll
Apply the settings again to every open window that took them with
applyTo(), after they change. Other windows are left alone: they
would lose the settings the next time they open.
*/
void ToolbarSettings::applyToAll()
{
for (QWidget *widget : QApplication::topLevelWidgets()) {
auto *window = qobject_cast(widget);
if (window && window->property(APPLIED).toBool()) {
applyTo(window);
}
}
}