/* 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 . */ #ifndef MULTIELEMENTINFOWIDGET_H #define MULTIELEMENTINFOWIDGET_H #include "../PropertiesEditor/propertieseditorwidget.h" #include "../diagramcontext.h" #include #include class Element; class QCheckBox; class QGraphicsItem; class QLabel; class QLineEdit; class QToolButton; /** @brief The MultiElementInfoWidget class Edit the information (manufacturer, supplier, references...) of several elements at once (issue #1439). Each field shows the value when every element has the same one, or "Multiple values" when they differ. A field left alone keeps each element's own value, a typed text is given to every element, and the erase box clears the field on every element. The restore button of a field, and reset(), bring back the values the elements had. All the changes of one apply are a single undo step. */ class MultiElementInfoWidget : public PropertiesEditorWidget { Q_OBJECT public: explicit MultiElementInfoWidget(const QList &elements, int other_items = 0, QWidget *parent = nullptr); ~MultiElementInfoWidget() override; void setElements(const QList &elements, int other_items = 0); QList elements() const; void apply() override; void reset() override; QUndoCommand *associatedUndo() const override; QString title() const override {return tr("Information");} void updateUi() override; bool setLiveEdit(bool live_edit) override; static bool takesInformations(const Element *element); static QList informationElements(const QList &items); static QList withoutOwnTexts(const QList &items); //What a field will do to the elements on apply enum FieldState {Keep, Set, Clear}; FieldState fieldState(const QString &key) const; void setFieldText(const QString &key, const QString &text); void setFieldCleared(const QString &key, bool cleared); void restoreField(const QString &key); bool fieldIsMixed(const QString &key) const; private: struct Row { QString key; QLabel *label = nullptr; QLineEdit *edit = nullptr; QCheckBox *erase = nullptr; QToolButton *restore = nullptr; QString initial; bool mixed = false; FieldState state = Keep; }; struct Flag { QString key; QCheckBox *check = nullptr; QToolButton *restore = nullptr; Qt::CheckState initial = Qt::Unchecked; bool changed = false; }; void buildInterface(); void takeSnapshot(); void fillRows(); void updateHeader(); void updateSuggestions(); void rowEdited(Row *row); void rowErased(Row *row); void restoreRow(Row *row); void restoreFlag(Flag *flag); void flagClicked(Flag *flag); void updateRowLook(Row *row); void updateLabelRow(); void changed(); void elementInfoChanged(); Row *rowForKey(const QString &key) const; QList> m_elements; QHash m_snapshot; int m_other_items = 0; QLabel *m_header = nullptr; QList m_rows; QList m_flags; bool m_updating = false; bool m_applying = false; bool m_refresh_pending = false; quint64 m_session = 0; }; #endif // MULTIELEMENTINFOWIDGET_H