Item *GfxBlockItem::newImage(QImage img, QUrl src, QPointF pos) { ASSERT(data()->book()); ASSERT(data()->resManager()); double maxW = availableWidth(); double maxH = maxW; double scale = 1; if (scale*img.width()>maxW) scale = maxW/img.width(); if (scale*img.height()>maxH) scale = maxH/img.height(); if (allChildren().isEmpty()) pos = QPointF(0, 0); else pos -= QPointF(img.width(),img.height())*(scale/2); pos = constrainPointToRect(pos, boundingRect()); Resource *res = data()->resManager()->importImage(img, src); QString resName = res->tag(); GfxImageData *gid = new GfxImageData(resName, img, data()); gid->setScale(scale); gid->setPos(pos); GfxImageItem *gii = new GfxImageItem(gid, this); gii->makeWritable(); resetPosition(); sizeToFit(); return gii; }
QRectF Item::netBounds() const { QRectF b = boundingRect(); foreach (Item *i, allChildren()) if (!i->excludeFromNet()) b |= i->mapRectToParent(i->netBounds()); return b; }
QRectF GfxBlockItem::generousChildrenBounds() const { QRectF r; foreach (Item *i, allChildren()) if (!i->excludeFromNet()) r |= i->mapRectToParent(i->netBounds()); if (r.isEmpty()) return r; r.setTop(r.top()-style().real("gfx-block-vmargins")); r.setBottom(r.bottom()+style().real("gfx-block-vmargins")); return r; }
/** * Recursive function to compare all descendants and cram matches into ret. * Returns number of matches. */ int allChildren( Id start, const string& insideBrace, unsigned int index, vector< Id >& ret ) { unsigned int nret = ret.size(); vector< Id > kids; Neutral::getChildren( start.eref(), kids ); vector< Id >::iterator i; for ( i = kids.begin(); i != kids.end(); i++ ) { if ( matchName( start, *i, "#", insideBrace, index ) ) ret.push_back( *i ); allChildren( *i, insideBrace, index, ret ); } return ret.size() - nret; }
void BtTreeModel::deleteSelected(QModelIndexList victims) { QModelIndexList toBeDeleted = victims; // trust me while ( ! toBeDeleted.isEmpty() ) { QModelIndex ndx = toBeDeleted.takeFirst(); switch ( type(ndx) ) { case BtTreeItem::EQUIPMENT: Database::instance().remove( equipment(ndx) ); break; case BtTreeItem::FERMENTABLE: Database::instance().remove( fermentable(ndx) ); break; case BtTreeItem::HOP: Database::instance().remove( hop(ndx) ); break; case BtTreeItem::MISC: Database::instance().remove( misc(ndx) ); break; case BtTreeItem::RECIPE: Database::instance().remove( recipe(ndx) ); break; case BtTreeItem::STYLE: Database::instance().remove( style(ndx) ); break; case BtTreeItem::YEAST: Database::instance().remove( yeast(ndx) ); break; case BtTreeItem::BREWNOTE: Database::instance().remove( brewNote(ndx) ); break; case BtTreeItem::FOLDER: // This one is weird. toBeDeleted += allChildren(ndx); removeFolder(ndx); break; default: Brewtarget::logW(QString("deleteSelected:: unknown type %1").arg(type(ndx))); } } }
/** * singleLevelWildcard parses a single level of the path and returns all * ids that match it. If there is a suitable doublehash, it will recurse * into child elements. * Returns # of ids found. */ int singleLevelWildcard( Id start, const string& path, vector< Id >& ret ) { if ( path.length() == 0 ) return 0; unsigned int nret = ret.size(); /* #ifdef USE_MPI // Won't work for global nodes if ( start.node() != Shell::myNode() ) { Eref shellE = Id::shellId().eref(); Shell* sh = static_cast< Shell* >( shellE.data() ); assert( shellE.e != 0 ); vector< Nid > kids; unsigned int requestId = openOffNodeValueRequest< vector< Nid > >( sh, &kids, 1 ); unsigned int tgtNode = start.node(); if ( tgtNode > Shell::myNode() ) --tgtNode; sendTo3< Nid, string, unsigned int >( shellE, singleLevelWildcardSlot, tgtNode, start, path, requestId ); vector< Nid >* temp = closeOffNodeValueRequest< vector< Nid > >( sh, requestId ); assert( temp == &kids ); for ( size_t i = 0; i < kids.size(); ++i ) { ret.push_back( kids[i] ); } return ret.size() - nret; } #endif */ string beforeBrace; string insideBrace; unsigned int index; // This has to handle ghastly cases like foo[][FIELD(x)=12.3] findBraceContent( path, beforeBrace, insideBrace, index ); if ( beforeBrace == "##" ) return allChildren( start, insideBrace, index, ret ); // recursive. /* * Future off-node stuff. But this really needs to be delegated * to a separate routine, which does nothing but get the wildcard * list off node. Also should bring back the names and indices. * vector< Nid > kids; unsigned int requestId = openOffNodeValueRequest< vector< Nid > >( sh, &kids, sh->numNodes() - 1 ); send2< Nid, unsigned int >( shellE, requestLeSlot, start, requestId ); vector< Nid >* temp = closeOffNodeValueRequest< vector< Nid > >( sh, requestId ); assert( temp == &kids ); vector< Nid >::iterator i; for ( i = kids.begin(); i != kids.end(); i++ ) { if ( matchName( start, *i, beforeBrace, insideBrace, index ) ) ret.push_back( *i ); } return ret.size() - nret; */ vector< Id > kids; Neutral::getChildren( start.eref(), kids ); // cout << start.eref().name() << endl; // for (size_t i = 0; i < kids.size(); i++) // cout << "* " << kids[i].eref().name() << endl; vector< Id >::iterator i; for ( i = kids.begin(); i != kids.end(); i++ ) { if ( matchName( start, *i, beforeBrace, insideBrace, index ) ) ret.push_back( *i ); } return ret.size() - nret; }
void Item::makeWritable() { ASSERT(d); writable = true; foreach (Item *i, allChildren()) i->makeWritable(); }