1 | /* |
2 | Nested list helper |
3 | SPDX-FileCopyrightText: 2008 Stephen Kelly <steveire@gmail.com> |
4 | |
5 | SPDX-License-Identifier: LGPL-2.1-or-later |
6 | */ |
7 | |
8 | #ifndef NESTEDLISTHELPER_H |
9 | #define NESTEDLISTHELPER_H |
10 | |
11 | //@cond PRIVATE |
12 | |
13 | class QTextEdit; |
14 | |
15 | class QKeyEvent; |
16 | class QDropEvent; |
17 | class QTextCursor; |
18 | class QTextList; |
19 | class QTextBlock; |
20 | |
21 | /** |
22 | * |
23 | * @short Helper class for automatic handling of nested lists in a text edit |
24 | * |
25 | * |
26 | * @author Stephen Kelly |
27 | * @since 4.1 |
28 | * @internal |
29 | */ |
30 | class NestedListHelper |
31 | { |
32 | public: |
33 | /** |
34 | * Create a helper |
35 | * |
36 | * @param te The text edit object to handle lists in. |
37 | */ |
38 | explicit NestedListHelper(QTextEdit *te); |
39 | |
40 | /** |
41 | * Destructor |
42 | */ |
43 | ~NestedListHelper(); |
44 | |
45 | /** |
46 | * |
47 | * Handles a key press before it is processed by the text edit widget. |
48 | * |
49 | * This includes: |
50 | * 1. Backspace at the beginning of a line decreases nesting level |
51 | * 2. Return at the empty list element decreases nesting level |
52 | * 3. Tab at the beginning of a line OR with a multi-line selection |
53 | * increases nesting level |
54 | * |
55 | * @param event The event to be handled |
56 | * @return Whether the event was completely handled by this method. |
57 | */ |
58 | bool handleKeyPressEvent(QKeyEvent *event); |
59 | |
60 | bool handleAfterDropEvent(QDropEvent *event); |
61 | |
62 | /** |
63 | * Changes the indent (nesting level) on a current list item or selection |
64 | * by the value @p delta (typically, +1 or -1) |
65 | */ |
66 | void changeIndent(int delta); |
67 | |
68 | /** |
69 | * Changes the style of the current list or creates a new list with |
70 | * the specified style. |
71 | * |
72 | * @param styleIndex The QTextListStyle of the list. |
73 | */ |
74 | void handleOnBulletType(int styleIndex); |
75 | |
76 | /** |
77 | * @brief Check whether the current item in the list may be indented. |
78 | * |
79 | * An list item must have an item above it on the same or greater level |
80 | * if it can be indented. |
81 | * |
82 | * Also, a block which is currently part of a list can be indented. |
83 | * |
84 | * @sa canDedent |
85 | * |
86 | * @return Whether the item can be indented. |
87 | */ |
88 | bool canIndent() const; |
89 | |
90 | /** |
91 | * \brief Check whether the current item in the list may be dedented. |
92 | * |
93 | * An item may be dedented if it is part of a list. |
94 | * The next item must be at the same or lesser level. |
95 | * |
96 | * @sa canIndent |
97 | * |
98 | * @return Whether the item can be dedented. |
99 | */ |
100 | bool canDedent() const; |
101 | |
102 | private: |
103 | QTextCursor topOfSelection() const; |
104 | QTextCursor bottomOfSelection() const; |
105 | void processList(QTextList *list); |
106 | void reformatList(QTextBlock block); |
107 | void reformatList(); |
108 | |
109 | QTextEdit *const textEdit; |
110 | }; |
111 | |
112 | //@endcond |
113 | |
114 | #endif |
115 | |