This repository has been archived on 2020-09-07. You can view files and clone it. You cannot open issues or pull requests or push a commit.
Files
libs/qglengine/widgets/materials_editor.cpp

204 lines
5.6 KiB
C++

/*
QGLView
Copyright (C) 2019 Ivan Pelipenko peri4ko@yandex.ru
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
#include "materials_editor.h"
#include "ui_materials_editor.h"
#include "material_editor.h"
#include "qglview.h"
#include "glmaterial.h"
#include <qad_types.h>
#include <ecombobox.h>
#include <QInputDialog>
MaterialsEditor::MaterialsEditor(QWidget * parent): QWidget(parent) {
ui = new Ui::MaterialsEditor();
ui->setupUi(this);
ui->widgetMaterial->setMaterial(0);
ui->scrollArea->viewport()->setAutoFillBackground(false);
ui->scrollAreaWidgetContents->setAutoFillBackground(false);
view = 0;
}
void MaterialsEditor::assignQGLView(QGLView * v) {
view = v;
connect(view, SIGNAL(selectionChanged()), this, SLOT(selectionChanged()));
connect(view, SIGNAL(materialsChanged()), this, SLOT(materialsChanged()));
connect(view, SIGNAL(materialThumbnailCreated(Material*)), this, SLOT(materialThumbnailCreated(Material*)));
materialsChanged();
}
bool MaterialsEditor::event(QEvent * e) {
if (e->type() == QEvent::FontChange || e->type() == QEvent::Polish) {
QSize sz = preferredIconSize(1.5, this);
ui->comboMaterial->setIconSize(sz * 3);
ui->buttonRename->setIconSize(sz);
ui->buttonAdd ->setIconSize(sz);
ui->buttonClone ->setIconSize(sz);
ui->buttonDelete->setIconSize(sz);
ui->buttonAssign->setIconSize(sz);
ui->buttonUnset ->setIconSize(sz);
}
return QWidget::event(e);
}
void MaterialsEditor::changeEvent(QEvent * e) {
QWidget::changeEvent(e);
switch (e->type()) {
case QEvent::LanguageChange:
ui->retranslateUi(this);
break;
default:
break;
}
}
Material * MaterialsEditor::currentMaterial() {
if (!view) return 0;
int ind = ui->comboMaterial->currentIndex();
QVector<Material*> mats = view->scene()->getMaterials();
if (ind < 0 || ind >= mats.size()) return 0;
return mats[ind];
}
void MaterialsEditor::selectMaterial(Material * m) {
if (!m) {
ui->comboMaterial->setCurrentIndex(-1);
return;
}
for (int i = 0; i < ui->comboMaterial->count(); ++i) {
if ((Material*)(ui->comboMaterial->itemData(i, Qt::UserRole + 1).value<quintptr>()) == m) {
ui->comboMaterial->setCurrentIndex(i);
break;
}
}
}
int MaterialsEditor::indexByMaterial(Material * m) {
if (!m) return -1;
for (int i = 0; i < ui->comboMaterial->count(); ++i) {
if ((Material*)(ui->comboMaterial->itemData(i, Qt::UserRole + 1).value<quintptr>()) == m)
return i;
}
return -1;
}
void MaterialsEditor::selectionChanged() {
if (!view) return;
//qDebug() << "selectionChanged";
ObjectBase * o = view->selectedObject();
if (o) selectMaterial(o->material());
}
void MaterialsEditor::materialsChanged() {
Material * cm = currentMaterial();
ui->comboMaterial->clear();
if (!view) return;
QVector<Material*> mats = view->scene()->getMaterials();
for (int i = 0; i < mats.size(); ++i) {
Material * m = mats[i];
ui->comboMaterial->addItem(QString("[%1] " + m->name).arg(i + 1), QVariant(m->name));
ui->comboMaterial->setItemData(i, QVariant(quintptr(m)), Qt::UserRole + 1);
ui->comboMaterial->setItemIcon(i, QIcon(QPixmap::fromImage(view->materialThumbnail(m))));
if (cm == m) ui->comboMaterial->setCurrentIndex(i);
}
}
void MaterialsEditor::materialThumbnailCreated(Material * m) {
//qDebug() << "materialThumbnailCreated" << m;
int i = indexByMaterial(m);
if (i < 0 || !view) return;
//qDebug() << "materialThumbnailCreated set to" << i;
ui->comboMaterial->setItemIcon(i, QIcon(QPixmap::fromImage(view->materialThumbnail(m))));
}
void MaterialsEditor::on_comboMaterial_currentIndexChanged(int index) {
ui->widgetMaterial->setMaterial(currentMaterial());
}
void MaterialsEditor::on_buttonRename_clicked() {
Material * m = currentMaterial();
if (!m) return;
QString nn = QInputDialog::getText(this, "Materials editor", "Input new name:", QLineEdit::Normal, m->name);
if (nn.isEmpty()) return;
m->name = nn;
int ind = ui->comboMaterial->currentIndex();
ui->comboMaterial->setItemText(ind, QString("[%1] " + nn).arg(ind + 1));
ui->comboMaterial->setItemData(ind, nn);
}
void MaterialsEditor::on_buttonAdd_clicked() {
if (!view) return;
Material * m = view->scene()->newMaterial();
materialsChanged();
selectMaterial(m);
}
void MaterialsEditor::on_buttonClone_clicked() {
if (!view) return;
Material * curm = currentMaterial();
if (!curm) return;
Material * m = view->scene()->newMaterial(curm->name);
QString nm = m->name;
*m = *curm;
m->name = nm;
m->_changed = true;
materialsChanged();
selectMaterial(m);
}
void MaterialsEditor::on_buttonDelete_clicked() {
if (!view) return;
Material * m = currentMaterial();
if (!m) return;
view->scene()->removeMaterial(m);
materialsChanged();
}
void MaterialsEditor::on_buttonAssign_clicked() {
if (!view) return;
Material * m = currentMaterial();
ObjectBaseList ol = view->selectedObjects();
foreach (ObjectBase * o, ol)
o->setMaterial(m, true);
}
void MaterialsEditor::on_buttonUnset_clicked() {
if (!view) return;
ObjectBaseList ol = view->selectedObjects();
foreach (ObjectBase * o, ol)
o->setMaterial(0, true);
}