#pragma once #include "global.h" namespace Psc { // 主要包含 行列位置的核心位置计算 // using T_Data = std::shared_ptr; struct Edit_Func { virtual ~Edit_Func() = default; virtual bool insert_row(int pos, const std::vector& infos, const std::vector>& data, Edge_Expand_Type t) { return true; } virtual bool insert_col(int pos, const std::vector& infos, const std::vector>& data, Edge_Expand_Type t) { return true; } virtual bool remove_row(int pos, int num) { return true; } virtual bool remove_col(int pos, int num) { return true; } virtual void merge(int row, int col, int row_span, int col_span) { } virtual void split(int row, int col, int row_span, int col_span) { } }; struct Base_Table_Model { virtual ~Base_Table_Model() = default; Base_Table_Model(); int width() { return col_span_len(0, total_col()); } int height() { return row_span_len(0, total_row()); } // 重载这两个函数可以实现使用自己自定义的 Row_Info Col_Info virtual Row_Info* create_row_info(int h); virtual Col_Info* create_col_info(int w); virtual Base_Table_Data* get_table_data(int col, int row) = 0; virtual Col_Info* get_col_info(int pos) = 0; virtual Row_Info* get_row_info(int pos) = 0; // 表格绝对位置计算函数 virtual Pos get_col(int x) = 0; virtual Pos get_row(int y) = 0; virtual int cell_x(int index) = 0; virtual int cell_y(int index) = 0; virtual int total_row() = 0; virtual int total_col() = 0; virtual int row_span_len(int row, int row_span) = 0; virtual int col_span_len(int col, int col_span) = 0; virtual Cell_Info get_span(int xi, int yi); // 获取某一位置,隶属于哪一个大格子(合并单元格场景下) virtual Find_Ret find_parent(Base_Table_Data* parent, int xi, int yi); // 从xi,yi位置寻找到其隶属于的大格子(合并单元格场景下) int col_space = 14; int row_space = 14; int col_min_w = 8; int row_min_h = 8; }; Pos get_pos(Base_Info** infos, int n, int space, int pos, int margin); // 直接把数据放在内存里的模型 struct Memory_Table_Model : Base_Table_Model, Edit_Func { void split(int row, int col, int row_span, int col_span) override; void merge(int row, int col, int row_span, int col_span) override; bool insert_row(int pos, const std::vector& infos, const std::vector>& data, Edge_Expand_Type) override; bool insert_col(int pos, const std::vector& infos, const std::vector>& data, Edge_Expand_Type) override; bool remove_row(int pos, int num) override; bool remove_col(int pos, int num) override; // 表格区域绝对位置计算 Pos get_col(int x) override; Pos get_row(int y) override; int cell_x(int index) override; int cell_y(int index) override; int total_row() override { return row_info_list.size(); } int total_col() override { return col_info_list.size(); } int row_span_len(int row, int row_span) override; int col_span_len(int col, int col_span) override; Cell_Info get_span(int xi, int yi) override; Find_Ret find_parent(Base_Table_Data* parent, int xi, int yi) override; Row_Info* get_row_info(int pos) override { return row_info_list[pos]; } Col_Info* get_col_info(int pos) override { return col_info_list[pos]; } Base_Table_Data* get_table_data(int col, int row) override { return data[col][row]; } protected: std::vector col_info_list; std::vector row_info_list; std::vector> data; friend Table_View* create_table_view(); friend Table_View* create_table_view2(); }; } // namespace Psc