swift
dbdistributorselectorcomponent.cpp
1 // SPDX-FileCopyrightText: Copyright (C) 2015 swift Project Community / Contributors
2 // SPDX-License-Identifier: GPL-3.0-or-later OR LicenseRef-swift-pilot-client-1
3 
5 
6 #include <QCompleter>
7 #include <QDragEnterEvent>
8 #include <QDragLeaveEvent>
9 #include <QDragMoveEvent>
10 #include <QDropEvent>
11 #include <QLabel>
12 #include <QLineEdit>
13 #include <QMetaType>
14 #include <QPalette>
15 #include <QStringList>
16 #include <Qt>
17 #include <QtGlobal>
18 
19 #include "ui_dbdistributorselectorcomponent.h"
20 
21 #include "core/application.h"
22 #include "core/webdataservices.h"
23 #include "gui/guiapplication.h"
24 #include "gui/uppercasevalidator.h"
27 #include "misc/variant.h"
28 
29 using namespace swift::gui;
30 using namespace swift::core;
31 using namespace swift::misc;
32 using namespace swift::misc::simulation;
33 using namespace swift::misc::network;
34 
35 namespace swift::gui::components
36 {
37  CDbDistributorSelectorComponent::CDbDistributorSelectorComponent(QWidget *parent)
38  : QFrame(parent), ui(new Ui::CDbDistributorSelectorComponent)
39  {
40  Q_ASSERT_X(sGui, Q_FUNC_INFO, "Missing sGui");
41  ui->setupUi(this);
42  this->setFocusProxy(ui->le_Distributor);
43  this->setAcceptDrops(true);
44  this->setAcceptedMetaTypeIds({ qMetaTypeId<CDistributor>(), qMetaTypeId<CDistributorList>() });
45  ui->le_Distributor->setValidator(new CUpperCaseValidator(this));
46 
47  bool c = connect(ui->le_Distributor, &QLineEdit::editingFinished, this,
48  &CDbDistributorSelectorComponent::onDataChanged, Qt::QueuedConnection);
49  Q_ASSERT_X(c, Q_FUNC_INFO, "Missing connect");
50  // c = connect(ui->le_Distributor, &QLineEdit::returnPressed, this,
51  // &CDbDistributorSelectorComponent::returnPressed, Qt::QueuedConnection); Q_ASSERT_X(c, Q_FUNC_INFO, "Missing
52  // connect");
53  c = connect(sApp->getWebDataServices(), &CWebDataServices::dataRead, this,
54  &CDbDistributorSelectorComponent::onDistributorsRead, Qt::QueuedConnection);
55  Q_ASSERT_X(c, Q_FUNC_INFO, "Missing connect");
56  Q_UNUSED(c);
57 
58  this->onDistributorsRead(CEntityFlags::DistributorEntity, CEntityFlags::ReadFinished,
60  }
61 
63 
65  {
66  const QString key(distributor.getDbKey());
67  if (key.isEmpty()) { return; }
68  if (distributor != m_currentDistributor)
69  {
70  ui->le_Distributor->setText(key);
71  m_currentDistributor = distributor;
72  emit changedDistributor(distributor);
73  }
74  }
75 
76  void CDbDistributorSelectorComponent::setDistributor(const QString &distributorKeyOrAlias)
77  {
78  QString keyOrAlias(distributorKeyOrAlias.toUpper().trimmed());
79  if (m_currentDistributor.matchesKeyOrAlias(keyOrAlias)) { return; }
81  if (d.hasCompleteData()) { this->setDistributor(d); }
82  else
83  {
84  ui->lbl_Description->setText("");
85  ui->le_Distributor->setText(keyOrAlias);
86  }
87  }
88 
90  {
91  if (!sGui) { return {}; }
92  const QString distributorKeyOrAlias(ui->le_Distributor->text().trimmed().toUpper());
93  if (distributorKeyOrAlias.isEmpty()) { return {}; }
94  if (m_currentDistributor.matchesKeyOrAlias(distributorKeyOrAlias)) { return m_currentDistributor; }
95 
96  const CDistributor d(sGui->getWebDataServices()->getDistributors().findByKey(distributorKeyOrAlias));
97  if (d.hasValidDbKey())
98  {
99  // for some reason we have a new distributor here
100  // normally that should not happen
101  }
102  return d;
103  }
104 
105  void CDbDistributorSelectorComponent::setReadOnly(bool readOnly) { ui->le_Distributor->setReadOnly(readOnly); }
106 
108  {
109  ui->lbl_Description->setVisible(description);
110  }
111 
113 
115  {
116  ui->le_Distributor->clear();
117  m_currentDistributor = CDistributor();
118  }
119 
121  {
122  if (!event || !acceptDrop(event->mimeData())) { return; }
124  event->acceptProposedAction();
125  }
126 
128  {
129  if (!event || !acceptDrop(event->mimeData())) { return; }
130  event->acceptProposedAction();
131  }
132 
134  {
135  if (!event) { return; }
136  event->accept();
137  }
138 
140  {
141  if (!event || !acceptDrop(event->mimeData())) { return; }
142  CVariant valueVariant(toCVariant(event->mimeData()));
143  if (valueVariant.isValid())
144  {
145  if (valueVariant.canConvert<CDistributor>())
146  {
147  auto distributor(valueVariant.value<CDistributor>());
148  if (!distributor.hasValidDbKey()) { return; }
149  this->setDistributor(distributor);
150  }
151  else if (valueVariant.canConvert<CDistributorList>())
152  {
153  auto distributors(valueVariant.value<CDistributorList>());
154  if (distributors.isEmpty()) { return; }
155  this->setDistributor(distributors.front());
156  }
157  }
158  }
159 
160  void CDbDistributorSelectorComponent::onDistributorsRead(CEntityFlags::Entity entity,
161  CEntityFlags::ReadState readState, int count)
162  {
163  if (!sGui || sGui->isShuttingDown() || !sGui->hasWebDataServices()) { return; }
164  if (entity.testFlag(CEntityFlags::DistributorEntity) && CEntityFlags::isFinishedReadState(readState))
165  {
166  if (count > 0)
167  {
168  const QStringList keysAndAliases(
170  auto *c = new QCompleter(keysAndAliases, this);
171  c->setCaseSensitivity(Qt::CaseInsensitive);
172  c->setCompletionMode(QCompleter::PopupCompletion);
173  c->setMaxVisibleItems(10);
174  connect(c, qOverload<const QString &>(&QCompleter::activated), this,
175  &CDbDistributorSelectorComponent::onCompleterActivated);
176 
177  ui->le_Distributor->setCompleter(c);
178  m_completerDistributors.reset(c); // deletes any old completer
179  this->setReadOnly(false);
180  }
181  else
182  {
183  m_completerDistributors.reset(nullptr);
184  this->setReadOnly(true);
185  }
186  }
187  }
188 
189  void CDbDistributorSelectorComponent::onDataChanged()
190  {
191  if (!sGui || sGui->isShuttingDown() || !sGui->getWebDataServices()) { return; }
192  const QString keyOrAlias(ui->le_Distributor->text().trimmed().toUpper());
193  if (keyOrAlias.isEmpty()) { return; }
194  const CDistributor distributor(sGui->getWebDataServices()->getDistributors().findByKeyOrAlias(keyOrAlias));
195  this->setDistributor(distributor);
196  }
197 
198  void CDbDistributorSelectorComponent::onCompleterActivated(const QString &distributorKeyOrAlias)
199  {
200  this->setDistributor(distributorKeyOrAlias);
201  }
202 
203 } // namespace swift::gui::components
SWIFT_CORE_EXPORT swift::core::CApplication * sApp
Single instance of application object.
Definition: application.cpp:71
bool hasWebDataServices() const
Web data services available?
bool isShuttingDown() const
Is application shutting down?
CWebDataServices * getWebDataServices() const
Get the web data services.
int getDistributorsCount() const
Distributors count.
swift::misc::simulation::CDistributorList getDistributors() const
Distributors.
bool acceptDrop(const QMimeData *mime) const
Accept drop?
Definition: dropbase.cpp:20
swift::misc::CVariant toCVariant(const QMimeData *mime) const
Mime data to CVariant (normally encapsulating a value object)
Definition: dropbase.cpp:39
void setAcceptedMetaTypeIds(const QList< int > &ids)
Accepted ids.
Definition: dropbase.cpp:16
void changedDistributor(const swift::misc::simulation::CDistributor &distributor)
Distributor was changed.
void setDistributor(const swift::misc::simulation::CDistributor &distributor)
Current distributor.
swift::misc::simulation::CDistributor getDistributor() const
Distributor.
void withDistributorDescription(bool description)
Display distributor description.
Wrapper around QVariant which provides transparent access to CValueObject methods of the contained ob...
Definition: variant.h:66
T value() const
Return the value converted to the type T.
Definition: variant.h:166
bool isValid() const
True if this variant is valid.
Definition: variant.h:249
bool canConvert(int typeId) const
True if this variant can be converted to the type with the given metatype ID.
OBJ findByKey(KEYTYPE key, const OBJ &notFound=OBJ()) const
Object with key, notFound otherwise.
bool hasValidDbKey() const
Has valid DB key.
Definition: datastore.h:195
const QString & getDbKey() const
Get DB key.
Definition: datastore.h:180
Value object encapsulating information of software distributor.
Definition: distributor.h:33
bool matchesKeyOrAlias(const QString &keyOrAlias) const
Matches key or alias.
Definition: distributor.cpp:38
bool hasCompleteData() const
Complete data?
Value object encapsulating a list of distributors.
CDistributor findByKeyOrAlias(const QString &keyOrAlias) const
Find by id or alias.
QStringList getDbKeysAndAliases(bool sort) const
All DB keys and aliases.
SWIFT_GUI_EXPORT swift::gui::CGuiApplication * sGui
Single instance of GUI application object.
Backend services of the swift project, like dealing with the network or the simulators.
Definition: actionbind.cpp:7
High level reusable GUI components.
Definition: aboutdialog.cpp:14
GUI related classes.
Free functions in swift::misc.
void activated(const QModelIndex &index)
virtual bool event(QEvent *e) override
void editingFinished()
QMetaObject::Connection connect(const QObject *sender, PointerToMemberFunction signal, Functor functor)
void reset(T *other)
bool isEmpty() const const
QString toUpper() const const
QString trimmed() const const
CaseInsensitive
QueuedConnection
void setAcceptDrops(bool on)
void setBackgroundRole(QPalette::ColorRole role)
void setFocusProxy(QWidget *w)