Diagram editor : add new action in the context menu : multiple paste.

git-svn-id: svn+ssh://svn.tuxfamily.org/svnroot/qet/qet/trunk@5319 bfdf4180-ca20-0410-9c96-a3a8aa849046
This commit is contained in:
blacksun
2018-04-08 16:50:52 +00:00
parent b9e24cd08f
commit 12e7a7002e
7 changed files with 322 additions and 0 deletions

View File

@@ -0,0 +1,81 @@
#include "multipastedialog.h"
#include "ui_multipastedialog.h"
#include "diagram.h"
#include "diagramcommands.h"
MultiPasteDialog::MultiPasteDialog(Diagram *diagram, QWidget *parent) :
QDialog(parent),
ui(new Ui::MultiPasteDialog),
m_diagram(diagram)
{
ui->setupUi(this);
connect(ui->m_x_sb, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &MultiPasteDialog::updatePreview);
connect(ui->m_y_sb, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &MultiPasteDialog::updatePreview);
connect(ui->m_copy_count, static_cast<void (QSpinBox::*)(int)>(&QSpinBox::valueChanged), this, &MultiPasteDialog::updatePreview);
QRectF br;
for (QGraphicsItem *item : m_diagram->selectedItems())
br = br.united(item->mapToScene(item->boundingRect()).boundingRect());
m_origin = br.topLeft();
m_document = m_diagram->toXml(false);
updatePreview();
}
MultiPasteDialog::~MultiPasteDialog()
{
if(m_accept == false)
{
for(QGraphicsItem *item : m_pasted_content.items())
{
if(item->scene() && item->scene() == m_diagram)
{
m_diagram->removeItem(item);
delete item;
}
}
}
delete ui;
}
void MultiPasteDialog::updatePreview()
{
//First of all we remove all precedent items added from the previous preview.
for(QGraphicsItem *item : m_pasted_content.items())
{
if(item->scene() && item->scene() == m_diagram)
{
m_diagram->removeItem(item);
delete item;
}
}
m_pasted_content.clear();
QPointF offset(ui->m_x_sb->value(), ui->m_y_sb->value());
QPointF pos = m_origin+offset;
for(int i=0 ; i<ui->m_copy_count->value() ; i++)
{
DiagramContent dc;
m_diagram->fromXml(m_document, pos, false, &dc);
m_pasted_content += dc;
pos += offset;
}
if(m_pasted_content.count())
m_diagram->adjustSceneRect();
}
void MultiPasteDialog::on_m_button_box_accepted()
{
if(m_pasted_content.count())
{
m_diagram->clearSelection();
m_diagram->undoStack().push(new PasteDiagramCommand(m_diagram, m_pasted_content));
m_diagram->adjustSceneRect();
m_accept = true;
}
}

View File

@@ -0,0 +1,35 @@
#ifndef MULTIPASTEDIALOG_H
#define MULTIPASTEDIALOG_H
#include <QDialog>
#include "diagramcontent.h"
#include "QDomDocument"
class Diagram;
namespace Ui {
class MultiPasteDialog;
}
class MultiPasteDialog : public QDialog
{
Q_OBJECT
public:
explicit MultiPasteDialog(Diagram *diagram, QWidget *parent = 0);
~MultiPasteDialog();
void updatePreview();
private slots:
void on_m_button_box_accepted();
private:
Ui::MultiPasteDialog *ui;
Diagram *m_diagram = nullptr;
DiagramContent m_pasted_content;
QPointF m_origin;
QDomDocument m_document;
bool m_accept = false;
};
#endif // MULTIPASTEDIALOG_H

View File

@@ -0,0 +1,150 @@
<?xml version="1.0" encoding="UTF-8"?>
<ui version="4.0">
<class>MultiPasteDialog</class>
<widget class="QDialog" name="MultiPasteDialog">
<property name="geometry">
<rect>
<x>0</x>
<y>0</y>
<width>261</width>
<height>110</height>
</rect>
</property>
<property name="windowTitle">
<string>Collage multiple</string>
</property>
<layout class="QVBoxLayout" name="verticalLayout">
<item>
<layout class="QHBoxLayout" name="horizontalLayout">
<item>
<widget class="QLabel" name="label">
<property name="text">
<string>Décalage</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="m_x_sb">
<property name="suffix">
<string>px</string>
</property>
<property name="prefix">
<string>x: </string>
</property>
<property name="minimum">
<number>-1000</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="value">
<number>100</number>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="m_y_sb">
<property name="suffix">
<string>px</string>
</property>
<property name="prefix">
<string>y: </string>
</property>
<property name="minimum">
<number>-1000</number>
</property>
<property name="maximum">
<number>1000</number>
</property>
<property name="singleStep">
<number>10</number>
</property>
<property name="value">
<number>0</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<layout class="QHBoxLayout" name="horizontalLayout_2">
<item>
<widget class="QLabel" name="label_2">
<property name="text">
<string>Nombre de copie</string>
</property>
</widget>
</item>
<item>
<widget class="QSpinBox" name="m_copy_count">
<property name="minimum">
<number>1</number>
</property>
</widget>
</item>
</layout>
</item>
<item>
<spacer name="verticalSpacer">
<property name="orientation">
<enum>Qt::Vertical</enum>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>20</width>
<height>40</height>
</size>
</property>
</spacer>
</item>
<item>
<widget class="QDialogButtonBox" name="m_button_box">
<property name="orientation">
<enum>Qt::Horizontal</enum>
</property>
<property name="standardButtons">
<set>QDialogButtonBox::Cancel|QDialogButtonBox::Ok</set>
</property>
</widget>
</item>
</layout>
</widget>
<resources/>
<connections>
<connection>
<sender>m_button_box</sender>
<signal>accepted()</signal>
<receiver>MultiPasteDialog</receiver>
<slot>accept()</slot>
<hints>
<hint type="sourcelabel">
<x>248</x>
<y>254</y>
</hint>
<hint type="destinationlabel">
<x>157</x>
<y>274</y>
</hint>
</hints>
</connection>
<connection>
<sender>m_button_box</sender>
<signal>rejected()</signal>
<receiver>MultiPasteDialog</receiver>
<slot>reject()</slot>
<hints>
<hint type="sourcelabel">
<x>316</x>
<y>260</y>
</hint>
<hint type="destinationlabel">
<x>286</x>
<y>274</y>
</hint>
</hints>
</connection>
</connections>
</ui>