diff --git a/conf/editannottooldialog.cpp b/conf/editannottooldialog.cpp --- a/conf/editannottooldialog.cpp +++ b/conf/editannottooldialog.cpp @@ -31,8 +31,44 @@ #include "core/annotations.h" #include "ui/annotationwidgets.h" +#include "ui/guiutils.h" #include "ui/pageviewannotator.h" +namespace { + GuiUtils::ToolType toolTypeToGuiUtilsToolType(EditAnnotToolDialog::ToolType toolType) { + switch (toolType) { + case EditAnnotToolDialog::ToolNoteLinked: + return GuiUtils::ToolNoteLinked; + break; + case EditAnnotToolDialog::ToolNoteInline: + return GuiUtils::ToolNoteInline; + break; + case EditAnnotToolDialog::ToolInk: + return GuiUtils::ToolInk; + break; + case EditAnnotToolDialog::ToolStraightLine: + return GuiUtils::ToolStraightLine; + break; + case EditAnnotToolDialog::ToolPolygon: + return GuiUtils::ToolPolygon; + break; + case EditAnnotToolDialog::ToolTextMarkup: + return GuiUtils::ToolTextMarkup; + break; + case EditAnnotToolDialog::ToolGeometricalShape: + return GuiUtils::ToolGeometricalShape; + break; + case EditAnnotToolDialog::ToolStamp: + return GuiUtils::ToolStamp; + break; + case EditAnnotToolDialog::ToolTypewriter: + return GuiUtils::ToolTypewriter; + break; + } + return GuiUtils::ToolUnknown; + } +} + EditAnnotToolDialog::EditAnnotToolDialog( QWidget *parent, const QDomElement &initialState ) : QDialog( parent ), m_stubann( nullptr ), m_annotationWidget( nullptr ) @@ -124,170 +160,8 @@ QDomDocument EditAnnotToolDialog::toolXml() const { const ToolType toolType = m_type->itemData( m_type->currentIndex() ).value(); - - 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( 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( 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( 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() ) ); - } - annotationElement.setAttribute( QStringLiteral("startStyle"), QString::number( la->lineStartStyle() ) ); - annotationElement.setAttribute( QStringLiteral("endStyle"), QString::number( la->lineEndStyle() ) ); - } - else if ( toolType == ToolPolygon ) - { - Okular::LineAnnotation * la = static_cast( 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( 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( 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( 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( 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; + const GuiUtils::ToolType gToolType = toolTypeToGuiUtilsToolType(toolType); + return GuiUtils::annotationIconDescription(gToolType, m_stubann); } void EditAnnotToolDialog::createStubAnnotation() diff --git a/ui/annotationmodel.cpp b/ui/annotationmodel.cpp --- a/ui/annotationmodel.cpp +++ b/ui/annotationmodel.cpp @@ -24,6 +24,7 @@ #include "core/observer.h" #include "core/page.h" #include "ui/guiutils.h" +#include "ui/pageviewannotator.h" struct AnnItem { @@ -344,9 +345,11 @@ case Qt::DisplayRole: return GuiUtils::captionForAnnotation( item->annotation ); break; - case Qt::DecorationRole: - return QIcon::fromTheme( QStringLiteral("okular") ); + case Qt::DecorationRole: { + auto domNode = GuiUtils::annotationIconDescription(item->annotation); + return QIcon(PageViewAnnotator::makeToolPixmap(domNode.documentElement())); break; + } case Qt::ToolTipRole: return GuiUtils::prettyToolTip( item->annotation ); break; diff --git a/ui/guiutils.h b/ui/guiutils.h --- a/ui/guiutils.h +++ b/ui/guiutils.h @@ -11,6 +11,7 @@ #define OKULAR_GUIUTILS_H #include +#include class QColor; class QImage; @@ -29,6 +30,20 @@ namespace GuiUtils { + enum ToolType + { + ToolNoteLinked, + ToolNoteInline, + ToolInk, + ToolStraightLine, + ToolPolygon, + ToolTextMarkup, + ToolGeometricalShape, + ToolStamp, + ToolTypewriter, + ToolUnknown + }; + /** * Returns the translated string with the type of the given @p annotation. */ @@ -41,6 +56,10 @@ QPixmap loadStamp( const QString& name, const QSize& size, int iconSize = 0 ); + ToolType toolTypeFromAnnotation(const Okular::Annotation * annotation); + QDomDocument annotationIconDescription(const Okular::Annotation * annotation); + QDomDocument annotationIconDescription(ToolType toolType, const Okular::Annotation * annotation); + void addIconLoader( KIconLoader * loader ); void removeIconLoader( KIconLoader * loader ); KIconLoader* iconLoader(); diff --git a/ui/guiutils.cpp b/ui/guiutils.cpp --- a/ui/guiutils.cpp +++ b/ui/guiutils.cpp @@ -10,6 +10,7 @@ #include "guiutils.h" // qt/kde includes +#include #include #include #include @@ -282,4 +283,218 @@ } } +ToolType toolTypeFromAnnotation(const Okular::Annotation *annotation) +{ + switch (annotation->subType()) { + case Okular::Annotation::AText: { + auto textAnnotation = static_cast< const Okular::TextAnnotation *>( annotation ); + if (textAnnotation->textType() == Okular::TextAnnotation::Linked) { + return ToolNoteLinked; + } else if (textAnnotation->inplaceIntent() == Okular::TextAnnotation::TypeWriter) { + return ToolTypewriter; + } else { + return ToolNoteInline; + } + break; + } + case Okular::Annotation::AInk: + return ToolInk; + break; + case Okular::Annotation::ALine: { + auto lineAnnotation = static_cast< const Okular::LineAnnotation *> ( annotation ); + if (lineAnnotation->linePoints().count() == 2) { + return ToolStraightLine; + } else { + return ToolPolygon; + } + break; + } + case Okular::Annotation::AHighlight: + return ToolTextMarkup; + break; + case Okular::Annotation::AGeom: + return ToolGeometricalShape; + break; + case Okular::Annotation::AStamp: + return ToolStamp; + break; + default: + return ToolUnknown; + } + + return ToolUnknown; +} + +QDomDocument annotationIconDescription(const Okular::Annotation *annotation) +{ + return annotationIconDescription(toolTypeFromAnnotation(annotation), annotation); +} + +QDomDocument annotationIconDescription(ToolType toolType, const Okular::Annotation *annotation) +{ + 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 = annotation->style().color().name( QColor::HexArgb ); + const QString textColor = static_cast< const Okular::TextAnnotation * >( annotation )->textColor().name(); + const QString opacity = QString::number( annotation->style().opacity() ); + const QString width = QString::number( annotation->style().width() ); + + if ( toolType == ToolNoteLinked ) + { + const Okular::TextAnnotation * ta = static_cast( annotation ); + 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 ) + { + const Okular::TextAnnotation * ta = static_cast( annotation ); + 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 ) + { + const Okular::LineAnnotation * la = static_cast( annotation ); + 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() ) ); + } + annotationElement.setAttribute( QStringLiteral("startStyle"), QString::number( la->lineStartStyle() ) ); + annotationElement.setAttribute( QStringLiteral("endStyle"), QString::number( la->lineEndStyle() ) ); + } + else if ( toolType == ToolPolygon ) + { + const Okular::LineAnnotation * la = static_cast( annotation ); + 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 ) + { + const Okular::HighlightAnnotation * ha = static_cast( annotation ); + + 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 ) + { + const Okular::GeomAnnotation * ga = static_cast( annotation ); + + 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 ) + { + const Okular::StampAnnotation * sa = static_cast( annotation ); + 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 ) + { + const Okular::TextAnnotation * ta = static_cast( annotation ); + 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; +} + }