nuclear@86: #include nuclear@86: #include "scenemodel.h" nuclear@88: #include "goatview.h" nuclear@86: nuclear@86: SceneModel::SceneModel() nuclear@86: { nuclear@86: scn = 0; nuclear@86: } nuclear@86: nuclear@86: SceneModel::~SceneModel() nuclear@86: { nuclear@86: clear_scene(); nuclear@86: } nuclear@86: nuclear@86: void SceneModel::set_scene(goat3d *scn) nuclear@86: { nuclear@86: clear_scene(); nuclear@86: this->scn = scn; nuclear@86: nuclear@86: if(!scn) return; nuclear@86: nuclear@86: // create the SceneNodeData for each node nuclear@86: int num_nodes = goat3d_get_node_count(scn); nuclear@86: for(int i=0; isecond; nuclear@86: } nuclear@86: nuclear@86: Qt::ItemFlags SceneModel::flags(const QModelIndex &index) const nuclear@86: { nuclear@86: if(!index.isValid()) { nuclear@86: return 0; nuclear@86: } nuclear@86: nuclear@86: Qt::ItemFlags res = Qt::ItemIsEnabled | Qt::ItemIsSelectable; nuclear@86: if(index.column() == 1) { nuclear@86: res |= Qt::ItemIsUserCheckable | Qt::ItemIsEditable; nuclear@86: } nuclear@86: return res; nuclear@86: } nuclear@86: nuclear@86: QVariant SceneModel::data(const QModelIndex &index, int role) const nuclear@86: { nuclear@86: if(!index.isValid()) { nuclear@86: return QVariant(); nuclear@86: } nuclear@86: nuclear@86: goat3d_node *node = (goat3d_node*)index.internalPointer(); nuclear@86: SceneNodeData *data = get_node_data(node); nuclear@86: nuclear@86: switch(index.column()) { nuclear@86: case 0: nuclear@86: if(role == Qt::DisplayRole) { nuclear@86: return QString(goat3d_get_node_name(node)); nuclear@86: } nuclear@86: break; nuclear@86: nuclear@86: case 1: nuclear@86: if(role == Qt::CheckStateRole && data) { nuclear@86: return data->visible ? Qt::Checked : Qt::Unchecked; nuclear@86: } nuclear@86: break; nuclear@86: nuclear@86: default: nuclear@86: break; nuclear@86: } nuclear@86: nuclear@86: return QVariant(); nuclear@86: } nuclear@86: nuclear@86: bool SceneModel::setData(const QModelIndex &index, const QVariant &value, int role) nuclear@86: { nuclear@86: if(!index.isValid()) { nuclear@86: return false; nuclear@86: } nuclear@86: nuclear@86: goat3d_node *node = (goat3d_node*)index.internalPointer(); nuclear@86: SceneNodeData *data = get_node_data(node); nuclear@86: assert(data); nuclear@86: nuclear@86: switch(index.column()) { nuclear@86: case 1: nuclear@86: if(role == Qt::CheckStateRole) { nuclear@86: data->visible = value.toBool(); nuclear@86: emit dataChanged(index, index); nuclear@86: return true; nuclear@86: } nuclear@86: break; nuclear@86: nuclear@86: default: nuclear@86: break; nuclear@86: } nuclear@86: return false; nuclear@86: } nuclear@86: nuclear@86: QVariant SceneModel::headerData(int section, Qt::Orientation orient, int role) const nuclear@86: { nuclear@86: if(orient == Qt::Horizontal && role == Qt::DisplayRole) { nuclear@86: switch(section) { nuclear@86: case 0: nuclear@86: return QString("name"); nuclear@86: case 1: nuclear@86: return QString("vis"); nuclear@86: default: nuclear@86: return QString("???"); nuclear@86: } nuclear@86: } nuclear@86: return QVariant(); nuclear@86: } nuclear@86: nuclear@86: int SceneModel::rowCount(const QModelIndex &parent) const nuclear@86: { nuclear@86: if(!scn) return 0; nuclear@86: nuclear@86: if(!parent.isValid()) { nuclear@86: // return the number of root nodes nuclear@86: int num_nodes = goat3d_get_node_count(scn); nuclear@86: int num_root_nodes = 0; nuclear@86: for(int i=0; i 0; nuclear@86: } nuclear@86: nuclear@86: QModelIndex SceneModel::index(int row, int column, const QModelIndex &parent) const nuclear@86: { nuclear@86: if(!scn) { nuclear@86: return QModelIndex(); nuclear@86: } nuclear@86: nuclear@86: goat3d_node *node = 0; nuclear@86: nuclear@86: if(!parent.isValid()) { nuclear@86: int num_nodes = goat3d_get_node_count(scn); nuclear@86: int idx = 0; nuclear@86: for(int i=0; i::iterator it = selected.begin(); nuclear@88: while(it != selected.end()) { nuclear@88: goat3d_node *node = *it++; nuclear@88: SceneNodeData *data = get_node_data(node); nuclear@88: data->selected = false; nuclear@88: } nuclear@88: selected.clear(); nuclear@88: nuclear@88: for(int i=0; iselected = true; nuclear@88: selected.insert(node); nuclear@88: } nuclear@88: nuclear@88: post_redisplay(); nuclear@88: }