From 79c5dcde812dcba49f26d68c8a3acfeb7d884aea Mon Sep 17 00:00:00 2001 From: Jim Evins Date: Sat, 11 Mar 2017 10:00:37 -0500 Subject: [PATCH] Paste text from clipboard. --- glabels/LabelModel.cpp | 16 ++++++++-- glabels/LabelModelImageObject.cpp | 4 +-- glabels/LabelModelImageObject.h | 4 +-- glabels/LabelModelObject.cpp | 20 ++++++------ glabels/LabelModelObject.h | 11 ++++--- glabels/LabelModelTextObject.cpp | 53 +++++++++++++++++++++++++++++++ glabels/LabelModelTextObject.h | 6 ++++ glabels/ObjectEditor.cpp | 4 +-- 8 files changed, 94 insertions(+), 24 deletions(-) diff --git a/glabels/LabelModel.cpp b/glabels/LabelModel.cpp index 68ca518..c89c790 100644 --- a/glabels/LabelModel.cpp +++ b/glabels/LabelModel.cpp @@ -28,7 +28,9 @@ #include #include "LabelModelObject.h" +#include "LabelModelTextObject.h" #include "Region.h" +#include "Size.h" #include "XmlLabelCreator.h" #include "XmlLabelParser.h" @@ -1370,11 +1372,11 @@ namespace glabels } else if ( mimeData->hasImage() ) { - // TODO: return true + return true; } else if ( mimeData->hasText() ) { - // TODO: return true + return true; } return false; } @@ -1390,6 +1392,7 @@ namespace glabels if ( mimeData->hasFormat( MIME_TYPE ) ) { + // Native objects QByteArray buffer = mimeData->data( MIME_TYPE ); QList objects = XmlLabelParser::deserializeObjects( buffer ); @@ -1402,11 +1405,18 @@ namespace glabels } else if ( mimeData->hasImage() ) { + // Create object from clipboard image // TODO: create an image object from image } else if ( mimeData->hasText() ) { - // TODO: create a text object from text + // Create object from clipboard text + LabelModelTextObject* object = new LabelModelTextObject(); + object->setText( mimeData->text() ); + object->setSize( object->naturalSize() ); + object->setPosition( (w()-object->w())/2.0, (h()-object->h())/2.0 ); + addObject( object ); + selectObject( object ); } } diff --git a/glabels/LabelModelImageObject.cpp b/glabels/LabelModelImageObject.cpp index b3fbf4e..6d82415 100644 --- a/glabels/LabelModelImageObject.cpp +++ b/glabels/LabelModelImageObject.cpp @@ -120,9 +120,9 @@ namespace glabels /// - /// Image originalSize Property Getter (assumes 72 DPI, i.e. 1pixel == 1pt) + /// naturalSize Property Getter (assumes 72 DPI, i.e. 1pixel == 1pt) /// - Size LabelModelImageObject::originalSize() const + Size LabelModelImageObject::naturalSize() const { Size size( Distance::pt(72), Distance::pt(72) ); diff --git a/glabels/LabelModelImageObject.h b/glabels/LabelModelImageObject.h index c8a9bc2..bdd1ceb 100644 --- a/glabels/LabelModelImageObject.h +++ b/glabels/LabelModelImageObject.h @@ -63,9 +63,9 @@ namespace glabels virtual void setFilenameNode( const TextNode& value ); // - // Image Property: originalSize + // Property: naturalSize // - virtual Size originalSize() const; + virtual Size naturalSize() const; /////////////////////////////////////////////////////////////// diff --git a/glabels/LabelModelObject.cpp b/glabels/LabelModelObject.cpp index 33510a5..0a624e9 100644 --- a/glabels/LabelModelObject.cpp +++ b/glabels/LabelModelObject.cpp @@ -370,6 +370,16 @@ namespace glabels } + /// + /// Virtual Natural Size Property Default Getter + /// (Overridden by concrete class) + /// + Size LabelModelObject::naturalSize() const + { + return Size( Distance::pt(0), Distance::pt(0) ); + } + + /// /// Virtual Text Property Default Getter /// (Overridden by concrete class) @@ -590,16 +600,6 @@ namespace glabels } - /// - /// Virtual Original Size Property Default Getter - /// (Overridden by concrete class) - /// - Size LabelModelObject::originalSize() const - { - return Size( Distance::pt(0), Distance::pt(0) ); - } - - /// /// Virtual Line Width Property Default Getter /// (Overridden by concrete class) diff --git a/glabels/LabelModelObject.h b/glabels/LabelModelObject.h index edcbd56..483537c 100644 --- a/glabels/LabelModelObject.h +++ b/glabels/LabelModelObject.h @@ -163,6 +163,12 @@ namespace glabels void setShadowColorNode( const ColorNode& value ); + // + // Natural Size Property (read-only) + // + virtual Size naturalSize() const; + + /////////////////////////////////////////////////////////////// // Text Properties Virtual Interface /////////////////////////////////////////////////////////////// @@ -247,11 +253,6 @@ namespace glabels virtual TextNode filenameNode() const; virtual void setFilenameNode( const TextNode &value ); - // - // Virtual Image Property: originalSize (read-only) - // - virtual Size originalSize() const; - /////////////////////////////////////////////////////////////// // Shape Properties Virtual Interface diff --git a/glabels/LabelModelTextObject.cpp b/glabels/LabelModelTextObject.cpp index 335236c..4d8be65 100644 --- a/glabels/LabelModelTextObject.cpp +++ b/glabels/LabelModelTextObject.cpp @@ -28,6 +28,8 @@ #include #include +#include "Size.h" + namespace glabels { @@ -86,6 +88,8 @@ namespace glabels mTextHAlign = object->mTextHAlign; mTextVAlign = object->mTextVAlign; mTextLineSpacing = object->mTextLineSpacing; + + update(); // Initialize cached editor layouts } @@ -343,6 +347,55 @@ namespace glabels } + /// + /// NaturalSize Property Getter + /// + Size LabelModelTextObject::naturalSize() const + { + QFont font; + font.setFamily( mFontFamily ); + font.setPointSizeF( mFontSize ); + font.setWeight( mFontWeight ); + font.setItalic( mFontItalicFlag ); + font.setUnderline( mFontUnderlineFlag ); + + QTextOption textOption; + textOption.setAlignment( mTextHAlign ); + textOption.setWrapMode( QTextOption::WordWrap ); + + QFontMetricsF fontMetrics( font ); + double dy = fontMetrics.lineSpacing() * mTextLineSpacing; + + QString displayText = mText.isEmpty() ? tr("Text") : mText; + QTextDocument document( displayText ); + + // Do layouts + double x = 0; + double y = 0; + QRectF boundingRect; + for ( int i = 0; i < document.blockCount(); i++ ) + { + QTextLayout* layout = new QTextLayout( document.findBlockByNumber(i).text() ); + + layout->setFont( font ); + layout->setTextOption( textOption ); + layout->setCacheEnabled(true); + + layout->beginLayout(); + for ( QTextLine l = layout->createLine(); l.isValid(); l = layout->createLine() ) + { + l.setPosition( QPointF( x, y ) ); + y += dy; + } + layout->endLayout(); + + boundingRect = layout->boundingRect().united( boundingRect ); + } + + return Size( boundingRect.width() + 2*marginPts, boundingRect.height() + 2*marginPts ); + } + + /// /// Can Text Capability Implementation /// diff --git a/glabels/LabelModelTextObject.h b/glabels/LabelModelTextObject.h index cb39974..da1d702 100644 --- a/glabels/LabelModelTextObject.h +++ b/glabels/LabelModelTextObject.h @@ -126,6 +126,12 @@ namespace glabels virtual void setTextLineSpacing( double value ); + // + // Property: naturalSize + // + virtual Size naturalSize() const; + + /////////////////////////////////////////////////////////////// // Capability Implementations /////////////////////////////////////////////////////////////// diff --git a/glabels/ObjectEditor.cpp b/glabels/ObjectEditor.cpp index b44189b..4794984 100644 --- a/glabels/ObjectEditor.cpp +++ b/glabels/ObjectEditor.cpp @@ -186,7 +186,7 @@ namespace glabels sizeWSpin->setValue( mObject->w().inUnits(mUnits) ); sizeHSpin->setValue( mObject->h().inUnits(mUnits) ); - Size originalSize = mObject->originalSize(); + Size originalSize = mObject->naturalSize(); QString originalSizeString = QString( "%1: %2 x %3 %4" ) .arg( tr("Original size") ) .arg( originalSize.w().inUnits(mUnits), 0, 'f', mSpinDigits ) @@ -662,7 +662,7 @@ namespace glabels void ObjectEditor::onResetImageSize() { - mObject->setSize( mObject->originalSize() ); + mObject->setSize( mObject->naturalSize() ); }