Incidenceeditor

incidencedescription.cpp
1/*
2 SPDX-FileCopyrightText: 2010 Bertjan Broeksema <broeksema@kde.org>
3 SPDX-FileCopyrightText: 2010 Klarälvdalens Datakonsult AB, a KDAB Group company <info@kdab.com>
4
5 SPDX-License-Identifier: LGPL-2.0-or-later
6*/
7
8#include "incidencedescription.h"
9#include "ui_dialogdesktop.h"
10#include <KPIMTextEdit/RichTextComposer>
11
12#include "incidenceeditor_debug.h"
13#include <KActionCollection>
14#include <KLocalizedString>
15#include <KToolBar>
16
17using namespace IncidenceEditorNG;
18
19namespace IncidenceEditorNG
20{
21class IncidenceDescriptionPrivate
22{
23public:
24 IncidenceDescriptionPrivate() = default;
25
26 QString mRealOriginalDescriptionEditContents;
27 bool mRichTextEnabled = false;
28};
29}
30
31IncidenceDescription::IncidenceDescription(Ui::EventOrTodoDesktop *ui)
32 : IncidenceEditor(nullptr)
33 , mUi(ui)
34 , d(new IncidenceDescriptionPrivate())
35{
36 setObjectName(QLatin1StringView("IncidenceDescription"));
37 mUi->mRichTextLabel->setContextMenuPolicy(Qt::NoContextMenu);
38 setupToolBar();
39 connect(mUi->mRichTextLabel, &QLabel::linkActivated, this, &IncidenceDescription::toggleRichTextDescription);
40 connect(mUi->mDescriptionEdit->richTextComposer(), &KPIMTextEdit::RichTextComposer::textChanged, this, &IncidenceDescription::checkDirtyStatus);
41}
42
43IncidenceDescription::~IncidenceDescription() = default;
44
46{
47 mLoadedIncidence = incidence;
48
49 d->mRealOriginalDescriptionEditContents.clear();
50
51 if (incidence) {
52 enableRichTextDescription(incidence->descriptionIsRich());
53 if (incidence->descriptionIsRich()) {
54 mUi->mDescriptionEdit->richTextComposer()->setHtml(incidence->richDescription());
55 d->mRealOriginalDescriptionEditContents = mUi->mDescriptionEdit->richTextComposer()->toHtml();
56 } else {
57 mUi->mDescriptionEdit->richTextComposer()->setPlainText(incidence->description());
58 d->mRealOriginalDescriptionEditContents = mUi->mDescriptionEdit->richTextComposer()->toPlainText();
59 }
60 } else {
61 enableRichTextDescription(false);
62 mUi->mDescriptionEdit->richTextComposer()->clear();
63 }
64
65 mWasDirty = false;
66}
67
69{
70 if (d->mRichTextEnabled) {
71 incidence->setDescription(mUi->mDescriptionEdit->richTextComposer()->toHtml(), true);
72 } else {
73 incidence->setDescription(mUi->mDescriptionEdit->richTextComposer()->toPlainText(), false);
74 }
75}
76
78{
79 /* Sometimes, what you put in a KRichTextWidget isn't the same as what you get out.
80 Line terminators (cr,lf) for example can be converted.
81
82 So, to see if the user changed something, we can't compare the original incidence
83 with the new editor content.
84
85 Instead we compare the new editor content, with the original editor content, this way
86 any transformation regarding non-printable chars will be irrelevant.
87 */
88 if (d->mRichTextEnabled) {
89 return !mLoadedIncidence->descriptionIsRich() || d->mRealOriginalDescriptionEditContents != mUi->mDescriptionEdit->richTextComposer()->toHtml();
90 } else {
91 return mLoadedIncidence->descriptionIsRich() || d->mRealOriginalDescriptionEditContents != mUi->mDescriptionEdit->richTextComposer()->toPlainText();
92 }
93}
94
95void IncidenceDescription::enableRichTextDescription(bool enable)
96{
97 d->mRichTextEnabled = enable;
98
99 QString rt(i18nc("@action Enable or disable rich text editing", "Enable rich text"));
100 QString placeholder(QStringLiteral("<a href=\"show\">%1 &gt;&gt;</a>"));
101
102 if (enable) {
103 rt = i18nc("@action Enable or disable rich text editing", "Disable rich text");
104 placeholder = QStringLiteral("<a href=\"show\">&lt;&lt; %1</a>");
105 mUi->mDescriptionEdit->richTextComposer()->activateRichText();
106 d->mRealOriginalDescriptionEditContents = mUi->mDescriptionEdit->richTextComposer()->toHtml();
107 } else {
108 mUi->mDescriptionEdit->richTextComposer()->switchToPlainText();
109 d->mRealOriginalDescriptionEditContents = mUi->mDescriptionEdit->richTextComposer()->toPlainText();
110 }
111
112 placeholder = placeholder.arg(rt);
113 mUi->mRichTextLabel->setText(placeholder);
114 mUi->mDescriptionEdit->richTextComposer()->setEnableActions(enable);
115 mUi->mEditToolBarPlaceHolder->setVisible(enable);
117}
118
119void IncidenceDescription::toggleRichTextDescription()
120{
121 enableRichTextDescription(!d->mRichTextEnabled);
122}
123
124void IncidenceDescription::setupToolBar()
125{
126#ifndef QT_NO_TOOLBAR
127 auto collection = new KActionCollection(this);
128 mUi->mDescriptionEdit->richTextComposer()->createActions(collection);
129
130 auto mEditToolBar = new KToolBar(mUi->mEditToolBarPlaceHolder);
131 mEditToolBar->setToolButtonStyle(Qt::ToolButtonIconOnly);
132 mEditToolBar->addAction(collection->action(QStringLiteral("format_text_bold")));
133 mEditToolBar->addAction(collection->action(QStringLiteral("format_text_italic")));
134 mEditToolBar->addAction(collection->action(QStringLiteral("format_text_underline")));
135 mEditToolBar->addAction(collection->action(QStringLiteral("format_text_strikeout")));
136 mEditToolBar->addSeparator();
137
138 mEditToolBar->addAction(collection->action(QStringLiteral("format_font_family")));
139 mEditToolBar->addAction(collection->action(QStringLiteral("format_font_size")));
140 mEditToolBar->addSeparator();
141
142 mEditToolBar->addAction(collection->action(QStringLiteral("format_text_foreground_color")));
143 mEditToolBar->addAction(collection->action(QStringLiteral("format_text_background_color")));
144 mEditToolBar->addSeparator();
145
146 mEditToolBar->addAction(collection->action(QStringLiteral("format_list_style")));
147 mEditToolBar->addSeparator();
148
149 mEditToolBar->addAction(collection->action(QStringLiteral("format_align_left")));
150 mEditToolBar->addAction(collection->action(QStringLiteral("format_align_center")));
151 mEditToolBar->addAction(collection->action(QStringLiteral("format_align_right")));
152 mEditToolBar->addAction(collection->action(QStringLiteral("format_align_justify")));
153 mEditToolBar->addSeparator();
154
155 mEditToolBar->addAction(collection->action(QStringLiteral("format_painter")));
156 mEditToolBar->addSeparator();
157 mEditToolBar->addAction(collection->action(QStringLiteral("manage_link")));
158 mUi->mDescriptionEdit->richTextComposer()->setEnableActions(false);
159
160 auto layout = new QGridLayout(mUi->mEditToolBarPlaceHolder);
161 layout->addWidget(mEditToolBar);
162#endif
163
164 // By default we don't show the rich text toolbar.
165 mUi->mEditToolBarPlaceHolder->setVisible(false);
166 d->mRichTextEnabled = false;
167}
168
170{
171 // We're going to crash
172 qCDebug(INCIDENCEEDITOR_LOG) << "RichText enabled " << d->mRichTextEnabled;
173
174 if (mLoadedIncidence) {
175 qCDebug(INCIDENCEEDITOR_LOG) << "Incidence description is rich " << mLoadedIncidence->descriptionIsRich();
176
177 if (mLoadedIncidence->descriptionIsRich()) {
178 qCDebug(INCIDENCEEDITOR_LOG) << "desc is rich, and it is <desc>" << mLoadedIncidence->richDescription() << "</desc>; "
179 << "widget has <desc>" << mUi->mDescriptionEdit->richTextComposer()->toHtml() << "</desc>; "
180 << "expr mLoadedIncidence->richDescription() != mUi->mDescriptionEdit->toHtml() is "
181 << (mLoadedIncidence->richDescription() != mUi->mDescriptionEdit->richTextComposer()->toHtml());
182 } else {
183 qCDebug(INCIDENCEEDITOR_LOG) << "desc is not rich, and it is <desc>" << mLoadedIncidence->description() << "</desc>; "
184 << "widget has <desc>" << mUi->mDescriptionEdit->richTextComposer()->toPlainText() << "</desc>; "
185 << "expr mLoadedIncidence->description() != mUi->mDescriptionEdit->toPlainText() is "
186 << (mLoadedIncidence->description() != mUi->mDescriptionEdit->richTextComposer()->toPlainText());
187 }
188 } else {
189 qCDebug(INCIDENCEEDITOR_LOG) << "Incidence is invalid";
190 }
191}
192
193#include "moc_incidencedescription.cpp"
bool isDirty() const override
Returns whether or not the current values in the editor differ from the initial values.
void save(const KCalendarCore::Incidence::Ptr &incidence) override
Store the current values of the editor into.
void load(const KCalendarCore::Incidence::Ptr &incidence) override
Load the values of.
void printDebugInfo() const override
Re-implement this and print important member values and widget enabled/disabled states that could hav...
KCal Incidences are complicated objects.
void checkDirtyStatus()
Checks if the dirty status has changed until last check and emits the dirtyStatusChanged signal if ne...
QSharedPointer< IncidenceT > incidence() const
Convenience method to get a pointer for a specific const Incidence Type.
QString i18nc(const char *context, const char *text, const TYPE &arg...)
void linkActivated(const QString &link)
T qobject_cast(QObject *object)
NoContextMenu
ToolButtonIconOnly
QFuture< ArgsType< Signal > > connect(Sender *sender, Signal signal)
This file is part of the KDE documentation.
Documentation copyright © 1996-2024 The KDE developers.
Generated on Tue Mar 26 2024 11:19:37 by doxygen 1.10.0 written by Dimitri van Heesch, © 1997-2006

KDE's Doxygen guidelines are available online.