File indexing completed on 2024-10-06 13:33:56

0001 /**
0002  * SPDX-FileCopyrightText: (C) 2005 Sébastien Laoût <slaout@linux62.org>
0003  *
0004  * SPDX-License-Identifier: GPL-2.0-or-later
0005  */
0006 
0007 #ifndef TAG_H
0008 #define TAG_H
0009 
0010 #include <QtCore/QList>
0011 #include <QRegularExpression>
0012 #include <KToggleAction>
0013 
0014 class QColor;
0015 class QFont;
0016 class QPainter;
0017 class QString;
0018 
0019 
0020 class QKeySequence;
0021 
0022 class Tag;
0023 
0024 /**
0025  * @author Sébastien Laoût
0026  */
0027 class State
0028 {
0029 public:
0030     /// LIST OF STATES:
0031     typedef QList<State *> List;
0032 
0033 public:
0034     /// CONSTRUCTOR AND DESTRUCTOR:
0035     explicit State(const QString &id = QString(), Tag *tag = nullptr);
0036     ~State();
0037     /// SET PROPERTIES:
0038     void setId(const QString &id)
0039     {
0040         m_id = id;
0041     }
0042     void setName(const QString &name)
0043     {
0044         m_name = name;
0045     }
0046     void setEmblem(const QString &emblem)
0047     {
0048         m_emblem = emblem;
0049     }
0050     void setBold(bool bold)
0051     {
0052         m_bold = bold;
0053     }
0054     void setItalic(bool italic)
0055     {
0056         m_italic = italic;
0057     }
0058     void setUnderline(bool underline)
0059     {
0060         m_underline = underline;
0061     }
0062     void setStrikeOut(bool strikeOut)
0063     {
0064         m_strikeOut = strikeOut;
0065     }
0066     void setTextColor(const QColor &color)
0067     {
0068         m_textColor = color;
0069     }
0070     void setFontName(const QString &font)
0071     {
0072         m_fontName = font;
0073     }
0074     void setFontSize(int size)
0075     {
0076         m_fontSize = size;
0077     }
0078     void setBackgroundColor(const QColor &color)
0079     {
0080         m_backgroundColor = color;
0081     }
0082     void setTextEquivalent(const QString &text)
0083     {
0084         m_textEquivalent = text;
0085     }
0086     void setOnAllTextLines(bool yes)
0087     {
0088         m_onAllTextLines = yes;
0089     }
0090     void setAllowCrossReferences(bool yes)
0091     {
0092         m_allowCrossReferences = yes;
0093     }
0094     void setParentTag(Tag *tag)
0095     {
0096         m_parentTag = tag;
0097     }
0098     /// GET PROPERTIES:
0099     QString id() const
0100     {
0101         return m_id;
0102     }
0103     QString name() const
0104     {
0105         return m_name;
0106     }
0107     QString emblem() const
0108     {
0109         return m_emblem;
0110     }
0111     bool bold() const
0112     {
0113         return m_bold;
0114     }
0115     bool italic() const
0116     {
0117         return m_italic;
0118     }
0119     bool underline() const
0120     {
0121         return m_underline;
0122     }
0123     bool strikeOut() const
0124     {
0125         return m_strikeOut;
0126     }
0127     QColor textColor() const
0128     {
0129         return m_textColor;
0130     }
0131     QString fontName() const
0132     {
0133         return m_fontName;
0134     }
0135     int fontSize() const
0136     {
0137         return m_fontSize;
0138     }
0139     QColor backgroundColor() const
0140     {
0141         return m_backgroundColor;
0142     }
0143     QString textEquivalent() const
0144     {
0145         return m_textEquivalent;
0146     }
0147     bool onAllTextLines() const
0148     {
0149         return m_onAllTextLines;
0150     }
0151     bool allowCrossReferences() const
0152     {
0153         return m_allowCrossReferences;
0154     }
0155     Tag *parentTag() const
0156     {
0157         return m_parentTag;
0158     }
0159     /// HELPING FUNCTIONS:
0160     State *nextState(bool cycle = true);
0161     QString fullName();
0162     QFont font(QFont base);
0163     QString toCSS(const QString &gradientFolderPath, const QString &gradientFolderName, const QFont &baseFont);
0164     static void merge(const List &states, State *result, int *emblemsCount, bool *haveInvisibleTags, const QColor &backgroundColor);
0165     void copyTo(State *other);
0166 
0167 private:
0168     /// PROPERTIES:
0169     QString m_id;
0170     QString m_name;
0171     QString m_emblem;
0172     bool m_bold;
0173     bool m_italic;
0174     bool m_underline;
0175     bool m_strikeOut;
0176     QColor m_textColor;
0177     QString m_fontName;
0178     int m_fontSize;
0179     QColor m_backgroundColor;
0180     QString m_textEquivalent;
0181     bool m_onAllTextLines;
0182     bool m_allowCrossReferences;
0183     Tag *m_parentTag;
0184 };
0185 
0186 /** A Tag is a category of Notes.
0187  * A Note can have 0, 1 or more Tags.
0188  * A Tag can have a unique State or several States.
0189  * @author Sébastien Laoût
0190  */
0191 class Tag
0192 {
0193 public:
0194     /// LIST OF ALL TAGS IN THE APPLICATION:
0195     typedef QList<Tag *> List;
0196     static Tag::List all;
0197     static State *stateById(const QString &id);
0198     static State *stateByTextEquiv(const QString &text);
0199     static Tag *tagForKAction(QAction *action);
0200     static Tag *tagSimilarTo(Tag *tagToTest);
0201     static QMap<QString, QString> loadTags(const QString &path = QString() /*, bool merge = false*/); /// << Load the tags contained in the XML file @p path or those in the application settings if @p path isEmpty(). If @p merge is true and
0202                                                                                                       /// a tag with the id of a tag that should be loaded already exist, the tag will get a new id. Otherwise, the tag will be dismissed.
0203     static void saveTags();
0204     static void saveTagsTo(QList<Tag *> &list, const QString &fullPath);
0205     static void createDefaultTagsSet(const QString &file);
0206     static long getNextStateUid();
0207     static void updateCaches();
0208     static const QRegularExpression& regexpDetectTagsInPlainText();
0209 
0210 private:
0211     static long nextStateUid;
0212     static QHash<QString, State*> dictStatesByEquiv;
0213     static QRegularExpression regexpDetectTags;
0214 
0215 public:
0216     /// CONSTRUCTOR AND DESTRUCTOR:
0217     Tag(/*State *firstState, const QString &name, bool inheritedBySiblings*/);
0218     ~Tag();
0219     /// SET PROPERTIES:
0220     void setName(const QString &name);
0221     void setShortcut(const QKeySequence &shortcut)
0222     {
0223         m_action->setShortcut(shortcut);
0224     }
0225     void setInheritedBySiblings(bool inherited)
0226     {
0227         m_inheritedBySiblings = inherited;
0228     }
0229     void appendState(State *state)
0230     {
0231         m_states.append(state);
0232         state->setParentTag(this);
0233     }
0234     void removeState(State *state)
0235     {
0236         m_states.removeOne(state);
0237         state->setParentTag(nullptr);
0238     }
0239     /// GET PROPERTIES:
0240     QString name() const
0241     {
0242         return m_name;
0243     }
0244     QKeySequence shortcut() const
0245     {
0246         return m_action->shortcut();
0247     }
0248     bool inheritedBySiblings() const
0249     {
0250         return m_inheritedBySiblings;
0251     }
0252     State::List &states() const
0253     {
0254         return (State::List &)m_states;
0255     }
0256     int countStates() const
0257     {
0258         return m_states.count();
0259     }
0260     void copyTo(Tag *other);
0261 
0262 private:
0263     /// PROPERTIES:
0264     QString m_name;
0265     QAction *m_action;
0266     bool m_inheritedBySiblings;
0267     State::List m_states;
0268 };
0269 
0270 #include <qicon.h>
0271 #include <qstring.h>
0272 
0273 /** An action that represents a State or a Tag
0274  * @author Kelvie Wong
0275  * Based off of StateMenuItem by Sébastien Laoût
0276  */
0277 class StateAction : public KToggleAction
0278 {
0279     Q_OBJECT
0280     Q_DISABLE_COPY(StateAction);
0281 
0282 public:
0283     StateAction(State *state, const QKeySequence &shortcut, QWidget *parent, bool withTagName = false);
0284 
0285     ~StateAction() override;
0286 
0287 private:
0288     State *m_state;
0289     QString m_name;
0290     QString m_shortcut;
0291 };
0292 
0293 #endif // TAG_H