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