comparison src/gui/widgets/text.cc @ 291:9a88e1725fd2

*: refactor lots of stuff I forgot to put this into different commits, oops! anyway, it doesn't really matter *that* much since this is an unfinished hobby project anyway. once it starts getting stable commit history will be more important, but for now it's not that big of a deal
author Paper <paper@paper.us.eu.org>
date Sun, 12 May 2024 16:31:07 -0400
parents 862d0d8619f6
children b82841e76e79
comparison
equal deleted inserted replaced
290:9347e2eaf6e5 291:9a88e1725fd2
4 #include <QDebug> 4 #include <QDebug>
5 #include <QFrame> 5 #include <QFrame>
6 #include <QLabel> 6 #include <QLabel>
7 #include <QTextBlock> 7 #include <QTextBlock>
8 #include <QVBoxLayout> 8 #include <QVBoxLayout>
9 #include <QScrollArea>
10 #include <QDebug>
11
12 /* WARNING: GARBAGE CODE FOLLOWS
13 *
14 * This file is filled with spaghetti to make this
15 * stupid text render how I want it to.
16 *
17 * many cases of hacking with setSizePolicy() are seen
18 * all around this file. Edit it only if really
19 * necessary, please.
20 */
9 21
10 namespace TextWidgets { 22 namespace TextWidgets {
11 23
12 Header::Header(const QString& title, QWidget* parent) : QWidget(parent) { 24 Header::Header(const QString& title, QWidget* parent)
25 : QWidget(parent)
26 , static_text_title(title) {
13 QVBoxLayout* layout = new QVBoxLayout(this); 27 QVBoxLayout* layout = new QVBoxLayout(this);
14 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum); 28 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
15 29
16 static_text_title = new QLabel(title, this); 30 static_text_title.setTextFormat(Qt::PlainText);
17 static_text_title->setTextFormat(Qt::PlainText);
18 31
19 { 32 {
20 QFont font = static_text_title->font(); 33 QFont font = static_text_title.font();
21 font.setWeight(QFont::Bold); 34 font.setWeight(QFont::Bold);
22 static_text_title->setFont(font); 35 static_text_title.setFont(font);
23 } 36 }
24 37
25 static_text_line = new QFrame(this); 38 static_text_line.setFrameShape(QFrame::HLine);
26 static_text_line->setFrameShape(QFrame::HLine); 39 static_text_line.setFrameShadow(QFrame::Sunken);
27 static_text_line->setFrameShadow(QFrame::Sunken); 40 static_text_line.setFixedHeight(2);
28 static_text_line->setFixedHeight(2); 41
29 42 layout->addWidget(&static_text_title);
30 layout->addWidget(static_text_title); 43 layout->addWidget(&static_text_line);
31 layout->addWidget(static_text_line);
32 layout->setSpacing(0); 44 layout->setSpacing(0);
33 layout->setContentsMargins(0, 0, 0, 0); 45 layout->setContentsMargins(0, 0, 0, 0);
34 } 46 }
35 47
36 void Header::SetText(const QString& text) { 48 void Header::SetText(const QString& text) {
37 static_text_title->setText(text); 49 static_text_title.setText(text);
38 updateGeometry(); 50 updateGeometry();
39 } 51 }
40 52
41 /* for now, this is a QLabel with a couple of default settings. 53 Paragraph::Paragraph(const QString& text, QWidget* parent) : QWidget(parent) {
42 * 54 /* meh */
43 * eventually I'll have to implement this as a QScrollArea, just in case 55 setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
44 * some random text decides to overflow or something. 56
45 */ 57 QVBoxLayout* layout = new QVBoxLayout(this);
46 Paragraph::Paragraph(const QString& text, QWidget* parent) : QLabel(text, parent) { 58 layout->setSpacing(0);
47 setTextInteractionFlags(Qt::TextBrowserInteraction); 59 layout->setContentsMargins(0, 0, 0, 0);
48 setFrameShape(QFrame::NoFrame); 60
49 setCursor(Qt::IBeamCursor); /* emulate Taiga */ 61 text_edit.setTextInteractionFlags(Qt::TextBrowserInteraction);
50 setWordWrap(true); 62 text_edit.setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
51 63 text_edit.setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);
52 setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Minimum); 64 text_edit.setStyleSheet("background: transparent;");
53 } 65
54 66 text_edit.document()->setDocumentMargin(0);
55 /* kept here for legacy reasons, see explanation above */ 67
68 SetText(text);
69
70 layout->addWidget(&text_edit);
71 }
72
56 void Paragraph::SetText(const QString& text) { 73 void Paragraph::SetText(const QString& text) {
57 setText(text); 74 text_edit.document()->setPlainText(text);
58 } 75
59 76 /* return the view to the start */
60 /* Equivalent to Paragraph(), but disables word wrap. */ 77 QTextCursor cursor = text_edit.textCursor();
61 Line::Line(QWidget* parent) : Paragraph("", parent) { 78 cursor.setPosition(0);
62 setWordWrap(false); 79 text_edit.setTextCursor(cursor);
63 } 80 }
64 81
65 Line::Line(const QString& text, QWidget* parent) : Paragraph(text, parent) { 82 QSize Paragraph::minimumSizeHint() const {
66 setWordWrap(false); 83 return QSize(0, 0);
67 } 84 }
68 85
69 /* legacy function, don't use in new code */ 86 /* highly based upon... some stackoverflow answer for PyQt */
87 QSize Paragraph::sizeHint() const {
88 QTextDocument* doc = text_edit.document();
89 doc->adjustSize();
90
91 long h = 0;
92 for (QTextBlock line = doc->begin(); line != doc->end(); line = line.next())
93 h += doc->documentLayout()->blockBoundingRect(line).height();
94
95 return QSize(doc->size().width(), h);
96 }
97
98 QPlainTextEdit* Paragraph::GetLabel() {
99 return &text_edit;
100 }
101
102 Line::Line(QWidget* parent) : QWidget(parent) {
103 QVBoxLayout* layout = new QVBoxLayout(this);
104 layout->setSpacing(0);
105 layout->setContentsMargins(0, 0, 0, 0);
106
107 line_edit_.setReadOnly(true);
108 line_edit_.setFrame(false);
109 line_edit_.setStyleSheet("background: transparent;");
110
111 layout->addWidget(&line_edit_);
112 }
113
114 Line::Line(const QString& text, QWidget* parent) : Line(parent) {
115 SetText(text);
116 }
117
70 void Line::SetText(const QString& text) { 118 void Line::SetText(const QString& text) {
71 setText(text); 119 line_edit_.setText(text);
120 line_edit_.setCursorPosition(0);
72 } 121 }
73 122
74 Title::Title(const QString& title, QWidget* parent) : Line(title, parent) { 123 Title::Title(const QString& title, QWidget* parent) : Line(title, parent) {
75 QFont fnt(font()); 124 QFont fnt(line_edit_.font());
76 fnt.setPixelSize(16); 125 fnt.setPixelSize(16);
77 setFont(fnt); 126 line_edit_.setFont(fnt);
78 127
79 QPalette pal(palette()); 128 line_edit_.setForegroundRole(QPalette::Highlight);
80 pal.setColor(QPalette::Text, pal.color(QPalette::Highlight)); 129 }
81 setPalette(pal); 130
82 } 131 Section::Section(const QString& title, const QString& data, QWidget* parent)
83 132 : QWidget(parent) {
84 Section::Section(const QString& title, const QString& data, QWidget* parent) : QWidget(parent) {
85 QVBoxLayout* layout = new QVBoxLayout(this); 133 QVBoxLayout* layout = new QVBoxLayout(this);
86 134
87 header = new Header(title, this); 135 header = new Header(title, this);
88 136
89 QWidget* content = new QWidget(this); 137 QWidget* content = new QWidget(this);
90 QHBoxLayout* content_layout = new QHBoxLayout(content); 138 QHBoxLayout* content_layout = new QHBoxLayout(content);
91 139
92 paragraph = new Paragraph(data, this); 140 paragraph = new Paragraph(data, this);
93 paragraph->setTextInteractionFlags(Qt::NoTextInteraction); 141 paragraph->GetLabel()->setTextInteractionFlags(Qt::NoTextInteraction);
94 paragraph->setAttribute(Qt::WidgetAttribute::WA_TransparentForMouseEvents); 142 paragraph->GetLabel()->setAttribute(Qt::WidgetAttribute::WA_TransparentForMouseEvents);
95 paragraph->setWordWrap(QTextOption::NoWrap); 143 paragraph->GetLabel()->setWordWrapMode(QTextOption::NoWrap);
96 144
97 content_layout->addWidget(paragraph); 145 content_layout->addWidget(paragraph);
98 content_layout->setSpacing(0); 146 content_layout->setSpacing(0);
99 content_layout->setContentsMargins(0, 0, 0, 0); 147 content_layout->setContentsMargins(0, 0, 0, 0);
100 content->setContentsMargins(12, 0, 0, 0); 148 content->setContentsMargins(12, 0, 0, 0);
111 159
112 Paragraph* Section::GetParagraph() { 160 Paragraph* Section::GetParagraph() {
113 return paragraph; 161 return paragraph;
114 } 162 }
115 163
116 LabelledParagraph::LabelledParagraph(const QString& label, const QString& data, QWidget* parent) : QWidget(parent) { 164 /* despite being named a "labelled paragraph" this uses QLabels for simplicity */
165 LabelledParagraph::LabelledParagraph(const QString& label, const QString& data, QWidget* parent)
166 : QWidget(parent)
167 , labels_(label)
168 , data_(data) {
117 QHBoxLayout* ly = new QHBoxLayout(this); 169 QHBoxLayout* ly = new QHBoxLayout(this);
118 170
119 labels = new Paragraph(label, this); 171 labels_.setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
120 labels->setTextInteractionFlags(Qt::NoTextInteraction); 172 data_.setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
121 labels->setAttribute(Qt::WidgetAttribute::WA_TransparentForMouseEvents); 173
122 labels->setWordWrap(QTextOption::NoWrap); 174 ly->addWidget(&labels_, 0, Qt::AlignTop);
123 labels->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Expanding); 175 ly->addWidget(&data_, 0, Qt::AlignTop);
124
125 paragraph = new Paragraph(data, this);
126 paragraph->setTextInteractionFlags(Qt::NoTextInteraction);
127 paragraph->setAttribute(Qt::WidgetAttribute::WA_TransparentForMouseEvents);
128 paragraph->setWordWrap(QTextOption::NoWrap);
129 paragraph->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Expanding);
130
131 ly->addWidget(labels, 0, Qt::AlignTop);
132 ly->addWidget(paragraph, 0, Qt::AlignTop);
133 ly->setSpacing(20); 176 ly->setSpacing(20);
134 ly->setContentsMargins(0, 0, 0, 0); 177 ly->setContentsMargins(0, 0, 0, 0);
135 } 178 }
136 179
137 Paragraph* LabelledParagraph::GetLabels() { 180 QLabel* LabelledParagraph::GetLabels() {
138 return labels; 181 return &labels_;
139 } 182 }
140 183
141 Paragraph* LabelledParagraph::GetParagraph() { 184 QLabel* LabelledParagraph::GetData() {
142 return paragraph; 185 return &data_;
186 }
187
188 QLabel* LabelledParagraph::GetParagraph() {
189 return GetData();
143 } 190 }
144 191
145 LabelledSection::LabelledSection(const QString& title, const QString& label, const QString& data, QWidget* parent) 192 LabelledSection::LabelledSection(const QString& title, const QString& label, const QString& data, QWidget* parent)
146 : QWidget(parent) { 193 : QWidget(parent) {
147 QVBoxLayout* layout = new QVBoxLayout(this); 194 QVBoxLayout* layout = new QVBoxLayout(this);
149 header = new Header(title, this); 196 header = new Header(title, this);
150 197
151 // this is not accessible from the object because there's really 198 // this is not accessible from the object because there's really
152 // no reason to make it accessible... 199 // no reason to make it accessible...
153 content = new LabelledParagraph(label, data, this); 200 content = new LabelledParagraph(label, data, this);
154 content->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Minimum); 201 content->setSizePolicy(QSizePolicy::Preferred, QSizePolicy::Maximum);
155 content->setContentsMargins(12, 0, 0, 0); 202 content->setContentsMargins(12, 0, 0, 0);
156 203
157 layout->addWidget(header); 204 layout->addWidget(header);
158 layout->addWidget(content); 205 layout->addWidget(content);
159 layout->setSpacing(0); 206 layout->setSpacing(0);
162 209
163 Header* LabelledSection::GetHeader() { 210 Header* LabelledSection::GetHeader() {
164 return header; 211 return header;
165 } 212 }
166 213
167 Paragraph* LabelledSection::GetLabels() { 214 QLabel* LabelledSection::GetLabels() {
168 return content->GetLabels(); 215 return content->GetLabels();
169 } 216 }
170 217
171 Paragraph* LabelledSection::GetParagraph() { 218 QLabel* LabelledSection::GetData() {
219 return content->GetData();
220 }
221
222 QLabel* LabelledSection::GetParagraph() {
172 return content->GetParagraph(); 223 return content->GetParagraph();
173 } 224 }
174 225
175 SelectableSection::SelectableSection(const QString& title, const QString& data, QWidget* parent) : QWidget(parent) { 226 SelectableSection::SelectableSection(const QString& title, const QString& data, QWidget* parent) : QWidget(parent) {
176 QVBoxLayout* layout = new QVBoxLayout(this); 227 QVBoxLayout* layout = new QVBoxLayout(this);