农历日历 v1.0.4
载入中...
搜索中...
未找到
LunarCalendarDelegate.cpp
1
6#include "LunarCalendarDelegate.h"
7#include "LunarCalendarModel.h"
8#include <QPainter>
9#include <QApplication>
10#include <QTableView>
11#include <QHeaderView>
12#include <QPalette>
13#include <QLoggingCategory>
14#include <QColor>
15#include <QFont>
16#include <QFontInfo>
17#include <QFontMetrics>
18
19static Q_LOGGING_CATEGORY(Logger, "Rabbit.LunarCalendar.Delegate")
20
21QColor GetColorRole(const QPalette &palette, int role)
22{
23 switch (role) {
24 case CLunarCalendarModel::_COLOR_ROLE::ColorNormal:
25 return palette.color(QPalette::Active, QPalette::Text);
26 case CLunarCalendarModel::_COLOR_ROLE::ColorDisable:
27 return palette.color(QPalette::Disabled, QPalette::Text);
28 case CLunarCalendarModel::_COLOR_ROLE::ColorHighlight:
29 return palette.color(QPalette::Active, QPalette::Highlight);
30 case CLunarCalendarModel::_COLOR_ROLE::ColorRed:
31 return QColor(255, 0, 0);
32 }
33 return QColor();
34}
35
36QFont GetFontRole(QFont &font, int role)
37{
38 switch (role) {
39 case CLunarCalendarModel::_FONT_ROLE::FontBold:
40 font.setBold(true);
41 break;
42 case CLunarCalendarModel::_FONT_ROLE::FontNormal:
43 font.setBold(false);
44 break;
45 }
46 return font;
47}
48
49CLunarCalendarDelegate::CLunarCalendarDelegate(QObject *parent)
50 : QStyledItemDelegate (parent)
51{}
52
54void CLunarCalendarDelegate::paint(QPainter *painter,
55 const QStyleOptionViewItem &o,
56 const QModelIndex &index) const
57{
58 QStyleOptionViewItem option = o;
59 //initStyleOption(&option, index);
60 //qDebug(Logger) << "Option:" << option << o;
61 //qDebug(Logger) << "Option.text:" << o.text;
62
63 QPalette palette = option.palette; // QApplication::style()->standardPalette();
64 QColor solarColor, lunarColor, tasksColor, taskNumberColor, workColor;
65
66 QTableView *pView = dynamic_cast<QTableView*>(option.styleObject);
67 if(!pView)
68 {
69 qCritical(Logger) << "The style object is null";
70 return;
71 }
72 // CLunarCalendarModel* pModel = dynamic_cast<CLunarCalendarModel*>(pView->model());
73 // if(!pModel)
74 // {
75 // qCritical(Logger) << "The model is null";
76 // return;
77 // }
78
79 bool bSolar = index.data(CLunarCalendarModel::ROLE::CalendarTypeRole).toInt()
81 bool bLunar = index.data(CLunarCalendarModel::ROLE::CalendarTypeRole).toInt()
83
84 QFont fontSolar = option.font;
85 QFont fontLunar = option.font;
86 QFont fontTasks = option.font;
87 QFont fontWork = option.font;
88
89 if(-1 != fontWork.pointSize())
90 fontWork.setPointSizeF(fontWork.pointSize() >> 1);
91 if(-1 != fontWork.pixelSize())
92 fontWork.setPixelSize(fontWork.pixelSize() >> 1);
93 if(-1 != fontTasks.pointSize())
94 fontTasks.setPointSizeF(fontTasks.pointSize() >> 1);
95 if(-1 != fontTasks.pixelSize())
96 fontTasks.setPixelSize(fontTasks.pixelSize() >> 1);
97
98 QString szSolar, szLunar, szWork;
99 uint nTasks = index.data(CLunarCalendarModel::ROLE::Tasks).toUInt();
100 szWork = index.data(CLunarCalendarModel::ROLE::WorkDayRole).toString();
101
102 int solarHeight = 0;
103 int solarWidth = 0;
104 int lunarHeight = 0;
105 int lunarWidth = 0;
106 int taskHeight = 0;
107 int taskWidth = 0;
108 int width = 0;
109 int height = 0;
110 int nRow = 0;
111 int nHadRow = 0;
112
113 painter->save();
114
115 if(bSolar)
116 {
117 fontSolar = GetFontRole(fontSolar,
118 index.data(CLunarCalendarModel::ROLE::SolarFontRole).toInt());
119 szSolar = index.data(CLunarCalendarModel::ROLE::SolarRole).toString();
120
121 painter->setFont(fontSolar);
122 QFontMetrics m = painter->fontMetrics();
123 solarHeight = m.height();
124#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
125 solarWidth = m.horizontalAdvance(szSolar);
126#else
127 solarWidth = m.width(szSolar);
128#endif
129 width = qMax(width, solarWidth);
130 height = qMax(height, solarHeight);
131 nRow++;
132 }
133
134 if(bLunar)
135 {
136 fontLunar = GetFontRole(fontLunar,
137 index.data(CLunarCalendarModel::ROLE::LunarFontRole).toInt());
138 szLunar = index.data(CLunarCalendarModel::ROLE::LunarRole).toString();
139 if(szLunar.length() > 3)
140 {
141 szLunar = szLunar.left(2) + "...";
142 }
143 painter->setFont(fontLunar);
144 QFontMetrics m = painter->fontMetrics();
145 lunarHeight = m.height();
146#if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
147 lunarWidth = m.horizontalAdvance(szLunar);
148#else
149 lunarWidth = m.width(szLunar);
150#endif
151
152 width = qMax(width, lunarWidth);
153 height = qMax(height, lunarHeight);
154 nRow++;
155 }
156
157 // 顶行(中国节假日,任务)
158 if(bSolar || bLunar)
159 {
160 taskHeight = height;
161 taskWidth = width;
162 nRow++;
163 }
164
165 if(pView->horizontalHeader()->minimumSectionSize() < width)
166 {
167 //qDebug(Logger) << "Set pView->horizontalHeader()->minimumSectionSize() =" << width;
168 pView->horizontalHeader()->setMinimumSectionSize(width);
169 pView->updateGeometry();
170 //qDebug(Logger) << "Set pView->horizontalHeader()->minimumSectionSize() ok";
171 }
172 /*
173 qDebug(Logger) << "pView->horizontalHeader()->minimumSectionSize():"
174 << pView->horizontalHeader()->minimumSectionSize();//*/
175 if(pView->verticalHeader()->minimumSectionSize() < nRow * height)
176 {
177 //qDebug(Logger) << "Set pView->verticalHeader()->minimumSectionSize() =" << nRow * height;
178 pView->verticalHeader()->setMinimumSectionSize(nRow * height);
179 pView->updateGeometry();
180 //qDebug(Logger) << "Set pView->verticalHeader()->minimumSectionSize() ok";
181 }
182 /*
183 qDebug(Logger) << "pView->verticalHeader()->minimumSectionSize():"
184 << pView->verticalHeader()->minimumSectionSize();//*/
185
186 if(option.rect.width() > width)
187 width = option.rect.width();
188 if(option.rect.height() > height * nRow && nRow)
189 height = option.rect.height() / nRow;
190
191 // 是今日
192 if(index.data(CLunarCalendarModel::ROLE::TodayRole).toBool())
193 {
194 painter->setPen(palette.brush(QPalette::Active, QPalette::Highlight).color());
195 //painter->drawEllipse(option.rect);
196 painter->drawRect(option.rect.adjusted(1, 1, -1, -1));
197 }
198
199 // 是当前选择,反显字体
200 if(pView->currentIndex() == index)
201 {
202 painter->setPen(QPen(Qt::NoPen));
203 painter->setBrush(palette.brush(QPalette::Active, QPalette::Highlight));
204 painter->drawRect(option.rect);
205
206 solarColor = palette.color(QPalette::Active, QPalette::HighlightedText);
207 lunarColor = solarColor;
208 tasksColor = solarColor;
209 taskNumberColor = palette.color(QPalette::Active, QPalette::Highlight);
210 workColor = solarColor;
211 }
212 else
213 {
214 if(bSolar)
215 solarColor = GetColorRole(palette,
216 index.data(CLunarCalendarModel::ROLE::SolarColorRole).toInt());
217 if(bLunar)
218 lunarColor = GetColorRole(palette,
219 index.data(CLunarCalendarModel::ROLE::LunarColorRole).toInt());
220// qDebug(Logger) << "Color:" << solarColor << index.data(CLunarCalendarModel::SolarColorRole).toInt()
221// << lunarColor << index.data(CLunarCalendarModel::LunarColorRole).toInt();
222
223 tasksColor = GetColorRole(palette,
224 index.data(CLunarCalendarModel::ROLE::TasksColorRole).toInt());
225 if(CLunarCalendarModel::_COLOR_ROLE::ColorHighlight
226 == index.data(CLunarCalendarModel::ROLE::TasksColorRole))
227 taskNumberColor
228 = palette.color(QPalette::Active, QPalette::HighlightedText);
229 else
230 taskNumberColor = GetColorRole(palette, CLunarCalendarModel::_COLOR_ROLE::ColorNormal);
231
232 workColor = GetColorRole(palette,
233 index.data(CLunarCalendarModel::ROLE::WorkDayColorRole).toInt());
234 }
235
236 if(!szWork.isEmpty() && bSolar)
237 {
238 painter->setFont(fontWork);
239 painter->setPen(workColor);
240 painter->drawText(option.rect.left(),
241 option.rect.top(),
242 width,
243 height,
244 Qt::AlignLeft| Qt::AlignTop,
245 szWork);
246 }
247
248 if(nTasks && (bSolar || bLunar))
249 {
250 painter->setFont(fontTasks);
251 int h = qMin(taskHeight, taskWidth) >> 1;
252 painter->setBrush(QBrush(tasksColor, Qt::SolidPattern));
253 painter->setPen(tasksColor);
254
255 QRect rect(option.rect.left() + (width - h) / 2,
256 option.rect.top() + (height - h) / 2,
257 h, h);
258 //painter->drawArc(rect, 0, 5760);//*/
259
260 painter->drawEllipse(rect);//*/
261
262 /*
263 if(nTasks > 0 && nTasks < 10)
264 {
265 painter->setPen(taskNumberColor);
266 painter->drawText(option.rect.left(),
267 option.rect.top(),
268 width,
269 height,
270 Qt::AlignHCenter | Qt::AlignVCenter,
271 QString::number(nTasks));
272 }//*/
273 }
274
275 if(bSolar || bLunar)
276 nHadRow++; // 第一行(中国节假日,任务)
277
278 if(bSolar)
279 {
280 painter->setFont(fontSolar);
281 painter->setPen(solarColor);
282 painter->drawText(option.rect.left(),
283 option.rect.top() + height * nHadRow,
284 width,
285 height,
286 Qt::AlignHCenter | Qt::AlignVCenter,
287 szSolar);
288 nHadRow++;
289 }
290
291 if(bLunar)
292 {
293 painter->setFont(fontLunar);
294 painter->setPen(lunarColor);
295 painter->drawText(option.rect.left(),
296 option.rect.top() + height * nHadRow,
297 width,
298 height,
299 Qt::AlignHCenter | Qt::AlignVCenter,
300 szLunar);
301 }
302
303 painter->restore();
304}
305
306CLunarCalendarHeaderDelegate::CLunarCalendarHeaderDelegate(QObject *parent)
307 : QStyledItemDelegate (parent)
308{}
309
310void CLunarCalendarHeaderDelegate::paint(QPainter *painter,
311 const QStyleOptionViewItem &option,
312 const QModelIndex &index) const
313{
314 QStyleOptionViewItem o = option;
315 //initStyleOption(&o, index);
316 qDebug(Logger) << "Option:" << option << o;
317 qDebug(Logger) << "Option.text:" << o.text;
318 QPalette palette = o.palette;
319 QColor color = GetColorRole(palette,
320 index.data(CLunarCalendarModel::ROLE::SolarColorRole).toInt());
321 QString szText = index.data(Qt::DisplayRole).toString();
322
323 painter->save();
324 painter->setFont(o.font);
325 painter->setPen(color);
326
327 QFontMetrics m = painter->fontMetrics();
328 QPoint pos;
329 pos.setX(option.rect.left()
330 + ((option.rect.width() -
331 #if QT_VERSION >= QT_VERSION_CHECK(5, 11, 0)
332 m.horizontalAdvance(szText)) >> 1
333 #else
334 m.width(szText)) >> 1
335 #endif
336 ));
337 pos.setY(option.rect.top() + ((option.rect.height() - m.height()) >> 1));
338 painter->drawText(pos, szText);
339 painter->restore();
340}
virtual void paint(QPainter *painter, const QStyleOptionViewItem &o, const QModelIndex &index) const override