LibrePCB Developers Documentation
rulechecklistwidget.h
Go to the documentation of this file.
1 /*
2  * LibrePCB - Professional EDA for everyone!
3  * Copyright (C) 2013 LibrePCB Developers, see AUTHORS.md for contributors.
4  * https://librepcb.org/
5  *
6  * This program is free software: you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation, either version 3 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program. If not, see <http://www.gnu.org/licenses/>.
18  */
19 
20 #ifndef LIBREPCB_EDITOR_RULECHECKLISTWIDGET_H
21 #define LIBREPCB_EDITOR_RULECHECKLISTWIDGET_H
22 
23 /*******************************************************************************
24  * Includes
25  ******************************************************************************/
27 #include <optional/tl/optional.hpp>
28 
29 #include <QtCore>
30 #include <QtWidgets>
31 
32 #include <memory>
33 
34 /*******************************************************************************
35  * Namespace / Forward Declarations
36  ******************************************************************************/
37 namespace librepcb {
38 namespace editor {
39 
40 /*******************************************************************************
41  * Interface IF_RuleCheckHandler
42  ******************************************************************************/
43 
45 public:
46  virtual bool ruleCheckFixAvailable(
47  std::shared_ptr<const RuleCheckMessage> msg) noexcept = 0;
48  virtual void ruleCheckFixRequested(
49  std::shared_ptr<const RuleCheckMessage> msg) noexcept = 0;
50  virtual void ruleCheckDescriptionRequested(
51  std::shared_ptr<const RuleCheckMessage> msg) noexcept = 0;
52  virtual void ruleCheckApproveRequested(
53  std::shared_ptr<const RuleCheckMessage> msg, bool approve) noexcept = 0;
54  virtual void ruleCheckMessageSelected(
55  std::shared_ptr<const RuleCheckMessage> msg) noexcept = 0;
56  virtual void ruleCheckMessageDoubleClicked(
57  std::shared_ptr<const RuleCheckMessage> msg) noexcept = 0;
58 
59 protected:
60  IF_RuleCheckHandler() noexcept {}
62  virtual ~IF_RuleCheckHandler() noexcept {}
63 };
64 
65 /*******************************************************************************
66  * Class RuleCheckListItemWidget
67  ******************************************************************************/
68 
72 class RuleCheckListItemWidget final : public QWidget {
73  Q_OBJECT
74 
75 public:
76  // Constructors / Destructor
77  explicit RuleCheckListItemWidget(std::shared_ptr<const RuleCheckMessage> msg,
78  IF_RuleCheckHandler& handler, bool approved,
79  QWidget* parent = nullptr) noexcept
80  : QWidget(parent),
81  mMessage(msg),
82  mHandler(handler),
83  mIconLabel(new QLabel(this)) {
84  if (!msg) return;
85  QHBoxLayout* layout = new QHBoxLayout(this);
86  layout->setContentsMargins(0, 0, 0, 0);
87  layout->setSpacing(0);
88 
89  // severity icon
90  mIconLabel->setScaledContents(true);
91  mIconLabel->setPixmap(msg->getSeverityIcon().pixmap(
92  48, approved ? QIcon::Disabled : QIcon::Normal));
93  layout->addWidget(mIconLabel.data());
94  layout->addSpacing(3);
95 
96  // message
97  QLabel* lblMsg = new QLabel(msg->getMessage(), this);
98  lblMsg->setToolTip(msg->getMessage());
99  if (approved) {
100  QFont font = lblMsg->font();
101  font.setItalic(true);
102  font.setStrikeOut(true);
103  lblMsg->setFont(font);
104  }
105  layout->addWidget(lblMsg);
106  layout->addSpacing(3);
107  layout->setStretch(1, 100);
108 
109  // "fix" button
110  if (mHandler.ruleCheckFixAvailable(mMessage)) {
111  QToolButton* btnFix = new QToolButton(this);
112  btnFix->setText(tr("Fix"));
113  btnFix->setToolTip(tr("Fix Problem"));
114  btnFix->setStatusTip(
115  tr("Automatically apply a modification to fix this message"));
116  connect(btnFix, &QToolButton::clicked, this,
117  [this]() { mHandler.ruleCheckFixRequested(mMessage); });
118  layout->addWidget(btnFix);
119  }
120 
121  // "approve" button
122  QToolButton* btnApprove = new QToolButton(this);
123  btnApprove->setText("✔");
124  btnApprove->setToolTip(tr("Approve/Disapprove"));
125  btnApprove->setStatusTip(tr("Mark/unmark this message as approved"));
126  btnApprove->setCheckable(true);
127  btnApprove->setChecked(approved);
128  connect(btnApprove, &QToolButton::clicked, this, [this, msg](bool checked) {
129  mHandler.ruleCheckApproveRequested(mMessage, checked);
130  });
131  layout->addWidget(btnApprove);
132 
133  // "details" button
134  QToolButton* btnDetails = new QToolButton(this);
135  btnDetails->setText("?");
136  btnDetails->setToolTip(tr("Details"));
137  btnDetails->setStatusTip(tr("Show more information about this message"));
138  connect(btnDetails, &QToolButton::clicked, this,
139  [this]() { mHandler.ruleCheckDescriptionRequested(mMessage); });
140  layout->addWidget(btnDetails);
141  }
142  RuleCheckListItemWidget(const RuleCheckListItemWidget& other) = delete;
144 
145  // Operator Overloadings
146  RuleCheckListItemWidget& operator=(const RuleCheckListItemWidget& rhs) =
147  delete;
148 
149 private: // Methods
150  void resizeEvent(QResizeEvent* event) override {
151  QWidget::resizeEvent(event);
152  mIconLabel->setFixedWidth(mIconLabel->height());
153  }
154 
155 private: // Data
156  std::shared_ptr<const RuleCheckMessage> mMessage;
158  QScopedPointer<QLabel> mIconLabel;
159 };
160 
161 /*******************************************************************************
162  * Class RuleCheckListWidget
163  ******************************************************************************/
164 
168 class RuleCheckListWidget final : public QWidget, private IF_RuleCheckHandler {
169  Q_OBJECT
170 
171 public:
172  // Constructors / Destructor
173  explicit RuleCheckListWidget(QWidget* parent = nullptr) noexcept;
174  RuleCheckListWidget(const RuleCheckListWidget& other) = delete;
175  ~RuleCheckListWidget() noexcept;
176 
177  // Getters
178  const tl::optional<int>& getUnapprovedMessageCount() const noexcept {
179  return mUnapprovedMessageCount;
180  }
181 
182  // Setters
183  void setReadOnly(bool readOnly) noexcept;
184  void setHandler(IF_RuleCheckHandler* handler) noexcept;
185  void setMessages(const tl::optional<RuleCheckMessageList>& messages) noexcept;
186  void setApprovals(const QSet<SExpression>& approvals) noexcept;
187 
188  // Operator Overloadings
189  RuleCheckListWidget& operator=(const RuleCheckListWidget& rhs) = delete;
190 
191 private: // Methods
192  void updateList() noexcept;
193  void currentItemChanged(QListWidgetItem* current,
194  QListWidgetItem* previous) noexcept;
195  void itemDoubleClicked(QListWidgetItem* item) noexcept;
197  std::shared_ptr<const RuleCheckMessage> msg) noexcept override;
199  std::shared_ptr<const RuleCheckMessage> msg) noexcept override;
201  std::shared_ptr<const RuleCheckMessage> msg) noexcept override;
202  void ruleCheckApproveRequested(std::shared_ptr<const RuleCheckMessage> msg,
203  bool approve) noexcept override;
205  std::shared_ptr<const RuleCheckMessage> msg) noexcept override;
207  std::shared_ptr<const RuleCheckMessage> msg) noexcept override;
208 
209 private: // Data
210  QScopedPointer<QListWidget> mListWidget;
211  bool mReadOnly;
213  tl::optional<RuleCheckMessageList> mMessages;
215  QSet<SExpression> mApprovals;
216  tl::optional<int> mUnapprovedMessageCount;
217 };
218 
219 /*******************************************************************************
220  * End of File
221  ******************************************************************************/
222 
223 } // namespace editor
224 } // namespace librepcb
225 
226 #endif
void resizeEvent(QResizeEvent *event) override
Definition: rulechecklistwidget.h:150
std::shared_ptr< const RuleCheckMessage > mMessage
Definition: rulechecklistwidget.h:156
RuleCheckMessageList mDisplayedMessages
Definition: rulechecklistwidget.h:214
~RuleCheckListItemWidget() noexcept
Definition: rulechecklistwidget.h:143
const tl::optional< int > & getUnapprovedMessageCount() const noexcept
Definition: rulechecklistwidget.h:178
bool mReadOnly
Definition: rulechecklistwidget.h:211
QScopedPointer< QLabel > mIconLabel
Definition: rulechecklistwidget.h:158
IF_RuleCheckHandler & mHandler
Definition: rulechecklistwidget.h:157
Definition: occmodel.cpp:76
The RuleCheckListItemWidget class.
Definition: rulechecklistwidget.h:72
tl::optional< RuleCheckMessageList > mMessages
Definition: rulechecklistwidget.h:213
QVector< std::shared_ptr< const RuleCheckMessage > > RuleCheckMessageList
Definition: rulecheckmessage.h:104
Definition: rulechecklistwidget.h:44
virtual ~IF_RuleCheckHandler() noexcept
Definition: rulechecklistwidget.h:62
virtual void ruleCheckMessageSelected(std::shared_ptr< const RuleCheckMessage > msg) noexcept=0
IF_RuleCheckHandler * mHandler
Definition: rulechecklistwidget.h:212
virtual void ruleCheckApproveRequested(std::shared_ptr< const RuleCheckMessage > msg, bool approve) noexcept=0
tl::optional< int > mUnapprovedMessageCount
Definition: rulechecklistwidget.h:216
QSet< SExpression > mApprovals
Definition: rulechecklistwidget.h:215
RuleCheckListItemWidget(std::shared_ptr< const RuleCheckMessage > msg, IF_RuleCheckHandler &handler, bool approved, QWidget *parent=nullptr) noexcept
Definition: rulechecklistwidget.h:77
IF_RuleCheckHandler() noexcept
Definition: rulechecklistwidget.h:60
virtual bool ruleCheckFixAvailable(std::shared_ptr< const RuleCheckMessage > msg) noexcept=0
virtual void ruleCheckMessageDoubleClicked(std::shared_ptr< const RuleCheckMessage > msg) noexcept=0
The RuleCheckListWidget class.
Definition: rulechecklistwidget.h:168
QScopedPointer< QListWidget > mListWidget
Definition: rulechecklistwidget.h:210
virtual void ruleCheckDescriptionRequested(std::shared_ptr< const RuleCheckMessage > msg) noexcept=0
virtual void ruleCheckFixRequested(std::shared_ptr< const RuleCheckMessage > msg) noexcept=0
IF_RuleCheckHandler(const IF_RuleCheckHandler &) noexcept
Definition: rulechecklistwidget.h:61