mirror of
https://github.com/qelectrotech/qelectrotech-source-mirror.git
synced 2026-09-26 03:44:14 +02:00
e3d11a4992
`qelectrotech --resave examples/schema_indus.qet out.qet` never returns.
It is not slow -- ten minutes of wall clock consumed 0.16s of CPU, so it
is blocked, not working. The GUI opens the same project without
complaint, so the file is fine and the fault is in the headless path.
A backtrace of the stuck process:
main
CLIExport::run
QETProject::QETProject(QString const&, QObject*)
QETProject::openFile(QFile*)
QETProject::readProjectXml(QDomDocument&)
QET::QetMessageBox::warning(...)
QDialog::exec() <- waits forever
That project records version="0.3", so loading it raises the "partially
compatible with your version" warning. Interactively somebody presses
Open; with no display nobody can, and exec() spins its event loop
indefinitely. Any modal box reachable while loading does this -- the
version warning is just the one an example file happens to trigger.
Fixed at the wrapper all 52 call sites already go through rather than at
the one warning, so the whole class is closed: QetMessageBox gains a
non-interactive mode which writes the message to stderr and returns an
answer instead of constructing a dialog. main.cpp turns it on in the
CLI branch, beside the existing setBackupEnabled(false).
The answer is the caller's defaultButton when it gave one, otherwise the
first "carry on" button offered (Ok, Open, Yes, Save...), otherwise the
first button set. Both warnings in readProjectXml offer Open|Cancel and
abort on Cancel, so they resolve to Open and the project loads, which is
what a batch invocation wants. The text still reaches the user on
stderr, where previously it was lost inside an invisible dialog.
GUI behaviour is unchanged: the flag defaults to false and is set in
exactly one place, the command-line branch of main().
Verified: schema_indus.qet goes from hanging to resaving in 0.3s; all 23
example projects now complete a double-resave with element, conductor,
terminal and uuid sets intact; unit tests pass.
79 lines
2.9 KiB
C++
79 lines
2.9 KiB
C++
/*
|
|
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 <http://www.gnu.org/licenses/>.
|
|
*/
|
|
#ifndef QET_MESSAGE_BOX_H
|
|
#define QET_MESSAGE_BOX_H
|
|
#include <QMessageBox>
|
|
namespace QET {
|
|
/**
|
|
This namespace defines static methods behaving in a very similar way to some
|
|
static methods from the QMessageBox Qt class. The behavior is expected to be
|
|
the same under X11 and Windows. However, under MacOS, when a parent widget is
|
|
provided, these methodes ensure the dialog box is "window modal" and has the
|
|
Qt:Sheet flag, thus enabling a better MacOS integration.
|
|
*/
|
|
namespace QetMessageBox {
|
|
/**
|
|
Enable non-interactive mode.
|
|
|
|
In non-interactive mode the functions below never construct a
|
|
dialog. They write the message to stderr and return an answer
|
|
immediately, so a headless run cannot block on a modal box that
|
|
nobody is there to dismiss.
|
|
|
|
This is needed because these are reachable from the command-line
|
|
tools: opening a project written by an older QElectroTech raises
|
|
a warning from QETProject::readProjectXml(), and with no display
|
|
to click it, QDialog::exec() spins its event loop forever.
|
|
|
|
The answer is chosen as: the caller's defaultButton when it gave
|
|
one, otherwise the first "carry on" button among those offered
|
|
(Ok, Open, Yes, Save, Apply...), otherwise the first button set.
|
|
So the two warnings above resolve to Open and the project loads,
|
|
which is what a batch invocation wants.
|
|
*/
|
|
void setNonInteractive(bool non_interactive);
|
|
bool isNonInteractive();
|
|
|
|
QMessageBox::StandardButton critical (
|
|
QWidget *,
|
|
const QString &,
|
|
const QString &,
|
|
QMessageBox::StandardButtons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton = QMessageBox::NoButton);
|
|
QMessageBox::StandardButton information(
|
|
QWidget *,
|
|
const QString &,
|
|
const QString &,
|
|
QMessageBox::StandardButtons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton = QMessageBox::NoButton);
|
|
QMessageBox::StandardButton question (
|
|
QWidget *,
|
|
const QString &,
|
|
const QString &,
|
|
QMessageBox::StandardButtons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton = QMessageBox::NoButton);
|
|
QMessageBox::StandardButton warning (
|
|
QWidget *,
|
|
const QString &,
|
|
const QString &,
|
|
QMessageBox::StandardButtons = QMessageBox::Ok,
|
|
QMessageBox::StandardButton = QMessageBox::NoButton);
|
|
};
|
|
};
|
|
#endif
|