//! [3] void View::addItems() { int officeCount = officeTable->rowCount(); int imageOffset = 150; int leftMargin = 70; int topMargin = 40; for (int i = 0; i < officeCount; i++) { ImageItem *image; QGraphicsTextItem *label; QSqlRecord record = officeTable->record(i); int id = record.value("id").toInt(); QString file = record.value("file").toString(); QString location = record.value("location").toString(); int columnOffset = ((i / 3) * 37); int x = ((i / 3) * imageOffset) + leftMargin + columnOffset; int y = ((i % 3) * imageOffset) + topMargin; image = new ImageItem(id, QPixmap(":/" + file)); image->setData(0, i); image->setPos(x, y); scene->addItem(image); label = scene->addText(location); QPointF labelOffset((150 - label->boundingRect().width()) / 2, 120.0); label->setPos(QPointF(x, y) + labelOffset); } }
bool StitcherView::loadImage(QString s){ Image * a = sp_image_read(s.toAscii(),0); ImageItem * item = new ImageItem(a,s,this,NULL); addImage(item); item->update(); return true; }
void ImageModel::AddImage(const cv::Mat image, const QString fileName) { QFileInfo fileInfo(fileName); QString name = fileInfo.fileName(); // find image if already in list and remove before append new one; ImageItem* child = this->findImage(fileName); if(child) { child->remove(); } int channelsCount = image.channels(); if(channelsCount>1) { ImageItem* multichannelImage = new ImageItem(name, fileName); vector<cv::Mat> imageChannels; cv::split(image, imageChannels); QHash<int, QString> ChannelsStrings; ChannelsStrings[0] = QString("Red"); ChannelsStrings[1] = QString("Green"); ChannelsStrings[2] = QString("Blue"); ChannelsStrings[3] = QString("Alpha"); for(int i = 0; i<channelsCount; i++) { ImageItem* child = new ImageItem(imageChannels[i], name+QString(" ")+ChannelsStrings[i], fileName, i); multichannelImage->appendChild(child); } this->AddItem(multichannelImage); } else { ImageItem* item = new ImageItem(image, name, fileName, 0); this->AddItem(item); } }
void ImageItemView::slotDelete() { QModelIndexList selected = selectedIndexes(); if (selected.isEmpty()) { return; } QStringList names; for (QModelIndexList::iterator it = selected.begin(); it != selected.end(); it++) { ImageItem* itm = (ImageItem*) ((ImageItemModel*) model())->itemFromIndex(*it); if (itm) { names << tr("Name: %1, ID: %2") .arg(itm->getImage()->getName()) .arg(itm->getImage()->getId()); } } if (QMessageBox::Yes == QMessageBox::warning(this, tr("Really Delete?"), tr("Really delete this Images?\n%1") .arg(names.join(", ")), QMessageBox::Yes | QMessageBox::No)) { emit deleteRequest(selected); } }
void ImageStripScene::mouseDoubleClickEvent(QGraphicsSceneMouseEvent* event) { ImageItem* item = static_cast<ImageItem*>(itemAt(event->scenePos())); if(item) emit sigImageActivated(item->path()); }
void BlurPicker::setupScene() { QSize size = BlurPicker::size(); // scene()->setSceneRect(-size.width()/2,-size.height()/2,size.width(),size.height()); scene()->setSceneRect(-500, -309, 1000, 618); QStringList names; names << ":/images/LEDLabel.png"; //id=0 led names << ":/images/timerLabel.png";//id=1 定时器 names << ":/images/ThermometerLabel.png"; //id=2 温度 names << ":/images/temAndHumLabel.png";//id=3 温湿度 names << ":/images/shockLabel.png";//id=4 震动 names << ":/images/rfidLabel.png";//id=5 RFID names << ":/images/portLabel.png";//id=6 串口通信 names << ":/images/motorLabel.png";//id=7 步进电机 names << ":/images/lightLabel.png";//id=8 光线 names << ":/images/LCDLabel.png";//id=9 LCD names << ":/images/interruptLabel.png";//id=10 中断 names << ":/images/infarredLabel.png";//id=11 红外线 names << ":/images/enterLabel.png";//id=12 按键 names << ":/images/audioLabel.png";//id=13 蜂鸣器 names << ":/images/compLabel.png";//id=14 综合 for (int i = 0; i < names.count(); i++) { QPixmap pixmap(names[i]); //QGraphicsPixmapItem *icon = scene()->addPixmap(pixmap); ImageItem *icon = new ImageItem(i,QPixmap(names[i]),this); scene()->addItem(icon); // ZValue,层叠次序 icon->setZValue(1); icon->setGraphicsEffect(new BlurEffect(icon)); m_icons << icon; } }
QString ImageItem::path() const { QStringList names; ImageItem *parent = m_parentItem; while (parent && parent->type() != Root) { names.prepend(parent->name()); parent = parent->parent(); } return names.join("/") + "/"; }
void ImageItemView::slotIndexActivated(const QModelIndex& idx) { if (!idx.isValid()) { emit currentImageChanged(0); return; } ImageItem* itm = (ImageItem*) (((ImageItemModel*) model())->itemFromIndex(idx)); if (!itm) { emit currentImageChanged(0); } else { emit currentImageChanged(itm->getImage()); } }
void View::addItems() { int imageOffset = 140; int leftMargin = 40; int topMargin = 40; if(comportamiento == 0) { query.prepare("select imagen_pk from e_imagen where (url = '"+carpeta+"' and reporte_operatorio_pk IS NULL)"); qDebug()<<"Entro a NULL"<<endl; } else { query.prepare("select imagen_pk from e_imagen where (url = '"+carpeta+"' and reporte_operatorio_pk = '"+documento+"')"); qDebug()<<"Entro a "<<documento<<endl; //qDebug("select imagen_pk from e_imagen where (url = '"+carpeta.toStdString()+"' and reporte_operatorio_pk = '"+documento.toStdString()+"')"); } int i = 0; query.exec(); while(query.next()) { QGraphicsTextItem *label = new QGraphicsTextItem; int id = query.value(0).toInt(); QString file = query.value(0).toString()+".JPG"; qDebug()<<"Agregando al visor"<<file<<endl; QFileInfo fileInfo(file); //fecha de creacion de archivo QString location = fileInfo.created().toString(); int columnOffset = ((i / 3) * 37); int x = ((i / 3) * imageOffset) + leftMargin + columnOffset; int y = ((i % 3) * imageOffset) + topMargin; ImageItem *image = new ImageItem(id, QPixmap(file)); image->setData(0, i); image->setPos(x, y); scene->addItem(image); label = scene->addText(location); QPointF labelOffset((150 - label->boundingRect().width()) / 2, 120.0); label->setPos(QPointF(x, y) + labelOffset); i++; //Guardando los punteros para luego eliminarlos; QPair<QGraphicsTextItem*, ImageItem*> par_punteros; par_punteros.first = label; par_punteros.second = image; punteros.push_back(par_punteros); } }
void StitcherWorkspace::onAddConstraintDialogClosed() { QStandardItemModel * model = qobject_cast<QStandardItemModel *>(constraintsTree->model()); AddConstraintDialog * d = qobject_cast<AddConstraintDialog *>(sender()); QList<QPair<int,ImageItem *> > points = d->selectedPoints(); if(points.isEmpty()) { delete d; return; } QStandardItem *parentItem = model->invisibleRootItem(); QStandardItem * itemName = new QStandardItem("Type"); // This seems a bit too much QList<QVariant> point_details; QList<QVariant> item_details; for(int i = 0; i<points.size(); i++) { ImageItem * item = points[i].second; QPointF pos = item->getControlPoints()[points[i].first]; item_details.append(QVariant::fromValue(item)); point_details.append(QVariant::fromValue(pos)); } // itemName->setData(QVariant::fromValue(d)); itemName->setData(QVariant::fromValue(item_details),Qt::UserRole + 1); itemName->setData(QVariant::fromValue(point_details),Qt::UserRole + 2); itemName->setData(QVariant::fromValue((int)d->constraintType()),Qt::UserRole + 3); QStandardItem * itemValue; if(d->constraintType() == RadialLineConstraint) { itemValue = new QStandardItem("Radial Line"); } else { itemValue = new QStandardItem("Centered Circle"); } parentItem->appendRow(QList<QStandardItem *>() << itemName << itemValue); parentItem = itemName; for(int i = 0; i<points.size(); i++) { itemName = new QStandardItem(points[i].second->identifier() + "." + QString::number(points[i].first+1)); itemValue = new QStandardItem(""); parentItem->appendRow(QList<QStandardItem *>() << itemName << itemValue); } if(d->constraintType() == RadialLineConstraint) { itemName = new QStandardItem("Angle"); } else { itemName = new QStandardItem("Radius"); } itemValue = new QStandardItem(""); parentItem->appendRow(QList<QStandardItem *>() << itemName << itemValue); constraintsTree->expandAll(); constraintsTree->resizeColumnToContents(0); constraintsTree->resizeColumnToContents(1); }
void ImageViewer::init(const imagein::Image* img, int x, int y) { /* Get info about the image */ QImage qimg = getQImage(img); QSize size = (qimg).size(); int height = size.height(); int width = size.width(); int sup = max(height, width); /* Compute the numeric attributs of our object */ _scale = sup > WIDGET_S ? (double) WIDGET_S / (double) sup : 1.0; _dx = (WIDGET_S - width * _scale) / 2; _dy = (WIDGET_S - height * _scale) / 2; _supx = width * _scale; _supy = height * _scale; /* Creats the scene */ QPixmap i; i.convertFromImage(qimg); i = i.scaled(width * _scale, height * _scale); //QGraphicsPixmapItem* im = new QGraphicsPixmapItem(i); ImageItem* im = new ImageItem(i); im->setOffset(_dx, _dy); QObject::connect(im, SIGNAL(clickListenned(int, int)), this, SLOT(slotPositionReception(int, int))); addItem(im); _rect = new QGraphicsRectItem(0, 0, _scale * RECT_W, _scale * RECT_H); QPen b; b.setColor(Qt::red); _rect->setPen(b); addItem(_rect); _rect->setX(_dx); _rect->setY(_dy); updatePos(x * _scale, y * _scale); }
void MainWindow::setDirectory(const QString &path) { QDir dir(path); QStringList files = dir.entryList(QDir::Files | QDir::Readable | QDir::NoDotAndDotDot); foreach(const QString &file, files) { QImageReader img(path + QLatin1String("/")+file); QImage image = img.read(); if (!image.isNull()) { { ImageItem *item = new ImageItem(image); item->setPos(0, 0); item->setFlags(QGraphicsItem::ItemIsMovable); standardGestures->scene->addItem(item); } { ImageItem *item = new ImageItem(image); item->setPos(0, 0); item->setFlags(QGraphicsItem::ItemIsMovable); globalViewGestures->scene->addItem(item); } { GestureImageItem *item = new GestureImageItem(image); item->setPos(0, 0); item->setFlags(QGraphicsItem::ItemIsMovable); graphicsItemGestures->scene->addItem(item); } } }
void QCustomTreeWidget::launchItem(QTreeWidgetItem *qItem) { Item *item = dynamic_cast<QCustomTreeWidgetItem*>(qItem)->branch()->item(); switch (item->type()) { case Item::tSound: { SoundItem *soundItem = dynamic_cast<SoundItem*>(item); // we send a signal to play the music (and do some other things) emit fileToPlay(soundItem->fileName(),soundItem->duration()); break; } case Item::tImage: { ImageItem *imageItem = dynamic_cast<ImageItem*>(item); new ImageWindow(imageItem->fileName(),this); break; } default: break; } }
void StitcherWorkspace::onLoadControlPointsClicked() { QString file = QFileDialog::getOpenFileName(0,tr("Load Control Points from File"), QString(), tr("Image Control Points (*.hicp)")); if(file.isEmpty()) { return; } QFile fp(file); if(!fp.open(QIODevice::ReadOnly)) { return; } QList<QGraphicsItem *> graphicsItems = _stitcherView->items(); QTextStream in(&fp); QString dumb; int nImages; in >> dumb >> dumb >> nImages; for(int i = 0; i<nImages; i++) { QString id; double dx,dy; in >> dumb >> id; ImageItem * item = NULL; for(int j = 0; j < graphicsItems.size(); j++) { item = qgraphicsitem_cast<ImageItem *>(graphicsItems[j]); if(item && item->identifier() == id) { break; } else { item = NULL; } } int nPoints; in >> dumb >> dumb >> nPoints; for(int j = 0; j<nPoints; j++) { in >> dumb >> dx; in >> dumb >> dy; if(item) { item->addControlPoint(QPointF(dx,dy)); } } } fp.close(); }
void StitcherWorkspace::onItemChanged(QStandardItem * item) { if(item->isEnabled() == false) { return; } if(item->flags() & Qt::ItemIsUserCheckable) { bool value = (item->checkState() == Qt::Checked); QString property = item->data(Qt::UserRole + 2).toString(); ImageItem * imageItem = item->data(Qt::UserRole + 3).value<ImageItem *>(); imageItem->setProperty(property.toAscii().constData(),value); loadGeometry(); } else if(item->flags() & Qt::ItemIsEditable) { qDebug("item changed"); if(!item->data().isValid()) { item = item->parent(); } if(!item->data().isValid()) { qFatal("Can't reach here"); } QVariant var = item->data(); if(var.type() == QVariant::Double) { double value = item->text().toDouble(); QString property = item->data(Qt::UserRole + 2).toString(); if(property.endsWith("_theta") || property.endsWith("_alpha")) { /* convert from degrees */ value /= 180/M_PI; } if(property.endsWith("_dy")) { /* swap axis */ value = -value; } ImageItem * imageItem = item->data(Qt::UserRole + 3).value<ImageItem *>(); // item->setText(QString("%0").arg(value)); imageItem->setProperty(property.toAscii().constData(),value); qDebug("New value for %s = %f",property.toAscii().data(),value); loadGeometry(); } } }
void BlurPicker::setIndex(qreal index) { m_index = index; qreal baseline = 0; for (int i = 0; i < m_icons.count(); ++i) { ImageItem *icon = m_icons[i]; qreal a = ((i + m_index) * 2 * M_PI) / m_icons.count(); qreal xs = 380 * qSin(a); qreal ys = 230 * qCos(a); QPointF pos(xs, ys); // pos = QTransform::scale(0,0.2).map(pos); // pos = QTransform().rotate(-20).map(pos); pos = QTransform().rotate(-5).map(pos); pos -= QPointF(40, 40); // pos -= QPoint(10,10); icon->setPos(pos); baseline = qMax(baseline, ys); static_cast<BlurEffect *>(icon->graphicsEffect())->setBaseLine(baseline); } scene()->update(); }
void ImageModel::AddMultichannelImage(const cv::Mat image,const QString fileName) { QFileInfo fileInfo(fileName); QString name = fileInfo.fileName(); ImageItem* multichannelImage = new ImageItem(image, name, fileName); int channelsCount = image.channels(); if(channelsCount>1) { QHash<int, QString> ChannelsStrings; ChannelsStrings[0] = QString("Blue"); ChannelsStrings[1] = QString("Green"); ChannelsStrings[2] = QString("Red"); ChannelsStrings[3] = QString("Alpha"); vector<cv::Mat> imageChannels; cv::split(image, imageChannels); for(int i = 0; i<channelsCount; i++) { ImageItem* child = new ImageItem(imageChannels[i], name+QString(" ")+ChannelsStrings[i], fileName, i); multichannelImage->appendChild(child); } } this->AddItem(multichannelImage); }
void StitcherWorkspace::onStitchClicked() { QList<QGraphicsItem *> it = _stitcherView->items(); if(it.size() < 2) { return; } QRectF combined; for(int i = 0; i < it.size(); i++) { if(QString("ImageItem") == it[i]->data(0)) { /* we have an image item */ ImageItem * ii = qgraphicsitem_cast<ImageItem *>(it[i]); combined = combined.united(ii->sceneBoundingRect()); } } /* we're gonna assume they all have the same scaling */ combined = _stitcherView->selectedImage()->mapRectFromScene(combined); qDebug("Combined with relative positions:"); Image * a = sp_image_alloc(combined.width(),combined.height(),1); for(int i = 0; i < it.size(); i++) { if(QString("ImageItem") == it[i]->data(0)) { QPointF p = it[i]->mapToScene(0,0); QPointF local_p = _stitcherView->selectedImage()->mapFromScene(p); qDebug("x = %f y = %f",local_p.x()-combined.x(),local_p.y()-combined.y()); } } for(int x = 0; x<sp_image_x(a); x++) { for(int y = 0; y<sp_image_y(a); y++) { int mask = 0; Complex value = sp_cinit(0,0); QPointF p = _stitcherView->selectedImage()->mapToScene(QPointF(combined.x()+x,combined.y()+y)); for(int i = 0; i < it.size(); i++) { if(QString("ImageItem") == it[i]->data(0)) { /* we have an image item */ ImageItem * ii = qgraphicsitem_cast<ImageItem *>(it[i]); QPointF local_p = it[i]->mapFromScene(p); if(it[i]->contains(local_p)) { /* we're in business */ value = sp_cadd(value,sp_image_get(ii->getImage(),local_p.x(),local_p.y(),0)); mask++; } } } if(mask) { sp_cscale(value,1.0/mask); } a->detector->image_center[0] = -combined.x(); a->detector->image_center[1] = -combined.y(); a->detector->image_center[2] = 0; sp_image_set(a,x,y,0,value); sp_image_mask_set(a,x,y,0,mask); } } ImageItem * item = new ImageItem(a,QString(),_stitcherView,NULL); _stitcherView->addImage(item); item->update(); }
void StitcherWorkspace::onLoadGeometryClicked() { QString file = QFileDialog::getOpenFileName(0,tr("Load Geometry from File"), QString(), tr("Image Geometry (*.hig)")); if(file.isEmpty()) { return; } QFile fp(file); if(!fp.open(QIODevice::ReadOnly)) { return; } QList<QGraphicsItem *> graphicsItems = _stitcherView->items(); QTextStream in(&fp); QString dumb; int nImages; in >> dumb >> dumb >> nImages; for(int i = 0; i<nImages; i++) { QString id; double dx,dy,dz,theta; in >> dumb >> id; ImageItem * item = NULL; for(int j = 0; j < graphicsItems.size(); j++) { item = qgraphicsitem_cast<ImageItem *>(graphicsItems[j]); if(item && item->identifier() == id) { break; } else { item = NULL; } } in >> dumb >> dx; in >> dumb >> dy; in >> dumb >> dz; in >> dumb >> theta; if(item) { item->setDx(dx); item->setDy(dy); item->setDz(dz); item->setTheta(theta); } } fp.close(); loadGeometry(); }
void StitcherWorkspace::loadGeometry() { /* This is a prefix to distinguish Hawk Geometry properties from the normal widget properties */ const QString tag("HawkGeometry_"); QList<QGraphicsItem *> ii = _stitcherView->items(); QMap<QString,ImageItem *> sortMap; for(int i = 0; i<ii.size(); i++) { if(ImageItem * imageItem = qgraphicsitem_cast<ImageItem *>(ii[i])) { if(imageItem->isVisible()) { sortMap.insert(imageItem->identifier(),imageItem); } } } QList<ImageItem *>sortedItems = sortMap.values(); QStandardItemModel * model = qobject_cast<QStandardItemModel *>(geometryTree->model()); model->clear(); model->setHorizontalHeaderLabels(QStringList() << "Parameter" << "Value" << "Locked"); for(int i = 0; i<sortedItems.size(); i++) { ImageItem * imageItem = sortedItems[i]; const QMetaObject *metaobject = imageItem->metaObject(); int count = metaobject->propertyCount(); QStandardItem * itemName = new QStandardItem(imageItem->identifier()); QStandardItem * itemValue = new QStandardItem(); QStandardItem * itemLocked = new QStandardItem(); itemLocked->setFlags(itemLocked->flags() & ~Qt::ItemIsEditable); QStandardItem *parentItem = model->invisibleRootItem(); itemName->setFlags(itemName->flags() & ~Qt::ItemIsEditable); itemValue->setFlags(itemValue->flags() & ~Qt::ItemIsEditable); if(model->findItems(itemName->text()).empty()) { parentItem->appendRow(QList<QStandardItem *>() << itemName << itemValue << itemLocked); parentItem = itemName; } else { parentItem = model->findItems(itemName->text()).first(); } for (int j=0; j<count; ++j) { QMetaProperty metaproperty = metaobject->property(j); const char *name = metaproperty.name(); if(!QString(name).startsWith(tag)) { continue; } QVariant var = imageItem->property(name); Qt::ItemFlags itemValueFlags = Qt::ItemIsSelectable|Qt::ItemIsEnabled; if(metaproperty.isWritable()) { itemValueFlags |= Qt::ItemIsEditable; } if(var.type() == QVariant::Double) { double value = var.toDouble(); if(QString(name).endsWith("_theta") || QString(name).endsWith("_alpha")) { /* convert to degrees */ value *= 180/M_PI; } if(QString(name).endsWith("_dy")) { /* swap axis */ value = -value; } QStandardItem * itemName = new QStandardItem(_stitcherView->propertyNameToDisplayName(name,tag)); QStandardItem * itemValue = new QStandardItem(QString("%0").arg(value)); itemValue->setData(value,Qt::UserRole + 1); itemValue->setData(QString(name),Qt::UserRole + 2); itemValue->setData(QVariant::fromValue(imageItem),Qt::UserRole + 3); itemName->setFlags(itemName->flags() & ~Qt::ItemIsEditable); itemValue->setFlags(itemValueFlags); QStandardItem * itemLocked = new QStandardItem(); itemLocked->setFlags(itemLocked->flags() & ~Qt::ItemIsEditable); /* check for lock property */ QString lockedPropertyName = name + QString("_locked"); if(imageItem->property(lockedPropertyName.toAscii().data()).isValid()) { bool locked = imageItem->property(lockedPropertyName.toAscii().data()).toBool(); itemLocked->setCheckable(true); itemLocked->setData(locked,Qt::UserRole + 1); itemLocked->setData(QString(lockedPropertyName),Qt::UserRole + 2); itemLocked->setData(QVariant::fromValue(imageItem),Qt::UserRole + 3); if(locked) { itemLocked->setCheckState(Qt::Checked); itemValue->setEnabled(false); } } /* Temporarily disable Dz and Alpha */ if(itemName->text() == "Dz" || itemName->text() == "Alpha") { itemLocked->setCheckState(Qt::Checked); itemName->setEnabled(false); itemValue->setEnabled(false); itemLocked->setEnabled(false); itemName->setToolTip("Currently disabled"); itemValue->setToolTip("Currently disabled"); itemLocked->setToolTip("Currently disabled"); } parentItem->appendRow(QList<QStandardItem *>() << itemName << itemValue << itemLocked); } } } geometryTree->expandAll(); geometryTree->resizeColumnToContents(0); geometryTree->sortByColumn(0,Qt::AscendingOrder); }
void StitcherWorkspace::onOptimizeGeometryClicked() { geometrically_constrained_system * gc = geometrically_constrained_system_alloc(); /* create positioned images */ QMap<ImageItem *, positioned_image *> pos_image_map; QList<QGraphicsItem *> graphicsItems = _stitcherView->items(); for(int i = 0; i < graphicsItems.size(); i++) { if(ImageItem * item = qgraphicsitem_cast<ImageItem *>(graphicsItems[i])) { positioned_image * p = create_positioned_image(item->getImage()); set_image_position(p,DeltaX,item->dx()); if(!item->dxLocked()) { geometrically_constrained_system_add_variable(gc,create_geometry_variable(p,DeltaX)); } set_image_position(p,DeltaY,item->dy()); if(!item->dyLocked()) { geometrically_constrained_system_add_variable(gc,create_geometry_variable(p,DeltaY)); } set_image_position(p,Zoom,1.0/item->dz()); if(!item->dzLocked()) { geometrically_constrained_system_add_variable(gc,create_geometry_variable(p,Zoom)); } set_image_position(p,Theta,item->theta()); if(!item->thetaLocked()) { geometrically_constrained_system_add_variable(gc,create_geometry_variable(p,Theta)); } set_image_position(p,Alpha,item->alpha()); if(!item->alphaLocked()) { geometrically_constrained_system_add_variable(gc,create_geometry_variable(p,Alpha)); } pos_image_map.insert(item,p); } } QStandardItemModel * model = qobject_cast<QStandardItemModel *>(constraintsTree->model()); int total_points = 0; for(int i = 0; i<model->rowCount(); i++) { QStandardItem * it = model->item(i,0); geometric_constraint c = geometric_constraint_init((GeometryConstraintType)it->data(Qt::UserRole + 3).toInt(),0); QList<QVariant> item_details = it->data(Qt::UserRole + 1).value<QList<QVariant> >(); QList<QVariant> point_details = it->data(Qt::UserRole + 2).value<QList<QVariant> >(); total_points += item_details.size(); for(int i = 0; i<item_details.size(); i++) { ImageItem * item = item_details[i].value<ImageItem *>(); QPointF pos = point_details[i].value<QPointF>(); positioned_image * a = pos_image_map.value(item); control_point cp = create_control_point(a,pos.x(),pos.y()); geometric_constraint_add_point(&c,cp); } geometrically_constrained_system_add_constraint(gc,c); } if(total_points < gc->n_variables+gc->n_constraints) { QMessageBox::warning(this,"Geometry Optimization","<p>Too few control points." " The number of control points must be equal or greater to the degrees of freedom.</p>" "<p>Optimization aborted!</p>"); return ; } if(model->rowCount()) { geometry_contraint_minimizer(gc); } _stitcherView->clearConstraintFits(); for(int i = 0; i<model->rowCount(); i++) { QStandardItem * it = model->item(i,0); for(int j = 0; j<it->rowCount()-1; j++) { it->child(j,1)->setText(QString("%0").arg(gc->constraints[i].error[j])); } it->child(it->rowCount()-1,1)->setText(QString("%0").arg(gc->constraints[i].best_fit)); _stitcherView->drawConstraintFit(gc); } for(int i = 0; i<gc->n_variables; i++) { ImageItem * item = pos_image_map.keys(gc->variables[i].parent).first(); if(gc->variables[i].type == DeltaX) { item->setDx(gc->variables[i].parent->pos[DeltaX]); } if(gc->variables[i].type == DeltaY) { item->setDy(gc->variables[i].parent->pos[DeltaY]); } if(gc->variables[i].type == Zoom) { item->setDz(1.0/gc->variables[i].parent->pos[Zoom]); } if(gc->variables[i].type == Theta) { item->setTheta(gc->variables[i].parent->pos[Theta]); } if(gc->variables[i].type == Alpha) { item->setAlpha(gc->variables[i].parent->pos[Alpha]); } } loadGeometry(); }
/*! \brief Change name of an image/dir \details Renames image/dir in Photographs storage group, synchronises image database and thumbnail cache and notifies clients. A new thumbnail will be generated by next client request. \param id File/dir id \param newBase New filename \return QStringList Error message or "OK" */ QStringList ImageHandler::HandleRename(QString id, QString newBase) { // Sanity check new name if (newBase.isEmpty() || newBase.contains("/") || newBase.contains("\\")) return QStringList("ERROR") << "Invalid name"; // Find image in DB ImageDbWriter db; ImageList images, dirs; db.ReadDbItemsById(images, id); // Either single id not found or multiple comma-delimited ids received if (images.size() != 1) { LOG(VB_FILE, LOG_NOTICE, QString("Image: Image %1 not found in Db").arg(id)); qDeleteAll(images); return QStringList("ERROR") << "Unknown File"; } // Get filepath for solitary image ImageItem *im = images[0]; QString absFilename = ImageSg::getInstance()->GetFilePath(im); if (absFilename.isEmpty()) { delete im; return QStringList("ERROR") << "File not found"; } // Rename file QFileInfo info = QFileInfo(absFilename); QDir dir = info.absoluteDir(); QString newName = im->IsDirectory() ? newBase : QString("%1.%2").arg(newBase, info.suffix()); if (!dir.rename(im->m_name, newName)) { LOG(VB_FILE, LOG_ERR, QString("Image: Rename of %1 -> %2 failed") .arg(im->m_name, newName)); delete im; return QStringList("ERROR") << "Rename failed"; } LOG(VB_FILE, LOG_DEBUG, QString("Image: Renamed %1 -> %2") .arg(im->m_fileName, newName)); ImageList dummy; if (im->IsDirectory()) { // Cleanup thumbdir/thumbnails // Thumb generator now owns the image object QStringList mesg = ImageThumb::getInstance()->DeleteThumbs(dummy, images); // Notify clients of deleted ids, images, thumbs gCoreContext->SendEvent(MythEvent("IMAGE_DB_CHANGED", mesg)); // Dir name change affects path of all sub-dirs & files and their thumbs QStringList scan; scan << "IMAGE_SCAN" << "START"; return ImageScan::getInstance()->HandleScanRequest(scan); } // Retain old image for cleanup ImageItem *newIm = new ImageItem(*im); // Update db newIm->m_name = newName; newIm->m_fileName = QDir::cleanPath(QDir(newIm->m_path).filePath(newName)); db.UpdateDbFile(newIm); delete newIm; // Clean up thumbnail // Thumb generator now owns the images objects QStringList mesg = ImageThumb::getInstance()->DeleteThumbs(images, dummy); // Item is modified, not deleted mesg.swap(0,1); // New thumbnail will be created by client request // Notify clients of changed image & thumbnail gCoreContext->SendEvent(MythEvent("IMAGE_DB_CHANGED", mesg)); return QStringList("OK"); }
ImageItem* ImageModel::findImage(QString fileName) { ImageItem* root = static_cast<ImageItem*>(_root); return root->findImage(fileName); }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); this->resize(800,680); this->setWindowState(Qt::WindowMaximized); ImageItem *image = new ImageItem(); //create ColorSelection ColorSelection *CS1 = new ColorSelection(Qt::black); ColorSelection *CS2 = new ColorSelection(Qt::white); QObject::connect(CS1,SIGNAL(changeColor(QColor)),image,SLOT(setColor1(QColor))); QObject::connect(image->getPipette(),SIGNAL(changeColor1(QColor)),CS1,SLOT(setColor(QColor))); QObject::connect(CS2,SIGNAL(changeColor(QColor)),image,SLOT(setColor2(QColor))); QObject::connect(image->getPipette(),SIGNAL(changeColor2(QColor)),CS2,SLOT(setColor(QColor))); QHBoxLayout *Hlayout = new QHBoxLayout(); Hlayout->addStretch(5); Hlayout->addWidget(CS1); Hlayout->addWidget(CS2); Hlayout->addStretch(5); //Create slider QSlider *slider = new QSlider(Qt::Horizontal); slider->setMaximum(100); slider->setMinimum(1); slider->setValue(10); QObject::connect(slider,SIGNAL(valueChanged(int)),image,SLOT(setSize(int))); QVBoxLayout *Blayout = new QVBoxLayout(); Blayout->addWidget(slider); Blayout->addLayout(Hlayout); QWidget *wdg = new QWidget(); wdg->setLayout(Blayout); // Create Dock // // QDockWidget *dock = new QDockWidget(tr("Настройка"),this); dock->setAllowedAreas(Qt::LeftDockWidgetArea | Qt::RightDockWidgetArea); dock->setFeatures(QDockWidget::NoDockWidgetFeatures); wdg->setFixedSize(200,100); dock->setWidget(wdg); dock->setMaximumHeight(300); dock->setMaximumWidth(300); addDockWidget(Qt::RightDockWidgetArea,dock); QActionGroup *GP = new QActionGroup(this); GP->addAction(ui->actionPencil); GP->addAction(ui->actionEraser); GP->addAction(ui->actionEllipse); GP->addAction(ui->actionRectangle); GP->addAction(ui->actionLine); GP->addAction(ui->actionCurveLine); GP->addAction(ui->actionFill); GP->addAction(ui->actionPipette); GP->addAction(ui->actionSelection); GP->setExclusive(true); //create tool bar QToolBar *TB = new QToolBar(); TB->setAllowedAreas(Qt::TopToolBarArea | Qt::LeftToolBarArea); TB->setFloatable(false); TB->setMovable(true); TB->insertAction(0,ui->actionSaveAs); TB->insertAction(ui->actionSaveAs,ui->actionSave); TB->insertAction(ui->actionSave,ui->actionOpen); TB->insertAction(ui->actionOpen,ui->actionCreate); TB->addSeparator(); TB->insertAction(0,ui->actionSelection); TB->insertAction(ui->actionSelection,ui->actionPipette); TB->insertAction(ui->actionPipette,ui->actionFill); TB->insertAction(ui->actionFill,ui->actionCurveLine); TB->insertAction(ui->actionCurveLine,ui->actionLine); TB->insertAction(ui->actionLine,ui->actionRectangle); TB->insertAction(ui->actionRectangle,ui->actionEllipse); TB->insertAction(ui->actionEllipse,ui->actionEraser); TB->insertAction(ui->actionEraser,ui->actionPencil); addToolBar(Qt::TopToolBarArea, TB); // create action connecting QObject::connect(ui->actionOpen,SIGNAL(triggered(bool)),image,SLOT(open())); QObject::connect(ui->actionSaveAs,SIGNAL(triggered(bool)),image,SLOT(saveAs())); QObject::connect(ui->actionSave,SIGNAL(triggered(bool)),image,SLOT(save())); QObject::connect(ui->actionPencil,SIGNAL(toggled(bool)),image,SLOT(setPencil(bool))); QObject::connect(ui->actionEraser,SIGNAL(toggled(bool)),image,SLOT(setEraser(bool))); QObject::connect(ui->actionEllipse,SIGNAL(toggled(bool)),image,SLOT(setEllipse(bool))); QObject::connect(ui->actionRectangle,SIGNAL(toggled(bool)),image,SLOT(setRectangle(bool))); QObject::connect(ui->actionLine,SIGNAL(toggled(bool)),image,SLOT(setLine(bool))); QObject::connect(ui->actionCurveLine,SIGNAL(toggled(bool)),image,SLOT(setCurveLine(bool))); QObject::connect(ui->actionFill,SIGNAL(toggled(bool)),image,SLOT(setFill(bool))); QObject::connect(ui->actionPipette,SIGNAL(toggled(bool)),image,SLOT(setPipette(bool))); QObject::connect(ui->actionSelection,SIGNAL(toggled(bool)),image,SLOT(setSelection(bool))); //undo and redo ui->actionUndo->setEnabled(false); ui->actionRedo->setEnabled(false); QObject::connect(image->getUndoStack(),SIGNAL(canUndo(bool)),ui->actionUndo,SLOT(setEnabled(bool))); QObject::connect(ui->actionUndo,SIGNAL(triggered(bool)),image->getUndoStack(),SLOT(undo())); QObject::connect(image->getUndoStack(),SIGNAL(canRedo(bool)),ui->actionRedo,SLOT(setEnabled(bool))); QObject::connect(image->getUndoStack(),SIGNAL(canRedo(bool)),image,SLOT(setNewCurve(bool))); QObject::connect(ui->actionRedo,SIGNAL(triggered(bool)),image->getUndoStack(),SLOT(redo())); //copy and cut and put ui->actionCopy->setEnabled(false); ui->actionCut->setEnabled(false); ui->actionPut->setEnabled(false); QObject::connect(image->getSelection(),SIGNAL(canCopy(bool)),ui->actionCopy,SLOT(setEnabled(bool))); QObject::connect(ui->actionCopy,SIGNAL(triggered(bool)),image,SLOT(makeCopy())); QObject::connect(image->getSelection(),SIGNAL(canCopy(bool)),ui->actionCut,SLOT(setEnabled(bool))); QObject::connect(ui->actionCut,SIGNAL(triggered(bool)),image,SLOT(makeCut())); QObject::connect(image->getSelection(),SIGNAL(canPut(bool)),ui->actionPut,SLOT(setEnabled(bool))); QObject::connect(ui->actionPut,SIGNAL(triggered(bool)),image,SLOT(makePut())); QObject::connect(ui->actionSelection,SIGNAL(changed()),image,SLOT(clearSelection())); ui->scrollArea->setBackgroundRole(QPalette :: Dark); ui->scrollArea->setWidget(image); }
void MainWindow::on_filesTable_currentCellChanged(int currentRow, int /*currentColumn*/, int /*previousRow*/, int /*previousColumn*/) { ui->stackedWidget->setCurrentWidget(ui->emptyPage); QString resourceName = ui->filesTable->item(currentRow, 0)->text(); QRectF boundingBox; m_scene.clear(); if(resourceName.endsWith(".pcx")) { ImageItem *item = new ImageItem(readPCXimage(resourceName)); m_scene.addItem(item); boundingBox = item->boundingRect(); ui->stackedWidget->setCurrentWidget(ui->graphicsPage); } if(resourceName.endsWith(".gob")) { std::vector<GobImage> gobImages = m_resourceContainer.readGOB( resourceName.toStdString() ); QPointF coordinates; for(const GobImage &gobImage : gobImages) { ImageItem *item = new ImageItem(readGobImage(gobImage)); m_scene.addItem(item); item->setPos(coordinates); coordinates.rx() += gobImage.width() + 2; QRectF itemBB = item->mapToScene(item->boundingRect()).boundingRect(); boundingBox.setRight( qMax( boundingBox.right(), itemBB.right() ) ); boundingBox.setBottom( qMax( boundingBox.bottom(), item->boundingRect().bottom() ) ); m_scene.addRect(itemBB, QPen(QColor(127, 127, 127, 200))); } ui->stackedWidget->setCurrentWidget(ui->graphicsPage); } if(resourceName == "levelmap.txt") { ImageItem *item = new ImageItem(readPCXimage("level.pcx")); m_scene.addItem(item); boundingBox = item->boundingRect(); std::vector<char> entryData = m_resourceContainer.readLevel( resourceName.toStdString() ); std::vector<char>::size_type index = 0; for(int row = 0; row < 16; row++) { for(int column = 0; column < 22; column++) { QColor blockColor; switch( entryData[index] ) { case '0': blockColor.setRgb(0, 0, 0, 0); break; case '1': blockColor.setRgb(200, 100, 0, 200); break; case '2': blockColor.setRgb(0, 60, 85, 200); break; case '3': blockColor.setRgb(140, 220, 255, 200); break; case '4': blockColor.setRgb(200, 200, 0, 200); break; default: blockColor.setRgb(200, 0, 0, 200); } QPen pen; pen.setWidth(0); m_scene.addRect(QRect(column * 16, row * 16, 16, 16), QPen(pen), QBrush(blockColor)); index++; } index += 2; // Skip "\r\n" at the end of line; } ui->stackedWidget->setCurrentWidget(ui->graphicsPage); } m_scene.setSceneRect(boundingBox); ui->graphicsView->setZoom(1.0); ui->graphicsView->centerOn(boundingBox.center()); if(resourceName.endsWith(".smp")) { ui->stackedWidget->setCurrentWidget(ui->soundPage); ui->soundPage->setSoundData(readSMP(resourceName)); ui->soundPage->setSoundDescription("Raw 8 bit signed 22050Hz"); } if(resourceName.endsWith(".mod")) { ui->stackedWidget->setCurrentWidget(ui->musicPage); ui->musicPage->setMusicData(readMOD(resourceName)); } }