实现削峰套利策略的编辑页面

This commit is contained in:
lixiaoyuan
2025-08-26 18:36:25 +08:00
parent 7fe51ea362
commit 8f6c83147b
37 changed files with 1506 additions and 729 deletions

View File

@@ -132,7 +132,7 @@ int PvApp::image(PARAM* p, int parent, int x, int y, int w, int h, const char* f
return id;
}
int PvApp::combox(PARAM* p, int parent, int x, int y, int w, int h, const std::vector<std::string>& vecItems)
int PvApp::combox(PARAM* p, int parent, int x, int y, int w, int h, const std::vector<std::string>& vecItems, int index /*= 0*/)
{
int id = PvApp::pvid(p);
pvQComboBox(p, id, parent, 0, 0);
@@ -141,8 +141,9 @@ int PvApp::combox(PARAM* p, int parent, int x, int y, int w, int h, const std::v
for (int i=0; i<vecItems.size(); ++i)
{
pvInsertItem(p, id, i, NULL, vecItems[i].c_str());
if (index == i) pvSetCurrentItem(p, id, i);
}
PvApp::image(p, id, w-h, 0, h, h, "downFill.png");
PvApp::image(p, id, w-18, (h-9)*0.5, 14, 9, "downFill.png");
return id;
}
@@ -158,17 +159,44 @@ int PvApp::lineEdit(PARAM* p, int parent, int x, int y, int w, int h, std::strin
int PvApp::textEdit(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss)
{
static std::string qssTextEdit =
static std::string style =
"QTextEdit { background-color: rgb(12, 39, 58); border: 1px solid rgb(18, 251, 255); border-radius: 5px; color:white; font: bold 15px;}"
"QTextEdit:disabled { border: 1px solid gray; color:rgb(150,150,150);}";
int id = PvApp::pvid(p);
pvQMultiLineEdit(p, id, parent, true, 10);
pvSetGeometry(p, id, x, y, w, h);
pvSetStyleSheet(p, id, qssTextEdit.c_str());
pvSetStyleSheet(p, id, style.c_str());
if (!text.empty()) { pvSetText(p, id, text.c_str()); }
return id;
}
int PvApp::radioButton(PARAM* p, int parent, int x, int y, int w, int h, std::string text)
{
static std::string style =
"QRadioButton { background-color: transparent; color:white; font: bold 14px \"微软雅黑\";}"
"QRadioButton:disabled { border: none; color:rgb(150,150,150);}";
int id = PvApp::pvid(p);
pvQRadioButton(p, id, parent);
pvSetGeometry(p, id, x, y, w, h);
if (!text.empty()) { pvSetText(p, id, text.c_str()); }
pvSetStyleSheet(p, id, style.c_str());
return id;
}
int PvApp::timeEdit(PARAM* p, int parent, int x, int y, int w, int h)
{
static std::string style =
"QTimeEdit { background-color: rgb(17, 55, 73); border: 1px solid rgb(0, 185, 208); color:white; font: normal 14px \"微软雅黑\";}"
"QTimeEdit:disabled { border: none; color:rgb(150,150,150);}";
int id = PvApp::pvid(p);
pvQTimeEdit(p, id, parent);
pvSetGeometry(p, id, x, y, w, h);
pvSetStyleSheet(p, id, style.c_str());
return id;
}
PvRect::PvRect()
{
}

View File

@@ -99,11 +99,15 @@ public:
static int image(PARAM* p, int parent, int x, int y, int w, int h, const char* filename);
static int combox(PARAM* p, int parent, int x, int y, int w, int h, const std::vector<std::string>& vecItems);
static int combox(PARAM* p, int parent, int x, int y, int w, int h, const std::vector<std::string>& vecItems, int index=0);
static int lineEdit(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss = "");
static int textEdit(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss = "");
static int radioButton(PARAM* p, int parent, int x, int y, int w, int h, std::string text);
static int timeEdit(PARAM* p, int parent, int x, int y, int w, int h);
};
///////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -159,7 +159,7 @@ Fields PvPopWidget::getChangedData()
{
auto& key = it->second->key;
auto& val = it->second->val;
if (primaryKeys.hasKey(key) || val != dataOrigin.value(key))
if (primaryKeys.contains(key) || val != dataOrigin.value(key))
{
fields.set(key, val);
}
@@ -174,7 +174,7 @@ void PvPopWidget::checkChangedData(Fields& fields)
{
auto& key = it->first;
auto& val = it->second;
if (!primaryKeys.hasKey(key) && val == dataOrigin.value(key))
if (!primaryKeys.contains(key) && val == dataOrigin.value(key))
{
mapItems.erase(it);
}

View File

@@ -111,15 +111,11 @@ namespace qss
"QComboBox:disabled { color:rgb(150,150,150);}";
const std::string LINEEDIT =
"QLineEdit { background-color: rgb(12, 39, 58); border: 1px solid rgb(18, 251, 255); border-radius: 5px; color:white; font: bold 15px;}"
"QLineEdit { background-color: rgb(12, 39, 58); border: 1px solid rgb(18, 251, 255); border-radius: 5px; color:white; font: bold 14px;}"
"QLineEdit:disabled { border: 1px solid gray; color:rgb(150,150,150);}";
const std::string STYLE_TITLE_ICON =
"padding-top: 0px;"
"background-color: qlineargradient(x1:0, y1:1, x2:0, y2:0, stop:0 rgba(0, 71, 105, 255),stop:1 rgba(0, 71, 105, 0));"
@@ -142,7 +138,7 @@ namespace qss
// 表头标签
const std::string QSS_TABLE_HEAD =
qss::label(15, "", "rgb(18, 93, 113)", "1px solid rgb(120, 120, 120); border-style:inset solid");
qss::label(14, "", "rgb(18, 93, 113)", "1px solid rgb(120, 120, 120); border-style:inset solid");
//"background-color: rgb(18, 93, 113); color:rgb(255, 255, 255); font:bold 16px;"
//"border-width:1 1 1 1px; border-style:inset solid; border-color:rgb(120, 120, 120);";

View File

@@ -1,6 +1,7 @@
#include "PvTable.h"
#include "PvStyle.h"
#include "pv/PvApp.h"
#include "pv/PvPopWidget.h"
static const string STYLE_BKG =
"border-width:1 1 1 1px; border-style:outset solid; border-color:rgba(180,180,180,255);"
@@ -208,7 +209,7 @@ void PvTable::mappingData(Fields& fields)
for (int i=0; i< vecHead_.size(); ++i)
{
auto& head = vecHead_[i];
if (fields.hasKey(head.id))
if (fields.contains(head.id))
{
auto& val = fields.value(head.id);
val = head.getMapping(val);
@@ -417,16 +418,91 @@ void PvPagination::setCallback(std::function<void(int index)> func)
callback = func;
}
PvPageTable::PvPageTable(PARAM* p, int parent, int x, int y, int w, int rows, PvTable::Options& opts)
//: PvWidget(p, parent, PvRect(x, y, w, opts.item_height* rows + (opts.show_header ? (opts.header_height) : 0)))
: PvObject(p)
{
int h = opts.row_height* rows + (opts.show_header ? (opts.head_height) : 0);
int pvid_ = PvApp::widget(p, parent, x, y, w, h);
table_ = make_shared<PvTable>(p, pvid_, 0, 0, w, rows, opts);
}
shared_ptr<PvTable> PvPageTable::getTable()
///////////////////////////////////////////////////////////////////////////////////////////////////
// === PageTable ===
PageTable::PageTable(PARAM* p) : PvMask(p)
{
return table_;
}
table = std::make_shared<PvTable>(p, 0, 20, 210, 1880, pageSize, option);
table->setOperateCallback([=](int row, int col, std::string text) { this->onOperate(row, col, text); });
pagination = std::make_shared<PvPagination>(p, 0, 20, 780, 20);
pagination->setCallback([=](int index)
{
pageIndex = index;
this->updateDataFromDB();
});
}
std::shared_ptr<PvPopWidget> PageTable::addPop(int w, int h, int w0, std::string name, std::vector<std::string> primaryKeys)
{
std::shared_ptr<PvPopWidget> pop = std::make_shared<PvPopWidget>(p, w, h, name);
pop->lineValWidth = w0;
pop->setPrimaryKeys(primaryKeys);
pop->setCallbackConfirm([=]()
{
auto fields = pop->getData();
std::string err = this->onValidation(pop, fields);
pop->setMsg(err);
if (err.empty())
{
XLOGD() << "POP get: data=" << fields.toStr();
if (pop->status == POP_OPER_EDIT) { pop->checkChangedData(fields); }
XLOGD() << "POP get: data=" << fields.toStr();
table->mappingData(fields);
XLOGD() << "POP get: data=" << fields.toStr();
err = this->onPopConfirm(pop, fields);
pop->setMsg(err);
if (err.empty())
{
this->hidePop(0);
this->updateDataFromDB();
};
}
});
pop->show(0);
vecPop.push_back(pop);
return pop;
}
void PageTable::showPop(int index, std::string oper, Fields& fields)
{
XLOGD() << "POP set: data=" << fields.toStr();
table->mappingData(fields);
XLOGD() << "POP set: data=" << fields.toStr();
if (index < vecPop.size())
{
auto& pop = vecPop[index];
pop->show(true);
pop->setStatus(oper);
pop->setData(fields);
pop->setMsg("");
}
}
void PageTable::hidePop(int index)
{
if (index < vecPop.size())
{
vecPop[index]->show(false);
}
}
void PageTable::updateDataFromDB()
{
std::vector<Fields> result;
PageInfo pageInfo;
pageInfo.size = pageSize;
pageInfo.index = pageIndex;
this->onQueryTable(pageInfo, result);
for (int i = 0; i<table->rows(); ++i)
{
if (i<result.size())
{
auto& fields = result[i];
table->setRowData(i, result[i]);
}
else
{
table->setRowVisible(i, false);
}
}
pagination->setPage(pageInfo.index, pageInfo.total/pageInfo.size + int(pageInfo.total%pageInfo.size != 0));
}

View File

@@ -158,16 +158,34 @@ private:
};
class PvPageTable :public PvObject
///////////////////////////////////////////////////////////////////////////////////////////////////
// === PageTable ===
class PvPopWidget;
class PageTable : public PvMask
{
public:
PvPageTable(PARAM* p, int parent, int x, int y, int w, int rows, PvTable::Options& opts);
PageTable(PARAM* p);
shared_ptr<PvTable> getTable();
void setPage(int pageIndex, int pageSize, int count) {}
private:
shared_ptr<PvTable> table_ = nullptr;
shared_ptr<PvPagination> page_ctrl_ = nullptr;
std::shared_ptr<PvPopWidget> addPop(int w, int h, int w0, std::string name, std::vector<std::string> primaryKeys);
void showPop(int index, std::string optr, Fields& fields);
void hidePop(int index);
void updateDataFromDB();
virtual void onQueryTable(PageInfo& pageInfo, std::vector<Fields>& result) {}
virtual void onOperate(int row, int col, std::string oper) {};
virtual std::string onValidation(std::shared_ptr<PvPopWidget> pop, Fields& fields) { return ""; };
virtual std::string onPopConfirm(std::shared_ptr<PvPopWidget> pop, Fields& fields) { return ""; };
int pageSize {15};
int pageIndex {0};
PvTable::Options option;
std::shared_ptr<PvTable> table;
std::shared_ptr<PvPagination> pagination;
std::vector<std::shared_ptr<PvPopWidget>> vecPop;
};
#endif // ! _PvTable_H_

View File

@@ -5,6 +5,20 @@
#include "pv/PvTable.h"
#include "pv/PvChart.h"
#include "pv/PvPopWidget.h"
#include "pv/pages/PanelPolicy.h"
void TestPage(PARAM* p)
{
auto& appdata = Application::data();
auto pagination = new PvPagination(p, 0, 600, 160, 20);
pagination->setPage(5, 10);
int id = PvApp::label(p, 0, 0, 0, 1920, 800, "", qss::label(14, "", "rgb(15, 50, 68)"));
new PanelPolicyPeak(p, id, 0, 0, 1920, 1080);
}
static int CreatePanel(PARAM* p, int parent, int x, int y, int w, int h, std::string title)
{
@@ -304,8 +318,10 @@ int MaskPageHome::initUI(EPvCode pvcode)
this->updateUI();
auto pagination = new PvPagination(p, 0, 600, 160, 20);
pagination->setPage(5, 10);
TestPage(p);
return 0;
}

View File

@@ -1,6 +1,6 @@
#include "MaskPageRunning.h"
#include "app/Application.h"
#include "app/AppData.h"
static int CreateParamLabel(PARAM* p, int parent, int x, int y, std::string k, std::string v)
{
@@ -119,10 +119,10 @@ int MaskPageRunning::initUI(EPvCode pvcode)
}
PvApp::label(p, 0, 320, 110, 80, 30, "运行模式", "color:white; font: bold 16px;");
PvApp::combox(p, 0, 400, 110, 200, 30, {"最优经济化运行模式", "最优经济化运行模式", "自定义"});
PvApp::combox(p, 0, 400, 110, 200, 30, Application::data().getWorkModes());
PvApp::label(p, 0, 670, 110, 80, 30, "策略名称", "color:white; font: bold 16px;");
PvApp::combox(p, 0, 750, 110, 200, 30, {"峰谷套利策略", "需求响应策略", "自发自用上网策略"});
PvApp::combox(p, 0, 750, 110, 200, 30, Application::data().getPolicyNames());
int x = 20, y = 160, w = 200, h = 180;
// 储能设备

View File

@@ -6,7 +6,7 @@
#include "pv/PvPopWidget.h"
#include "database/Dao.h"
#include "app/Application.h"
#include "PageSysmgrPop.h"
#include "PageSysmgr.h"
static void createPvTable(PARAM* p)
{

View File

@@ -1,4 +1,4 @@
#include "PageSysmgrPop.h"
#include "PageSysmgr.h"
#include "app/Application.h"
@@ -6,94 +6,6 @@
#include "database/DataModelDef.h"
#include "common/Snowflake.h"
///////////////////////////////////////////////////////////////////////////////////////////////////
// === PageTable ===
PageTable::PageTable(PARAM* p) : PvMask(p)
{
table = std::make_shared<PvTable>(p, 0, 20, 210, 1880, pageSize, option);
table->setOperateCallback([=](int row, int col, std::string text) { this->onOperate(row, col, text); });
pagination = std::make_shared<PvPagination>(p, 0, 20, 780, 20);
pagination->setCallback([=](int index)
{
pageIndex = index;
this->updateDataFromDB();
});
}
std::shared_ptr<PvPopWidget> PageTable::addPop(int w, int h, int w0, std::string name, std::vector<std::string> primaryKeys)
{
std::shared_ptr<PvPopWidget> pop = std::make_shared<PvPopWidget>(p, w, h, name);
pop->lineValWidth = w0;
pop->setPrimaryKeys(primaryKeys);
pop->setCallbackConfirm([=]()
{
auto fields = pop->getData();
std::string err = this->onValidation(pop, fields);
pop->setMsg(err);
if (err.empty())
{
XLOGD() << "POP get: data=" << fields.toStr();
if (pop->status == POP_OPER_EDIT) { pop->checkChangedData(fields); }
XLOGD() << "POP get: data=" << fields.toStr();
table->mappingData(fields);
XLOGD() << "POP get: data=" << fields.toStr();
err = this->onPopConfirm(pop, fields);
pop->setMsg(err);
if (err.empty())
{
this->hidePop(0);
this->updateDataFromDB();
};
}
});
pop->show(0);
vecPop.push_back(pop);
return pop;
}
void PageTable::showPop(int index, std::string oper, Fields& fields)
{
XLOGD() << "POP set: data=" << fields.toStr();
table->mappingData(fields);
XLOGD() << "POP set: data=" << fields.toStr();
if (index < vecPop.size())
{
auto& pop = vecPop[index];
pop->show(true);
pop->setStatus(oper);
pop->setData(fields);
pop->setMsg("");
}
}
void PageTable::hidePop(int index)
{
if (index < vecPop.size())
{
vecPop[index]->show(false);
}
}
void PageTable::updateDataFromDB()
{
std::vector<Fields> result;
PageInfo pageInfo;
pageInfo.size = pageSize;
pageInfo.index = pageIndex;
this->onQueryTable(pageInfo, result);
for (int i = 0; i<table->rows(); ++i)
{
if (i<result.size())
{
auto& fields = result[i];
table->setRowData(i, result[i]);
}
else
{
table->setRowVisible(i, false);
}
}
pagination->setPage(pageInfo.index, pageInfo.total/pageInfo.size + int(pageInfo.total%pageInfo.size != 0));
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// === PageUser ===
@@ -215,6 +127,7 @@ std::string PageRole::onPopConfirm(std::shared_ptr<PvPopWidget> pop, Fields& fie
return "";
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// === PagePermission ===
PagePermission::PagePermission(PARAM* p, EPvCode pvcode) : PageTable(p)
@@ -326,13 +239,14 @@ std::string PageStation::onPopConfirm(std::shared_ptr<PvPopWidget> pop, Fields&
}
return "";
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// === PageDevice ===
PageDevice::PageDevice(PARAM* p, EPvCode pvcode) : PageTable(p)
{
auto& appdata = Application::data();
table->addHead(DMDevice::DEVICE_ID, "设备编号", 120, {});
table->addHead(DMDevice::TYPE_ID, "设备类型", 120, appdata.mapping.deviceType);
table->addHead(DMDevice::TYPE, "设备类型", 120, appdata.mapping.deviceType);
table->addHead(DMDevice::NAME, "设备名称", 180, {});
table->addHead(DMDevice::CODE, "设备编码", 160, {});
table->addHead(DMDevice::MODEL, "设备型号", 160, {});
@@ -348,7 +262,7 @@ PageDevice::PageDevice(PARAM* p, EPvCode pvcode) : PageTable(p)
int x = 50, y = 80, w = 350, h = 60;
auto pop = this->addPop(700, 520, 180, "设备信息", {DMDevice::DEVICE_ID});
pop->addParamLineEdit(DMDevice::DEVICE_ID, "设备编号", x, y, false);
pop->addParamCombox(DMDevice::TYPE_ID, "类型", x+w, y, appdata.getDeviceTypes());
pop->addParamCombox(DMDevice::TYPE, "类型", x+w, y, appdata.getDeviceTypeNames());
pop->addParamLineEdit(DMDevice::NAME, "设备名称", x, y += h);
pop->addParamLineEdit(DMDevice::CODE, "设备编码", x+w, y);
pop->addParamLineEdit(DMDevice::MODEL, "设备型号", x, y += h);
@@ -394,8 +308,11 @@ std::string PageDevice::onPopConfirm(std::shared_ptr<PvPopWidget> pop, Fields& f
}
return "";
}
///////////////////////////////////////////////////////////////////////////////////////////////////
// === PagePolicy ===
PagePolicy::PagePolicy(PARAM* p, EPvCode pvcode) : PageTable(p)
{
auto& appdata = Application::data();
@@ -410,9 +327,18 @@ PagePolicy::PagePolicy(PARAM* p, EPvCode pvcode) : PageTable(p)
int btnNew = PvApp::button(p, PV_ID_MAIN, 20, 160, 80, 35, POP_OPER_NEW);
PvApp::bind(p, PvEvent::BUTTON_EVENT, btnNew, [=](std::string) { this->onOperate(-1, -1, POP_OPER_NEW); });
int x = 80, y = 80, h = 60;
auto pop = this->addPop(500, 600, 180, "策略信息", {DMPolicy::POLICY_ID});
pop->addParamLineEdit(DMPolicy::POLICY_ID, "编号", x, y, false);
int x = 50, y = 80, w = 280;
auto pop = this->addPop(1620, 800, 180, "策略信息", {DMPolicy::POLICY_ID});
//pop->addParamLineEdit(DMPolicy::POLICY_ID, "编号", x, y, false);
{
pop->addParamLineEdit("1", "策略名称", x, y);
pop->addParamCombox("2", "策略类型", x+w, y, {"峰谷套利"});
pop->addParamLineEdit("3", "尖峰电价", x, y += 50);
pop->addParamLineEdit("4", "高峰电价", x+w, y);
pop->addParamLineEdit("5", "平段电价", x+w*2, y);
pop->addParamLineEdit("6", "低谷电价", x+w*3, y);
}
}
void PagePolicy::onQueryTable(PageInfo& pageInfo, std::vector<Fields>& result)
{
@@ -423,12 +349,18 @@ void PagePolicy::onOperate(int row, int col, std::string oper)
if (oper == POP_OPER_NEW)
{
Fields fields;
fields.set(DMUser::USER_ID, Snowflake::instance().getIdStr());
this->showPop(0, oper, fields);
}
else if (oper == POP_OPER_EDIT)
{
this->showPop(0, oper, table->getRowData(row));
table->getRowData(row);
auto& appdata = Application::data();
Fields fields;
fields.set("3", appdata.electPriceSuperPeak);
fields.set("4", appdata.electPricePeak);
fields.set("5", appdata.electPriceShoulder);
fields.set("6", appdata.electPriceOffPeak);
this->showPop(0, oper, fields);
}
}
std::string PagePolicy::onValidation(std::shared_ptr<PvPopWidget> pop, Fields& fields)
@@ -438,6 +370,8 @@ std::string PagePolicy::onValidation(std::shared_ptr<PvPopWidget> pop, Fields& f
std::string PagePolicy::onPopConfirm(std::shared_ptr<PvPopWidget> pop, Fields& fields)
{
return "";
}
///////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -3,34 +3,6 @@
#include "pv/PvTable.h"
#include "pv/PvPopWidget.h"
///////////////////////////////////////////////////////////////////////////////////////////////////
// === PageTable ===
class PageTable : public PvMask
{
public:
PageTable(PARAM* p);
void setPage(int pageIndex, int pageSize, int count) {}
std::shared_ptr<PvPopWidget> addPop(int w, int h, int w0, std::string name, std::vector<std::string> primaryKeys);
void showPop(int index, std::string optr, Fields& fields);
void hidePop(int index);
void updateDataFromDB();
virtual void onQueryTable(PageInfo& pageInfo, std::vector<Fields>& result) {}
virtual void onOperate(int row, int col, std::string oper) {};
virtual std::string onValidation(std::shared_ptr<PvPopWidget> pop, Fields& fields) { return ""; };
virtual std::string onPopConfirm(std::shared_ptr<PvPopWidget> pop, Fields& fields) { return ""; };
int pageSize {15};
int pageIndex {0};
PvTable::Options option;
std::shared_ptr<PvTable> table;
std::shared_ptr<PvPagination> pagination;
std::vector<std::shared_ptr<PvPopWidget>> vecPop;
};
///////////////////////////////////////////////////////////////////////////////////////////////////
// === PageUser ===
@@ -108,6 +80,8 @@ public:
virtual void onOperate(int row, int col, std::string oper) override;
virtual std::string onValidation(std::shared_ptr<PvPopWidget> pop, Fields& fields) override;
virtual std::string onPopConfirm(std::shared_ptr<PvPopWidget> pop, Fields& fields) override;
};
///////////////////////////////////////////////////////////////////////////////////////////////////

View File

@@ -0,0 +1,366 @@
#include "PanelPolicy.h"
#include "app/Application.h"
#include "app/AppData.h"
#include "common/JsonN.h"
const std::string QSS_COMBOX_1 =
"QComboBox {border: 1px solid rgb(18, 251, 255); background-color: rgb(255, 89, 0); border-radius: 3px; color: rgb(30,30,30); font: bold 14px;}"
"QComboBox QAbstractItemView { border: 1px solid gray; background-color: rgba(8, 54, 91); border-radius: 5px; color:white;}"
"QComboBox::drop-down { border-radius: 5px; width: 30px; }"
"QComboBox:disabled { color:rgb(150,150,150);}";
const std::string QSS_COMBOX_2 =
"QComboBox {border: 1px solid rgb(18, 251, 255); background-color: rgb(255, 255, 0); border-radius: 3px; color: rgb(30,30,30); font: bold 14px;}"
"QComboBox QAbstractItemView { border: 1px solid gray; background-color: rgba(8, 54, 91); border-radius: 5px; color:white;}"
"QComboBox::drop-down { border-radius: 5px; width: 30px; }"
"QComboBox:disabled { color:rgb(150,150,150);}";
const std::string QSS_COMBOX_3 =
"QComboBox {border: 1px solid rgb(18, 251, 255); background-color: rgb(121, 191, 226); border-radius: 3px; color: rgb(30,30,30); font: bold 14px;}"
"QComboBox QAbstractItemView { border: 1px solid gray; background-color: rgba(8, 54, 91); border-radius: 5px; color:white;}"
"QComboBox::drop-down { border-radius: 5px; width: 30px; }"
"QComboBox:disabled { color:rgb(150,150,150);}";
const std::string QSS_COMBOX_4 =
"QComboBox {border: 1px solid rgb(18, 251, 255); background-color: rgb(0, 255, 58); border-radius: 3px; color: rgb(30,30,30); font: bold 14px;}"
"QComboBox QAbstractItemView { border: 1px solid gray; background-color: rgba(8, 54, 91); border-radius: 5px; color:white;}"
"QComboBox::drop-down { border-radius: 5px; width: 30px; }"
"QComboBox:disabled { color:rgb(150,150,150);}";
static std::string GetPeriodQss(int v)
{
if (v == 1) { return QSS_COMBOX_1; }
else if (v == 2) { return QSS_COMBOX_2; }
else if (v == 3) { return QSS_COMBOX_3; }
else if (v == 4) { return QSS_COMBOX_4; }
else { return QSS_COMBOX_1; }
}
static std::string GetPeriodQss(std::string text)
{
if (text == "尖峰") { return QSS_COMBOX_1; }
else if (text == "高峰") { return QSS_COMBOX_2; }
else if (text == "平段") { return QSS_COMBOX_3; }
else if (text == "低谷") { return QSS_COMBOX_4; }
else { return QSS_COMBOX_1; }
}
static int GetPeriod(std::string text)
{
if (text == "尖峰") { return 1; }
else if (text == "高峰") { return 2; }
else if (text == "平段") { return 3; }
else if (text == "低谷") { return 4; }
else { return 3; }
}
PanelPolicyPeak::PanelPolicyPeak(PARAM* p, int parent, int x, int y, int w, int h) : PvObject(p)
{
data.vecPeriods.resize(12, std::vector<int>(24, 3));
ui.parent = parent;
ui.widget = PvApp::widget(p, parent, x, y, w, h);
auto& appdata = Application::data();
std::vector<std::string> vecPeriods = {"尖峰", "高峰", "平段", "低谷"};
ui.vecComboxs.resize(12, std::vector<int>(24, PV_ID_NUL));
{
int parent = ui.widget;
int x = 10, y = 180, w = 64, h = 30;
for (int row = 0; row<=12; row++)
{
for (int col = 0; col<=24; ++col)
{
std::string text;
if (row == 0)
{
text = (col == 0) ? "月份" : std::to_string(col-1) + "-" + std::to_string(col) + "";
}
else
{
text = (col == 0) ? std::to_string(row) : "";
}
if (row == 0 || col == 0)
{
std::string qssLabel = (row==0) ? qss::label(14, "", "rgb(19, 93, 114)") : "";
int label = PvApp::label(p, parent, x+w*col, y+h*row, w, h, text, qssLabel);
pvSetAlignment(p, label, AlignCenter);
}
else
{
int periodVal = data.vecPeriods[row-1][col-1];
int combox = PvApp::combox(p, parent, x+w*col, y+h*row+3, w-3, 24, vecPeriods, periodVal);
pvSetStyleSheet(p, combox, GetPeriodQss(periodVal).c_str());
ui.vecComboxs[row-1][col-1] = combox;
PvApp::bind(p, PvEvent::TEXT_EVENT, combox, [=](std::string text) {
pvSetStyleSheet(p, combox, GetPeriodQss(text).c_str());
data.vecPeriods[row-1][col-1] = GetPeriod(text);
});
}
}
}
const int H = 24;
int labelPolicy = PvApp::label(p, parent, 20, 600, 300, H, "充电策略");
ui.radioPolicy1 = PvApp::radioButton(p, labelPolicy, 80, 0, 80, H, "一充一放");
ui.radioPolicy2 = PvApp::radioButton(p, labelPolicy, 170, 0, 80, H, "两充两放");
ui.label1 = PvApp::label(p, parent, 10, 640, 610, 90, "第一次充放电过程", qss::label(14, "", "", "1px solid rgb(49, 130, 141)"));
pvSetAlignment(p, ui.label1, AlignLeft | AlignTop);
{
int y0 = 70;
int labelChargeT = PvApp::label(p, ui.label1, 10, 30, 300, H, "充电时间");
ui.attr1TimeCharge0 = PvApp::timeEdit(p, labelChargeT, y0, 0, 60, H);
PvApp::label(p, labelChargeT, 150, 0, 10, H, "--");
ui.attr1TimeCharge1 = PvApp::timeEdit(p, labelChargeT, 170, 0, 60, H);
int labelDischargeT = PvApp::label(p, ui.label1, 320, 30, 300, H, "放电时间");
ui.attr1TimeDischarge0 = PvApp::timeEdit(p, labelDischargeT, y0 = 70, 0, 60, H);
PvApp::label(p, labelDischargeT, y0+=70, 0, 10, H, "--");
ui.attr1TimeDischarge1 = PvApp::timeEdit(p, labelDischargeT, y0+=20, 0, 60, H);
int labelPowerIn = PvApp::label(p, ui.label1, 10, 60, 300, H, "充电功率");
ui.attr1RadioPowerInAuto = PvApp::radioButton(p, labelPowerIn, y0 = 70, 0, 60, H, "自动");
ui.attr1RadioPowerIn = PvApp::radioButton(p, labelPowerIn, y0 += 60, 0, 64, H, "自定义");
ui.arrt1LabelPowerIn = PvApp::lineEdit(p, labelPowerIn, y0 += 70, 0, 80, H, "");
int labelPowerOut = PvApp::label(p, ui.label1, 320, 60, 300, H, "放电功率");
ui.attr1RadioPowerOutAuto = PvApp::radioButton(p, labelPowerOut, y0 = 70, 0, 60, H, "自动");
ui.attr1RadioPowerOut = PvApp::radioButton(p, labelPowerOut, y0 += 60, 0, 64, H, "自定义");
ui.arrt1LabelPowerOut = PvApp::lineEdit(p, labelPowerOut, y0 += 70, 0, 80, H, "");
}
ui.label2 = PvApp::label(p, parent, 630, 640, 610, 90, "第二次充放电过程", qss::label(14, "", "", "1px solid rgb(49, 130, 141)"));
pvSetAlignment(p, ui.label2, AlignLeft | AlignTop);
{
int y0 = 70;
int labelChargeT = PvApp::label(p, ui.label2, 10, 30, 300, H, "充电时间");
XLOGD() << "labelChargeT=" << labelChargeT;
ui.attr2TimeCharge0 = PvApp::timeEdit(p, labelChargeT, y0, 0, 60, H);
PvApp::label(p, labelChargeT, 150, 0, 10, H, "--");
ui.attr2TimeCharge1 = PvApp::timeEdit(p, labelChargeT, 170, 0, 60, H);
int labelDischargeT = PvApp::label(p, ui.label2, 320, 30, 300, H, "放电时间");
ui.attr2TimeDischarge0 = PvApp::timeEdit(p, labelDischargeT, y0 = 70, 0, 60, H);
PvApp::label(p, labelDischargeT, y0 += 70, 0, 10, H, "--");
ui.attr2TimeDischarge1 = PvApp::timeEdit(p, labelDischargeT, y0 += 20, 0, 60, H);
int labelPowerIn = PvApp::label(p, ui.label2, 10, 60, 300, H, "充电功率");
ui.attr2RadioPowerInAuto = PvApp::radioButton(p, labelPowerIn, y0 = 70, 0, 60, H, "自动");
ui.attr2RadioPowerIn = PvApp::radioButton(p, labelPowerIn, y0 += 60, 0, 64, H, "自定义");
ui.arrt2LabelPowerIn = PvApp::lineEdit(p, labelPowerIn, y0 += 70, 0, 80, H, "");
int labelPowerOut = PvApp::label(p, ui.label2, 320, 60, 300, H, "放电功率");
ui.attr2RadioPowerOutAuto = PvApp::radioButton(p, labelPowerOut, y0 = 70, 0, 60, H, "自动");
ui.attr2RadioPowerOut = PvApp::radioButton(p, labelPowerOut, y0 += 60, 0, 64, H, "自定义");
ui.arrt2LabelPowerOut = PvApp::lineEdit(p, labelPowerOut, y0 += 70, 0, 80, H, "");
}
PvApp::bind(p, PvEvent::RADIOBUTTON_EVENT, ui.radioPolicy1, [=](std::string s) {
this->data.times = 1;
pvHide(p, ui.label2);
//setTimeText(ui.attr2TimeCharge0, "");
//setTimeText(ui.attr2TimeCharge1, "");
//setTimeText(ui.attr2TimeDischarge0, "");
//setTimeText(ui.attr2TimeDischarge1, "");
//pvSetChecked(p, ui.attr2RadioPowerInAuto, 1);
//pvSetChecked(p, ui.attr2RadioPowerOutAuto, 1);
//pvSetText(p, ui.arrt2LabelPowerOut, "");
//data.attr2.chargePower = data.attr2.dischargePower = 0.0;
//data.attr2.chargeTimeStart = data.attr2.chargeTimeEnd = data.attr2.dischargeTimeStart = data.attr2.dischargeTimeEnd = "";
});
PvApp::bind(p, PvEvent::RADIOBUTTON_EVENT, ui.radioPolicy2, [=](std::string s) {
this->data.times = 2;
pvShow(p, ui.label2);
});
PvApp::bind(p, PvEvent::TEXT_EVENT, ui.attr1TimeCharge0, [=](std::string s) {
data.attr1.chargeTimeStart = s.substr(0, 8);
});
PvApp::bind(p, PvEvent::TEXT_EVENT, ui.attr1TimeCharge1, [=](std::string s) {
data.attr1.chargeTimeEnd = s.substr(0, 8);
});
PvApp::bind(p, PvEvent::TEXT_EVENT, ui.attr1TimeDischarge0, [=](std::string s) {
data.attr1.dischargeTimeStart = s.substr(0, 8);
});
PvApp::bind(p, PvEvent::TEXT_EVENT, ui.attr1TimeDischarge1, [=](std::string s) {
data.attr1.dischargeTimeEnd = s.substr(0, 8);
});
PvApp::bind(p, PvEvent::TEXT_EVENT, ui.attr2TimeCharge0, [=](std::string s) {
data.attr2.chargeTimeStart = s.substr(0, 8);
});
PvApp::bind(p, PvEvent::TEXT_EVENT, ui.attr2TimeCharge1, [=](std::string s) {
data.attr2.chargeTimeEnd = s.substr(0, 8);
});
PvApp::bind(p, PvEvent::TEXT_EVENT, ui.attr2TimeDischarge0, [=](std::string s) {
data.attr2.dischargeTimeStart = s.substr(0, 8);
});
PvApp::bind(p, PvEvent::TEXT_EVENT, ui.attr2TimeDischarge1, [=](std::string s) {
data.attr2.dischargeTimeEnd = s.substr(0, 8);
});
{
int btn = PvApp::button(p, ui.widget, 10, 750, 100, 30, "DUMP");
PvApp::bind(p, PvEvent::BUTTON_EVENT, btn, [=](std::string) {
XLOGD() << dumpAttr();
});
}
{
int btn = PvApp::button(p, ui.widget, 110, 750, 100, 30, "PARSE1");
PvApp::bind(p, PvEvent::BUTTON_EVENT, btn, [=](std::string) {
std::string s = R"({"cycle":[{"charge_end":"","charge_power":0.0,"charge_start":"","discharge_end":"","discharge_power":0.0,"discharge_start":""}],
"period":[[1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]],
"times":1})";
parseAttr(s);
});
}
{
int btn = PvApp::button(p, ui.widget, 210, 750, 100, 30, "PARSE2");
PvApp::bind(p, PvEvent::BUTTON_EVENT, btn, [=](std::string) {
std::string s = R"({"cycle":[{"charge_end":"09:00:00","charge_power":0.0,"charge_start":"00:00:00","discharge_end":"","discharge_power":0.0,"discharge_start":""}],
"period":[[1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[1,1,1,1,1,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3],[3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3,3]],
"times":2})";
parseAttr(s);
});
}
}
}
void PanelPolicyPeak::updateUI()
{
}
void PanelPolicyPeak::setTimeText(int id, std::string s)
{
int hour {0}, minute {0}, second {0};
sscanf_s(s.c_str(), "%d:%d:%d", &hour, &minute, &second);
pvSetTime(p, id, hour, minute, second);
}
void PanelPolicyPeak::parseAttr(std::string str)
{
NJsonNode jsonroot;
bool ret = NJson::parse(str, jsonroot);
if (!ret)
{
return;
}
NJson::read(jsonroot, "times", data.times);
// 更新UI (充电策略)
if (data.times == 2)
{
pvSetChecked(p, ui.radioPolicy2, 1);
pvShow(p, ui.label2);
}
else
{
pvSetChecked(p, ui.radioPolicy1, 1);
pvHide(p, ui.label2);
}
std::vector<std::vector<int>> vecTmp;
NJson::read<std::vector<std::vector<int>>>(jsonroot, "period", vecTmp);
for (int row = 0; row < data.vecPeriods.size(); ++row)
{
auto& vecRows = data.vecPeriods[row];
for (int col = 0; col < vecRows.size(); ++col)
{
auto& periodVal = vecRows[col];
int tmpVal {};
if (row < vecTmp.size())
{
tmpVal = (col < vecTmp[row].size() ? vecTmp[row][col] : 3);
}
else
{
tmpVal = 3;
}
if (periodVal != tmpVal)
{
periodVal = tmpVal;
// 更新UI (时段下拉列表)
auto combox = ui.vecComboxs[row][col];
pvSetCurrentItem(p, combox, periodVal);
pvSetStyleSheet(p, combox, GetPeriodQss(periodVal).c_str());
}
}
}
if (jsonroot.contains("cycle"))
{
auto& jsonCycle = jsonroot["cycle"];
if (jsonCycle.is_array())
{
auto size = jsonCycle.size();
if (size >= 1)
{
data.attr1.chargeTimeStart = jsonCycle[0]["charge_start"];
data.attr1.chargeTimeEnd = jsonCycle[0]["charge_end"];
data.attr1.chargePower = jsonCycle[0]["charge_power"];
data.attr1.dischargeTimeStart = jsonCycle[0]["discharge_start"];
data.attr1.dischargeTimeEnd = jsonCycle[0]["discharge_end"];
data.attr1.dischargePower = jsonCycle[0]["discharge_power"];
// 更新UI (一放一充)
setTimeText(ui.attr1TimeCharge0, data.attr1.chargeTimeStart);
setTimeText(ui.attr1TimeCharge1, data.attr1.chargeTimeEnd);
//setTimeText(ui.attr1TimeCharge1, data.attr1.chargeTimeEnd);
setTimeText(ui.attr1TimeDischarge0, data.attr1.dischargeTimeStart);
setTimeText(ui.attr1TimeDischarge1, data.attr1.dischargeTimeEnd);
//setTimeText(ui.attr1TimeCharge1, data.attr1.chargeTimeEnd);
}
if (size >= 2)
{
data.attr2.chargeTimeStart = jsonCycle[1]["charge_start"];
data.attr2.chargeTimeEnd = jsonCycle[1]["charge_end"];
data.attr2.chargePower = jsonCycle[1]["charge_power"];
data.attr2.dischargeTimeStart = jsonCycle[1]["discharge_start"];
data.attr2.dischargeTimeEnd = jsonCycle[1]["discharge_end"];
data.attr2.dischargePower = jsonCycle[1]["discharge_power"];
// 更新UI (两放两充)
setTimeText(ui.attr2TimeCharge0, data.attr2.chargeTimeStart);
setTimeText(ui.attr2TimeCharge1, data.attr2.chargeTimeEnd);
//setTimeText(ui.attr2TimeCharge1, data.attr2.chargeTimeEnd);
setTimeText(ui.attr2TimeDischarge0, data.attr2.dischargeTimeStart);
setTimeText(ui.attr2TimeDischarge1, data.attr2.dischargeTimeEnd);
//setTimeText(ui.attr2TimeCharge1, data.attr2.chargeTimeEnd);
}
}
}
// 更新UI
}
std::string PanelPolicyPeak::dumpAttr()
{
NJsonNode jsonroot;
jsonroot["period"] = data.vecPeriods;
jsonroot["times"] = data.times;
NJsonNode nodeCycle = NJsonNode::array();
NJsonNode nodeAttr1;
nodeAttr1["charge_start"] = data.attr1.chargeTimeStart;
nodeAttr1["charge_end"] = data.attr1.chargeTimeEnd;
nodeAttr1["charge_power"] = data.attr1.chargePower;
nodeAttr1["discharge_start"] = data.attr1.dischargeTimeStart;
nodeAttr1["discharge_end"] = data.attr1.dischargeTimeEnd;
nodeAttr1["discharge_power"] = data.attr1.dischargePower;
nodeCycle.push_back(nodeAttr1);
if (data.times > 1)
{
NJsonNode nodeAttr2;
nodeAttr2["charge_start"] = data.attr2.chargeTimeStart;
nodeAttr2["charge_end"] = data.attr2.chargeTimeEnd;
nodeAttr2["charge_power"] = data.attr2.chargePower;
nodeAttr2["discharge_start"] = data.attr2.dischargeTimeStart;
nodeAttr2["discharge_end"] = data.attr2.dischargeTimeEnd;
nodeAttr2["discharge_power"] = data.attr2.dischargePower;
nodeCycle.push_back(nodeAttr2);
}
jsonroot["cycle"] = nodeCycle;
return jsonroot.dump();
}

View File

@@ -0,0 +1,75 @@
#pragma once
#include "pv/PvApp.h"
// 峰谷套利策、需求响应、自发自用
class PanelPolicyPeak : public PvObject
{
public:
PanelPolicyPeak(PARAM* p, int parent, int x, int y, int w, int h);
void updateUI();
void setTimeText(int id, std::string s);
void parseAttr(std::string str);
std::string dumpAttr();
struct {
int parent {};
int widget {PV_ID_NUL};
int label1 {PV_ID_NUL};
int label2 {PV_ID_NUL};
int radioPolicy1 {PV_ID_NUL};
int radioPolicy2 {PV_ID_NUL};
int attr1TimeCharge0 {PV_ID_NUL};
int attr1TimeCharge1 {PV_ID_NUL};
int attr1TimeDischarge0 {PV_ID_NUL};
int attr1TimeDischarge1 {PV_ID_NUL};
int attr1RadioPowerInAuto {PV_ID_NUL};
int attr1RadioPowerIn {PV_ID_NUL};
int arrt1LabelPowerIn {PV_ID_NUL};
int attr1RadioPowerOutAuto {PV_ID_NUL};
int attr1RadioPowerOut {PV_ID_NUL};
int arrt1LabelPowerOut {PV_ID_NUL};
int attr2TimeCharge0 {PV_ID_NUL};
int attr2TimeCharge1 {PV_ID_NUL};
int attr2TimeDischarge0 {PV_ID_NUL};
int attr2TimeDischarge1 {PV_ID_NUL};
int attr2RadioPowerInAuto {PV_ID_NUL};
int attr2RadioPowerIn {PV_ID_NUL};
int arrt2LabelPowerIn {PV_ID_NUL};
int attr2RadioPowerOutAuto {PV_ID_NUL};
int attr2RadioPowerOut {PV_ID_NUL};
int arrt2LabelPowerOut {PV_ID_NUL};
std::vector<std::vector<int>> vecComboxs {};
} ui;
struct ChargeAttr
{
std::string chargeTimeStart;
std::string chargeTimeEnd;
double chargePower {0.0};
std::string dischargeTimeStart;
std::string dischargeTimeEnd;
double dischargePower {0.0};
};
struct {
int times {1};
ChargeAttr attr1;
ChargeAttr attr2;
std::vector<std::vector<int>> vecPeriods;
} data;
};

View File

@@ -45,7 +45,7 @@ int pvMain(PARAM* p)
mask = std::make_shared<MaskMain>(p, pvcode);
// 超过设定数量值的控件将不会显示
pvStartDefinition(p, 1024);
pvStartDefinition(p, 2048);
if (mask)
{
pvSetFont(p, PV_ID_MAIN, "微软雅黑", 12, 1, 0, 0, 0);
@@ -75,30 +75,30 @@ int pvMain(PARAM* p)
pvcode = mask->onEventNull(pvid);
} break;
case BUTTON_EVENT: {
pvcode = mask->onEventButton(pvid); std::cout << "EVENT: BUTTON\n";
pvcode = mask->onEventButton(pvid); std::cout << "EVENT: (" << pvid << ")BUTTON\n";
} break;
case TEXT_EVENT: {} break;
case SLIDER_EVENT: {} break;
case CHECKBOX_EVENT: {} break;
case RADIOBUTTON_EVENT: {} break;
case GL_IDLE_EVENT: {} break;
case GL_PAINT_EVENT: {} break;
case GL_INITIALIZE_EVENT: {} break;
case GL_RESIZE_EVENT: {} break;
case TAB_EVENT: {} break;
case TABLE_CLICKED_EVENT: {} break;
case TABLE_TEXT_EVENT: {} break;
case SELECTION_EVENT: {} break;
case CLIPBOARD_EVENT: {} break;
case BUTTON_PRESSED_EVENT: {} break;
case BUTTON_RELEASED_EVENT: {} break;
case RIGHT_MOUSE_EVENT: {} break;
case KEYBOARD_EVENT: {} break;
case PLOT_MOUSE_MOVED_EVENT: {} break;
case PLOT_MOUSE_PRESSED_EVENT: {} break;
case PLOT_MOUSE_RELEASED_EVENT: {} break;
case USER_EVENT: {} break;
case MOUSE_OVER_EVENT: {} break;
case TEXT_EVENT: { std::cout << "EVENT: (" << pvid << ")TEXT_EVENT\n"; } break;
case SLIDER_EVENT: { std::cout << "EVENT: (" << pvid << ")SLIDER_EVENT\n"; } break;
case CHECKBOX_EVENT: { std::cout << "EVENT: (" << pvid << ")CHECKBOX_EVENT\n"; } break;
case RADIOBUTTON_EVENT: { std::cout << "EVENT: (" << pvid << ")RADIOBUTTON_EVENT\n"; } break;
case GL_IDLE_EVENT: { std::cout << "EVENT: (" << pvid << ")GL_IDLE_EVENT\n"; } break;
case GL_PAINT_EVENT: { std::cout << "EVENT: (" << pvid << ")GL_PAINT_EVENT\n"; } break;
case GL_INITIALIZE_EVENT: { std::cout << "EVENT: (" << pvid << ")GL_INITIALIZE_EVENT\n"; } break;
case GL_RESIZE_EVENT: { std::cout << "EVENT: (" << pvid << ")GL_RESIZE_EVENT\n"; } break;
case TAB_EVENT: { std::cout << "EVENT: (" << pvid << ")TAB_EVENT\n"; } break;
case TABLE_CLICKED_EVENT: { std::cout << "EVENT: (" << pvid << ")TABLE_CLICKED_EVENT\n"; } break;
case TABLE_TEXT_EVENT: { std::cout << "EVENT: (" << pvid << ")TABLE_TEXT_EVENT\n"; } break;
case SELECTION_EVENT: { std::cout << "EVENT: (" << pvid << ")SELECTION_EVENT\n"; } break;
case CLIPBOARD_EVENT: { std::cout << "EVENT: (" << pvid << ")CLIPBOARD_EVENT\n"; } break;
case BUTTON_PRESSED_EVENT: { std::cout << "EVENT: (" << pvid << ")BUTTON_PRESSED_EVENT\n"; } break;
case BUTTON_RELEASED_EVENT: { std::cout << "EVENT: (" << pvid << ")BUTTON_RELEASED_EVENT\n"; } break;
case RIGHT_MOUSE_EVENT: { std::cout << "EVENT: (" << pvid << ")RIGHT_MOUSE_EVENT\n"; } break;
case KEYBOARD_EVENT: { std::cout << "EVENT: (" << pvid << ")KEYBOARD_EVENT\n"; } break;
case PLOT_MOUSE_MOVED_EVENT: { std::cout << "EVENT: (" << pvid << ")PLOT_MOUSE_MOVED_EVENT\n"; } break;
case PLOT_MOUSE_PRESSED_EVENT: { std::cout << "EVENT: (" << pvid << ")PLOT_MOUSE_PRESSED_EVENT\n"; } break;
case PLOT_MOUSE_RELEASED_EVENT: { std::cout << "EVENT: (" << pvid << ")PLOT_MOUSE_RELEASED_EVENT\n"; } break;
case USER_EVENT: { std::cout << "EVENT: (" << pvid << ")USER_EVENT\n"; } break;
case MOUSE_OVER_EVENT: { /*std::cout << "EVENT: (" << pvid << ")MOUSE_OVER_EVENT\n";*/ } break;
default: {} break;
}
}