diff --git a/resources/library/applications/Notes.wgt/js/ubw-main.js b/resources/library/applications/Notes.wgt/js/ubw-main.js index cea778fa..de5c2ed3 100644 --- a/resources/library/applications/Notes.wgt/js/ubw-main.js +++ b/resources/library/applications/Notes.wgt/js/ubw-main.js @@ -199,7 +199,7 @@ function init(){ if(text) textField.html(text); else - textField.html("Enter your notes here ..."); + textField.html("Saisir votre texte ici ..."); textField.focus(); } diff --git a/resources/library/applications/iCell.wgt/js/textes_descriptifs.js b/resources/library/applications/iCell.wgt/js/textes_descriptifs.js index 003d0c8e..0533292f 100644 --- a/resources/library/applications/iCell.wgt/js/textes_descriptifs.js +++ b/resources/library/applications/iCell.wgt/js/textes_descriptifs.js @@ -147,64 +147,64 @@ switch(lang){ break; case "fr": txt_vesicule = "

Vesicule
Transporteurs

"+ - "

Structure:

Bicouche phospholipidique

"+ - "

Role:

Transport de proteines ou d'autres elements a l'interieur de la cellule, vers l'exterieur (exocytose) ou vers l'interieur (endocytose).

"+ - '

Fonctionnement:

Transporteur "remorque" par des proteines prenant appui sur le cytosquelette.

' + "

Structure :

Bicouche phospholipidique

"+ + "

Rôle :

Transport de protéines ou d'autres éléments à l'intérieur de la cellule, vers l'extérieur (exocytose) ou vers l'intérieur (endocytose).

"+ + '

Fonctionnement :

Transporteur "remorque" par des protéines prenant appui sur le cytosquelette.

' txt_lysosome = "

Lysosome
Estomacs cellulaires

"+ - "

Structure:

Bicouche phospholipidique

"+ - "

Role:

Digestion intra-cellulaire a l'aide d'enzymes

"+ - "

Fonctionnement:

Absorption de nutriments par endocytose ou d'elements cellulaires abimes, digestion de ceux-ci, puis distribution des resultats de la reaction chimique dans la cellule et enfin expulsion des dechets par exocytose.

" + "

Structure :

Bicouche phospholipidique

"+ + "

Role :

Digestion intracellulaire à l'aide d'enzymes

"+ + "

Fonctionnement :

Absorption de nutriments par endocytose ou d'éléments cellulaires abimés, digestion de ceux-ci, puis distribution des résultats de la réaction chimique dans la cellule et enfin expulsion des déchets par exocytose.

" txt_mitoch = "

Mitochondrie
Piles

"+ - "

Structure:

Deux bichouches phospholipidiques appelees membranes mitochondriales, une externe et une interne. La mitochondrie contient des ribosomes, de l'ATP de l'ADN et bien d'autres molecules.

"+ - "

Role:

Centrale energetique de la cellule.

"+ - "

Fonctionnement:

L'energie - sous forme d'ATP (adenosine triphosphate) - est issue de differentes etapes de reactions chimique partant d'une molecule de glucose.

" + "

Structure :

Deux bicouches phospholipidiques appelées membranes mitochondriales, une externe et une interne. La mitochondrie contient des ribosomes, de l'ATP de l'ADN et bien d'autres molécules.

"+ + "

Rôle :

Centrale énergétique de la cellule.

"+ + "

Fonctionnement :

L'énergie - sous forme d'ATP (adénosine triphosphate) - est issue de différentes étapes de réactions chimiques partant d'une molécule de glucose.

" txt_golgi = "

Appareil de Golgi
Usines miniatures

"+ - "

Structure:

Forme d'un empilement de saccules membranaires applatis.

"+ - "

Role:

Modification de certaines proteines au cours d'un cheminement au travers de ses saccules.

"+ - "

Fonctionnement:

Suite de reactions chimiques, notamment par glycosilation.

" + "

Structure :

Forme d'un empilement de saccules membranaires aplatis.

"+ + "

Rôle :

Modification de certaines protéines au cours d'un cheminement au travers de ses saccules.

"+ + "

Fonctionnement :

Suite de réactions chimiques, notamment par glycosilation.

" txt_rer = "

Reticulum endoplasmique rugueux - Tunnel

"+ - "

Structure:

Compose d'une bicouche phospholipidique piquetee de ribosomes (d'un aspect rugueux) delimitant la lumiere, un espace interne pouvant tre compare a un tunnel.

"+ - "

Role:

Plus specialise que le REL, il participe au transport et a la finalisation des proteines, qui sont synthetisees par les ribosomes.

"+ - '

Fonctionnement:

Les proteines "tombent" dans la lumiere du RER o elles sont modifiees et deplacees. Elles quittent le RER dans une vesucule issue de la membrane de ce dernier.

' + "

Structure :

Composé d'une bicouche phospholipidique piquetée de ribosomes (d'un aspect rugueux) délimitant la lumière, un espace interne pouvant être comparé à un tunnel.

"+ + "

Rôle :

Plus spécialisé que le REL, il participe au transport et à la finalisation des protéines, qui sont synthétisées par les ribosomes.

"+ + '

Fonctionnement :

Les protéines "tombent" dans la lumière du RER où elles sont modifiées et déplacées. Elles quittent le RER dans une vésicule issue de la membrane de ce dernier.

' txt_noy = "

Noyau - Le coffre-fort

"+ - "

Structure:

Entoure par une double membrane appelee enveloppe nucleaire en lien par endroits avec le RER. Ces deux membranes fusionnent a intervalles reguliers pour former les pores nucleaires. a l'interieur se trouvent le nucleole et l'ADN, sous forme de chromatine ou de chomosomes.

"+ - "

Role:

Stockage de la totalite des informations genetiques necessaires a la vie de la cellule.

"+ - "

Fonctionnement:

