From dda905cda0ac13535e1ecadf91a03e6b91992424 Mon Sep 17 00:00:00 2001 From: lixiaoyuan Date: Thu, 28 Aug 2025 18:42:37 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E7=8E=B0=E7=AD=96=E7=95=A5=E9=85=8D?= =?UTF-8?q?=E7=BD=AE=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bin/Release/assets/pv/bkgHead.png | Bin 0 -> 161644 bytes bin/Release/assets/pv/play1.png | Bin 0 -> 2326 bytes bin/Release/assets/pv/pv.bkg.main2.png | Bin 38982 -> 39252 bytes src/app/AppData.cpp | 72 ++- src/app/AppData.h | 32 +- src/app/Device.cpp | 4 +- src/app/Device.h | 16 +- src/app/Station.cpp | 52 +- src/app/Station.h | 18 +- src/common/Fields.cpp | 21 +- src/common/Fields.h | 7 +- src/common/JsonN.h | 9 + src/common/Logger.cpp | 2 +- src/common/Logger.h | 2 +- src/database/Dao.cpp | 62 ++- src/database/Dao.h | 3 + src/database/DaoEntity.cpp | 42 +- src/database/DaoEntity.h | 2 +- src/database/DataModelDef.h | 1 + src/database/MysqlClient.cpp | 4 +- src/database/MysqlClient.h | 2 +- src/main.cpp | 20 + .../{Communicator.cpp => CommEntity.cpp} | 4 +- src/protocol/{Communicator.h => CommEntity.h} | 9 +- src/protocol/TcpEntity.h | 2 +- src/pv/MaskMain.cpp | 5 +- src/pv/PvApp.cpp | 159 +++--- src/pv/PvApp.h | 100 ++-- src/pv/PvChart.cpp | 4 +- src/pv/PvChart.h | 2 +- src/pv/PvPopWidget.cpp | 45 +- src/pv/PvPopWidget.h | 13 +- src/pv/PvStyle.cpp | 3 +- src/pv/PvTable.cpp | 269 +++------- src/pv/PvTable.h | 70 +-- src/pv/PvUser.cpp | 7 + src/pv/PvUser.h | 2 + src/pv/pages/MaskPageHome.cpp | 15 +- src/pv/pages/MaskPageRunning.cpp | 268 +++++++--- src/pv/pages/MaskPageRunning.h | 34 +- src/pv/pages/PageSysmgr.cpp | 172 +++++-- src/pv/pages/PageSysmgr.h | 9 +- src/pv/pages/PanelPolicy.cpp | 485 +++++++++++------- src/pv/pages/PanelPolicy.h | 58 ++- src/pv/pvmain.cpp | 56 +- src/widgets/uihelper.cpp | 8 +- src/widgets/uihelper.h | 4 +- 47 files changed, 1311 insertions(+), 863 deletions(-) create mode 100644 bin/Release/assets/pv/bkgHead.png create mode 100644 bin/Release/assets/pv/play1.png rename src/protocol/{Communicator.cpp => CommEntity.cpp} (84%) rename src/protocol/{Communicator.h => CommEntity.h} (86%) diff --git a/bin/Release/assets/pv/bkgHead.png b/bin/Release/assets/pv/bkgHead.png new file mode 100644 index 0000000000000000000000000000000000000000..2d130fd5d1203966505c8e505b25cbab6524576d GIT binary patch literal 161644 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

