Okular

annotations.h
1/*
2 SPDX-FileCopyrightText: 2005 Enrico Ros <eros.kde@email.it>
3
4 SPDX-License-Identifier: GPL-2.0-or-later
5*/
6
7#ifndef _OKULAR_ANNOTATIONS_H_
8#define _OKULAR_ANNOTATIONS_H_
9
10#include <QDateTime>
11#include <QDomDocument>
12#include <QDomElement>
13#include <QFont>
14#include <QRect>
15#include <QString>
16
17#include "area.h"
18#include "okularcore_export.h"
19
20namespace Okular
21{
22class Action;
23class Annotation;
24class AnnotationObjectRect;
25class AnnotationPrivate;
26class Document;
27class EmbeddedFile;
28class Page;
29class PagePrivate;
30class Sound;
31class Movie;
32class TextAnnotationPrivate;
33class LineAnnotationPrivate;
34class GeomAnnotationPrivate;
35class HighlightAnnotationPrivate;
36class StampAnnotationPrivate;
37class InkAnnotationPrivate;
38class CaretAnnotationPrivate;
39class FileAttachmentAnnotationPrivate;
40class SoundAnnotationPrivate;
41class MovieAnnotationPrivate;
42class ScreenAnnotationPrivate;
43class WidgetAnnotationPrivate;
44class RichMediaAnnotationPrivate;
45
46/**
47 * @short Helper class for (recursive) annotation retrieval/storage.
48 */
49class OKULARCORE_EXPORT AnnotationUtils
50{
51public:
52 /**
53 * Restore an annotation (with revisions if needed) from the dom @p element.
54 *
55 * Returns a pointer to the complete annotation or 0 if element is invalid.
56 */
57 static Annotation *createAnnotation(const QDomElement &element);
58
59 /**
60 * Saves the @p annotation as a child of @p element taking
61 * care of saving all revisions if it has any.
62 */
63 static void storeAnnotation(const Annotation *annotation, QDomElement &element, QDomDocument &document);
64
65 /**
66 * Returns the child element with the given @p name from the direct
67 * children of @p parentNode or a null element if not found.
68 */
69 static QDomElement findChildElement(const QDomNode &parentNode, const QString &name);
70
71 /**
72 * Returns the geometry of the given @p annotation scaled by
73 * @p scaleX and @p scaleY.
74 */
75 static QRect annotationGeometry(const Annotation *annotation, double scaleX, double scaleY);
76
77 /**
78 * Returns a pixmap for a stamp symbol
79 *
80 * @p name Name of a Okular stamp symbol, icon or path to an image
81 * @p size Size of the pixmap side
82 * @p keepAspectRatio Whether to keep aspect ratio of the stamp or not
83 *
84 * @since 21.12
85 */
86 static QPixmap loadStamp(const QString &nameOrPath, int size, bool keepAspectRatio = true);
87};
88
89/**
90 * @short Annotation struct holds properties shared by all annotations.
91 *
92 * An Annotation is an object (text note, highlight, sound, popup window, ..)
93 * contained by a Page in the document.
94 */
95class OKULARCORE_EXPORT Annotation
96{
97 /// @cond PRIVATE
98 friend class AnnotationObjectRect;
99 friend class Document;
100 friend class DocumentPrivate;
101 friend class ObjectRect;
102 friend class Page;
103 friend class PagePrivate;
104 /// @endcond
105
106public:
107 /**
108 * Describes the type of annotation as defined in PDF standard.
109 */
110 enum SubType {
111 AText = 1, ///< A textual annotation
112 ALine = 2, ///< A line annotation
113 AGeom = 3, ///< A geometrical annotation
114 AHighlight = 4, ///< A highlight annotation
115 AStamp = 5, ///< A stamp annotation
116 AInk = 6, ///< An ink annotation
117 ACaret = 8, ///< A caret annotation
118 AFileAttachment = 9, ///< A file attachment annotation
119 ASound = 10, ///< A sound annotation
120 AMovie = 11, ///< A movie annotation
121 AScreen = 12, ///< A screen annotation
122 AWidget = 13, ///< A widget annotation
123 ARichMedia = 14, ///< A rich media annotation
124 A_BASE = 0 ///< The annotation base class
125 };
126
127 /**
128 * Describes additional properties of an annotation.
129 */
130 enum Flag {
131 Hidden = 1, ///< Is not shown in the document
132 FixedSize = 2, ///< Has a fixed size
133 FixedRotation = 4, ///< Has a fixed rotation
134 DenyPrint = 8, ///< Cannot be printed
135 DenyWrite = 16, ///< Cannot be changed
136 DenyDelete = 32, ///< Cannot be deleted
137 ToggleHidingOnMouse = 64, ///< Can be hidden/shown by mouse click
138 External = 128, ///< Is stored external
139 ExternallyDrawn = 256, ///< Is drawn externally (by the generator which provided it) @since 0.10 (KDE 4.4)
140 BeingMoved = 512, ///< Is being moved (mouse drag and drop). If ExternallyDrawn, the generator must not draw it @since 0.15 (KDE 4.9)
141 BeingResized = 1024 ///< Is being resized (mouse drag and drop). If ExternallyDrawn, the generator must not draw it @since 1.1.0
142 };
143
144 /**
145 * Describes possible line styles for @see ALine annotation.
146 */
148 Solid = 1, ///< A solid line
149 Dashed = 2, ///< A dashed line
150 Beveled = 4, ///< A beveled line
151 Inset = 8, ///< An inset line
152 Underline = 16 ///< An underline
153 };
154
155 /**
156 * Describes possible line effects for @see ALine annotation.
157 */
159 NoEffect = 1, ///< No effect
160 Cloudy = 2 ///< The cloudy effect
161 };
162
163 /**
164 * Describes the scope of revision information.
165 */
167 Reply = 1, ///< Belongs to a reply
168 Group = 2, ///< Belongs to a group
169 Delete = 4 ///< Belongs to a deleted paragraph
170 };
171
172 /**
173 * Describes the type of revision information.
174 */
176 None = 1, ///< Not specified
177 Marked = 2, ///< Is marked
178 Unmarked = 4, ///< Is unmarked
179 Accepted = 8, ///< Has been accepted
180 Rejected = 16, ///< Was rejected
181 Cancelled = 32, ///< Has been cancelled
182 Completed = 64 ///< Has been completed
183 };
184
185 /**
186 * Describes the type of additional actions.
187 *
188 * @since 0.16 (KDE 4.10)
189 */
191 PageOpening, ///< Performed when the page containing the annotation is opened.
192 PageClosing, ///< Performed when the page containing the annotation is closed.
193 CursorEntering, ///< Performed when the cursor enters the annotation's active area @since 1.5
194 CursorLeaving, ///< Performed when the cursor exists the annotation's active area @since 1.5
195 MousePressed, ///< Performed when the mouse button is pressed inside the annotation's active area @since 1.5
196 MouseReleased, ///< Performed when the mouse button is released inside the annotation's active area @since 1.5
197 FocusIn, ///< Performed when the annotation receives the input focus @since 1.5
198 FocusOut, ///< Performed when the annotation loses the input focus @since 1.5
199 };
200
201 /**
202 * A function to be called when the annotation is destroyed.
203 *
204 * @warning the function must *not* call any virtual function,
205 * nor subcast.
206 *
207 * @since 0.7 (KDE 4.1)
208 */
209 typedef void (*DisposeDataFunction)(const Okular::Annotation *);
210
211 /**
212 * Destroys the annotation.
213 */
214 virtual ~Annotation();
215
216 /**
217 * Sets the @p author of the annotation.
218 */
219 void setAuthor(const QString &author);
220
221 /**
222 * Returns the author of the annotation.
223 */
224 QString author() const;
225
226 /**
227 * Sets the @p contents of the annotation.
228 */
229 void setContents(const QString &contents);
230
231 /**
232 * Returns the contents of the annotation.
233 */
234 QString contents() const;
235
236 /**
237 * Sets the unique @p name of the annotation.
238 */
239 void setUniqueName(const QString &name);
240
241 /**
242 * Returns the unique name of the annotation.
243 */
244 QString uniqueName() const;
245
246 /**
247 * Sets the last modification @p date of the annotation.
248 *
249 * The date must be before or equal to QDateTime::currentDateTime()
250 */
251 void setModificationDate(const QDateTime &date);
252
253 /**
254 * Returns the last modification date of the annotation.
255 */
256 QDateTime modificationDate() const;
257
258 /**
259 * Sets the creation @p date of the annotation.
260 *
261 * The date must be before or equal to @see modificationDate()
262 */
263 void setCreationDate(const QDateTime &date);
264
265 /**
266 * Returns the creation date of the annotation.
267 */
268 QDateTime creationDate() const;
269
270 /**
271 * Sets the @p flags of the annotation.
272 * @see @ref Flag
273 */
274 void setFlags(int flags);
275
276 /**
277 * Returns the flags of the annotation.
278 * @see @ref Flag
279 */
280 int flags() const;
281
282 /**
283 * Sets the bounding @p rectangle of the annotation.
284 */
285 void setBoundingRectangle(const NormalizedRect &rectangle);
286
287 /**
288 * Returns the bounding rectangle of the annotation.
289 */
290 NormalizedRect boundingRectangle() const;
291
292 /**
293 * Returns the transformed bounding rectangle of the annotation.
294 *
295 * This rectangle must be used when showing annotations on screen
296 * to have them rotated correctly.
297 */
298 NormalizedRect transformedBoundingRectangle() const;
299
300 /**
301 * Move the annotation by the specified coordinates.
302 *
303 * @see canBeMoved()
304 */
305 void translate(const NormalizedPoint &coord);
306
307 /**
308 * Adjust the annotation by the specified coordinates.
309 * Adds coordinates of @p deltaCoord1 to annotations top left corner,
310 * and @p deltaCoord2 to the bottom right.
311 *
312 * @see canBeResized()
313 */
314 void adjust(const NormalizedPoint &deltaCoord1, const NormalizedPoint &deltaCoord2);
315
316 /**
317 * The Style class contains all information about style of the
318 * annotation.
319 */
320 class OKULARCORE_EXPORT Style
321 {
322 public:
323 /**
324 * Creates a new style.
325 */
326 Style();
327
328 /**
329 * Destroys the style.
330 */
331 ~Style();
332
333 Style(const Style &other);
334 Style &operator=(const Style &other);
335
336 /**
337 * Sets the @p color of the style.
338 */
339 void setColor(const QColor &color);
340
341 /**
342 * Returns the color of the style.
343 */
344 QColor color() const;
345
346 /**
347 * Sets the @p opacity of the style.
348 */
349 void setOpacity(double opacity);
350
351 /**
352 * Returns the opacity of the style.
353 */
354 double opacity() const;
355
356 /**
357 * Sets the @p width of the style.
358 */
359 void setWidth(double width);
360
361 /**
362 * Returns the width of the style.
363 */
364 double width() const;
365
366 /**
367 * Sets the line @p style of the style.
368 */
369 void setLineStyle(LineStyle style);
370
371 /**
372 * Returns the line style of the style.
373 */
374 LineStyle lineStyle() const;
375
376 /**
377 * Sets the x-corners of the style.
378 */
379 void setXCorners(double xCorners);
380
381 /**
382 * Returns the x-corners of the style.
383 */
384 double xCorners() const;
385
386 /**
387 * Sets the y-corners of the style.
388 */
389 void setYCorners(double yCorners);
390
391 /**
392 * Returns the y-corners of the style.
393 */
394 double yCorners() const;
395
396 /**
397 * Sets the @p marks of the style.
398 */
399 void setMarks(int marks);
400
401 /**
402 * Returns the marks of the style.
403 */
404 int marks() const;
405
406 /**
407 * Sets the @p spaces of the style.
408 */
409 void setSpaces(int spaces);
410
411 /**
412 * Returns the spaces of the style.
413 */
414 int spaces() const;
415
416 /**
417 * Sets the line @p effect of the style.
418 */
419 void setLineEffect(LineEffect effect);
420
421 /**
422 * Returns the line effect of the style.
423 */
424 LineEffect lineEffect() const;
425
426 /**
427 * Sets the effect @p intensity of the style.
428 */
429 void setEffectIntensity(double intensity);
430
431 /**
432 * Returns the effect intensity of the style.
433 */
434 double effectIntensity() const;
435
436 private:
437 class Private;
438 Private *const d;
439 };
440
441 /**
442 * Returns a reference to the style object of the annotation.
443 */
444 Style &style();
445
446 /**
447 * Returns a const reference to the style object of the annotation.
448 */
449 const Style &style() const;
450
451 /**
452 * The Window class contains all information about the popup window
453 * of the annotation that is used to edit the content and properties.
454 */
455 class OKULARCORE_EXPORT Window
456 {
457 public:
458 /**
459 * Creates a new window.
460 */
461 Window();
462
463 /**
464 * Destroys the window.
465 */
466 ~Window();
467
468 Window(const Window &other);
469 Window &operator=(const Window &other);
470
471 /**
472 * Sets the @p flags of the window.
473 */
474 void setFlags(int flags);
475
476 /**
477 * Returns the flags of the window.
478 */
479 int flags() const;
480
481 /**
482 * Sets the top-left @p point of the window.
483 */
484 void setTopLeft(const NormalizedPoint &point);
485
486 /**
487 * Returns the top-left point of the window.
488 */
489 NormalizedPoint topLeft() const;
490
491 /**
492 * Sets the @p width of the window.
493 */
494 void setWidth(int width);
495
496 /**
497 * Returns the width of the window.
498 */
499 int width() const;
500
501 /**
502 * Sets the @p height of the window.
503 */
504 void setHeight(int height);
505
506 /**
507 * Returns the height of the window.
508 */
509 int height() const;
510
511 /**
512 * Sets the @p title of the window.
513 */
514 void setTitle(const QString &title);
515
516 /**
517 * Returns the title of the window.
518 */
519 QString title() const;
520
521 /**
522 * Sets the @p summary of the window.
523 */
524 void setSummary(const QString &summary);
525
526 /**
527 * Returns the summary of the window.
528 */
529 QString summary() const;
530
531 private:
532 class Private;
533 Private *const d;
534 };
535
536 /**
537 * Returns a reference to the window object of the annotation.
538 */
539 Window &window();
540
541 /**
542 * Returns a const reference to the window object of the annotation.
543 */
544 const Window &window() const;
545
546 /**
547 * The Revision class contains all information about the revision
548 * of the annotation.
549 */
550 class OKULARCORE_EXPORT Revision
551 {
552 public:
553 /**
554 * Creates a new revision.
555 */
556 Revision();
557
558 /**
559 * Destroys the revision.
560 */
561 ~Revision();
562
563 Revision(const Revision &other);
564 Revision &operator=(const Revision &other);
565
566 /**
567 * Sets the @p annotation the revision belongs to.
568 */
569 void setAnnotation(Annotation *annotation);
570
571 /**
572 * Returns the annotation the revision belongs to.
573 */
574 Annotation *annotation() const;
575
576 /**
577 * Sets the @p scope of the revision.
578 * @see RevisionScope
579 */
580 void setScope(RevisionScope scope);
581
582 /**
583 * Returns the scope of the revision.
584 */
585 RevisionScope scope() const;
586
587 /**
588 * Sets the @p type of the revision.
589 * @see RevisionType
590 */
591 void setType(RevisionType type);
592
593 /**
594 * Returns the type of the revision.
595 */
596 RevisionType type() const;
597
598 private:
599 class Private;
600 Private *const d;
601 };
602
603 /**
604 * Returns a reference to the revision list of the annotation.
605 */
606 QList<Revision> &revisions();
607
608 /**
609 * Returns a reference to the revision list of the annotation.
610 */
611 const QList<Revision> &revisions() const;
612
613 /**
614 * Sets the "native" @p id of the annotation.
615 *
616 * This is for use of the Generator, that can optionally store an
617 * handle (a pointer, an identifier, etc) of the "native" annotation
618 * object, if any.
619 *
620 * @note Okular makes no use of this
621 *
622 * @since 0.7 (KDE 4.1)
623 */
624 void setNativeId(const QVariant &id);
625
626 /**
627 * Returns the "native" id of the annotation.
628 *
629 * @since 0.7 (KDE 4.1)
630 */
631 QVariant nativeId() const;
632
633 /**
634 * Sets a function to be called when the annotation is destroyed.
635 *
636 * @warning the function must *not* call any virtual function,
637 * nor subcast.
638 *
639 * @since 0.7 (KDE 4.1)
640 */
641 void setDisposeDataFunction(DisposeDataFunction func);
642
643 /**
644 * Returns whether the annotation can be moved.
645 *
646 * @since 0.7 (KDE 4.1)
647 */
648 bool canBeMoved() const;
649
650 /**
651 * Returns whether the annotation can be resized.
652 */
653 bool canBeResized() const;
654
655 /**
656 * Returns whether the annotation dialog should be open after creation of the annotation or not
657 *
658 * @since 0.13 (KDE 4.7)
659 */
660 bool openDialogAfterCreation() const;
661
662 /**
663 * Returns the sub type of the annotation.
664 */
665 virtual SubType subType() const = 0;
666
667 /**
668 * Stores the annotation as xml in @p document under the given parent @p node.
669 */
670 virtual void store(QDomNode &node, QDomDocument &document) const;
671
672 /**
673 * Retrieve the QDomNode representing this annotation's properties
674
675 * @since 0.17 (KDE 4.11)
676 */
677 QDomNode getAnnotationPropertiesDomNode() const;
678
679 /**
680 * Sets annotations internal properties according to the contents of @p node
681 *
682 * @since 0.17 (KDE 4.11)
683 */
684 void setAnnotationProperties(const QDomNode &node);
685
686protected:
687 /// @cond PRIVATE
688 explicit Annotation(AnnotationPrivate &dd);
689 Annotation(AnnotationPrivate &dd, const QDomNode &description);
690 Q_DECLARE_PRIVATE(Annotation)
691 AnnotationPrivate *d_ptr;
692 /// @endcond
693
694private:
695 Q_DISABLE_COPY(Annotation)
696};
697
698/**
699 * @short Native annotation interface
700 *
701 * Generators can subclass it to provide native annotation support.
702 * Generators can use Annotation::setNativeId to store per-annotation data.
703 *
704 * @since 0.15 (KDE 4.9)
705 */
706class OKULARCORE_EXPORT AnnotationProxy
707{
708public:
710 Addition, ///< Generator can create native annotations
711 Modification, ///< Generator can edit native annotations
712 Removal ///< Generator can remove native annotations
713 };
714
716
717 /**
718 * Destroys the annotation proxy.
719 */
720 virtual ~AnnotationProxy();
721
722 AnnotationProxy(const AnnotationProxy &) = delete;
723 AnnotationProxy &operator=(const AnnotationProxy &) = delete;
724
725 /**
726 * Query for the supported capabilities.
727 */
728 virtual bool supports(Capability capability) const = 0;
729
730 /**
731 * Called when a new @p annotation is added to a @p page.
732 *
733 * @note Only called if supports(Addition) == true
734 */
735 virtual void notifyAddition(Annotation *annotation, int page) = 0;
736
737 /**
738 * Called after an existing @p annotation at a given @p page is modified.
739 *
740 * Generator can call @p annotation getters to get the new values.
741 * @p appearanceChanged tells if a non-visible property was modified
742 *
743 * @note Only called if supports(Modification) == true
744 */
745 virtual void notifyModification(const Annotation *annotation, int page, bool appearanceChanged) = 0;
746
747 /**
748 * Called when an existing @p annotation at a given @p page is removed.
749 *
750 * @note Only called if supports(Removal) == true
751 */
752 virtual void notifyRemoval(Annotation *annotation, int page) = 0;
753};
754
755class OKULARCORE_EXPORT TextAnnotation : public Annotation
756{
757public:
758 /**
759 * Describes the type of the text.
760 */
761 enum TextType {
762 Linked, ///< The annotation is linked to a text
763 InPlace ///< The annotation is located next to the text
764 };
765
766 /**
767 * Describes the style of the text.
768 */
769 enum InplaceIntent {
770 Unknown, ///< Unknown style
771 Callout, ///< Callout style
772 TypeWriter ///< Type writer style
773 };
774
775 /**
776 * Creates a new text annotation.
777 */
778 TextAnnotation();
779
780 /**
781 * Creates a new text annotation from the xml @p description
782 */
783 explicit TextAnnotation(const QDomNode &description);
784
785 /**
786 * Destroys the text annotation.
787 */
788 ~TextAnnotation() override;
789
790 /**
791 * Sets the text @p type of the text annotation.
792 * @see TextType
793 */
794 void setTextType(TextType type);
795
796 /**
797 * Returns the text type of the text annotation.
798 */
799 TextType textType() const;
800
801 /**
802 * Sets the @p icon of the text annotation.
803 */
804 void setTextIcon(const QString &icon);
805
806 /**
807 * Returns the icon of the text annotation.
808 */
809 QString textIcon() const;
810
811 /**
812 * Sets the @p font of the text annotation.
813 */
814 void setTextFont(const QFont &font);
815
816 /**
817 * Returns the font of the text annotation.
818 */
819 QFont textFont() const;
820
821 /**
822 * Sets the @p color of inplace text.
823 *
824 * @since 1.6
825 */
826 void setTextColor(const QColor &color);
827
828 /**
829 * Returns the color of inplace text.
830 *
831 * @since 1.6
832 */
833 QColor textColor() const;
834
835 /**
836 * Sets the inplace @p alignment of the text annotation.
837 * 0:left, 1:center, 2:right
838 */
839 void setInplaceAlignment(int alignment);
840
841 /**
842 * Returns the inplace alignment of the text annotation.
843 * 0:left, 1:center, 2:right
844 */
845 int inplaceAlignment() const;
846
847 /**
848 * Sets the inplace callout @p point at @p index.
849 *
850 * @p index must be between 0 and 2.
851 */
852 void setInplaceCallout(const NormalizedPoint &point, int index);
853
854 /**
855 * Returns the inplace callout point for @p index.
856 *
857 * @p index must be between 0 and 2.
858 */
859 NormalizedPoint inplaceCallout(int index) const;
860
861 /**
862 * Returns the transformed (e.g. rotated) inplace callout point for @p index.
863 *
864 * @p index must be between 0 and 2.
865 */
866 NormalizedPoint transformedInplaceCallout(int index) const;
867
868 /**
869 * Returns the inplace @p intent of the text annotation.
870 * @see InplaceIntent
871 */
872 void setInplaceIntent(InplaceIntent intent);
873
874 /**
875 * Returns the inplace intent of the text annotation.
876 */
877 InplaceIntent inplaceIntent() const;
878
879 /**
880 * Returns the sub type of the text annotation.
881 */
882 SubType subType() const override;
883
884 /**
885 * Stores the text annotation as xml in @p document under the given parent @p node.
886 */
887 void store(QDomNode &node, QDomDocument &document) const override;
888
889private:
890 Q_DECLARE_PRIVATE(TextAnnotation)
891 Q_DISABLE_COPY(TextAnnotation)
892};
893
894class OKULARCORE_EXPORT LineAnnotation : public Annotation
895{
896public:
897 /**
898 * Describes the line ending style.
899 */
900 enum TermStyle {
901 Square, ///< Using a square
902 Circle, ///< Using a circle
903 Diamond, ///< Using a diamond
904 OpenArrow, ///< Using an open arrow
905 ClosedArrow, ///< Using a closed arrow
906 None, ///< No special ending style
907 Butt, ///< Using a butt ending
908 ROpenArrow, ///< Using an arrow opened at the right side
909 RClosedArrow, ///< Using an arrow closed at the right side
910 Slash ///< Using a slash
911 };
912
913 /**
914 * Describes the line intent.
915 */
916 enum LineIntent {
917 Unknown, ///< Unknown intent
918 Arrow, ///< Arrow intent
919 Dimension, ///< Dimension intent
920 PolygonCloud ///< Polygon cloud intent
921 };
922
923 /**
924 * Creates a new line annotation.
925 */
926 LineAnnotation();
927
928 /**
929 * Creates a new line annotation from the xml @p description
930 */
931 explicit LineAnnotation(const QDomNode &description);
932
933 /**
934 * Destroys the line annotation.
935 */
936 ~LineAnnotation() override;
937
938 /**
939 * Sets the normalized line @p points of the line annotation.
940 *
941 * @since 22.08
942 */
943 void setLinePoints(const QList<NormalizedPoint> &points);
944
945 /**
946 * Returns the normalized line points of the line annotation.
947 *
948 * @since 22.08
949 */
950 QList<NormalizedPoint> linePoints() const;
951
952 /**
953 * Returns the transformed (e.g. rotated) normalized line points
954 * of the line annotation.
955 *
956 * @since 22.08
957 */
958 QList<NormalizedPoint> transformedLinePoints() const;
959
960 /**
961 * Sets the line starting @p style of the line annotation.
962 * @see TermStyle
963 */
964 void setLineStartStyle(TermStyle style);
965
966 /**
967 * Returns the line starting style of the line annotation.
968 */
969 TermStyle lineStartStyle() const;
970
971 /**
972 * Sets the line ending @p style of the line annotation.
973 * @see TermStyle
974 */
975 void setLineEndStyle(TermStyle style);
976
977 /**
978 * Returns the line ending style of the line annotation.
979 */
980 TermStyle lineEndStyle() const;
981
982 /**
983 * Sets whether the line shall be @p closed.
984 */
985 void setLineClosed(bool closed);
986
987 /**
988 * Returns whether the line shall be closed.
989 */
990 bool lineClosed() const;
991
992 /**
993 * Sets the inner line @p color of the line annotation.
994 */
995 void setLineInnerColor(const QColor &color);
996
997 /**
998 * Returns the inner line color of the line annotation.
999 */
1000 QColor lineInnerColor() const;
1001
1002 /**
1003 * Sets the leading forward @p point of the line annotation.
1004 */
1005 void setLineLeadingForwardPoint(double point);
1006
1007 /**
1008 * Returns the leading forward point of the line annotation.
1009 */
1010 double lineLeadingForwardPoint() const;
1011
1012 /**
1013 * Sets the leading backward @p point of the line annotation.
1014 */
1015 void setLineLeadingBackwardPoint(double point);
1016
1017 /**
1018 * Returns the leading backward point of the line annotation.
1019 */
1020 double lineLeadingBackwardPoint() const;
1021
1022 /**
1023 * Sets whether the caption shall be @p shown.
1024 */
1025 void setShowCaption(bool shown);
1026
1027 /**
1028 * Returns whether the caption shall be shown.
1029 */
1030 bool showCaption() const;
1031
1032 /**
1033 * Sets the line @p intent of the line annotation.
1034 * @see LineIntent
1035 */
1036 void setLineIntent(LineIntent intent);
1037
1038 /**
1039 * Returns the line intent of the line annotation.
1040 */
1041 LineIntent lineIntent() const;
1042
1043 /**
1044 * Returns the sub type of the line annotation.
1045 */
1046 SubType subType() const override;
1047
1048 /**
1049 * Stores the line annotation as xml in @p document under the given parent @p node.
1050 */
1051 void store(QDomNode &node, QDomDocument &document) const override;
1052
1053private:
1054 Q_DECLARE_PRIVATE(LineAnnotation)
1055 Q_DISABLE_COPY(LineAnnotation)
1056};
1057
1058class OKULARCORE_EXPORT GeomAnnotation : public Annotation
1059{
1060public:
1061 // common enums
1062 enum GeomType {
1063 InscribedSquare, ///< Draw a square
1064 InscribedCircle ///< Draw a circle
1065 };
1066
1067 /**
1068 * Creates a new geometrical annotation.
1069 */
1070 GeomAnnotation();
1071
1072 /**
1073 * Creates a new geometrical annotation from the xml @p description
1074 */
1075 explicit GeomAnnotation(const QDomNode &description);
1076
1077 /**
1078 * Destroys the geometrical annotation.
1079 */
1080 ~GeomAnnotation() override;
1081
1082 /**
1083 * Sets the geometrical @p type of the geometrical annotation.
1084 * @see GeomType
1085 */
1086 void setGeometricalType(GeomType type);
1087
1088 /**
1089 * Returns the geometrical type of the geometrical annotation.
1090 */
1091 GeomType geometricalType() const;
1092
1093 /**
1094 * Sets the inner @p color of the geometrical annotation.
1095 */
1096 void setGeometricalInnerColor(const QColor &color);
1097
1098 /**
1099 * Returns the inner color of the geometrical annotation.
1100 */
1101 QColor geometricalInnerColor() const;
1102
1103 /**
1104 * Returns the sub type of the geometrical annotation.
1105 */
1106 SubType subType() const override;
1107
1108 /**
1109 * Stores the geometrical annotation as xml in @p document
1110 * under the given parent @p node.
1111 */
1112 void store(QDomNode &node, QDomDocument &document) const override;
1113
1114private:
1115 Q_DECLARE_PRIVATE(GeomAnnotation)
1116 Q_DISABLE_COPY(GeomAnnotation)
1117};
1118
1119class OKULARCORE_EXPORT HighlightAnnotation : public Annotation
1120{
1121public:
1122 /**
1123 * Describes the highlighting style of the annotation.
1124 */
1125 enum HighlightType {
1126 Highlight, ///< Highlights the text
1127 Squiggly, ///< Squiggles the text
1128 Underline, ///< Underlines the text
1129 StrikeOut ///< Strikes out the text
1130 };
1131
1132 /**
1133 * Creates a new highlight annotation.
1134 */
1135 HighlightAnnotation();
1136
1137 /**
1138 * Creates a new highlight annotation from the xml @p description
1139 */
1140 explicit HighlightAnnotation(const QDomNode &description);
1141
1142 /**
1143 * Destroys the highlight annotation.
1144 */
1145 ~HighlightAnnotation() override;
1146
1147 /**
1148 * Sets the @p type of the highlight annotation.
1149 * @see HighlightType
1150 */
1151 void setHighlightType(HighlightType type);
1152
1153 /**
1154 * Returns the type of the highlight annotation.
1155 */
1156 HighlightType highlightType() const;
1157
1158 /**
1159 * @short Describes a highlight quad of a text markup annotation.
1160 *
1161 * The Quad is a closed path of 4 NormalizedPoints.
1162 * Another set of 4 NormalizedPoints can be generated with transform(),
1163 * e. g. to get highlighting coordinates on a rotated PageViewItem.
1164 * Additionally, Quad stores some geometry related style attributes.
1165 *
1166 * To enable correct rendering of the annotation,
1167 * the points 0 and 1 must describe the bottom edge of the quad
1168 * (relative to the text orientation).
1169 *
1170 * @see NormalizedPoint
1171 */
1172 class OKULARCORE_EXPORT Quad
1173 {
1174 public:
1175 /**
1176 * Creates a new quad.
1177 */
1178 Quad();
1179
1180 /**
1181 * Destroys the quad.
1182 */
1183 ~Quad();
1184
1185 Quad(const Quad &other);
1186 Quad &operator=(const Quad &other);
1187
1188 /**
1189 * Sets the normalized @p point at @p index.
1190 *
1191 * @p index must be between 0 and 3.
1192 */
1193 void setPoint(const NormalizedPoint &point, int index);
1194
1195 /**
1196 * Returns the normalized point at @p index.
1197 *
1198 * @p index must be between 0 and 3.
1199 */
1200 NormalizedPoint point(int index) const;
1201
1202 /**
1203 * Returns the transformed (e.g. rotated) normalized point at @p index.
1204 *
1205 * @p index must be between 0 and 3.
1206 */
1207 NormalizedPoint transformedPoint(int index) const;
1208
1209 /**
1210 * Sets whether a cap should be used at the start.
1211 */
1212 void setCapStart(bool value);
1213
1214 /**
1215 * Returns whether a cap should be used at the start.
1216 */
1217 bool capStart() const;
1218
1219 /**
1220 * Sets whether a cap should be used at the end.
1221 */
1222 void setCapEnd(bool value);
1223
1224 /**
1225 * Returns whether a cap should be used at the end.
1226 */
1227 bool capEnd() const;
1228
1229 /**
1230 * Sets the @p width of the drawing feather.
1231 */
1232 void setFeather(double width);
1233
1234 /**
1235 * Returns the width of the drawing feather.
1236 */
1237 double feather() const;
1238
1239 /**
1240 * Transforms the quad coordinates with the transformation defined
1241 * by @p matrix.
1242 *
1243 * The transformed coordinates will be accessible with transformedPoint().
1244 * The coordinates returned by point() are not affected.
1245 */
1246 void transform(const QTransform &matrix);
1247
1248 private:
1249 class Private;
1250 Private *const d;
1251 };
1252
1253 /**
1254 * Returns a reference to the quad list of the highlight annotation.
1255 */
1256 QList<Quad> &highlightQuads();
1257
1258 /**
1259 * Returns a const reference to the quad list of the highlight annotation.
1260 * @since 20.12
1261 */
1262 const QList<Quad> &highlightQuads() const;
1263
1264 /**
1265 * Returns the sub type of the highlight annotation.
1266 */
1267 SubType subType() const override;
1268
1269 /**
1270 * Stores the highlight annotation as xml in @p document
1271 * under the given parent @p node.
1272 */
1273 void store(QDomNode &node, QDomDocument &document) const override;
1274
1275private:
1276 Q_DECLARE_PRIVATE(HighlightAnnotation)
1277 Q_DISABLE_COPY(HighlightAnnotation)
1278};
1279
1280class OKULARCORE_EXPORT StampAnnotation : public Annotation
1281{
1282public:
1283 /**
1284 * Creates a new stamp annotation.
1285 */
1286 StampAnnotation();
1287
1288 /**
1289 * Creates a new stamp annotation from the xml @p description
1290 */
1291 explicit StampAnnotation(const QDomNode &description);
1292
1293 /**
1294 * Destroys the stamp annotation.
1295 */
1296 ~StampAnnotation() override;
1297
1298 /**
1299 * Sets the @p name of the icon for the stamp annotation.
1300 */
1301 void setStampIconName(const QString &name);
1302
1303 /**
1304 * Returns the name of the icon.
1305 */
1306 QString stampIconName() const;
1307
1308 /**
1309 * Returns the sub type of the stamp annotation.
1310 */
1311 SubType subType() const override;
1312
1313 /**
1314 * Stores the stamp annotation as xml in @p document
1315 * under the given parent @p node.
1316 */
1317 void store(QDomNode &node, QDomDocument &document) const override;
1318
1319private:
1320 Q_DECLARE_PRIVATE(StampAnnotation)
1321 Q_DISABLE_COPY(StampAnnotation)
1322};
1323
1324class OKULARCORE_EXPORT InkAnnotation : public Annotation
1325{
1326public:
1327 /**
1328 * Creates a new ink annotation.
1329 */
1330 InkAnnotation();
1331
1332 /**
1333 * Creates a new ink annotation from the xml @p description
1334 */
1335 explicit InkAnnotation(const QDomNode &description);
1336
1337 /**
1338 * Destroys the ink annotation.
1339 */
1340 ~InkAnnotation() override;
1341
1342 /**
1343 * Sets the @p paths of points for the ink annotation.
1344 *
1345 * @since 22.08
1346 */
1347 void setInkPaths(const QList<QList<NormalizedPoint>> &paths);
1348
1349 /**
1350 * Returns the paths of points of the ink annotation.
1351 *
1352 * @since 22.08
1353 */
1354 QList<QList<NormalizedPoint>> inkPaths() const;
1355
1356 /**
1357 * Returns the paths of transformed (e.g. rotated) points of
1358 * the ink annotation.
1359 *
1360 * @since 22.08
1361 */
1362 QList<QList<NormalizedPoint>> transformedInkPaths() const;
1363
1364 /**
1365 * Returns the sub type of the ink annotation.
1366 */
1367 SubType subType() const override;
1368
1369 /**
1370 * Stores the ink annotation as xml in @p document
1371 * under the given parent @p node.
1372 */
1373 void store(QDomNode &node, QDomDocument &document) const override;
1374
1375private:
1376 Q_DECLARE_PRIVATE(InkAnnotation)
1377 Q_DISABLE_COPY(InkAnnotation)
1378};
1379
1380class OKULARCORE_EXPORT CaretAnnotation : public Annotation
1381{
1382public:
1383 /**
1384 * Describes the highlighting style of the annotation.
1385 */
1386 enum CaretSymbol {
1387 None, ///< No symbol to be associated with the text
1388 P ///< A 'paragraph' symbol
1389 };
1390
1391 /**
1392 * Creates a new caret annotation.
1393 */
1394 CaretAnnotation();
1395
1396 /**
1397 * Creates a new caret annotation from the xml @p description
1398 */
1399 explicit CaretAnnotation(const QDomNode &description);
1400
1401 /**
1402 * Destroys the caret annotation.
1403 */
1404 ~CaretAnnotation() override;
1405
1406 /**
1407 * Sets the @p symbol for the caret annotation.
1408 */
1409 void setCaretSymbol(CaretAnnotation::CaretSymbol symbol);
1410
1411 /**
1412 * Returns the symbol of the annotation.
1413 */
1414 CaretAnnotation::CaretSymbol caretSymbol() const;
1415
1416 /**
1417 * Returns the sub type of the caret annotation.
1418 */
1419 SubType subType() const override;
1420
1421 /**
1422 * Stores the caret annotation as xml in @p document
1423 * under the given parent @p node.
1424 */
1425 void store(QDomNode &node, QDomDocument &document) const override;
1426
1427private:
1428 Q_DECLARE_PRIVATE(CaretAnnotation)
1429 Q_DISABLE_COPY(CaretAnnotation)
1430};
1431
1432class OKULARCORE_EXPORT FileAttachmentAnnotation : public Annotation
1433{
1434public:
1435 /**
1436 * Creates a new file attachment annotation.
1437 */
1438 FileAttachmentAnnotation();
1439 /**
1440 * Creates a new file attachment annotation from the xml @p description
1441 */
1442 explicit FileAttachmentAnnotation(const QDomNode &description);
1443 /**
1444 * Destroys the file attachment annotation.
1445 */
1446 ~FileAttachmentAnnotation() override;
1447
1448 /**
1449 * Gets the name of the icon.
1450 */
1451 QString fileIconName() const;
1452
1453 /**
1454 * Sets the @p iconName of the icon for the file attachment annotation.
1455 */
1456 void setFileIconName(const QString &iconName);
1457
1458 /**
1459 * Gets the embedded file object.
1460 */
1461 EmbeddedFile *embeddedFile() const;
1462
1463 /**
1464 * Sets the @p ef representing the embedded file of the file
1465 * attachment annotation.
1466 */
1467 void setEmbeddedFile(EmbeddedFile *ef);
1468
1469 /**
1470 * Returns the sub type of the file attachment annotation.
1471 */
1472 SubType subType() const override;
1473
1474 /**
1475 * Stores the file attachment annotation as xml in @p document
1476 * under the given parent @p node.
1477 */
1478 void store(QDomNode &node, QDomDocument &document) const override;
1479
1480private:
1481 Q_DECLARE_PRIVATE(FileAttachmentAnnotation)
1482 Q_DISABLE_COPY(FileAttachmentAnnotation)
1483};
1484
1485/**
1486 * \short Sound annotation.
1487 *
1488 * The sound annotation represents a sound to be played when activated.
1489 *
1490 * @since 0.7 (KDE 4.1)
1491 */
1492class OKULARCORE_EXPORT SoundAnnotation : public Annotation
1493{
1494public:
1495 /**
1496 * Creates a new sound annotation.
1497 */
1499 /**
1500 * Creates a new sound annotation from the xml @p description
1501 */
1502 explicit SoundAnnotation(const QDomNode &description);
1503 /**
1504 * Destroys the sound annotation.
1505 */
1506 ~SoundAnnotation() override;
1507
1508 /**
1509 * Gets the name of the icon.
1510 */
1511 QString soundIconName() const;
1512
1513 /**
1514 * Sets the @p iconName of the icon for the sound annotation.
1515 */
1516 void setSoundIconName(const QString &iconName);
1517
1518 /**
1519 * Gets the sound object.
1520 */
1521 Sound *sound() const;
1522
1523 /**
1524 * Sets the @p s representing the sound of the file
1525 * attachment annotation.
1526 */
1527 void setSound(Sound *s);
1528
1529 /**
1530 * Returns the sub type of the sound annotation.
1531 */
1532 SubType subType() const override;
1533
1534 /**
1535 * Stores the sound annotation as xml in @p document
1536 * under the given parent @p node.
1537 */
1538 void store(QDomNode &node, QDomDocument &document) const override;
1539
1540private:
1541 Q_DECLARE_PRIVATE(SoundAnnotation)
1542 Q_DISABLE_COPY(SoundAnnotation)
1543};
1544
1545/**
1546 * \short Movie annotation.
1547 *
1548 * The movie annotation represents a movie to be played when activated.
1549 *
1550 * @since 0.8 (KDE 4.2)
1551 */
1552class OKULARCORE_EXPORT MovieAnnotation : public Annotation
1553{
1554public:
1555 /**
1556 * Creates a new movie annotation.
1557 */
1559 /**
1560 * Creates a new movie annotation from the xml @p description
1561 */
1562 explicit MovieAnnotation(const QDomNode &description);
1563 /**
1564 * Destroys the movie annotation.
1565 */
1566 ~MovieAnnotation() override;
1567 /**
1568 * Gets the movie object.
1569 */
1570 Movie *movie() const;
1571 /**
1572 * Sets the new @p movie object.
1573 */
1574 void setMovie(Movie *movie);
1575 /**
1576 * Returns the sub type of the movie annotation.
1577 */
1578 SubType subType() const override;
1579 /**
1580 * Stores the movie annotation as xml in @p document
1581 * under the given @p parentNode.
1582 */
1583 void store(QDomNode &parentNode, QDomDocument &document) const override;
1584
1585private:
1586 Q_DECLARE_PRIVATE(MovieAnnotation)
1587 Q_DISABLE_COPY(MovieAnnotation)
1588};
1589
1590/**
1591 * \short Screen annotation.
1592 *
1593 * The screen annotation specifies a region of a page upon which media clips
1594 * may be played. It also serves as an object from which actions can be triggered.
1595 *
1596 * @since 0.16 (KDE 4.10)
1597 */
1598class OKULARCORE_EXPORT ScreenAnnotation : public Annotation
1599{
1600public:
1601 /**
1602 * Creates a new screen annotation.
1603 */
1605
1606 /**
1607 * Creates a new screen annotation from the xml @p description
1608 */
1609 explicit ScreenAnnotation(const QDomNode &description);
1610
1611 /**
1612 * Destroys the screen annotation.
1613 */
1614 ~ScreenAnnotation() override;
1615
1616 /**
1617 * Returns the sub type of the screen annotation.
1618 */
1619 SubType subType() const override;
1620
1621 /**
1622 * Stores the screen annotation as xml in @p document
1623 * under the given @p parentNode.
1624 */
1625 void store(QDomNode &parentNode, QDomDocument &document) const override;
1626
1627 /**
1628 * Sets the @p action that is executed when the annotation is triggered.
1629 *
1630 * @since 0.16 (KDE 4.10)
1631 */
1632 void setAction(Action *action);
1633
1634 /**
1635 * Returns the action that is executed when the annotation is triggered or @c 0 if not action has been defined.
1636 *
1637 * @since 0.16 (KDE 4.10)
1638 */
1639 Action *action() const;
1640
1641 /**
1642 * Sets the additional @p action of the given @p type.
1643 *
1644 * @since 0.16 (KDE 4.10)
1645 */
1646 void setAdditionalAction(AdditionalActionType type, Action *action);
1647
1648 /**
1649 * Returns the additional action of the given @p type or @c 0 if no action has been defined.
1650 *
1651 * @since 0.16 (KDE 4.10)
1652 */
1653 Action *additionalAction(AdditionalActionType type) const;
1654
1655private:
1656 Q_DECLARE_PRIVATE(ScreenAnnotation)
1657 Q_DISABLE_COPY(ScreenAnnotation)
1658};
1659
1660/**
1661 * \short Widget annotation.
1662 *
1663 * The widget annotation represents a widget on a page.
1664 *
1665 * @since 0.16 (KDE 4.10)
1666 */
1667class OKULARCORE_EXPORT WidgetAnnotation : public Annotation
1668{
1669public:
1670 /**
1671 * Creates a new widget annotation.
1672 */
1674
1675 /**
1676 * Creates a new widget annotation from the xml @p description
1677 */
1678 explicit WidgetAnnotation(const QDomNode &description);
1679
1680 /**
1681 * Destroys the widget annotation.
1682 */
1683 ~WidgetAnnotation() override;
1684
1685 /**
1686 * Returns the sub type of the widget annotation.
1687 */
1688 SubType subType() const override;
1689
1690 /**
1691 * Stores the widget annotation as xml in @p document
1692 * under the given @p parentNode.
1693 */
1694 void store(QDomNode &parentNode, QDomDocument &document) const override;
1695
1696 /**
1697 * Sets the additional @p action of the given @p type.
1698 *
1699 * @since 0.16 (KDE 4.10)
1700 */
1701 void setAdditionalAction(AdditionalActionType type, Action *action);
1702
1703 /**
1704 * Returns the additional action of the given @p type or @c 0 if no action has been defined.
1705 *
1706 * @since 0.16 (KDE 4.10)
1707 */
1708 Action *additionalAction(AdditionalActionType type) const;
1709
1710private:
1711 Q_DECLARE_PRIVATE(WidgetAnnotation)
1712 Q_DISABLE_COPY(WidgetAnnotation)
1713};
1714
1715/**
1716 * \short RichMedia annotation.
1717 *
1718 * The rich media annotation represents an video or sound on a page.
1719 *
1720 * @since 1.0
1721 */
1722class OKULARCORE_EXPORT RichMediaAnnotation : public Annotation
1723{
1724public:
1725 /**
1726 * Creates a new rich media annotation.
1727 */
1729
1730 /**
1731 * Creates a new rich media annotation from the xml @p description
1732 */
1733 explicit RichMediaAnnotation(const QDomNode &description);
1734
1735 /**
1736 * Destroys the rich media annotation.
1737 */
1738 ~RichMediaAnnotation() override;
1739
1740 /**
1741 * Returns the sub type of the rich media annotation.
1742 */
1743 SubType subType() const override;
1744
1745 /**
1746 * Stores the rich media annotation as xml in @p document
1747 * under the given @p parentNode.
1748 */
1749 void store(QDomNode &parentNode, QDomDocument &document) const override;
1750
1751 /**
1752 * Gets the movie object.
1753 */
1754 Movie *movie() const;
1755
1756 /**
1757 * Sets the new @p movie object.
1758 */
1759 void setMovie(Movie *movie);
1760
1761 /**
1762 * Sets the @p embeddedFile representing the embedded file.
1763 */
1764 void setEmbeddedFile(EmbeddedFile *embeddedFile);
1765
1766 /**
1767 * Gets the embedded file object.
1768 */
1769 EmbeddedFile *embeddedFile() const;
1770
1771private:
1772 Q_DECLARE_PRIVATE(RichMediaAnnotation)
1773 Q_DISABLE_COPY(RichMediaAnnotation)
1774};
1775
1776}
1777
1778#endif
Encapsulates data that describes an action.
Definition action.h:41
This class describes the object rectangle for an annotation.
Definition area.h:556
Native annotation interface.
virtual bool supports(Capability capability) const =0
Query for the supported capabilities.
virtual void notifyRemoval(Annotation *annotation, int page)=0
Called when an existing annotation at a given page is removed.
virtual void notifyAddition(Annotation *annotation, int page)=0
Called when a new annotation is added to a page.
virtual void notifyModification(const Annotation *annotation, int page, bool appearanceChanged)=0
Called after an existing annotation at a given page is modified.
@ Modification
Generator can edit native annotations.
@ Addition
Generator can create native annotations.
Helper class for (recursive) annotation retrieval/storage.
Definition annotations.h:50
The Revision class contains all information about the revision of the annotation.
The Style class contains all information about style of the annotation.
The Window class contains all information about the popup window of the annotation that is used to ed...
Annotation struct holds properties shared by all annotations.
Definition annotations.h:96
RevisionType
Describes the type of revision information.
Flag
Describes additional properties of an annotation.
LineEffect
Describes possible line effects for.
RevisionScope
Describes the scope of revision information.
AdditionalActionType
Describes the type of additional actions.
@ FocusIn
Performed when the annotation receives the input focus.
@ PageClosing
Performed when the page containing the annotation is closed.
@ MousePressed
Performed when the mouse button is pressed inside the annotation's active area.
@ PageOpening
Performed when the page containing the annotation is opened.
@ MouseReleased
Performed when the mouse button is released inside the annotation's active area.
@ CursorEntering
Performed when the cursor enters the annotation's active area.
@ FocusOut
Performed when the annotation loses the input focus.
@ CursorLeaving
Performed when the cursor exists the annotation's active area.
LineStyle
Describes possible line styles for.
SubType
Describes the type of annotation as defined in PDF standard.
virtual SubType subType() const =0
Returns the sub type of the annotation.
The Document.
Definition document.h:192
An embedded file into the document.
Definition document.h:1455
Describes a highlight quad of a text markup annotation.
Movie annotation.
Contains information about a movie object.
Definition movie.h:26
NormalizedPoint is a helper class which stores the coordinates of a normalized point.
Definition area.h:117
A NormalizedRect is a rectangle which can be defined by two NormalizedPoints.
Definition area.h:189
An area with normalized coordinates that contains a reference to an object.
Definition area.h:458
Collector for all the data belonging to a page.
Definition page.h:48
RichMedia annotation.
Screen annotation.
Sound annotation.
Contains information about a sound object.
Definition sound.h:24
Widget annotation.
global.h
Definition action.h:17
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:17:35 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.