#include "model.h"
UiListSelection* listSelection(QItemSelectionModel *s) {
UiListSelection *selection = new UiListSelection();
QModelIndexList list = s->selectedRows();
selection->count = list.count();
if(selection->count >
0) {
selection->rows = new
int[selection->count];
}
QModelIndex index;
int i=
0;
foreach(index, list) {
selection->rows[i] = index.row();
i++;
}
return selection;
}
ListModel::ListModel(UiObject* obj, QListView* view, UiListPtr* list, ui_model_getvalue_f getvalue, ui_callback f,
void* userdata) {
this->obj = obj;
this->view = view;
this->list = list;
this->getvalue = getvalue;
this->callback = f;
this->userdata = userdata;
}
int ListModel::rowCount(
const QModelIndex& parent)
const {
return list->list->count(list->list);
}
QVariant ListModel::data(
const QModelIndex &index,
int role)
const {
if(role == Qt::DisplayRole) {
UiList *ls = list->list;
void *rowData = ls->get(ls, index.row());
if(rowData && getvalue) {
void *value = getvalue(rowData,
0);
return QString::fromUtf8((
char*)value);
}
}
return QVariant();
}
void ListModel::selectionChanged(
const QItemSelection& selected,
const QItemSelection& deselected) {
UiListSelection *selection = listSelection(view->selectionModel());
UiEvent e;
e.obj = obj;
e.window = obj->window;
e.document = obj->ctx->document;
e.eventdata = selection;
e.intval = selection->count >
0 ? selection->rows[
0] : -
1;
callback(&e, userdata);
if(selection->count >
0) {
delete selection->rows;
}
delete selection;
}
TableModel::TableModel(UiObject *obj, QTreeView *view, UiListPtr *list, UiModelInfo *info) {
this->obj = obj;
this->list = list;
this->info = info;
this->view = view;
}
int TableModel::rowCount(
const QModelIndex &parent)
const {
return list->list->count(list->list);
}
int TableModel::columnCount(
const QModelIndex &parent)
const {
return info->columns;
}
QVariant TableModel::data(
const QModelIndex &index,
int role)
const {
if(role == Qt::DisplayRole) {
UiList *ls = list->list;
void *rowData = ls->get(ls, index.row());
if(rowData && info->getvalue) {
void *value = info->getvalue(rowData, index.column());
switch(info->types[index.column()]) {
case UI_STRING: {
return QString::fromUtf8((
char*)value);
}
case UI_INTEGER: {
int *intptr = (
int*)value;
return QVariant(*intptr);
}
}
}
}
return QVariant();
}
QVariant TableModel::headerData(
int section, Qt::Orientation orientation,
int role)
const {
if(role == Qt::DisplayRole) {
char *label = info->titles[section];
return QString::fromUtf8(label);
}
return QVariant();
}
void TableModel::update() {
emit dataChanged(QModelIndex(),QModelIndex());
}
void TableModel::selectionChanged(
const QItemSelection& selected,
const QItemSelection& deselected) {
UiListSelection *selection = listSelection(view->selectionModel());
UiEvent e;
e.obj = obj;
e.window = obj->window;
e.document = obj->ctx->document;
e.eventdata = selection;
e.intval = selection->count >
0 ? selection->rows[
0] : -
1;
info->selection(&e, info->userdata);
if(selection->count >
0) {
delete selection->rows;
}
delete selection;
}
void TableModel::activate(
const QModelIndex &) {
UiListSelection *selection = listSelection(view->selectionModel());
UiEvent e;
e.obj = obj;
e.window = obj->window;
e.document = obj->ctx->document;
e.eventdata = selection;
e.intval = selection->count >
0 ? selection->rows[
0] : -
1;
info->activate(&e, info->userdata);
if(selection->count >
0) {
delete selection->rows;
}
delete selection;
}