Properties
Concept
The properties may be used in various use cases.
The property classes in the OTGui
library should be used to create the property structure which then may be send to the UI.
The property classes in the OTWidgets
library are used by the UI to display the corresponding inputs (e.g. PropertyInputInt
) that may be displayed in dialogs or other widgets (e.g. PropertyDialog, OnePropertyDialog).
OnePropertyDialog
The OnePropertyDialog
can be requested from any service by sending the OT_ACTION_CMD_UI_OnePropertyDialog
action to the UI.
The key difference to the PropertyDialog is that only one property will be edited by the user.
The dialog will have the Property::propertyTitle()
in a lable that is followed by the corresponding input depending on the property (e.g. LineEdit
for a PropertyString
).
Request
Provide a OTGui/OnePropertyDialogCfg
which contains one OTGui/Property
.
// Application.cpp
#include "Application.h"
void Application::foo(void) {
// Create json document
ot::JsonDocument doc;
doc.AddMember(OT_ACTION_MEMBER, ot::JsonString(OT_ACTION_CMD_UI_OnePropertyDialog, doc.GetAllocator()), doc.GetAllocator());
// Create property to edit
ot::PropertyInt* prop = new ot::PropertyInt;
prop->setPropertyName("<name>"); // Is not relevant for the OnePropertyDialog
prop->setPropertyTitle("<title>"); // Title that will be displayed to the user
prop->setRange(1, 99); // Value range for the user input
prop->setValue(2); // Inital value
// Create dialog configuration
ot::OnePropertyDialogCfg cfg(prop);
cfg.setName("MyIntegerDialog"); // Dialog name that may be used to identify the dialog (e.g. when the service wants to request different dialogs)
cfg.setTitle("MyIntegerDialogTitle"); // Title that will be displayed to the user
cfg.setFlags(ot::DialogCfg::CancelOnEqualValue); // If set and the input remained unchaned the dialog will behave as if the user pressed cancel when confirm is pressed
// Serialize
ot::JsonObject cfgObj;
cfg.addToJsonObject(cfgObj, doc.GetAllocator());
doc.AddMember(OT_ACTION_PARAM_Config, cfgObj, doc.GetAllocator());
// Add service information
this->getBasicServiceInformation().addToJsonObject(doc, doc.GetAllocator());
// or use "Application::instance()->" instead of "this" when using outside of class Application
// Send
m_uiComponent->sendMessage(true, doc);
//--- OR ---
std::string response; // Response will be empty when calling queue
if (!ot::msg::send("<sender url>", "<UI url>", ot::QUEUE, doc.toJson(), response)) {
// Error handling
}
}
Response
The UI will respond by sending the OT_ACTION_CMD_UI_OnePropertyDialogValue
action.
The action only will be send if the user confirmes the dialog (and the data has changed if the ‘DialogCfg::CancelOnEqualValue’ flag is set)
First a OT_HANDLER
to the Application
class.
// Application.h
#include "OTServiceFoundation/ApplicationBase.h"
class Application : ot::ApplicationBase {
OT_HANDLER(handleOnePropertyDialogValue, Application, OT_ACTION_CMD_UI_OnePropertyDialogValue, ot::SECURE_MESSAGE_TYPES);
};
Then process the response from the UI.
// Application.cpp
#include "Application.h"
std::string Application::handleOnePropertyDialogValue(ot::JsonDocument& _document) {
// Get the dialog name that was set when requesting the dialog (DialogCfg::setName())
std::string dialogName = ot::json::getString(_document, OT_ACTION_PARAM_ObjectName);
// Check the dialog name
if (dialogName == "MyIntegerDialog") {
// Get the value, in this example the value type is integer
int value = ot::json::getInt(_document, OT_ACTION_PARAM_Value);
m_uiComponent->displayMessage("\"MyIntegerDialog\" resulted with value: " + std::to_string(value));
}
return std::string();
}
PropertyDialog
x