Add subject support as discussed with David

wilder
Laurent Montel 6 years ago
parent 79c8eb8e0e
commit e36b4100d0
  1. 2
      CMakeLists.txt
  2. 10
      src/snippets/snippetdialog.cpp
  3. 3
      src/snippets/snippetdialog.h
  4. 3
      src/snippets/snippetsmanager.cpp
  5. 40
      src/snippets/snippetsmodel.cpp
  6. 6
      src/snippets/snippetsmodel.h
  7. 11
      src/snippets/snippetwidget.cpp
  8. 4
      src/snippets/snippetwidget.h
  9. 138
      src/snippets/ui/snippetwidget.ui

@ -1,5 +1,5 @@
cmake_minimum_required(VERSION 3.5) cmake_minimum_required(VERSION 3.5)
set(PIM_VERSION "5.12.48") set(PIM_VERSION "5.12.49")
project(mailcommon VERSION ${PIM_VERSION}) project(mailcommon VERSION ${PIM_VERSION})

@ -107,6 +107,16 @@ QString SnippetDialog::text() const
return mSnippetWidget->text(); return mSnippetWidget->text();
} }
void SnippetDialog::setSubject(const QString &text)
{
mSnippetWidget->setSubject(text);
}
QString SnippetDialog::subject() const
{
return mSnippetWidget->subject();
}
void SnippetDialog::setKeySequence(const QKeySequence &sequence) void SnippetDialog::setKeySequence(const QKeySequence &sequence)
{ {
mSnippetWidget->setKeySequence(sequence); mSnippetWidget->setKeySequence(sequence);

@ -38,6 +38,9 @@ public:
void setText(const QString &text); void setText(const QString &text);
Q_REQUIRED_RESULT QString text() const; Q_REQUIRED_RESULT QString text() const;
void setSubject(const QString &text);
Q_REQUIRED_RESULT QString subject() const;
void setKeySequence(const QKeySequence &sequence); void setKeySequence(const QKeySequence &sequence);
Q_REQUIRED_RESULT QKeySequence keySequence() const; Q_REQUIRED_RESULT QKeySequence keySequence() const;

@ -171,6 +171,7 @@ void SnippetsManager::Private::createSnippet(const QString &text)
mModel->setData(index, dlg->text(), SnippetsModel::TextRole); mModel->setData(index, dlg->text(), SnippetsModel::TextRole);
mModel->setData(index, dlg->keySequence().toString(), SnippetsModel::KeySequenceRole); mModel->setData(index, dlg->keySequence().toString(), SnippetsModel::KeySequenceRole);
mModel->setData(index, dlg->keyword(), SnippetsModel::KeywordRole); mModel->setData(index, dlg->keyword(), SnippetsModel::KeywordRole);
mModel->setData(index, dlg->subject(), SnippetsModel::SubjectRole);
Q_EMIT mModel->updateActionCollection(QString(), dlg->name(), dlg->keySequence(), dlg->text()); Q_EMIT mModel->updateActionCollection(QString(), dlg->name(), dlg->keySequence(), dlg->text());
mDirty = true; mDirty = true;
@ -207,6 +208,7 @@ void SnippetsManager::Private::editSnippet()
dlg->setName(oldSnippetName); dlg->setName(oldSnippetName);
dlg->setText(index.data(SnippetsModel::TextRole).toString()); dlg->setText(index.data(SnippetsModel::TextRole).toString());
dlg->setKeyword(index.data(SnippetsModel::KeywordRole).toString()); dlg->setKeyword(index.data(SnippetsModel::KeywordRole).toString());
dlg->setSubject(index.data(SnippetsModel::SubjectRole).toString());
dlg->setKeySequence( dlg->setKeySequence(
QKeySequence::fromString( QKeySequence::fromString(
index.data(SnippetsModel::KeySequenceRole).toString())); index.data(SnippetsModel::KeySequenceRole).toString()));
@ -225,6 +227,7 @@ void SnippetsManager::Private::editSnippet()
mModel->setData(index, dlg->text(), SnippetsModel::TextRole); mModel->setData(index, dlg->text(), SnippetsModel::TextRole);
mModel->setData(index, dlg->keySequence().toString(), SnippetsModel::KeySequenceRole); mModel->setData(index, dlg->keySequence().toString(), SnippetsModel::KeySequenceRole);
mModel->setData(index, dlg->keyword(), SnippetsModel::KeywordRole); mModel->setData(index, dlg->keyword(), SnippetsModel::KeywordRole);
mModel->setData(index, dlg->subject(), SnippetsModel::SubjectRole);
Q_EMIT mModel->updateActionCollection(oldSnippetName, dlg->name(), dlg->keySequence(), dlg->text()); Q_EMIT mModel->updateActionCollection(oldSnippetName, dlg->name(), dlg->keySequence(), dlg->text());
mDirty = true; mDirty = true;

@ -57,6 +57,9 @@ public:
Q_REQUIRED_RESULT int row() const; Q_REQUIRED_RESULT int row() const;
SnippetItem *parent() const; SnippetItem *parent() const;
Q_REQUIRED_RESULT QString subject() const;
void setSubject(const QString &subject);
private: private:
QVector<SnippetItem *> mChildItems; QVector<SnippetItem *> mChildItems;
SnippetItem *mParentItem = nullptr; SnippetItem *mParentItem = nullptr;
@ -66,6 +69,7 @@ private:
QString mText; QString mText;
QString mKeySequence; QString mKeySequence;
QString mKeyword; QString mKeyword;
QString mSubject;
}; };
SnippetItem::SnippetItem(bool isGroup, SnippetItem *parent) SnippetItem::SnippetItem(bool isGroup, SnippetItem *parent)
@ -151,6 +155,16 @@ SnippetItem *SnippetItem::parent() const
return mParentItem; return mParentItem;
} }
QString SnippetItem::subject() const
{
return mSubject;
}
void SnippetItem::setSubject(const QString &subject)
{
mSubject = subject;
}
int SnippetItem::row() const int SnippetItem::row() const
{ {
if (mParentItem) { if (mParentItem) {
@ -209,6 +223,10 @@ bool SnippetsModel::setData(const QModelIndex &index, const QVariant &value, int
item->setKeyword(value.toString()); item->setKeyword(value.toString());
Q_EMIT dataChanged(index, index); Q_EMIT dataChanged(index, index);
return true; return true;
case SubjectRole:
item->setSubject(value.toString());
Q_EMIT dataChanged(index, index);
return true;
} }
return false; return false;
@ -235,6 +253,8 @@ QVariant SnippetsModel::data(const QModelIndex &index, int role) const
return item->keySequence(); return item->keySequence();
case KeywordRole: case KeywordRole:
return item->keyword(); return item->keyword();
case SubjectRole:
return item->subject();
} }
return QVariant(); return QVariant();
@ -371,7 +391,7 @@ QMimeData *SnippetsModel::mimeData(const QModelIndexList &indexes) const
QByteArray encodedData; QByteArray encodedData;
QDataStream stream(&encodedData, QIODevice::WriteOnly); QDataStream stream(&encodedData, QIODevice::WriteOnly);
stream << index.parent().internalId() << item->name() << item->text() << item->keySequence() << item->keyword(); stream << index.parent().internalId() << item->name() << item->text() << item->keySequence() << item->keyword() << item->subject();
mimeData->setData(QStringLiteral("text/x-kmail-textsnippet"), encodedData); mimeData->setData(QStringLiteral("text/x-kmail-textsnippet"), encodedData);
mimeData->setText(item->text()); mimeData->setText(item->text());
@ -433,7 +453,8 @@ bool SnippetsModel::dropMimeData(const QMimeData *data, Qt::DropAction action, i
QString text; QString text;
QString keySequence; QString keySequence;
QString keyword; QString keyword;
stream >> id >> name >> text >> keySequence >> keyword; QString subject;
stream >> id >> name >> text >> keySequence >> keyword >> subject;
if (parent.internalId() == id) { if (parent.internalId() == id) {
return false; return false;
@ -447,6 +468,7 @@ bool SnippetsModel::dropMimeData(const QMimeData *data, Qt::DropAction action, i
setData(idx, text, SnippetsModel::TextRole); setData(idx, text, SnippetsModel::TextRole);
setData(idx, keySequence, SnippetsModel::KeySequenceRole); setData(idx, keySequence, SnippetsModel::KeySequenceRole);
setData(idx, keyword, SnippetsModel::KeywordRole); setData(idx, keyword, SnippetsModel::KeywordRole);
setData(idx, subject, SnippetsModel::SubjectRole);
Q_EMIT dndDone(); Q_EMIT dndDone();
return true; return true;
} }
@ -495,8 +517,10 @@ void SnippetsModel::load(const QString &filename)
= group.readEntry(QStringLiteral("snippetKeySequence_%1").arg(j), QString()); = group.readEntry(QStringLiteral("snippetKeySequence_%1").arg(j), QString());
const QString snippetKeyword const QString snippetKeyword
= group.readEntry(QStringLiteral("snippetKeyword_%1").arg(j), QString()); = group.readEntry(QStringLiteral("snippetKeyword_%1").arg(j), QString());
const QString snippetSubject
= group.readEntry(QStringLiteral("snippetSubject_%1").arg(j), QString());
createSnippet(groupIndex, snippetName, snippetText, snippetKeySequence, snippetKeyword); createSnippet(groupIndex, snippetName, snippetText, snippetKeySequence, snippetKeyword, snippetSubject);
} }
} }
@ -514,7 +538,7 @@ void SnippetsModel::load(const QString &filename)
} }
} }
void SnippetsModel::createSnippet(const QModelIndex &groupIndex, const QString &snippetName, const QString &snippetText, const QString &snippetKeySequence, const QString &snippetKeyword) void SnippetsModel::createSnippet(const QModelIndex &groupIndex, const QString &snippetName, const QString &snippetText, const QString &snippetKeySequence, const QString &snippetKeyword, const QString &snippetSubject)
{ {
insertRow(rowCount(groupIndex), groupIndex); insertRow(rowCount(groupIndex), groupIndex);
const QModelIndex modelIndex = index(rowCount(groupIndex) - 1, 0, groupIndex); const QModelIndex modelIndex = index(rowCount(groupIndex) - 1, 0, groupIndex);
@ -523,6 +547,7 @@ void SnippetsModel::createSnippet(const QModelIndex &groupIndex, const QString &
setData(modelIndex, snippetText, SnippetsModel::TextRole); setData(modelIndex, snippetText, SnippetsModel::TextRole);
setData(modelIndex, snippetKeySequence, SnippetsModel::KeySequenceRole); setData(modelIndex, snippetKeySequence, SnippetsModel::KeySequenceRole);
setData(modelIndex, snippetKeyword, SnippetsModel::KeywordRole); setData(modelIndex, snippetKeyword, SnippetsModel::KeywordRole);
setData(modelIndex, snippetSubject, SnippetsModel::SubjectRole);
Q_EMIT updateActionCollection(QString(), Q_EMIT updateActionCollection(QString(),
snippetName, snippetName,
@ -552,10 +577,12 @@ QVector<SnippetsInfo> SnippetsModel::snippetsInfo() const
const QString snippetText = modelIndex.data(SnippetsModel::TextRole).toString(); const QString snippetText = modelIndex.data(SnippetsModel::TextRole).toString();
const QString snippetKeySequence = modelIndex.data(SnippetsModel::KeySequenceRole).toString(); const QString snippetKeySequence = modelIndex.data(SnippetsModel::KeySequenceRole).toString();
const QString snippetKeyword = modelIndex.data(SnippetsModel::KeywordRole).toString(); const QString snippetKeyword = modelIndex.data(SnippetsModel::KeywordRole).toString();
const QString snippetSubject = modelIndex.data(SnippetsModel::SubjectRole).toString();
info.text = snippetText; info.text = snippetText;
info.newName = snippetName; info.newName = snippetName;
info.keyword = snippetKeyword; info.keyword = snippetKeyword;
info.keySequence = QKeySequence::fromString(snippetKeySequence); info.keySequence = QKeySequence::fromString(snippetKeySequence);
info.subject = snippetSubject;
infos.append(info); infos.append(info);
} }
} }
@ -601,6 +628,7 @@ void SnippetsModel::save(const QString &filename)
const QString snippetText = modelIndex.data(SnippetsModel::TextRole).toString(); const QString snippetText = modelIndex.data(SnippetsModel::TextRole).toString();
const QString snippetKeySequence = modelIndex.data(SnippetsModel::KeySequenceRole).toString(); const QString snippetKeySequence = modelIndex.data(SnippetsModel::KeySequenceRole).toString();
const QString snippetKeyword = modelIndex.data(SnippetsModel::KeywordRole).toString(); const QString snippetKeyword = modelIndex.data(SnippetsModel::KeywordRole).toString();
const QString snippetSubject = modelIndex.data(SnippetsModel::SubjectRole).toString();
group.writeEntry(QStringLiteral("snippetName_%1").arg(j), snippetName); group.writeEntry(QStringLiteral("snippetName_%1").arg(j), snippetName);
if (!snippetText.isEmpty()) { if (!snippetText.isEmpty()) {
@ -614,6 +642,10 @@ void SnippetsModel::save(const QString &filename)
group.writeEntry(QStringLiteral("snippetKeyword_%1").arg(j), group.writeEntry(QStringLiteral("snippetKeyword_%1").arg(j),
snippetKeyword); snippetKeyword);
} }
if (!snippetSubject.isEmpty()) {
group.writeEntry(QStringLiteral("snippetSubject_%1").arg(j),
snippetSubject);
}
} }
} }
} }

