swift
statusmessagesdetail.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2018 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
4 #include "statusmessagesdetail.h"
5 
6 #include "ui_statusmessagesdetail.h"
7 
10 
11 using namespace swift::misc;
12 using namespace swift::gui::menus;
13 using namespace swift::gui::views;
14 using namespace swift::gui::filters;
15 
16 namespace swift::gui::components
17 {
18  CStatusMessagesDetail::CStatusMessagesDetail(QWidget *parent) : QFrame(parent), ui(new Ui::CStatusMessagesDetail)
19  {
20  ui->setupUi(this);
21  connect(ui->tvp_StatusMessages, &CStatusMessageView::objectSelected, ui->form_StatusMessage,
23  connect(ui->tvp_StatusMessages, &CStatusMessageView::modelDataChangedDigest, this,
25  ui->tvp_StatusMessages->setAutoResizeFrequency(3);
26  ui->tvp_StatusMessages->setSorting(CStatusMessage::IndexUtcTimestamp, Qt::DescendingOrder);
27  ui->tvp_StatusMessages->setCustomMenu(new CMessageMenu(this));
28  ui->tvp_StatusMessages->menuAddItems(CStatusMessageView::MenuSave);
29  this->showFilterBar(); // default
30 
31  connect(ui->filter_LogMessages, &CStatusMessageFilterBar::changeFilter, this, [this](bool enable) {
32  emit filterChanged(enable ? ui->filter_LogMessages->createModelFilter()->getAsValueObject() : CVariant {});
33  });
34  }
35 
36  CStatusMessagesDetail::~CStatusMessagesDetail() {}
37 
38  void CStatusMessagesDetail::appendStatusMessageToList(const CStatusMessage &message)
39  {
40  if (message.isEmpty()) { return; }
41  m_pending.push_front(message); // in many cases we want to have the latest "on top"
42  m_dsDeferredUpdate.inputSignal();
43  }
44 
45  void CStatusMessagesDetail::appendStatusMessagesToList(const CStatusMessageList &messages)
46  {
47  if (messages.isEmpty()) { return; }
48  m_pending.push_front(messages);
49  m_dsDeferredUpdate.inputSignal();
50  }
51 
52  void CStatusMessagesDetail::showDetails(bool details)
53  {
54  ui->form_StatusMessage->setVisible(details);
55  ui->tvp_StatusMessages->setMode(details ? models::CStatusMessageListModel::Detailed :
56  models::CStatusMessageListModel::Simplified);
57  }
58 
59  void CStatusMessagesDetail::showFilterDialog()
60  {
61  ui->tvp_StatusMessages->addFilterDialog();
62  ui->filter_LogMessages->hide();
63 
64  connect(ui->tvp_StatusMessages->getFilterDialog(), &QDialog::accepted, [this] {
65  emit filterChanged(ui->tvp_StatusMessages->getFilterDialog()->createModelFilter()->getAsValueObject());
66  });
67  }
68 
69  void CStatusMessagesDetail::showFilterBar()
70  {
71  ui->tvp_StatusMessages->setFilterWidget(ui->filter_LogMessages);
72  ui->filter_LogMessages->show();
73  }
74 
75  void CStatusMessagesDetail::hideFilterBar() { ui->filter_LogMessages->hide(); }
76 
77  void CStatusMessagesDetail::clear()
78  {
79  ui->tvp_StatusMessages->clear();
80  ui->form_StatusMessage->clear();
81  }
82 
83  int CStatusMessagesDetail::rowCount() const { return ui->tvp_StatusMessages->rowCount(); }
84 
85  void CStatusMessagesDetail::filterUseRadioButtonDescriptiveIcons(bool oneCharacterText)
86  {
87  ui->filter_LogMessages->useRadioButtonDescriptiveIcons(oneCharacterText);
88  }
89 
90  void CStatusMessagesDetail::setSorting(const CPropertyIndex &propertyIndex, Qt::SortOrder order)
91  {
92  ui->tvp_StatusMessages->setSorting(propertyIndex, order);
93  }
94 
95  void CStatusMessagesDetail::setNoSorting() { ui->tvp_StatusMessages->setNoSorting(); }
96 
97  void CStatusMessagesDetail::deferredUpdate()
98  {
99  if (m_pending.isEmpty()) { return; }
100  CStatusMessageList newMsgs(ui->tvp_StatusMessages->container());
101  newMsgs.push_front(m_pending); // default in many cases, latest first
102  m_pending.clear();
103 
104  // cleanup outdated: do not remove every time, but when a threshold is reached
105  if (m_maxLogMessages < 0)
106  {
107  // do not restrict
108  }
109  else if (m_maxLogMessages < 100 && ui->tvp_StatusMessages->rowCount() > (m_maxLogMessages + 10))
110  {
111  newMsgs.keepLatest(m_maxLogMessages);
112  }
113  else if (ui->tvp_StatusMessages->rowCount() > (m_maxLogMessages * 1.1))
114  {
115  newMsgs.keepLatest(m_maxLogMessages);
116  }
117 
118  ui->tvp_StatusMessages->adjustOrderColumn(newMsgs);
119  ui->tvp_StatusMessages->updateContainerMaybeAsync(newMsgs);
120  }
121 
122  void CStatusMessagesDetail::CMessageMenu::customMenu(CMenuActions &menuActions)
123  {
124  CStatusMessagesDetail *messagesDetail = qobject_cast<CStatusMessagesDetail *>(this->parent());
125  Q_ASSERT_X(messagesDetail, Q_FUNC_INFO, "Missing parent");
126 
127  const bool v = messagesDetail->ui->form_StatusMessage->isVisible();
128  const QString formString(v ? "Hide log details" : "Show log details");
129  m_action =
130  menuActions.addAction(m_action, CIcons::databaseTable16(), formString, CMenuAction::pathLog(),
131  { messagesDetail->ui->form_StatusMessage, &CStatusMessageForm::toggleVisibility });
132  m_action->setCheckable(true);
133  m_action->setChecked(v);
134  }
135 } // namespace swift::gui::components
void setVariant(const swift::misc::CVariant &messageVariant)
Set message.
void modelDataChangedDigest(int count, bool withFilter)
Model data changed,.
Bunch of CMenuAction objects.
Definition: menuaction.h:384
CMenuAction addAction(const CMenuAction &menuAction)
Add menu action.
Definition: menuaction.cpp:210
bool isEmpty() const
Message empty.
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
Streamable status message, e.g.
Status messages, e.g. from Core -> GUI.
High level reusable GUI components.
Definition: aboutdialog.cpp:13
Filter to search data sets.
Views, mainly QTableView.
Free functions in swift::misc.