mirror of
https://github.com/RGBCube/serenity
synced 2025-07-27 05:07:45 +00:00
LibGUI+Calendar: Inherit from Frame class
Fixes incorrect painting with variable thickness and cuts down on some layout boilerplate.
This commit is contained in:
parent
7d8d45e757
commit
14e074cd24
4 changed files with 46 additions and 62 deletions
|
@ -11,14 +11,7 @@
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@GUI::Frame {
|
|
||||||
name: "calendar_frame"
|
|
||||||
layout: @GUI::VerticalBoxLayout {
|
|
||||||
margins: [2, 2, 2, 2]
|
|
||||||
}
|
|
||||||
|
|
||||||
@GUI::Calendar {
|
@GUI::Calendar {
|
||||||
name: "calendar"
|
name: "calendar"
|
||||||
}
|
}
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -65,7 +65,6 @@ Calendar::Calendar(Core::DateTime date_time, Mode mode)
|
||||||
, m_mode(mode)
|
, m_mode(mode)
|
||||||
{
|
{
|
||||||
set_fill_with_background_color(true);
|
set_fill_with_background_color(true);
|
||||||
set_background_role(Gfx::ColorRole::ThreedShadow2);
|
|
||||||
|
|
||||||
for (int i = 0; i < 7; i++) {
|
for (int i = 0; i < 7; i++) {
|
||||||
Day day;
|
Day day;
|
||||||
|
@ -89,10 +88,9 @@ Calendar::~Calendar()
|
||||||
|
|
||||||
void Calendar::set_grid(bool show)
|
void Calendar::set_grid(bool show)
|
||||||
{
|
{
|
||||||
|
if (m_grid == show)
|
||||||
|
return;
|
||||||
m_grid = show;
|
m_grid = show;
|
||||||
set_background_role(has_grid()
|
|
||||||
? Gfx::ColorRole::ThreedShadow2
|
|
||||||
: Gfx::ColorRole::Base);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void Calendar::toggle_mode()
|
void Calendar::toggle_mode()
|
||||||
|
@ -108,8 +106,8 @@ void Calendar::toggle_mode()
|
||||||
|
|
||||||
void Calendar::resize_event(GUI::ResizeEvent& event)
|
void Calendar::resize_event(GUI::ResizeEvent& event)
|
||||||
{
|
{
|
||||||
m_event_size.set_width(event.size().width());
|
m_event_size.set_width(event.size().width() - (frame_thickness() * 2));
|
||||||
m_event_size.set_height(event.size().height());
|
m_event_size.set_height(event.size().height() - (frame_thickness() * 2));
|
||||||
|
|
||||||
if (mode() == Month) {
|
if (mode() == Month) {
|
||||||
if (m_event_size.width() < 160 || m_event_size.height() < 130)
|
if (m_event_size.width() < 160 || m_event_size.height() < 130)
|
||||||
|
@ -181,13 +179,10 @@ void Calendar::resize_event(GUI::ResizeEvent& event)
|
||||||
|
|
||||||
set_grid(false);
|
set_grid(false);
|
||||||
set_unadjusted_tile_size(tile_width, tile_height);
|
set_unadjusted_tile_size(tile_width, tile_height);
|
||||||
if (unadjusted_tile_size().width() < 17 || unadjusted_tile_size().height() < 13) {
|
if (unadjusted_tile_size().width() < 17 || unadjusted_tile_size().height() < 13)
|
||||||
m_show_month_tiles = true;
|
m_show_month_tiles = true;
|
||||||
set_background_role(Gfx::ColorRole::Window);
|
else
|
||||||
} else {
|
|
||||||
m_show_month_tiles = false;
|
m_show_month_tiles = false;
|
||||||
set_background_role(Gfx::ColorRole::Base);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (m_show_month_tiles) {
|
if (m_show_month_tiles) {
|
||||||
int month_tile_width = m_event_size.width() / 4;
|
int month_tile_width = m_event_size.width() / 4;
|
||||||
|
@ -377,9 +372,19 @@ String Calendar::formatted_date(Format format)
|
||||||
|
|
||||||
void Calendar::paint_event(GUI::PaintEvent& event)
|
void Calendar::paint_event(GUI::PaintEvent& event)
|
||||||
{
|
{
|
||||||
|
GUI::Frame::paint_event(event);
|
||||||
|
|
||||||
GUI::Painter painter(*this);
|
GUI::Painter painter(*this);
|
||||||
|
painter.add_clip_rect(frame_inner_rect());
|
||||||
painter.add_clip_rect(event.rect());
|
painter.add_clip_rect(event.rect());
|
||||||
|
|
||||||
|
if (has_grid())
|
||||||
|
painter.fill_rect(frame_inner_rect(), palette().threed_shadow2());
|
||||||
|
else
|
||||||
|
painter.fill_rect(frame_inner_rect(), palette().base());
|
||||||
|
|
||||||
|
painter.translate(frame_thickness(), frame_thickness());
|
||||||
|
|
||||||
int width = unadjusted_tile_size().width();
|
int width = unadjusted_tile_size().width();
|
||||||
int height = unadjusted_tile_size().height();
|
int height = unadjusted_tile_size().height();
|
||||||
int x_offset = 0;
|
int x_offset = 0;
|
||||||
|
@ -389,42 +394,32 @@ void Calendar::paint_event(GUI::PaintEvent& event)
|
||||||
auto year_only_rect = Gfx::IntRect(
|
auto year_only_rect = Gfx::IntRect(
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
event.rect().width(),
|
frame_inner_rect().width(),
|
||||||
22);
|
22);
|
||||||
y_offset += year_only_rect.height();
|
y_offset += year_only_rect.height();
|
||||||
painter.fill_rect(year_only_rect, palette().hover_highlight());
|
painter.fill_rect(year_only_rect, palette().hover_highlight());
|
||||||
painter.draw_text(year_only_rect, formatted_date(YearOnly), medium_font->bold_variant(), Gfx::TextAlignment::Center, palette().base_text());
|
painter.draw_text(year_only_rect, formatted_date(YearOnly), medium_font->bold_variant(), Gfx::TextAlignment::Center, palette().base_text());
|
||||||
painter.draw_line({ 0, y_offset }, { event.rect().width(), y_offset }, (!m_show_month_tiles ? palette().threed_shadow1() : palette().threed_shadow2()), 1);
|
painter.draw_line({ 0, y_offset }, { frame_inner_rect().width(), y_offset }, (!m_show_month_tiles ? palette().threed_shadow1() : palette().threed_shadow2()), 1);
|
||||||
y_offset += 1;
|
y_offset += 1;
|
||||||
if (!m_show_month_tiles) {
|
if (!m_show_month_tiles) {
|
||||||
painter.draw_line({ 0, y_offset }, { event.rect().width(), y_offset }, palette().threed_highlight(), 1);
|
painter.draw_line({ 0, y_offset }, { frame_inner_rect().width(), y_offset }, palette().threed_highlight(), 1);
|
||||||
y_offset += 1;
|
y_offset += 1;
|
||||||
}
|
}
|
||||||
} else if (is_showing_month_and_year()) {
|
} else if (is_showing_month_and_year()) {
|
||||||
auto month_year_rect = Gfx::IntRect(
|
auto month_year_rect = Gfx::IntRect(
|
||||||
0,
|
0,
|
||||||
0,
|
0,
|
||||||
event.rect().width(),
|
frame_inner_rect().width(),
|
||||||
22);
|
22);
|
||||||
painter.fill_rect(month_year_rect, palette().hover_highlight());
|
painter.fill_rect(month_year_rect, palette().hover_highlight());
|
||||||
auto month_rect = Gfx::IntRect(
|
month_year_rect.set_width(frame_inner_rect().width() / 2);
|
||||||
0,
|
painter.draw_text(month_year_rect, formatted_date(MonthOnly), medium_font->bold_variant(), Gfx::TextAlignment::Center, palette().base_text());
|
||||||
0,
|
month_year_rect.set_x(month_year_rect.width() + (frame_inner_rect().width() % 2 ? 1 : 0));
|
||||||
event.rect().width() / 2,
|
painter.draw_text(month_year_rect, formatted_date(YearOnly), medium_font->bold_variant(), Gfx::TextAlignment::Center, palette().base_text());
|
||||||
22);
|
y_offset += 22;
|
||||||
auto year_rect = Gfx::IntRect(
|
painter.draw_line({ 0, y_offset }, { frame_inner_rect().width(), y_offset }, palette().threed_shadow1(), 1);
|
||||||
event.rect().width() / 2,
|
|
||||||
0,
|
|
||||||
event.rect().width() / 2 + ((event.rect().width() % 2) ? 1 : 0),
|
|
||||||
22);
|
|
||||||
painter.fill_rect(month_rect, palette().hover_highlight());
|
|
||||||
painter.fill_rect(year_rect, palette().hover_highlight());
|
|
||||||
painter.draw_text(month_rect, formatted_date(MonthOnly), medium_font->bold_variant(), Gfx::TextAlignment::Center, palette().base_text());
|
|
||||||
painter.draw_text(year_rect, formatted_date(YearOnly), medium_font->bold_variant(), Gfx::TextAlignment::Center, palette().base_text());
|
|
||||||
y_offset += year_rect.height();
|
|
||||||
painter.draw_line({ 0, y_offset }, { event.rect().width(), y_offset }, palette().threed_shadow1(), 1);
|
|
||||||
y_offset += 1;
|
y_offset += 1;
|
||||||
painter.draw_line({ 0, y_offset }, { event.rect().width(), y_offset }, palette().threed_highlight(), 1);
|
painter.draw_line({ 0, y_offset }, { frame_inner_rect().width(), y_offset }, palette().threed_highlight(), 1);
|
||||||
y_offset += 1;
|
y_offset += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -440,7 +435,7 @@ void Calendar::paint_event(GUI::PaintEvent& event)
|
||||||
y_offset,
|
y_offset,
|
||||||
m_months[i].width,
|
m_months[i].width,
|
||||||
m_months[i].height);
|
m_months[i].height);
|
||||||
m_months[i].rect = month_tile_rect;
|
m_months[i].rect = month_tile_rect.translated(frame_thickness(), frame_thickness());
|
||||||
Gfx::StylePainter::paint_button(
|
Gfx::StylePainter::paint_button(
|
||||||
painter, month_tile_rect, palette(),
|
painter, month_tile_rect, palette(),
|
||||||
Gfx::ButtonStyle::Normal,
|
Gfx::ButtonStyle::Normal,
|
||||||
|
@ -460,21 +455,21 @@ void Calendar::paint_event(GUI::PaintEvent& event)
|
||||||
auto days_of_the_week_rect = Gfx::IntRect(
|
auto days_of_the_week_rect = Gfx::IntRect(
|
||||||
0,
|
0,
|
||||||
y_offset,
|
y_offset,
|
||||||
event.rect().width(),
|
frame_inner_rect().width(),
|
||||||
16);
|
16);
|
||||||
painter.fill_rect(days_of_the_week_rect, palette().hover_highlight());
|
painter.fill_rect(days_of_the_week_rect, palette().hover_highlight());
|
||||||
for (int i = 0; i < 7; i++) {
|
for (int i = 0; i < 7; i++) {
|
||||||
if (i > 0)
|
if (i > 0)
|
||||||
x_offset += m_days[i - 1].width + 1;
|
x_offset += m_days[i - 1].width + 1;
|
||||||
Gfx::IntRect day_rect = Gfx::IntRect(
|
Gfx::IntRect day_rect = Gfx::IntRect(
|
||||||
event.rect().x() + x_offset,
|
x_offset,
|
||||||
y_offset,
|
y_offset,
|
||||||
m_days[i].width,
|
m_days[i].width,
|
||||||
16);
|
16);
|
||||||
painter.draw_text(day_rect, m_days[i].name, small_font->bold_variant(), Gfx::TextAlignment::Center, palette().base_text());
|
painter.draw_text(day_rect, m_days[i].name, small_font->bold_variant(), Gfx::TextAlignment::Center, palette().base_text());
|
||||||
}
|
}
|
||||||
y_offset += days_of_the_week_rect.height();
|
y_offset += days_of_the_week_rect.height();
|
||||||
painter.draw_line({ 0, y_offset }, { event.rect().width(), y_offset }, palette().threed_shadow2(), 1);
|
painter.draw_line({ 0, y_offset }, { frame_inner_rect().width(), y_offset }, palette().threed_shadow2(), 1);
|
||||||
y_offset += 1;
|
y_offset += 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -492,7 +487,7 @@ void Calendar::paint_event(GUI::PaintEvent& event)
|
||||||
y_offset,
|
y_offset,
|
||||||
m_tiles[0][i].width,
|
m_tiles[0][i].width,
|
||||||
m_tiles[0][i].height);
|
m_tiles[0][i].height);
|
||||||
m_tiles[0][i].rect = tile_rect;
|
m_tiles[0][i].rect = tile_rect.translated(frame_thickness(), frame_thickness());
|
||||||
if (m_tiles[0][i].is_hovered || m_tiles[0][i].is_selected)
|
if (m_tiles[0][i].is_hovered || m_tiles[0][i].is_selected)
|
||||||
painter.fill_rect(tile_rect, palette().hover_highlight());
|
painter.fill_rect(tile_rect, palette().hover_highlight());
|
||||||
else
|
else
|
||||||
|
@ -541,7 +536,7 @@ void Calendar::paint_event(GUI::PaintEvent& event)
|
||||||
static int x_month_offset;
|
static int x_month_offset;
|
||||||
x_month_offset += (i > 0 ? m_month_size[i - 1].width() + 1 : 0);
|
x_month_offset += (i > 0 ? m_month_size[i - 1].width() + 1 : 0);
|
||||||
auto month_rect = Gfx::IntRect(
|
auto month_rect = Gfx::IntRect(
|
||||||
event.rect().x() + x_month_offset,
|
x_month_offset,
|
||||||
y_offset,
|
y_offset,
|
||||||
m_month_size[i].width(),
|
m_month_size[i].width(),
|
||||||
19);
|
19);
|
||||||
|
@ -555,7 +550,7 @@ void Calendar::paint_event(GUI::PaintEvent& event)
|
||||||
x_month_offset = 0;
|
x_month_offset = 0;
|
||||||
}
|
}
|
||||||
y_offset += 19;
|
y_offset += 19;
|
||||||
painter.draw_line({ 0, y_offset }, { event.rect().width(), y_offset }, palette().threed_shadow2(), 1);
|
painter.draw_line({ 0, y_offset }, { frame_inner_rect().width(), y_offset }, palette().threed_shadow2(), 1);
|
||||||
y_offset += 1;
|
y_offset += 1;
|
||||||
|
|
||||||
int x_translation = 0;
|
int x_translation = 0;
|
||||||
|
@ -570,16 +565,16 @@ void Calendar::paint_event(GUI::PaintEvent& event)
|
||||||
y_offset = y_translation;
|
y_offset = y_translation;
|
||||||
} else if (l == 4 || l == 8) {
|
} else if (l == 4 || l == 8) {
|
||||||
y_translation += m_month_size[l - 1].height();
|
y_translation += m_month_size[l - 1].height();
|
||||||
painter.draw_line({ 0, y_translation }, { event.rect().width(), y_translation }, palette().threed_shadow1(), 1);
|
painter.draw_line({ 0, y_translation }, { frame_inner_rect().width(), y_translation }, palette().threed_shadow1(), 1);
|
||||||
y_translation += 1;
|
y_translation += 1;
|
||||||
painter.draw_line({ 0, y_translation }, { event.rect().width(), y_translation }, palette().threed_highlight(), 1);
|
painter.draw_line({ 0, y_translation }, { frame_inner_rect().width(), y_translation }, palette().threed_highlight(), 1);
|
||||||
y_translation += 1;
|
y_translation += 1;
|
||||||
y_offset = y_translation;
|
y_offset = y_translation;
|
||||||
for (int i = l; i < (l == 4 ? 8 : 12); i++) {
|
for (int i = l; i < (l == 4 ? 8 : 12); i++) {
|
||||||
static int x_month_offset;
|
static int x_month_offset;
|
||||||
x_month_offset += (i > (l == 4 ? 4 : 8) ? m_month_size[i - 1].width() + 1 : 0);
|
x_month_offset += (i > (l == 4 ? 4 : 8) ? m_month_size[i - 1].width() + 1 : 0);
|
||||||
auto month_rect = Gfx::IntRect(
|
auto month_rect = Gfx::IntRect(
|
||||||
event.rect().x() + x_month_offset,
|
x_month_offset,
|
||||||
y_offset,
|
y_offset,
|
||||||
m_month_size[i].width(),
|
m_month_size[i].width(),
|
||||||
19);
|
19);
|
||||||
|
@ -593,7 +588,7 @@ void Calendar::paint_event(GUI::PaintEvent& event)
|
||||||
x_month_offset = 0;
|
x_month_offset = 0;
|
||||||
}
|
}
|
||||||
y_translation += 19;
|
y_translation += 19;
|
||||||
painter.draw_line({ 0, y_translation }, { event.rect().width(), y_translation }, palette().threed_shadow2(), 1);
|
painter.draw_line({ 0, y_translation }, { frame_inner_rect().width(), y_translation }, palette().threed_shadow2(), 1);
|
||||||
y_translation += 1;
|
y_translation += 1;
|
||||||
y_offset = y_translation;
|
y_offset = y_translation;
|
||||||
}
|
}
|
||||||
|
@ -618,7 +613,7 @@ void Calendar::paint_event(GUI::PaintEvent& event)
|
||||||
y_offset,
|
y_offset,
|
||||||
m_tiles[l][i].width,
|
m_tiles[l][i].width,
|
||||||
m_tiles[l][i].height);
|
m_tiles[l][i].height);
|
||||||
m_tiles[l][i].rect = tile_rect;
|
m_tiles[l][i].rect = tile_rect.translated(frame_thickness(), frame_thickness());
|
||||||
|
|
||||||
if (m_tiles[l][i].is_hovered || m_tiles[l][i].is_selected)
|
if (m_tiles[l][i].is_hovered || m_tiles[l][i].is_selected)
|
||||||
painter.fill_rect(tile_rect, palette().hover_highlight());
|
painter.fill_rect(tile_rect, palette().hover_highlight());
|
||||||
|
|
|
@ -34,7 +34,7 @@
|
||||||
|
|
||||||
namespace GUI {
|
namespace GUI {
|
||||||
|
|
||||||
class Calendar final : public GUI::Widget {
|
class Calendar final : public GUI::Frame {
|
||||||
C_OBJECT(Calendar)
|
C_OBJECT(Calendar)
|
||||||
|
|
||||||
public:
|
public:
|
||||||
|
|
|
@ -139,15 +139,11 @@ ClockWidget::ClockWidget()
|
||||||
auto& separator1 = root_container.add<GUI::HorizontalSeparator>();
|
auto& separator1 = root_container.add<GUI::HorizontalSeparator>();
|
||||||
separator1.set_fixed_height(2);
|
separator1.set_fixed_height(2);
|
||||||
|
|
||||||
auto& calendar_frame_container = root_container.add<GUI::Widget>();
|
auto& calendar_container = root_container.add<GUI::Widget>();
|
||||||
calendar_frame_container.set_layout<GUI::HorizontalBoxLayout>();
|
calendar_container.set_layout<GUI::HorizontalBoxLayout>();
|
||||||
calendar_frame_container.layout()->set_margins({ 4, 4, 5, 4 });
|
calendar_container.layout()->set_margins({ 4, 4, 5, 4 });
|
||||||
|
|
||||||
auto& calendar_frame = calendar_frame_container.add<GUI::Frame>();
|
m_calendar = calendar_container.add<GUI::Calendar>();
|
||||||
calendar_frame.set_layout<GUI::VerticalBoxLayout>();
|
|
||||||
calendar_frame.layout()->set_margins({ 2, 2, 2, 2 });
|
|
||||||
|
|
||||||
m_calendar = calendar_frame.add<GUI::Calendar>();
|
|
||||||
m_selected_calendar_button->set_text(m_calendar->formatted_date());
|
m_selected_calendar_button->set_text(m_calendar->formatted_date());
|
||||||
|
|
||||||
m_calendar->on_tile_click = [&] {
|
m_calendar->on_tile_click = [&] {
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue