Files
Renderive/Widget/component/Table/Base_Table_Model.h
T
2026-08-01 20:09:45 +08:00

95 lines
3.9 KiB
C++

#pragma once
#include "global.h"
namespace Flex_Qt {
// 主要包含 行列位置的核心位置计算
// using T_Data = std::shared_ptr<Table_Data>;
struct Edit_Func {
virtual ~Edit_Func() = default;
virtual bool insert_row(int pos, const std::vector<Row_Info*>& infos, const std::vector<std::vector<Base_Table_Data*>>& data, Edge_Expand_Type t) {
return true;
}
virtual bool insert_col(int pos, const std::vector<Col_Info*>& infos, const std::vector<std::vector<Base_Table_Data*>>& 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<Row_Info*>& infos, const std::vector<std::vector<Base_Table_Data*>>& data, Edge_Expand_Type) override;
bool insert_col(int pos, const std::vector<Col_Info*>& infos, const std::vector<std::vector<Base_Table_Data*>>& 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*> col_info_list;
std::vector<Row_Info*> row_info_list;
std::vector<std::vector<Base_Table_Data*>> data;
friend Table_View* create_table_view();
friend Table_View* create_table_view2();
};
}