From ed318f7a16484d60abbd84b224b824fc85dfcf73 Mon Sep 17 00:00:00 2001 From: ruglory Date: Tue, 10 Mar 2009 18:56:30 +0000 Subject: [PATCH] Clipboard copy/cut/paste for items implemented git-svn-id: https://svn.code.sf.net/p/qlscribe/svn/trunk@123 cac9541e-1b8d-4bfa-827e-589bba606050 --- src/mainwindow.cpp | 46 ++++++++++++++++-- src/mainwindow.h | 4 ++ src/qcdscene.cpp | 114 ++++++++++++++++++++++++++++++++++++++------- src/qcdscene.h | 6 +++ src/qlscribe.h.in | 2 + 5 files changed, 151 insertions(+), 21 deletions(-) diff --git a/src/mainwindow.cpp b/src/mainwindow.cpp index b769ae4..3e03178 100644 --- a/src/mainwindow.cpp +++ b/src/mainwindow.cpp @@ -49,7 +49,7 @@ MainWindow::MainWindow( bool enablePrint ) setWindowTitle( tr( "Qt lightScribe", "Main window title \"Qt lightScribe\"" ) ); setCentralWidget( m_mdiArea ); - m_menuFile = menuBar()->addMenu( tr( "File", "Menu item \"File\"" ) ); + m_menuFile = menuBar()->addMenu( tr( "File", "Menu item \"File\"" ) ); { QMenu *newSubMenu = m_menuFile->addMenu( tr( "New label", "Menu item \"New lable\"" ) ); @@ -76,8 +76,8 @@ MainWindow::MainWindow( bool enablePrint ) m_menuFile->addAction( tr( "Save", "Menu item \"Save\"" ), this, - SLOT(onMenuSave()) ); - + SLOT(onMenuSave()), + QKeySequence( Qt::CTRL + Qt::Key_S ) ); m_menuFile->addAction( tr( "Save as...", "Menu item \"Save as\"" ), this, @@ -106,7 +106,24 @@ MainWindow::MainWindow( bool enablePrint ) this, SLOT(close())); - m_menuInsert = menuBar()->addMenu( tr( "Insert", "Menu item \"Insert\"" ) ); + m_menuEdit = menuBar()->addMenu( tr( "Edit", "Menu item \"Edit\"" ) ); + + m_menuEdit->addAction( tr( "Copy", "Menu item \"Copy\"" ), + this, + SLOT(onMenuCopy()), + QKeySequence( Qt::CTRL + Qt::Key_C ) ); + + m_menuEdit->addAction( tr( "Cut", "Menu item \"Cut\"" ), + this, + SLOT(onMenuCut()), + QKeySequence( Qt::CTRL + Qt::Key_X ) ); + + m_menuEdit->addAction( tr( "Paste", "Menu item \"Paste\"" ), + this, + SLOT(onMenuPaste()), + QKeySequence( Qt::CTRL + Qt::Key_V ) ); + + m_menuInsert = m_menuEdit->addMenu( tr( "Insert", "Menu item \"Insert\"" ) ); m_menuHelp = menuBar()->addMenu( tr( "Help", "Menu item \"Help\"" ) ); @@ -347,6 +364,27 @@ void MainWindow::onMenuPrint() } } +void MainWindow::onMenuCopy() +{ + QCDScene *scene = getScene( m_mdiArea ); + if( scene ) + scene->putItemToClipboard( false ); +} + +void MainWindow::onMenuCut() +{ + QCDScene *scene = getScene( m_mdiArea ); + if( scene ) + scene->putItemToClipboard( true ); +} + +void MainWindow::onMenuPaste() +{ + QCDScene *scene = getScene( m_mdiArea ); + if( scene ) + scene->getItemFromClipboard(); +} + void MainWindow::onMenuAbout() { QMessageBox::about( this, diff --git a/src/mainwindow.h b/src/mainwindow.h index 593ad27..5d3b908 100644 --- a/src/mainwindow.h +++ b/src/mainwindow.h @@ -48,6 +48,9 @@ private slots: void onMenuProperties(); void onMenuPrintPreview(); void onMenuPrint(); + void onMenuCopy(); + void onMenuCut(); + void onMenuPaste(); void onMenuInsert( int id ); void onMenuAbout(); void onMenuQtAbout(); @@ -58,6 +61,7 @@ private: QMdiArea *m_mdiArea; QMenu *m_menuFile; + QMenu *m_menuEdit; QMenu *m_menuInsert; QMenu *m_menuHelp; diff --git a/src/qcdscene.cpp b/src/qcdscene.cpp index 4bbe30e..612acc3 100644 --- a/src/qcdscene.cpp +++ b/src/qcdscene.cpp @@ -31,6 +31,9 @@ #include #include #include +#include +#include +#include QCDScene::QCDScene( QObject * parent ) : QGraphicsScene( parent ), @@ -200,12 +203,34 @@ void QCDScene::write( QXmlStreamWriter &writer ) writer.writeEndDocument(); } + +bool QCDScene::readItem( QXmlStreamReader &reader ) +{ + QShapeFactory &sfactory = QShapeFactory::instance(); + + QString type = reader.attributes().value( "type" ).toString(); + QShapeFactory::iterator f = sfactory.find( type ); + if( f == sfactory.end() ) { + QMessageBox::warning( 0, + "Warning", + QString( "QCDScene: unknown item type \"" ) + + type + "\"" ); + return false; + } + QGraphicsItem *item = f->second->read( reader ); + if( item ) { + item->setFlag( QGraphicsItem::ItemIsMovable, true ); + item->setFlag( QGraphicsItem::ItemIsSelectable, true ); + addItem( item ); + return true; + } + return false; +} + void QCDScene::read( QXmlStreamReader &reader ) { bool gotScene = false; - QShapeFactory &sfactory = QShapeFactory::instance(); - while( !reader.atEnd() ) { QXmlStreamReader::TokenType ttype = reader.readNext(); if( ttype != QXmlStreamReader::StartElement ) @@ -225,27 +250,70 @@ void QCDScene::read( QXmlStreamReader &reader ) } if( elementName == "item" ) { - QString type = reader.attributes().value( "type" ).toString(); - QShapeFactory::iterator f = sfactory.find( type ); - if( f == sfactory.end() ) { - QMessageBox::warning( 0, - "Warning", - QString( "QCDScene: unknown item type \"" ) - + type + "\"" ); - continue; - } - QGraphicsItem *item = f->second->read( reader ); - if( item ) { - item->setFlag( QGraphicsItem::ItemIsMovable, true ); - item->setFlag( QGraphicsItem::ItemIsSelectable, true ); - addItem( item ); - } + readItem( reader ); } else throw QString( "QCDScene: unknown element \"" ) + elementName + "\""; } } +void QCDScene::putItemToClipboard( bool move ) +{ + QList list = selectedItems(); + if( list.empty() ) + return; + QGraphicsItem *item = list.front(); + + QShapeFactory &sfactory = QShapeFactory::instance(); + QShapeFactory::iterator f = sfactory.find( item->type() ); + if( f == sfactory.end() ) { + QMessageBox::warning( 0, tr( "Warning" ), tr( "Cannot find controller for type %n", 0, item->type() ) ); + return; + } + + QByteArray array; + QXmlStreamWriter writer( &array ); + + f->second->write( writer, item ); + QMimeData *mdata = new QMimeData; + mdata->setData( itemMimeType, array ); + mdata->setText( array.data() ); + + QApplication::clipboard()->setMimeData( mdata ); + + if( move ) { + removeItem( item ); + delete item; + setChanged(); + } +} + +void QCDScene::getItemFromClipboard() +{ + const QMimeData *mdata = QApplication::clipboard()->mimeData(); + if( !mdata ) + return; + + if( !mdata->hasFormat( itemMimeType ) ) + return; + + QByteArray array = mdata->data( itemMimeType ); + QXmlStreamReader reader( array ); + + while( !reader.atEnd() ) { + QXmlStreamReader::TokenType ttype = reader.readNext(); + if( ttype != QXmlStreamReader::StartElement ) + continue; + + QString elementName = reader.name().toString(); + + if( elementName == "item" ) { + if( readItem( reader ) ) + setChanged(); + } + } +} + void QCDScene::contextMenuEvent( QGraphicsSceneContextMenuEvent *mouseEvent ) { QGraphicsItem *item = itemAt( mouseEvent->scenePos() ); @@ -254,6 +322,8 @@ void QCDScene::contextMenuEvent( QGraphicsSceneContextMenuEvent *mouseEvent ) item->setSelected( true ); QMenu menu; menu.addAction( tr( "edit..." ), this, SLOT( onMenuEdit() ) ); + menu.addAction( tr( "copy" ), this, SLOT( onMenuCopy() ) ); + menu.addAction( tr( "cut" ), this, SLOT( onMenuCut() ) ); menu.addAction( tr( "bring to Front" ), this, SLOT( onMenuToFront() ) ); menu.addAction( tr( "send to Back" ), this, SLOT( onMenuToBack() ) ); menu.addAction( tr( "delete" ), this, SLOT( onMenuDelete() ) ); @@ -269,6 +339,16 @@ void QCDScene::onMenuEdit() QShapeFactory::instance().edit( item, 0 ); } +void QCDScene::onMenuCopy() +{ + putItemToClipboard( false ); +} + +void QCDScene::onMenuCut() +{ + putItemToClipboard( true ); +} + void QCDScene::onMenuToFront() { sendItemTo( true ); diff --git a/src/qcdscene.h b/src/qcdscene.h index 9b5bd52..6a863b5 100644 --- a/src/qcdscene.h +++ b/src/qcdscene.h @@ -52,6 +52,9 @@ public: bool save(); bool saveAs( const QString &fileName ); + void putItemToClipboard( bool move ); + void getItemFromClipboard(); + void updateTitles() const; void redrawViews() const; QString name() const { return m_name; } @@ -61,12 +64,15 @@ protected: private slots: void onMenuEdit(); + void onMenuCopy(); + void onMenuCut(); void onMenuToFront(); void onMenuToBack(); void onMenuDelete(); private: void write( QXmlStreamWriter &writer ); + bool readItem( QXmlStreamReader &reader ); void read( QXmlStreamReader &reader ); void sendItemTo( bool front ); diff --git a/src/qlscribe.h.in b/src/qlscribe.h.in index 8970d05..1533481 100644 --- a/src/qlscribe.h.in +++ b/src/qlscribe.h.in @@ -59,6 +59,8 @@ enum MediaOptimizationLevel { mediaGeneric }; +const char * const itemMimeType = "application/x-qlscribe;item"; + const char * const DBusServiceName = "@QLSCRIBE_DBUS_MANAGER_SERVICE@"; const char * const DBusManagerPath = "@QLSCRIBE_DBUS_MANAGER_PATH@";