/*
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 PLCLINKWIDGET_H
#define PLCLINKWIDGET_H
#include "abstractelementpropertieseditorwidget.h"
#include
#include
#include
class QTreeWidgetItem;
class QTreeWidget;
class QLineEdit;
class QPushButton;
class QLabel;
class Element;
/**
@brief The PlcLinkWidget class
Provides a dedicated widget for linking a PLC-Slave to a PLC-Master IO entry.
Displays all PLC-Masters as expandable items, each showing their IO entries.
Each IO entry can only be linked to one slave. Already-linked entries are
shown as struck-through and greyed out.
*/
class PlcLinkWidget : public AbstractElementPropertiesEditorWidget
{
Q_OBJECT
public:
explicit PlcLinkWidget(Element *elmt, QWidget *parent = nullptr);
~PlcLinkWidget() override = default;
void setElement(Element *element) override;
void apply() override;
QUndoCommand *associatedUndo() const override;
QString title() const override;
public slots:
void updateUi() override;
private:
void buildPlcTree();
void hideButtons();
void showButtons();
private slots:
void on_m_search_field_textEdited(const QString &text);
void on_m_tree_widget_customContextMenuRequested(const QPoint &pos);
void on_m_unlink_pb_clicked();
void on_m_show_this_pb_clicked();
private:
QLabel *m_label{nullptr};
QPushButton *m_unlink_pb{nullptr};
QPushButton *m_show_this_pb{nullptr};
QLineEdit *m_search_field{nullptr};
QTreeWidget *m_tree_widget{nullptr};
QLabel *m_hidden_masters_label{nullptr};
// Maps IO child items to (master, io_index)
struct PlcIoEntry {
QPointer master;
int ioIndex = -1;
};
QHash m_io_entry_hash;
Element *m_element_to_link = nullptr;
int m_pending_io_index = -1;
};
#endif // PLCLINKWIDGET_H