element editor: improve the drag of the scene with wheel click

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@2419 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
blacksun
2013-08-08 19:58:15 +00:00
parent 5523d06d8a
commit 835288f02f
5 changed files with 22 additions and 43 deletions

View File

@@ -157,7 +157,7 @@ void PastePartsCommand::undo() {
editor_view_ -> offset_paste_count_ = old_offset_paste_count_; editor_view_ -> offset_paste_count_ = old_offset_paste_count_;
editor_view_ -> start_top_left_corner_ = old_start_top_left_corner_; editor_view_ -> start_top_left_corner_ = old_start_top_left_corner_;
} }
editor_view_ -> adjustSceneRect(); editor_view_ -> zoomFit();
} }
/// refait le coller /// refait le coller
@@ -176,7 +176,7 @@ void PastePartsCommand::redo() {
} }
} }
editor_scene_ -> slot_select(content_); editor_scene_ -> slot_select(content_);
editor_view_ -> adjustSceneRect(); editor_view_ -> zoomFit();
} }
/** /**

View File

@@ -496,24 +496,6 @@ void ElementScene::fromXml(
} }
} }
/**
@return le rectangle representant les limites de l'element.
Ce rectangle a pour dimensions la taille de l'element et pour coin
superieur gauche les coordonnees opposees du hotspot.
*/
QRectF ElementScene::borderRect() const {
return(QRectF(-elementSceneGeometricRect().topLeft(), QSizeF(width(), height())));
}
/**
@return un rectangle englobant toutes les parties ainsi que le
"bounding rect" de l'element
*/
QRectF ElementScene::sceneContent() const {
qreal adjustment = 5.0;
return(elementContentBoundingRect(items()).unite(borderRect()).adjusted(-adjustment, -adjustment, adjustment, adjustment));
}
/** /**
@return the minimum, margin-less rectangle the element can fit into, in scene @return the minimum, margin-less rectangle the element can fit into, in scene
coordinates. It is different from itemsBoundingRect() because it is not supposed coordinates. It is different from itemsBoundingRect() because it is not supposed
@@ -531,15 +513,6 @@ QRectF ElementScene::elementSceneGeometricRect() const{
return (esgr); return (esgr);
} }
/**
@return true si toutes les parties graphiques composant l'element sont
integralement contenues dans le rectangle representant les limites de
l'element.
*/
bool ElementScene::borderContainsEveryParts() const {
return(borderRect().contains(elementContentBoundingRect(items())));
}
/** /**
@return true si l'element comporte au moins une borne, false s'il n'en a @return true si l'element comporte au moins une borne, false s'il n'en a
aucune. aucune.

View File

@@ -129,10 +129,7 @@ class ElementScene : public QGraphicsScene {
virtual QList<QGraphicsItem *> zItems(ItemOptions options = ItemOptions(SortByZValue | IncludeTerminals | SelectedOrNot)) const; virtual QList<QGraphicsItem *> zItems(ItemOptions options = ItemOptions(SortByZValue | IncludeTerminals | SelectedOrNot)) const;
virtual ElementContent selectedContent() const; virtual ElementContent selectedContent() const;
virtual void getPasteArea(const QRectF &); virtual void getPasteArea(const QRectF &);
QRectF borderRect() const;
QRectF sceneContent() const;
QRectF elementSceneGeometricRect () const; QRectF elementSceneGeometricRect () const;
bool borderContainsEveryParts() const;
bool containsTerminals() const; bool containsTerminals() const;
QUndoStack &undoStack(); QUndoStack &undoStack();
QGIManager &qgiManager(); QGIManager &qgiManager();

View File

@@ -114,7 +114,7 @@ void ElementView::zoomOut() {
le zoom est reinitialise le zoom est reinitialise
*/ */
void ElementView::zoomFit() { void ElementView::zoomFit() {
adjustSceneRect(); resetSceneRect();
fitInView(sceneRect(), Qt::KeepAspectRatio); fitInView(sceneRect(), Qt::KeepAspectRatio);
} }
@@ -122,23 +122,30 @@ void ElementView::zoomFit() {
Reinitialise le zoom Reinitialise le zoom
*/ */
void ElementView::zoomReset() { void ElementView::zoomReset() {
adjustSceneRect(); resetSceneRect();
resetMatrix(); resetMatrix();
scale(4.0, 4.0); scale(4.0, 4.0);
} }
/** /**
Ajuste le sceneRect (zone du schema visualisee par l'ElementView) afin que Ajuste le sceneRect (zone du schéma visualisée par l'ElementView) afin que
celui inclut a la fois les parties dans et en dehors du cadre et le cadre celui-ci inclut à la fois les primitives de l'élément ainsi que le viewport
lui-meme. de la scène avec une marge de 1/4 d'elle-même.
*/ */
void ElementView::adjustSceneRect() { void ElementView::adjustSceneRect() {
QRectF old_scene_rect = scene_ -> sceneRect(); QRectF esgr = scene_ -> elementSceneGeometricRect();
QRectF new_scene_rect = scene_ -> sceneContent(); QRectF vpbr = mapToScene(this -> viewport() -> rect()).boundingRect();
setSceneRect(new_scene_rect); QRectF new_scene_rect = vpbr.adjusted(-vpbr.height()/4, -vpbr.width()/4, vpbr.height()/4, vpbr.width()/4);
setSceneRect(new_scene_rect.united(esgr));
}
// met a jour la scene /**
scene_ -> update(old_scene_rect.united(new_scene_rect)); * @brief ElementView::resetSceneRect
* reset le sceneRect (zone du schéma visualisée par l'ElementView) afin que
* celui-ci inclut uniquement les primitives de l'élément dessiné.
*/
void ElementView::resetSceneRect() {
setSceneRect(scene_ -> elementSceneGeometricRect());
} }
/** /**
@@ -353,6 +360,7 @@ void ElementView::mouseMoveEvent(QMouseEvent *e) {
QPointF move = reference_view_ - mapToScene(e -> pos()); QPointF move = reference_view_ - mapToScene(e -> pos());
this -> centerOn(center_view_ + move); this -> centerOn(center_view_ + move);
center_view_ = mapToScene(this -> viewport() -> rect()).boundingRect().center(); center_view_ = mapToScene(this -> viewport() -> rect()).boundingRect().center();
adjustSceneRect();
return; return;
} }
QGraphicsView::mouseMoveEvent(e); QGraphicsView::mouseMoveEvent(e);

View File

@@ -59,6 +59,7 @@ class ElementView : public QGraphicsView {
void zoomFit(); void zoomFit();
void zoomReset(); void zoomReset();
void adjustSceneRect(); void adjustSceneRect();
void resetSceneRect ();
void cut(); void cut();
void copy(); void copy();
void paste(); void paste();