Gui: Store visibility of status labels (quick measure and input hints)

This commit is contained in:
Benjamin Nauck
2025-09-03 21:23:58 +02:00
parent a2ae5af2b4
commit ca62f0beee
6 changed files with 172 additions and 61 deletions

View File

@@ -1382,6 +1382,7 @@ SET(FreeCADGui_CPP_SRCS
resource.cpp
Control.cpp
SpaceballEvent.cpp
StatusBarLabel.cpp
PreferencePackManager.cpp
Thumbnail.cpp
Utilities.cpp
@@ -1431,6 +1432,7 @@ SET(FreeCADGui_SRCS
WaitCursor.h
ManualAlignment.h
StartupProcess.h
StatusBarLabel.h
TransactionObject.h
ToolHandler.h
StyleParameters/Parser.h

View File

@@ -31,7 +31,7 @@
#include "InputHint.h"
#include "InputHintWidget.h"
Gui::InputHintWidget::InputHintWidget(QWidget* parent) : QLabel(parent)
Gui::InputHintWidget::InputHintWidget(QWidget* parent) : StatusBarLabel(parent, "InputHintEnabled")
{}
void Gui::InputHintWidget::showHints(const std::list<InputHint>& hints)

View File

@@ -24,16 +24,16 @@
#ifndef INPUTHINTWIDGET_H
#define INPUTHINTWIDGET_H
#include <QLabel>
#include <optional>
#include <FCGlobal.h>
#include "StatusBarLabel.h"
#include "InputHint.h"
namespace Gui
{
class GuiExport InputHintWidget : public QLabel
class GuiExport InputHintWidget : public StatusBarLabel
{
Q_OBJECT

View File

@@ -103,6 +103,7 @@
#include "ReportView.h"
#include "SelectionView.h"
#include "SplashScreen.h"
#include "StatusBarLabel.h"
#include "ToolBarManager.h"
#include "ToolBoxManager.h"
#include "Tree.h"
@@ -308,62 +309,6 @@ struct MainWindowP
void restoreWindowState(const QByteArray &);
};
/**
* @brief Label for displaying information in the status bar
*
* A QLabel subclass that provides a context menu with additional actions
* similar to the standard status bar widgets.
*/
class StatusBarInfoLabel : public QLabel
{
Q_OBJECT
public:
explicit StatusBarInfoLabel(QWidget *parent = nullptr)
: QLabel(parent)
{
}
protected:
void contextMenuEvent(QContextMenuEvent *event) override
{
QMenu menu(this);
// Reproduce standard status bar widget menu
if (auto *bar = qobject_cast<QStatusBar*>(parentWidget())) {
for (QObject *child : bar->children()) {
QWidget *w = qobject_cast<QWidget*>(child);
if (!w) {
continue;
}
auto title = w->windowTitle();
if (title.isEmpty()) {
continue;
}
QAction *action = menu.addAction(title);
action->setCheckable(true);
action->setChecked(w->isVisible());
QObject::connect(action, &QAction::toggled, w, &QWidget::setVisible);
}
}
menu.addSeparator(); // ----------
// Copy + Select All
menu.addAction(tr("Copy"), [this]() {
QApplication::clipboard()->setText(this->selectedText());
});
menu.addAction(tr("Select All"), [this]() {
this->setSelection(0, this->text().length());
});
menu.exec(event->globalPos());
}
void hideEvent(QHideEvent *event) override {
clear(); // Clear text
QLabel::hideEvent(event);
}
};
} // namespace Gui
/* TRANSLATOR Gui::MainWindow */
@@ -446,7 +391,7 @@ MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags f)
// labels and progressbar
d->status = new StatusBarObserver();
d->actionLabel = new StatusBarInfoLabel(statusBar());
d->actionLabel = new StatusBarLabel(statusBar());
d->actionLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
d->sizeLabel = new DimensionWidget(statusBar());
@@ -464,7 +409,7 @@ MainWindow::MainWindow(QWidget * parent, Qt::WindowFlags f)
statusBar()->addWidget(d->hintLabel);
// right side label
d->rightSideLabel = new StatusBarInfoLabel(statusBar());
d->rightSideLabel = new StatusBarLabel(statusBar(), "QuickMeasureEnabled");
d->rightSideLabel->setTextInteractionFlags(Qt::TextSelectableByMouse);
statusBar()->addPermanentWidget(d->rightSideLabel);
d->rightSideLabel->setObjectName(QStringLiteral("rightSideLabel"));

101
src/Gui/StatusBarLabel.cpp Normal file
View File

@@ -0,0 +1,101 @@
// SPDX-License-Identifier: LGPL-2.1-or-later
/****************************************************************************
* *
* Copyright (c) 2025 Benjamin Nauck <benjamin@nauck.se> *
* *
* 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 <QMenu>
#include <QClipboard>
#include <QApplication>
#include <QStatusBar>
#include <QAction>
#include <QContextMenuEvent>
#include <QHideEvent>
#include "StatusBarLabel.h"
#include <App/Application.h>
namespace Gui {
StatusBarLabel::StatusBarLabel(QWidget *parent, const std::string& parameterName)
: QLabel(parent)
{
if (!parameterName.empty()) {
hGrp = App::GetApplication().GetParameterGroupByPath(
"User parameter:BaseApp/Preferences/MainWindow");
// set visibility before storing parameterName to avoid saving it immediately
setVisible(hGrp->GetBool(parameterName.c_str(), false));
// now we can store parameterName
this->parameterName = parameterName;
}
}
void StatusBarLabel::contextMenuEvent(QContextMenuEvent *event)
{
QMenu menu(this);
// Reproduce standard status bar widget menu
if (auto *statusBar = qobject_cast<QStatusBar*>(parentWidget())) {
for (QObject *child : statusBar->children()) {
QWidget *widget = qobject_cast<QWidget*>(child);
if (!widget) {
continue;
}
auto title = widget->windowTitle();
if (title.isEmpty()) {
continue;
}
QAction *action = menu.addAction(title);
action->setCheckable(true);
action->setChecked(widget->isVisible());
QObject::connect(action, &QAction::toggled, widget, &QWidget::setVisible);
}
}
if (textInteractionFlags() & Qt::TextSelectableByMouse) {
menu.addSeparator(); // ----------
// Copy + Select All
menu.addAction(tr("Copy"), [this]() {
QApplication::clipboard()->setText(this->selectedText());
});
menu.addAction(tr("Select All"), [this]() {
this->setSelection(0, this->text().length());
});
}
menu.exec(event->globalPos());
}
void StatusBarLabel::setVisible(bool visible)
{
if (!parameterName.empty() && hGrp) {
hGrp->SetBool(parameterName.c_str(), visible);
}
if (!visible) {
clear(); // Clear text
}
QLabel::setVisible(visible);
}
} // namespace Gui

63
src/Gui/StatusBarLabel.h Normal file
View File

@@ -0,0 +1,63 @@
// SPDX-License-Identifier: LGPL-2.1-or-later
/****************************************************************************
* *
* Copyright (c) 2025 Benjamin Nauck <benjamin@nauck.se> *
* *
* 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/>. *
* *
***************************************************************************/
#ifndef STATUSBARLABEL_H
#define STATUSBARLABEL_H
#include <string>
#include <QAction>
#include <QApplication>
#include <QClipboard>
#include <QContextMenuEvent>
#include <QLabel>
#include <QStatusBar>
#include <QMenu>
#include <FCGlobal.h>
#include <Base/Parameter.h>
namespace Gui
{
/**
* @brief Label for displaying information in the status bar
*
* A QLabel subclass that provides a context menu with additional actions
* similar to the standard status bar widgets.
*/
class GuiExport StatusBarLabel : public QLabel
{
Q_OBJECT
public:
explicit StatusBarLabel(QWidget *parent, const std::string& parameterName = {});
protected:
void contextMenuEvent(QContextMenuEvent *event) override;
void setVisible(bool visible) override;
private:
ParameterGrp::handle hGrp;
std::string parameterName;
};
} // Namespace Gui
#endif //STATUSBARLABEL_H