void Annotation1DTextItem::draw(Spectrum1DCanvas * const canvas, QPainter & painter, bool flipped) { //translate mz/intensity to pixel coordinates QPoint pos; canvas->dataToWidget(position_.getX(), position_.getY(), pos, flipped, true); // compute bounding box of text_item on the specified painter bounding_box_ = painter.boundingRect(QRectF(pos, pos), flags_, text_); painter.drawText(bounding_box_, flags_, text_); if (selected_) { drawBoundingBox_(painter); } }
void Annotation1DCaret::draw(Spectrum1DCanvas* const canvas, QPainter& painter, bool flipped) { painter.save(); painter.setPen(color_); // translate mz/intensity to pixel coordinates QPoint position_widget, caret_position_widget; canvas->dataToWidget(position_.getX(), position_.getY(), position_widget, flipped, true); canvas->dataToWidget(caret_positions_[0].getX(), caret_positions_[0].getY(), caret_position_widget, flipped, true); //std::cerr << "color" << color_.value() << " "; // draw ticks (for now) if (!caret_positions_.empty()) { QPoint caret; // draw ^ to indicate theoretical position for (PositionsType::iterator it = caret_positions_.begin(); it != caret_positions_.end(); ++it) { canvas->dataToWidget(it->getX(), it->getY(), caret, flipped, true); painter.drawLine(caret.x(), caret.y(), caret.x()+4, caret.y() + 4); painter.drawLine(caret.x(), caret.y(), caret.x()-4, caret.y() + 4); //std::cout << "caret: " << caret.x() << "," << caret.y() << "\n"; } } // compute bounding box of text_item on the specified painter bounding_box_ = QRectF(position_widget, st_.size()); //std::cout << "posP: " << position_.getX() << "," << position_.getY() << "\n"; //std::cout << "posW: " << position_widget.x() << "," << position_widget.y() << "\n"; //std::cout <<"init BB topleft: " << bounding_box_.topLeft().x() << "," << bounding_box_.topLeft().y() <<"\n"; double vertical_shift = 0; double horizontal_shift = 0; if (canvas->isMzToXAxis()) { // shift pos - annotation should be over peak or, if not possible, next to it vertical_shift = bounding_box_.height() / 2 + 5; if (!flipped) { vertical_shift *= -1; } bounding_box_.translate(0.0, vertical_shift); if (flipped && bounding_box_.bottom() > canvas->height()) { bounding_box_.moveBottom(canvas->height()); bounding_box_.moveLeft(position_widget.x() + 5.0); } else if (!flipped && bounding_box_.top() < 0.0) { bounding_box_.moveTop(0.0); bounding_box_.moveLeft(position_widget.x() + 5.0); } } else { // annotation should be next to the peak (to its right) horizontal_shift = bounding_box_.width() / 2 + 5; bounding_box_.translate(horizontal_shift, 0.0); if (bounding_box_.right() > canvas->width()) { bounding_box_.moveRight(canvas->width()); } } // draw connection line between anchor point and current position if pixel coordinates differ significantly if ((position_widget - caret_position_widget).manhattanLength() > 2) { // check if line crosses bounding box, if so move line startpoint to correct bounding box intersection QLineF line(caret_position_widget, position_widget + QPoint(horizontal_shift, vertical_shift)); QLineF top(bounding_box_.x(), bounding_box_.y(), bounding_box_.x() + bounding_box_.width(), bounding_box_.y()); QLineF left(bounding_box_.x(), bounding_box_.y(), bounding_box_.x(), bounding_box_.y() + bounding_box_.height()); QLineF right(bounding_box_.x() + bounding_box_.width(), bounding_box_.y(), bounding_box_.x() + bounding_box_.width(), bounding_box_.y() + bounding_box_.height()); QLineF bottom(bounding_box_.x(), bounding_box_.y() + bounding_box_.height(), bounding_box_.x() + bounding_box_.width(), bounding_box_.y() + bounding_box_.height()); QLineF::IntersectType itype; QPointF * ip = new QPointF(); QPointF * closest_ip = new QPointF(-10e10, -10e10); bool found_intersection = false; // intersection with top itype = line.intersect(top, ip); if (itype == QLineF::BoundedIntersection && QLineF(caret_position_widget, *ip).length() < QLineF(caret_position_widget, *closest_ip).length()) { found_intersection = true; *closest_ip = *ip; } // intersection with left itype = line.intersect(left, ip); if (itype == QLineF::BoundedIntersection && QLineF(caret_position_widget, *ip).length() < QLineF(caret_position_widget, *closest_ip).length()) { found_intersection = true; *closest_ip = *ip; } // intersection with right itype = line.intersect(right, ip); if (itype == QLineF::BoundedIntersection && QLineF(caret_position_widget, *ip).length() < QLineF(caret_position_widget, *closest_ip).length()) { found_intersection = true; *closest_ip = *ip; } // intersection with bottom itype = line.intersect(bottom, ip); if (itype == QLineF::BoundedIntersection && QLineF(caret_position_widget, *ip).length() < QLineF(caret_position_widget, *closest_ip).length()) { found_intersection = true; *closest_ip = *ip; } painter.save(); QPen qp(Qt::DashLine); qp.setColor(connection_line_color_); painter.setPen(qp); if (!found_intersection) // no intersection with bounding box of text -> normal drawing { painter.drawLine(caret_position_widget, position_widget); painter.drawLine(caret_position_widget, position_widget); } else { painter.drawLine(caret_position_widget, *closest_ip); painter.drawLine(caret_position_widget, *closest_ip); } painter.restore(); delete(ip); delete(closest_ip); } //painter.drawText(bounding_box_, Qt::AlignLeft, text_); //std::cout << "Text to draw: " << st_.text() << " @ " << bounding_box_.topLeft().x() << "," << bounding_box_.topLeft().y() << "\n\n"; painter.drawStaticText(bounding_box_.topLeft(), st_); //QRect rect = QRect(10, 30, 180, 20); //painter.translate( rect.topLeft() ); //doc_.drawContents( &painter, bounding_box_ ); //painter. if (selected_) { drawBoundingBox_(painter); } painter.restore(); }