summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLukáš Lalinský <lalinsky@gmail.com>2008-12-07 14:59:49 +0100
committerLukáš Lalinský <lalinsky@gmail.com>2008-12-07 14:59:49 +0100
commit788d1af4dccb754cd2a57cc968f2d46651a95291 (patch)
tree0ac449f8e64bd61aebafad2c771e147885e3e3d8
parent8899b36403190fa6dc7e37be60944e0ff43e1b2b (diff)
downloaddbmodel-788d1af4dccb754cd2a57cc968f2d46651a95291.tar.gz
dbmodel-788d1af4dccb754cd2a57cc968f2d46651a95291.tar.bz2
Simple copy/paste framework
-rw-r--r--dbmodel.qrc4
-rw-r--r--icons/16x16/edit-copy.pngbin0 -> 498 bytes
-rw-r--r--icons/16x16/edit-cut.pngbin0 -> 807 bytes
-rw-r--r--icons/16x16/edit-paste.pngbin0 -> 561 bytes
-rw-r--r--src/databasetable.cpp10
-rw-r--r--src/databasetable.h2
-rw-r--r--src/diagramobject.cpp19
-rw-r--r--src/diagramobject.h4
-rw-r--r--src/mainwindow.cpp86
-rw-r--r--src/mainwindow.h11
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
new file mode 100644
index 0000000..8dd48c4
--- /dev/null
+++ b/icons/16x16/edit-copy.png
Binary files differ
diff --git a/icons/16x16/edit-cut.png b/icons/16x16/edit-cut.png
new file mode 100644
index 0000000..dc9eb9a
--- /dev/null
+++ b/icons/16x16/edit-cut.png
Binary files differ
diff --git a/icons/16x16/edit-paste.png b/icons/16x16/edit-paste.png
new file mode 100644
index 0000000..24588a3
--- /dev/null
+++ b/icons/16x16/edit-paste.png
Binary files differ
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;