Site de la transcription (copie de l'information genetique sur des ARNm).

" + "

Structure :

Entouré par une double membrane appelée enveloppe nucléaire en lien par endroits avec le RER. Ces deux membranes fusionnent à intervalles réguliers pour former les pores nucléaires. À l'intérieur se trouve le nucléole et l'ADN, sous forme de chromatine ou de chromosomes.

"+ + "

Rôle :

Stockage de la totalité des informations génétiques nécessaires à la vie de la cellule.

"+ + "

Fonctionnement :

Site de la transcription (copie de l'information génétique sur des ARNm).

" txt_rel = "

Reticulum endoplasmique lisse - REL

"+ - "

Structure:

Similaires a celle du RER, a la difference que sa membranne n'est pas parsemee de ribosomes, d'o son aspect lisse.

"+ - "

Role:

Sinthese des phospholipides,stockage du calcium, transformation de certaines molecules exterieures (medicament, alcool, ...). Dans certaines cellules, le REL remplit aussi des fonctions supplementaires, telles la production d'hormones, d'acides gastriques, etc.

"+ - "

Fonctionnement:

Il est le siege de beaucoup de reactions chimiques complexes (ex: detoxification, differentes syntheses).

" + "

Structure :

Similaire à celle du RER, à la différence que sa membrane n'est pas parsemée de ribosomes, d'où son aspect lisse.

"+ + "

Rôle :

Synthèse des phospholipides, stockage du calcium, transformation de certaines molécules extérieures (médicament, alcool...). Dans certaines cellules, le REL remplit aussi des fonctions supplémentaires, telles que la production d'hormones, d'acides gastriques, etc.

"+ + "

Fonctionnement :

Il est le siège de beaucoup de réactions chimiques complexes (ex : détoxification, différentes synthèses).

" txt_adn = "

ADN - Le livre de la vie

"+ - "

Structure:

echelle a la celebre forme de double helice composee de deux colonnes sucre-phosphate-sucre-phosphate-... et dont les echelons sont apelles bases azotees.

"+ - "

Role:

L'ADN contient toutes les informations necessaires a la vie.

"+ - "

Fonctionnement:

Toutes les informations sont ecrites a l'aide des quatre lettres A, T, G, et C. Grace a ces combinaisons, il est possible d'ecrire tout ce qui est utile a la cellule.

" + "

Structure :

échelle à la célèbre forme de double hélice composée de deux colonnes sucre-phosphate-sucre-phosphate-... et dont les échelons sont appelés bases azotées.

"+ + "

Rôle :

L'ADN contient toutes les informations nécessaires à la vie.

"+ + "

Fonctionnement :

Toutes les informations sont écrites à l'aide des quatre lettres A, T, G, et C. Grâce à ces combinaisons, il est possible d'écrire tout ce qui est utile à la cellule.

" - txt_centr= "

Centrioles - Remorqueurs de choromosomes

"+ - "

Structure:

Neuf triplets de microtubules entoures par un certain nombre de proteines.

"+ - "

Role:

Separer les differents chromosomes durant la division cellulaire.

"+ - "

Fonctionnement:

Les centrioles, une fois places aux deux poles de la cellule, deploient des microtubules vers les centromeres des chromosomes et les tirent vers eux pour les separer.

" + txt_centr= "

Centrioles - Remorqueurs de chromosomes

"+ + "

Structure :

Neuf triplets de microtubules entourent par un certain nombre de protéines.

"+ + "

Rôle :

Séparer les différents chromosomes durant la division cellulaire.

"+ + "

Fonctionnement :

Les centrioles, une fois placés aux deux pôles de la cellule, déploient des microtubules vers les centromères des chromosomes et les tirent vers eux pour les séparer.

" - txt_rib = "

Ribosome - Decodeurs

"+ - "

Structure:

Forme par deux sous-unites composees d'ARN ribosomique et de proteines.

"+ - "

Role:

Le ribosome synthetise les proteines.

"+ - "

Fonctionnement:

Un brin d'ARNm (messager) passe dans le ribosome et un ARNt (de transfert) entre dans la grande sous-unite si son codon (groupe de trois bases azotees) correspond a celui qui est en face sur l'ARNm. Cet ARNt porte avec lui un acide amine specifique qui est ajoute a la chaine deja assemblee.

" + txt_rib = "

Ribosome - Décodeurs

"+ + "

Structure :

Formé par deux sous-unités composées d'ARN ribosomique et de protéines.

"+ + "

Rôle :

Le ribosome synthétise les protéines.

"+ + "

Fonctionnement :

Un brin d'ARNm (messager) passe dans le ribosome et un ARNt (de transfert) entre dans la grande sous-unité si son codon (groupe de trois bases azotées) correspond à celui qui est en face sur l'ARNm. Cet ARNt porte avec lui un acide aminé spécifique qui est ajouté à la chaîne déjà assemblée.

" txt_arn = "

ARN - Multifonction

"+ - "

Structure:

Tres similaire a l'ADN a la difference qu'il ne possede qu'un brin et que la thymine (T) de l'ADN est remplacee par l'uracile (U). De plus, il est chimiquement plus instable que l'ADN, c'est pourquoi il n'est pas utilise pour le stockage d'informations a long terme.

"+ - "

Role:

Multiples, il existe des ARN de transport, messagers, regulateus, guides, satellites, ...

"+ - "

Fonctionnement:

La copie d'informations genetiques se fait grace a l'ouverture de la double-helice d'ADN, puis la copie des codons sur l'ARN. Celui-ci peut alors sortir du noyau, ce que l'ADN ne peut pas faire.

" + "

Structure :

Très similaire à l'ADN à la différence qu'il ne possède qu'un brin et que la thymine (T) de l'ADN est remplacée par l'uracile (U). De plus, il est chimiquement plus instable que l'ADN, c'est pourquoi il n'est pas utilisé pour le stockage d'informations à long terme.

"+ + "

Rôle :

Multiples, il existe des ARN de transport, messagers, régulateurs, guides, satellites...

"+ + "

Fonctionnement :

La copie d'informations génétiques se fait grâce à l'ouverture de la double hélice d'ADN, puis la copie des codons sur l'ARN. Celui-ci peut alors sortir du noyau, ce que l'ADN ne peut pas faire.

" - txt_nucl = "

Nucleole - Fabrique d'ARN

"+ - "

Structure:

Compose d'aucune membranne, c'est un agglomerat de proteines et d'ARN.

"+ - "

Role:

Lieu de la transcription d'ARN, nottament d'ARNr (ribosomiques) qui, associes avec des proteines, vont former les deux sous-unites des ribosomes.

"+ - "

Fonctionnement:

Creation d'un ribosome: Transcription des ARNr ainsi que des proteines necessaires (cette etape est effectuee dans le cytoplasme par d'autres ribosomes) qui rentrent dans le noyau, association des molecules franchement formees en un nouveau ribosome, qui sort du noyau pour jouer son Role.

" + txt_nucl = "

Nucléole - Fabrique d'ARN

"+ + "

Structure :

Composé d'aucune membrane, c'est un agglomérat de protéines et d'ARN.

"+ + "

Rôle :

Lieu de la transcription d'ARN, notamment d'ARNr (ribosomiques) qui, associés avec des protéines, vont former les deux sous-unités des ribosomes.

"+ + "

Fonctionnement :

Création d'un ribosome: Transcription des ARNr ainsi que des protéines nécessaires (cette étape est effectuée dans le cytoplasme par d'autres ribosomes) qui rentrent dans le noyau, association des molécules franchement formées en un nouveau ribosome, qui sort du noyau pour jouer son rôle.

" break; default: txt_vesicule = "

Vesicle
Transporter