@ -33,6 +33,7 @@ struct MAILCOMMON_EXPORT SnippetsInfo
QKeySequence keySequence; QKeySequence keySequence;
QString text; QString text;
QString keyword; QString keyword;
QString subject;
}; };
class MAILCOMMON_EXPORT SnippetsModel : public QAbstractItemModel class MAILCOMMON_EXPORT SnippetsModel : public QAbstractItemModel
@ -44,7 +45,8 @@ public:
NameRole, ///< The name of a snippet or group NameRole, ///< The name of a snippet or group
TextRole, ///< The text of a snippet TextRole, ///< The text of a snippet
KeySequenceRole, ///< The key sequence to activate a snippet KeySequenceRole, ///< The key sequence to activate a snippet
KeywordRole, ///< The keyword which will replace by snippet KeywordRole, ///< The keyword which will replace by snippet
SubjectRole, ///< The subject of a snippet
}; };
static SnippetsModel *instance(); static SnippetsModel *instance();
@ -94,7 +96,7 @@ Q_SIGNALS:
private: private:
QModelIndex createGroup(const QString &groupName); QModelIndex createGroup(const QString &groupName);
void createSnippet(const QModelIndex &groupIndex, const QString &snippetName, const QString &snippetText, const QString &snippetKeySequence, const QString &snippetKeyword); void createSnippet(const QModelIndex &groupIndex, const QString &snippetName, const QString &snippetText, const QString &snippetKeySequence, const QString &snippetKeyword, const QString &snippetSubject);
SnippetItem *mRootItem = nullptr; SnippetItem *mRootItem = nullptr;
QMap<QString, QString> mSavedVariables; QMap<QString, QString> mSavedVariables;
}; };

