bool KstImageDialogI::editObject() { KstImageList imList = kstObjectSubList<KstDataObject,KstImage>(KST::dataObjectList); // if editing multiple objects, edit each one if (_editMultipleMode) { _numContourLinesDirty = _w->_numContourLines->text() != " "; _contourWeightDirty = _w->_contourWeight->text() != " "; _paletteDirty = _w->_colorPalette->currentPaletteIndex() != 0; _matrixDirty = _w->_matrix->_matrix->currentItem() != 0; _lowerZDirty = !_w->_lowerZ->text().isEmpty(); _upperZDirty = !_w->_upperZ->text().isEmpty(); bool didEdit = false; for (uint i = 0; i < _editMultipleWidget->_objectList->count(); ++i) { if (_editMultipleWidget->_objectList->isSelected(i)) { // get the pointer to the object KstImageList::Iterator imIter = imList.findTag(_editMultipleWidget->_objectList->text(i)); if (imIter == imList.end()) { return false; } KstImagePtr imPtr = *imIter; if (!editSingleObject(imPtr)) { return false; } didEdit = true; } } if (!didEdit) { KMessageBox::sorry(this, i18n("Select one or more objects to edit.")); return false; } } else { KstImagePtr ip = kst_cast<KstImage>(_dp); // verify that the curve name is unique QString tag_name = _tagName->text(); if (!ip || (tag_name != ip->tagName() && KstData::self()->dataTagNameNotUnique(tag_name))) { _tagName->setFocus(); return false; } ip->writeLock(); ip->setTagName(KstObjectTag(tag_name, ip->tag().context())); // FIXME: doesn't allow changing tag context ip->unlock(); // then edit the object _colorOnlyDirty = true; _contourOnlyDirty = true; _colorAndContourDirty = true; _paletteDirty = true; _lowerZDirty = true; _upperZDirty = true; _realTimeAutoThresholdDirty = true; _numContourLinesDirty = true; _contourWeightDirty = true; _useVariableWeightDirty = true; _contourColorDirty = true; if (!editSingleObject(ip)) { return false; } } emit modified(); return true; }
bool KstImageDialogI::editSingleObject(KstImagePtr imPtr) { KstMatrixPtr pMatrix; if (_matrixDirty) { //find the pMatrix KST::matrixList.lock().readLock(); pMatrix = *KST::matrixList.findTag(_w->_matrix->selectedMatrix()); KST::matrixList.lock().unlock(); if (!pMatrix) { KMessageBox::sorry(this, i18n("Matrix is a 2D grid of numbers, used to create image", "Could not find pMatrix.")); return false; } } else { imPtr->readLock(); pMatrix = imPtr->matrix(); imPtr->unlock(); } imPtr->writeLock(); // if image type was changed, get all parameters from the dialog if (_contourOnlyDirty || _colorOnlyDirty || _colorAndContourDirty) { double lowerZDouble, upperZDouble; if (!checkParameters(lowerZDouble, upperZDouble)) { //KMessageBox::sorry(this, i18n("Image type was changed: Lower Z threshold cannot be higher than Upper Z threshold.")); //pMatrix->unlock(); imPtr->unlock(); return false; } if (_w->_contourOnly->isChecked()) { //need a contour map only QColor tempColor = _w->_contourColor->color(); imPtr->changeToContourOnly(imPtr->tagName(), pMatrix, _w->_numContourLines->text().toInt(), tempColor, _w->_useVariableWeight->isChecked() ? -1 : _w->_contourWeight->value()); } else if (_w->_colorOnly->isChecked()) { //need a color map only KPalette* newPal = new KPalette(_w->_colorPalette->selectedPalette()); imPtr->changeToColorOnly(imPtr->tagName(), pMatrix, lowerZDouble, upperZDouble, _w->_realTimeAutoThreshold->isChecked(), newPal); } else { //need both a contour map and colour map QColor tempColor = _w->_contourColor->color(); KPalette* newPal = new KPalette(_w->_colorPalette->selectedPalette()); imPtr->changeToColorAndContour(imPtr->tagName(), pMatrix, lowerZDouble, upperZDouble, _w->_realTimeAutoThreshold->isChecked(), newPal, _w->_numContourLines->text().toInt(), tempColor, _w->_useVariableWeight->isChecked() ? -1 : _w->_contourWeight->value()); } } else { // get the current or new parameters as required QColor pContourColor; double pLowerZ, pUpperZ; int pNumContours, pContourWeight; bool pRealTimeAutoThreshold, pUseVariableWeight; if (_lowerZDirty) { pLowerZ = _w->_lowerZ->text().toDouble(); } else { pLowerZ = imPtr->lowerThreshold(); } if (_upperZDirty) { pUpperZ = _w->_upperZ->text().toDouble(); } else { pUpperZ = imPtr->upperThreshold(); } if (_realTimeAutoThresholdDirty) { pRealTimeAutoThreshold = _w->_realTimeAutoThreshold->isChecked(); } else { pRealTimeAutoThreshold = imPtr->autoThreshold(); } if (_numContourLinesDirty) { pNumContours = _w->_numContourLines->text().toInt(); } else { pNumContours = imPtr->numContourLines(); } if (_contourWeightDirty) { pContourWeight = _w->_contourWeight->value(); } else { pContourWeight = imPtr->contourWeight(); } if (_useVariableWeightDirty) { pUseVariableWeight = _w->_useVariableWeight->isChecked(); } else { pUseVariableWeight = imPtr->contourWeight() == -1; } if (_contourColorDirty) { pContourColor = _w->_contourColor->color(); } else { pContourColor = imPtr->contourColor(); } // check parameters for color map if (imPtr->hasColorMap()) { if (pLowerZ > pUpperZ) { //KMessageBox::sorry(this, i18n("The Lower Z threshold cannot be higher than Upper Z threshold.")); //pMatrix->unlock(); imPtr->unlock(); return false; } } // don't change the image type, just change applicable settings for the // current image type if (imPtr->hasContourMap() && !imPtr->hasColorMap()) { imPtr->changeToContourOnly(imPtr->tagName(), pMatrix, pNumContours, pContourColor, pUseVariableWeight ? -1 : pContourWeight); } else { KPalette *palette; if (_paletteDirty) { palette = new KPalette(_w->_colorPalette->selectedPalette()); } else { palette = imPtr->palette(); } if (imPtr->hasColorMap() && !imPtr->hasContourMap()) { imPtr->changeToColorOnly(imPtr->tagName(), pMatrix, pLowerZ, pUpperZ, pRealTimeAutoThreshold, palette); } else { // images always have at least one of color or contour maps imPtr->changeToColorAndContour(imPtr->tagName(), pMatrix, pLowerZ, pUpperZ, pRealTimeAutoThreshold, palette, pNumContours, pContourColor, pUseVariableWeight ? -1 : pContourWeight); } } } imPtr->unlock(); return true; }