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  {
64  // void
65  }
66 
68  {
69  const QString key(distributor.getDbKey());
70  if (key.isEmpty()) { return; }
71  if (distributor != m_currentDistributor)
72  {
73  ui->le_Distributor->setText(key);
74  m_currentDistributor = distributor;
75  emit changedDistributor(distributor);
76  }
77  }
78 
79  void CDbDistributorSelectorComponent::setDistributor(const QString &distributorKeyOrAlias)
80  {
81  QString keyOrAlias(distributorKeyOrAlias.toUpper().trimmed());
82  if (m_currentDistributor.matchesKeyOrAlias(keyOrAlias)) { return; }
84  if (d.hasCompleteData()) { this->setDistributor(d); }
85  else
86  {
87  ui->lbl_Description->setText("");
88  ui->le_Distributor->setText(keyOrAlias);
89  }
90  }
91 
93  {
94  if (!sGui) { return CDistributor(); }
95  const QString distributorKeyOrAlias(ui->le_Distributor->text().trimmed().toUpper());
96  if (distributorKeyOrAlias.isEmpty()) { return CDistributor(); }
97  if (m_currentDistributor.matchesKeyOrAlias(distributorKeyOrAlias)) { return m_currentDistributor; }
98 
99  const CDistributor d(sGui->getWebDataServices()->getDistributors().findByKey(distributorKeyOrAlias));
100  if (d.hasValidDbKey())
101  {
102  // for some reason we have a new distributor here
103  // normally that should not happen
104  }
105  return d;
106  }
107 
108  void CDbDistributorSelectorComponent::setReadOnly(bool readOnly) { ui->le_Distributor->setReadOnly(readOnly); }
109 
111  {
112  ui->lbl_Description->setVisible(description);
113  }
114 
116 
118  {
119  ui->le_Distributor->clear();
120  m_currentDistributor = CDistributor();
121  }
122 
124  {
125  if (!event || !acceptDrop(event->mimeData())) { return; }
126  setBackgroundRole(QPalette::Highlight);
127  event->acceptProposedAction();
128  }
129 
131  {
132  if (!event || !acceptDrop(event->mimeData())) { return; }
133  event->acceptProposedAction();
134  }
135 
137  {
138  if (!event) { return; }
139  event->accept();
140  }
141 
143  {
144  if (!event || !acceptDrop(event->mimeData())) { return; }
145  CVariant valueVariant(toCVariant(event->mimeData()));
146  if (valueVariant.isValid())
147  {
148  if (valueVariant.canConvert<CDistributor>())
149  {
150  CDistributor distributor(valueVariant.value<CDistributor>());
151  if (!distributor.hasValidDbKey()) { return; }
152  this->setDistributor(distributor);
153  }
154  else if (valueVariant.canConvert<CDistributorList>())
155  {
156  CDistributorList distributors(valueVariant.value<CDistributorList>());
157  if (distributors.isEmpty()) { return; }
158  this->setDistributor(distributors.front());
159  }
160  }
161  }
162 
163  void CDbDistributorSelectorComponent::onDistributorsRead(CEntityFlags::Entity entity,
164  CEntityFlags::ReadState readState, int count)
165  {
166  if (!sGui || sGui->isShuttingDown() || !sGui->hasWebDataServices()) { return; }
167  if (entity.testFlag(CEntityFlags::DistributorEntity) && CEntityFlags::isFinishedReadState(readState))
168  {
169  if (count > 0)
170  {
171  const QStringList keysAndAliases(
173  QCompleter *c = new QCompleter(keysAndAliases, this);
174  c->setCaseSensitivity(Qt::CaseInsensitive);
175  c->setCompletionMode(QCompleter::PopupCompletion);
176  c->setMaxVisibleItems(10);
177  connect(c, qOverload<const QString &>(&QCompleter::activated), this,
178  &CDbDistributorSelectorComponent::onCompleterActivated);
179 
180  ui->le_Distributor->setCompleter(c);
181  m_completerDistributors.reset(c); // deletes any old completer
182  this->setReadOnly(false);
183  }
184  else
185  {
186  m_completerDistributors.reset(nullptr);
187  this->setReadOnly(true);
188  }
189  }
190  }
191 
192  void CDbDistributorSelectorComponent::onDataChanged()
193  {
194  if (!sGui || sGui->isShuttingDown() || !sGui->getWebDataServices()) { return; }
195  const QString keyOrAlias(ui->le_Distributor->text().trimmed().toUpper());
196  if (keyOrAlias.isEmpty()) { return; }
197  const CDistributor distributor(sGui->getWebDataServices()->getDistributors().findByKeyOrAlias(keyOrAlias));
198  this->setDistributor(distributor);
199  }
200 
201  void CDbDistributorSelectorComponent::onCompleterActivated(const QString &distributorKeyOrAlias)
202  {
203  this->setDistributor(distributorKeyOrAlias);
204  }
205 
206 } // 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:24
swift::misc::CVariant toCVariant(const QMimeData *mime) const
Mime data to CVariant (normally encapsulating a value object)
Definition: dropbase.cpp:43
void setAcceptedMetaTypeIds(const QList< int > &ids)
Accepted ids.
Definition: dropbase.cpp:20
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.
reference front()
Access the first element.
Definition: sequence.h:225
bool isEmpty() const
Synonym for empty.
Definition: sequence.h:285
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:169
bool isValid() const
True if this variant is valid.
Definition: variant.h:252
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:40
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:13
GUI related classes.
Free functions in swift::misc.