From 07c9d67859248840bba0a178aab0dff4306c01c4 Mon Sep 17 00:00:00 2001 From: Aleks Kissinger Date: Sun, 7 Oct 2018 16:51:00 +0200 Subject: style editor uses custom models --- src/gui/styleeditor.cpp | 331 ++++++++++++++++++++---------------------------- src/gui/styleeditor.h | 9 +- 2 files changed, 138 insertions(+), 202 deletions(-) (limited to 'src') diff --git a/src/gui/styleeditor.cpp b/src/gui/styleeditor.cpp index 46df095..e3f8ace 100644 --- a/src/gui/styleeditor.cpp +++ b/src/gui/styleeditor.cpp @@ -18,27 +18,16 @@ StyleEditor::StyleEditor(QWidget *parent) : ui->leftArrow << ui->rightArrow << ui->properties; - _styles = 0; + _styles = nullptr; - _nodeModel = new QStandardItemModel(this); - _edgeModel = new QStandardItemModel(this); - - ui->styleListView->setModel(_nodeModel); ui->styleListView->setViewMode(QListView::IconMode); ui->styleListView->setMovement(QListView::Static); ui->styleListView->setGridSize(QSize(48,48)); - ui->edgeStyleListView->setModel(_edgeModel); ui->edgeStyleListView->setViewMode(QListView::IconMode); ui->edgeStyleListView->setMovement(QListView::Static); ui->edgeStyleListView->setGridSize(QSize(48,48)); - connect(ui->styleListView->selectionModel(), - SIGNAL(currentChanged(QModelIndex,QModelIndex)), - this, SLOT(nodeItemChanged(QModelIndex))); - connect(ui->edgeStyleListView->selectionModel(), - SIGNAL(currentChanged(QModelIndex,QModelIndex)), - this, SLOT(edgeItemChanged(QModelIndex))); connect(ui->category->lineEdit(), SIGNAL(editingFinished()), this, SLOT(categoryChanged())); @@ -80,9 +69,6 @@ StyleEditor::StyleEditor(QWidget *parent) : pos += 1; } - _activeNodeStyle = 0; - _activeEdgeStyle = 0; - _activeItem = 0; refreshDisplay(); } @@ -92,16 +78,19 @@ StyleEditor::~StyleEditor() } void StyleEditor::open() { - if (_styles != 0) delete _styles; + if (_styles != nullptr) delete _styles; _styles = new TikzStyles; - _activeNodeStyle = 0; - _activeEdgeStyle = 0; - _activeItem = 0; - ui->styleListView->selectionModel()->clear(); - ui->edgeStyleListView->selectionModel()->clear(); + ui->styleListView->setModel(_styles->nodeStyles()); + ui->edgeStyleListView->setModel(_styles->edgeStyles()); + connect(ui->styleListView->selectionModel(), + SIGNAL(currentChanged(QModelIndex,QModelIndex)), + this, SLOT(nodeItemChanged(QModelIndex))); + connect(ui->edgeStyleListView->selectionModel(), + SIGNAL(currentChanged(QModelIndex,QModelIndex)), + this, SLOT(edgeItemChanged(QModelIndex))); + if (_styles->loadStyles(tikzit->styleFilePath())) { _dirty = false; - _styles->refreshModels(_nodeModel, _edgeModel, "", false); refreshCategories(); refreshDisplay(); show(); @@ -136,42 +125,22 @@ void StyleEditor::closeEvent(QCloseEvent *event) void StyleEditor::nodeItemChanged(QModelIndex sel) { - //ui->edgeStyleListView->blockSignals(true); - ui->edgeStyleListView->selectionModel()->clear(); - //ui->edgeStyleListView->blockSignals(false); - //qDebug() << "got node item change"; - - _activeNodeStyle = 0; - _activeEdgeStyle = 0; - _activeItem = 0; - QString sty; if (sel.isValid()) { - _activeItem = _nodeModel->itemFromIndex(sel); - sty = _activeItem->text(); - if (sty != "none") - _activeNodeStyle = _styles->nodeStyle(sty); + ui->edgeStyleListView->selectionModel()->clear(); + qDebug() << "active style:" << ((activeStyle() == nullptr) ? "null" : activeStyle()->tikz()); + qDebug() << "style from index:" << _styles->nodeStyles()->styleInCategory(sel.row())->tikz(); } + _nodeStyleIndex = sel; refreshDisplay(); } void StyleEditor::edgeItemChanged(QModelIndex sel) { - //ui->styleListView->blockSignals(true); - ui->styleListView->selectionModel()->clear(); - //ui->styleListView->blockSignals(false); - //qDebug() << "got edge item change"; - - _activeNodeStyle = 0; - _activeEdgeStyle = 0; - _activeItem = 0; - - QString sty; if (sel.isValid()) { - _activeItem = _edgeModel->itemFromIndex(sel); - sty = _activeItem->text(); - if (sty != "none") - _activeEdgeStyle = _styles->edgeStyle(sty); + ui->styleListView->selectionModel()->clear(); + //_nodeStyleIndex = QModelIndex(); } + _edgeStyleIndex = sel; refreshDisplay(); } @@ -192,37 +161,6 @@ void StyleEditor::categoryChanged() void StyleEditor::currentCategoryChanged() { - qDebug() << "refreshing models on category change"; - _styles->refreshModels(_nodeModel, _edgeModel, ui->currentCategory->currentText(), false); - _activeItem = 0; - - // try to keep the selection as is, or clear the current style - if (_activeNodeStyle != 0) { - ui->styleListView->selectionModel()->clear(); - for (int i = 0; i < _nodeModel->rowCount(); ++i) { - if (_activeNodeStyle->name() == _nodeModel->item(i)->data()) { - _activeItem = _nodeModel->item(i); - ui->styleListView->selectionModel()->select( - _nodeModel->index(i,0), - QItemSelectionModel::SelectCurrent); - } - } - } else if (_activeEdgeStyle != 0) { - ui->edgeStyleListView->selectionModel()->clear(); - for (int i = 0; i < _edgeModel->rowCount(); ++i) { - if (_activeEdgeStyle->name() == _edgeModel->item(i)->data()) { - _activeItem = _edgeModel->item(i); - ui->edgeStyleListView->selectionModel()->select( - _edgeModel->index(i,0), - QItemSelectionModel::SelectCurrent); - } - } - } - - if (_activeItem == 0) { - _activeNodeStyle = 0; - _activeEdgeStyle = 0; - } } void StyleEditor::refreshCategories() @@ -234,7 +172,7 @@ void StyleEditor::refreshCategories() ui->currentCategory->clear(); ui->category->clear(); - if (_styles != 0) { + if (_styles != nullptr) { foreach(QString c, _styles->categories()) { ui->category->addItem(c); ui->currentCategory->addItem(c); @@ -249,11 +187,13 @@ void StyleEditor::refreshCategories() void StyleEditor::propertyChanged() { - if (_activeNodeStyle != 0) { - _activeItem->setIcon(_activeNodeStyle->icon()); + QModelIndexList nSel = ui->styleListView->selectionModel()->selectedRows(); + QModelIndexList eSel = ui->edgeStyleListView->selectionModel()->selectedRows(); + if (!nSel.isEmpty()) { + emit _styles->nodeStyles()->dataChanged(nSel[0], nSel[0]); refreshCategories(); - } else if (_activeEdgeStyle != 0) { - _activeItem->setIcon(_activeEdgeStyle->icon()); + } else if (!eSel.isEmpty()) { + emit _styles->edgeStyles()->dataChanged(eSel[0], eSel[0]); } _dirty = true; refreshDisplay(); @@ -285,115 +225,98 @@ void StyleEditor::refreshDisplay() ui->rightArrow->setCurrentText(""); ui->properties->setModel(0); - if (_activeNodeStyle != 0) { - //_activeItem->setText(_activeNodeStyle->name()); - //_activeItem->setIcon(_activeNodeStyle->icon()); + Style *s = activeStyle(); + if (s != nullptr && !s->isNone()) { + // name ui->name->setEnabled(true); - ui->name->setText(_activeNodeStyle->name()); - - ui->category->setEnabled(true); - ui->category->setCurrentText( - _activeNodeStyle->propertyWithDefault("tikzit category", "", false)); - - // passing 'false' to these methods prevents 'tikzit foo' from overriding property 'foo' - QColor realFill = _activeNodeStyle->fillColor(false); - QColor fill = _activeNodeStyle->fillColor(); - bool fillOverride = realFill != fill; - QColor realDraw = _activeNodeStyle->strokeColor(false); - QColor draw = _activeNodeStyle->strokeColor(); - bool drawOverride = realDraw != draw; + ui->name->setText(s->name()); - ui->fillColor->setEnabled(true); - setColor(ui->fillColor, realFill); + // property list + ui->properties->setEnabled(true); + setPropertyModel(s->data()); + // draw + QColor realDraw = s->strokeColor(false); + QColor draw = s->strokeColor(); ui->drawColor->setEnabled(true); setColor(ui->drawColor, realDraw); - - ui->hasTikzitFillColor->setEnabled(true); - ui->hasTikzitFillColor->setChecked(fillOverride); - - ui->tikzitFillColor->setEnabled(fillOverride); - if (fillOverride) setColor(ui->tikzitFillColor, fill); - + // tikzit draw + bool drawOverride = realDraw != draw; ui->hasTikzitDrawColor->setEnabled(true); ui->hasTikzitDrawColor->setChecked(drawOverride); ui->tikzitDrawColor->setEnabled(drawOverride); if (drawOverride) setColor(ui->tikzitDrawColor, draw); - QString realShape = _activeNodeStyle->propertyWithDefault("shape", "", false); - QString shape = _activeNodeStyle->propertyWithDefault("tikzit shape", "", false); - bool shapeOverride = shape != realShape; - ui->shape->setEnabled(true); - ui->shape->setCurrentText(realShape); - - ui->hasTikzitShape->setEnabled(true); - ui->tikzitShape->setEnabled(shapeOverride); - if (shapeOverride) ui->tikzitShape->setCurrentText(shape); - - ui->properties->setEnabled(true); - setPropertyModel(_activeNodeStyle->data()); - qDebug() << _activeNodeStyle->data()->tikz(); - } else if (_activeEdgeStyle != 0) { - //_activeItem->setText(_activeEdgeStyle->name()); - //_activeItem->setIcon(_activeEdgeStyle->icon()); - ui->name->setEnabled(true); - ui->name->setText(_activeEdgeStyle->name()); - - //ui->category->setEnabled(true); - //ui->category->setCurrentText( - // _activeEdgeStyle->propertyWithDefault("tikzit category", "", false)); - - setColor(ui->fillColor, QColor(Qt::gray)); - setColor(ui->tikzitFillColor, QColor(Qt::gray)); - ui->hasTikzitFillColor->setChecked(false); - - - // passing 'false' to these methods prevents 'tikzit foo' from overriding property 'foo' - QColor realDraw = _activeEdgeStyle->strokeColor(false); - QColor draw = _activeEdgeStyle->strokeColor(); - bool drawOverride = realDraw != draw; - - ui->drawColor->setEnabled(true); - setColor(ui->drawColor, realDraw); - - ui->hasTikzitDrawColor->setEnabled(true); - ui->hasTikzitDrawColor->setChecked(drawOverride); - - ui->tikzitDrawColor->setEnabled(drawOverride); - setColor(ui->tikzitDrawColor, draw); - - ui->leftArrow->setEnabled(true); - - switch (_activeEdgeStyle->arrowTail()) { - case Style::NoTip: - ui->leftArrow->setCurrentText(""); - break; - case Style::Pointer: - ui->leftArrow->setCurrentText("<"); - break; - case Style::Flat: - ui->leftArrow->setCurrentText("|"); - break; - } + if (!s->isEdgeStyle()) { + // category + ui->category->setEnabled(true); + ui->category->setCurrentText( + s->propertyWithDefault("tikzit category", "", false)); + + // fill + QColor realFill = s->fillColor(false); + QColor fill = s->fillColor(); + ui->fillColor->setEnabled(true); + setColor(ui->fillColor, realFill); + + // tikzit fill + bool fillOverride = realFill != fill; + ui->hasTikzitFillColor->setEnabled(true); + ui->hasTikzitFillColor->setChecked(fillOverride); + ui->tikzitFillColor->setEnabled(fillOverride); + if (fillOverride) setColor(ui->tikzitFillColor, fill); + + // shape + QString realShape = s->propertyWithDefault("shape", "", false); + QString shape = s->propertyWithDefault("tikzit shape", "", false); + ui->shape->setEnabled(true); + ui->shape->setCurrentText(realShape); + + // tikzit shape + bool shapeOverride = shape != realShape; + ui->hasTikzitShape->setEnabled(true); + ui->tikzitShape->setEnabled(shapeOverride); + if (shapeOverride) ui->tikzitShape->setCurrentText(shape); + } else { + // set fill to gray (disabled) + setColor(ui->fillColor, QColor(Qt::gray)); + setColor(ui->tikzitFillColor, QColor(Qt::gray)); + ui->hasTikzitFillColor->setChecked(false); + + + // arrow tail + ui->leftArrow->setEnabled(true); + + switch (s->arrowTail()) { + case Style::NoTip: + ui->leftArrow->setCurrentText(""); + break; + case Style::Pointer: + ui->leftArrow->setCurrentText("<"); + break; + case Style::Flat: + ui->leftArrow->setCurrentText("|"); + break; + } - ui->rightArrow->setEnabled(true); - switch (_activeEdgeStyle->arrowHead()) { - case Style::NoTip: - ui->rightArrow->setCurrentText(""); - break; - case Style::Pointer: - ui->rightArrow->setCurrentText(">"); - break; - case Style::Flat: - ui->rightArrow->setCurrentText("|"); - break; + // arrow head + ui->rightArrow->setEnabled(true); + switch (s->arrowHead()) { + case Style::NoTip: + ui->rightArrow->setCurrentText(""); + break; + case Style::Pointer: + ui->rightArrow->setCurrentText(">"); + break; + case Style::Flat: + ui->rightArrow->setCurrentText("|"); + break; + } } - ui->properties->setEnabled(true); - setPropertyModel(_activeEdgeStyle->data()); } else { setColor(ui->fillColor, QColor(Qt::gray)); setColor(ui->drawColor, QColor(Qt::gray)); @@ -529,18 +452,19 @@ void StyleEditor::on_name_editingFinished() if (s != 0) { s->setName(ui->name->text()); - _activeItem->setText(ui->name->text()); - refreshDisplay(); + refreshActiveStyle(); +// refreshDisplay(); _dirty = true; } } void StyleEditor::on_shape_currentTextChanged() { - if (_activeNodeStyle != 0) { - _activeNodeStyle->data()->setProperty("shape", ui->shape->currentText()); - _activeItem->setIcon(_activeNodeStyle->icon()); - refreshDisplay(); + Style *s = activeStyle(); + if (s != 0) { + s->data()->setProperty("shape", ui->shape->currentText()); + refreshActiveStyle(); +// refreshDisplay(); _dirty = true; } } @@ -572,8 +496,26 @@ QColor StyleEditor::color(QPushButton *btn) Style *StyleEditor::activeStyle() { - if (_activeNodeStyle != 0) return _activeNodeStyle; - else return _activeEdgeStyle; + if (_styles != nullptr) { + if (_nodeStyleIndex.isValid()) + return _styles->nodeStyles()->styleInCategory(_nodeStyleIndex.row()); + + if (_edgeStyleIndex.isValid()) + return _styles->edgeStyles()->styleInCategory(_edgeStyleIndex.row()); + } + + return nullptr; +} + +void StyleEditor::refreshActiveStyle() +{ + if (_styles != nullptr) { + if (_nodeStyleIndex.isValid()) + emit _styles->nodeStyles()->dataChanged(_nodeStyleIndex, _nodeStyleIndex); + + if (_edgeStyleIndex.isValid()) + emit _styles->edgeStyles()->dataChanged(_edgeStyleIndex, _edgeStyleIndex); + } } void StyleEditor::updateColor(QPushButton *btn, QString name, QString propName) @@ -583,17 +525,12 @@ void StyleEditor::updateColor(QPushButton *btn, QString name, QString propName) this, name, QColorDialog::DontUseNativeDialog); - if (col.isValid()) { - setColor(btn, col); - if (_activeNodeStyle != 0) { - _activeNodeStyle->data()->setProperty(propName, tikzit->nameForColor(col)); - _activeItem->setIcon(_activeNodeStyle->icon()); - } else if (_activeEdgeStyle != 0) { - _activeEdgeStyle->data()->setProperty(propName, tikzit->nameForColor(col)); - _activeItem->setIcon(_activeEdgeStyle->icon()); - } - - refreshDisplay(); + setColor(btn, col); + Style *s = activeStyle(); + if (s != nullptr) { + s->data()->setProperty(propName, tikzit->nameForColor(col)); + refreshActiveStyle(); +// refreshDisplay(); _dirty = true; } } diff --git a/src/gui/styleeditor.h b/src/gui/styleeditor.h index e40facd..fed2908 100644 --- a/src/gui/styleeditor.h +++ b/src/gui/styleeditor.h @@ -58,17 +58,16 @@ private: void setColor(QPushButton *btn, QColor col); void setPropertyModel(GraphElementData *d); QColor color(QPushButton *btn); - QStandardItemModel *_nodeModel; - QStandardItemModel *_edgeModel; - QStandardItem *_activeItem; - Style *_activeNodeStyle; - Style *_activeEdgeStyle; //QString _activeCategory; Style *activeStyle(); + void refreshActiveStyle(); TikzStyles *_styles; void updateColor(QPushButton *btn, QString name, QString propName); QVector _formWidgets; bool _dirty; + + QModelIndex _nodeStyleIndex; + QModelIndex _edgeStyleIndex; }; #endif // STYLEEDITOR_H -- cgit v1.2.3