okular/conf/editannottooldialog.cpp
Dileep Sankhla e44ff38706 Support setting text color for typewriter annotations
Summary:
Changing typewriter text color can be done in the typewriter properties dialog, or programmatically via new okular API methods TextAnnotation::textColor and TextAnnotation::setTextColor.

poppler >= 0.69 is required to store text color natively inside PDF documents. For other document types, text color is stored as metadata inside the document archive.

This work was done during GSoC 2018. See https://community.kde.org/GSoC/2018/StatusReports/DileepSankhla for details.

Test Plan:
- properties dialog of typewriter annotation has "Font Color" picker
- saving to PDF results in <r> <g> <b> rg operation in /DA
- saving to archive results in fontColor="rrggbb" attribute in metadata.xml

Reviewers: sander

Reviewed By: sander

Subscribers: kde-doc-english, sander, okular-devel

Tags: #okular, #documentation

Differential Revision: https://phabricator.kde.org/D15205
2018-10-04 20:02:55 +02:00

539 lines
24 KiB
C++

/***************************************************************************
* Copyright (C) 2012 by Fabio D'Urso <fabiodurso@hotmail.it> *
* Copyright (C) 2015 by Laurent Montel <montel@kde.org> *
* *
* This program is free software; you can redistribute it and/or modify *
* it under the terms of the GNU General Public License as published by *
* the Free Software Foundation; either version 2 of the License, or *
* (at your option) any later version. *
***************************************************************************/
#include "editannottooldialog.h"
#include <kcolorbutton.h>
#include <kcombobox.h>
#include <klocalizedstring.h>
#include <klineedit.h>
#include <QApplication>
#include <QHBoxLayout>
#include <QVBoxLayout>
#include <QGroupBox>
#include <QLabel>
#include <QListWidget>
#include <QListWidgetItem>
#include <QPushButton>
#include <QStackedWidget>
#include <QDomDocument>
#include <QDomElement>
#include <KConfigGroup>
#include <QDialogButtonBox>
#include "core/annotations.h"
#include "ui/annotationwidgets.h"
#include "ui/pageviewannotator.h"
EditAnnotToolDialog::EditAnnotToolDialog( QWidget *parent, const QDomElement &initialState )
: QDialog( parent ), m_stubann( nullptr ), m_annotationWidget( nullptr )
{
QDialogButtonBox *buttonBox = new QDialogButtonBox(QDialogButtonBox::Ok|QDialogButtonBox::Cancel);
QVBoxLayout *mainLayout = new QVBoxLayout;
setLayout(mainLayout);
QPushButton *okButton = buttonBox->button(QDialogButtonBox::Ok);
okButton->setDefault(true);
okButton->setShortcut(Qt::CTRL | Qt::Key_Return);
connect(buttonBox, &QDialogButtonBox::accepted, this, &EditAnnotToolDialog::accept);
connect(buttonBox, &QDialogButtonBox::rejected, this, &EditAnnotToolDialog::reject);
okButton->setDefault(true);
QLabel * tmplabel;
QWidget *widget = new QWidget( this );
QGridLayout * widgetLayout = new QGridLayout( widget );
mainLayout->addWidget(widget);
mainLayout->addWidget(buttonBox);
m_name = new KLineEdit( widget );
mainLayout->addWidget(m_name);
tmplabel = new QLabel( i18n( "&Name:" ), widget );
mainLayout->addWidget(tmplabel);
tmplabel->setBuddy( m_name );
widgetLayout->addWidget( tmplabel, 0, 0, Qt::AlignRight );
widgetLayout->addWidget( m_name, 0, 1 );
m_type = new KComboBox( false, widget );
mainLayout->addWidget(m_type);
connect(m_type, static_cast<void (KComboBox::*)(int)>(&KComboBox::currentIndexChanged), this, &EditAnnotToolDialog::slotTypeChanged);
tmplabel = new QLabel( i18n( "&Type:" ), widget );
mainLayout->addWidget(tmplabel);
tmplabel->setBuddy( m_type );
widgetLayout->addWidget( tmplabel, 1, 0, Qt::AlignRight );
widgetLayout->addWidget( m_type, 1, 1 );
m_toolIcon = new QLabel( widget );
mainLayout->addWidget(m_toolIcon);
m_toolIcon->setAlignment( Qt::AlignRight | Qt::AlignTop );
m_toolIcon->setMinimumSize( 40, 32 );
widgetLayout->addWidget( m_toolIcon, 0, 2, 2, 1 );
m_appearanceBox = new QGroupBox( i18n( "Appearance" ), widget );
mainLayout->addWidget(m_appearanceBox);
m_appearanceBox->setLayout( new QVBoxLayout( m_appearanceBox ) );
widgetLayout->addWidget( m_appearanceBox, 2, 0, 1, 3 );
// Populate combobox with annotation types
m_type->addItem( i18n("Pop-up Note"), qVariantFromValue( ToolNoteLinked ) );
m_type->addItem( i18n("Inline Note"), qVariantFromValue( ToolNoteInline ) );
m_type->addItem( i18n("Freehand Line"), qVariantFromValue( ToolInk ) );
m_type->addItem( i18n("Straight Line"), qVariantFromValue( ToolStraightLine ) );
m_type->addItem( i18n("Polygon"), qVariantFromValue( ToolPolygon ) );
m_type->addItem( i18n("Text markup"), qVariantFromValue( ToolTextMarkup ) );
m_type->addItem( i18n("Geometrical shape"), qVariantFromValue( ToolGeometricalShape ) );
m_type->addItem( i18n("Stamp"), qVariantFromValue( ToolStamp ) );
m_type->addItem( i18n("Typewriter"), qVariantFromValue( ToolTypewriter ) );
createStubAnnotation();
if ( initialState.isNull() )
{
setWindowTitle( i18n("Create annotation tool") );
}
else
{
setWindowTitle( i18n("Edit annotation tool") );
loadTool( initialState );
}
rebuildAppearanceBox();
updateDefaultNameAndIcon();
}
EditAnnotToolDialog::~EditAnnotToolDialog()
{
delete m_annotationWidget;
}
QString EditAnnotToolDialog::name() const
{
return m_name->text();
}
QDomDocument EditAnnotToolDialog::toolXml() const
{
const ToolType toolType = m_type->itemData( m_type->currentIndex() ).value<ToolType>();
QDomDocument doc;
QDomElement toolElement = doc.createElement( QStringLiteral("tool") );
QDomElement engineElement = doc.createElement( QStringLiteral("engine") );
QDomElement annotationElement = doc.createElement( QStringLiteral("annotation") );
doc.appendChild( toolElement );
toolElement.appendChild( engineElement );
engineElement.appendChild( annotationElement );
const QString color = m_stubann->style().color().name( QColor::HexArgb );
const QString textColor = static_cast< Okular::TextAnnotation * >( m_stubann )->textColor().name();
const QString opacity = QString::number( m_stubann->style().opacity() );
const QString width = QString::number( m_stubann->style().width() );
if ( toolType == ToolNoteLinked )
{
Okular::TextAnnotation * ta = static_cast<Okular::TextAnnotation*>( m_stubann );
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("note-linked") );
engineElement.setAttribute( QStringLiteral("type"), QStringLiteral("PickPoint") );
engineElement.setAttribute( QStringLiteral("color"), color );
engineElement.setAttribute( QStringLiteral("hoverIcon"), QStringLiteral("tool-note") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("Text") );
annotationElement.setAttribute( QStringLiteral("color"), color );
annotationElement.setAttribute( QStringLiteral("icon"), ta->textIcon() );
}
else if ( toolType == ToolNoteInline )
{
Okular::TextAnnotation * ta = static_cast<Okular::TextAnnotation*>( m_stubann );
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("note-inline") );
engineElement.setAttribute( QStringLiteral("type"), QStringLiteral("PickPoint") );
engineElement.setAttribute( QStringLiteral("color"), color );
engineElement.setAttribute( QStringLiteral("hoverIcon"), QStringLiteral("tool-note-inline") );
engineElement.setAttribute( QStringLiteral("block"), QStringLiteral("true") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("FreeText") );
annotationElement.setAttribute( QStringLiteral("color"), color );
annotationElement.setAttribute( QStringLiteral("width"), width );
if ( ta->inplaceAlignment() != 0 )
annotationElement.setAttribute( QStringLiteral("align"), ta->inplaceAlignment() );
if ( ta->textFont() != QApplication::font() )
annotationElement.setAttribute( QStringLiteral("font"), ta->textFont().toString() );
}
else if ( toolType == ToolInk )
{
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("ink") );
engineElement.setAttribute( QStringLiteral("type"), QStringLiteral("SmoothLine") );
engineElement.setAttribute( QStringLiteral("color"), color );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("Ink") );
annotationElement.setAttribute( QStringLiteral("color"), color );
annotationElement.setAttribute( QStringLiteral("width"), width );
}
else if ( toolType == ToolStraightLine )
{
Okular::LineAnnotation * la = static_cast<Okular::LineAnnotation*>( m_stubann );
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("straight-line") );
engineElement.setAttribute( QStringLiteral("type"), QStringLiteral("PolyLine") );
engineElement.setAttribute( QStringLiteral("color"), color );
engineElement.setAttribute( QStringLiteral("points"), QStringLiteral("2") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("Line") );
annotationElement.setAttribute( QStringLiteral("color"), color );
annotationElement.setAttribute( QStringLiteral("width"), width );
if ( la->lineLeadingForwardPoint() != 0 || la->lineLeadingBackwardPoint() != 0 )
{
annotationElement.setAttribute( QStringLiteral("leadFwd"), QString::number( la->lineLeadingForwardPoint() ) );
annotationElement.setAttribute( QStringLiteral("leadBack"), QString::number( la->lineLeadingBackwardPoint() ) );
}
}
else if ( toolType == ToolPolygon )
{
Okular::LineAnnotation * la = static_cast<Okular::LineAnnotation*>( m_stubann );
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("polygon") );
engineElement.setAttribute( QStringLiteral("type"), QStringLiteral("PolyLine") );
engineElement.setAttribute( QStringLiteral("color"), color );
engineElement.setAttribute( QStringLiteral("points"), QStringLiteral("-1") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("Line") );
annotationElement.setAttribute( QStringLiteral("color"), color );
annotationElement.setAttribute( QStringLiteral("width"), width );
if ( la->lineInnerColor().isValid() )
{
annotationElement.setAttribute( QStringLiteral("innerColor"), la->lineInnerColor().name() );
}
}
else if ( toolType == ToolTextMarkup )
{
Okular::HighlightAnnotation * ha = static_cast<Okular::HighlightAnnotation*>( m_stubann );
switch ( ha->highlightType() )
{
case Okular::HighlightAnnotation::Highlight:
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("highlight") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("Highlight") );
break;
case Okular::HighlightAnnotation::Squiggly:
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("squiggly") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("Squiggly") );
break;
case Okular::HighlightAnnotation::Underline:
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("underline") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("Underline") );
break;
case Okular::HighlightAnnotation::StrikeOut:
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("strikeout") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("StrikeOut") );
break;
}
engineElement.setAttribute( QStringLiteral("type"), QStringLiteral("TextSelector") );
engineElement.setAttribute( QStringLiteral("color"), color );
annotationElement.setAttribute( QStringLiteral("color"), color );
}
else if ( toolType == ToolGeometricalShape )
{
Okular::GeomAnnotation * ga = static_cast<Okular::GeomAnnotation*>( m_stubann );
if ( ga->geometricalType() == Okular::GeomAnnotation::InscribedCircle )
{
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("ellipse") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("GeomCircle") );
}
else
{
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("rectangle") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("GeomSquare") );
}
engineElement.setAttribute( QStringLiteral("type"), QStringLiteral("PickPoint") );
engineElement.setAttribute( QStringLiteral("color"), color );
engineElement.setAttribute( QStringLiteral("block"), QStringLiteral("true") );
annotationElement.setAttribute( QStringLiteral("color"), color );
annotationElement.setAttribute( QStringLiteral("width"), width );
if ( ga->geometricalInnerColor().isValid() )
annotationElement.setAttribute( QStringLiteral("innerColor"), ga->geometricalInnerColor().name() );
}
else if ( toolType == ToolStamp )
{
Okular::StampAnnotation * sa = static_cast<Okular::StampAnnotation*>( m_stubann );
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("stamp") );
engineElement.setAttribute( QStringLiteral("type"), QStringLiteral("PickPoint") );
engineElement.setAttribute( QStringLiteral("hoverIcon"), sa->stampIconName() );
engineElement.setAttribute( QStringLiteral("size"), QStringLiteral("64") );
engineElement.setAttribute( QStringLiteral("block"), QStringLiteral("true") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("Stamp") );
annotationElement.setAttribute( QStringLiteral("icon"), sa->stampIconName() );
}
else if ( toolType == ToolTypewriter )
{
Okular::TextAnnotation * ta = static_cast<Okular::TextAnnotation*>( m_stubann );
toolElement.setAttribute( QStringLiteral("type"), QStringLiteral("typewriter") );
engineElement.setAttribute( QStringLiteral("type"), QStringLiteral("PickPoint") );
engineElement.setAttribute( QStringLiteral("block"), QStringLiteral("true") );
annotationElement.setAttribute( QStringLiteral("type"), QStringLiteral("Typewriter") );
annotationElement.setAttribute( QStringLiteral("color"), color );
annotationElement.setAttribute( QStringLiteral("textColor"), textColor );
annotationElement.setAttribute( QStringLiteral("width"), width );
if ( ta->textFont() != QApplication::font() )
annotationElement.setAttribute( QStringLiteral("font"), ta->textFont().toString() );
}
if ( opacity != QStringLiteral("1") )
annotationElement.setAttribute( QStringLiteral("opacity"), opacity );
return doc;
}
void EditAnnotToolDialog::createStubAnnotation()
{
const ToolType toolType = m_type->itemData( m_type->currentIndex() ).value<ToolType>();
// Delete previous stub annotation, if any
delete m_stubann;
// Create stub annotation
if ( toolType == ToolNoteLinked )
{
Okular::TextAnnotation * ta = new Okular::TextAnnotation();
ta->setTextType( Okular::TextAnnotation::Linked );
ta->setTextIcon( QStringLiteral("Note") );
ta->style().setColor( Qt::yellow );
m_stubann = ta;
}
else if ( toolType == ToolNoteInline )
{
Okular::TextAnnotation * ta = new Okular::TextAnnotation();
ta->setTextType( Okular::TextAnnotation::InPlace );
ta->style().setWidth( 1.0 );
ta->style().setColor( Qt::yellow );
m_stubann = ta;
}
else if ( toolType == ToolInk )
{
m_stubann = new Okular::InkAnnotation();
m_stubann->style().setWidth( 2.0 );
m_stubann->style().setColor( Qt::green );
}
else if ( toolType == ToolStraightLine )
{
Okular::LineAnnotation * la = new Okular::LineAnnotation();
la->setLinePoints( QLinkedList<Okular::NormalizedPoint>() <<
Okular::NormalizedPoint(0,0) <<
Okular::NormalizedPoint(1,0) );
la->style().setColor( QColor( 0xff, 0xe0, 0x00 ) );
m_stubann = la;
}
else if ( toolType == ToolPolygon )
{
Okular::LineAnnotation * la = new Okular::LineAnnotation();
la->setLinePoints( QLinkedList<Okular::NormalizedPoint>() <<
Okular::NormalizedPoint(0,0) <<
Okular::NormalizedPoint(1,0) <<
Okular::NormalizedPoint(1,1) );
la->setLineClosed( true );
la->style().setColor( QColor( 0x00, 0x7e, 0xee ) );
m_stubann = la;
}
else if ( toolType == ToolTextMarkup )
{
m_stubann = new Okular::HighlightAnnotation();
m_stubann->style().setColor( Qt::yellow );
}
else if ( toolType == ToolGeometricalShape )
{
Okular::GeomAnnotation * ga = new Okular::GeomAnnotation();
ga->setGeometricalType( Okular::GeomAnnotation::InscribedCircle );
ga->style().setWidth( 5.0 );
ga->style().setColor( Qt::cyan );
m_stubann = ga;
}
else if ( toolType == ToolStamp )
{
Okular::StampAnnotation * sa = new Okular::StampAnnotation();
sa->setStampIconName( QStringLiteral("okular") );
m_stubann = sa;
}
else if ( toolType == ToolTypewriter )
{
Okular::TextAnnotation * ta = new Okular::TextAnnotation();
ta->setTextType( Okular::TextAnnotation::InPlace );
ta->setInplaceIntent( Okular::TextAnnotation::TypeWriter );
ta->style().setWidth( 0.0 );
ta->style().setColor( QColor(255,255,255,0) );
ta->setTextColor( Qt::black );
m_stubann = ta;
}
}
void EditAnnotToolDialog::rebuildAppearanceBox()
{
// Remove previous widget (if any)
if ( m_annotationWidget )
{
delete m_annotationWidget->appearanceWidget();
delete m_annotationWidget;
}
m_annotationWidget = AnnotationWidgetFactory::widgetFor( m_stubann );
m_appearanceBox->layout()->addWidget( m_annotationWidget->appearanceWidget() );
connect(m_annotationWidget, &AnnotationWidget::dataChanged, this, &EditAnnotToolDialog::slotDataChanged);
}
void EditAnnotToolDialog::updateDefaultNameAndIcon()
{
QDomDocument doc = toolXml();
QDomElement toolElement = doc.documentElement();
m_name->setPlaceholderText( PageViewAnnotator::defaultToolName( toolElement ) );
m_toolIcon->setPixmap( PageViewAnnotator::makeToolPixmap( toolElement ) );
}
void EditAnnotToolDialog::setToolType( ToolType newType )
{
int idx = -1;
for ( int i = 0; idx == -1 && i < m_type->count(); ++i )
{
if ( m_type->itemData( i ).value<ToolType>() == newType )
idx = i;
}
// The following call also results in createStubAnnotation being called
m_type->setCurrentIndex( idx );
}
void EditAnnotToolDialog::loadTool( const QDomElement &toolElement )
{
const QDomElement engineElement = toolElement.elementsByTagName( QStringLiteral("engine") ).item( 0 ).toElement();
const QDomElement annotationElement = engineElement.elementsByTagName( QStringLiteral("annotation") ).item( 0 ).toElement();
const QString annotType = toolElement.attribute( QStringLiteral("type") );
if ( annotType == QLatin1String("ellipse") )
{
setToolType( ToolGeometricalShape );
Okular::GeomAnnotation * ga = static_cast<Okular::GeomAnnotation*>( m_stubann );
ga->setGeometricalType( Okular::GeomAnnotation::InscribedCircle );
if ( annotationElement.hasAttribute( QStringLiteral("innerColor") ) )
ga->setGeometricalInnerColor( QColor( annotationElement.attribute( QStringLiteral("innerColor") ) ) );
}
else if ( annotType == QLatin1String("highlight") )
{
setToolType( ToolTextMarkup );
Okular::HighlightAnnotation * ha = static_cast<Okular::HighlightAnnotation*>( m_stubann );
ha->setHighlightType( Okular::HighlightAnnotation::Highlight );
}
else if ( annotType == QLatin1String("ink") )
{
setToolType( ToolInk );
}
else if ( annotType == QLatin1String("note-inline") )
{
setToolType( ToolNoteInline );
Okular::TextAnnotation * ta = static_cast<Okular::TextAnnotation*>( m_stubann );
if ( annotationElement.hasAttribute( QStringLiteral("align") ) )
ta->setInplaceAlignment( annotationElement.attribute( QStringLiteral("align") ).toInt() );
if ( annotationElement.hasAttribute( QStringLiteral("font") ) )
{
QFont f;
f.fromString( annotationElement.attribute( QStringLiteral("font") ) );
ta->setTextFont( f );
}
}
else if ( annotType == QLatin1String("note-linked") )
{
setToolType( ToolNoteLinked );
Okular::TextAnnotation * ta = static_cast<Okular::TextAnnotation*>( m_stubann );
ta->setTextIcon( annotationElement.attribute( QStringLiteral("icon") ) );
}
else if ( annotType == QLatin1String("polygon") )
{
setToolType( ToolPolygon );
Okular::LineAnnotation * la = static_cast<Okular::LineAnnotation*>( m_stubann );
if ( annotationElement.hasAttribute( QStringLiteral("innerColor") ) )
la->setLineInnerColor( QColor( annotationElement.attribute( QStringLiteral("innerColor") ) ) );
}
else if ( annotType == QLatin1String("rectangle") )
{
setToolType( ToolGeometricalShape );
Okular::GeomAnnotation * ga = static_cast<Okular::GeomAnnotation*>( m_stubann );
ga->setGeometricalType( Okular::GeomAnnotation::InscribedSquare );
if ( annotationElement.hasAttribute( QStringLiteral("innerColor") ) )
ga->setGeometricalInnerColor( QColor( annotationElement.attribute( QStringLiteral("innerColor") ) ) );
}
else if ( annotType == QLatin1String("squiggly") )
{
setToolType( ToolTextMarkup );
Okular::HighlightAnnotation * ha = static_cast<Okular::HighlightAnnotation*>( m_stubann );
ha->setHighlightType( Okular::HighlightAnnotation::Squiggly );
}
else if ( annotType == QLatin1String("stamp") )
{
setToolType( ToolStamp );
Okular::StampAnnotation * sa = static_cast<Okular::StampAnnotation*>( m_stubann );
sa->setStampIconName( annotationElement.attribute( QStringLiteral("icon") ) );
}
else if ( annotType == QLatin1String("straight-line") )
{
setToolType( ToolStraightLine );
Okular::LineAnnotation * la = static_cast<Okular::LineAnnotation*>( m_stubann );
if ( annotationElement.hasAttribute( QStringLiteral("leadFwd") ) )
la->setLineLeadingForwardPoint( annotationElement.attribute( QStringLiteral("leadFwd") ).toDouble() );
if ( annotationElement.hasAttribute( QStringLiteral("leadBack") ) )
la->setLineLeadingBackwardPoint( annotationElement.attribute( QStringLiteral("leadBack") ).toDouble() );
}
else if ( annotType == QLatin1String("strikeout") )
{
setToolType( ToolTextMarkup );
Okular::HighlightAnnotation * ha = static_cast<Okular::HighlightAnnotation*>( m_stubann );
ha->setHighlightType( Okular::HighlightAnnotation::StrikeOut );
}
else if ( annotType == QLatin1String("underline") )
{
setToolType( ToolTextMarkup );
Okular::HighlightAnnotation * ha = static_cast<Okular::HighlightAnnotation*>( m_stubann );
ha->setHighlightType( Okular::HighlightAnnotation::Underline );
}
else if ( annotType == QLatin1String("typewriter") )
{
setToolType( ToolTypewriter );
Okular::TextAnnotation * ta = static_cast<Okular::TextAnnotation*>( m_stubann );
if ( annotationElement.hasAttribute( QStringLiteral("font") ) )
{
QFont f;
f.fromString( annotationElement.attribute( QStringLiteral("font") ) );
ta->setTextFont( f );
}
if ( annotationElement.hasAttribute( QStringLiteral("textColor") ) )
ta->setTextColor( QColor( annotationElement.attribute( QStringLiteral("textColor") ) ) );
}
// Common properties
if ( annotationElement.hasAttribute( QStringLiteral("color") ) )
m_stubann->style().setColor( QColor( annotationElement.attribute( QStringLiteral("color") ) ) );
if ( annotationElement.hasAttribute( QStringLiteral("opacity") ) )
m_stubann->style().setOpacity( annotationElement.attribute( QStringLiteral("opacity") ).toDouble() );
if ( annotationElement.hasAttribute( QStringLiteral("width") ) )
m_stubann->style().setWidth( annotationElement.attribute( QStringLiteral("width") ).toDouble() );
if ( toolElement.hasAttribute( QStringLiteral("name") ) )
m_name->setText( toolElement.attribute( QStringLiteral("name") ) );
}
void EditAnnotToolDialog::slotTypeChanged()
{
createStubAnnotation();
rebuildAppearanceBox();
updateDefaultNameAndIcon();
}
void EditAnnotToolDialog::slotDataChanged()
{
// Mirror changes back in the stub annotation
m_annotationWidget->applyChanges();
updateDefaultNameAndIcon();
}