git-svn-id: svn://db.shs.com.ru/libs@650 a8b55f48-bf90-11e4-a774-851b48703e85

This commit is contained in:
2019-12-04 12:42:06 +00:00
parent 81c7de74f9
commit d7797e2278
6 changed files with 303 additions and 445 deletions

View File

@@ -55,14 +55,10 @@ SceneTree::SceneTree(QWidget * parent): QWidget(parent) {
icon_light = QIcon(":/icons/type-light.png");
icon_vis[0] = QIcon(":/icons/layer-visible-off.png");
icon_vis[1] = QIcon(":/icons/layer-visible-on.png");
QAction * a = 0;
a = new QAction(QIcon(":/icons/type-camera.png"), "Focus");
connect(a, SIGNAL(triggered()), this, SLOT(focusObjects()));
ui->treeObjects->addAction(a);
a = new QAction(QIcon(":/icons/edit-delete.png"), "Remove");
connect(a, SIGNAL(triggered()), this, SLOT(removeObjects()));
ui->treeObjects->addAction(a);
ui->treeObjects->addActions(actionsSelection());
ui->buttonFilter->addActions(QList<QAction*>() << ui->actionFilter_node << ui->actionFilter_mesh << ui->actionFilter_light << ui->actionFilter_camera);
view = 0;
hidden_by_filter = obj_count = 0;
block_tree = false;
connect(ui->treeObjects->selectionModel(), SIGNAL(selectionChanged(QItemSelection,QItemSelection)), this, SLOT(treeObjects_selectionCnahged()));
}
@@ -83,6 +79,21 @@ void SceneTree::assignQGLView(QGLView * v) {
}
QList<QAction *> SceneTree::actionsAdd() {
QList<QAction *> ret;
ret << ui->actionAdd_node << ui->actionAdd_light << ui->actionAdd_camera;
return ret;
}
QList<QAction *> SceneTree::actionsSelection() {
QList<QAction *> ret;
ret << ui->actionFocus << ui->actionRemove << ui->actionClone << ui->actionGroup
<< ui->actionSelect_parent << ui->actionSelect_by_mesh << ui->actionSelect_by_material;
return ret;
}
void SceneTree::changeEvent(QEvent * e) {
QWidget::changeEvent(e);
if (e->type() == QEvent::LanguageChange) {
@@ -112,6 +123,7 @@ void SceneTree::restoreExpanded(QTreeWidgetItem * ti) {
void SceneTree::makeObjetTree(ObjectBase * o, QTreeWidgetItem * ti) {
++obj_count;
for (int i = 0; i < o->childCount(); ++i) {
ObjectBase * co = o->child(i);
QTreeWidgetItem * ci = new QTreeWidgetItem(ti);
@@ -177,7 +189,7 @@ void SceneTree::selectionChanged() {
}
}
block_tree = false;
checkButtons();
checkActions();
}
@@ -200,6 +212,7 @@ bool SceneTree::filterTree(QTreeWidgetItem * ti, const QString & filter, int typ
if (ci->childCount() > 0) {
if (!filterTree(ci, filter, types)) {
ci->setHidden(true);
++hidden_by_filter;
continue;
}
ci->setHidden(false);
@@ -209,31 +222,32 @@ bool SceneTree::filterTree(QTreeWidgetItem * ti, const QString & filter, int typ
if (filter.isEmpty()) {
f = true;
} else {
f = f || cit.contains(filter);
f = f || cit.contains(filter, Qt::CaseInsensitive);
}
if ((types & t) != t)
f = false;
ci->setHidden(!f);
if (f) ret = true;
else ++hidden_by_filter;
}
}
return ret;
}
void SceneTree::checkButtons() {
void SceneTree::checkActions() {
bool has_1 = false, has_m = false;
if (view) {
has_1 = !view->selectedObjects().isEmpty();
has_m = view->selectedObjects().size() > 1;
}
ui->buttonFocus ->setEnabled(has_1);
ui->buttonRemove->setEnabled(has_1);
ui->buttonClone ->setEnabled(has_1);
ui->buttonSelectParent->setEnabled(has_1);
ui->buttonSelectByMesh->setEnabled(has_1);
ui->buttonSelectByMaterial->setEnabled(has_1);
ui->buttonGroup->setEnabled(has_m);
ui->actionFocus ->setEnabled(has_1);
ui->actionRemove->setEnabled(has_1);
ui->actionClone ->setEnabled(has_1);
ui->actionGroup->setEnabled(has_m);
ui->actionSelect_parent->setEnabled(has_1);
ui->actionSelect_by_mesh->setEnabled(has_1);
ui->actionSelect_by_material->setEnabled(has_1);
}
@@ -247,19 +261,21 @@ void SceneTree::treeObjects_selectionCnahged() {
sol << itemObject(i);
view->scene()->selectObjects(sol);
block_tree = false;
checkButtons();
checkActions();
}
void SceneTree::filter() {
int types = 0;
if (ui->buttonFilterNode ->isChecked()) types |= otNode ;
if (ui->buttonFilterMesh ->isChecked()) types |= otMesh ;
if (ui->buttonFilterLight ->isChecked()) types |= otLight ;
if (ui->buttonFilterCamera->isChecked()) types |= otCamera;
if (ui->actionFilter_node ->isChecked()) types |= otNode ;
if (ui->actionFilter_mesh ->isChecked()) types |= otMesh ;
if (ui->actionFilter_light ->isChecked()) types |= otLight ;
if (ui->actionFilter_camera->isChecked()) types |= otCamera;
if (types == 0) types = 0xFF;
hidden_by_filter = 0;
filterTree(ui->treeObjects->invisibleRootItem(), ui->lineFilter->text(), types);
ui->treeObjects->invisibleRootItem()->setHidden(false);
ui->labelCounts->setText(tr("%1 objects, %2 hide by filter").arg(obj_count).arg(hidden_by_filter));
}
@@ -307,7 +323,7 @@ void SceneTree::on_treeObjects_itemMoved(QTreeWidgetItem * item, QTreeWidgetItem
}
void SceneTree::on_buttonAddNode_clicked() {
void SceneTree::on_actionAdd_node_triggered() {
if (!view) return;
ObjectBase * no = new ObjectBase();
view->scene()->addObject(no);
@@ -315,7 +331,7 @@ void SceneTree::on_buttonAddNode_clicked() {
}
void SceneTree::on_buttonAddLight_clicked() {
void SceneTree::on_actionAdd_light_triggered() {
if (!view) return;
ObjectBase * no = new Light();
view->scene()->addObject(no);
@@ -323,7 +339,15 @@ void SceneTree::on_buttonAddLight_clicked() {
}
void SceneTree::on_buttonClone_clicked() {
void SceneTree::on_actionAdd_camera_triggered() {
if (!view) return;
ObjectBase * no = new Camera();
view->scene()->addObject(no);
view->scene()->selectObject(no);
}
void SceneTree::on_actionClone_triggered() {
if (!view) return;
QList<QTreeWidgetItem*> sil = ui->treeObjects->selectedItems();
QList<ObjectBase*> col;
@@ -338,7 +362,19 @@ void SceneTree::on_buttonClone_clicked() {
}
void SceneTree::on_buttonSelectParent_clicked() {
void SceneTree::on_actionGroup_triggered() {
if (!view) return;
QList<ObjectBase*> sol = view->scene()->selectedObjects(true);
ObjectBase * cp = sol[0]->parent();
ObjectBase * nr = new ObjectBase();
cp->addChild(nr);
foreach (ObjectBase * o, sol)
nr->addChild(o);
view->scene()->selectObject(nr);
}
void SceneTree::on_actionSelect_parent_triggered() {
if (!view) return;
QList<ObjectBase*> sol = view->scene()->selectedObjects(true);
QSet<ObjectBase*> nsl;
@@ -352,28 +388,16 @@ void SceneTree::on_buttonSelectParent_clicked() {
}
void SceneTree::on_buttonSelectByMesh_clicked() {
void SceneTree::on_actionSelect_by_mesh_triggered() {
view->scene()->selectObjectsByMesh();
}
void SceneTree::on_buttonSelectByMaterial_clicked() {
void SceneTree::on_actionSelect_by_material_triggered() {
view->scene()->selectObjectsByMaterial();
}
void SceneTree::on_buttonGroup_clicked() {
if (!view) return;
QList<ObjectBase*> sol = view->scene()->selectedObjects(true);
ObjectBase * cp = sol[0]->parent();
ObjectBase * nr = new ObjectBase();
cp->addChild(nr);
foreach (ObjectBase * o, sol)
nr->addChild(o);
view->scene()->selectObject(nr);
}
void SceneTree::removeObjects() {
if (!view) return;
QList<QTreeWidgetItem*> sil = ui->treeObjects->selectedItems();
@@ -408,7 +432,9 @@ void SceneTree::objectsTreeChanged() {
block_tree = false;
if (!view) return;
block_tree = true;
obj_count = 0;
makeObjetTree(view->scene()->rootObject(), ui->treeObjects->invisibleRootItem());
--obj_count;
restoreExpanded(ui->treeObjects->invisibleRootItem());
block_tree = false;
filter();