Loading...
Searching...
No Matches
AddressLineEdit.hpp
1#pragma once
2#include <functional>
3#include <optional>
4#include <State/MessageListSerialization.hpp>
5#include <State/Widgets/AddressValidator.hpp>
6
7#include <score/model/Skin.hpp>
8#include <score/widgets/ValidationPalette.hpp>
9
10#include <Explorer/Explorer/DeviceExplorerModel.hpp>
11
12#include <QDropEvent>
13#include <QGuiApplication>
14#include <QLineEdit>
15#include <QPalette>
16#include <QValidator>
17
18namespace Process
19{
25template <class Validator_T, class Parent_T>
26class AddressLineEditBase : public QLineEdit
27{
28public:
29 explicit AddressLineEditBase(Device::NodeBasedItemModel* model, QWidget* parent)
30 : QLineEdit{parent}
31 , m_model{model}
32 {
33 setAcceptDrops(true);
34 setMinimumHeight(24);
35 connect(this, &QLineEdit::textChanged, this, &AddressLineEditBase::updatePalette);
36 }
37
39 void setLocalCheck(std::function<std::optional<bool>(const State::Address&)> f)
40 {
41 m_local = std::move(f);
42 updatePalette(this->text());
43 }
44
45 void updatePalette(const QString& str)
46 {
47 QString s = str;
48 int i = 0;
49 auto validity = score::InputValidity::Valid;
50 if(m_validator.validate(s, i) == QValidator::State::Acceptable)
51 {
52 auto addr = State::parseAddressAccessor(s);
53 std::optional<bool> local;
54 if(addr && m_local)
55 local = m_local(addr->address);
56
57 if(local)
58 {
59 if(!*local)
60 validity = score::InputValidity::Invalid;
61 }
62 else if(m_model && addr)
63 {
64 // Look into the tree to see if the node actually exists
65 if(!Device::try_getNodeFromAddress(m_model->rootNode(), addr->address))
67 }
68 }
69 else
70 {
71 validity = score::InputValidity::Invalid;
72 }
73 score::setInputValidity(*this, validity);
74 }
75
76private:
77 void dragEnterEvent(QDragEnterEvent* ev) override
78 {
79 static_cast<Parent_T*>(parent())->dragEnterEvent(ev);
80 }
81 void dropEvent(QDropEvent* ev) override
82 {
83 static_cast<Parent_T*>(parent())->dropEvent(ev);
84 }
85
86 Validator_T m_validator;
88 std::function<std::optional<bool>(const State::Address&)> m_local;
89};
90
91template <typename Parent_T>
92class AddressLineEdit final
93 : public AddressLineEditBase<State::AddressValidator, Parent_T>
94{
95public:
96 using AddressLineEditBase<State::AddressValidator, Parent_T>::AddressLineEditBase;
97};
98
99template <typename Parent_T>
101 : public AddressLineEditBase<State::AddressAccessorValidator, Parent_T>
102{
103public:
105 State::AddressAccessorValidator, Parent_T>::AddressLineEditBase;
106};
107}
Definition NodeBasedItemModel.hpp:23
Definition AddressLineEdit.hpp:102
The AddressLineEdit class.
Definition AddressLineEdit.hpp:27
void setLocalCheck(std::function< std::optional< bool >(const State::Address &)> f)
Whether a local device address is published; nullopt for other devices.
Definition AddressLineEdit.hpp:39
Definition AddressLineEdit.hpp:94
Definition AddressValidator.hpp:28
The AddressValidator class.
Definition AddressValidator.hpp:18
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
void setInputValidity(QWidget &w, InputValidity v)
Tint a widget to flag what it holds, and keep the tint skin-aware.
Definition ValidationPalette.cpp:36
@ Valid
No tint: the widget inherits the application palette.
@ Unknown
Well-formed but does not resolve to anything.
The Address struct.
Definition Address.hpp:81