diff --git a/sources/diagramimageitem.cpp b/sources/diagramimageitem.cpp index f1f85a8da..ca6456c4c 100644 --- a/sources/diagramimageitem.cpp +++ b/sources/diagramimageitem.cpp @@ -111,55 +111,7 @@ void DiagramImageItem::mousePressEvent(QGraphicsSceneMouseEvent *e) { */ void DiagramImageItem::mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event) { Q_UNUSED (event); - if (diagram() -> isReadOnly()) return; - //the range for scale image and divisor factor - int min_range = 1; - int max_range = 200; - int factor_range = 100; - - //the dialog - QDialog property_dialog; - property_dialog.setWindowTitle(tr("\311diter les propri\351t\351s d'une image", "window title")); - //the main layout - QVBoxLayout *dialog_layout = new QVBoxLayout(&property_dialog); - - //GroupBox for resizer image - QGroupBox *resize_groupe = new QGroupBox(tr("Dimension de l'image", "image size")); - dialog_layout -> addWidget(resize_groupe); - QHBoxLayout *resize_layout = new QHBoxLayout(resize_groupe); - - //slider - QSlider *slider = new QSlider(Qt::Horizontal, &property_dialog); - slider->setRange(min_range, max_range); - qreal scale_= scale(); - slider -> setValue(scale_*factor_range); - //spinbox - QSpinBox *spin_box = new QSpinBox(&property_dialog); - spin_box -> setRange(min_range, max_range); - spin_box -> setValue(scale_*factor_range); - spin_box -> setSuffix(" %"); - //synchro slider with spinbox - connect(slider, SIGNAL(valueChanged(int)), spin_box, SLOT(setValue(int))); - connect(slider, SIGNAL(valueChanged(int)), this, SLOT(PreviewScale(int))); - connect(spin_box, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int))); - //add slider and spinbox to layout - resize_layout -> addWidget(slider); - resize_layout -> addWidget(spin_box); - - //dialog button, box - QDialogButtonBox *dbb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); - dialog_layout -> addWidget(dbb); - connect(dbb, SIGNAL(accepted()), &property_dialog, SLOT(accept())); - connect(dbb, SIGNAL(rejected()), &property_dialog, SLOT(reject())); - //dialog is accepted... - if (property_dialog.exec() == QDialog::Accepted) { - qreal new_scale = slider -> value(); - new_scale /= factor_range; - if (scale_ != new_scale) diagram()->undoStack().push(new ImageResizerCommand(this, scale_, new_scale)); - } - //...or not - else setScale(scale_); - return; + edit(); } /** @@ -266,7 +218,55 @@ void DiagramImageItem::PreviewScale(int scale) { * @brief Edit the image with .... */ void DiagramImageItem::edit() { - // waiting + if (diagram() -> isReadOnly()) return; + //the range for scale image and divisor factor + int min_range = 1; + int max_range = 200; + int factor_range = 100; + + //the dialog + QDialog property_dialog; + property_dialog.setWindowTitle(tr("\311diter les propri\351t\351s d'une image", "window title")); + //the main layout + QVBoxLayout *dialog_layout = new QVBoxLayout(&property_dialog); + + //GroupBox for resizer image + QGroupBox *resize_groupe = new QGroupBox(tr("Dimension de l'image", "image size")); + dialog_layout -> addWidget(resize_groupe); + QHBoxLayout *resize_layout = new QHBoxLayout(resize_groupe); + + //slider + QSlider *slider = new QSlider(Qt::Horizontal, &property_dialog); + slider->setRange(min_range, max_range); + qreal scale_= scale(); + slider -> setValue(scale_*factor_range); + //spinbox + QSpinBox *spin_box = new QSpinBox(&property_dialog); + spin_box -> setRange(min_range, max_range); + spin_box -> setValue(scale_*factor_range); + spin_box -> setSuffix(" %"); + //synchro slider with spinbox + connect(slider, SIGNAL(valueChanged(int)), spin_box, SLOT(setValue(int))); + connect(slider, SIGNAL(valueChanged(int)), this, SLOT(PreviewScale(int))); + connect(spin_box, SIGNAL(valueChanged(int)), slider, SLOT(setValue(int))); + //add slider and spinbox to layout + resize_layout -> addWidget(slider); + resize_layout -> addWidget(spin_box); + + //dialog button, box + QDialogButtonBox *dbb = new QDialogButtonBox(QDialogButtonBox::Ok | QDialogButtonBox::Cancel); + dialog_layout -> addWidget(dbb); + connect(dbb, SIGNAL(accepted()), &property_dialog, SLOT(accept())); + connect(dbb, SIGNAL(rejected()), &property_dialog, SLOT(reject())); + //dialog is accepted... + if (property_dialog.exec() == QDialog::Accepted) { + qreal new_scale = slider -> value(); + new_scale /= factor_range; + if (scale_ != new_scale) diagram()->undoStack().push(new ImageResizerCommand(this, scale_, new_scale)); + } + //...or not + else setScale(scale_); + return; } void DiagramImageItem::setPixmap(const QPixmap &pixmap) { diff --git a/sources/diagramview.cpp b/sources/diagramview.cpp index e234a7eb3..f3ccf221a 100644 --- a/sources/diagramview.cpp +++ b/sources/diagramview.cpp @@ -1261,6 +1261,21 @@ void DiagramView::addImage() { } current_behavior = addingImage; } + +/** + * @brief DiagramView::editImage + * open edit image dialog if only one image is selected + */ +void DiagramView::editImage() { + if (scene -> isReadOnly()) return; + QList images = diagram() -> selectedContent().items(DiagramContent::Images); + if (images.count() != 1) return; + DiagramImageItem *image; + if ((image = qgraphicsitem_cast (images.first()))) { + image -> edit(); + } +} + /** * @brief DiagramView::addDiagramImageAtPos * @param pos @@ -1338,9 +1353,8 @@ void DiagramView::contextMenuEvent(QContextMenuEvent *e) { context_menu -> addAction(qde -> delete_selection); context_menu -> addAction(qde -> rotate_selection); context_menu -> addAction(qde -> rotate_texts); - context_menu -> addAction(qde -> add_edittext); + context_menu -> addAction(qde -> edit_selection); context_menu -> addAction(qde -> find_element); - context_menu -> addAction(qde -> edit_element); context_menu -> addAction(qde -> selection_prop); } diff --git a/sources/diagramview.h b/sources/diagramview.h index f7e29111f..2325b0294 100644 --- a/sources/diagramview.h +++ b/sources/diagramview.h @@ -75,6 +75,7 @@ class DiagramView : public QGraphicsView { void addText(); void editText(); void addImage(); + void editImage(); IndependentTextItem *addDiagramTextAtPos(const QPointF &); DiagramImageItem *addDiagramImageAtPos(const QPointF &); diff --git a/sources/qetdiagrameditor.cpp b/sources/qetdiagrameditor.cpp index 611c9eb87..fa1501c84 100644 --- a/sources/qetdiagrameditor.cpp +++ b/sources/qetdiagrameditor.cpp @@ -209,14 +209,13 @@ void QETDiagramEditor::actions() { rotate_selection = new QAction(QET::Icons::ObjectRotateRight, tr("Pivoter"), this); rotate_texts = new QAction(QET::Icons::ObjectRotateRight, tr("Orienter les textes"), this); find_element = new QAction( tr("Retrouver dans le panel"), this); - edit_element = new QAction(QET::Icons::ElementEdit, tr("\311diter l'\351l\351ment"), this); + edit_selection = new QAction(QET::Icons::ElementEdit, tr("\311diter l'item s\351lectionn\351"), this); selection_prop = new QAction(QET::Icons::DialogInformation, tr("Propri\351t\351s de la s\351lection"), this); conductor_reset = new QAction(QET::Icons::ConductorSettings, tr("R\351initialiser les conducteurs"), this); infos_diagram = new QAction(QET::Icons::DialogInformation, tr("Propri\351t\351s du sch\351ma"), this); add_text = new QAction(QET::Icons::PartTextField, tr("Ajouter un champ de texte"), this); - add_edittext = new QAction(QET::Icons::EditText, tr("\311diter le champ de texte"), this); add_column = new QAction(QET::Icons::EditTableInsertColumnRight, tr("Ajouter une colonne"), this); - add_image = new QAction(QET::Icons::adding_image, tr("Ajouter une image"), this); + add_image = new QAction(QET::Icons::adding_image, tr("Ajouter une image"), this); remove_column = new QAction(QET::Icons::EditTableDeleteColumn, tr("Enlever une colonne"), this); add_row = new QAction(QET::Icons::EditTableInsertRowUnder, tr("Ajouter une ligne"), this); remove_row = new QAction(QET::Icons::EditTableDeleteRow, tr("Enlever une ligne"), this); @@ -274,6 +273,7 @@ void QETDiagramEditor::actions() { selection_prop -> setShortcut(QKeySequence(tr("Ctrl+J"))); conductor_reset -> setShortcut(QKeySequence(tr("Ctrl+K"))); infos_diagram -> setShortcut(QKeySequence(tr("Ctrl+L"))); + edit_selection -> setShortcut(QKeySequence(tr("Ctrl+E"))); prj_add_diagram -> setShortcut(QKeySequence(tr("Ctrl+T"))); @@ -310,7 +310,6 @@ void QETDiagramEditor::actions() { rotate_selection -> setStatusTip(tr("Pivote les \351l\351ments et textes s\351lectionn\351s", "status bar tip")); rotate_texts -> setStatusTip(tr("Pivote les textes s\351lectionn\351s \340 un angle pr\351cis", "status bar tip")); find_element -> setStatusTip(tr("Retrouve l'\351l\351ment s\351lectionn\351 dans le panel", "status bar tip")); - edit_element -> setStatusTip(tr("Retrouve l'\351l\351ment s\351lectionn\351 dans le panel avant de l'\351diter", "status bar tip")); selection_prop -> setStatusTip(tr("\311dite les propri\351t\351s des objets s\351lectionn\351", "status bar tip")); conductor_reset -> setStatusTip(tr("Recalcule les chemins des conducteurs sans tenir compte des modifications", "status bar tip")); infos_diagram -> setStatusTip(tr("\311dite les informations affich\351es par le cartouche", "status bar tip")); @@ -338,7 +337,7 @@ void QETDiagramEditor::actions() { // traitements speciaux add_text -> setCheckable(true); - add_image -> setCheckable(true); + add_image -> setCheckable(true); windowed_view_mode -> setCheckable(true); tabbed_view_mode -> setCheckable(true); mode_selection -> setCheckable(true); @@ -364,8 +363,7 @@ void QETDiagramEditor::actions() { connect(rotate_selection, SIGNAL(triggered()), this, SLOT(slot_rotate()) ); connect(rotate_texts, SIGNAL(triggered()), this, SLOT(slot_rotateTexts()) ); connect(find_element, SIGNAL(triggered()), this, SLOT(findSelectedElementInPanel())); - connect(edit_element, SIGNAL(triggered()), this, SLOT(findSelectedElementInPanel())); - connect(edit_element, SIGNAL(triggered()), this, SLOT(editSelectedElementInEditor())); + connect(edit_selection, SIGNAL(triggered()), this, SLOT(slot_editSelection()) ); connect(windowed_view_mode, SIGNAL(triggered()), this, SLOT(setWindowedMode()) ); connect(tabbed_view_mode, SIGNAL(triggered()), this, SLOT(setTabbedMode()) ); connect(mode_selection, SIGNAL(triggered()), this, SLOT(slot_setSelectionMode()) ); @@ -400,7 +398,6 @@ void QETDiagramEditor::actions() { connect(conductor_reset, SIGNAL(triggered()), this, SLOT(slot_resetConductors()) ); connect(infos_diagram, SIGNAL(triggered()), this, SLOT(editCurrentDiagramProperties())); connect(add_text, SIGNAL(triggered()), this, SLOT(slot_addText()) ); - connect(add_edittext, SIGNAL(triggered()), this, SLOT(slot_editText()) ); connect(add_image, SIGNAL(triggered()), this, SLOT(slot_addImage()) ); connect(add_column, SIGNAL(triggered()), this, SLOT(slot_addColumn()) ); connect(remove_column, SIGNAL(triggered()), this, SLOT(slot_removeColumn()) ); @@ -476,7 +473,7 @@ void QETDiagramEditor::menus() { menu_edition -> addAction(delete_selection); menu_edition -> addAction(rotate_selection); menu_edition -> addAction(rotate_texts); - menu_edition -> addAction(add_edittext); + menu_edition -> addAction(edit_selection); menu_edition -> addAction(selection_prop); menu_edition -> addSeparator(); menu_edition -> addAction(conductor_reset); @@ -1193,7 +1190,6 @@ void QETDiagramEditor::slot_updateComplexActions() { // number of selected elements int selected_elements_count = dv ? dv -> diagram() -> selectedContent().count(DiagramContent::Elements) : 0; find_element -> setEnabled(selected_elements_count == 1); - edit_element -> setEnabled(selected_elements_count == 1); // actions ayant aussi besoin d'items (elements, conducteurs, textes, ...) selectionnes bool copiable_items = dv ? (dv -> hasCopiableItems()) : false; @@ -1209,7 +1205,38 @@ void QETDiagramEditor::slot_updateComplexActions() { int selected_texts = dv ? (dv -> diagram() -> selectedTexts().count()) : 0; int selected_conductor_texts = dv ? (dv -> diagram() -> selectedConductorTexts().count()) : 0; rotate_texts -> setEnabled(editable_diagram && selected_texts); - add_edittext -> setEnabled(editable_diagram && selected_texts == 1 && !selected_conductor_texts); + + // actions need only one editable item + int selected_image = dv ? dv -> diagram() -> selectedContent().count(DiagramContent::Images) : 0; + int selected_editable = selected_elements_count + (selected_texts - selected_conductor_texts) + selected_image; + + if (selected_editable == 1) { + edit_selection -> setEnabled(true); + //edit element + if (selected_elements_count == 1) { + edit_selection -> setText(tr("\311diter l'\351lement", "edit element")); + edit_selection -> setIcon(QET::Icons::ElementEdit); + edit_selection -> setIconVisibleInMenu(true); + } + //edit text field + else if (selected_texts == 1) { + edit_selection -> setText(tr("\311diter le champ de texte", "edit text field")); + edit_selection -> setIcon(QET::Icons::EditText); + edit_selection -> setIconVisibleInMenu(true); + } + //edit image + else if (selected_image) { + edit_selection -> setText(tr("\311diter l'image", "edit image")); + edit_selection ->setIconVisibleInMenu(false); + } + } + //not an editable item + else { + edit_selection -> setText(tr("\311diter l'objet s\351lectionn\351", "edit selected item")); + edit_selection -> setIcon(QET::Icons::ElementEdit); + edit_selection -> setIconVisibleInMenu(true); + edit_selection -> setEnabled(false); + } } @@ -1501,12 +1528,22 @@ void QETDiagramEditor::slot_addImage() { dv -> addImage(); } } + /** - to Edit en text through the html editor -*/ -void QETDiagramEditor::slot_editText() { + * @brief QETDiagramEditor::slot_editSelection + * edit the selected item if he can be edited and if only one item is selected + */ +void QETDiagramEditor::slot_editSelection() { if (DiagramView *dv = currentDiagram()) { - dv -> editText(); + DiagramContent dc = dv -> diagram() -> selectedContent(); + if (dc.count() != 1) return; + + if (dc.count(DiagramContent::Elements)) { + findSelectedElementInPanel(); + editSelectedElementInEditor(); + } + else if (dc.count(DiagramContent::TextFields)) dv -> editText(); + else if (dc.count(DiagramContent::Images)) dv -> editImage(); } } @@ -1767,7 +1804,6 @@ void QETDiagramEditor::diagramWasAdded(DiagramView *dv) { connect(dv, SIGNAL(selectionChanged()), this, SLOT(slot_updateComplexActions())); connect(dv, SIGNAL(modeChanged()), this, SLOT(slot_updateModeActions())); connect(dv, SIGNAL(textAdded(bool)), add_text, SLOT(setChecked(bool))); - connect(dv, SIGNAL(textAdded(bool)), add_edittext, SLOT(setChecked(bool))); connect(dv, SIGNAL(ImageAdded(bool)), add_image, SLOT(setChecked(bool))); connect(dv, SIGNAL(ImageAddedCanceled(bool)), add_image, SLOT(setChecked(bool))); } diff --git a/sources/qetdiagrameditor.h b/sources/qetdiagrameditor.h index 2df50e716..fc1de253d 100644 --- a/sources/qetdiagrameditor.h +++ b/sources/qetdiagrameditor.h @@ -123,8 +123,8 @@ class QETDiagramEditor : public QETMainWindow { void slot_editConductor(); void slot_resetConductors(); void slot_addText(); - void slot_editText(); void slot_addImage(); + void slot_editSelection(); void setWindowedMode(); void setTabbedMode(); void readSettings(); @@ -190,13 +190,11 @@ class QETDiagramEditor : public QETMainWindow { QAction *rotate_selection; ///< Rotate selected elements and text items by 90 degrees QAction *rotate_texts; ///< Direct selected text items to a specific angle QAction *find_element; ///< Find the selected element in the panel - QAction *edit_element; ///< Edit the selected element QAction *selection_prop; ///< Show a dialog describing the selection QAction *conductor_reset; ///< Reset paths of selected conductors QAction *conductor_default; ///< Show a dialog to edit default conductor properties QAction *infos_diagram; ///< Show a dialog to edit diagram properties QAction *add_text; ///< Tool to add an independent text item on diagrams - QAction *add_edittext; ///< Tool to add an independent text item on diagrams QAction *add_column; ///< Increase diagram width by adding an extra column QAction *remove_column; ///< Decrease diagram width by removing the last column QAction *add_row; ///< Increase diagram height by adding an extra row @@ -216,7 +214,9 @@ class QETDiagramEditor : public QETMainWindow { QAction *cascade_window; ///< Show MDI subwindows as cascade QAction *prev_window; ///< Switch to the previous document QAction *next_window; ///< Switch to the next document - QAction *add_image; ///< Tool to add an independent image item on diagrams + QAction *add_image; ///< Tool to add an independent image item on diagrams + QAction *edit_selection; ///< To edit selected item + private: QMdiArea workspace; QSignalMapper windowMapper;