39ycP`x{9=^)x3phiCN8!#HsZ6GoEi|}~j+{NPS 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

xUC7pnsp5k50_~?tj`~N$8urj~#0;VWMHlfp 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 literal 0 HcmV?d00001 diff --git a/bin/Release/assets/pv/play1.png b/bin/Release/assets/pv/play1.png new file mode 100644 index 0000000000000000000000000000000000000000..051428c2531f4641be7709611d5554b6db541d5d GIT binary patch literal 2326 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 literal 38982 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 z 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 f|3A}%A7!2~U;9(DMDefWorkMode::WORK_MODE_ID); std::string name = fields.value(DMDefWorkMode::NAME); - this->mapping.workMode.push_back({workModeId, name}); - str += ("工作模式: {" + workModeId + ":" + name + "},"); + this->mapping.workMode.push_back({std::to_string(workModeId), name}); + this->mapWorkMode[workModeId] = name; + str += ("工作模式: {" + std::to_string(workModeId)+":" + name + "},"); } XLOGD() << str; } @@ -63,10 +64,11 @@ void AppData::initFromDB() DAO::queryPolicyTypeDef(dao, result); for (auto& fields: result) { - std::string policyTypeId = fields.value(DMDefPolicyType::POLICY_TYPE_ID); + int policyTypeId = fields.get(DMDefPolicyType::POLICY_TYPE_ID); std::string name = fields.value(DMDefWorkMode::NAME); - this->mapping.workMode.push_back({policyTypeId, name}); - str += ("策略类型: {" + policyTypeId + ":" + name + "},"); + this->mapping.policyType.push_back({std::to_string(policyTypeId), name}); + this->mapPolicyType[policyTypeId] = name; + str += ("策略类型: {" + std::to_string(policyTypeId) + ":" + name + "},"); } XLOGD() << str; } @@ -78,7 +80,9 @@ void AppData::initFromDB() auto item = std::make_shared(); item->typeId = fields.get(DMDefDeviceType::DEVICE_TYPE_ID); item->name = fields.value(DMDefDeviceType::NAME); - item->attrs = fields.value(DMDefDeviceType::ATTRS); + item->group = fields.value(DMDefDeviceType::GROUP); + item->attr = fields.value(DMDefDeviceType::ATTRS); + item->fieldsAttr.parseJson(item->attr); mapDeviceType[item->typeId] = item; mapping.deviceType.push_back({std::to_string(item->typeId), item->name}); str += ("设备类型: {" + std::to_string(item->typeId) + ":" + item->name + "},"); @@ -106,12 +110,11 @@ void AppData::initFromDB() DAO::queryStationList(dao, result); for (auto& fields: result) { - int stationId = fields.get(DMStation::STATION_ID); - auto station = std::make_shared(stationId); - station->name = fields.value(DMStation::NAME); - station->energyCapacity = fields.get(DMStation::CAPACITY); - this->mapStation[stationId] = station; - str += ("场站: {" + std::to_string(stationId) + ":" + station->name + "},"); + auto station = std::make_shared(); + station->setFields(fields); + this->mapStation[station->id] = station; + mapping.stationName.push_back({std::to_string(station->id), station->name}); + str += ("场站: {" + std::to_string(station->id) + ":" + station->name + "},"); } XLOGD() << str; } @@ -126,6 +129,8 @@ void AppData::initFromDB() if (station) { auto device = Device::create(fields); + auto deviceTypeDef = this->getDeviceTypeDef(device->type); + device->group = deviceTypeDef->group; station->addDevice(deviceId, device); } else @@ -247,9 +252,24 @@ std::shared_ptr AppData::getDevice(int stationId, int deviceId) return nullptr; } -std::unordered_map>& AppData::getDeviceTypeDef() +std::string AppData::getDeviceNameById(int typeId) { - return mapDeviceType; + auto iter = mapDeviceType.find(typeId); + if (iter != mapDeviceType.end()) + { + return iter->second->name; + } + return ""; +} + +std::shared_ptr AppData::getDeviceTypeDef(int typeId) +{ + auto iter = mapDeviceType.find(typeId); + if (iter != mapDeviceType.end()) + { + return iter->second; + } + return nullptr; } void AppData::loadStatData() @@ -261,8 +281,18 @@ void AppData::initUser() { auto dao = DaoEntity::create(""); std::vector result; +} - +int AppData::getWorkModeIdByName(std::string name) +{ + for (auto iter = mapWorkMode.begin(); iter!=mapWorkMode.end(); ++iter) + { + if (iter->second == name) + { + return iter->first; + } + } + return 0; } std::vector AppData::getRoleNames() @@ -331,6 +361,16 @@ std::vector AppData::getPolicyNames() return vec; } +int AppData::getPolicyTypeId(std::string name) +{ + for (auto iter = mapPolicyType.begin(); iter != mapPolicyType.end(); ++iter) + { + if (iter->second == name) { return iter->first; } + } + return 0; +} + + std::vector AppData::getElectPreiodVals(int month) { if (month > 0 && month-1 < vecElectPeriods.size()) diff --git a/src/app/AppData.h b/src/app/AppData.h index 163bf98..23066a1 100644 --- a/src/app/AppData.h +++ b/src/app/AppData.h @@ -5,6 +5,7 @@ #include #include #include +#include "common/Fields.h" class Station; class Device; @@ -16,7 +17,9 @@ struct DeviceType { int typeId {}; std::string name; - std::string attrs; + std::string group; + std::string attr; + Fields fieldsAttr; }; struct Role @@ -47,20 +50,27 @@ public: void init(); void initFromDB(); - std::shared_ptr getStation(int stationId); - std::shared_ptr getStationByName(std::string name); - - std::shared_ptr getDevice(int stationId, int deviceId); - - // 获取设备类型定义 - std::unordered_map>& getDeviceTypeDef(); // 读取统计数据: 今日统计数据,累计统计数据 void loadStatData(); void initUser(); + + std::shared_ptr getStation(int stationId); + + std::shared_ptr getStationByName(std::string name); + + std::shared_ptr getDevice(int stationId, int deviceId); + + std::string getDeviceNameById(int typeId); + + // 获取设备类型定义 + std::shared_ptr getDeviceTypeDef(int typeId); + + int getWorkModeIdByName(std::string name); + /////////////////////////////////////////////////////////////////////////////////////////////// // 获取角色名称列表 std::vector getRoleNames(); @@ -74,6 +84,9 @@ public: std::vector getPolicyTypeNames(); // 获取策略名称 std::vector getPolicyNames(); + // 根据策略类型ID获取策略类型名称 + // 根据策略类型名称获取策略类型ID + int getPolicyTypeId(std::string name); std::vector getElectPreiodVals(int month); @@ -103,6 +116,9 @@ public: VecPairSS deviceType; VecPairSS workMode; + + VecPairSS policyType; + VecPairSS stationName; } mapping; double electPriceSuperPeak {}; diff --git a/src/app/Device.cpp b/src/app/Device.cpp index 6535184..8496dbf 100644 --- a/src/app/Device.cpp +++ b/src/app/Device.cpp @@ -2,7 +2,7 @@ #include "common/Logger.h" #include "common/Utils.h" -#include "protocol/Communicator.h" +#include "protocol/CommEntity.h" #include "common/JsonN.h" //int DeviceEntity::getAttrInt(std::string key) @@ -56,7 +56,7 @@ int Device::startComm() // 创建新的通讯 if (!commEntity) { - commEntity = Communicator::createEntity(attrs); + commEntity = CommEntity::create(attrs); if (!commEntity) { return -1; } } diff --git a/src/app/Device.h b/src/app/Device.h index 12629fa..d206f0e 100644 --- a/src/app/Device.h +++ b/src/app/Device.h @@ -16,15 +16,14 @@ public: int type = -1; std::string name; std::string code; + std::string group; bool isOpen = false; std::string attrsJson = ""; - int err = 0; int online = 0; int status = 0; - //std::map mapAttrs; Fields attrs; @@ -41,16 +40,3 @@ public: static std::shared_ptr create(Fields& fields); }; - - -//class Device -//{ -//public: -// static void add(DataFields& fields); -// -// static std::vector> getDeviceByType(int type); -// -//public: -// static std::map> mapDevices; -//}; - diff --git a/src/app/Station.cpp b/src/app/Station.cpp index e9a97b6..1993126 100644 --- a/src/app/Station.cpp +++ b/src/app/Station.cpp @@ -1,28 +1,70 @@ #include "Station.h" #include "database/DAO.h" #include "database/SQL.h" +#include "common/fields.h" +#include "app/Device.h" -Station::Station(int id) : id(id) + +Station::Station() : id(0) { } +void Station::setFields(Fields& fields) +{ + this->id = fields.get(DMStation::STATION_ID); + this->name = fields.value(DMStation::NAME); + this->energyCapacity = fields.get(DMStation::CAPACITY); + this->workModeId = fields.get(DMStation::WORK_MODE_ID); +} + void Station::addDevice(int deviceId, std::shared_ptr device) { - mapDevice_[deviceId] = device; + mapDevice[deviceId] = device; + mapDeviceGroupNum[device->group]++; } std::shared_ptr Station::getDevice(int deviceId) { - auto iter = mapDevice_.find(deviceId); - if (iter!=mapDevice_.end()) + auto iter = mapDevice.find(deviceId); + if (iter!=mapDevice.end()) { return iter->second; } return nullptr; } +void Station::getDeviceByType(int typeId, std::vector>& res) +{ + for (auto iter = mapDevice.begin(); iter!=mapDevice.end(); ++iter) + { + auto device = iter->second; + if (device->type == typeId) + { + res.push_back(device); + } + } +} + +int Station::getDeviceNumByGroup(std::string name) +{ + return mapDeviceGroupNum[name]; +} + +void Station::getDeviceByGroup(std::string name, std::vector>& res) +{ + for (auto iter = mapDevice.begin(); iter!=mapDevice.end(); ++iter) + { + auto device = iter->second; + if (device->group == name) + { + res.push_back(device); + } + } +} + void Station::setWorkMode(int modeId) { + this->workModeId = modeId; std::string sql = SQL(SQL::TYPE::update).table(DMStation::TABLENAME) .update(DMStation::WORK_MODE_ID, std::to_string(modeId)) .where(DMStation::STATION_ID + "=" + std::to_string(id)).str(); @@ -43,4 +85,4 @@ void Station::setPolicy(int policyId) { XLOGE() << "set station policy failed."; } -} \ No newline at end of file +} diff --git a/src/app/Station.h b/src/app/Station.h index c9bebb7..eaba3dc 100644 --- a/src/app/Station.h +++ b/src/app/Station.h @@ -2,27 +2,35 @@ #include #include +#include "common/Fields.h" class Device; class Station { public: - Station(int id); + Station(); + + void setFields(Fields& fields); void addDevice(int deviceId, std::shared_ptr device); std::shared_ptr getDevice(int deviceId); + void getDeviceByType(int typeId, std::vector>& res); + int getDeviceNumByGroup(std::string name); + void getDeviceByGroup(std::string name, std::vector>& res); + void setWorkMode(int modeId); void setPolicy(int policyId); + public: int id {}; std::string name; - int workModeId; // 运行模式 - int runPolicyId; // 运行策略 + int workModeId {}; // 运行模式 + int runPolicyId {}; // 运行策略 // 储能容量 double energyCapacity {}; @@ -77,5 +85,7 @@ public: /////////////////////////////////////////////////////////////////////////////////////////////// /// === 设备信息 === - std::unordered_map> mapDevice_; + std::unordered_map> mapDevice; + + std::map mapDeviceGroupNum; }; \ No newline at end of file diff --git a/src/common/Fields.cpp b/src/common/Fields.cpp index f76961a..23ff4b2 100644 --- a/src/common/Fields.cpp +++ b/src/common/Fields.cpp @@ -1,6 +1,6 @@ #include "Fields.h" #include "common/Utils.h" - +#include "common/JsonN.h" std::string& Fields::value(std::string key) { @@ -14,14 +14,16 @@ bool Fields::contains(std::string key) return (mapFields.find(key) != mapFields.end()); } -std::unordered_map::iterator Fields::remove(string key) +std::string Fields::remove(string key) { + std::string val; auto it = mapFields.find(key); if (it != mapFields.end()) { - it = mapFields.erase(it); + val = it->second; + mapFields.erase(it); } - return it; + return val; } void Fields::append(Fields& datafield) @@ -177,6 +179,13 @@ string Fields::toSqlUpdate(string tableName, std::vector vecKeys, s return oss.str(); } +void Fields::parseJson(std::string jsonstr) +{ + NJsonNode jsonroot; + NJson::parse(jsonstr, jsonroot); - - + for (auto& item : jsonroot.items()) + { + this->set(item.key(), item.value()); + } +} \ No newline at end of file diff --git a/src/common/Fields.h b/src/common/Fields.h index bc9e569..3c1be32 100644 --- a/src/common/Fields.h +++ b/src/common/Fields.h @@ -19,6 +19,8 @@ struct PageInfo class Fields { public: + Fields() {}; + template void set(string key, T val, int precision=6) { @@ -42,7 +44,6 @@ public: return val; } - /** * 获取值 * @param: [string key] 索引名称 @@ -60,7 +61,7 @@ public: * 删除指定索引的值 * @param: [string key] 索引名称 */ - std::unordered_map::iterator remove(string key); + std::string remove(string key); /** * 追加合并 @@ -136,6 +137,8 @@ public: */ string toSqlUpdate(string tableName, std::vector vecKeys, string condition); + void parseJson(std::string jsonstr); + private: std::unordered_map mapFields; }; diff --git a/src/common/JsonN.h b/src/common/JsonN.h index 54eb1cb..ef66330 100644 --- a/src/common/JsonN.h +++ b/src/common/JsonN.h @@ -91,6 +91,15 @@ public: std::cout << "JSON read error: " << e.what() << std::endl; } } + + static void parse(std::string jsonstr, std::vector& vd) + { + NJsonNode jsonroot; + if (NJson::parse(jsonstr, jsonroot)) + { + vd = jsonroot.get>(); + } + } }; diff --git a/src/common/Logger.cpp b/src/common/Logger.cpp index b856756..df98fc0 100644 --- a/src/common/Logger.cpp +++ b/src/common/Logger.cpp @@ -7,7 +7,7 @@ std::mutex g_mutex; -Logger::Logger(Logger::ELogType logtype, std::string filename, int lineEdit) : line_(lineEdit) +Logger::Logger(Logger::ELogType logtype, std::string filename, int edit) : line_(edit) { auto index = filename.find_last_of('\\'); if (index != std::string::npos) diff --git a/src/common/Logger.h b/src/common/Logger.h index 2eb52a6..1322504 100644 --- a/src/common/Logger.h +++ b/src/common/Logger.h @@ -19,7 +19,7 @@ public: }; public: - Logger(Logger::ELogType logType, std::string filename, int lineEdit); + Logger(Logger::ELogType logType, std::string filename, int edit); ~Logger(); std::stringstream& Stream() { return oss_; } diff --git a/src/database/Dao.cpp b/src/database/Dao.cpp index 2e79d3a..98b9830 100644 --- a/src/database/Dao.cpp +++ b/src/database/Dao.cpp @@ -84,6 +84,9 @@ Errcode DAO::insertUser(Fields& params) auto dao = DaoEntity::create(DMUser::TABLENAME); std::string account = params.value(DMUser::ACCOUNT); + std::string userRoleId = params.remove(DMRole::ROLE_ID); + + // step1: 查询 std::vector result; bool ret = dao->exec("SELECT * from user WHERE account='" + account + "';", result); @@ -101,11 +104,14 @@ Errcode DAO::insertUser(Fields& params) { return Errcode::ERR_DB_SQL; } - Fields paramsUserRole; - paramsUserRole.set(DMUser::USER_ID, params.value(DMUser::USER_ID)); - paramsUserRole.set(DMRole::ROLE_ID, params.value(DMRole::ROLE_ID)); - paramsUserRole.set(DMUser::UPDATETIME, createTime); - ret = dao->duplicateUpdate(paramsUserRole, {DMUser::USER_ID}); + if (!userRoleId.empty()) + { + Fields paramsUserRole; + paramsUserRole.set(DMUser::USER_ID, params.value(DMUser::USER_ID)); + paramsUserRole.set(DMRole::ROLE_ID, userRoleId); + paramsUserRole.set(DMUser::UPDATETIME, createTime); + ret = dao->duplicateUpdate(paramsUserRole, {DMUser::USER_ID}); + } return Errcode::OK; } @@ -127,30 +133,28 @@ bool DAO::queryUserList(PageInfo& pageInfo, vector& result) Errcode DAO::updateUserById(Fields& params) { - std::string createTime = Utils::timeStr(); - std::string userId = params.value(DMUser::USER_ID); - std::string roleId = ""; - if (params.contains(DMRole::ROLE_ID)) - { - roleId = params.value(DMRole::ROLE_ID); - params.remove(DMUser::USER_ID); - } - auto dao = DaoEntity::create(DMUser::TABLENAME); - bool ret = dao->updateFields(params, "WHERE " + DMUser::USER_ID + "='" + userId + "'"); - if (!ret) - { - return Errcode::ERR_DB_SQL; - } + std::string createTime = Utils::timeStr(); + std::string userId = params.remove(DMUser::USER_ID); + std::string roleId = params.remove(DMRole::ROLE_ID); + + if (params.size() > 0) + { + bool ret = dao->updateFields(params, "WHERE " + DMUser::USER_ID + "='" + userId + "'"); + if (!ret) + { + return Errcode::ERR_DB_SQL; + } + } if (!roleId.empty()) { dao->setTableName(DMUserRole::TABLENAME); Fields paramsUserRole; - paramsUserRole.set(DMUserRole::USER_ID, params.value(DMUserRole::USER_ID)); - paramsUserRole.set(DMUserRole::ROLE_ID, params.value(DMUserRole::ROLE_ID)); + paramsUserRole.set(DMUserRole::USER_ID, userId); + paramsUserRole.set(DMUserRole::ROLE_ID, roleId); paramsUserRole.set(DMUserRole::UPDATETIME, createTime); - ret = dao->duplicateUpdate(paramsUserRole, {DMUser::USER_ID}); + bool ret = dao->duplicateUpdate(paramsUserRole, {DMUserRole::ROLE_ID}); if (!ret) { return Errcode::ERR_DB_SQL; @@ -298,6 +302,20 @@ Errcode DAO::queryPolicyList(std::shared_ptr dao, vector& res std::string sql = "SELECT * FROM " + DMPolicy::TABLENAME; return DAO::exec(dao, sql, result); } +Errcode DAO::insertPolicy(Fields& params) +{ + return DAO::exec(NULL, params.toSqlInsert(DMPolicy::TABLENAME)); +} +Errcode DAO::updatePolicyById(Fields& params) +{ + std::string policyId = params.value(DMPolicy::POLICY_ID); + if (policyId.empty()) + { + return Errcode::ERR_DB_SQL; + } + std::string sql = params.toSqlUpdate(DMPolicy::TABLENAME, "WHERE " + DMPolicy::POLICY_ID + "='" + policyId + "'"); + return DAO::exec(NULL, sql); +} // 系统日志管理 bool DAO::querySystemLogList(PageInfo& pageInfo, vector& result) diff --git a/src/database/Dao.h b/src/database/Dao.h index a290c18..7388981 100644 --- a/src/database/Dao.h +++ b/src/database/Dao.h @@ -68,6 +68,9 @@ public: static bool queryPolicyList(PageInfo& pageInfo, vector& result); static Errcode queryPolicyList(std::shared_ptr dao, vector& result); + + static Errcode insertPolicy(Fields& params); + static Errcode updatePolicyById(Fields& params); /////////////////////////////////////////////////////////////////////////////////////////////// // === 系统日志管理 === diff --git a/src/database/DaoEntity.cpp b/src/database/DaoEntity.cpp index 16b11ac..9be63fe 100644 --- a/src/database/DaoEntity.cpp +++ b/src/database/DaoEntity.cpp @@ -2,7 +2,7 @@ //#include "PvInstance.h" //#include "spdlogger.h" -MysqlOption DaoEntity::option_; +MysqlOption DaoEntity::option; DaoEntity::DaoEntity(string tb_name) { @@ -12,7 +12,7 @@ DaoEntity::DaoEntity(string tb_name) //opts.password = "123456"; //opts.port = 3306; //opts.dbname = "pvb"; - db_ = make_shared(DaoEntity::option_); + db_ = make_shared(DaoEntity::option); if (!db_->isConnected()) { //Global::data().status_msg = "数据库连接异常!"; @@ -28,15 +28,15 @@ DaoEntity::~DaoEntity() MysqlOption& DaoEntity::mysqlOption() { - return DaoEntity::option_; + return DaoEntity::option; } void DaoEntity::setOption(std::string host, int port, std::string user, std::string pwd, std::string dbname) { - option_.host = host; - option_.port = port; - option_.user = user; - option_.password = pwd; - option_.dbname = dbname; + option.host = host; + option.port = port; + option.user = user; + option.password = pwd; + option.dbname = dbname; } std::shared_ptr DaoEntity::create(string tb_name) @@ -46,13 +46,13 @@ std::shared_ptr DaoEntity::create(string tb_name) bool DaoEntity::execOnce(string sql) { - auto db = make_shared(DaoEntity::option_); + auto db = make_shared(DaoEntity::option); return db->exec(sql); } bool DaoEntity::execOnce(string sql, vector& result) { - auto db = make_shared(DaoEntity::option_); + auto db = make_shared(DaoEntity::option); return db->exec(sql, result); } @@ -130,27 +130,27 @@ bool DaoEntity::insertFields(vector& vec_fields) bool DaoEntity::duplicateUpdate(Fields& fields, const vector& keys) { //insert into device_attr(device_id, attr_id, attr_val) values('26', 'model', '型号1') on duplicate key update attr_val='型号1'; - string s_key; - string s_val; + string key; + string val; for (auto& item : fields.map()) { - if (!s_key.empty()) + if (!key.empty()) { - s_key += ","; s_val += ","; + key += ","; val += ","; } - s_key += (item.first); - s_val += ("'" + item.second + "'"); + key += (item.first); + val += ("'" + item.second + "'"); } - string s_data; + string str; for (auto& k : keys) { - if (!s_data.empty()) + if (!str.empty()) { - s_data += ","; + str += ","; } - s_data += (k + "='" + fields.value(k) + "'"); + str += (k + "='" + fields.value(k) + "'"); } - string sql = "INSERT INTO " + tableName_ + "(" + s_key + ") VALUES (" + s_val + ") ON duplicate KEY UPDATE " + s_data; + string sql = "INSERT INTO " + tableName_ + "(" + key + ") VALUES (" + val + ") ON duplicate KEY UPDATE " + str; return this->db_->exec(sql); } diff --git a/src/database/DaoEntity.h b/src/database/DaoEntity.h index 9b6ef69..0dab9a5 100644 --- a/src/database/DaoEntity.h +++ b/src/database/DaoEntity.h @@ -100,7 +100,7 @@ public: bool updateFields(Fields& fields, vector vecKeys, const string& cond); protected: - static MysqlOption option_; + static MysqlOption option; // mysql 数据库操作对象 std::shared_ptr db_ = nullptr; diff --git a/src/database/DataModelDef.h b/src/database/DataModelDef.h index 2d30d87..6cfb9ec 100644 --- a/src/database/DataModelDef.h +++ b/src/database/DataModelDef.h @@ -98,6 +98,7 @@ namespace DMDefDeviceType const string TABLENAME = "def_device_type"; const string DEVICE_TYPE_ID = "device_type_id"; const string NAME = "name"; + const string GROUP = "group"; const string ATTRS = "attrs"; } diff --git a/src/database/MysqlClient.cpp b/src/database/MysqlClient.cpp index 076732f..d73fbf4 100644 --- a/src/database/MysqlClient.cpp +++ b/src/database/MysqlClient.cpp @@ -3,7 +3,7 @@ //#include "Spdlogger.h" #include "Logger.h" -MysqlClient::MysqlClient(MysqlOption option) : option_(option) +MysqlClient::MysqlClient(MysqlOption option) : option(option) { conn(); } @@ -20,7 +20,7 @@ int MysqlClient::conn() return 0; } mysql_ = mysql_init(nullptr); - MYSQL* ret = mysql_real_connect(mysql_, option_.host.c_str(), option_.user.c_str(), option_.password.c_str(), option_.dbname.c_str(), option_.port, NULL, 0); + MYSQL* ret = mysql_real_connect(mysql_, option.host.c_str(), option.user.c_str(), option.password.c_str(), option.dbname.c_str(), option.port, NULL, 0); if (ret == NULL) { std::string err = mysql_error(mysql_); diff --git a/src/database/MysqlClient.h b/src/database/MysqlClient.h index 9e10bd5..3d5e9e0 100644 --- a/src/database/MysqlClient.h +++ b/src/database/MysqlClient.h @@ -62,7 +62,7 @@ private: MYSQL* mysql_ = nullptr; // 数据库连接信息 - MysqlOption option_; + MysqlOption option; }; #endif // !!! _DbMysql_H_ diff --git a/src/main.cpp b/src/main.cpp index 1287bc5..d655e19 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -18,7 +18,9 @@ #include "pv/PvApp.h" #include "pv/PvUser.h" +#include "rlsocket.h" +#define wsa rlwsa int main(int argc, char** argv) { // 设置控制台输出为 UTF-8 编码 @@ -52,6 +54,24 @@ int main(int argc, char** argv) std::cout << jsonroot1.dump(); } + std::map mapT; + bool ff = mapT[1]; + + //rlwsa(); + //rlSocket socket("127.0.0.1", 19801, 1); + //int ret = socket.connect(); + //std::string s1 = "helloworld"; + //socket.write(s1.c_str(), s1.size()); + + //std::vector buf(1024, 0); + //while (true) + //{ + // int len = socket.read(&buf[0], 1, 0); + // if (len > 0) + // { + // std::cout << "===>>> " << std::string(buf.begin(), buf.end()); + // } + //} std::cout << "===>>> main start ... " << std::endl; ////std::cout << Snowflake::instance().getId() << std::endl; diff --git a/src/protocol/Communicator.cpp b/src/protocol/CommEntity.cpp similarity index 84% rename from src/protocol/Communicator.cpp rename to src/protocol/CommEntity.cpp index e8fe42d..79457a5 100644 --- a/src/protocol/Communicator.cpp +++ b/src/protocol/CommEntity.cpp @@ -1,7 +1,7 @@ -#include "Communicator.h" +#include "CommEntity.h" #include "TcpEntity.h" -std::shared_ptr Communicator::createEntity(Fields& data) +std::shared_ptr CommEntity::create(Fields& data) { std::string commType = data.value("commType"); std::string ip = data.value("ip"); diff --git a/src/protocol/Communicator.h b/src/protocol/CommEntity.h similarity index 86% rename from src/protocol/Communicator.h rename to src/protocol/CommEntity.h index 7f5a599..6dd03e9 100644 --- a/src/protocol/Communicator.h +++ b/src/protocol/CommEntity.h @@ -11,6 +11,8 @@ public: CommEntity() {} CommEntity(std::string type) : type(type) {} + static std::shared_ptr create(Fields& data); + void setType(std::string type) { this->type = type; } // 启动通讯连接 @@ -30,10 +32,3 @@ public: bool isCloseRequest_ = false; std::string type; }; - - -class Communicator -{ -public: - static std::shared_ptr createEntity(Fields& data); -}; \ No newline at end of file diff --git a/src/protocol/TcpEntity.h b/src/protocol/TcpEntity.h index 0fa2521..0d53bbf 100644 --- a/src/protocol/TcpEntity.h +++ b/src/protocol/TcpEntity.h @@ -7,7 +7,7 @@ #include #include -#include "Communicator.h" +#include "CommEntity.h" using namespace std; diff --git a/src/pv/MaskMain.cpp b/src/pv/MaskMain.cpp index f9d7169..8e13a81 100644 --- a/src/pv/MaskMain.cpp +++ b/src/pv/MaskMain.cpp @@ -20,13 +20,12 @@ std::string GetDateTimeWeekday() return ss.str(); } - - int MaskMain::initUI() { //pvSetStyleSheet(p, PV_ID_MAIN, "color: white; font: normal 14px \"微软雅黑\";"); ui.bkg = PvApp::pvid(p); - PvApp::image(p, 0, 0, 0, 1920, 1080, "bkg.png"); + PvApp::label(p, PV_ID_MAIN, 0, 0, 1920, 1080, "", "background-color: rgb(1, 32, 54)"); + PvApp::image(p, 0, 0, 0, 1920, 90, "bkgHead.png"); ui.datetime = PvApp::label(p, PV_ID_MAIN, 10, 30, 420, 30, GetDateTimeWeekday(), qss::label(20)); pvSetAlignment(p, ui.datetime, AlignCenter); diff --git a/src/pv/PvApp.cpp b/src/pv/PvApp.cpp index 1e0b93e..87cfcfe 100644 --- a/src/pv/PvApp.cpp +++ b/src/pv/PvApp.cpp @@ -5,6 +5,72 @@ #define FONT_NAME "微软雅黑" +PvRect::PvRect() +{ +} + +PvRect::PvRect(int ix, int iy, int iw, int ih) + : x(ix), y(iy), w(iw), h(ih) +{ +} + +PvRect& PvRect::set(int ix, int iy, int iw, int ih) +{ + x = ix; + y = iy; + w = iw; + h = ih; + return *this; +} + +PvRect& PvRect::setx(int ix) +{ + x = ix; + return *this; +} + +PvRect& PvRect::sety(int iy) +{ + y = iy; + return *this; +} + +PvRect& PvRect::setw(int iw) +{ + w = iw; + return *this; +} + +PvRect& PvRect::seth(int ih) +{ + h = ih; + return *this; +} +PvRect& PvRect::shiftx(int ix) +{ + x += ix; + return *this; +} + +PvRect& PvRect::shifty(int iy) +{ + y += iy; + return *this; +} + +PvRect& PvRect::shiftw(int iw) +{ + w += iw; + return *this; +} + +PvRect& PvRect::shifth(int ih) +{ + h += ih; + return *this; +} + + void PvApp::setPvUser(PARAM* p, PvUser* pvuser) { p->user = pvuser; @@ -23,10 +89,8 @@ int PvApp::pvid(PARAM* p) void PvApp::reset(PARAM* p) { - // 清理event回调 auto pvuser = PvApp::getPvUser(p); - pvuser->mapEventCallback.clear(); - pvuser->pvidIndex = 0; + if (pvuser) { pvuser->reset(); } } EPvCode PvApp::getPvCode(std::string name) @@ -64,7 +128,6 @@ EPvCode PvApp::getPvCode(std::string name) } } - void PvApp::bind(PARAM* p, PvEvent eid, int pvid, std::function cb) { auto pvuser = PvApp::getPvUser(p); @@ -99,13 +162,22 @@ int PvApp::widget(PARAM* p, int parent, int x, int y, int w, int h) int PvApp::label(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss) { + static const std::string style = "QLabel { border: none; background-color: transparent; } QLabel:disabled { color: gray;}"; int id = PvApp::pvid(p); pvQLabel(p, id, parent); pvSetGeometry(p, id, x, y, w, h); if (!text.empty()) { pvSetText(p, id, text.c_str()); } - pvSetStyleSheet(p, id, qss.empty() ? qss::label().c_str() : qss.c_str()); + pvSetStyleSheet(p, id, qss.empty() ? style.c_str() : qss.c_str()); return id; } + +int PvApp::labelCenter(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss) +{ + int id = PvApp::label(p, parent, x, y, w, h, text, qss); + pvSetAlignment(p, id, AlignCenter); + return id; +} + int PvApp::labelAlignCenter(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss) { int id = PvApp::label(p, parent, x, y, w, h, text, qss); @@ -128,7 +200,6 @@ int PvApp::image(PARAM* p, int parent, int x, int y, int w, int h, const char* f int id = PvApp::pvid(p); pvQImage(p, id, parent, filename); pvSetGeometry(p, id, x, y, w, h); - //if (!qss.empty()) { pvSetStyleSheet(p, id, qss.c_str()); } return id; } @@ -147,7 +218,7 @@ int PvApp::combox(PARAM* p, int parent, int x, int y, int w, int h, const std::v return id; } -int PvApp::lineEdit(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss) +int PvApp::textedit(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss) { int id = PvApp::pvid(p); pvQLineEdit(p, id, parent); @@ -157,11 +228,11 @@ int PvApp::lineEdit(PARAM* p, int parent, int x, int y, int w, int h, std::strin return id; } -int PvApp::textEdit(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss) +int PvApp::multiTextedit(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss) { 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);}"; + "QTextEdit { background-color: rgb(12, 39, 58); border: 1px solid rgb(18, 251, 255); border-radius: 3px; color:white; font: bold 14px;}" + "QTextEdit:disabled { border: none; color: gray;}"; int id = PvApp::pvid(p); pvQMultiLineEdit(p, id, parent, true, 10); pvSetGeometry(p, id, x, y, w, h); @@ -174,7 +245,7 @@ int PvApp::radioButton(PARAM* p, int parent, int x, int y, int w, int h, std::st { static std::string style = "QRadioButton { background-color: transparent; color:white; font: bold 14px \"微软雅黑\";}" - "QRadioButton:disabled { border: none; color:rgb(150,150,150);}"; + "QRadioButton:disabled { border: none; color: gray;}"; int id = PvApp::pvid(p); pvQRadioButton(p, id, parent); @@ -188,7 +259,7 @@ 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);}"; + "QTimeEdit:disabled { border: none; color: gray;}"; int id = PvApp::pvid(p); pvQTimeEdit(p, id, parent); @@ -197,67 +268,15 @@ int PvApp::timeEdit(PARAM* p, int parent, int x, int y, int w, int h) return id; } -PvRect::PvRect() +int PvApp::lineLabel(PARAM* p, int parent, PvRect& rect, int w, std::string key, std::string val) { + int pid = PvApp::label(p, parent, rect.x, rect.y, rect.w, rect.h, key, qss::label(14)); + return PvApp::label(p, pid, w, 0, rect.w-w, rect.h, val); } -PvRect::PvRect(int ix, int iy, int width, int height) - : x(ix), y(iy), w(width), h(height) +int PvApp::lineTextedit(PARAM* p, int parent, PvRect& rect, int w, std::string key, std::string val) { + int pid = PvApp::label(p, parent, rect.x, rect.y, rect.w, rect.h, key, qss::label(14)); + return PvApp::textedit(p, pid, w, 0, rect.w-w, rect.h, val); } -PvRect& PvRect::set(int ix, int iy, int width, int height) -{ - x = ix; - y = iy; - w = width; - h = height; - return *this; -} - -PvRect& PvRect::set_x(int ix) -{ - x = ix; - return *this; -} - -PvRect& PvRect::set_y(int iy) -{ - y = iy; - return *this; -} - -PvRect& PvRect::set_w(int iw) -{ - w = iw; - return *this; -} - -PvRect& PvRect::set_h(int ih) -{ - h = ih; - return *this; -} -PvRect& PvRect::shift_x(int ix) -{ - x += ix; - return *this; -} - -PvRect& PvRect::shift_y(int iy) -{ - y += iy; - return *this; -} - -PvRect& PvRect::shift_w(int iw) -{ - w += iw; - return *this; -} - -PvRect& PvRect::shift_h(int ih) -{ - h += ih; - return *this; -} diff --git a/src/pv/PvApp.h b/src/pv/PvApp.h index a878ee7..136783d 100644 --- a/src/pv/PvApp.h +++ b/src/pv/PvApp.h @@ -53,6 +53,51 @@ enum class EPvCode MASK_MGR_ALERTLOG, }; +/////////////////////////////////////////////////////////////////////////////////////////////////// +/// === PvRect +class PvRect +{ +public: + PvRect(); + PvRect(int ix, int iy, int iw, int ih); + + PvRect& set(int ix, int iy, int iw, int ih); + PvRect& setx(int ix); + PvRect& sety(int iy); + PvRect& setw(int iw); + PvRect& seth(int ih); + + PvRect& shiftx(int ix); + PvRect& shifty(int iy); + PvRect& shiftw(int iw); + PvRect& shifth(int ih); + +public: + int x = 0; + int y = 0; + int w = 100; + int h = 30; +}; + +struct PvColor +{ + int r; + int g; + int b; + int a; + + PvColor(int r, int g, int b, int a = 255) : r(r), g(g), b(b), a(a) {} + std::string rgb() + { + return "rgb(" + std::to_string(r) + "," + std::to_string(g) + "," + std::to_string(b) + ")"; + } + std::string rgba() + { + return "rgb(" + std::to_string(r) + "," + std::to_string(g) + "," + std::to_string(b) + "," + std::to_string(a) + ")"; + } +}; + + class PvObject { public: @@ -93,6 +138,8 @@ public: static int label(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss = ""); + static int labelCenter(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss = ""); + static int labelAlignCenter(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss = ""); static int button(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss = ""); @@ -101,57 +148,16 @@ public: static int combox(PARAM* p, int parent, int x, int y, int w, int h, const std::vector& 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 textEdit(PARAM* p, int parent, int x, int y, int w, int h, std::string text, std::string qss = ""); + static int multiTextedit(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); + + static int lineLabel(PARAM* p, int parent, PvRect& rect, int w, std::string key, std::string val); + + static int lineTextedit(PARAM* p, int parent, PvRect& rect, int w, std::string key, std::string val); }; -/////////////////////////////////////////////////////////////////////////////////////////////////// -/// === PvRect -class PvRect -{ -public: - PvRect(); - - PvRect(int ix, int iy, int width, int height); - - PvRect& set(int ix, int iy, int width, int height); - - PvRect& set_x(int ix); - PvRect& set_y(int iy); - PvRect& set_w(int iw); - PvRect& set_h(int ih); - - PvRect& shift_x(int ix); - PvRect& shift_y(int iy); - PvRect& shift_w(int iw); - PvRect& shift_h(int ih); - -public: - int x = 0; - int y = 0; - int w = 100; - int h = 32; -}; - -struct PvColor -{ - int r; - int g; - int b; - int a; - - PvColor(int r, int g, int b, int a = 255) : r(r), g(g), b(b), a(a) {} - std::string rgb() - { - return "rgb(" + std::to_string(r) + "," + std::to_string(g) + "," + std::to_string(b) + ")"; - } - std::string rgba() - { - return "rgb(" + std::to_string(r) + "," + std::to_string(g) + "," + std::to_string(b) + "," + std::to_string(a) + ")"; - } -}; diff --git a/src/pv/PvChart.cpp b/src/pv/PvChart.cpp index 628fa3d..ffdad68 100644 --- a/src/pv/PvChart.cpp +++ b/src/pv/PvChart.cpp @@ -206,7 +206,7 @@ void PvChartBar::updateItem(int index, std::vectorshow(false); }); } @@ -43,20 +43,21 @@ std::shared_ptr PvPopWidget::addParamLine(std::string ty mapLines[key] = line; PvApp::label(p, ui.widget, x, y, lineKeyWidth, lineHeight, title, qss::label(15)); - if (type == "lineEdit") + if (type == "textedit") { - line->widget = PvApp::lineEdit(p, ui.widget, x+lineKeyWidth, y, lineValWidth, lineHeight, ""); + line->widget = PvApp::textedit(p, ui.widget, x+lineKeyWidth, y, lineValWidth, lineHeight, ""); } else if (type == "combox") { line->widget = PvApp::combox(p, ui.widget, x+lineKeyWidth, y, lineValWidth, lineHeight, {}); } - else if (type == "textEdit") + else if (type == "multiTextedit") { - line->widget = PvApp::textEdit(p, ui.widget, x+lineKeyWidth, y, lineValWidth, lineHeight*4, ""); + line->widget = PvApp::multiTextedit(p, ui.widget, x+lineKeyWidth, y, lineValWidth, lineHeight*4, ""); } PvApp::bind(p, PvEvent::TEXT_EVENT, line->widget, [=](std::string text) { line->val = text; + if (callbackTextEvent) callbackTextEvent(key, text); }); if (!editable) { pvSetEnabled(p, line->widget, 0); } return line; @@ -64,12 +65,12 @@ std::shared_ptr PvPopWidget::addParamLine(std::string ty void PvPopWidget::addParamLineEdit(std::string key, std::string title, int x, int y, bool editable/*= true*/) { - this->addParamLine("lineEdit", key, title, x, y, editable); + this->addParamLine("textedit", key, title, x, y, editable); } void PvPopWidget::addParamTextEdit(std::string key, std::string title, int x, int y, bool editable/* = true*/) { - this->addParamLine("textEdit", key, title, x, y, editable); + this->addParamLine("multiTextedit", key, title, x, y, editable); } void PvPopWidget::addParamCombox(std::string key, std::string title, int x, int y, std::vector items) @@ -103,6 +104,8 @@ void PvPopWidget::setParamText(std::shared_ptr line, std::string text line->val = line->items[0]; pvSetCurrentItem(p, line->widget, 0); } + // 【注意】combox 设置 item 不会触发 TEXT_EVENT + //if (callbackTextEvent) callbackTextEvent(line->key, line->val); } else { @@ -194,4 +197,20 @@ void PvPopWidget::setPrimaryKeys(std::vector keys) { primaryKeys.set(k, ""); } +} + +void PvPopWidget::resize(int width, int height) +{ + int x = (1920-width) *0.5; + int y = (1080-height) *0.5; + pvSetGeometry(p, ui.widget, x, y, width, height); + pvSetGeometry(p, ui.bkg, 2, 2, width-4, height-4); + pvSetGeometry(p, ui.bkgL, 0, 0, 60, height); + pvSetGeometry(p, ui.bkgR, width-60, 0, 60, height); + + int w = 100, h = 40, offset = 50; + x = (width- w*2 - offset) *0.5; + y = height - h - 40; + pvSetGeometry(p, ui.btnOK, x, y, w, h); + pvSetGeometry(p, ui.btnCancel, x+w+offset, y, w, h); } \ No newline at end of file diff --git a/src/pv/PvPopWidget.h b/src/pv/PvPopWidget.h index 04348f3..2260a96 100644 --- a/src/pv/PvPopWidget.h +++ b/src/pv/PvPopWidget.h @@ -35,6 +35,8 @@ public: void setCallbackConfirm(std::function callback) { callbackConfirm = callback; }; + void setCallbackTextEvent(std::function callback) { callbackTextEvent = callback; }; + void setStatus(std::string text); void setMsg(std::string msg); @@ -44,11 +46,14 @@ public: Fields getChangedData(); void checkChangedData(Fields& fields); - void setLineGeometry(int wKey, int wVal, int h); void setPrimaryKeys(std::vector keys); + int widget() { return ui.widget; } + + void resize(int width, int height); + std::string name; std::string status; @@ -61,6 +66,11 @@ public: struct { int widget; + int bkg; + int bkgL; + int bkgR; + int btnOK; + int btnCancel; int title; int msg; } ui; @@ -68,6 +78,7 @@ public: std::map> mapLines; std::function callbackConfirm = nullptr; + std::function callbackTextEvent = nullptr; Fields dataOrigin; Fields primaryKeys; diff --git a/src/pv/PvStyle.cpp b/src/pv/PvStyle.cpp index ac26abb..a9a6e0f 100644 --- a/src/pv/PvStyle.cpp +++ b/src/pv/PvStyle.cpp @@ -48,7 +48,7 @@ namespace qss const std::string LABEL_BKG_2 = qss::label(14, "", "rgb(8, 54, 91)", "none; border-radius:5px"); - const std::string LABEL_BOX = qss::label(14, "", "rgba(200,200,200,20)", "none; border-radius:2px") + const std::string LABEL_BOX = qss::label(16, "", "rgba(200,200,200,20)", "none; border-radius:2px") + "QLabel:hover {border: 1px solid rgb(1, 183, 209);}"; const std::string QSS_BOX_ACTIVE = @@ -88,7 +88,6 @@ namespace qss const std::string QSS_BTN_MGR = "QPushButton { background-color:rgb(10, 34, 63); border-radius:5px; border:1px solid rgb(33, 105, 195); color:white; font:bold 16px;}" "QPushButton:hover { background-color:rgb(10,125,215); border:2px solid rgb(1,239,255); color:rgb(1,239,255)}" - //"QPushButton:pressed{border-width:3px 0 0 3px;background-color:rgb(150,150,150);border-style:inset;}" "QPushButton:pressed { border-width:3px 0 0 3px;border-style:inset; }" "QPushButton:disabled{color:rgb(150,150,150);}"; diff --git a/src/pv/PvTable.cpp b/src/pv/PvTable.cpp index b001fa6..6fb837b 100644 --- a/src/pv/PvTable.cpp +++ b/src/pv/PvTable.cpp @@ -9,57 +9,56 @@ static const string STYLE_BKG = //********************************************************************************************************************* // PvTable -PvTable::PvTable(PARAM* p, int parent, int x, int y, int w, int row, Options& opts) +PvTable::PvTable(PARAM* p, int parent, int x, int y, int w, int irow, Options& opts) //: PvWidget(p, parent, PvRect(x, y, w, opts.item_height* row + (opts.show_header ? (opts.header_height) : 0))), - : PvObject(p), option_(opts), nRow_(row), nCol_(0) + : PvObject(p), option(opts), nrow(irow), ncol(0) { // 计算表格的显示区域 - int h = opts.row_height* row + (opts.show_header ? (opts.head_height) : 0); - rect_.set(x, y, w, h); + int h = opts.row_height* irow + (opts.show_header ? (opts.head_height) : 0); + rect.set(x, y, w, h); // 表格的主窗体(QWidget设置样式无效) - pvid_ = PvApp::widget(p, parent, x, y, w, h+1); + pvid = PvApp::widget(p, parent, x, y, w, h+1); // 表格的背景色和边框样式 - PvApp::label(p, pvid_, 0, 0, w, h+1, "", qss::QSS_TABLE); + PvApp::label(p, pvid, 0, 0, w, h+1, "", qss::QSS_TABLE); - vecHead_.resize(0); - vecRows_.resize(nRow_); - vecData_.resize(nRow_); + vecHeads.resize(0); + vecRows.resize(nrow); + vecData.resize(nrow); // 创建行高亮显示背景 - for (int row = 0; row < nRow_; row++) + for (int row = 0; row < nrow; row++) { - int y = item_posy(row); + int y = row * option.row_height + (option.show_header ? option.head_height : 0); string qss = (row % 2 != 0) ? qss::QSS_TABLE_ROW_0 : qss::QSS_TABLE_ROW_1; - int rowBkg = PvApp::label(p, pvid_, 1, y, rect_.w-2, option_.row_height, "", qss); - pvHide(p, rowBkg); - vecRows_[row].bkg = rowBkg; + int widgetRow = PvApp::label(p, pvid, 1, y, rect.w-2, option.row_height, "", qss); + pvHide(p, widgetRow); + vecRows[row].widget = widgetRow; } } void PvTable::addHead(string id, string text, int width, vector> mapping) { - vecHead_.push_back(Head(id, text, width, mapping)); - nCol_ = vecHead_.size(); + vecHeads.push_back(Head(id, text, width, mapping)); + ncol = vecHeads.size(); - if (width <= -1) { width = rect_.w-1 - posCol_; } - int col = nCol_ - 1; + if (width <= -1) { width = rect.w-1 - posCol; } + int col = ncol - 1; // 创建表头的标签 - if (option_.show_header) + if (option.show_header) { - vecHead_[col].pvid = PvApp::label(p, pvid_, posCol_, 0, width, option_.head_height, text, qss::QSS_TABLE_HEAD); + vecHeads[col].pvid = PvApp::label(p, pvid, posCol, 0, width, option.head_height, text, qss::QSS_TABLE_HEAD); } // 创建列的单元格 - for (int row = 0; row < nRow_; ++row) + for (int row = 0; row < nrow; ++row) { - int y = item_posy(row); - int pvid = PvApp::label(p, pvid_, posCol_, y, width, option_.row_height, "", qss::QSS_TABLE_CELL); - vecRows_[row].vecCells.push_back(pvid); - PvApp::bind(p, MOUSE_OVER_EVENT, pvid, [=](string s) { highlight(row, (s == "1")); }); + int cellId = PvApp::label(p, vecRows[row].widget, posCol, 0, width, option.row_height, "", qss::QSS_TABLE_CELL); + vecRows[row].vecCells.push_back(cellId); + PvApp::bind(p, MOUSE_OVER_EVENT, cellId, [=](string s) { highlight(row, (s == "1")); }); } - posCol_ += width; + posCol += width; } void PvTable::addHead(vector vec_text) @@ -68,24 +67,24 @@ void PvTable::addHead(vector vec_text) int x = 0; for (int i = 0; i < vec_text.size(); ++i) { - int w = float(rect_.w-1) * float(i+1) / float(colSize); + int w = float(rect.w-1) * float(i+1) / float(colSize); string text = vec_text[i]; this->addHead(text, text, w-x); x = w; } } -void PvTable::setRowVisible(int row, bool v) +void PvTable::setRowVisible(int irow, bool v) { - if (row < 0 || row >= vecRows_.size()) + if (irow < 0 || irow >= vecRows.size()) { return; } - auto& rowItem = vecRows_[row]; + auto& rowItem = vecRows[irow]; if (rowItem.visible != v) { rowItem.visible = v; - rowItem.visible ? pvShow(p, rowItem.bkg) : pvHide(p, rowItem.bkg); + rowItem.visible ? pvShow(p, rowItem.widget) : pvHide(p, rowItem.widget); if (!v) { for (int col = 0; col 0 && row <= vecRows_.size()) + string qss = ((irow % 2 != 0) ? qss::QSS_TABLE_ROW_0 : qss::QSS_TABLE_ROW_1); + if (vecRows.size() > 0 && irow <= vecRows.size()) { if (v) { qss = "background-color:rgba(14,45,60,200);border:1px solid rgba(255,0,0,100);"; } - pvSetStyleSheet(p, vecRows_[row].bkg, qss.c_str()); + pvSetStyleSheet(p, vecRows[irow].widget, qss.c_str()); } } void PvTable::addOperate(vector vecOpt) { // 创建表头的标签 - if (option_.show_header) + if (option.show_header) { - PvApp::label(p, pvid_, posCol_, 0, rect_.w - posCol_, option_.head_height, "操作", qss::QSS_TABLE_HEAD); + PvApp::label(p, pvid, posCol, 0, rect.w - posCol, option.head_height, "操作", qss::QSS_TABLE_HEAD); } - for (int row = 0; row < nRow_; ++row) + for (int row = 0; row < nrow; ++row) { - int y = item_posy(row); - int cellWidget = PvApp::label(p, pvid_, posCol_, y, rect_.w - posCol_, option_.row_height, "", qss::QSS_TABLE_CELL); - //PvInstance::bind_event(p, MOUSE_OVER_EVENT, btn_opt, [=](string s) { highlight(row, (s == "1")); }); - vecOpt_.push_back({ cellWidget, vector() }); - auto& vec_opt_btn_ = vecOpt_.back().second; - + int cellWidget = PvApp::label(p, vecRows[row].widget, posCol, 0, rect.w - posCol, option.row_height, "", qss::QSS_TABLE_CELL); + vecOper.push_back({ cellWidget, vector() }); + auto& vec_opt_btn_ = vecOper.back().second; int x = 5, w = 60; for (int i = 0; i < vecOpt.size(); i++) { @@ -128,87 +124,66 @@ void PvTable::addOperate(vector vecOpt) w = 20 + 15 * title.size() / 3; int btn = PvApp::button(p, cellWidget, x, 4, w, 24, title, qss::button(14, "", "", "none; border-radius: 0px")); PvApp::bind(p, PvEvent::BUTTON_EVENT, btn, [=](std::string) { - if (cbOperate_) { cbOperate_(row, 0, title); } + if (callbackOper) { callbackOper(row, 0, title); } }); vec_opt_btn_.push_back(btn); x += (w + 5); } - pvHide(p, cellWidget); } } void PvTable::setOperateCallback(CallbackTableOpt cb) { - cbOperate_ = cb; + callbackOper = cb; }; -void PvTable::set_text(PARAM* p, int row, int col, string text, string style) +void PvTable::setRow(int irow, Fields& d) { - if (row < nRow_ && col < nCol_) + if (irow >= nrow) { return; } + + vecData[irow] = d; + for (int col = 0; col < vecHeads.size(); ++col) { - pvSetText(p, vecRows_[row].vecCells[col], text.c_str()); - if (!style.empty()) - { - int idx = row + 1; - if (idx % 2 != 0) - { - style = item_base_style_ + style; - } - else - { - style = item_base_style_ + style; - } - - //style = "qproperty-alignment:AlignCenter;" + style + "}"; - string s = "QLabel{" + style + "} QLabel:disabled{color:rgb(150,150,150)}"; - pvSetStyleSheet(p, vecRows_[row].vecCells[col], s.c_str()); - } - } -} - -void PvTable::setRowData(int row, Fields& d) -{ - if (row >= nRow_) { return; } - - vecData_[row] = d; - for (int col = 0; col < vecHead_.size(); ++col) - { - auto& head = vecHead_[col]; + auto& head = vecHeads[col]; string text = d.value(head.id); text = head.getMapping(text); - pvSetText(p, vecRows_[row].vecCells[col], text.c_str()); + pvSetText(p, vecRows[irow].vecCells[col], text.c_str()); } - setRowVisible(row, true); - this->setOperateVisible(row, d.size() > 0); + setRowVisible(irow, true); } -void PvTable::setRowData(int row, std::vector vd) +void PvTable::setRow(int irow, std::vector vd) { - if (row >= nRow_) { return; } - pvShow(p, vecRows_[row].bkg); - for (int col = 0; col < vecHead_.size(); ++col) + if (irow >= nrow) { return; } + pvShow(p, vecRows[irow].widget); + for (int col = 0; col < vecHeads.size(); ++col) { if (col < vd.size()) { - auto& head = vecHead_[col]; + auto& head = vecHeads[col]; string text = head.getMapping(vd[col]); - pvSetText(p, vecRows_[row].vecCells[col], text.c_str()); + pvSetText(p, vecRows[irow].vecCells[col], text.c_str()); } } - setRowVisible(row, true); - this->setOperateVisible(row, vd.size() > 0); + setRowVisible(irow, true); } -Fields PvTable::getRowData(int row) +Fields PvTable::row(int irow) { - static Fields tmp; - return (row >= 0 && row < vecData_.size()) ? vecData_[row] : tmp; + return (irow >= 0 && irow < vecData.size()) ? vecData[irow] : Fields(); +} + +Fields PvTable::rowMapping(int rowid) +{ + Fields d = this->row(rowid); + this->mappingData(d); + return d; } void PvTable::mappingData(Fields& fields) { - for (int i=0; i< vecHead_.size(); ++i) + for (int i=0; i< vecHeads.size(); ++i) { - auto& head = vecHead_[i]; + auto& head = vecHeads[i]; if (fields.contains(head.id)) { auto& val = fields.value(head.id); @@ -217,82 +192,23 @@ void PvTable::mappingData(Fields& fields) } } -void PvTable::set_border_visible(PARAM* p, bool v) +int PvTable::rowCount() { - v ? pvShow(p, border_id_) : pvHide(p, border_id_); + return this->nrow; } - -int PvTable::item_posy(int row) +int PvTable::colCount() { - return option_.show_header ? row * option_.row_height + option_.head_height : row * option_.row_height; -} - -void PvTable::add_col_button(PARAM* p, int col, string title, PvRect& rt, string style) -{ - if (col >= nCol_) - { - return; - } - for (int row = 0; row < nRow_; ++row) - { - int id = PvApp::button(p, vecRows_[row].vecCells[col], rt.x, rt.y, rt.w, rt.h, title, style); - pvHide(p, id); - vec_col_item_btn_[row].push_back(id); - //PvInstance::bind_event(p, PvEvent::BUTTON_EVENT, id, [=](string s) - //{ - // if (cb_operate_) - // { - // cb_operate_(row, col, title); - // } - //}); - } -} - -void PvTable::add_col_button(PARAM* p, int col, vector vec_title) -{ - int x = 5; - int w = 0; - for (int i = 0; i < vec_title.size(); i++) - { - auto& title = vec_title[i]; - w = 20 + 20 * title.size() / 3; - this->add_col_button(p, col, title, PvRect(x, 3, w, 28), qss::button()); - x += (w + 5); - } -} - -void PvTable::setOperateVisible(int row, bool v, int id) -{ - if (row < vecOpt_.size()) - { - auto& vec_opt_btn = vecOpt_[row].second; - int pvid = id < 0 ? vecOpt_[row].first : ((id < vec_opt_btn.size()) ? vec_opt_btn[id] : PV_ID_NUL); - v ? pvShow(p, pvid) : pvHide(p, pvid); - } -} - -int PvTable::border_id() -{ - return border_id_; -} - -int PvTable::rows() -{ - return nRow_; -} -int PvTable::colums() -{ - return nCol_; + return this->ncol; } vector PvTable::data() { - return vecData_; + return vecData; } PvTable::Head& PvTable::header(int col) { - return vecHead_[col]; + return vecHeads[col]; } static const string STYLE_NORMAL = @@ -348,32 +264,6 @@ void PvPagination::setPage(int index, int count) else { pvShow(p, btnid); - //if (pageCount > 7) - //{ - // if (idx == 4) - // { - // idx = 0; - // } - // else if (idx > 4) - // { - // idx = pageCount - (7 - idx); - // } - //} - //btn.second = idx; - //string text = to_string(idx); - //if (text.empty() || text == "0") - //{ - // text = "..."; - // pvSetEnabled(p, btnid, false); - //} - ////pvMove(p, btnid, x, y); - //pvSetText(p, btnid, text.c_str()); - //if (idx == idx) - //{ - // this->active_page_button(p, idx, pageIndex); - // pageIndex = idx; - //} - //x += (32); } } int x = (count+1)*32; @@ -424,7 +314,10 @@ void PvPagination::setCallback(std::function func) PageTable::PageTable(PARAM* p) : PvMask(p) { table = std::make_shared(p, 0, 20, 210, 1880, pageSize, option); - table->setOperateCallback([=](int row, int col, std::string text) { this->onOperate(row, col, text); }); + table->setOperateCallback([=](int irow, int icol, std::string text) { + curRowData = table->row(irow); + this->onOperate(irow, icol, text); + }); pagination = std::make_shared(p, 0, 20, 780, 20); pagination->setCallback([=](int index) @@ -464,7 +357,7 @@ std::shared_ptr PageTable::addPop(int w, int h, int w0, std::string vecPop.push_back(pop); return pop; } -void PageTable::showPop(int index, std::string oper, Fields& fields) +void PageTable::showPop(int index, std::string oper, Fields fields) { XLOGD() << "POP set: data=" << fields.toStr(); table->mappingData(fields); @@ -492,12 +385,12 @@ void PageTable::updateDataFromDB() pageInfo.size = pageSize; pageInfo.index = pageIndex; this->onQueryTable(pageInfo, result); - for (int i = 0; irows(); ++i) + for (int i = 0; irowCount(); ++i) { if (isetRowData(i, result[i]); + table->setRow(i, result[i]); } else { diff --git a/src/pv/PvTable.h b/src/pv/PvTable.h index f8cb866..d5b2311 100644 --- a/src/pv/PvTable.h +++ b/src/pv/PvTable.h @@ -17,8 +17,6 @@ public: bool show_border = true; int head_height = 40; int row_height = 35; - int page_size = 10; - int width = 500; }; struct Head @@ -48,72 +46,52 @@ public: struct Row { bool visible = false; - int bkg {PV_ID_NUL}; + int widget {PV_ID_NUL}; std::vector vecCells {}; }; public: - PvTable(PARAM* p, int parent, int x, int y, int w, int rows, Options& option); + PvTable(PARAM* p, int parent, int x, int y, int w, int rowCount, Options& option); void addHead(std::string id, std::string text, int width, std::vector> mapping = {}); void addHead(std::vector vecText); - void setRowVisible(int row, bool v); - void highlight(int row, bool v); + void setRowVisible(int irow, bool v); + void highlight(int irow, bool v); void addOperate(std::vector vecOpt); void setOperateCallback(CallbackTableOpt cb); - void set_text(PARAM* p, int row, int col, std::string text, std::string style = ""); - void setRowData(int row, Fields& d); - void setRowData(int row, std::vector vd); + void setRow(int irow, Fields& d); + void setRow(int irow, std::vector vd); + Fields row(int irow); + Fields rowMapping(int irow); - Fields getRowData(int row); void mappingData(Fields& fields); - void set_border_visible(PARAM* p, bool v); - - void add_col_button(PARAM* p, int col, std::string title, PvRect& rt, std::string style); - void add_col_button(PARAM* p, int col, std::vector vec_title); - void setOperateVisible(int row, bool v, int id = -1); - - int item_posy(int row); - - int border_id(); - - int rows(); - - int colums(); + int rowCount(); + int colCount(); std::vector data(); PvTable::Head& header(int col); private: - int pvid_; - PvRect rect_; + Options option; + PvRect rect; - int border_id_; + std::vector vecHeads; + std::vector vecRows; + std::vector vecData; - std::vector vecHead_; - std::vector vecRows_; + vector>> vecOper; + int nrow; + int ncol; - std::vector vecData_; - - vector>> vecOpt_; - int nRow_; - int nCol_; - - string item_base_style_; - - Options option_; - - unordered_map> vec_col_item_btn_; - - CallbackTableOpt cbOperate_ = nullptr; - - int posCol_ = 0; + int posCol = 0; + + CallbackTableOpt callbackOper = nullptr; }; @@ -144,9 +122,6 @@ private: // 下一页按钮 int btnNext = PV_ID_NUL; - // 页面跳转按钮 - int btn_gopage_ = PV_ID_NUL; - int btnActive = PV_ID_NUL; int labelInfo = PV_ID_NUL; @@ -170,7 +145,7 @@ public: std::shared_ptr addPop(int w, int h, int w0, std::string name, std::vector primaryKeys); - void showPop(int index, std::string optr, Fields& fields); + void showPop(int index, std::string optr, Fields fields); void hidePop(int index); void updateDataFromDB(); @@ -186,6 +161,7 @@ public: std::shared_ptr table; std::shared_ptr pagination; std::vector> vecPop; + Fields curRowData; }; #endif // ! _PvTable_H_ \ No newline at end of file diff --git a/src/pv/PvUser.cpp b/src/pv/PvUser.cpp index e69de29..5c96dc1 100644 --- a/src/pv/PvUser.cpp +++ b/src/pv/PvUser.cpp @@ -0,0 +1,7 @@ +#include "PvUser.h" + +void PvUser::reset() +{ + mapEventCallback.clear(); + pvidIndex = 0; +} \ No newline at end of file diff --git a/src/pv/PvUser.h b/src/pv/PvUser.h index 0bb5334..ec6cbc9 100644 --- a/src/pv/PvUser.h +++ b/src/pv/PvUser.h @@ -6,6 +6,8 @@ class PvUser { public: + void reset(); + int pvidIndex = 0; std::map> mapEventCallback; }; \ No newline at end of file diff --git a/src/pv/pages/MaskPageHome.cpp b/src/pv/pages/MaskPageHome.cpp index 11f988a..486fa77 100644 --- a/src/pv/pages/MaskPageHome.cpp +++ b/src/pv/pages/MaskPageHome.cpp @@ -11,12 +11,9 @@ 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); + //auto& appdata = Application::data(); + //auto pagination = new PvPagination(p, 0, 600, 160, 20); + //pagination->setPage(5, 10); } @@ -192,7 +189,6 @@ public: } }; - //background-color: qlineargradient(x1:0, y1:0, x2:1, y2:0,stop:1 rgba(0,255,240,200),stop:0 rgba(0,255,240,0)); int MaskPageHome::initUI(EPvCode pvcode) { @@ -317,11 +313,8 @@ int MaskPageHome::initUI(EPvCode pvcode) this->updateUI(); - - TestPage(p); - return 0; } @@ -342,7 +335,7 @@ void MaskPageHome::updateUI() } pvSetText(p, ui.labelRunDays, "100 天"); - pvSetText(p, ui.labelRunDays, (Utils::toStr(stationNum) + " 个").c_str()); + pvSetText(p, ui.labelStationNum, (Utils::toStr(stationNum) + " 个").c_str()); pvSetText(p, ui.labelEnergyCapacity, (Utils::toStr(energyCapacity) + " kWh").c_str()); pvSetText(p, ui.labelIncome, (Utils::toStr(incomeTotal) + " 元").c_str()); pvSetText(p, ui.labelStorageIn, (Utils::toStr(electStorageIn) + " kWh").c_str()); diff --git a/src/pv/pages/MaskPageRunning.cpp b/src/pv/pages/MaskPageRunning.cpp index ae7d194..397fee3 100644 --- a/src/pv/pages/MaskPageRunning.cpp +++ b/src/pv/pages/MaskPageRunning.cpp @@ -1,6 +1,10 @@ #include "MaskPageRunning.h" #include "app/Application.h" #include "app/AppData.h" +#include "app/Station.h" +#include "app/Device.h" +#include "common/JsonN.h" + static int CreateParamLabel(PARAM* p, int parent, int x, int y, std::string k, std::string v) { @@ -8,21 +12,21 @@ static int CreateParamLabel(PARAM* p, int parent, int x, int y, std::string k, s return PvApp::label(p, parent, x += 70, y, 120, 30, v, qss::LABEL_VAL); } -class BoxCard : PvObject +class CardDevice : PvObject { public: - static std::shared_ptr create(PARAM* p, int parent, int x, int y) + static std::shared_ptr create(PARAM* p, int parent, int x, int y) { - return std::make_shared(p, parent, x, y); + return std::make_shared(p, parent, x, y); } - BoxCard(PARAM* p, int parent, int x, int y) : PvObject(p) + CardDevice(PARAM* p, int parent, int x, int y) : PvObject(p) { card_ = PvApp::label(p, parent, x, y, 400, 250, "", qss::QSS_CARD_DEVICE); PvApp::label(p, card_, 10, 10, 60, 60, "", "border:none; background-color: rgb(39, 158, 145);"); - ui.code = PvApp::label(p, card_, 80, 10, 100, 20, ""); - ui.name = PvApp::label(p, card_, 80, 30, 100, 20, ""); + ui.name = PvApp::label(p, card_, 80, 10, 100, 20, ""); + ui.code = PvApp::label(p, card_, 80, 30, 100, 20, ""); ui.type = PvApp::label(p, card_, 80, 50, 100, 20, "", qss::label(14, "rgb(8, 161, 249)")); int x1 = 190; @@ -40,14 +44,14 @@ public: // 默认创建 10 个参数标签: int n = 10; - vecParamLabel_.resize(n); + vecParamLabel.resize(n); for (int i = 0; i vecKeys) { - for (int i = 0; i> vecParamLabel_; + std::vector> vecParamLabel; std::map mapParam_; }; @@ -106,135 +110,199 @@ MaskPageRunning::MaskPageRunning(PARAM* p) : PvMask(p) int MaskPageRunning::initUI(EPvCode pvcode) { + auto& appdata = Application::data(); + PvApp::label(p, 0, 10, 100, 1900, 850, "", "background-color: rgb(5, 47, 77); border-radius: 10px;"); PvApp::label(p, 0, 10, 150, 220, 790, "", "background-color: rgb(8, 54, 91); border-radius: 10px;"); int workspace = PvApp::label(p, 0, 240, 150, 1670, 790, "", "background-color: rgba(8, 54, 91, 0); border-radius: 10px;"); - std::vector vecStationNames = Application::data().getStationNames(); + std::vector vecStationNames = appdata.getStationNames(); PvApp::label(p, 0, 20, 110, 80, 30, "场站切换", "color:white; font: bold 16px;"); - PvApp::combox(p, 0, 100, 110, 150, 30, vecStationNames); + ui.comboxStation = PvApp::combox(p, 0, 100, 110, 150, 30, vecStationNames); if (vecStationNames.size() > 0) { - station_ = Application::data().getStationByName(vecStationNames[0]); + activeStation = appdata.getStationByName(vecStationNames[0]); } PvApp::label(p, 0, 320, 110, 80, 30, "运行模式", "color:white; font: bold 16px;"); - PvApp::combox(p, 0, 400, 110, 200, 30, Application::data().getWorkModes()); + ui.comboxWorkMode = PvApp::combox(p, 0, 400, 110, 200, 30, appdata.getWorkModes(), activeStation->id - 1); PvApp::label(p, 0, 670, 110, 80, 30, "策略名称", "color:white; font: bold 16px;"); - PvApp::combox(p, 0, 750, 110, 200, 30, Application::data().getPolicyNames()); + PvApp::combox(p, 0, 750, 110, 200, 30, appdata.getPolicyNames()); int x = 20, y = 160, w = 200, h = 180; // 储能设备 { - ui.storage.name = "储能设备"; - int pid = ui.storage.box = PvApp::label(p, 0, x, y, w, h, "", qss::LABEL_BOX); - PvApp::label(p, pid, 10, 0, w-10, 30, ui.storage.name, qss::LABEL_TITLE); - - ui.storage.btn = PvApp::button(p, pid, 0, 0, w, h, "", "background-color: transparent;"); - ui.storage.workspace = PvApp::widget(p, workspace, 0, 0, 1670, 790); - pvHide(p, ui.storage.workspace); + this->initModule(storage, "储能设备", x, y, w, h); + storage.workspace = PvApp::widget(p, workspace, 0, 0, 1670, 790); + pvHide(p, storage.workspace); // 创建信息卡片 { vecCard_.resize(12); for (int i=0; iinitModule(solar, "光伏设备", x, y += (h+10), w, h); + solar.workspace = storage.workspace; + pvHide(p, solar.workspace); } // 充电设备 { - ui.charge.name = "充电设备"; - int pid = ui.charge.box = PvApp::label(p, 0, x, y += (h+10), w, h, "", qss::LABEL_BOX); - PvApp::label(p, pid, 10, 0, w-10, 30, ui.solar.name, qss::LABEL_TITLE); - - ui.charge.btn = PvApp::button(p, pid, 0, 0, w, h, "", "background-color: transparent;"); - ui.charge.workspace = ui.storage.workspace; - pvHide(p, ui.charge.workspace); + this->initModule(charge, "充电设备", x, y += (h+10), w, h); + charge.workspace = storage.workspace; + pvHide(p, charge.workspace); } // 环境与安防设备 { - ui.security.name = "环境与安防设备"; - int pid = ui.security.box = PvApp::label(p, 0, x, y += (h+10), w, h, "", qss::LABEL_BOX); - PvApp::label(p, pid, 10, 0, w-10, 30, ui.security.name, qss::LABEL_TITLE); + this->initModule(security, "环境与安防设备", x, y += (h+10), w, h); + security.workspace = PvApp::widget(p, workspace, 0, 0, 1670, 790); + pvHide(p, security.workspace); - ui.security.btn = PvApp::button(p, pid, 0, 0, w, h, "", "background-color: transparent;"); - ui.security.workspace = PvApp::widget(p, workspace, 0, 0, 1670, 790); - pvHide(p, ui.security.workspace); + { + std::string style = qss::label(20, "white; padding: 0px 0px 0px 10px;", "rgb(8, 54, 91)", "none; border-radius: 5px;"); + for (int i = 0; i<12; ++i) + { + int w = 320, h = 240; + int x = 0+(w+10)*(i%4), y = 0+(h+10)*(i/4); + int cardId = PvApp::label(p, security.workspace, x, y, w, h, "监控点 " + std::to_string(i+1), style); + pvSetAlignment(p, cardId, AlignLeft | AlignTop); + + PvApp::label(p, cardId, 10, 40, w-20, h-50, "", qss::label(14, "", "", "8px solid black; border-radius: 0px;")); + PvApp::image(p, cardId, (w-77)*0.5, 40+(h-40-77)*0.5, 77, 77, "play1.png"); + } + } + { + + int w = 320, h = 50; + int pid = PvApp::label(p, security.workspace, 1320, 10, w, 200, "环境温度信息", qss::label(20, "", "", "none;")); + pvSetAlignment(p, pid, AlignLeft | AlignTop); + PvApp::label(p, pid, 0, 30, w, 5, "", qss::QSS_UNDERLINE); + + int x = 0, y = 50; + PvApp::label(p, pid, x, y, w, h, "", qss::label(14, "", "rgb(16, 105, 125)", "none; border-radius: 5px 5px 0px 0px;")); + PvApp::label(p, pid, x, y, w, h*2, "", qss::label(14, "", "", "1px solid rgb(12, 255, 251); border-radius: 5px;")); + { + w = w/3; + PvApp::labelCenter(p, pid, x, y, w, h, "点位"); + PvApp::labelCenter(p, pid, x+w, y, w, h, "温度"); + PvApp::labelCenter(p, pid, x+w*2, y, w, h, "湿度"); + PvApp::labelCenter(p, pid, x, y += h, w, h, "#1"); + PvApp::labelCenter(p, pid, x+w, y, w, h, "20 ℃"); + PvApp::labelCenter(p, pid, x+w*2, y, w, h, "30 %"); + } + } + { + int w = 320, h = 50; + int pid = PvApp::label(p, security.workspace, 1320, 200, w, 500, "消防信息", qss::label(20, "", "", "none;")); + pvSetAlignment(p, pid, AlignLeft | AlignTop); + PvApp::label(p, pid, 0, 30, w, 5, "", qss::QSS_UNDERLINE); + + int x = 0, y = 50; + PvApp::label(p, pid, x, y, w, h, "", qss::label(14, "", "rgb(16, 105, 125)", "none; border-radius: 5px 5px 0px 0px;")); + PvApp::label(p, pid, x, y, w, h*9, "", qss::label(14, "", "", "1px solid rgb(12, 255, 251); border-radius: 5px;")); + { + w = w/2; + PvApp::labelCenter(p, pid, x, y, w, h, "点位"); + PvApp::labelCenter(p, pid, x+w, y, w, h, "烟感状态"); + PvApp::labelCenter(p, pid, x, y += h, w, h, "#1"); + PvApp::labelCenter(p, pid, x+w, y, w, h, "XXX"); + PvApp::labelCenter(p, pid, x, y += h, w, h, "#2"); + PvApp::labelCenter(p, pid, x+w, y, w, h, "XXX"); + PvApp::labelCenter(p, pid, x, y += h, w, h, "#3"); + PvApp::labelCenter(p, pid, x+w, y, w, h, "XXX"); + PvApp::labelCenter(p, pid, x, y += h, w, h, "#4"); + PvApp::labelCenter(p, pid, x+w, y, w, h, "XXX"); + PvApp::labelCenter(p, pid, x, y += h, w, h, "#5"); + PvApp::labelCenter(p, pid, x+w, y, w, h, "XXX"); + PvApp::labelCenter(p, pid, x, y += h, w, h, "#6"); + PvApp::labelCenter(p, pid, x+w, y, w, h, "XXX"); + PvApp::labelCenter(p, pid, x, y += h, w, h, "#7"); + PvApp::labelCenter(p, pid, x+w, y, w, h, "XXX"); + PvApp::labelCenter(p, pid, x, y += h, w, h, "#8"); + PvApp::labelCenter(p, pid, x+w, y, w, h, "XXX"); + } + } } - activeBoxPanel(ui.storage); + activeBoxPanel(&storage); { - + PvApp::bind(p, PvEvent::TEXT_EVENT, ui.comboxStation, [=](std::string s) { this->onComboxStation(s); }); + PvApp::bind(p, PvEvent::TEXT_EVENT, ui.comboxWorkMode, [=](std::string s) { this->onComboxWorkMode(s); }); } return 0; } +void MaskPageRunning::initModule(Module& module, std::string name, int x, int y, int w, int h) +{ + module.name = name; + + int deviceNum = activeStation->getDeviceNumByGroup(name); + int pid = module.widget = PvApp::label(p, 0, x, y, w, h, "", qss::LABEL_BOX); + PvApp::label(p, module.widget, 10, 20, w, 30, module.name, qss::LABEL_TITLE); + pvSetAlignment(p, module.widget, AlignTop | AlignLeft); + module.labelPower = PvApp::lineLabel(p, pid, PvRect(10, 80, 180, 30), 70, "总功率:", "60 W"); + module.labelNum = PvApp::lineLabel(p, pid, PvRect(10, 110, 180, 30), 70, "设备数量:", std::to_string(deviceNum).c_str()); + module.btn = PvApp::button(p, pid, 0, 0, w, h, "", "background-color: transparent;"); +} + + EPvCode MaskPageRunning::onEventButton(int pvid) { - if (pvid == ui.storage.btn) { activeBoxPanel(ui.storage); } - else if (pvid == ui.solar.btn) { activeBoxPanel(ui.solar); } - else if (pvid == ui.charge.btn) { activeBoxPanel(ui.charge); } - else if (pvid == ui.security.btn) { activeBoxPanel(ui.security); } - + if (pvid == storage.btn) { activeBoxPanel(&storage); } + else if (pvid == solar.btn) { activeBoxPanel(&solar); } + else if (pvid == charge.btn) { activeBoxPanel(&charge); } + else if (pvid == security.btn) { activeBoxPanel(&security); } return EPvCode::NUL; } -std::map> mapDeviceTypes = +void MaskPageRunning::activeBoxPanel(Module* module) { - {"储能设备", {"储能预制舱", "储能电池", "储能电池", "储能电池"}}, - {"光伏设备", {"光伏板", "光伏板", "光伏板", "光伏板", "光伏板", "光伏板", "光伏板", "光伏板"}}, - {"充电设备", {"充电桩", "充电桩", "充电桩", "充电桩", "充电桩", "充电桩", "充电桩", "充电桩", "充电桩", "充电桩"}}, -}; -std::map> mapDeviceParams = -{ - {"储能预制舱", {"运行模式", "冷却方式", "实时电压", "额定电压", "实时电流", "额定电流", "实时功率", "额定功率", "功率因数", "电池容量"}}, - {"储能电池", {"实时电压", "额定电压", "实时电流", "额定电流", "实时功率", "额定功率", "功率因数", "电池容量"}}, - {"逆变器", {"实时电压", "额定电压", "实时电流", "额定电流", "实时功率", "额定功率", "功率因数"}}, - {"光伏板", {"实时电压", "额定电压", "实时电流", "额定电流", "实时功率", "额定功率", "功率因数"}}, - {"充电桩", {"实时电压", "额定电压", "实时电流", "额定电流", "实时功率", "额定功率", "功率因数"}}, -}; + if (activeBox) + { + pvSetStyleSheet(p, activeBox->widget, qss::LABEL_BOX.c_str()); + pvHide(p, activeBox->workspace); + } + activeBox = module; + if (activeBox) + { + pvSetStyleSheet(p, activeBox->widget, qss::QSS_BOX_ACTIVE.c_str()); + pvShow(p, activeBox->workspace); + } -void MaskPageRunning::activeBoxPanel(BoxPanel& panel) -{ - static int activeBox = PV_ID_NUL; - static int activeWorkspace = PV_ID_NUL; - if (activeBox != PV_ID_NUL) { pvSetStyleSheet(p, activeBox, qss::LABEL_BOX.c_str()); } - if (activeBox = panel.box) { pvSetStyleSheet(p, activeBox, qss::QSS_BOX_ACTIVE.c_str()); } - - if (activeWorkspace != PV_ID_NUL) { pvHide(p, activeWorkspace); } - if (activeWorkspace = panel.workspace) { pvShow(p, activeWorkspace); } - - - if (panel.workspace != ui.security.workspace) + auto& appdata = Application::data(); + if (activeBox->workspace != security.workspace) { - std::vector vecDeviceInfo = mapDeviceTypes[panel.name]; + // 更新卡片: + std::vector> vecDevice; + activeStation->getDeviceByGroup(module->name, vecDevice); + + pvSetText(p, module->labelNum, std::to_string(vecDevice.size()).c_str()); // 读取储能设备信息 for (int i = 0; itype); + if (typeDef) + { + std::vector vecKeys; + NJson::parse(typeDef->fieldsAttr.value("key"), vecKeys); + card->setCard(typeDef->name, device->name, device->code); + card->setParamkeys(vecKeys); + } card->show(1); - card->setCard(type, type+"-"+std::to_string(i), type+"-"+std::to_string(i)); - card->setParamkeys(mapDeviceParams[type]); } else { @@ -242,4 +310,38 @@ void MaskPageRunning::activeBoxPanel(BoxPanel& panel) } } } +} + +void MaskPageRunning::updateWorkspace() +{ + +} + +void MaskPageRunning::onComboxStation(std::string stationName) +{ + if (!activeStation) return; + + auto& appdata = Application::data(); + activeStation = appdata.getStationByName(stationName); + + // 更新运行模式和策略 + { + int index = activeStation->workModeId - 1; + if (index < 0) { index = 0; } + pvSetCurrentItem(p, ui.comboxWorkMode, index); + } + + this->activeBoxPanel(activeBox); +} + +void MaskPageRunning::onComboxWorkMode(std::string modeName) +{ + if (!activeStation) return; + + auto& appdata = Application::data(); + + int workModeId = appdata.getWorkModeIdByName(modeName); + activeStation->setWorkMode(workModeId); + + } \ No newline at end of file diff --git a/src/pv/pages/MaskPageRunning.h b/src/pv/pages/MaskPageRunning.h index b97c3b2..4a9cda8 100644 --- a/src/pv/pages/MaskPageRunning.h +++ b/src/pv/pages/MaskPageRunning.h @@ -2,34 +2,48 @@ #include "pv/PvApp.h" -class BoxCard; +class CardDevice; class Station; class MaskPageRunning : public PvMask { public: - struct BoxPanel { + struct Module { std::string name; - int box; + int widget; int btn; int workspace; + + int labelPower; + int labelNum; }; MaskPageRunning(PARAM* p); int initUI(EPvCode pvcode); + void initModule(Module& module, std::string name, int x, int y, int w, int h); virtual EPvCode onEventButton(int pvid); - void activeBoxPanel(BoxPanel& panel); + void activeBoxPanel(Module* module); + + void updateWorkspace(); + + void onComboxStation(std::string stationName); + void onComboxWorkMode(std::string modeName); struct { - BoxPanel storage; - BoxPanel solar; - BoxPanel charge; - BoxPanel security; + int comboxStation; + int comboxWorkMode; } ui; - std::vector> vecCard_; - std::shared_ptr station_ = nullptr; + Module storage; + Module solar; + Module charge; + Module security; + + Module* activeBox {}; + + std::vector> vecCard_; + std::shared_ptr activeStation = nullptr; }; \ No newline at end of file diff --git a/src/pv/pages/PageSysmgr.cpp b/src/pv/pages/PageSysmgr.cpp index 6eb00f3..19de603 100644 --- a/src/pv/pages/PageSysmgr.cpp +++ b/src/pv/pages/PageSysmgr.cpp @@ -5,7 +5,9 @@ #include "database/Dao.h" #include "database/DataModelDef.h" #include "common/Snowflake.h" +#include "pv/pages/PanelPolicy.h" +std::vector g_comboxList_isOpen = {"启用", "禁用"}; /////////////////////////////////////////////////////////////////////////////////////////////////// // === PageUser === @@ -42,7 +44,7 @@ void PageUser::onQueryTable(PageInfo& pageInfo, std::vector& result) { DAO::queryUserList(pageInfo, result); } -void PageUser::onOperate(int row, int col, std::string oper) +void PageUser::onOperate(int irow, int icol, std::string oper) { if (oper == POP_OPER_NEW) { @@ -52,7 +54,7 @@ void PageUser::onOperate(int row, int col, std::string oper) } else if (oper == POP_OPER_EDIT) { - this->showPop(0, oper, table->getRowData(row)); + this->showPop(0, oper, table->row(irow)); } }; std::string PageUser::onValidation(std::shared_ptr pop, Fields& fields) @@ -84,7 +86,7 @@ PageRole::PageRole(PARAM* p, EPvCode pvcode) : PageTable(p) { auto& appdata = Application::data(); - table->addHead(DMRole::ROLE_ID, "角色编号", 200, {}); + table->addHead(DMRole::ROLE_ID, "角色编号", 180, {}); table->addHead(DMRole::NAME, "角色名称", 200, {}); table->addHead(DMRole::DESCRIBE, "角色描述", 900, {}); table->addHead(DMRole::IS_OPEN, "是否启用", 200, appdata.mapping.isopen); @@ -97,7 +99,7 @@ PageRole::PageRole(PARAM* p, EPvCode pvcode) : PageTable(p) auto pop = this->addPop(500, 600, 180, "角色信息", {DMUser::USER_ID}); pop->addParamLineEdit(DMRole::ROLE_ID, "编号", x, y, false); pop->addParamLineEdit(DMRole::NAME, "名称", x, y += h); - pop->addParamCombox(DMUser::IS_OPEN, "是否启用", x, y += h, {"启用", "禁用"}); + pop->addParamCombox(DMUser::IS_OPEN, "是否启用", x, y += h, g_comboxList_isOpen); pop->addParamTextEdit(DMRole::DESCRIBE, "描述", x, y += h); } @@ -105,7 +107,7 @@ void PageRole::onQueryTable(PageInfo& pageInfo, std::vector& result) { DAO::queryRoleList(pageInfo, result); } -void PageRole::onOperate(int row, int col, std::string oper) +void PageRole::onOperate(int irow, int icol, std::string oper) { if (oper == POP_OPER_NEW) { @@ -115,7 +117,7 @@ void PageRole::onOperate(int row, int col, std::string oper) } else if (oper == POP_OPER_EDIT) { - this->showPop(0, oper, table->getRowData(row)); + this->showPop(0, oper, table->row(irow)); } } std::string PageRole::onValidation(std::shared_ptr pop, Fields& fields) @@ -133,7 +135,7 @@ std::string PageRole::onPopConfirm(std::shared_ptr pop, Fields& fie PagePermission::PagePermission(PARAM* p, EPvCode pvcode) : PageTable(p) { auto& appdata = Application::data(); - table->addHead(DMPermission::PERMISSION_ID, "权限编号", 200, {}); + table->addHead(DMPermission::PERMISSION_ID, "权限编号", 180, {}); table->addHead(DMPermission::NAME, "权限名称", 200, {}); table->addHead(DMPermission::DESCRIBE, "权限描述", 900, {}); table->addHead(DMPermission::IS_OPEN, "是否启用", 200, appdata.mapping.isopen); @@ -143,17 +145,17 @@ PagePermission::PagePermission(PARAM* p, EPvCode pvcode) : PageTable(p) 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, "角色信息", {DMPermission::PERMISSION_ID}); + auto pop = this->addPop(500, 600, 240, "角色信息", {DMPermission::PERMISSION_ID}); pop->addParamLineEdit(DMPermission::PERMISSION_ID, "编号", x, y, false); pop->addParamLineEdit(DMPermission::NAME, "名称", x, y += h); - pop->addParamCombox(DMPermission::IS_OPEN, "是否启用", x, y += h, {"启用", "禁用"}); + pop->addParamCombox(DMPermission::IS_OPEN, "是否启用", x, y += h, g_comboxList_isOpen); pop->addParamTextEdit(DMPermission::DESCRIBE, "描述", x, y += h); } void PagePermission::onQueryTable(PageInfo& pageInfo, std::vector& result) { DAO::queryPermissionList(pageInfo, result); } -void PagePermission::onOperate(int row, int col, std::string oper) +void PagePermission::onOperate(int irow, int icol, std::string oper) { if (oper == POP_OPER_NEW) { @@ -163,7 +165,7 @@ void PagePermission::onOperate(int row, int col, std::string oper) } else if (oper == POP_OPER_EDIT) { - this->showPop(0, oper, table->getRowData(row)); + this->showPop(0, oper, table->row(irow)); } } std::string PagePermission::onValidation(std::shared_ptr pop, Fields& fields) @@ -180,7 +182,7 @@ std::string PagePermission::onPopConfirm(std::shared_ptr pop, Field PageStation::PageStation(PARAM* p, EPvCode pvcode) : PageTable(p) { auto& appdata = Application::data(); - table->addHead(DMStation::STATION_ID, "场站编号", 200, {}); + table->addHead(DMStation::STATION_ID, "场站编号", 180, {}); table->addHead(DMStation::NAME, "场站名称", 200, {}); table->addHead(DMStation::ADDRESS, "地址", 200, {}); table->addHead(DMStation::LONGITUDE, "经度", 200, {}); @@ -200,13 +202,13 @@ PageStation::PageStation(PARAM* p, EPvCode pvcode) : PageTable(p) pop->addParamLineEdit(DMStation::LONGITUDE, "经度", x, y += h); pop->addParamLineEdit(DMStation::LATITUDE, "维度", x, y += h); pop->addParamLineEdit(DMStation::TEL, "电话", x, y += h); - pop->addParamCombox(DMStation::STATUS, "状态", x, y += h, {"启用", "禁用"}); + pop->addParamCombox(DMStation::STATUS, "状态", x, y += h, g_comboxList_isOpen); } void PageStation::onQueryTable(PageInfo& pageInfo, std::vector& result) { DAO::queryStationList(pageInfo, result); } -void PageStation::onOperate(int row, int col, std::string oper) +void PageStation::onOperate(int irow, int icol, std::string oper) { if (oper == POP_OPER_NEW) { @@ -216,7 +218,7 @@ void PageStation::onOperate(int row, int col, std::string oper) } else if (oper == POP_OPER_EDIT) { - this->showPop(0, oper, table->getRowData(row)); + this->showPop(0, oper, table->row(irow)); } } std::string PageStation::onValidation(std::shared_ptr pop, Fields& fields) @@ -246,6 +248,7 @@ PageDevice::PageDevice(PARAM* p, EPvCode pvcode) : PageTable(p) { auto& appdata = Application::data(); table->addHead(DMDevice::DEVICE_ID, "设备编号", 120, {}); + table->addHead(DMDevice::STATION_ID, "所属场站", 120, appdata.mapping.stationName); table->addHead(DMDevice::TYPE, "设备类型", 120, appdata.mapping.deviceType); table->addHead(DMDevice::NAME, "设备名称", 180, {}); table->addHead(DMDevice::CODE, "设备编码", 160, {}); @@ -262,20 +265,21 @@ 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, "类型", 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); - pop->addParamLineEdit(DMDevice::FACTORY, "厂家", x+w, y); - pop->addParamLineEdit(DMDevice::TEL, "厂家电话", x, y += h); - pop->addParamCombox(DMDevice::IS_OPEN, "是否启用", x+w, y, {"启用", "禁用"}); - pop->addParamLineEdit(DMDevice::ATTRS, "设备参数", x, y += h); + pop->addParamCombox(DMDevice::STATION_ID, "所属场站", x+w, y, appdata.getStationNames()); + pop->addParamCombox(DMDevice::TYPE, "类型", x, y += h, appdata.getDeviceTypeNames()); + pop->addParamLineEdit(DMDevice::NAME, "设备名称", x+w, y); + pop->addParamLineEdit(DMDevice::CODE, "设备编码", x, y += h); + pop->addParamLineEdit(DMDevice::MODEL, "设备型号", x+w, y); + pop->addParamLineEdit(DMDevice::FACTORY, "厂家", x, y += h); + pop->addParamLineEdit(DMDevice::TEL, "厂家电话", x+w, y); + pop->addParamCombox(DMDevice::IS_OPEN, "是否启用", x, y += h, g_comboxList_isOpen); + pop->addParamLineEdit(DMDevice::ATTRS, "设备参数", x + w, y); } void PageDevice::onQueryTable(PageInfo& pageInfo, std::vector& result) { DAO::queryDeviceList(pageInfo, result); } -void PageDevice::onOperate(int row, int col, std::string oper) +void PageDevice::onOperate(int irow, int icol, std::string oper) { if (oper == POP_OPER_NEW) { @@ -285,7 +289,7 @@ void PageDevice::onOperate(int row, int col, std::string oper) } else if (oper == POP_OPER_EDIT) { - this->showPop(0, oper, table->getRowData(row)); + this->showPop(0, oper, table->row(irow)); } } std::string PageDevice::onValidation(std::shared_ptr pop, Fields& fields) @@ -316,12 +320,12 @@ std::string PageDevice::onPopConfirm(std::shared_ptr pop, Fields& f PagePolicy::PagePolicy(PARAM* p, EPvCode pvcode) : PageTable(p) { auto& appdata = Application::data(); - table->addHead(DMPolicy::POLICY_ID, "策略编号", 200, {}); - table->addHead(DMPolicy::TYPE, "策略类型", 200, {}); - table->addHead(DMPolicy::NAME, "策略名称", 200, {}); - table->addHead(DMPolicy::DESCRIBE, "策略描述", 400, {}); - table->addHead(DMPolicy::VALUE, "策略参数", 400, {}); - table->addHead(DMPolicy::IS_OPEN, "是否启用", 200, appdata.mapping.isopen); + table->addHead(DMPolicy::POLICY_ID, "策略编号", 120, {}); + table->addHead(DMPolicy::TYPE, "策略类型", 120, appdata.mapping.policyType); + table->addHead(DMPolicy::NAME, "策略名称", 160, {}); + table->addHead(DMPolicy::DESCRIBE, "策略描述", 300, {}); + table->addHead(DMPolicy::VALUE, "策略参数", 900, {}); + table->addHead(DMPolicy::IS_OPEN, "是否启用", 80, appdata.mapping.isopen); table->addOperate({ "编辑"}); int btnNew = PvApp::button(p, PV_ID_MAIN, 20, 160, 80, 35, POP_OPER_NEW); @@ -331,36 +335,78 @@ PagePolicy::PagePolicy(PARAM* p, EPvCode pvcode) : PageTable(p) 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); + pop->addParamLineEdit(DMPolicy::NAME, "策略名称", x, y); + pop->addParamCombox(DMPolicy::TYPE, "策略类型", x+w, y, Application::data().getPolicyTypeNames()); + pop->addParamCombox(DMPolicy::IS_OPEN, "是否启用", x, y+=40, g_comboxList_isOpen), + //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); + + pop->setCallbackTextEvent([=](std::string k, std::string text) { + if (k == DMPolicy::TYPE) + { + int policyTypeId = Application::data().getPolicyTypeId(text); + this->setPanel(policyTypeId, "{}"); + } + }); + + panelPeak = std::make_shared(p, pop->widget(), 10, y+=40, 1600, 540); + panelRequire = std::make_shared(p, pop->widget(), 10, y, 620, 220); + panelSelf = std::make_shared(p, pop->widget(), 10, y, 620, 220); } - +} +void PagePolicy::setPanel(int policyTypeId, std::string attrVal) +{ + auto pop = vecPop[0]; + panelPeak->show(0); + panelRequire->show(0); + panelSelf->show(0); + if (policyTypeId == 1) + { + panelPeak->parseAttr(attrVal); + panelPeak->show(1); + pop->resize(1620, 800); + } + else if (policyTypeId == 2) + { + panelRequire->parseAttr(attrVal); + panelRequire->show(1); + pop->resize(640, 600); + } + else if (policyTypeId == 3) + { + panelSelf->parseAttr(attrVal); + panelSelf->show(1); + pop->resize(640, 600); + } +} +std::string PagePolicy::getPanelAttr(int policyTypeId) +{ + std::string attrVal = "{}"; + if (policyTypeId == 1) { attrVal = panelPeak->dumpAttr(); } + else if (policyTypeId == 2) { attrVal = panelRequire->dumpAttr(); } + else if (policyTypeId == 3) { attrVal = panelSelf->dumpAttr(); } + return attrVal; } void PagePolicy::onQueryTable(PageInfo& pageInfo, std::vector& result) { DAO::queryPolicyList(pageInfo, result); } -void PagePolicy::onOperate(int row, int col, std::string oper) +void PagePolicy::onOperate(int irow, int icol, std::string oper) { if (oper == POP_OPER_NEW) { - Fields fields; - this->showPop(0, oper, fields); + this->showPop(0, oper, Fields()); + this->setPanel(1, {}); } else if (oper == POP_OPER_EDIT) { - 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); + int policyTypeId = curRowData.get(DMPolicy::TYPE); + std::string attrVal = curRowData.value(DMPolicy::VALUE); + + this->setPanel(policyTypeId, attrVal); + this->showPop(0, oper, curRowData); } } std::string PagePolicy::onValidation(std::shared_ptr pop, Fields& fields) @@ -369,9 +415,23 @@ std::string PagePolicy::onValidation(std::shared_ptr pop, Fields& f }; std::string PagePolicy::onPopConfirm(std::shared_ptr pop, Fields& fields) { - - - + if (pop->status == POP_OPER_NEW) + { + int policyTypeId = fields.get(DMPolicy::TYPE); + fields.set(DMPolicy::VALUE, this->getPanelAttr(policyTypeId)); + Errcode err = DAO::insertPolicy(fields); + if (err == Errcode::OK) { return ""; } + else { return "系统错误"; } + } + else if (pop->status == POP_OPER_EDIT) + { + int policyTypeId = curRowData.get(DMPolicy::TYPE); + fields.set(DMPolicy::POLICY_ID, policyTypeId); + fields.set(DMPolicy::VALUE, this->getPanelAttr(policyTypeId)); + Errcode err = DAO::updatePolicyById(fields); + if (err == Errcode::OK) { return ""; } + else { return "系统错误"; } + } return ""; } /////////////////////////////////////////////////////////////////////////////////////////////////// @@ -390,7 +450,7 @@ void PageSyslog::onQueryTable(PageInfo& pageInfo, std::vector& result) { DAO::querySystemLogList(pageInfo, result); } -void PageSyslog::onOperate(int row, int col, std::string oper) +void PageSyslog::onOperate(int irow, int icol, std::string oper) { if (oper == POP_OPER_NEW) { @@ -400,7 +460,7 @@ void PageSyslog::onOperate(int row, int col, std::string oper) } else if (oper == POP_OPER_EDIT) { - this->showPop(0, oper, table->getRowData(row)); + this->showPop(0, oper, table->row(irow)); } } std::string PageSyslog::onValidation(std::shared_ptr pop, Fields& fields) @@ -429,7 +489,7 @@ void PageAlertlog::onQueryTable(PageInfo& pageInfo, std::vector& result) { //DAO::queryAlertLogList(pageInfo, result); } -void PageAlertlog::onOperate(int row, int col, std::string oper) +void PageAlertlog::onOperate(int irow, int icol, std::string oper) { if (oper == POP_OPER_NEW) { @@ -439,7 +499,7 @@ void PageAlertlog::onOperate(int row, int col, std::string oper) } else if (oper == POP_OPER_EDIT) { - this->showPop(0, oper, table->getRowData(row)); + this->showPop(0, oper, table->row(irow)); } } std::string PageAlertlog::onValidation(std::shared_ptr pop, Fields& fields) diff --git a/src/pv/pages/PageSysmgr.h b/src/pv/pages/PageSysmgr.h index 7c8f8dc..8cefd81 100644 --- a/src/pv/pages/PageSysmgr.h +++ b/src/pv/pages/PageSysmgr.h @@ -71,17 +71,24 @@ public: /////////////////////////////////////////////////////////////////////////////////////////////////// // === PagePolicy === +class PanelPolicyPeak; +class PanelPolicyRequire; +class PanelPolicySelf; class PagePolicy : public PageTable { public: PagePolicy(PARAM* p, EPvCode pvcode); + void setPanel(int policyTypeId, std::string attrVal); + std::string getPanelAttr(int policyTypeId); virtual void onQueryTable(PageInfo& pageInfo, std::vector& result) override; virtual void onOperate(int row, int col, std::string oper) override; virtual std::string onValidation(std::shared_ptr pop, Fields& fields) override; virtual std::string onPopConfirm(std::shared_ptr pop, Fields& fields) override; - + std::shared_ptr panelPeak {}; + std::shared_ptr panelRequire {}; + std::shared_ptr panelSelf {}; }; /////////////////////////////////////////////////////////////////////////////////////////////////// diff --git a/src/pv/pages/PanelPolicy.cpp b/src/pv/pages/PanelPolicy.cpp index bd4a089..eba66db 100644 --- a/src/pv/pages/PanelPolicy.cpp +++ b/src/pv/pages/PanelPolicy.cpp @@ -2,30 +2,55 @@ #include "app/Application.h" #include "app/AppData.h" #include "common/JsonN.h" +#include "common/Utils.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);}"; 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 { background-color: transparent; border: 1px solid rgb(255, 89, 0); color: rgb(255, 89, 0); border-radius: 3px; font: bold 14px;}" +"QComboBox QAbstractItemView { border: 1px solid gray; background-color: rgba(8, 54, 91); border-radius: 3px; color:white;}" "QComboBox::drop-down { border-radius: 5px; width: 30px; }" -"QComboBox:disabled { color:rgb(150,150,150);}"; +"QComboBox:disabled {border: none; color: gray;}"; 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 { background-color: transparent; border: 1px solid rgb(255, 255, 0); color: rgb(255, 255, 0); border-radius: 3px; font: bold 14px;}" +"QComboBox QAbstractItemView { border: 1px solid gray; background-color: rgba(8, 54, 91); border-radius: 3px; color:white;}" "QComboBox::drop-down { border-radius: 5px; width: 30px; }" -"QComboBox:disabled { color:rgb(150,150,150);}"; +"QComboBox:disabled { border: none; color: gray;}"; 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 { background-color: transparent; border: 1px solid rgb(121, 191, 226); color: rgb(121, 191, 226); border-radius: 3px; font: bold 14px;}" +"QComboBox QAbstractItemView { border: 1px solid gray; background-color: rgba(8, 54, 91); border-radius: 3px; color:white;}" "QComboBox::drop-down { border-radius: 5px; width: 30px; }" -"QComboBox:disabled { color:rgb(150,150,150);}"; +"QComboBox:disabled { border: none; color: gray;}"; 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 { background-color: transparent; border: 1px solid rgb(0, 255, 58);color: rgb(0, 255, 58); border-radius: 3px; font: bold 14px;}" +"QComboBox QAbstractItemView { border: 1px solid gray; background-color: rgba(8, 54, 91); border-radius: 3px; color:white;}" "QComboBox::drop-down { border-radius: 5px; width: 30px; }" -"QComboBox:disabled { color:rgb(150,150,150);}"; +"QComboBox:disabled { border: none; color: gray;}"; static std::string GetPeriodQss(int v) { @@ -51,182 +76,180 @@ static int GetPeriod(std::string text) else if (text == "低谷") { return 4; } else { return 3; } } -PanelPolicyPeak::PanelPolicyPeak(PARAM* p, int parent, int x, int y, int w, int h) : PvObject(p) +PanelPolicyPeak::PanelPolicyPeak(PARAM* p, int parent, int ix, int iy, int iw, int ih) : PvObject(p) { data.vecPeriods.resize(12, std::vector(24, 3)); ui.parent = parent; - ui.widget = PvApp::widget(p, parent, x, y, w, h); + pvid = PvApp::widget(p, parent, ix, iy, iw, ih); auto& appdata = Application::data(); std::vector vecPeriods = {"尖峰", "高峰", "平段", "低谷"}; ui.vecComboxs.resize(12, std::vector(24, PV_ID_NUL)); + + int x = 0, y = 10, w = 64, h = 30; + for (int row = 0; row<=12; row++) { - 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) { - for (int col = 0; col<=24; ++col) + std::string text; + if (row == 0) { - 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); - }); - } - + 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, pvid, 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, pvid, x+w*col, y+h*row+3, w-3, 24, vecPeriods, periodVal-1); + 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); - }); } } + + const int H = 24; + int labelPolicy = PvApp::label(p, pvid, 20, y = 420, 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, pvid, 10, y+=30, 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, 90, H); + PvApp::label(p, labelChargeT, y0 += 100, 0, 10, H, "--"); + ui.attr1TimeCharge1 = PvApp::timeEdit(p, labelChargeT, y0 =+ 20, 0, 90, H); + + int labelDischargeT = PvApp::label(p, ui.label1, 320, 30, 300, H, "放电时间"); + ui.attr1TimeDischarge0 = PvApp::timeEdit(p, labelDischargeT, y0 = 70, 0, 90, H); + PvApp::label(p, labelDischargeT, y0 += 100, 0, 10, H, "--"); + ui.attr1TimeDischarge1 = PvApp::timeEdit(p, labelDischargeT, y0 += 20, 0, 90, 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::textedit(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::textedit(p, labelPowerOut, y0 += 70, 0, 80, H, ""); + } + + ui.label2 = PvApp::label(p, pvid, 630, y, 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::textedit(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::textedit(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, pvid, 10, y+=100, 90, 30, "DUMP"); +// PvApp::bind(p, PvEvent::BUTTON_EVENT, btn, [=](std::string) { +// XLOGD() << dumpAttr(); +// }); +// } +// { +// int btn = PvApp::button(p, pvid, 110, y, 90, 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, pvid, 210, y, 90, 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":""}, +//{"charge_end":"23:59:00","charge_power":0.0,"charge_start":"20:00:00","discharge_end":"13:00","discharge_power":0.0,"discharge_start":"09:00"} +//], +//"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() @@ -284,7 +307,7 @@ void PanelPolicyPeak::parseAttr(std::string str) periodVal = tmpVal; // 更新UI (时段下拉列表) auto combox = ui.vecComboxs[row][col]; - pvSetCurrentItem(p, combox, periodVal); + pvSetCurrentItem(p, combox, periodVal-1); pvSetStyleSheet(p, combox, GetPeriodQss(periodVal).c_str()); } } @@ -333,7 +356,6 @@ void PanelPolicyPeak::parseAttr(std::string str) } - std::string PanelPolicyPeak::dumpAttr() { NJsonNode jsonroot; @@ -363,4 +385,117 @@ std::string PanelPolicyPeak::dumpAttr() } jsonroot["cycle"] = nodeCycle; return jsonroot.dump(); +} + + +PanelPolicyRequire::PanelPolicyRequire(PARAM* p, int parent, int ix, int iy, int iw, int ih) : PvObject(p) +{ + pvid = PvApp::widget(p, parent, ix, iy, iw, ih); + + int y = 10; + const int H = 24; + ui.label1 = PvApp::label(p, pvid, 10, y, 600, 80, "响应削峰指令", qss::label(14, "", "", "1px solid rgb(49, 130, 141)")); + pvSetAlignment(p, ui.label1, AlignLeft | AlignTop); + { + ui.dischargeSoc = PvApp::lineTextedit(p, ui.label1, PvRect(10, 40, 270, H), 100, "电池SOC阈值", ""); + ui.dischargePower = PvApp::lineTextedit(p, ui.label1, PvRect(300, 40, 270, H), 70, "放电功率", ""); + } + + ui.label2 = PvApp::label(p, pvid, 10, y += 90, 600, 90, "响应填谷指令", qss::label(14, "", "", "1px solid rgb(49, 130, 141)")); + pvSetAlignment(p, ui.label2, AlignLeft | AlignTop); + { + ui.chargeSoc = PvApp::lineTextedit(p, ui.label2, PvRect(10, 40, 270, H), 100, "电池SOC阈值", ""); + ui.chargePower = PvApp::lineTextedit(p, ui.label2, PvRect(300, 40, 270, H), 70, "充电功率", ""); + } + PvApp::bind(p, PvEvent::TEXT_EVENT, ui.dischargeSoc, [=](std::string s) { + data.dischargeSoc = Utils::toInt(s); + }); + PvApp::bind(p, PvEvent::TEXT_EVENT, ui.dischargePower, [=](std::string s) { + data.dischargePower = Utils::toInt(s); + }); + PvApp::bind(p, PvEvent::TEXT_EVENT, ui.chargeSoc, [=](std::string s) { + data.chargeSoc = Utils::toInt(s); + }); + PvApp::bind(p, PvEvent::TEXT_EVENT, ui.chargePower, [=](std::string s) { + data.chargePower = Utils::toInt(s); + }); +} + +void PanelPolicyRequire::parseAttr(std::string str) +{ + NJsonNode jsonroot; + bool ret = NJson::parse(str, jsonroot); + if (!ret) + { + return; + } + + NJson::read(jsonroot, "charge_soc", data.chargeSoc); + NJson::read(jsonroot, "charge_power", data.chargePower); + NJson::read(jsonroot, "discharge_soc", data.dischargeSoc); + NJson::read(jsonroot, "discharge_power", data.dischargePower); + + // 更新UI + pvSetText(p, ui.chargeSoc, std::to_string(data.chargeSoc).c_str()); + pvSetText(p, ui.chargePower, std::to_string(data.chargePower).c_str()); + pvSetText(p, ui.dischargeSoc, std::to_string(data.dischargeSoc).c_str()); + pvSetText(p, ui.dischargePower, std::to_string(data.dischargePower).c_str()); +} + +std::string PanelPolicyRequire::dumpAttr() +{ + NJsonNode jsonroot; + jsonroot["discharge_soc"] = data.dischargeSoc; + jsonroot["discharge_power"] = data.dischargePower; + jsonroot["charge_soc"] = data.chargeSoc; + jsonroot["charge_power"] = data.chargePower; + return jsonroot.dump(); +} + +PanelPolicySelf::PanelPolicySelf(PARAM* p, int parent, int ix, int iy, int iw, int ih) : PvObject(p) +{ + pvid = PvApp::widget(p, parent, ix, iy, iw, ih); + + int y = 10; + const int H = 24; + ui.label1 = PvApp::label(p, pvid, 10, y, 600, 120, "响应削峰指令", qss::label(14, "", "", "1px solid rgb(49, 130, 141)")); + pvSetAlignment(p, ui.label1, AlignLeft | AlignTop); + { + ui.usedSoc = PvApp::lineTextedit(p, ui.label1, PvRect(10, 40, 270, H), 100, "自用电量比值", ""); + ui.gridSoc = PvApp::lineTextedit(p, ui.label1, PvRect(10, 80, 270, H), 100, "上网电量比值", ""); + + ui.chargePower = PvApp::lineTextedit(p, ui.label1, PvRect(320, 40, 250, H), 70, "充电功率", ""); + ui.dischargePower = PvApp::lineTextedit(p, ui.label1, PvRect(320, 80, 250, H), 70, "放电功率", ""); + } +} + +void PanelPolicySelf::parseAttr(std::string str) +{ + NJsonNode jsonroot; + bool ret = NJson::parse(str, jsonroot); + if (!ret) + { + return; + } + + NJson::read(jsonroot, "used_soc", data.usedSoc); + NJson::read(jsonroot, "grid_soc", data.gridSoc); + NJson::read(jsonroot, "charge_power", data.chargePower); + NJson::read(jsonroot, "discharge_power", data.dischargePower); + + // 更新UI + pvSetText(p, ui.usedSoc, std::to_string(data.usedSoc).c_str()); + pvSetText(p, ui.gridSoc, std::to_string(data.gridSoc).c_str()); + pvSetText(p, ui.chargePower, std::to_string(data.chargePower).c_str()); + pvSetText(p, ui.dischargePower, std::to_string(data.dischargePower).c_str()); +} + +std::string PanelPolicySelf::dumpAttr() +{ + NJsonNode jsonroot; + jsonroot["used_soc"] = data.usedSoc; + jsonroot["grid_soc"] = data.gridSoc; + jsonroot["charge_power"] = data.chargePower; + jsonroot["discharge_power"] = data.dischargePower; + return jsonroot.dump(); } \ No newline at end of file diff --git a/src/pv/pages/PanelPolicy.h b/src/pv/pages/PanelPolicy.h index dcc083c..3bdb02b 100644 --- a/src/pv/pages/PanelPolicy.h +++ b/src/pv/pages/PanelPolicy.h @@ -6,7 +6,7 @@ class PanelPolicyPeak : public PvObject { public: - PanelPolicyPeak(PARAM* p, int parent, int x, int y, int w, int h); + PanelPolicyPeak(PARAM* p, int parent, int ix, int iy, int iw, int ih); void updateUI(); @@ -17,7 +17,6 @@ public: struct { int parent {}; - int widget {PV_ID_NUL}; int label1 {PV_ID_NUL}; int label2 {PV_ID_NUL}; @@ -72,4 +71,59 @@ public: ChargeAttr attr2; std::vector> vecPeriods; } data; +}; + + +class PanelPolicyRequire : public PvObject +{ +public: + PanelPolicyRequire(PARAM* p, int parent, int ix, int iy, int iw, int ih); + + void parseAttr(std::string str); + std::string dumpAttr(); + + struct { + int label1; + int label2; + + int chargeSoc; + int chargePower; + + int dischargeSoc; + int dischargePower; + } ui; + + struct { + int chargeSoc {}; + int chargePower {}; + + int dischargeSoc {}; + int dischargePower {}; + } data; +}; + +class PanelPolicySelf : public PvObject +{ +public: + PanelPolicySelf(PARAM* p, int parent, int x, int y, int w, int h); + + void parseAttr(std::string str); + std::string dumpAttr(); + + struct { + int label1; + int usedSoc; + int gridSoc; + + int chargePower; + int dischargePower; + } ui; + + struct { + int usedSoc {}; + int gridSoc {}; + + int chargePower {}; + int dischargePower {}; + } data; }; \ No newline at end of file diff --git a/src/pv/pvmain.cpp b/src/pv/pvmain.cpp index 40f2151..838fd2a 100644 --- a/src/pv/pvmain.cpp +++ b/src/pv/pvmain.cpp @@ -4,7 +4,7 @@ void pvInitResource(PARAM* p) { - pvDownloadFile(p, "assets/pv/bkg.png"); + pvDownloadFile(p, "assets/pv/bkgHead.png"); pvDownloadFile(p, "assets/pv/icon1.png"); pvDownloadFile(p, "assets/pv/icon2.png"); pvDownloadFile(p, "assets/pv/icon3.png"); @@ -14,6 +14,7 @@ void pvInitResource(PARAM* p) pvDownloadFile(p, "assets/pv/map.png"); pvDownloadFile(p, "assets/pv/mapMarker.png"); pvDownloadFile(p, "assets/pv/downFill.png"); + pvDownloadFile(p, "assets/pv/play1.png"); } int onPvThreadCleanup(void* ptr) @@ -29,6 +30,7 @@ int pvMain(PARAM* p) // 管理客户端的连接信息 PvUser pvuser; PvApp::setPvUser(p, &pvuser); + XLOGD() << "Browser client connect: s= " << int(p->s) << ", user=" << int(&pvuser); // 客户端断开时回调 pvSetCleanup(p, onPvThreadCleanup, p); @@ -38,7 +40,7 @@ int pvMain(PARAM* p) while (1) { - // 重置控件的ID值 + // 重置控件的ID值、回调函数表 PvApp::reset(p); std::shared_ptr mask; @@ -48,14 +50,13 @@ int pvMain(PARAM* p) pvStartDefinition(p, 2048); if (mask) { - pvSetFont(p, PV_ID_MAIN, "微软雅黑", 12, 1, 0, 0, 0); + pvSetStyleSheet(p, PV_ID_MAIN, "QWidget { color: white; font: bold 14px 微软雅黑; }"); mask->initUI(); } pvQLayoutVbox(p, 0, -1); pvEndDefinition(p); XLOGD() << "===>>> pvidIndex=" << PvApp::pvid(p); - char event[MAX_EVENT_LENGTH]; char text[MAX_EVENT_LENGTH]; int pvid; @@ -68,37 +69,36 @@ int pvMain(PARAM* p) if (mask) { PvApp::dispatch(p, pvEventId, pvid, text); - switch (pvEventId) { case NULL_EVENT: { pvcode = mask->onEventNull(pvid); } break; case BUTTON_EVENT: { - pvcode = mask->onEventButton(pvid); std::cout << "EVENT: (" << pvid << ")BUTTON\n"; + pvcode = mask->onEventButton(pvid); std::cout << "PvEvent: (" << pvid << ") BUTTON\n"; } 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; + case TEXT_EVENT: { std::cout << "PvEvent: (" << pvid << ") TEXT_EVENT\n"; } break; + case SLIDER_EVENT: { std::cout << "PvEvent: (" << pvid << ") SLIDER_EVENT\n"; } break; + case CHECKBOX_EVENT: { std::cout << "PvEvent: (" << pvid << ") CHECKBOX_EVENT\n"; } break; + case RADIOBUTTON_EVENT: { std::cout << "PvEvent: (" << pvid << ") RADIOBUTTON_EVENT\n"; } break; + case GL_IDLE_EVENT: { std::cout << "PvEvent: (" << pvid << ") GL_IDLE_EVENT\n"; } break; + case GL_PAINT_EVENT: { std::cout << "PvEvent: (" << pvid << ") GL_PAINT_EVENT\n"; } break; + case GL_INITIALIZE_EVENT: { std::cout << "PvEvent: (" << pvid << ") GL_INITIALIZE_EVENT\n"; } break; + case GL_RESIZE_EVENT: { std::cout << "PvEvent: (" << pvid << ") GL_RESIZE_EVENT\n"; } break; + case TAB_EVENT: { std::cout << "PvEvent: (" << pvid << ") TAB_EVENT\n"; } break; + case TABLE_CLICKED_EVENT: { std::cout << "PvEvent: (" << pvid << ") TABLE_CLICKED_EVENT\n"; } break; + case TABLE_TEXT_EVENT: { std::cout << "PvEvent: (" << pvid << ") TABLE_TEXT_EVENT\n"; } break; + case SELECTION_EVENT: { std::cout << "PvEvent: (" << pvid << ") SELECTION_EVENT\n"; } break; + case CLIPBOARD_EVENT: { std::cout << "PvEvent: (" << pvid << ") CLIPBOARD_EVENT\n"; } break; + case BUTTON_PRESSED_EVENT: { /*std::cout << "PvEvent: (" << pvid << ") BUTTON_PRESSED_EVENT\n";*/ } break; + case BUTTON_RELEASED_EVENT: { /*std::cout << "PvEvent: (" << pvid << ") BUTTON_RELEASED_EVENT\n";*/ } break; + case RIGHT_MOUSE_EVENT: { std::cout << "PvEvent: (" << pvid << ") RIGHT_MOUSE_EVENT\n"; } break; + case KEYBOARD_EVENT: { std::cout << "PvEvent: (" << pvid << ") KEYBOARD_EVENT\n"; } break; + case PLOT_MOUSE_MOVED_EVENT: { std::cout << "PvEvent: (" << pvid << ") PLOT_MOUSE_MOVED_EVENT\n"; } break; + case PLOT_MOUSE_PRESSED_EVENT: { std::cout << "PvEvent: (" << pvid << ") PLOT_MOUSE_PRESSED_EVENT\n"; } break; + case PLOT_MOUSE_RELEASED_EVENT: { std::cout << "PvEvent: (" << pvid << ") PLOT_MOUSE_RELEASED_EVENT\n"; } break; + case USER_EVENT: { std::cout << "PvEvent: (" << pvid << ") USER_EVENT\n"; } break; + case MOUSE_OVER_EVENT: { /*std::cout << "PvEvent: (" << pvid << ") MOUSE_OVER_EVENT\n";*/ } break; default: {} break; } } diff --git a/src/widgets/uihelper.cpp b/src/widgets/uihelper.cpp index 47523e9..e856305 100644 --- a/src/widgets/uihelper.cpp +++ b/src/widgets/uihelper.cpp @@ -114,10 +114,10 @@ void QUI::combox(QComboBox& comb, QWidget* parent, int x, int y, int w, int h, s } } -void QUI::lineedit(QLineEdit& lineEdit, QWidget* parent, int x, int y, int w, int h) +void QUI::lineedit(QLineEdit& edit, QWidget* parent, int x, int y, int w, int h) { - lineEdit.setParent(parent); - lineEdit.setGeometry(x, y, w, h); + edit.setParent(parent); + edit.setGeometry(x, y, w, h); } void QUI::setBackground(QWidget* w, std::string name, QColor color, std::string border) @@ -742,7 +742,7 @@ void TableBase::setOperate(std::vector vecOperate, std::function vd) +void TableBase::setRow(int row, std::vector vd) { int rowCount = widget_->rowCount(); if (row >= rowCount) diff --git a/src/widgets/uihelper.h b/src/widgets/uihelper.h index 1ccdd84..59a32ce 100644 --- a/src/widgets/uihelper.h +++ b/src/widgets/uihelper.h @@ -56,7 +56,7 @@ public: static void combox(QComboBox& comb, QWidget* parent, int x, int y, int w, int h, std::vector items, std::string v=""); - static void lineedit(QLineEdit& lineEdit, QWidget* parent, int x, int y, int w, int h); + static void lineedit(QLineEdit& edit, QWidget* parent, int x, int y, int w, int h); static void setBackground(QWidget* w, std::string name, QColor color=QColor(29, 54, 102), std::string border="border-radius:5px;"); }; @@ -170,7 +170,7 @@ public: void setOperate(std::vector vecOperate, std::function cb); - void setRowData(int row, std::vector vd); + void setRow(int row, std::vector vd); void clear();