@ -177,6 +177,7 @@ void SnippetWidget::clear()
d->mUi.keyword->clear(); d->mUi.keyword->clear();
d->mUi.snippetText->clear(); d->mUi.snippetText->clear();
d->mUi.keyWidget->setKeySequence({}); d->mUi.keyWidget->setKeySequence({});
d->mUi.subject->clear();
} }
bool SnippetWidget::wasChanged() const bool SnippetWidget::wasChanged() const
@ -188,3 +189,13 @@ void SnippetWidget::setWasChanged(bool b)
{ {
d->wasChanged = b; d->wasChanged = b;
} }
QString SnippetWidget::subject() const
{
return d->mUi.subject->text();
}
void SnippetWidget::setSubject(const QString &text)
{
d->mUi.subject->setText(text);
}

@ -55,6 +55,10 @@ public:
Q_REQUIRED_RESULT bool wasChanged() const; Q_REQUIRED_RESULT bool wasChanged() const;
void setWasChanged(bool b); void setWasChanged(bool b);
void setSubject(const QString &text);
Q_REQUIRED_RESULT QString subject() const;
Q_SIGNALS: Q_SIGNALS:
void textChanged(const QString &str); void textChanged(const QString &str);
void groupChanged(int index); void groupChanged(int index);

@ -7,11 +7,20 @@
<x>0</x> <x>0</x>
<y>0</y> <y>0</y>
<width>468</width> <width>468</width>
<height>188</height> <height>287</height>
</rect> </rect>
</property> </property>
<layout class="QVBoxLayout" name="verticalLayout"> <layout class="QVBoxLayout" name="verticalLayout">
<property name="margin"> <property name="leftMargin">
<number>0</number>
</property>
<property name="topMargin">
<number>0</number>
</property>
<property name="rightMargin">
<number>0</number>
</property>
<property name="bottomMargin">
<number>0</number> <number>0</number>
</property> </property>
<item> <item>
@ -30,25 +39,27 @@
</widget> </widget>
</item> </item>
<item row="0" column="1"> <item row="0" column="1">
<widget class="KLineEdit" name="nameEdit"> <widget class="KLineEdit" name="nameEdit"/>
</widget>
</item> </item>
</layout> </layout>
</item> </item>
<item> <item>
<widget class="QWidget" name="groupWidget" native="true"> <widget class="QWidget" name="groupWidget" native="true">
<layout class="QGridLayout" name="gridLayout"> <layout class="QGridLayout" name="gridLayout">
<item row="0" column="0"> <item row="3" column="2">
<widget class="QLabel" name="textLabelGroup"> <spacer name="horizontalSpacer">
<property name="text"> <property name="orientation">
<string comment="Group to which the snippet belongs.">Group:</string> <enum>Qt::Horizontal</enum>
</property> </property>
<property name="wordWrap"> <property name="sizeHint" stdset="0">
<bool>false</bool> <size>
<width>347</width>
<height>20</height>
</size>
</property> </property>
</widget> </spacer>
</item> </item>
<item row="1" column="0"> <item row="2" column="0">
<widget class="QLabel" name="textLabel"> <widget class="QLabel" name="textLabel">
<property name="text"> <property name="text">
<string>&amp;Snippet:</string> <string>&amp;Snippet:</string>
@ -64,8 +75,31 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="7" column="1" colspan="2">
<widget class="KKeySequenceWidget" name="keyWidget">
<property name="sizePolicy">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred">
<horstretch>0</horstretch>
<verstretch>0</verstretch>
</sizepolicy>
</property>
</widget>
</item>
<item row="1" column="0">
<widget class="QLabel" name="textLabelGroup">
<property name="text">
<string comment="Group to which the snippet belongs.">Group:</string>
</property>
<property name="wordWrap">
<bool>false</bool>
</property>
</widget>
</item>
<item row="1" column="1" colspan="2"> <item row="1" column="1" colspan="2">
<widget class="KPIMTextEdit::PlainTextEditorWidget" name="snippetText" native="true"> <widget class="KComboBox" name="groupBox"/>
</item>
<item row="2" column="1" colspan="2">
<widget class="KPIMTextEdit::PlainTextEditorWidget" name="snippetText">
<property name="font"> <property name="font">
<font> <font>
<family>Courier</family> <family>Courier</family>
@ -74,27 +108,21 @@
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="1"> <item row="6" column="0">
<widget class="QPushButton" name="pushButtonVariables"> <widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Variables</string> <string>Keyword:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="2" column="2"> <item row="3" column="1">
<spacer name="horizontalSpacer"> <widget class="QPushButton" name="pushButtonVariables">
<property name="orientation"> <property name="text">
<enum>Qt::Horizontal</enum> <string>Variables</string>
</property>
<property name="sizeHint" stdset="0">
<size>
<width>347</width>
<height>20</height>
</size>
</property> </property>
</spacer> </widget>
</item> </item>
<item row="6" column="0"> <item row="7" column="0">
<widget class="QLabel" name="keyWidgetLabel"> <widget class="QLabel" name="keyWidgetLabel">
<property name="text"> <property name="text">
<string>Sho&amp;rtcut:</string> <string>Sho&amp;rtcut:</string>
@ -108,27 +136,37 @@
</widget> </widget>
</item> </item>
<item row="6" column="1" colspan="2"> <item row="6" column="1" colspan="2">
<widget class="KKeySequenceWidget" name="keyWidget" native="true"> <widget class="KLineEdit" name="keyword">
<property name="sizePolicy"> <property name="urlDropsEnabled">
<sizepolicy hsizetype="Preferred" vsizetype="Preferred"> <bool>false</bool>
<horstretch>0</horstretch> </property>
<verstretch>0</verstretch> <property name="trapEnterKeyEvent" stdset="0">
</sizepolicy> <bool>true</bool>
</property>
<property name="showClearButton" stdset="0">
<bool>true</bool>
</property> </property>
</widget> </widget>
</item> </item>
<item row="0" column="1" colspan="2"> <item row="0" column="0">
<widget class="KComboBox" name="groupBox"/> <widget class="QLabel" name="label_2">
</item>
<item row="5" column="0">
<widget class="QLabel" name="label">
<property name="text"> <property name="text">
<string>Keyword:</string> <string>Subject:</string>
</property> </property>
</widget> </widget>
</item> </item>
<item row="5" column="1" colspan="2"> <item row="0" column="1" colspan="2">
<widget class="KLineEdit" name="keyword"/> <widget class="KLineEdit" name="subject">
<property name="clearButtonEnabled">
<bool>true</bool>
</property>
<property name="urlDropsEnabled">
<bool>false</bool>
</property>
<property name="trapEnterKeyEvent" stdset="0">
<bool>true</bool>
</property>
</widget>
</item> </item>
</layout> </layout>
</widget> </widget>
@ -136,26 +174,26 @@
</layout> </layout>
</widget> </widget>
<customwidgets> <customwidgets>
<customwidget>
<class>KLineEdit</class>
<extends>QLineEdit</extends>
<header>klineedit.h</header>
</customwidget>
<customwidget> <customwidget>
<class>KComboBox</class> <class>KComboBox</class>
<extends>QComboBox</extends> <extends>QComboBox</extends>
<header>kcombobox.h</header> <header>kcombobox.h</header>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>KKeySequenceWidget</class> <class>KLineEdit</class>
<extends>QWidget</extends> <extends>QLineEdit</extends>
<header>kkeysequencewidget.h</header> <header>klineedit.h</header>
</customwidget> </customwidget>
<customwidget> <customwidget>
<class>KPIMTextEdit::PlainTextEditorWidget</class> <class>KPIMTextEdit::PlainTextEditorWidget</class>
<extends>QWidget</extends> <extends>QWidget</extends>
<header>kpimtextedit/plaintexteditorwidget.h</header> <header>kpimtextedit/plaintexteditorwidget.h</header>
</customwidget> </customwidget>
<customwidget>
<class>KKeySequenceWidget</class>
<extends>QWidget</extends>
<header>kkeysequencewidget.h</header>
</customwidget>
</customwidgets> </customwidgets>
<resources/> <resources/>
<connections/> <connections/>

Loading…
Cancel
Save