Mercurial > minori
comparison include/gui/widgets/text.h @ 348:6b0768158dcd
text: redesign almost every widget
i.e. Paragraph is now a QLabel, etc etc, some things will probably
break, idc
author | Paper <paper@paper.us.eu.org> |
---|---|
date | Tue, 25 Jun 2024 11:19:54 -0400 |
parents | b82841e76e79 |
children | f81bed4e04ac |
comparison
equal
deleted
inserted
replaced
347:a0aa8c8c4307 | 348:6b0768158dcd |
---|---|
2 #define MINORI_GUI_WIDGETS_TEXT_H_ | 2 #define MINORI_GUI_WIDGETS_TEXT_H_ |
3 | 3 |
4 #include <QLineEdit> | 4 #include <QLineEdit> |
5 #include <QPlainTextEdit> | 5 #include <QPlainTextEdit> |
6 #include <QSize> | 6 #include <QSize> |
7 #include <QString> | |
8 #include <QWidget> | 7 #include <QWidget> |
8 #include <QLabel> | |
9 #include <QVBoxLayout> | |
10 #include <QPointer> | |
9 | 11 |
10 class QFrame; | 12 #include <memory> |
11 | 13 #include <unordered_map> |
12 #include <QLabel> | |
13 | 14 |
14 namespace TextWidgets { | 15 namespace TextWidgets { |
16 | |
17 /* These used to have getter methods to get the real Qt widgets; | |
18 * don't make those anymore. Instead, add new methods that are | |
19 * wrappers around the Qt methods instead. */ | |
15 | 20 |
16 class Header : public QWidget { | 21 class Header : public QWidget { |
17 Q_OBJECT | 22 Q_OBJECT |
18 | 23 |
19 public: | 24 public: |
20 Header(const QString& title, QWidget* parent = nullptr); | 25 Header(QWidget* parent = nullptr); |
21 void SetText(const QString& title); | 26 void SetText(const std::string& title); |
22 | 27 |
23 private: | 28 protected: |
24 QLabel static_text_title; | 29 QPointer<QLabel> title_; |
25 QFrame static_text_line; | 30 QPointer<QFrame> separator_; |
26 }; | 31 }; |
27 | 32 |
33 /* This is a nice clean wrapper around Label suitable for our needs. */ | |
28 class Paragraph : public QWidget { | 34 class Paragraph : public QWidget { |
29 Q_OBJECT | 35 Q_OBJECT |
30 | 36 |
31 public: | 37 public: |
32 Paragraph(const QString& text, QWidget* parent = nullptr); | 38 Paragraph(QWidget* parent = nullptr); |
33 void SetText(const QString& text); | 39 void SetText(const std::string& text); |
34 QPlainTextEdit* GetLabel(); | 40 void SetSelectable(bool enable); |
41 void SetWordWrap(bool enable); | |
42 void SetElidingMode(bool enable); | |
35 | 43 |
36 protected: | 44 protected: |
37 bool hasHeightForWidth() const override; | 45 QPointer<QLabel> label_; |
38 int heightForWidth(int w) const override; | |
39 | |
40 private: | |
41 QPlainTextEdit text_edit; | |
42 }; | 46 }; |
43 | 47 |
48 /* This aligns data with labels */ | |
44 class LabelledParagraph final : public QWidget { | 49 class LabelledParagraph final : public QWidget { |
45 Q_OBJECT | 50 Q_OBJECT |
46 | 51 |
47 public: | 52 public: |
48 LabelledParagraph(const QString& label, const QString& data, QWidget* parent = nullptr); | 53 enum Style { |
49 QLabel* GetLabels(); | 54 BoldedLabels = (1 << 1), |
50 QLabel* GetData(); | 55 ElidedData = (1 << 2), /* does nothing for now */ |
56 }; | |
51 | 57 |
52 /* synonymous with GetData(), kept for compatibility. don't use in new code!!! */ | 58 LabelledParagraph(QWidget* parent = nullptr); |
53 QLabel* GetParagraph(); | 59 ~LabelledParagraph(); |
60 void SetData(const std::vector<std::pair<std::string, std::string>>& data); | |
61 void SetStyle(int style); /* bit-flags from Style enum */ | |
62 void Clear(void); | |
63 | |
64 protected: | |
65 QPointer<QWidget> contents_; | |
66 QPointer<QGridLayout> contents_layout_; | |
67 | |
68 std::vector<std::pair<QSharedPointer<QLabel>, QSharedPointer<QLabel>>> data_; | |
69 }; | |
70 | |
71 /* this is just a generic QLabel with a specific font and foreground role, | |
72 * which is why it's defined inline */ | |
73 class Title final : public Paragraph { | |
74 public: | |
75 Title(QWidget* parent = nullptr) : Paragraph(parent) { | |
76 QFont fnt(label_->font()); | |
77 fnt.setPixelSize(16); | |
78 label_->setFont(fnt); | |
79 | |
80 label_->setForegroundRole(QPalette::Highlight); | |
81 } | |
82 }; | |
83 | |
84 /* ----------------------------------------------------------------------- */ | |
85 /* Generic "Section" widget */ | |
86 | |
87 template<typename T> | |
88 class Section final : public QWidget { | |
89 public: | |
90 Section(QWidget* parent = nullptr) : QWidget(parent) { | |
91 header_ = new Header(this); | |
92 | |
93 content_container_ = new QWidget(this); | |
94 content_ = new T(content_container_); | |
95 | |
96 QVBoxLayout* content_layout = new QVBoxLayout(content_container_); | |
97 | |
98 content_layout->addWidget(content_); | |
99 content_layout->setSpacing(0); | |
100 content_layout->setContentsMargins(12, 0, 0, 0); | |
101 | |
102 content_container_->setContentsMargins(0, 0, 0, 0); | |
103 | |
104 content_container_->setLayout(content_layout); | |
105 | |
106 QVBoxLayout* layout = new QVBoxLayout(this); | |
107 | |
108 layout->addWidget(header_); | |
109 layout->addWidget(content_container_); | |
110 layout->setSpacing(0); | |
111 layout->setContentsMargins(0, 0, 0, 0); | |
112 | |
113 setLayout(layout); | |
114 } | |
115 | |
116 Header& GetHeader() { return *header_; } | |
117 T& GetContent() { return *content_; } | |
54 | 118 |
55 private: | 119 private: |
56 QLabel labels_; | 120 Header* header_; |
57 QLabel data_; | 121 T* content_; |
122 | |
123 /* I don't think making a separate container | |
124 * widget is necessary anymore, but I'm paranoid */ | |
125 QWidget* content_container_; | |
58 }; | 126 }; |
59 | 127 |
60 class Line : public QWidget { | 128 /* Old aliases used when the sections weren't templateized. |
61 Q_OBJECT | 129 * |
62 | 130 * These are kept to keep old code working and can largely |
63 public: | 131 * be ignored for anything new. |
64 Line(QWidget* parent = nullptr); | 132 * |
65 Line(const QString& text, QWidget* parent = nullptr); | 133 * SelectableSection is actually just a generic "long text" */ |
66 void SetText(const QString& text); | 134 using LabelledSection = Section<LabelledParagraph>; |
67 | 135 using SelectableSection = Section<Paragraph>; |
68 protected: | 136 using OneLineSection = Section<Paragraph>; |
69 QLineEdit line_edit_; | |
70 }; | |
71 | |
72 class Title final : public Line { | |
73 Q_OBJECT | |
74 | |
75 public: | |
76 Title(const QString& title, QWidget* parent = nullptr); | |
77 }; | |
78 | |
79 class Section final : public QWidget { | |
80 Q_OBJECT | |
81 | |
82 public: | |
83 Section(const QString& title, const QString& data, QWidget* parent = nullptr); | |
84 Header* GetHeader(); | |
85 Paragraph* GetParagraph(); | |
86 | |
87 private: | |
88 Header* header; | |
89 Paragraph* paragraph; | |
90 }; | |
91 | |
92 class LabelledSection final : public QWidget { | |
93 Q_OBJECT | |
94 | |
95 public: | |
96 LabelledSection(const QString& title, const QString& label, const QString& data, QWidget* parent = nullptr); | |
97 Header* GetHeader(); | |
98 QLabel* GetLabels(); | |
99 QLabel* GetData(); | |
100 QLabel* GetParagraph(); | |
101 | |
102 private: | |
103 Header* header; | |
104 LabelledParagraph* content; | |
105 }; | |
106 | |
107 class SelectableSection final : public QWidget { | |
108 Q_OBJECT | |
109 | |
110 public: | |
111 SelectableSection(const QString& title, const QString& data, QWidget* parent = nullptr); | |
112 Header* GetHeader(); | |
113 Paragraph* GetParagraph(); | |
114 | |
115 private: | |
116 Header* header; | |
117 Paragraph* paragraph; | |
118 }; | |
119 | |
120 class OneLineSection final : public QWidget { | |
121 Q_OBJECT | |
122 | |
123 public: | |
124 OneLineSection(const QString& title, const QString& data, QWidget* parent = nullptr); | |
125 Header* GetHeader(); | |
126 Line* GetLine(); | |
127 | |
128 private: | |
129 Header* header; | |
130 Line* line; | |
131 }; | |
132 | 137 |
133 } // namespace TextWidgets | 138 } // namespace TextWidgets |
134 | 139 |
135 #endif // MINORI_GUI_WIDGETS_TEXT_H_ | 140 #endif // MINORI_GUI_WIDGETS_TEXT_H_ |