diff options
author | Lukáš Lalinský <lalinsky@gmail.com> | 2008-12-07 14:59:49 +0100 |
---|---|---|
committer | Lukáš Lalinský <lalinsky@gmail.com> | 2008-12-07 14:59:49 +0100 |
commit | 788d1af4dccb754cd2a57cc968f2d46651a95291 (patch) | |
tree | 0ac449f8e64bd61aebafad2c771e147885e3e3d8 | |
parent | 8899b36403190fa6dc7e37be60944e0ff43e1b2b (diff) | |
download | dbmodel-788d1af4dccb754cd2a57cc968f2d46651a95291.tar.gz dbmodel-788d1af4dccb754cd2a57cc968f2d46651a95291.tar.bz2 |
Simple copy/paste framework
-rw-r--r-- | dbmodel.qrc | 4 | ||||
-rw-r--r-- | icons/16x16/edit-copy.png | bin | 0 -> 498 bytes | |||
-rw-r--r-- | icons/16x16/edit-cut.png | bin | 0 -> 807 bytes | |||
-rw-r--r-- | icons/16x16/edit-paste.png | bin | 0 -> 561 bytes | |||
-rw-r--r-- | src/databasetable.cpp | 10 | ||||
-rw-r--r-- | src/databasetable.h | 2 | ||||
-rw-r--r-- | src/diagramobject.cpp | 19 | ||||
-rw-r--r-- | src/diagramobject.h | 4 | ||||
-rw-r--r-- | src/mainwindow.cpp | 86 | ||||
-rw-r--r-- | src/mainwindow.h | 11 |
10 files changed, 135 insertions, 1 deletions
diff --git a/dbmodel.qrc b/dbmodel.qrc index d1f4227..a13b509 100644 --- a/dbmodel.qrc +++ b/dbmodel.qrc @@ -11,6 +11,10 @@ <file>icons/16x16/edit-undo.png</file> <file>icons/16x16/edit-redo.png</file> <file>icons/16x16/edit-delete.png</file> + <file>icons/16x16/edit-cut.png</file> + <file>icons/16x16/edit-copy.png</file> + <file>icons/16x16/edit-paste.png</file> + <file>icons/16x16/edit-delete.png</file> <!-- Translations --> <file>translations/dbmodel_sk.qm</file> </qresource> diff --git a/icons/16x16/edit-copy.png b/icons/16x16/edit-copy.png Binary files differnew file mode 100644 index 0000000..8dd48c4 --- /dev/null +++ b/icons/16x16/edit-copy.png diff --git a/icons/16x16/edit-cut.png b/icons/16x16/edit-cut.png Binary files differnew file mode 100644 index 0000000..dc9eb9a --- /dev/null +++ b/icons/16x16/edit-cut.png diff --git a/icons/16x16/edit-paste.png b/icons/16x16/edit-paste.png Binary files differnew file mode 100644 index 0000000..24588a3 --- /dev/null +++ b/icons/16x16/edit-paste.png diff --git a/src/databasetable.cpp b/src/databasetable.cpp index 3468b8e..cfbeb5d 100644 --- a/src/databasetable.cpp +++ b/src/databasetable.cpp @@ -15,6 +15,7 @@ // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. #include <QGraphicsScene> +#include <QMimeData> #include <QDebug> #include "databasetable.h" #include "diagramdocument.h" @@ -181,3 +182,12 @@ DatabaseTable::updateLayout() update(); } + +QMimeData * +DatabaseTable::toMimeData() +{ + QMimeData *mimeData = new QMimeData(); + QByteArray data = name().toUtf8(); + mimeData->setData("application/dbmodel.object", data); + return mimeData; +} diff --git a/src/databasetable.h b/src/databasetable.h index 5765a97..9268b0d 100644 --- a/src/databasetable.h +++ b/src/databasetable.h @@ -51,6 +51,8 @@ public: enum { Type = DiagramItem::Table }; virtual int type() const { return Type; } + QMimeData *toMimeData(); + signals: void propertyChanged(const QString &name, const QVariant &value); diff --git a/src/diagramobject.cpp b/src/diagramobject.cpp index e0d6c17..1bc6300 100644 --- a/src/diagramobject.cpp +++ b/src/diagramobject.cpp @@ -14,10 +14,29 @@ // with this program; if not, write to the Free Software Foundation, Inc., // 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. +#include <QMimeData> #include "diagramobject.h" +#include "databasetable.h" DiagramObject::DiagramObject(DiagramItem *parent) : DiagramItem(parent) { setZValue(100.0); } + +QMimeData * +DiagramObject::toMimeData() +{ + return 0; +} + +DiagramObject * +DiagramObject::fromMimeData(const QMimeData *mimeData) +{ + QByteArray data = mimeData->data("application/dbmodel.object"); + if (data.isNull()) + return 0; + DatabaseTable *table = new DatabaseTable(); + table->setName(data); + return table; +} diff --git a/src/diagramobject.h b/src/diagramobject.h index 1ca086e..c7b4dd3 100644 --- a/src/diagramobject.h +++ b/src/diagramobject.h @@ -18,11 +18,15 @@ #define DIAGRAMOBJECT_H #include "diagramitem.h" +class QMimeData; class DiagramObject : public DiagramItem { public: DiagramObject(DiagramItem *parent = 0); + + virtual QMimeData *toMimeData(); + static DiagramObject *fromMimeData(const QMimeData *mimeData); }; #endif diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index 53e75d7..8cd8cab 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -30,6 +30,7 @@ #include <QDebug> #include "mainwindow.h" #include "databasetable.h" +#include "commands.h" using namespace std; @@ -43,6 +44,10 @@ MainWindow::MainWindow() updateRecentFileActions(); restoreWindowState(); + + connect(QApplication::clipboard(), SIGNAL(changed(QClipboard::Mode)), this, SLOT(updateClipboard(QClipboard::Mode))); + updateClipboard(QClipboard::Clipboard); + updateSelection(); } MainWindow::~MainWindow() @@ -200,6 +205,30 @@ MainWindow::setupActions() connect(m_actionSwitchMode[0], SIGNAL(triggered(bool)), SLOT(switchModeSelect())); connect(m_actionSwitchMode[1], SIGNAL(triggered(bool)), SLOT(switchModeAddTable())); connect(m_actionSwitchMode[2], SIGNAL(triggered(bool)), SLOT(switchModeAddRelation())); + + m_actionCut = new QAction(this); + m_actionCut->setText(tr("Cu&t")); + m_actionCut->setIcon(QIcon(":/icons/16x16/edit-cut.png")); + m_actionCut->setShortcut(QKeySequence(tr("Ctrl+X"))); + connect(m_actionCut, SIGNAL(triggered(bool)), SLOT(cut())); + + m_actionCopy = new QAction(this); + m_actionCopy->setText(tr("&Copy")); + m_actionCopy->setIcon(QIcon(":/icons/16x16/edit-copy.png")); + m_actionCopy->setShortcut(QKeySequence(tr("Ctrl+C"))); + connect(m_actionCopy, SIGNAL(triggered(bool)), SLOT(copy())); + + m_actionPaste = new QAction(this); + m_actionPaste->setText(tr("&Paste")); + m_actionPaste->setIcon(QIcon(":/icons/16x16/edit-paste.png")); + m_actionPaste->setShortcut(QKeySequence(tr("Ctrl+V"))); + connect(m_actionPaste, SIGNAL(triggered(bool)), SLOT(paste())); + + m_actionDelete = new QAction(this); + m_actionDelete->setText(tr("&Delete")); + m_actionDelete->setIcon(QIcon(":/icons/16x16/edit-delete.png")); + m_actionDelete->setShortcut(QKeySequence(tr("Del"))); + connect(m_actionDelete, SIGNAL(triggered(bool)), SLOT(deleteSelectedItems())); } void @@ -216,6 +245,10 @@ MainWindow::setupToolBar() toolBar->addSeparator(); toolBar->addAction(m_actionUndo); toolBar->addAction(m_actionRedo); + toolBar->addSeparator(); + toolBar->addAction(m_actionCut); + toolBar->addAction(m_actionCopy); + toolBar->addAction(m_actionPaste); toolBar = addToolBar(tr("&Mode")); toolBar->setObjectName("modeToolBar"); toolBar->setIconSize(QSize(16, 16)); @@ -270,7 +303,11 @@ MainWindow::setupMenuBar() menu->addAction(m_actionUndo); menu->addAction(m_actionRedo); menu->addSeparator(); - menu->addAction(tr("&Delete"), this, SLOT(deleteSelectedItems()), QKeySequence(tr("Del"))); + menu->addAction(m_actionCut); + menu->addAction(m_actionCopy); + menu->addAction(m_actionPaste); + menu->addSeparator(); + menu->addAction(m_actionDelete); } void @@ -401,6 +438,16 @@ MainWindow::updateSelection() { DatabaseTable *table = m_model->selectedTable(); m_properties->setTable(table); + if (table) { + m_actionCut->setEnabled(true); + m_actionCopy->setEnabled(true); + m_actionDelete->setEnabled(true); + } + else { + m_actionCut->setEnabled(false); + m_actionCopy->setEnabled(false); + m_actionDelete->setEnabled(false); + } } void @@ -479,3 +526,40 @@ MainWindow::updateRecentFileActions() m_actionRecentFilesSeparator->setVisible(numRecentFiles > 0); } + +void +MainWindow::cut() +{ + DatabaseTable *table = m_model->selectedTable(); + QApplication::clipboard()->setMimeData(table->toMimeData()); + m_model->deleteSelectedItems(); +} + +void +MainWindow::copy() +{ + DatabaseTable *table = m_model->selectedTable(); + QApplication::clipboard()->setMimeData(table->toMimeData()); +} + +void +MainWindow::paste() +{ + const QMimeData *mimeData = QApplication::clipboard()->mimeData(QClipboard::Clipboard); + if (mimeData) { + DiagramObject *object = DiagramObject::fromMimeData(mimeData); + m_model->undoStack()->push(new AddItemCommand(m_model, object)); + } +} + +void +MainWindow::updateClipboard(QClipboard::Mode mode) +{ + if (mode != QClipboard::Clipboard) + return; + const QMimeData *mimeData = QApplication::clipboard()->mimeData(QClipboard::Clipboard); + if (mimeData && mimeData->formats().contains("application/dbmodel.object")) + m_actionPaste->setEnabled(true); + else + m_actionPaste->setEnabled(false); +} diff --git a/src/mainwindow.h b/src/mainwindow.h index 10eedbf..e09bc5a 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -18,6 +18,7 @@ #define MAINWINDOW_H #include <QMainWindow> +#include <QClipboard> #include <QSplitter> #include <QStackedWidget> #include <QUndoGroup> @@ -61,6 +62,11 @@ public slots: void openRecentFile(); void updateRecentFileActions(); + void cut(); + void copy(); + void paste(); + void updateClipboard(QClipboard::Mode mode); + protected: void setupUi(); void setupActions(); @@ -90,6 +96,11 @@ private: QAction *m_actionSaveAs; QAction *m_actionExportPNG; + QAction *m_actionCut; + QAction *m_actionCopy; + QAction *m_actionPaste; + QAction *m_actionDelete; + QPoint m_lastPos; QSize m_lastSize; |