"+ diff --git a/resources/library/interactivities/BlackYellow.wgt/locales/fr/scripts/blackYellow.js b/resources/library/interactivities/BlackYellow.wgt/locales/fr/scripts/blackYellow.js index 61b709f9..56976f82 100644 --- a/resources/library/interactivities/BlackYellow.wgt/locales/fr/scripts/blackYellow.js +++ b/resources/library/interactivities/BlackYellow.wgt/locales/fr/scripts/blackYellow.js @@ -13,7 +13,7 @@ * along with this program. If not, see . */ -var sankoreLang = {display: "Afficher", edit: "Modifier", add: "Ajouter", enter_data: "Saisir la donnée:", enter_result: "Saisir le résultat:", ok: "Accepter", cancel: "Annuler"}; +var sankoreLang = {display: "Afficher", edit: "Modifier", add: "Ajouter", enter_data: "Saisir la donnée:", enter_result: "Saisir le résultat:", ok: "Valider", cancel: "Annuler"}; function init(){ diff --git a/resources/library/interactivities/associer_images.wgt/js/script.js b/resources/library/interactivities/associer_images.wgt/js/script.js index 55910d11..633d943f 100644 --- a/resources/library/interactivities/associer_images.wgt/js/script.js +++ b/resources/library/interactivities/associer_images.wgt/js/script.js @@ -3,7 +3,7 @@ var sankoreLang = { edit: "Edit", short_desc: "Select the number \"three\".", add: "Add new block", - enter: "Enter what to do here ..." + enter: "Enter what to do here..." }; //main function diff --git a/src/adaptors/UBSvgSubsetAdaptor.cpp b/src/adaptors/UBSvgSubsetAdaptor.cpp index b39b7d25..33a5a091 100644 --- a/src/adaptors/UBSvgSubsetAdaptor.cpp +++ b/src/adaptors/UBSvgSubsetAdaptor.cpp @@ -2559,7 +2559,6 @@ UBGraphicsRuler* UBSvgSubsetAdaptor::UBSvgSubsetReader::rulerFromSvg() graphicsItemFromSvg(ruler); - UBGraphicsItem::assignZValue(ruler, UBGraphicsScene::toolLayerStart + UBGraphicsScene::toolOffsetRuler); ruler->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Tool)); QStringRef svgWidth = mXmlReader.attributes().value("width"); @@ -2617,7 +2616,6 @@ UBGraphicsCompass* UBSvgSubsetAdaptor::UBSvgSubsetReader::compassFromSvg() graphicsItemFromSvg(compass); - UBGraphicsItem::assignZValue(compass, UBGraphicsScene::toolLayerStart + UBGraphicsScene::toolOffsetCompass); compass->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Tool)); QStringRef svgX = mXmlReader.attributes().value("x"); @@ -2681,7 +2679,6 @@ UBGraphicsProtractor* UBSvgSubsetAdaptor::UBSvgSubsetReader::protractorFromSvg() { UBGraphicsProtractor* protractor = new UBGraphicsProtractor(); - UBGraphicsItem::assignZValue(protractor, UBGraphicsScene::toolLayerStart + UBGraphicsScene::toolOffsetProtractor); protractor->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Tool)); graphicsItemFromSvg(protractor); @@ -2751,7 +2748,6 @@ UBGraphicsTriangle* UBSvgSubsetAdaptor::UBSvgSubsetReader::triangleFromSvg() { UBGraphicsTriangle* triangle = new UBGraphicsTriangle(); - UBGraphicsItem::assignZValue(triangle, UBGraphicsScene::toolLayerStart + UBGraphicsScene::toolOffsetTriangle); triangle->setData(UBGraphicsItemData::ItemLayerType, QVariant(UBItemLayerType::Tool)); graphicsItemFromSvg(triangle); diff --git a/src/board/UBBoardView.cpp b/src/board/UBBoardView.cpp index c15618f0..46ec93a4 100644 --- a/src/board/UBBoardView.cpp +++ b/src/board/UBBoardView.cpp @@ -419,10 +419,10 @@ UBBoardView::mousePressEvent (QMouseEvent *event) movingItem = scene()->itemAt(this->mapToScene(event->posF().toPoint())); - if (!movingItem + if (!movingItem || movingItem->isSelected() || movingItem->type() == UBGraphicsDelegateFrame::Type - || movingItem->type() == DelegateButton::Type + || movingItem->type() == DelegateButton::Type || movingItem->type() == UBGraphicsCompass::Type || movingItem->type() == UBGraphicsPDFItem::Type || movingItem->type() == UBGraphicsPolygonItem::Type @@ -434,7 +434,7 @@ UBBoardView::mousePressEvent (QMouseEvent *event) QGraphicsView::mousePressEvent (event); } - else + else { mLastPressedMousePos = mapToScene(event->pos()); if (suspendedMousePressEvent) diff --git a/src/core/UBSettings.cpp b/src/core/UBSettings.cpp index 80513cf0..efea1136 100644 --- a/src/core/UBSettings.cpp +++ b/src/core/UBSettings.cpp @@ -86,6 +86,7 @@ const int UBSettings::defaultWidgetIconWidth = 110; const int UBSettings::defaultVideoWidth = 80; const int UBSettings::thumbnailSpacing = 20; +const int UBSettings::longClickInterval = 2000; const qreal UBSettings::minScreenRatio = 1.33; // 800/600 or 1024/768 diff --git a/src/core/UBSettings.h b/src/core/UBSettings.h index 25c94596..caf05033 100644 --- a/src/core/UBSettings.h +++ b/src/core/UBSettings.h @@ -178,6 +178,7 @@ class UBSettings : public QObject static const int defaultSoundWidth; static const int thumbnailSpacing; + static const int longClickInterval; static const qreal minScreenRatio; diff --git a/src/domain/UBGraphicsItemDelegate.cpp b/src/domain/UBGraphicsItemDelegate.cpp index 5c962d1b..778068c8 100644 --- a/src/domain/UBGraphicsItemDelegate.cpp +++ b/src/domain/UBGraphicsItemDelegate.cpp @@ -47,6 +47,28 @@ class UBGraphicsParaschoolEditorWidgetItem; +void DelegateButton::mousePressEvent(QGraphicsSceneMouseEvent *event) +{ + // make sure delegate is selected, to avoid control being hidden + mPressedTime = QTime::currentTime(); +// mDelegated->setSelected(true); + + event->setAccepted(!mIsTransparentToMouseEvent); + } + +void DelegateButton::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) +{ + int timeto = qAbs(QTime::currentTime().msecsTo(mPressedTime)); + + if (timeto < UBSettings::longClickInterval) { + emit clicked(); + } else { + emit longClicked(); + } + + event->setAccepted(!mIsTransparentToMouseEvent); +} + UBGraphicsItemDelegate::UBGraphicsItemDelegate(QGraphicsItem* pDelegated, QObject * parent, bool respectRatio, bool canRotate) : QObject(parent) , mDelegated(pDelegated) @@ -88,11 +110,13 @@ void UBGraphicsItemDelegate::init() mButtons << mMenuButton; mZOrderUpButton = new DelegateButton(":/images/plus.svg", mDelegated, mFrame, Qt::BottomLeftSection); - connect(mZOrderUpButton, SIGNAL(clicked()), this, SLOT(increaseZLevel())); + connect(mZOrderUpButton, SIGNAL(clicked()), this, SLOT(increaseZLevelUp())); + connect(mZOrderUpButton, SIGNAL(longClicked()), this, SLOT(increaseZlevelTop())); mButtons << mZOrderUpButton; mZOrderDownButton = new DelegateButton(":/images/minus.svg", mDelegated, mFrame, Qt::BottomLeftSection); - connect(mZOrderDownButton, SIGNAL(clicked()), this, SLOT(decreaseZLevel())); + connect(mZOrderDownButton, SIGNAL(clicked()), this, SLOT(increaseZLevelDown())); + connect(mZOrderDownButton, SIGNAL(longClicked()), this, SLOT(increaseZlevelBottom())); mButtons << mZOrderDownButton; buildButtons(); @@ -149,23 +173,22 @@ QVariant UBGraphicsItemDelegate::itemChange(QGraphicsItem::GraphicsItemChange ch return value; } +UBGraphicsScene *UBGraphicsItemDelegate::castUBGraphicsScene() +{ + UBGraphicsScene *castScene = dynamic_cast(delegated()->scene()); + + return castScene; +} bool UBGraphicsItemDelegate::mousePressEvent(QGraphicsSceneMouseEvent *event) { - if(NULL != mMimeData) - { - QDrag* mDrag = new QDrag(event->widget()); - mDrag->setMimeData(mMimeData); - mDrag->start(); - } + mDragStartPosition = event->pos(); startUndoStep(); if (!mDelegated->isSelected()) { mDelegated->setSelected(true); - qDebug() << mDelegated->zValue(); - positionHandles(); return true; } @@ -182,13 +205,27 @@ void UBGraphicsItemDelegate::setMimeData(QMimeData *mimeData) bool UBGraphicsItemDelegate::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { + if((NULL != mMimeData) && ((event->pos() - mDragStartPosition).manhattanLength() < QApplication::startDragDistance())) + { + QDrag* mDrag = new QDrag(event->widget()); + mDrag->setMimeData(mMimeData); + if (!mDragPixmap.isNull()) { + mDrag->setPixmap(mDragPixmap); + mDrag->setHotSpot(mDragPixmap.rect().center()); + } + mDrag->exec(); + mDragPixmap = QPixmap(); + + return true; + } + if(isLocked()) { event->accept(); return true; } else - return false; + return true; } bool UBGraphicsItemDelegate::weelEvent(QGraphicsSceneWheelEvent *event) @@ -215,81 +252,65 @@ bool UBGraphicsItemDelegate::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) return true; } +void UBGraphicsItemDelegate::hoverEnterEvent(QGraphicsSceneHoverEvent *event) +{ + Q_UNUSED(event) +// if (!mDelegated->isSelected()) { +// setZOrderButtonsVisible(true); +// } +} -void UBGraphicsItemDelegate::positionHandles() +void UBGraphicsItemDelegate::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { - if (mDelegated->isSelected()) - { - if (mFrame && !mFrame->scene() && mDelegated->scene()) - { - mDelegated->scene()->addItem(mFrame); - } + Q_UNUSED(event) +// if (!mDelegated->isSelected()) { +// setZOrderButtonsVisible(false); +// } +} - mFrame->setAntiScale(mAntiScaleRatio); - mFrame->positionHandles(); +void UBGraphicsItemDelegate::positionHandles() +{ + if (mDelegated->isSelected()) { + bool shownOnDisplay = mDelegated->data(UBGraphicsItemData::ItemLayerType).toInt() != UBItemLayerType::Control; + showHide(shownOnDisplay); + lock(isLocked()); + updateFrame(); mFrame->show(); - QTransform tr; - tr.scale(mAntiScaleRatio, mAntiScaleRatio); + updateButtons(true); - mDeleteButton->setTransform(tr); + } else { + foreach(DelegateButton* button, mButtons) + button->hide(); - qreal topX = mFrame->rect().left()- mDeleteButton->renderer()->viewBox().width() * mAntiScaleRatio / 2; - qreal topY = mFrame->rect().top() - mDeleteButton->renderer()->viewBox().height() * mAntiScaleRatio / 2; + mFrame->hide(); + } +} +void UBGraphicsItemDelegate::setZOrderButtonsVisible(bool visible) +{ + if (visible) { + updateFrame(); + updateButtons(); - qreal bottomX = mFrame->rect().left()- mDeleteButton->renderer()->viewBox().width() * mAntiScaleRatio / 2; - qreal bottomY = mFrame->rect().bottom() - mDeleteButton->renderer()->viewBox().height() * mAntiScaleRatio / 2; + QPointF newUpPoint = mFrame->mapToItem(mDelegated, mZOrderUpButton->pos()); + QPointF newDownPoint = mFrame->mapToItem(mDelegated, mZOrderDownButton->pos()); - mDeleteButton->setPos(topX, topY); - if (!mDeleteButton->scene()) - { - mDeleteButton->setParentItem(mFrame);//update parent for the case the item has been previously removed from scene - if (mDelegated->scene()) - mDelegated->scene()->addItem(mDeleteButton); - } + mZOrderUpButton->setParentItem(mDelegated); + mZOrderDownButton->setParentItem(mDelegated); - if(!mFrame->isResizing()){ - mDeleteButton->show(); - } + mZOrderUpButton->setPos(newUpPoint + QPointF(0,0)); + mZOrderDownButton->setPos(newDownPoint + QPointF(0,0)); - bool shownOnDisplay = mDelegated->data(UBGraphicsItemData::ItemLayerType).toInt() != UBItemLayerType::Control; - showHide(shownOnDisplay); - - lock(isLocked()); + mZOrderUpButton->show(); + mZOrderDownButton->show(); - int i = 1, j = 0, k = 0; - while ((i + j) < mButtons.size()) { - DelegateButton* button = mButtons[i + j]; - - button->setTransform(tr); - if (button->getSection() == Qt::TopLeftSection) { - button->setPos(topX + (i++ * 1.6 * mFrameWidth * mAntiScaleRatio), topY); - } else if (button->getSection() == Qt::BottomLeftSection) { - button->setPos(bottomX + (++j * 1.6 * mFrameWidth * mAntiScaleRatio), bottomY); - } else if (button->getSection() == Qt::NoSection) { - ++k; - } - if (!button->scene()) - { - button->setParentItem(mFrame);//update parent for the case the item has been previously removed from scene - if (mDelegated->scene()) - mDelegated->scene()->addItem(button); - } - if(!mFrame->isResizing()){ - button->show(); - button->setZValue(delegated()->zValue()); - } -} } else { - foreach(DelegateButton* button, mButtons) - button->hide(); - - mFrame->hide(); + mZOrderUpButton->hide(); + mZOrderDownButton->hide(); } } - void UBGraphicsItemDelegate::remove(bool canUndo) { // QGraphicsScene* scene = mDelegated->scene(); @@ -324,18 +345,34 @@ void UBGraphicsItemDelegate::duplicate() UBApplication::boardController->copy(); UBApplication::boardController->paste(); } -void UBGraphicsItemDelegate::increaseZLevel(int delta) -{ - qDebug() << delegated()->scene()->items().count(); -// UBGraphicsItem::assignZValue(delegated(), ) - -// int valueCandidate = delegated()->data(UBGraphicsItemData::ItemOwnZValue).toInt(); -// if (delta < 0) { - -// } else if (delta > 0) { - -// } +void UBGraphicsItemDelegate::increaseZLevelUp() +{ + UBGraphicsScene *curScene = castUBGraphicsScene(); + if (curScene) { + curScene->changeZLevelTo(delegated(), UBZLayerController::up); + } +} +void UBGraphicsItemDelegate::increaseZlevelTop() +{ + UBGraphicsScene *curScene = castUBGraphicsScene(); + if (curScene) { + curScene->changeZLevelTo(delegated(), UBZLayerController::top); + } +} +void UBGraphicsItemDelegate::increaseZLevelDown() +{ + UBGraphicsScene *curScene = castUBGraphicsScene(); + if (curScene) { + curScene->changeZLevelTo(delegated(), UBZLayerController::down); + } +} +void UBGraphicsItemDelegate::increaseZlevelBottom() +{ + UBGraphicsScene *curScene = castUBGraphicsScene(); + if (curScene) { + curScene->changeZLevelTo(delegated(), UBZLayerController::bottom); + } } void UBGraphicsItemDelegate::lock(bool locked) @@ -489,6 +526,67 @@ bool UBGraphicsItemDelegate::isFlippable() return mFlippable; } +void UBGraphicsItemDelegate::updateFrame() +{ + if (mFrame && !mFrame->scene() && mDelegated->scene()) + { + mDelegated->scene()->addItem(mFrame); + } + + mFrame->setAntiScale(mAntiScaleRatio); + mFrame->positionHandles(); +} + +void UBGraphicsItemDelegate::updateButtons(bool showUpdated) +{ + QTransform tr; + tr.scale(mAntiScaleRatio, mAntiScaleRatio); + + mDeleteButton->setParentItem(mFrame); + mDeleteButton->setTransform(tr); + + qreal topX = mFrame->rect().left() - mDeleteButton->renderer()->viewBox().width() * mAntiScaleRatio / 2; + qreal topY = mFrame->rect().top() - mDeleteButton->renderer()->viewBox().height() * mAntiScaleRatio / 2; + + qreal bottomX = mFrame->rect().left() - mDeleteButton->renderer()->viewBox().width() * mAntiScaleRatio / 2; + qreal bottomY = mFrame->rect().bottom() - mDeleteButton->renderer()->viewBox().height() * mAntiScaleRatio / 2; + + mDeleteButton->setPos(topX, topY); + + if (!mDeleteButton->scene()) + { + if (mDelegated->scene()) + mDelegated->scene()->addItem(mDeleteButton); + } + + if (showUpdated /*&& mFrame->isResizing()*/) + mDeleteButton->show(); + + int i = 1, j = 0, k = 0; + while ((i + j + k) < mButtons.size()) { + DelegateButton* button = mButtons[i + j]; + button->setParentItem(mFrame); + + button->setTransform(tr); + if (button->getSection() == Qt::TopLeftSection) { + button->setPos(topX + (i++ * 1.6 * mFrameWidth * mAntiScaleRatio), topY); + } else if (button->getSection() == Qt::BottomLeftSection) { + button->setPos(bottomX + (++j * 1.6 * mFrameWidth * mAntiScaleRatio), bottomY); + } else if (button->getSection() == Qt::NoSection) { + ++k; + } + if (!button->scene()) + { + if (mDelegated->scene()) + mDelegated->scene()->addItem(button); + } + if (showUpdated) { + button->show(); + button->setZValue(delegated()->zValue()); + } + } +} + void UBGraphicsItemDelegate::setButtonsVisible(bool visible) { foreach(DelegateButton* pButton, mButtons){ diff --git a/src/domain/UBGraphicsItemDelegate.h b/src/domain/UBGraphicsItemDelegate.h index 57e347bc..828f98d1 100644 --- a/src/domain/UBGraphicsItemDelegate.h +++ b/src/domain/UBGraphicsItemDelegate.h @@ -21,9 +21,11 @@ #include #include "core/UB.h" +#include "core/UBSettings.h" class QGraphicsSceneMouseEvent; class QGraphicsItem; +class UBGraphicsScene; class UBGraphicsProxyWidget; class UBGraphicsDelegateFrame; class UBGraphicsWidgetItem; @@ -63,20 +65,8 @@ class DelegateButton: public QGraphicsSvgItem protected: - virtual void mousePressEvent(QGraphicsSceneMouseEvent *event) - { - // make sure delegate is selected, to avoid control being hidden - mDelegated->setSelected(true); - - event->setAccepted(!mIsTransparentToMouseEvent); - } - - virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event) - { - emit clicked(); - - event->setAccepted(!mIsTransparentToMouseEvent); - } + virtual void mousePressEvent(QGraphicsSceneMouseEvent *event); + virtual void mouseReleaseEvent(QGraphicsSceneMouseEvent *event); void modified(); @@ -84,12 +74,13 @@ class DelegateButton: public QGraphicsSvgItem QGraphicsItem* mDelegated; - + QTime mPressedTime; bool mIsTransparentToMouseEvent; Qt::WindowFrameSection mButtonAlignmentSection; signals: void clicked (bool checked = false); + void longClicked(); }; @@ -110,8 +101,12 @@ class UBGraphicsItemDelegate : public QObject virtual bool mouseReleaseEvent(QGraphicsSceneMouseEvent *event); virtual bool weelEvent(QGraphicsSceneWheelEvent *event); + virtual void hoverEnterEvent(QGraphicsSceneHoverEvent *event); + virtual void hoverLeaveEvent(QGraphicsSceneHoverEvent *event); + virtual QVariant itemChange(QGraphicsItem::GraphicsItemChange change, const QVariant &value); + virtual UBGraphicsScene *castUBGraphicsScene(); void printMessage(const QString &mess) {qDebug() << mess;} @@ -123,6 +118,7 @@ class UBGraphicsItemDelegate : public QObject void setCanDuplicate(bool allow){ mCanDuplicate = allow; } virtual void positionHandles(); + void setZOrderButtonsVisible(bool visible); void startUndoStep(); void commitUndoStep(); @@ -135,6 +131,7 @@ class UBGraphicsItemDelegate : public QObject QMimeData* mimeData(){ return mMimeData; } void setMimeData(QMimeData* mimeData); + void setDragPixmap(const QPixmap &pix) {mDragPixmap = pix;} void setFlippable(bool flippable); bool isFlippable(); @@ -153,8 +150,10 @@ class UBGraphicsItemDelegate : public QObject virtual void lock(bool lock); virtual void duplicate(); - virtual void increaseZLevel() {increaseZLevel(1);} - virtual void decreaseZLevel() {increaseZLevel(-1);} + void increaseZLevelUp(); + void increaseZLevelDown(); + void increaseZlevelTop(); + void increaseZlevelBottom(); protected: virtual void buildButtons() {;} @@ -189,18 +188,22 @@ protected slots: virtual void gotoContentSource(bool checked); private: + void updateFrame(); + void updateButtons(bool showUpdated = false); + - virtual void increaseZLevel(int delta); QPointF mOffset; QTransform mPreviousTransform; QPointF mPreviousPosition; + QPointF mDragStartPosition; qreal mPreviousZValue; QSizeF mPreviousSize; bool mCanRotate; bool mCanDuplicate; bool mRespectRatio; QMimeData* mMimeData; + QPixmap mDragPixmap; /** A boolean saying that this object can be flippable (mirror effect) */ bool mFlippable; diff --git a/src/domain/UBGraphicsPixmapItem.cpp b/src/domain/UBGraphicsPixmapItem.cpp index 223ca4a2..231da3f0 100644 --- a/src/domain/UBGraphicsPixmapItem.cpp +++ b/src/domain/UBGraphicsPixmapItem.cpp @@ -58,13 +58,18 @@ void UBGraphicsPixmapItem::mousePressEvent(QGraphicsSceneMouseEvent *event) QMimeData* pMime = new QMimeData(); pMime->setImageData(pixmap().toImage()); mDelegate->setMimeData(pMime); + int k = pixmap().width() / 100; + QSize newSize(pixmap().width() / k, pixmap().height() / k); + + mDelegate->setDragPixmap(pixmap().scaled(newSize, Qt::IgnoreAspectRatio, Qt::SmoothTransformation)); + if (mDelegate->mousePressEvent(event)) { //NOOP } else { - QGraphicsPixmapItem::mousePressEvent(event); +// QGraphicsPixmapItem::mousePressEvent(event); } } diff --git a/src/domain/UBGraphicsPixmapItem.h b/src/domain/UBGraphicsPixmapItem.h index 56608ba1..5cb7d599 100644 --- a/src/domain/UBGraphicsPixmapItem.h +++ b/src/domain/UBGraphicsPixmapItem.h @@ -61,10 +61,6 @@ protected: virtual void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); virtual QVariant itemChange(GraphicsItemChange change, const QVariant &value); - - -// UBGraphicsItemDelegate* mDelegate; - }; #endif /* UBGRAPHICSPIXMAPITEM_H_ */ diff --git a/src/domain/UBGraphicsScene.cpp b/src/domain/UBGraphicsScene.cpp index 6f7f4d77..1fbb2340 100644 --- a/src/domain/UBGraphicsScene.cpp +++ b/src/domain/UBGraphicsScene.cpp @@ -61,24 +61,11 @@ #include "core/memcheck.h" -qreal UBGraphicsScene::drawingLayerStart = 0.0; -qreal UBGraphicsScene::toolLayerStart = 10000000.0; - -qreal UBGraphicsScene::toolOffsetRuler = 100; -qreal UBGraphicsScene::toolOffsetProtractor = 100; -qreal UBGraphicsScene::toolOffsetTriangle = 100; -qreal UBGraphicsScene::toolOffsetCompass = 100; -qreal UBGraphicsScene::toolOffsetEraser = 200; - -qreal UBGraphicsScene::toolOffsetCurtain = 1000; -qreal UBGraphicsScene::toolOffsetPointer = 1100; - -qreal UBGraphicsScene::toolOffsetCache = 1000;//Didier please define offset you want - qreal UBZLayerController::errorNumber = -20000001.0; +UBZLayerController::UBZLayerController(QGraphicsScene *scene) : + mScene(scene) -UBZLayerController::UBZLayerController() { scopeMap.insert(itemLayerType::NoLayer, ItemLayerTypeData( errorNumber, errorNumber)); scopeMap.insert(itemLayerType::BackgroundItem, ItemLayerTypeData(-10000000.0, -10000000.0 )); @@ -104,17 +91,162 @@ qreal UBZLayerController::generateZLevel(itemLayerType::Enum key) qreal result = scopeMap.value(key).curValue; qreal top = scopeMap.value(key).topLimit; + qreal incrementalStep = scopeMap.value(key).incStep; - result++; + result += incrementalStep; if (result >= top) { - qDebug() << "new values are over for the scope" << key; - result = top - 1; + // If not only one variable presents in the scope, notify that values for scope are over + if (scopeMap.value(key).topLimit != scopeMap.value(key).bottomLimit) { + qDebug() << "new values are over for the scope" << key; + } + result = top - incrementalStep; } scopeMap[key].curValue = result; return result; } +qreal UBZLayerController::generateZLevel(QGraphicsItem *item) +{ + qreal result = errorNumber; + itemLayerType::Enum type = static_cast(item->data(UBGraphicsItemData::itemLayerType).toInt()); + + if (validLayerType(type)) { + result = generateZLevel(type); + } + + return result; +} + +qreal UBZLayerController::changeZLevelTo(QGraphicsItem *item, moveDestination dest) +{ + itemLayerType::Enum curItemLayerType = typeForData(item); + if (curItemLayerType == itemLayerType::NoLayer) { + qDebug() << "item's layer is out of the scope. Can't implement z-layer changing operation"; + return errorNum(); + } + + //select only items wiht the same z-level as item's one and push it to sortedItems QMultiMap + QMultiMap sortedItems; + if (mScene->items().count()) { + foreach (QGraphicsItem *tmpItem, mScene->items()) { + if (typeForData(tmpItem) == curItemLayerType) { + + sortedItems.insert(tmpItem->data(UBGraphicsItemData::ItemOwnZValue).toReal(), tmpItem); + } + } + } + + //If only one item itself - do nothing, return it's z-value + if (sortedItems.count() == 1 && sortedItems.values().first() == item) { + qDebug() << "only one item exists in layer. Have nothing to change"; + return item->data(UBGraphicsItemData::ItemOwnZValue).toReal(); + } + + QMapIteratoriCurElement(sortedItems); + + if (dest == up) { + if (iCurElement.findNext(item)) { + if (iCurElement.hasNext()) { + qreal nextZ = iCurElement.peekNext().value()->data(UBGraphicsItemData::ItemOwnZValue).toReal(); + UBGraphicsItem::assignZValue(iCurElement.peekNext().value(), item->data(UBGraphicsItemData::ItemOwnZValue).toReal()); + UBGraphicsItem::assignZValue(item, nextZ); + + iCurElement.next(); + + while (iCurElement.hasNext() && iCurElement.peekNext().value()->data(UBGraphicsItemData::ItemOwnZValue).toReal() == nextZ) { + UBGraphicsItem::assignZValue(iCurElement.next().value(), nextZ); + } + + item->scene()->clearSelection(); + item->setSelected(true); + } + } + + } else if (dest == top) { + if (iCurElement.findNext(item)) { + if (iCurElement.hasNext()) { + UBGraphicsItem::assignZValue(item, generateZLevel(item)); + } + } + + } else if (dest == down) { + iCurElement.toBack(); + if (iCurElement.findPrevious(item)) { + if (iCurElement.hasPrevious()) { + qreal nextZ = iCurElement.peekPrevious().value()->data(UBGraphicsItemData::ItemOwnZValue).toReal(); + UBGraphicsItem::assignZValue(iCurElement.peekPrevious().value(), item->data(UBGraphicsItemData::ItemOwnZValue).toReal()); + UBGraphicsItem::assignZValue(item, nextZ); + + while (iCurElement.hasNext() && iCurElement.peekNext().value()->data(UBGraphicsItemData::ItemOwnZValue).toReal() == nextZ) { + UBGraphicsItem::assignZValue(iCurElement.next().value(), nextZ); + } + } + } + + } else if (dest == bottom) { + iCurElement.toBack(); + if (iCurElement.findPrevious(item)) { + if (iCurElement.hasPrevious()) { +// qreal oldz = iCurElement.peekPrevious().value()->data(UBGraphicsItemData::ItemOwnZValue).toReal(); + qreal oldz = item->data(UBGraphicsItemData::ItemOwnZValue).toReal(); + iCurElement.toFront(); + qreal nextZ = iCurElement.next().value()->data(UBGraphicsItemData::ItemOwnZValue).toReal(); + + ItemLayerTypeData curItemLayerTypeData = scopeMap.value(curItemLayerType); +// + //if we have some free space between lowest graphics item and layer's bottom bound, + //insert element close to first element in layer + if (nextZ >= curItemLayerTypeData.bottomLimit + curItemLayerTypeData.incStep) { + qreal result = nextZ - curItemLayerTypeData.incStep; + UBGraphicsItem::assignZValue(item, result); + } else { + UBGraphicsItem::assignZValue(item, nextZ); + bool doubleGap = false; //to detect if we can finish rundown since we can insert item to the free space + + while (iCurElement.peekNext().value() != item) { + qreal curZ = iCurElement.value()->data(UBGraphicsItemData::ItemOwnZValue).toReal(); + qreal curNextZ = iCurElement.peekNext().value()->data(UBGraphicsItemData::ItemOwnZValue).toReal(); + if (curNextZ - curZ >= 2 * curItemLayerTypeData.incStep) { + UBGraphicsItem::assignZValue(iCurElement.value(), curZ + curItemLayerTypeData.incStep); + doubleGap = true; + break; + } else { + UBGraphicsItem::assignZValue(iCurElement.value(), iCurElement.next().value()->data(UBGraphicsItemData::ItemOwnZValue).toReal()); + } + } + if (!doubleGap) { + + UBGraphicsItem::assignZValue(iCurElement.value(), oldz); + + while (iCurElement.hasNext() && (iCurElement.peekNext().value()->data(UBGraphicsItemData::ItemOwnZValue).toReal() == oldz)) { + UBGraphicsItem::assignZValue(iCurElement.next().value(), oldz); + } + } + } + } + } + } + + + //clear selection of the item and then select it again to activate selectionChangeProcessing() + item->scene()->clearSelection(); + item->setSelected(true); + + //Return new z value assigned to item + return item->data(UBGraphicsItemData::ItemOwnZValue).toReal(); +} + +itemLayerType::Enum UBZLayerController::typeForData(QGraphicsItem *item) const +{ + itemLayerType::Enum result = static_cast(item->data(UBGraphicsItemData::itemLayerType).toInt()); + + if (!scopeMap.contains(result)) { + result = itemLayerType::NoLayer; + } + + return result; +} UBGraphicsScene::UBGraphicsScene(UBDocumentProxy* parent) : UBCoreGraphicsScene(parent) @@ -135,8 +267,8 @@ UBGraphicsScene::UBGraphicsScene(UBDocumentProxy* parent) , enableUndoRedoStack(true) , magniferControlViewWidget(0) , magniferDisplayViewWidget(0) + , mZLayerController(new UBZLayerController(this)) , mIsDesktopMode(false) - { #ifdef __ppc__ @@ -164,6 +296,9 @@ UBGraphicsScene::~UBGraphicsScene() if (mCurrentStroke) if (mCurrentStroke->polygons().empty()) delete mCurrentStroke; + + if (mZLayerController) + delete mZLayerController; } void UBGraphicsScene::selectionChangedProcessing() @@ -177,7 +312,7 @@ void UBGraphicsScene::selectionChangedProcessing() QGraphicsItem *nextItem = allItemsList.at(i); if (nextItem->isSelected()) { - nextItem->setZValue(mZLayerController.generateZLevel(itemLayerType::SelectedItem)); + nextItem->setZValue(mZLayerController->generateZLevel(itemLayerType::SelectedItem)); } else { nextItem->setZValue(nextItem->data(UBGraphicsItemData::ItemOwnZValue).toReal()); } @@ -831,7 +966,6 @@ void UBGraphicsScene::leaveEvent(QEvent * event) hideEraser(); } - UBGraphicsScene* UBGraphicsScene::sceneDeepCopy() const { UBGraphicsScene* copy = new UBGraphicsScene(this->document()); @@ -1338,7 +1472,7 @@ void UBGraphicsScene::addItem(QGraphicsItem* item) setModified(true); UBCoreGraphicsScene::addItem(item); - UBGraphicsItem::assignZValue(item, generateZLevel(item)); + UBGraphicsItem::assignZValue(item, mZLayerController->generateZLevel(item)); if (!mTools.contains(item)) ++mItemCount; @@ -1352,7 +1486,7 @@ void UBGraphicsScene::addItems(const QSet& items) foreach(QGraphicsItem* item, items) { UBCoreGraphicsScene::addItem(item); - UBGraphicsItem::assignZValue(item, generateZLevel(item)); + UBGraphicsItem::assignZValue(item, mZLayerController->generateZLevel(item)); } mItemCount += items.size(); @@ -1414,7 +1548,7 @@ QGraphicsItem* UBGraphicsScene::setAsBackgroundObject(QGraphicsItem* item, bool item->setAcceptedMouseButtons(Qt::NoButton); item->setData(UBGraphicsItemData::ItemLayerType, UBItemLayerType::FixedBackground); - UBGraphicsItem::assignZValue(item, mZLayerController.generateZLevel(itemLayerType::BackgroundItem)); + UBGraphicsItem::assignZValue(item, mZLayerController->generateZLevel(itemLayerType::BackgroundItem)); if (pAdaptTransformation) { @@ -1787,6 +1921,23 @@ void UBGraphicsScene::setNominalSize(int pWidth, int pHeight) setNominalSize(QSize(pWidth, pHeight)); } +void UBGraphicsScene::setSelectedZLevel(QList itemList) +{ + foreach (QGraphicsItem *item, itemList) { + item->setZValue(mZLayerController->generateZLevel(itemLayerType::SelectedItem)); + } +} +void UBGraphicsScene::setOwnZlevel(QList itemList) +{ + foreach (QGraphicsItem *item, itemList) { + item->setZValue(item->data(UBGraphicsItemData::ItemOwnZValue).toReal()); + } +} + +qreal UBGraphicsScene::changeZLevelTo(QGraphicsItem *item, UBZLayerController::moveDestination dest) +{ + return mZLayerController->changeZLevelTo(item, dest); +} QGraphicsItem* UBGraphicsScene::rootItem(QGraphicsItem* item) const { @@ -2011,18 +2162,6 @@ void UBGraphicsScene::createPointer() addItem(mPointer); } -qreal UBGraphicsScene::generateZLevel(QGraphicsItem *item) -{ - qreal result = UBZLayerController::errorNum(); - itemLayerType::Enum type = static_cast(item->data(UBGraphicsItemData::itemLayerType).toInt()); - - if (mZLayerController.validLayerType(type)) { - result = mZLayerController.generateZLevel(type); - } - - return result; -} - void UBGraphicsScene::setToolCursor(int tool) { if (tool != (int)UBStylusTool::Selector diff --git a/src/domain/UBGraphicsScene.h b/src/domain/UBGraphicsScene.h index 1cdd37e4..829a3bb8 100644 --- a/src/domain/UBGraphicsScene.h +++ b/src/domain/UBGraphicsScene.h @@ -49,33 +49,47 @@ class UBGraphicsCache; const double PI = 4.0 * atan(1.0); -class UBZLayerController +class UBZLayerController : public QObject { -public: + Q_OBJECT +public: struct ItemLayerTypeData { - ItemLayerTypeData() : bottomLimit(0), topLimit(0), curValue(0) {;} - ItemLayerTypeData(qreal bot, qreal top) : bottomLimit(bot), topLimit(top), curValue(bot) {;} - qreal bottomLimit; - qreal topLimit; - qreal curValue; + ItemLayerTypeData() : bottomLimit(0), topLimit(0), curValue(0), incStep(1) {;} + ItemLayerTypeData(qreal bot, qreal top, qreal increment = 1) : bottomLimit(bot), topLimit(top), curValue(bot), incStep(increment) {;} + qreal bottomLimit; //bottom bound of the layer + qreal topLimit;//top bound of the layer + qreal curValue;//current value of variable + qreal incStep;//incremental step + }; + + enum moveDestination { + up + , down + , top + , bottom }; typedef QMap ScopeMap; - UBZLayerController(); + UBZLayerController(QGraphicsScene *scene); qreal getBottomLimit(itemLayerType::Enum key) const {return scopeMap.value(key).bottomLimit;} qreal getTopLimit(itemLayerType::Enum key) const {return scopeMap.value(key).topLimit;} bool validLayerType(itemLayerType::Enum key) const {return scopeMap.contains(key);} + static qreal errorNum() {return errorNumber;} qreal generateZLevel(itemLayerType::Enum key); + qreal generateZLevel(QGraphicsItem *item); - private: - ScopeMap scopeMap; - static qreal errorNumber; + qreal changeZLevelTo(QGraphicsItem *item, moveDestination dest); + itemLayerType::Enum typeForData(QGraphicsItem *item) const; +private: + ScopeMap scopeMap; + static qreal errorNumber; + QGraphicsScene *mScene; }; class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem @@ -87,7 +101,7 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem // tmp stub for divide addings scene objects from undo mechanism implementation void setURStackEnable(bool set = true) {enableUndoRedoStack = set;} - UBGraphicsScene(UBDocumentProxy *parent); + UBGraphicsScene(UBDocumentProxy *parent); virtual ~UBGraphicsScene(); virtual UBItem* deepCopy() const; @@ -242,6 +256,8 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem void setNominalSize(int pWidth, int pHeight); + qreal changeZLevelTo(QGraphicsItem *item, UBZLayerController::moveDestination dest); + enum RenderingContext { Screen = 0, NonScreen, PdfExport, Podcast @@ -257,20 +273,6 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem return mRenderingContext; } - static qreal backgroundLayerStart; - static qreal objectLayerStart; - static qreal drawingLayerStart; - static qreal toolLayerStart; - - static qreal toolOffsetEraser; - static qreal toolOffsetPointer; - static qreal toolOffsetRuler; - static qreal toolOffsetProtractor; - static qreal toolOffsetCompass; - static qreal toolOffsetCurtain; - static qreal toolOffsetTriangle; - static qreal toolOffsetCache; - QSet tools(){ return mTools;} void registerTool(QGraphicsItem* item) @@ -283,7 +285,9 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem return mPreviousPoint; } - public slots: + void setSelectedZLevel(QList itemList); + void setOwnZlevel(QList itemList); +public slots: void hideEraser(); @@ -339,8 +343,6 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem void createEraiser(); void createPointer(); - qreal generateZLevel(QGraphicsItem *item); - QGraphicsEllipseItem* mEraser; QGraphicsEllipseItem* mPointer; @@ -392,7 +394,7 @@ class UBGraphicsScene: public UBCoreGraphicsScene, public UBItem UBMagnifier *magniferControlViewWidget; UBMagnifier *magniferDisplayViewWidget; - UBZLayerController mZLayerController; + UBZLayerController *mZLayerController; }; diff --git a/src/domain/UBGraphicsVideoItem.cpp b/src/domain/UBGraphicsVideoItem.cpp index 887fdb7a..9fa9d345 100644 --- a/src/domain/UBGraphicsVideoItem.cpp +++ b/src/domain/UBGraphicsVideoItem.cpp @@ -109,10 +109,10 @@ void UBGraphicsVideoItem::showOnDisplayChanged(bool shown) void UBGraphicsVideoItem::mousePressEvent(QGraphicsSceneMouseEvent *event) { - QDrag* mDrag = new QDrag(event->widget()); - QMimeData* pMime = new QMimeData(); - mDrag->setMimeData(pMime); - mDrag->start(); +// QDrag* mDrag = new QDrag(event->widget()); +// QMimeData* pMime = new QMimeData(); +// mDrag->setMimeData(pMime); +// mDrag->start(); mShouldMove = (event->buttons() & Qt::LeftButton); mMousePressPos = event->scenePos(); diff --git a/src/domain/UBGraphicsWidgetItem.cpp b/src/domain/UBGraphicsWidgetItem.cpp index 899a7714..13487641 100644 --- a/src/domain/UBGraphicsWidgetItem.cpp +++ b/src/domain/UBGraphicsWidgetItem.cpp @@ -82,11 +82,13 @@ void UBGraphicsWidgetItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) void UBGraphicsWidgetItem::hoverEnterEvent(QGraphicsSceneHoverEvent *event) { sendJSEnterEvent(); + mDelegate->hoverEnterEvent(event); UBGraphicsProxyWidget::hoverEnterEvent(event); } void UBGraphicsWidgetItem::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) { sendJSLeaveEvent(); + mDelegate->hoverLeaveEvent(event); UBGraphicsProxyWidget::hoverLeaveEvent(event); } diff --git a/src/domain/UBItem.cpp b/src/domain/UBItem.cpp index 3e6f68cf..54c16e73 100644 --- a/src/domain/UBItem.cpp +++ b/src/domain/UBItem.cpp @@ -29,7 +29,7 @@ UBItem::~UBItem() // NOOP } -void UBGraphicsItem::assignZValue(QGraphicsItem *item, int value) +void UBGraphicsItem::assignZValue(QGraphicsItem *item, qreal value) { item->setZValue(value); item->setData(UBGraphicsItemData::ItemOwnZValue, value); diff --git a/src/domain/UBItem.h b/src/domain/UBItem.h index e10cd57a..301395fa 100644 --- a/src/domain/UBItem.h +++ b/src/domain/UBItem.h @@ -101,7 +101,7 @@ protected: public: - static void assignZValue(QGraphicsItem*, int value); + static void assignZValue(QGraphicsItem*, qreal value); virtual UBGraphicsItemDelegate *Delegate() const = 0; virtual void remove() = 0; diff --git a/src/tools/UBGraphicsRuler.h b/src/tools/UBGraphicsRuler.h index fb74dd9d..1c799bb1 100644 --- a/src/tools/UBGraphicsRuler.h +++ b/src/tools/UBGraphicsRuler.h @@ -44,7 +44,7 @@ class UBGraphicsRuler : public UBAbstractDrawRuler, public QGraphicsRectItem, pu virtual void StartLine(const QPointF& position, qreal width); virtual void DrawLine(const QPointF& position, qreal width); - virtual void EndLine(); + virtual void EndLine(); protected: