Files
energy_storage/src/pv/PvTable.h

191 lines
4.2 KiB
C
Raw Normal View History

#ifndef _PvTable_H_
#define _PvTable_H_
#include <functional>
#include "PvApp.h"
#include "Fields.h"
using CallbackTableOpt = std::function<void(int row, int col, std::string text)>;
class PvTable : public PvObject
{
public:
struct Options
{
bool show_header = true;
bool show_border = true;
int head_height = 40;
int row_height = 35;
int page_size = 10;
int width = 500;
};
struct Head
{
Head() {}
Head(std::string hid, std::string htext, int w, std::vector<std::pair<std::string, std::string>> mapping)
: id(hid), text(htext), width(w), vecMaping(mapping) {}
std::string id;
std::string text;
int width = 80;
int pvid = PV_ID_NUL;
vector<pair<string, string>> vecMaping;
std::string getMapping(std::string s)
{
std::string v = s;
for (auto& item : vecMaping)
{
if (v == item.first) { v = item.second; }
else if (v == item.second) { v = item.first; }
}
return v;
}
};
struct Row
{
bool visible = false;
int bkg {PV_ID_NUL};
std::vector<int> vecCells {};
};
public:
PvTable(PARAM* p, int parent, int x, int y, int w, int rows, Options& option);
void addHead(std::string id, std::string text, int width, std::vector<std::pair<std::string, std::string>> mapping = {});
void addHead(std::vector<std::string> vecText);
void setRowVisible(int row, bool v);
void highlight(int row, bool v);
void addOperate(std::vector<std::string> 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<std::string> vd);
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<std::string> vec_title);
void setOperateVisible(int row, bool v, int id = -1);
int item_posy(int row);
int border_id();
int rows();
int colums();
std::vector<Fields> data();
PvTable::Head& header(int col);
private:
int pvid_;
PvRect rect_;
int border_id_;
std::vector<PvTable::Head> vecHead_;
std::vector<PvTable::Row> vecRows_;
std::vector<Fields> vecData_;
vector<pair<int, vector<int>>> vecOpt_;
int nRow_;
int nCol_;
string item_base_style_;
Options option_;
unordered_map<int, vector<int>> vec_col_item_btn_;
CallbackTableOpt cbOperate_ = nullptr;
int posCol_ = 0;
};
class PvPagination : public PvObject
{
public:
PvPagination(PARAM* p, int parent, int x, int y, int n);
void setPage(int index, int count);
int page();
void setCallback(std::function<void(int index)> func);
private:
void activePage(int index, bool invoke=false);
private:
// 当前显示的页码索引, 从1开始
int pageIndex = 1;
// 总页数
int pageCount = 0;
// 上一页按钮
int btnPrev = PV_ID_NUL;
// 下一页按钮
int btnNext = PV_ID_NUL;
// 页面跳转按钮
int btn_gopage_ = PV_ID_NUL;
int btnActive = PV_ID_NUL;
int labelInfo = PV_ID_NUL;
// 页码列表最多显示6个页码按钮,前3页和后3页 <按钮ID, 页码>
std::vector<pair<int, int>> vecBtn;
function<void(int)> callback = nullptr;
};
///////////////////////////////////////////////////////////////////////////////////////////////////
// === PageTable ===
class PvPopWidget;
class PageTable : public PvMask
{
public:
PageTable(PARAM* p);
void setPage(int pageIndex, int pageSize, int count) {}
std::shared_ptr<PvPopWidget> addPop(int w, int h, int w0, std::string name, std::vector<std::string> primaryKeys);
void showPop(int index, std::string optr, Fields& fields);
void hidePop(int index);
void updateDataFromDB();
virtual void onQueryTable(PageInfo& pageInfo, std::vector<Fields>& result) {}
virtual void onOperate(int row, int col, std::string oper) {};
virtual std::string onValidation(std::shared_ptr<PvPopWidget> pop, Fields& fields) { return ""; };
virtual std::string onPopConfirm(std::shared_ptr<PvPopWidget> pop, Fields& fields) { return ""; };
int pageSize {15};
int pageIndex {0};
PvTable::Options option;
std::shared_ptr<PvTable> table;
std::shared_ptr<PvPagination> pagination;
std::vector<std::shared_ptr<PvPopWidget>> vecPop;
};
#endif // ! _PvTable_H_