diff --git a/qglengine/icons/format-fill-color.png b/qglengine/icons/format-fill-color.png new file mode 100644 index 0000000..99412e9 Binary files /dev/null and b/qglengine/icons/format-fill-color.png differ diff --git a/qglengine/icons/group.png b/qglengine/icons/group.png new file mode 100644 index 0000000..5108637 Binary files /dev/null and b/qglengine/icons/group.png differ diff --git a/qglengine/widgets/scene_tree.cpp b/qglengine/widgets/scene_tree.cpp index 354b214..8b2642a 100644 --- a/qglengine/widgets/scene_tree.cpp +++ b/qglengine/widgets/scene_tree.cpp @@ -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() << 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 SceneTree::actionsAdd() { + QList ret; + ret << ui->actionAdd_node << ui->actionAdd_light << ui->actionAdd_camera; + return ret; +} + + +QList SceneTree::actionsSelection() { + QList 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 sil = ui->treeObjects->selectedItems(); QList col; @@ -338,7 +362,19 @@ void SceneTree::on_buttonClone_clicked() { } -void SceneTree::on_buttonSelectParent_clicked() { +void SceneTree::on_actionGroup_triggered() { + if (!view) return; + QList 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 sol = view->scene()->selectedObjects(true); QSet 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 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 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(); diff --git a/qglengine/widgets/scene_tree.h b/qglengine/widgets/scene_tree.h index 78b08d9..5cdad37 100644 --- a/qglengine/widgets/scene_tree.h +++ b/qglengine/widgets/scene_tree.h @@ -37,6 +37,8 @@ public: ~SceneTree(); void assignQGLView(QGLView * v); + QList actionsAdd(); + QList actionsSelection(); private: void changeEvent(QEvent * e); @@ -46,10 +48,11 @@ private: ObjectBase * itemObject(QTreeWidgetItem * item) const; int itemType(QTreeWidgetItem * item) const; bool filterTree(QTreeWidgetItem * ti, const QString & filter, int types); - void checkButtons(); + void checkActions(); Ui::SceneTree * ui; bool block_tree; + int hidden_by_filter, obj_count; QIcon icon_empty, icon_geo, icon_camera, icon_light, icon_vis[2]; QSet expanded_; QList geo_items; @@ -59,14 +62,19 @@ private slots: void treeObjects_selectionCnahged(); void on_treeObjects_itemChanged(QTreeWidgetItem * item, int column); void on_treeObjects_itemMoved (QTreeWidgetItem * item, QTreeWidgetItem * new_parent); - void on_buttonAddNode_clicked(); - void on_buttonAddLight_clicked(); - void on_buttonClone_clicked(); - void on_buttonUpdate_clicked() {objectsTreeChanged();} - void on_buttonSelectParent_clicked(); - void on_buttonSelectByMesh_clicked(); - void on_buttonSelectByMaterial_clicked(); - void on_buttonGroup_clicked(); + + void on_actionAdd_node_triggered(); + void on_actionAdd_light_triggered(); + void on_actionAdd_camera_triggered(); + + void on_actionFocus_triggered() {focusObjects();} + void on_actionRemove_triggered() {removeObjects();} + void on_actionClone_triggered(); + void on_actionGroup_triggered(); + + void on_actionSelect_parent_triggered(); + void on_actionSelect_by_mesh_triggered(); + void on_actionSelect_by_material_triggered(); void removeObjects(); void focusObjects(); diff --git a/qglengine/widgets/scene_tree.ui b/qglengine/widgets/scene_tree.ui index f742dc5..44b8a06 100644 --- a/qglengine/widgets/scene_tree.ui +++ b/qglengine/widgets/scene_tree.ui @@ -6,8 +6,8 @@ 0 0 - 345 - 494 + 442 + 606 @@ -24,350 +24,65 @@ 0 - + - - - Selection + + + Filter: - - - - - false - - - Focus on selected - - - - :/icons/type-camera.png:/icons/type-camera.png - - - - - - - Qt::Horizontal - - - - 1 - 20 - - - - - - - - false - - - Delete selected - - - - :/icons/edit-delete.png:/icons/edit-delete.png - - - - - - - Qt::Horizontal - - - QSizePolicy::Preferred - - - - 20 - 20 - - - - - - - - false - - - Clone selected - - - - :/icons/edit-copy.png:/icons/edit-copy.png - - - - - - - false - - - Group selected - - - G - - - - - - - false - - - Select parent - - - - :/icons/go-top.png:/icons/go-top.png - - - - - - - false - - - Select by mesh - - - - :/icons/type-geo.png:/icons/type-geo.png - - - - - - - false - - - Select by material - - - - :/icons/format-fill-color.png:/icons/format-fill-color.png - - - - - - - Add + + + + + + + :/icons/configure.png:/icons/configure.png + + + QToolButton::InstantPopup + + + + + + + Qt::Vertical + + + + + + + Expand tree + + + + :/icons/expand.png:/icons/expand.png + + + + + + + Collapse tree + + + + :/icons/collapse.png:/icons/collapse.png - - - - - Add empty object - - - - :/icons/add-type-empty.png:/icons/add-type-empty.png - - - - - - - Add light - - - - :/icons/add-type-light.png:/icons/add-type-light.png - - - - - - - Add camera - - - - :/icons/add-type-camera.png:/icons/add-type-camera.png - - - - - - - - - Filter - - - - QFormLayout::AllNonFixedFieldsGrow - - - Qt::AlignRight|Qt::AlignTrailing|Qt::AlignVCenter - - - - - Name: - - - - - - - - - - Types: - - - - - - - - 0 - - - 0 - - - 0 - - - 0 - - - - - Nodes - - - - :/icons/type-empty.png:/icons/type-empty.png - - - true - - - - - - - Meshes - - - - :/icons/type-geo.png:/icons/type-geo.png - - - true - - - - - - - Lights - - - - :/icons/type-light.png:/icons/type-light.png - - - true - - - - - - - Cameras - - - - :/icons/type-camera.png:/icons/type-camera.png - - - true - - - - - - - Qt::Horizontal - - - - 1 - 20 - - - - - - - - - - - - - - Tree - - - - - - Expand tree - - - - :/icons/expand.png:/icons/expand.png - - - - - - - Force update - - - - :/icons/view-refresh.png:/icons/view-refresh.png - - - - - - - Collapse tree - - - - :/icons/collapse.png:/icons/collapse.png - - - - - - - + + + + + @@ -407,6 +122,144 @@ + + + + :/icons/type-camera.png:/icons/type-camera.png + + + Focus + + + + + + :/icons/edit-delete.png:/icons/edit-delete.png + + + Remove + + + + + + :/icons/edit-copy.png:/icons/edit-copy.png + + + Clone + + + + + + :/icons/group.png:/icons/group.png + + + Group + + + + + + :/icons/go-top.png:/icons/go-top.png + + + Select parent + + + + + + :/icons/type-geo.png:/icons/type-geo.png + + + Select by mesh + + + + + + :/icons/format-fill-color.png:/icons/format-fill-color.png + + + Select by material + + + + + + :/icons/add-type-empty.png:/icons/add-type-empty.png + + + Add node + + + + + + :/icons/add-type-light.png:/icons/add-type-light.png + + + Add light + + + + + + :/icons/add-type-camera.png:/icons/add-type-camera.png + + + Add camera + + + + + true + + + + :/icons/type-empty.png:/icons/type-empty.png + + + Nodes + + + + + true + + + + :/icons/type-geo.png:/icons/type-geo.png + + + Meshes + + + + + true + + + + :/icons/type-light.png:/icons/type-light.png + + + Lights + + + + + true + + + + :/icons/type-camera.png:/icons/type-camera.png + + + Cameras + + @@ -422,8 +275,9 @@ + - + @@ -434,12 +288,12 @@ expandAll() - 288 - 143 + 395 + 164 299 - 174 + 359 @@ -450,44 +304,12 @@ collapseAll() - 319 - 137 + 427 + 164 332 - 184 - - - - - buttonFocus - clicked() - SceneTree - focusObjects() - - - 26 - 37 - - - 17 - 27 - - - - - buttonRemove - clicked() - SceneTree - removeObjects() - - - 122 - 39 - - - 114 - 26 + 369 @@ -498,8 +320,8 @@ filter() - 239 - 100 + 273 + 130 355 @@ -508,66 +330,66 @@ - buttonFilterNode + actionFilter_camera toggled(bool) SceneTree filter() - 61 - 137 + -1 + -1 - 353 - 109 + 414 + 302 - buttonFilterMesh + actionFilter_mesh toggled(bool) SceneTree filter() - 95 - 140 + -1 + -1 - 357 - 146 + 414 + 302 - buttonFilterLight + actionFilter_light toggled(bool) SceneTree filter() - 135 - 135 + -1 + -1 - 353 - 173 + 414 + 302 - buttonFilterCamera + actionFilter_node toggled(bool) SceneTree filter() - 161 - 135 + -1 + -1 - 351 - 226 + 414 + 302 diff --git a/qglengine/widgets/widgets.qrc b/qglengine/widgets/widgets.qrc index 6345623..db6b102 100644 --- a/qglengine/widgets/widgets.qrc +++ b/qglengine/widgets/widgets.qrc @@ -11,5 +11,7 @@ ../icons/edit-copy.png ../icons/edit-paste.png ../icons/document-edit.png + ../icons/group.png + ../icons/format-fill-color.png