transmitterswitch.cpp 50 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180118111821183118411851186118711881189119011911192119311941195119611971198119912001201120212031204120512061207120812091210121112121213121412151216121712181219122012211222122312241225122612271228122912301231123212331234123512361237123812391240124112421243124412451246124712481249125012511252125312541255125612571258125912601261126212631264126512661267126812691270127112721273127412751276127712781279128012811282128312841285128612871288128912901291129212931294129512961297129812991300130113021303130413051306130713081309131013111312131313141315131613171318131913201321132213231324132513261327132813291330133113321333133413351336133713381339134013411342134313441345134613471348134913501351135213531354135513561357135813591360136113621363136413651366136713681369137013711372137313741375137613771378137913801381138213831384138513861387138813891390139113921393139413951396139713981399140014011402140314041405140614071408140914101411141214131414141514161417141814191420142114221423142414251426142714281429143014311432143314341435143614371438143914401441144214431444144514461447144814491450145114521453145414551456145714581459146014611462146314641465146614671468146914701471147214731474147514761477147814791480148114821483148414851486148714881489149014911492149314941495149614971498149915001501150215031504150515061507150815091510151115121513151415151516151715181519152015211522152315241525152615271528152915301531153215331534153515361537153815391540154115421543154415451546154715481549155015511552155315541555155615571558155915601561156215631564156515661567156815691570157115721573157415751576157715781579158015811582158315841585158615871588158915901591159215931594159515961597159815991600160116021603160416051606160716081609161016111612161316141615161616171618161916201621162216231624162516261627162816291630163116321633163416351636163716381639164016411642164316441645164616471648164916501651165216531654165516561657165816591660166116621663166416651666166716681669167016711672167316741675
  1. #include "transmitterswitch.h"
  2. #include "ui_transmitterswitch.h"
  3. #include <QFile>
  4. #include <QList>
  5. #include <memory>
  6. #include <QLayout>
  7. #include <QScrollBar>
  8. #include "LHQLogAPI.h"
  9. #include "pBtnUserData2.h"
  10. #include "FromWebAPI.h"
  11. #include "TransmitterSwitchInfo.h"
  12. #include "savetotemplate.h"
  13. #include "importtemplate.h"
  14. #include "warning.h"
  15. #include "tipwidget.h"
  16. #include "UIStyleManager.h"
  17. #include "PlanData.h"
  18. #include "plancard.h"
  19. #include "flowlayout.h"
  20. #include "managerplan.h"
  21. #include "importtemplate.h"
  22. #include "copytoother.h"
  23. #include "templatemanager.h"
  24. #include "FromSQLite.h"
  25. TransmitterSwitch::TransmitterSwitch(QWidget *parent) :
  26. QWidget(parent),
  27. ui(new Ui::TransmitterSwitch)
  28. {
  29. ui->setupUi(this);
  30. /* 创建一个布局 */
  31. QVBoxLayout* layout = new QVBoxLayout(parent);
  32. layout->setMargin(0);
  33. layout->setSpacing(0);
  34. parent->setLayout(layout);
  35. layout->addWidget(this);
  36. /* 创建一个流式布局,存放卡片 */
  37. m_flowlayout = new FlowLayout(ui->scrollAreaContents_Card, 0, m_cardHorSpacing, m_cardVerSpacing);
  38. // m_flowlayout->setContentsMargins(0, 0, 0, 0);
  39. // m_flowlayout->setSpacing(200);
  40. ui->scrollAreaContents_Card->setLayout(m_flowlayout);
  41. /* 创建WebAPI实例 */
  42. m_fromWebAPI = new FromWebAPI;
  43. /* 设置“默认计划”按钮可点击 */
  44. ui->pBtn_defaultPlan->setCheckable(true);
  45. ui->pBtn_allFrequency->setCheckable(true);
  46. connect(ui->pBtn_allFrequency, &QPushButton::clicked, this, &TransmitterSwitch::do_selectFrequencyBtn);
  47. /* 设置提示文本 */
  48. m_tipText = new QLabel(this);
  49. m_tipText->resize(936,56);
  50. m_tipText->setObjectName("label_TipText");
  51. m_tipText->setText(R"(按时刻执行模式:即以时刻点为单位进行执行,若某日既为普通日和特殊日,在某一时刻皆有执行动作,将优先执行特殊日在此时刻所计划的动作。
  52. 按天执行模式:即以天为单位进行执行,若某日既为普通日和特殊日,则当日一整天优先执行特殊日所计划的动作,普通日计划当日不再执行。)");
  53. m_tipText->hide();
  54. QPoint pos = ui->label_Tip->mapTo(this, ui->label_Tip->pos());
  55. m_tipText->move(pos.x() + 2, pos.y() + 2 ); /* 去掉阴影的宽度和高度 */
  56. ui->label_Tip->installEventFilter(this);
  57. /* 设置默认值 */
  58. ui->pBtn_defaultPlan->setChecked(true);
  59. ui->rBtn_moment->setChecked(true);
  60. /* 连接信号和槽 */
  61. connect(ui->pBtn_addPlan, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnAddExecPlan);
  62. connect(ui->pBtn_importPlan, &QPushButton::clicked, this, &TransmitterSwitch::do_importData);
  63. connect(ui->pBtn_exportPlan, &QPushButton::clicked, this, &TransmitterSwitch::do_exportData);
  64. connect(ui->pBtn_editPlan, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnModifyExecPlan);
  65. connect(ui->pBtn_refresh, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnRefresh);
  66. connect(ui->pBtn_defaultPlan, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnIsOpenPlan);
  67. connect(ui->rBtn_moment, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnExecMode);
  68. connect(ui->rBtn_day, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnExecMode);
  69. // connect(ui->pBtn_clearPlan, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnClearPlan);
  70. connect(ui->pBtn_deletePlan, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnClearPlan);
  71. connect(ui->pBtn_cloneToOther, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnCopyToOther);
  72. connect(ui->pBtn_templateManager, &QPushButton::clicked, this, &TransmitterSwitch::do_pBtnManageTemplate);
  73. /* 设置QSS */
  74. connect(&EPUIStyle, &UIStyleManager::signal_qssChanged, this, &TransmitterSwitch::do_setUIStyle);
  75. /* 设置默认的皮肤 */
  76. EPUIStyle.setUIStyle(enum_UIStyle::UI_Dark);
  77. /* 设置默认点击的按钮 */
  78. ui->pBtn_allFrequency->setChecked(true);
  79. }
  80. TransmitterSwitch::~TransmitterSwitch()
  81. {
  82. if(m_tipText != nullptr)
  83. {
  84. delete m_tipText;
  85. m_tipText = nullptr;
  86. }
  87. if(m_fromWebAPI != nullptr)
  88. {
  89. delete m_fromWebAPI;
  90. m_fromWebAPI = nullptr;
  91. }
  92. if(m_fromSQLite != nullptr)
  93. {
  94. delete m_fromSQLite;
  95. m_fromSQLite = nullptr;
  96. }
  97. delete ui;
  98. }
  99. /* 设置样式表路径,给弹窗页面使用,不需要包含最后的white,black */
  100. void TransmitterSwitch::setQSSPath(const QString &qssPath)
  101. {
  102. if(qssPath.isEmpty())
  103. {
  104. return;
  105. }
  106. /* 去掉最后的“/” */
  107. // if(qssPath.endsWith("/"))
  108. // {
  109. // EPUIStyle.setQSSPath(qssPath.left(qssPath.length() - 1));
  110. // } else
  111. // {
  112. // EPUIStyle.setQSSPath(qssPath);
  113. // }
  114. }
  115. /**
  116. * @brief 设置WebAPI信息
  117. *
  118. * @param url WebAPI地址
  119. * @param serID 数据库ID
  120. * @param serKey 限制的关键字
  121. */
  122. void TransmitterSwitch::setWebAPIInfo(const QString &url, const QString &serverID, const QString &serverKey)
  123. {
  124. if(m_fromWebAPI == nullptr)
  125. {
  126. m_fromWebAPI = new FromWebAPI;
  127. }
  128. if(url.isEmpty() || serverID.isEmpty() || serverKey.isEmpty())
  129. {
  130. LH_WRITE_ERROR("WebAPI info is empty");
  131. return;
  132. }
  133. m_fromWebAPI->initWebApi(url, serverID, serverKey);
  134. /* 获取支持的设备 */
  135. ChnContainer.clearAllChannel();
  136. m_fromWebAPI->getChannelInfo(ChnContainer.getMapChannel());
  137. /* 创建获取到的卡片信息 */
  138. createAllCard();
  139. }
  140. /* 初始化webAPI,重载版 */
  141. void TransmitterSwitch::setWebAPIInfo(const InitData& data)
  142. {
  143. setWebAPIInfo(data.url, data.serverID, data.serverKey);
  144. }
  145. /**
  146. * @brief 获取EQM数据库计划,包括所有的配置信息
  147. *
  148. */
  149. void TransmitterSwitch::getExecPlanFromEQM()
  150. {
  151. /* 判断是在线还是离线模式 */
  152. if(!GInfo.isOnlineDB())
  153. {
  154. LH_WRITE_LOG(QString("当前为离线模式,无法获取计划"));
  155. return;
  156. }
  157. /* 获取页面的配置信息 */
  158. if(m_fromWebAPI->getConfigData(CfgData.getMapConfigData()))
  159. {
  160. // TipWidget::display(TipWidget::OPERATOR_OK, "获取配置成功", this);
  161. }else {
  162. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取配置失败", this);
  163. return;
  164. }
  165. /* 设置计划配置 */
  166. auto& mapConfig = CfgData.getMapConfigData();
  167. for(auto begin = mapConfig.begin(), end = mapConfig.end(); begin != end; begin++)
  168. {
  169. if(begin->key == static_cast<int>(enum_ExecPlanConfig::OpenPlan))
  170. {
  171. ui->pBtn_defaultPlan->setChecked(begin->value == 1 ? true : false);
  172. }
  173. else if(begin->key == static_cast<int>(enum_ExecPlanConfig::ExecMode))
  174. {
  175. if(begin->value == 0)
  176. {
  177. ui->rBtn_moment->setChecked(true);
  178. }else {
  179. ui->rBtn_day->setChecked(true);
  180. }
  181. }
  182. }
  183. /* 判断是指定了频率还是全部频率 */
  184. if(!GInfo.isOneFrequency())
  185. {
  186. /* 所有频率 */
  187. QMap<int, QList<OnePlanItemInfo>> mapPlan;
  188. if(m_fromWebAPI->getExecPlanData(mapPlan))
  189. {
  190. /* 先清空所有的计划 */
  191. PData.clearAllPlanItem();
  192. /* 遍历所有的频率 */
  193. for(auto begin = mapPlan.begin(), end = mapPlan.end(); begin != end; begin++)
  194. {
  195. auto pCard = PData.findPlanCard(begin.key());
  196. if(pCard != nullptr)
  197. {
  198. pCard->setPlanList(begin.value());
  199. }
  200. }
  201. TipWidget::display(TipWidget::OPERATOR_OK, "获取计划成功", this);
  202. }else {
  203. TipWidget::display(TipWidget::OPERATOR_FAIL, QString("获取计划失败"), this);
  204. }
  205. }else
  206. {
  207. /* 指定频率 */
  208. QList<OnePlanItemInfo> listPlan;
  209. if(m_fromWebAPI->getExecPlanData(GInfo.getChannelInfo().ChannelID, listPlan))
  210. {
  211. /* 先清空所有的计划 */
  212. PData.clearAllPlanItem();
  213. /* 清空当前频率的计划 */
  214. auto pCard = PData.findPlanCard(GInfo.getChannelInfo().ChannelID);
  215. if(pCard != nullptr)
  216. {
  217. pCard->setPlanList(listPlan);
  218. }
  219. TipWidget::display(TipWidget::OPERATOR_OK, "获取计划成功", this);
  220. }else {
  221. TipWidget::display(TipWidget::OPERATOR_FAIL, QString("获取计划失败"), this);
  222. }
  223. }
  224. /* 调用回调函数 */
  225. if(m_trackCB != nullptr)
  226. {
  227. m_trackCB(2, g_mapTrack.value(2));
  228. }
  229. }
  230. /* 将计划保存到EQM数据库 */
  231. void TransmitterSwitch::saveExecPlanToEQM()
  232. {
  233. /* 判断是在线还是离线模式 */
  234. if(!GInfo.isOnlineDB())
  235. {
  236. LH_WRITE_LOG(QString("当前为离线模式,无法保存计划"));
  237. return;
  238. }
  239. QList<OnePlanItemInfo> list;
  240. /* 获取当前计划的执行模式 */
  241. int execType = 0;
  242. if(ui->rBtn_moment->isChecked())
  243. {
  244. execType = 0;
  245. } else
  246. {
  247. execType = 1;
  248. }
  249. /* 保存“默认计划”和“执行模式” */
  250. ConfigData config1;
  251. config1.key = static_cast<int>(enum_ExecPlanConfig::OpenPlan);
  252. config1.value = ui->pBtn_defaultPlan->isChecked() ? 1 : 0;
  253. config1.updateTime = QDateTime::currentDateTime();
  254. CfgData.updateConfigData(config1);
  255. ConfigData config2;
  256. config2.key = static_cast<int>(enum_ExecPlanConfig::ExecMode);
  257. config2.value = ui->rBtn_moment->isChecked() ? 0 : 1;
  258. config2.updateTime = QDateTime::currentDateTime();
  259. CfgData.updateConfigData(config2);
  260. /* 更新“计划是否更新”标志位,在更新前需要先获取数据库的标志位,如果依旧为1,那么本地是否更改都设置为1 */
  261. ConfigData config3;
  262. if(!m_fromWebAPI->getConfigData(static_cast<int>(enum_ExecPlanConfig::IsChanged), config3))
  263. {
  264. config3.key = static_cast<int>(enum_ExecPlanConfig::IsChanged);
  265. }
  266. /* 只要数据库和本地更新标志位有一个为true,说明还未被读走,则设置标志位为true */
  267. // if((config3.value == 1) || IData.isUpdate())
  268. // {
  269. // config3.value = 1;
  270. // }
  271. config3.updateTime = QDateTime::currentDateTime();
  272. CfgData.updateConfigData(config3);
  273. /* 将配置写入数据库 */
  274. m_fromWebAPI->insertConfigData(CfgData.getMapConfigData());
  275. /* 调用回调函数 */
  276. if(m_trackCB != nullptr)
  277. {
  278. m_trackCB(1, g_mapTrack.value(1));
  279. }
  280. }
  281. /* 亮/暗换肤,0是亮色,1是暗色 */
  282. void TransmitterSwitch::setUIStyle(int style)
  283. {
  284. if(style == 0)
  285. {
  286. EPUIStyle.setUIStyle(enum_UIStyle::UI_Light);
  287. }
  288. else if(style == 1)
  289. {
  290. EPUIStyle.setUIStyle(enum_UIStyle::UI_Dark);
  291. }else {
  292. LH_WRITE_ERROR(QString("错误的样式类型: %1").arg(style));
  293. }
  294. }
  295. /* 设置回调函数 */
  296. void TransmitterSwitch::setTrackCallBack(trackCallBack cb)
  297. {
  298. if(cb == nullptr)
  299. {
  300. return;
  301. }
  302. m_trackCB = cb;
  303. }
  304. /* 设置WebAPI路径,不获取数据,不创建卡片 */
  305. void TransmitterSwitch::setWebAPIInfoOnly(const InitData& data)
  306. {
  307. if(m_fromWebAPI == nullptr)
  308. {
  309. m_fromWebAPI = new FromWebAPI;
  310. }
  311. if(data.url.isEmpty() || data.serverID.isEmpty() || data.serverKey.isEmpty())
  312. {
  313. LH_WRITE_ERROR("WebAPI info is empty");
  314. return;
  315. }
  316. m_fromWebAPI->initWebApi(data.url, data.serverID, data.serverKey);
  317. }
  318. /* 设置频率信息,给离线版使用 */
  319. void TransmitterSwitch::setFrequencyInfo(const ExecPlanInfo& info, bool useOnlineDB)
  320. {
  321. /* 清空频率信息 */
  322. ChnContainer.clearAllChannel();
  323. /* 清空卡片 */
  324. PData.clearAllPlanItem();
  325. /* 清空所有按钮 */
  326. for(auto it = m_listFrequencyBtn.begin(); it != m_listFrequencyBtn.end(); ++it)
  327. {
  328. delete *it;
  329. }
  330. m_listFrequencyBtn.clear();
  331. ChannelInfo chnInfo;
  332. chnInfo.ChannelID = info.ChannelID;
  333. chnInfo.ChannelName = info.ChannelName;
  334. GInfo.setChannelInfo(chnInfo);
  335. GInfo.setDatabasePath(info.DatabasePath);
  336. LH_WRITE_LOG(QString("频率ID: %1, 频率名称: %2, 在线离线模式: %3")
  337. .arg(GInfo.getChannelInfo().ChannelID)
  338. .arg(GInfo.getChannelInfo().ChannelName)
  339. .arg(useOnlineDB ? "在线" : "离线"));
  340. /* 设置在线还是离线模式 */
  341. setUseOnlineDB(useOnlineDB);
  342. /* 设置频率模式,单频率模式或多频率 */
  343. if(GInfo.getChannelInfo().ChannelID < 0)
  344. {
  345. /* 多频率模式 */
  346. GInfo.setOneFrequency(false);
  347. } else
  348. {
  349. /* 单频率模式 */
  350. GInfo.setOneFrequency(true);
  351. setOneFrequencyMode();
  352. }
  353. /* 创建获取到的卡片信息 */
  354. createAllCard();
  355. // LH_WRITE_LOG_DEBUG(QString("创建频率卡片成功,频率ID:%1").arg(GInfo.getChannelInfo().ChannelID));
  356. }
  357. /* 设置一页的卡片数量 */
  358. void TransmitterSwitch::setOnePageCardNum(int horNum, int verNum)
  359. {
  360. if(horNum <= 0 || verNum <= 0)
  361. {
  362. LH_WRITE_ERROR(QString("错误的卡片数量: %1, %2").arg(horNum).arg(verNum));
  363. return;
  364. }
  365. m_cardHorNumber = horNum;
  366. m_cardVerNumber = verNum;
  367. update();
  368. }
  369. /* 清空卡片,用于ESM8C上位机关闭使用EQM数据库的时候调用 */
  370. void TransmitterSwitch::clearAll()
  371. {
  372. /* 删除所有的卡片 */
  373. PData.deleteAllCard();
  374. /* 删除所有按钮 */
  375. for(auto it = m_listFrequencyBtn.begin(); it != m_listFrequencyBtn.end(); ++it)
  376. {
  377. delete *it;
  378. }
  379. m_listFrequencyBtn.clear();
  380. /* 清空频率信息 */
  381. ChnContainer.clearAllChannel();
  382. }
  383. /* 获取一个频率的计划数据,只应用于本地数据库,下载到下位机用 */
  384. void TransmitterSwitch::getOnePlanData(QList<OnePlanItemInfo>* listPlan, ExecPlanConfig* config, int channelID)
  385. {
  386. // LH_WRITE_LOG_DEBUG(QString("当前是离线模式"));
  387. if(!GInfo.isOneFrequency())
  388. {
  389. LH_WRITE_LOG(QString("只应用于单个频率模式"));
  390. return;
  391. }
  392. if(listPlan == nullptr)
  393. {
  394. LH_WRITE_ERROR("传入的指针为空");
  395. return;
  396. }
  397. if(config == nullptr)
  398. {
  399. LH_WRITE_ERROR("传入的配置指针为空");
  400. return;
  401. }
  402. /* 获取唯一的频率卡片 */
  403. auto pCard = PData.findPlanCard(GInfo.getChannelInfo().ChannelID);
  404. if(pCard == nullptr)
  405. {
  406. LH_WRITE_ERROR("没有选中频率卡片");
  407. return;
  408. }
  409. pCard->getAllPlanInfo(*listPlan);
  410. /* 获取页面配置 */
  411. config->isUsingPlan = ui->pBtn_defaultPlan->isChecked() ? 1 : 0;
  412. config->execMdoe = ui->rBtn_moment->isChecked() ? 0 : 1;
  413. }
  414. /* 设置计划信息 */
  415. void TransmitterSwitch::setOnePlanData(QList<OnePlanItemInfo>& listPlan, ExecPlanConfig& config, int channelID)
  416. {
  417. /* 设置计划信息 */
  418. if(!GInfo.isOneFrequency())
  419. {
  420. LH_WRITE_LOG(QString("只应用于单个频率模式"));
  421. return;
  422. }
  423. /* 给计划设置频率信息 */
  424. for(auto& it : listPlan)
  425. {
  426. it.ChannelID = GInfo.getChannelInfo().ChannelID;
  427. it.ChannelName = GInfo.getChannelInfo().ChannelName;
  428. }
  429. /* 获取唯一的频率卡片 */
  430. auto pCard = PData.findPlanCard(GInfo.getChannelInfo().ChannelID);
  431. if(pCard == nullptr)
  432. {
  433. LH_WRITE_ERROR("没有选中频率卡片");
  434. return;
  435. }
  436. pCard->setPlanList(listPlan);
  437. /* 设置页面配置 */
  438. ui->pBtn_defaultPlan->setChecked(config.isUsingPlan == 1 ? true : false);
  439. if(config.execMdoe == 0)
  440. {
  441. ui->rBtn_moment->setChecked(true);
  442. }else {
  443. ui->rBtn_day->setChecked(true);
  444. }
  445. }
  446. /* 点击了添加计划按钮 */
  447. void TransmitterSwitch::do_pBtnAddExecPlan()
  448. {
  449. /* 创建新增窗口 */
  450. std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>(Enum_Mode::Mode_Add);
  451. /* 获取当前选中的窗口 */
  452. auto pCard = PData.getCurrentPlanCard();
  453. ChannelInfo chnInfo;
  454. if(pCard == nullptr)
  455. {
  456. LH_WRITE_LOG_DEBUG("没有选中频率卡片");
  457. }else {
  458. mp->setFrequencyID(pCard->getChannelInfo());
  459. }
  460. connect(mp.get(), &ManagerPlan::signal_saveTemplate, this, &TransmitterSwitch::do_saveTemplateToDB);
  461. mp->exec();
  462. /* 判断是否点击了OK */
  463. if(!mp->isOK())
  464. {
  465. return;
  466. }
  467. /* 获取计划信息 */
  468. auto& mapPlanInfo = mp->getPlanInfo();
  469. /* 遍历所有的频率 */
  470. bool isSuccess = true;
  471. for(auto begin = mapPlanInfo.begin(), end = mapPlanInfo.end(); begin != end; begin++)
  472. {
  473. /* 获取频率ID */
  474. int chnID = begin.key();
  475. /* 获取计划列表 */
  476. auto& list = begin.value();
  477. /* 查找这个频率的Card */
  478. auto pCard = PData.findPlanCard(chnID);
  479. if(pCard == nullptr)
  480. {
  481. LH_WRITE_ERROR(QString("没有找到频率ID为%1的卡片").arg(chnID));
  482. continue;
  483. }
  484. /* 设置计划列表 */
  485. pCard->setPlanList(list);
  486. /* 写入数据库 */
  487. QList<OnePlanItemInfo> listPlan;
  488. pCard->getAllPlanInfo(listPlan);
  489. if(!m_fromWebAPI->insertData(chnID, listPlan))
  490. {
  491. LH_WRITE_ERROR(QString("频率ID为%1的计划写入数据库失败").arg(chnID));
  492. isSuccess = false;
  493. TipWidget::display(TipWidget::OPERATOR_FAIL, QString("频率:%1 计划写入数据库失败!").arg(pCard->getChannelInfo().ChannelName), this);
  494. }
  495. }
  496. if(isSuccess)
  497. {
  498. TipWidget::display(TipWidget::OPERATOR_OK, "添加计划成功", this);
  499. }
  500. }
  501. /* 点击了修改按钮 */
  502. void TransmitterSwitch::do_pBtnModifyExecPlan()
  503. {
  504. /* 先判断是不是单频率模式,如果是,设置这个频率卡片被点击了 */
  505. if(GInfo.isOneFrequency())
  506. {
  507. auto pCard = PData.findPlanCard(GInfo.getChannelInfo().ChannelID);
  508. if(pCard != nullptr)
  509. {
  510. pCard->clickedCard();
  511. }
  512. }
  513. auto pCard = PData.getCurrentPlanCard();
  514. if(pCard == nullptr)
  515. {
  516. LH_WRITE_ERROR("没有选中频率卡片");
  517. TipWidget::display(TipWidget::OPERATOR_WARN, "没有选中频率卡片", this);
  518. return;
  519. }
  520. /* 创建新增窗口 */
  521. std::shared_ptr<ManagerPlan> mp = std::make_shared<ManagerPlan>(Enum_Mode::Mode_Modify);
  522. /* 设置频率信息 */
  523. mp->setFrequencyID(pCard->getChannelInfo());
  524. connect(mp.get(), &ManagerPlan::signal_saveTemplate, this, &TransmitterSwitch::do_saveTemplateToDB);
  525. mp->exec();
  526. /* 判断是否点击了OK */
  527. if(!mp->isOK())
  528. {
  529. return;
  530. }
  531. /* 获取计划信息 */
  532. auto& mapPlanInfo = mp->getPlanInfo();
  533. auto list = mapPlanInfo.find(pCard->getChannelInfo().ChannelID);
  534. pCard->setPlanList(*list);
  535. int chnID = pCard->getChannelInfo().ChannelID;
  536. QList<OnePlanItemInfo> listPlan;
  537. pCard->getAllPlanInfo(listPlan);
  538. if(!m_fromWebAPI->insertData(chnID, listPlan))
  539. {
  540. LH_WRITE_ERROR(QString("频率ID为%1的计划写入数据库失败").arg(chnID));
  541. TipWidget::display(TipWidget::OPERATOR_FAIL, QString("频率<%1>计划写入数据库失败").arg(pCard->getChannelInfo().ChannelName), this);
  542. }
  543. TipWidget::display(TipWidget::OPERATOR_OK, "修改计划成功", this);
  544. /* 调用回调函数 */
  545. if(m_trackCB != nullptr)
  546. {
  547. m_trackCB(1, g_mapTrack.value(1));
  548. }
  549. }
  550. /* 点击了刷新按钮 */
  551. void TransmitterSwitch::do_pBtnRefresh()
  552. {
  553. getExecPlanFromEQM();
  554. }
  555. /* 点击了“是否开启计划”按钮 */
  556. void TransmitterSwitch::do_pBtnIsOpenPlan()
  557. {
  558. /* 保存“默认计划”和“执行模式” */
  559. ConfigData config1;
  560. config1.key = static_cast<int>(enum_ExecPlanConfig::OpenPlan);
  561. config1.value = ui->pBtn_defaultPlan->isChecked() ? 1 : 0;
  562. config1.updateTime = QDateTime::currentDateTime();
  563. CfgData.updateConfigData(config1);
  564. /* 更新“计划是否更新”标志位,在更新前需要先获取数据库的标志位,如果依旧为1,那么本地是否更改都设置为1 */
  565. ConfigData config3;
  566. if(!m_fromWebAPI->getConfigData(static_cast<int>(enum_ExecPlanConfig::IsChanged), config3))
  567. {
  568. config3.key = static_cast<int>(enum_ExecPlanConfig::IsChanged);
  569. }
  570. /* 只要数据库和本地更新标志位有一个为true,说明还未被读走,则设置标志位为true */
  571. config3.value = 1;
  572. config3.updateTime = QDateTime::currentDateTime();
  573. CfgData.updateConfigData(config3);
  574. /* 将配置写入数据库 */
  575. m_fromWebAPI->insertConfigData(CfgData.getMapConfigData());
  576. }
  577. /* 点击了“执行模式”按钮 */
  578. void TransmitterSwitch::do_pBtnExecMode()
  579. {
  580. /* 保存“默认计划”和“执行模式” */
  581. ConfigData config1;
  582. config1.key = static_cast<int>(enum_ExecPlanConfig::ExecMode);
  583. config1.value = ui->rBtn_moment->isChecked() ? 0 : 1;
  584. config1.updateTime = QDateTime::currentDateTime();
  585. CfgData.updateConfigData(config1);
  586. /* 更新“计划是否更新”标志位,在更新前需要先获取数据库的标志位,如果依旧为1,那么本地是否更改都设置为1 */
  587. ConfigData config3;
  588. if(!m_fromWebAPI->getConfigData(static_cast<int>(enum_ExecPlanConfig::IsChanged), config3))
  589. {
  590. config3.key = static_cast<int>(enum_ExecPlanConfig::IsChanged);
  591. }
  592. /* 只要数据库和本地更新标志位有一个为true,说明还未被读走,则设置标志位为true */
  593. config3.value = 1;
  594. config3.updateTime = QDateTime::currentDateTime();
  595. CfgData.updateConfigData(config3);
  596. /* 将配置写入数据库 */
  597. m_fromWebAPI->insertConfigData(CfgData.getMapConfigData());
  598. }
  599. /* 点击了清空计划按钮 */
  600. void TransmitterSwitch::do_pBtnClearPlan()
  601. {
  602. /* 先判断是不是单频率模式,如果是,设置这个频率卡片被点击了 */
  603. if(GInfo.isOneFrequency())
  604. {
  605. auto pCard = PData.findPlanCard(GInfo.getChannelInfo().ChannelID);
  606. if(pCard != nullptr)
  607. {
  608. pCard->clickedCard();
  609. }
  610. }
  611. /* 先判断有没有选中的频率卡片 */
  612. if(PData.getCurrentPlanCard() == nullptr)
  613. {
  614. TipWidget::display(TipWidget::OPERATOR_FAIL, "没有选中频率卡片", this);
  615. return;
  616. }
  617. /* 跳出弹窗警告 */
  618. Warning w(this);
  619. w.setQSS(EPUIStyle.getQSSPath());
  620. w.setText("确定删除对应频率开关机计划?");
  621. bool flag = false;
  622. connect(&w,&Warning::signal_ok,this,[&](){
  623. flag = true;
  624. });
  625. w.exec();
  626. if(!flag)
  627. {
  628. return;
  629. }
  630. /* 获取选中的卡片 */
  631. auto pCard = PData.getCurrentPlanCard();
  632. if(pCard == nullptr)
  633. {
  634. LH_WRITE_ERROR("没有选中频率卡片");
  635. return;
  636. }
  637. /* 清空计划 */
  638. pCard->clearPlanItem();
  639. /* 删除数据库中的计划 */
  640. if(!m_fromWebAPI->deleteOneChnPlan(pCard->getChannelInfo().ChannelID))
  641. {
  642. LH_WRITE_ERROR(QString("频率ID为%1的计划删除失败").arg(pCard->getChannelInfo().ChannelID));
  643. TipWidget::display(TipWidget::OPERATOR_FAIL, QString("频率<%1>计划删除失败").arg(pCard->getChannelInfo().ChannelName), this);
  644. }else {
  645. TipWidget::display(TipWidget::OPERATOR_OK, "清空计划成功", this);
  646. }
  647. }
  648. /* 点击了复制到其他频率按钮 */
  649. void TransmitterSwitch::do_pBtnCopyToOther()
  650. {
  651. /* 判断是不是的那频率模式,如果是直接弹窗提示 */
  652. if(GInfo.isOneFrequency())
  653. {
  654. TipWidget::display(TipWidget::OPERATOR_OK, "只有一个频率,无需复制", this);
  655. return;
  656. }
  657. /* 先判断有没有选中的频率卡片 */
  658. auto pCard = PData.getCurrentPlanCard();
  659. if(pCard == nullptr)
  660. {
  661. TipWidget::display(TipWidget::OPERATOR_WARN, "没有选中频率卡片", this);
  662. return;
  663. }
  664. /* 判断卡片有没有计划 */
  665. if(pCard->isPlanEmpty())
  666. {
  667. TipWidget::display(TipWidget::OPERATOR_WARN, "当前频率没有计划", this);
  668. return;
  669. }
  670. std::shared_ptr<CopyToOther> cto = std::make_shared<CopyToOther>(this);
  671. cto->setQSSPath(EPUIStyle.getQSSPath());
  672. cto->setFrequencyList(pCard->getChannelInfo(), ChnContainer.getMapChannel());
  673. cto->exec();
  674. /* 判断有没有点击OK */
  675. if(!cto->isOk())
  676. {
  677. return;
  678. }
  679. /* 获取选中的频率列表 */
  680. auto list = cto->getSelectedFrequencyList();
  681. /* 获取当前频率的计划列表 */
  682. QList<PlanInfo> listPlan;
  683. pCard->getPlanList(listPlan);
  684. /* 遍历所有的频率 */
  685. bool isSuccess = true;
  686. for(auto& it : list)
  687. {
  688. auto pTmpCard = PData.findPlanCard(it.ChannelID);
  689. if(pTmpCard == nullptr)
  690. {
  691. LH_WRITE_ERROR(QString("没有找到频率ID为%1的卡片").arg(it.ChannelID));
  692. continue;
  693. }
  694. /* 设置计划列表 */
  695. pTmpCard->setPlanList(listPlan);
  696. QList<OnePlanItemInfo> tmpListPlan;
  697. pTmpCard->getAllPlanInfo(tmpListPlan);
  698. /* 写入数据库 */
  699. if(!m_fromWebAPI->insertData(it.ChannelID, tmpListPlan))
  700. {
  701. LH_WRITE_ERROR(QString("频率ID为%1的计划写入数据库失败").arg(it.ChannelID));
  702. TipWidget::display(TipWidget::OPERATOR_FAIL, QString("频率<%1>计划写入数据库失败").arg(it.ChannelName), this);
  703. isSuccess = false;
  704. }
  705. }
  706. if(isSuccess)
  707. {
  708. TipWidget::display(TipWidget::OPERATOR_OK, "复制计划成功", this);
  709. }
  710. }
  711. /* 导入数据 */
  712. void TransmitterSwitch::do_importData()
  713. {
  714. /* 先判断是不是单频率模式,如果是,设置这个频率卡片被点击了 */
  715. if(GInfo.isOneFrequency())
  716. {
  717. auto pCard = PData.findPlanCard(GInfo.getChannelInfo().ChannelID);
  718. if(pCard != nullptr)
  719. {
  720. pCard->clickedCard();
  721. }
  722. }
  723. /* 判断数据库是在线还是离线 */
  724. if(GInfo.isOnlineDB())
  725. {
  726. importTemplateFromEQM();
  727. } else
  728. {
  729. importTemplateFromSQLite();
  730. }
  731. }
  732. /* 导出数据 */
  733. void TransmitterSwitch::do_exportData()
  734. {
  735. /* 先判断是不是单频率模式,如果是,设置这个频率卡片被点击了 */
  736. if(GInfo.isOneFrequency())
  737. {
  738. auto pCard = PData.findPlanCard(GInfo.getChannelInfo().ChannelID);
  739. if(pCard != nullptr)
  740. {
  741. pCard->clickedCard();
  742. }
  743. }
  744. /* 判断是否是在线模式 */
  745. /* 先获取选中的卡片 */
  746. auto pCard = PData.getCurrentPlanCard();
  747. if(pCard == nullptr)
  748. {
  749. LH_WRITE_ERROR("没有选中频率卡片");
  750. TipWidget::display(TipWidget::OPERATOR_WARN, "未选中频率卡片", this);
  751. return;
  752. }
  753. /* 判断该卡片的计划列表是否为空 */
  754. if(pCard->isPlanEmpty())
  755. {
  756. TipWidget::display(TipWidget::OPERATOR_WARN, "当前频率没有计划", this);
  757. return;
  758. }
  759. ChannelInfo info = pCard->getChannelInfo();
  760. do_saveTemplateToDB(info);
  761. }
  762. /* 将模版写入数据库 */
  763. void TransmitterSwitch::do_saveTemplateToDB(ChannelInfo info)
  764. {
  765. if(GInfo.isOnlineDB())
  766. {
  767. saveTemplateToEQM(info);
  768. }else {
  769. saveTemplateToSQLite(info);
  770. }
  771. }
  772. /* 保存计划到EQM数据库 */
  773. void TransmitterSwitch::do_pBtn_savePlan()
  774. {
  775. /* 跳出弹窗提示 */
  776. Warning w(this);
  777. w.setQSS(EPUIStyle.getQSSPath());
  778. w.setText("将计划保存到数据库?");
  779. w.exec();
  780. if(!w.isOk())
  781. {
  782. return;
  783. }
  784. saveExecPlanToEQM();
  785. }
  786. /* 删除一个模版 */
  787. void TransmitterSwitch::do_deleteTemplate(OneTemplateInfo info)
  788. {
  789. bool isSuccess = true;
  790. if(GInfo.isOnlineDB())
  791. {
  792. deleteTemplateFromEQM(info);
  793. }else
  794. {
  795. deleteTemplateFromSQLite(info);
  796. }
  797. }
  798. /* 点击了管理模板按钮 */
  799. void TransmitterSwitch::do_pBtnManageTemplate()
  800. {
  801. if(GInfo.isOnlineDB())
  802. {
  803. manageTemplateFromEQM();
  804. }else
  805. {
  806. manageTemplateFromSQLite();
  807. }
  808. }
  809. /* 从EQM数据库获取计划 */
  810. void TransmitterSwitch::do_pBtn_getPlan()
  811. {
  812. /* 跳出弹窗提示 */
  813. Warning w(this);
  814. w.setQSS(EPUIStyle.getQSSPath());
  815. w.setText("从数据库获取计划,将清空当前所有的计划,请注意保存当前计划!");
  816. w.exec();
  817. if(!w.isOk())
  818. {
  819. return;
  820. }
  821. getExecPlanFromEQM();
  822. }
  823. /* 切换亮色/暗色外观 */
  824. void TransmitterSwitch::do_setUIStyle()
  825. {
  826. this->setStyleSheet(EPUIStyle.StrQSS_TransmitterSwitch);
  827. /* 给所有的按钮设置样式 */
  828. ui->pBtn_allFrequency->setStyleSheet(EPUIStyle.StrQSS_PBtnFrequency);
  829. // LH_WRITE_LOG(QString("频率按钮设置样式:%1").arg(EPUIStyle.StrQSS_PBtnFrequency));
  830. }
  831. /* 选择了一个频率按钮,取消其他的选择 */
  832. void TransmitterSwitch::do_selectFrequencyBtn()
  833. {
  834. /* 获取信号发送者 */
  835. auto btn = qobject_cast<QPushButton*>(sender());
  836. if(btn == nullptr)
  837. {
  838. return;
  839. }
  840. /* 取消其他按钮的选择 */
  841. for(auto& it : m_listFrequencyBtn)
  842. {
  843. if(it != btn)
  844. {
  845. it->setChecked(false);
  846. }
  847. }
  848. if(btn != ui->pBtn_allFrequency)
  849. {
  850. ui->pBtn_allFrequency->setChecked(false);
  851. /* 设置当前按钮的选择状态 */
  852. btn->setChecked(true);
  853. /* 设置该按钮对应的卡片状态 */
  854. auto var = btn->property(m_userData_Btn.c_str());
  855. auto pCard = var.value<PBtnUserData2*>()->getCard();
  856. pCard->clickedCard();
  857. }else {
  858. ui->pBtn_allFrequency->setChecked(true);
  859. /* 取消所有的卡片选择状态 */
  860. PData.clearAllSelectedCard();
  861. }
  862. /* 显示当前按钮对应的卡片,隐藏其他卡片 */
  863. showOneCard(btn);
  864. }
  865. /* 添加一个频率,包括左侧按钮和右侧卡片 */
  866. void TransmitterSwitch::createOneCard(const ChannelInfo& chnInfo)
  867. {
  868. /* 创建按钮 */
  869. QPushButton* pBtn = new QPushButton(this);
  870. pBtn->setObjectName(chnInfo.ChannelName);
  871. pBtn->setText(chnInfo.ChannelName);
  872. pBtn->setCheckable(true);
  873. pBtn->setMinimumHeight(40);
  874. PBtnUserData2* userData = new PBtnUserData2();
  875. userData->setChannelInfo(chnInfo);
  876. // pBtn->setUserData(m_userData_Btn, userData);
  877. QVariant var;
  878. var.setValue(userData);
  879. pBtn->setProperty(m_userData_Btn.c_str(), var);
  880. /* 设置按钮的样式表 */
  881. pBtn->setStyleSheet(EPUIStyle.StrQSS_PBtnFrequency);
  882. /* 连接信号和槽 */
  883. connect(pBtn, &QPushButton::clicked, this, &TransmitterSwitch::do_selectFrequencyBtn);
  884. m_listFrequencyBtn.push_back(pBtn);
  885. auto vLayout = qobject_cast<QVBoxLayout*>(ui->widget_frequency->layout());
  886. /* 减1是去掉最下面的弹簧 */
  887. vLayout->insertWidget(vLayout->count() - 1, pBtn);
  888. /* 创建卡片 */
  889. PlanCard* pCard = PData.createOneCard(chnInfo);
  890. pCard->setParent(ui->scrollAreaContents_Card);
  891. m_flowlayout->addWidget(pCard);
  892. userData->setCard(pCard); /* 设置按钮的卡片指针 */
  893. /* 排序 */
  894. }
  895. /* 删除一个频率 */
  896. void TransmitterSwitch::deleteOneCard(int channelID)
  897. {
  898. /* 删除按钮 */
  899. for(auto it = m_listFrequencyBtn.begin(); it != m_listFrequencyBtn.end(); ++it)
  900. {
  901. // auto userData = static_cast<PBtnUserData2*>((*it)->userData(m_userData_Btn));
  902. auto userData = (*it)->property(m_userData_Btn.c_str()).value<PBtnUserData2*>();
  903. if(userData != nullptr && userData->getChannelInfo().ChannelID == channelID)
  904. {
  905. delete *it;
  906. m_listFrequencyBtn.erase(it);
  907. break;
  908. }
  909. }
  910. /* 删除卡片 */
  911. PData.deleteOneCard(channelID);
  912. }
  913. /* 创建所有频率卡片 */
  914. void TransmitterSwitch::createAllCard()
  915. {
  916. /* 删除所有的卡片 */
  917. PData.deleteAllCard();
  918. /* 删除所有按钮 */
  919. for(auto it = m_listFrequencyBtn.begin(); it != m_listFrequencyBtn.end(); ++it)
  920. {
  921. delete *it;
  922. }
  923. m_listFrequencyBtn.clear();
  924. if(!GInfo.isOneFrequency())
  925. {
  926. for(const auto& it : ChnContainer.getMapChannel())
  927. {
  928. /* 创建一个按钮和卡片 */
  929. createOneCard(it);
  930. }
  931. }else {
  932. /* 创建一个按钮和卡片 */
  933. createOneCard(GInfo.getChannelInfo());
  934. }
  935. /* 隐藏重新显示一下,调用显示事件,重新设置卡片大小 */
  936. this->hide();
  937. QEventLoop loop;
  938. loop.processEvents();
  939. this->show();
  940. }
  941. /* 显示某个卡片,隐藏其他卡片 */
  942. void TransmitterSwitch::showOneCard(QPushButton *btn)
  943. {
  944. /* 判断是否是显示全部卡片的按钮 */
  945. if(btn == ui->pBtn_allFrequency)
  946. {
  947. /* 设置卡片间的横向间距 */
  948. m_flowlayout->setHorizontalSpacing(m_cardHorSpacing);
  949. /* 显示全部卡片 */
  950. for(auto& it : m_listFrequencyBtn)
  951. {
  952. // auto ud = it->userData(m_userData_Btn);
  953. PBtnUserData2* userData = it->property(m_userData_Btn.c_str()).value<PBtnUserData2*>();
  954. if(userData != nullptr)
  955. {
  956. auto pCard = userData->getCard();
  957. if(pCard != nullptr)
  958. {
  959. pCard->show();
  960. }
  961. }
  962. }
  963. /* 刷新布局,刷新了才会让FlowLayout重新布局 */
  964. ui->scrollAreaContents_Card->updateGeometry();
  965. return;
  966. }
  967. /* 设置卡片间的横向间距 */
  968. m_flowlayout->setHorizontalSpacing(0);
  969. /* 不是显示全部的按钮,隐藏所有卡片 */
  970. for(auto& it : m_listFrequencyBtn)
  971. {
  972. // auto ud = it->userData(m_userData_Btn);
  973. PBtnUserData2* userData = it->property(m_userData_Btn.c_str()).value<PBtnUserData2*>();
  974. if(userData != nullptr)
  975. {
  976. auto pCard = userData->getCard();
  977. if(pCard != nullptr)
  978. {
  979. pCard->hide();
  980. }
  981. }
  982. }
  983. /* 显示当前卡片 */
  984. // auto ud = btn->userData(m_userData_Btn);
  985. // PBtnUserData2* userData = static_cast<PBtnUserData2*>(ud);
  986. PBtnUserData2* userData = btn->property(m_userData_Btn.c_str()).value<PBtnUserData2*>();
  987. if(userData != nullptr)
  988. {
  989. auto pCard = userData->getCard();
  990. if(pCard != nullptr)
  991. {
  992. pCard->show();
  993. }
  994. }
  995. /* 刷新布局,刷新了才会让FlowLayout重新布局 */
  996. ui->scrollAreaContents_Card->updateGeometry();
  997. }
  998. /* 计算并设置设置卡片大小 */
  999. void TransmitterSwitch::setCardSize()
  1000. {
  1001. /* 获取滚动条的区域 */
  1002. int vsb = 0;
  1003. if(ui->scrollArea->verticalScrollBar()->isVisible())
  1004. {
  1005. vsb = ui->scrollArea->verticalScrollBar()->width();
  1006. }
  1007. /* 去掉滚动条的宽度和阴影的宽度,再减去一个横向间距,和滚动条有些距离,不挨着太紧 */
  1008. int saWidth = ui->scrollArea->width() - vsb - m_cardHorSpacing - 2;
  1009. int saHeight = ui->scrollArea->height();
  1010. int cardWidth = ( saWidth - (m_cardHorNumber - 1) * m_cardHorSpacing ) / m_cardHorNumber;
  1011. int cardHeight = ( saHeight - (m_cardVerNumber - 1) * m_cardVerSpacing ) / m_cardVerNumber;
  1012. /* 设置卡片大小 */
  1013. PData.setCardSize(cardWidth, cardHeight);
  1014. // LH_WRITE_LOG_DEBUG(QString("卡片大小:%1*%2").arg(cardWidth).arg(cardHeight));
  1015. }
  1016. /* 计算并设置提示文本的位置 */
  1017. void TransmitterSwitch::setTipTextPos()
  1018. {
  1019. if(m_tipText != nullptr)
  1020. {
  1021. QPoint pos = ui->label_Tip->mapTo(this, QPoint(0, 0));
  1022. m_tipText->move(pos.x() - m_tipText->width(), pos.y() + 32 );
  1023. }
  1024. }
  1025. /* 设置单频率模式 */
  1026. void TransmitterSwitch::setOneFrequencyMode()
  1027. {
  1028. /* 先判断是在线还是离线模式 */
  1029. if(GInfo.isOnlineDB())
  1030. {
  1031. auto chnInfo = ChnContainer.getChannel(GInfo.getChannelInfo().ChannelID);
  1032. if(chnInfo.ChannelID < 0)
  1033. {
  1034. LH_WRITE_ERROR(QString("没有找到频率ID为%1的频率信息").arg(GInfo.getChannelInfo().ChannelID));
  1035. return;
  1036. }else {
  1037. /* 设置频率信息 */
  1038. GInfo.setChannelInfo(chnInfo);
  1039. }
  1040. // LH_WRITE_LOG_DEBUG(QString("设置频率信息成功,频率ID:%1,频率名称:%2").arg(GInfo.getChannelInfo().ChannelID).arg(GInfo.getChannelInfo().ChannelName));
  1041. /* 如果设置了特定的频率,删除其他的频率 */
  1042. ChnContainer.deleteOtherChannel(GInfo.getChannelInfo().ChannelID);
  1043. // LH_WRITE_LOG_DEBUG(QString("map频率ID:%1,频率名称:%2").arg(ChnContainer.getMapChannel().first().ChannelID).arg(ChnContainer.getMapChannel().first().ChannelName));
  1044. }else
  1045. {
  1046. /* 清空所有频率 */
  1047. ChnContainer.clearAllChannel();
  1048. /* 设置频率信息 */
  1049. ChnContainer.addChannel(GInfo.getChannelInfo());
  1050. }
  1051. /* 隐藏复制到其他频率的按钮 */
  1052. ui->pBtn_cloneToOther->hide();
  1053. }
  1054. /* 设置使用在线或者使用离线数据库,主要是保存模版 */
  1055. void TransmitterSwitch::setUseOnlineDB(bool useOnlineDB)
  1056. {
  1057. GInfo.setOnlineDB(useOnlineDB);
  1058. if(GInfo.isOnlineDB())
  1059. {
  1060. /* 在线模式,获取数据库频率信息 */
  1061. if(!m_fromWebAPI->getChannelInfo(ChnContainer.getMapChannel()))
  1062. {
  1063. LH_WRITE_ERROR("获取频率信息失败");
  1064. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取频率信息失败", this);
  1065. return;
  1066. }else {
  1067. LH_WRITE_LOG("获取频率信息成功!");
  1068. }
  1069. }else
  1070. {
  1071. /* 如果使用离线数据库,初始化SQLite */
  1072. if(m_fromSQLite == nullptr)
  1073. {
  1074. m_fromSQLite = new FromSQLite;
  1075. m_fromSQLite->initDB(GInfo.getDatabasePath());
  1076. }
  1077. }
  1078. }
  1079. /* 从EQM数据库导入模版 */
  1080. void TransmitterSwitch::importTemplateFromEQM()
  1081. {
  1082. QMultiMap<int, OneTemplateInfo> tabList;
  1083. /* 判断有没有选中卡片 */
  1084. auto pCard = PData.getCurrentPlanCard();
  1085. bool isSuccess = true;
  1086. if(pCard == nullptr)
  1087. {
  1088. /* 没有选中卡片,获取全部的频率 */
  1089. if(!m_fromWebAPI->getTemplateList(tabList))
  1090. {
  1091. isSuccess = false;
  1092. }
  1093. } else
  1094. {
  1095. /* 选中了卡片,只获取这个卡片的频率列表 */
  1096. QList<OneTemplateInfo> list;
  1097. if(m_fromWebAPI->getTemplateList(pCard->getChannelInfo().ChannelID, list))
  1098. {
  1099. for(auto it = list.begin(), end = list.end(); it != end; it++)
  1100. {
  1101. tabList.insert(it->channelInfo.ChannelID, *it);
  1102. }
  1103. }else {
  1104. isSuccess = false;
  1105. LH_WRITE_ERROR(QString("获取频率ID为%1的模版列表失败").arg(pCard->getChannelInfo().ChannelID));
  1106. }
  1107. }
  1108. if(isSuccess == false)
  1109. {
  1110. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版列表失败", this);
  1111. return;
  1112. }
  1113. /* 将模板列表添加频率信息 */
  1114. for(auto it = tabList.begin(), end = tabList.end(); it != end; it++)
  1115. {
  1116. auto chnInfo = ChnContainer.getChannel(it->channelInfo.ChannelID);
  1117. it->channelInfo = chnInfo;
  1118. }
  1119. std::shared_ptr<ImportTemplate> it = std::make_shared<ImportTemplate>();
  1120. it->setQSSPath(EPUIStyle.getQSSPath());
  1121. it->setTemplateList(tabList);
  1122. it->exec();
  1123. /* 判断有没有点击OK */
  1124. if(!it->isOk())
  1125. {
  1126. return;
  1127. }
  1128. /* 获取选中的模版 */
  1129. auto tmpList = it->getSelectedTemplateList();
  1130. /* 判断有没有选中需要导入模版 */
  1131. if(tmpList.isEmpty())
  1132. {
  1133. TipWidget::display(TipWidget::OPERATOR_WARN, "无模板导入", this);
  1134. return;
  1135. }
  1136. QMap<int, QList<OnePlanItemInfo>> mapPlan;
  1137. m_fromWebAPI->getTemplateData(tmpList, mapPlan);
  1138. /* 将所有的模板数据插入到卡片中 */
  1139. for(auto begin = mapPlan.begin(), end = mapPlan.end(); begin != end; begin++)
  1140. {
  1141. auto pCard = PData.findPlanCard(begin.key());
  1142. if(pCard == nullptr)
  1143. {
  1144. LH_WRITE_ERROR(QString("没有找到频率ID为%1的卡片").arg(begin.key()));
  1145. continue;
  1146. }
  1147. /* 设置计划列表 */
  1148. pCard->setPlanList(begin.value());
  1149. /* 写入数据库 */
  1150. if(!m_fromWebAPI->insertData(begin.key(), begin.value()))
  1151. {
  1152. LH_WRITE_ERROR(QString("频率ID为%1的计划写入数据库失败").arg(begin.key()));
  1153. TipWidget::display(TipWidget::OPERATOR_FAIL, QString("频率<%1>计划写入数据库失败").arg(pCard->getChannelInfo().ChannelName), this);
  1154. isSuccess = false;
  1155. }
  1156. }
  1157. if(isSuccess)
  1158. {
  1159. TipWidget::display(TipWidget::OPERATOR_OK, "导入模版成功", this);
  1160. }
  1161. /* 调用回调函数 */
  1162. if(m_trackCB != nullptr)
  1163. {
  1164. m_trackCB(4, g_mapTrack.value(4));
  1165. }
  1166. }
  1167. /* 从SQLite导入模版 */
  1168. void TransmitterSwitch::importTemplateFromSQLite()
  1169. {
  1170. QMultiMap<int, OneTemplateInfo> tabList;
  1171. /* 获取当前选中的卡片 */
  1172. auto pCard = PData.getCurrentPlanCard();
  1173. bool isSuccess = true;
  1174. /* 选中了卡片,只获取这个卡片的频率列表 */
  1175. QList<OneTemplateInfo> list;
  1176. if(m_fromSQLite->getTemplateList(pCard->getChannelInfo().ChannelID, list))
  1177. {
  1178. for(auto it = list.begin(), end = list.end(); it != end; it++)
  1179. {
  1180. tabList.insert(it->channelInfo.ChannelID, *it);
  1181. }
  1182. }else {
  1183. isSuccess = false;
  1184. LH_WRITE_ERROR(QString("获取频率ID为%1的模版列表失败").arg(pCard->getChannelInfo().ChannelID));
  1185. }
  1186. if(isSuccess == false)
  1187. {
  1188. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版列表失败", this);
  1189. return;
  1190. }
  1191. /* 将模板列表添加频率信息 */
  1192. for(auto it = tabList.begin(), end = tabList.end(); it != end; it++)
  1193. {
  1194. auto chnInfo = GInfo.getChannelInfo();
  1195. it->channelInfo = chnInfo;
  1196. }
  1197. std::shared_ptr<ImportTemplate> it = std::make_shared<ImportTemplate>();
  1198. it->setQSSPath(EPUIStyle.getQSSPath());
  1199. it->setTemplateList(tabList);
  1200. it->exec();
  1201. /* 判断有没有点击OK */
  1202. if(!it->isOk())
  1203. {
  1204. return;
  1205. }
  1206. /* 获取选中的模版 */
  1207. auto tmpList = it->getSelectedTemplateList();
  1208. /* 判断有没有选中需要导入模版 */
  1209. if(tmpList.isEmpty())
  1210. {
  1211. TipWidget::display(TipWidget::OPERATOR_WARN, "无模板导入", this);
  1212. return;
  1213. }
  1214. QList<OnePlanItemInfo> listPlan;
  1215. if(!m_fromSQLite->getTemplateData(tmpList.first(), listPlan))
  1216. {
  1217. LH_WRITE_ERROR("获取模版数据失败");
  1218. TipWidget::display(TipWidget::OPERATOR_FAIL, "导入模版数据失败", this);
  1219. return;
  1220. }
  1221. /* 设置计划列表 */
  1222. pCard->setPlanList(listPlan);
  1223. TipWidget::display(TipWidget::OPERATOR_OK, "导入模版成功", this);
  1224. }
  1225. /* 将模版写入数据库 */
  1226. void TransmitterSwitch::saveTemplateToEQM(ChannelInfo info)
  1227. {
  1228. auto pCard = PData.findPlanCard(info.ChannelID);
  1229. if(pCard == nullptr)
  1230. {
  1231. LH_WRITE_ERROR(QString("没有找到频率ID为%1的卡片").arg(info.ChannelID));
  1232. return;
  1233. }
  1234. int chnID = info.ChannelID;
  1235. /* 获取所有的模板名称 */
  1236. QList<OneTemplateInfo> list;
  1237. if(!m_fromWebAPI->getTemplateList(chnID, list))
  1238. {
  1239. LH_WRITE_ERROR(QString("获取频率ID为%1的模版列表失败").arg(chnID));
  1240. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版列表失败", this);
  1241. return;
  1242. }
  1243. /* 弹出导出页面 */
  1244. std::shared_ptr<SaveToTemplate> stt = std::make_shared<SaveToTemplate>();
  1245. stt->setQSS(EPUIStyle.getQSSPath());
  1246. stt->setTemplateList(list);
  1247. stt->exec();
  1248. if(!stt->isOk())
  1249. {
  1250. return;
  1251. }
  1252. /* 获取一天的数据 */
  1253. QList<OnePlanItemInfo> listTmp;
  1254. pCard->getAllPlanInfo(listTmp);
  1255. /* 保存到模板 */
  1256. if(m_fromWebAPI->saveTemplate(stt->getTemplateName(), listTmp))
  1257. {
  1258. TipWidget::display(TipWidget::OPERATOR_OK, "保存模版成功", this);
  1259. }else {
  1260. TipWidget::display(TipWidget::OPERATOR_FAIL, "保存模版失败", this);
  1261. }
  1262. /* 调用回调函数 */
  1263. if(m_trackCB != nullptr)
  1264. {
  1265. m_trackCB(3, g_mapTrack.value(3));
  1266. }
  1267. }
  1268. /* 保存计划到SQLite数据库 */
  1269. void TransmitterSwitch::saveTemplateToSQLite(ChannelInfo info)
  1270. {
  1271. auto pCard = PData.findPlanCard(info.ChannelID);
  1272. if(pCard == nullptr)
  1273. {
  1274. LH_WRITE_ERROR(QString("没有找到频率ID为%1的卡片").arg(info.ChannelID));
  1275. return;
  1276. }
  1277. int chnID = info.ChannelID;
  1278. /* 获取所有的模板名称 */
  1279. QList<OneTemplateInfo> list;
  1280. if(!m_fromSQLite->getTemplateList(chnID, list))
  1281. {
  1282. LH_WRITE_ERROR(QString("获取频率ID为%1的模版列表失败").arg(chnID));
  1283. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版列表失败", this);
  1284. return;
  1285. }
  1286. /* 弹出导出页面 */
  1287. std::shared_ptr<SaveToTemplate> stt = std::make_shared<SaveToTemplate>();
  1288. stt->setQSS(EPUIStyle.getQSSPath());
  1289. stt->setTemplateList(list);
  1290. stt->exec();
  1291. if(!stt->isOk())
  1292. {
  1293. return;
  1294. }
  1295. /* 获取一天的数据 */
  1296. QList<OnePlanItemInfo> listTmp;
  1297. pCard->getAllPlanInfo(listTmp);
  1298. /* 保存到模板 */
  1299. if(m_fromSQLite->saveTemplate(stt->getTemplateName(), listTmp))
  1300. {
  1301. TipWidget::display(TipWidget::OPERATOR_OK, "保存模版成功", this);
  1302. }else {
  1303. TipWidget::display(TipWidget::OPERATOR_FAIL, "保存模版失败", this);
  1304. }
  1305. /* 调用回调函数 */
  1306. if(m_trackCB != nullptr)
  1307. {
  1308. m_trackCB(3, g_mapTrack.value(3));
  1309. }
  1310. }
  1311. /* 从EQM数据库中删除一个模版 */
  1312. void TransmitterSwitch::deleteTemplateFromEQM(OneTemplateInfo info)
  1313. {
  1314. /* 删除模版 */
  1315. if(m_fromWebAPI->deleteTemplate(info))
  1316. {
  1317. TipWidget::display(TipWidget::OPERATOR_OK, "删除模版成功", this);
  1318. }else {
  1319. TipWidget::display(TipWidget::OPERATOR_FAIL, "从数据库删除模版失败", this);
  1320. LH_WRITE_ERROR("从EQM数据库删除模版失败");
  1321. }
  1322. }
  1323. /* 从SQLite数据库中删除一个模版 */
  1324. void TransmitterSwitch::deleteTemplateFromSQLite(OneTemplateInfo info)
  1325. {
  1326. if(m_fromSQLite->deleteTemplate(info))
  1327. {
  1328. TipWidget::display(TipWidget::OPERATOR_OK, "删除模版成功", this);
  1329. }else {
  1330. TipWidget::display(TipWidget::OPERATOR_FAIL, "从数据库删除模版失败", this);
  1331. LH_WRITE_ERROR("从SQLite数据库删除模版失败");
  1332. }
  1333. }
  1334. /* 管理EQM数据库的模版数据 */
  1335. void TransmitterSwitch::manageTemplateFromEQM()
  1336. {
  1337. /* int是频率ID */
  1338. QMultiMap<int, OneTemplateInfo> tabList;
  1339. /* 获取全部的频率 */
  1340. if(!m_fromWebAPI->getTemplateList(tabList))
  1341. {
  1342. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版列表失败", this);
  1343. return;
  1344. }
  1345. /* 判断是不是单频率模式,如果是,则删除其他的频率 */
  1346. if(GInfo.isOneFrequency())
  1347. {
  1348. for(auto it = tabList.begin(), end = tabList.end(); it != end; it++)
  1349. {
  1350. if(it.key() != GInfo.getChannelInfo().ChannelID)
  1351. {
  1352. tabList.erase(it);
  1353. }
  1354. }
  1355. }
  1356. /* 将模板列表添加频率信息 */
  1357. for(auto it = tabList.begin(), end = tabList.end(); it != end; it++)
  1358. {
  1359. auto chnInfo = ChnContainer.getChannel(it->channelInfo.ChannelID);
  1360. it->channelInfo = chnInfo;
  1361. }
  1362. std::shared_ptr<TemplateManager> tm = std::make_shared<TemplateManager>();
  1363. tm->setQSSPath(EPUIStyle.getQSSPath());
  1364. tm->setTemplateList(tabList);
  1365. tm->setWebAPI(m_fromWebAPI);
  1366. tm->exec();
  1367. /* 判断是否点击了OK */
  1368. if(!tm->isOk())
  1369. {
  1370. return;
  1371. }
  1372. bool isSuccess = true;
  1373. /* 获取删除的计划列表 */
  1374. auto list = tm->getDeleteTemplateList();
  1375. if(!m_fromWebAPI->deleteTemplateList(list))
  1376. {
  1377. LH_WRITE_ERROR("删除模版失败");
  1378. TipWidget::display(TipWidget::OPERATOR_FAIL, "删除模版失败", this);
  1379. isSuccess = false;
  1380. }
  1381. /* 更新模版列表 */
  1382. auto mapTmp = tm->getModifyTemplateList();
  1383. if(!m_fromWebAPI->modifyTemplateList(mapTmp))
  1384. {
  1385. LH_WRITE_ERROR("修改模版失败");
  1386. TipWidget::display(TipWidget::OPERATOR_FAIL, "修改模版失败", this);
  1387. isSuccess = false;
  1388. }
  1389. /* 更新模板名称 */
  1390. auto mapTmpName = tm->getModifyTemplateNameList();
  1391. if(!m_fromWebAPI->updateTemplateName(mapTmpName))
  1392. {
  1393. LH_WRITE_ERROR("修改模版名称失败");
  1394. TipWidget::display(TipWidget::OPERATOR_FAIL, "修改模版名称失败", this);
  1395. isSuccess = false;
  1396. }
  1397. if(isSuccess)
  1398. {
  1399. TipWidget::display(TipWidget::OPERATOR_OK, "修改模版成功", this);
  1400. }
  1401. }
  1402. /* 管理SQLite数据库的模版数据 */
  1403. void TransmitterSwitch::manageTemplateFromSQLite()
  1404. {
  1405. QList<OneTemplateInfo> listTemplate;
  1406. /* 获取全部的频率 */
  1407. if(!m_fromSQLite->getTemplateList(GInfo.getChannelInfo().ChannelID, listTemplate))
  1408. {
  1409. TipWidget::display(TipWidget::OPERATOR_FAIL, "获取模版列表失败", this);
  1410. return;
  1411. }
  1412. /* int是频率ID */
  1413. QMultiMap<int, OneTemplateInfo> mapTemplate;
  1414. /* 将模板列表添加频率信息 */
  1415. for(auto it = listTemplate.begin(), end = listTemplate.end(); it != end; it++)
  1416. {
  1417. it->channelInfo = GInfo.getChannelInfo();
  1418. mapTemplate.insert(it->channelInfo.ChannelID, *it);
  1419. }
  1420. /* 打开模板管理页面 */
  1421. std::shared_ptr<TemplateManager> tm = std::make_shared<TemplateManager>();
  1422. tm->setQSSPath(EPUIStyle.getQSSPath());
  1423. tm->setTemplateList(mapTemplate);
  1424. tm->setFromSQLite(m_fromSQLite);
  1425. tm->exec();
  1426. /* 判断是否点击了OK */
  1427. if(!tm->isOk())
  1428. {
  1429. return;
  1430. }
  1431. bool isSuccess = true;
  1432. /* 获取删除的计划列表 */
  1433. auto list = tm->getDeleteTemplateList();
  1434. if(!m_fromSQLite->deleteTemplateList(list))
  1435. {
  1436. LH_WRITE_ERROR("删除模版失败");
  1437. TipWidget::display(TipWidget::OPERATOR_FAIL, "删除模版失败", this);
  1438. isSuccess = false;
  1439. }
  1440. /* 更新模版列表 */
  1441. auto mapTmp = tm->getModifyTemplateList();
  1442. if(!m_fromSQLite->modifyTemplateList(mapTmp))
  1443. {
  1444. LH_WRITE_ERROR("修改模版失败");
  1445. TipWidget::display(TipWidget::OPERATOR_FAIL, "修改模版失败", this);
  1446. isSuccess = false;
  1447. }
  1448. /* 更新模板名称 */
  1449. auto mapTmpName = tm->getModifyTemplateNameList();
  1450. if(!m_fromSQLite->updateTemplateName(mapTmpName))
  1451. {
  1452. LH_WRITE_ERROR("修改模版名称失败");
  1453. TipWidget::display(TipWidget::OPERATOR_FAIL, "修改模版名称失败", this);
  1454. isSuccess = false;
  1455. }
  1456. if(isSuccess)
  1457. {
  1458. TipWidget::display(TipWidget::OPERATOR_OK, "修改模版成功", this);
  1459. }
  1460. }
  1461. /* 事件过滤器 */
  1462. bool TransmitterSwitch::eventFilter(QObject *watched, QEvent *event)
  1463. {
  1464. if(watched == ui->label_Tip)
  1465. {
  1466. if(event->type() == QEvent::Enter)
  1467. {
  1468. m_tipText->show();
  1469. return true;
  1470. }else if(event->type() == QEvent::Leave)
  1471. {
  1472. m_tipText->hide();
  1473. }
  1474. }
  1475. return QWidget::eventFilter(watched,event);
  1476. }
  1477. /* 窗口缩放事件 */
  1478. void TransmitterSwitch::resizeEvent(QResizeEvent *event)
  1479. {
  1480. /* 设置提示文本的位置 */
  1481. setTipTextPos();
  1482. setCardSize();
  1483. QWidget::resizeEvent(event);
  1484. }
  1485. /* 显示事件 */
  1486. void TransmitterSwitch::showEvent(QShowEvent *event)
  1487. {
  1488. /* 设置提示文本的位置 */
  1489. setTipTextPos();
  1490. setCardSize();
  1491. QWidget::showEvent(event);
  1492. }