diff --git a/changelog.md b/changelog.md index 238d334d3..bbfba9d7a 100644 --- a/changelog.md +++ b/changelog.md @@ -27,6 +27,7 @@ ### Changed * `[messages]` Split SMS thread for a specific contact into separate ones if multiple phone numbers are available. +* `[gui][renderer]` Shape rendering refactored. ### Fixed diff --git a/module-apps/application-antenna/windows/ScanModesWindow.cpp b/module-apps/application-antenna/windows/ScanModesWindow.cpp index ab4532583..938d52951 100644 --- a/module-apps/application-antenna/windows/ScanModesWindow.cpp +++ b/module-apps/application-antenna/windows/ScanModesWindow.cpp @@ -57,7 +57,7 @@ namespace gui modesBox = new gui::VBox(this, style::window::default_left_margin, (uint32_t)title->offset_h(), w, h); modesBox->setPenWidth(0); modesBox->setPenFocusWidth(0); - modesBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + modesBox->setEdges(gui::RectangleEdge::None); for (auto el : modeButtonParams) { gui::Label *modeLabel = addMode(nullptr, el.second); @@ -134,7 +134,7 @@ namespace gui antenna::scan_mode_window::commonDefaultPos, antenna::scan_mode_window::buttonW, antenna::scan_mode_window::commonSpacerH); - label->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + label->setEdges(gui::RectangleEdge::None); label->setFilled(false); label->activeItem = false; label->visible = false; diff --git a/module-apps/application-calendar/widgets/AllEventsItem.cpp b/module-apps/application-calendar/widgets/AllEventsItem.cpp index 66dfabd33..6813e0de6 100644 --- a/module-apps/application-calendar/widgets/AllEventsItem.cpp +++ b/module-apps/application-calendar/widgets/AllEventsItem.cpp @@ -15,13 +15,13 @@ namespace gui setMargins(gui::Margins(0, style::margins::big, 0, 0)); hBox = new gui::HBox(this, 0, 0, 0, 0); - hBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + hBox->setEdges(gui::RectangleEdge::None); startTime = new gui::Label(hBox, 0, 0, 0, 0); startTime->setMinimumSize(style::window::calendar::item::allEvents::start_time_min_w, style::window::label::big_h); startTime->setMaximumSize(style::window::default_body_width, style::window::label::big_h); - startTime->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + startTime->setEdges(gui::RectangleEdge::None); startTime->setFont(style::window::font::small); startTime->setAlignment(gui::Alignment{gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center}); startTime->setMargins(gui::Margins(style::margins::small, 0, 0, 0)); @@ -29,7 +29,7 @@ namespace gui description = new gui::Label(hBox, 0, 0, 0, 0); description->setMinimumSize(style::window::calendar::item::allEvents::description_w, style::window::label::big_h); - description->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + description->setEdges(gui::RectangleEdge::None); description->setFont(style::window::font::bigbold); description->setAlignment(gui::Alignment{gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center}); } @@ -48,7 +48,7 @@ namespace gui description->setMinimumSize(0, 0); startTime->setLineMode(true); activeItem = false; - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); } UTF8 AllEventsItem::getLabelMarker() const diff --git a/module-apps/application-calendar/widgets/CheckBoxWithLabelItem.cpp b/module-apps/application-calendar/widgets/CheckBoxWithLabelItem.cpp index e59154c21..686e00b36 100644 --- a/module-apps/application-calendar/widgets/CheckBoxWithLabelItem.cpp +++ b/module-apps/application-calendar/widgets/CheckBoxWithLabelItem.cpp @@ -19,10 +19,10 @@ namespace gui setMinimumSize(style::window::default_body_width, style::window::calendar::item::checkBox::height); setMargins(gui::Margins(style::margins::small, style::window::calendar::item::checkBox::margin_top, 0, 0)); - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); hBox = new gui::HBox(this, 0, 0, 0, 0); - hBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + hBox->setEdges(gui::RectangleEdge::None); if (checkIsOnLeftBarSide) { checkBox = new gui::CheckBox( @@ -58,7 +58,7 @@ namespace gui descriptionLabel->setMinimumSize(style::window::calendar::item::checkBox::description_label_w, style::window::calendar::item::checkBox::height); descriptionLabel->setMargins(gui::Margins(style::margins::very_big, 0, 0, 0)); - descriptionLabel->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + descriptionLabel->setEdges(gui::RectangleEdge::None); descriptionLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); descriptionLabel->setFont(style::window::font::medium); descriptionLabel->activeItem = false; diff --git a/module-apps/application-calendar/widgets/DayEventsItem.cpp b/module-apps/application-calendar/widgets/DayEventsItem.cpp index 1589f4fac..9d259c7ca 100644 --- a/module-apps/application-calendar/widgets/DayEventsItem.cpp +++ b/module-apps/application-calendar/widgets/DayEventsItem.cpp @@ -14,17 +14,17 @@ namespace gui setMargins(gui::Margins(0, style::margins::small, 0, 0)); vBox = new gui::VBox(this, 0, 0, 0, 0); - vBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + vBox->setEdges(gui::RectangleEdge::None); hBox = new gui::HBox(vBox, 0, 0, 0, 0); hBox->setMinimumSize(style::window::default_body_width, style::window::calendar::item::dayEvents::box_height); hBox->setMargins(gui::Margins(0, style::margins::small + style::margins::big, 0, 0)); - hBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + hBox->setEdges(gui::RectangleEdge::None); title = new gui::Label(hBox, 0, 0, 0, 0); title->setMinimumSize(style::window::calendar::item::dayEvents::title_w, style::window::calendar::item::dayEvents::box_height); title->setMargins(gui::Margins(style::margins::small, 0, style::margins::small + style::margins::big, 0)); - title->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + title->setEdges(gui::RectangleEdge::None); title->setFont(style::window::font::bigbold); title->setAlignment(gui::Alignment{gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center}); @@ -35,7 +35,7 @@ namespace gui description->setMinimumSize(style::window::default_body_width, style::window::calendar::item::dayEvents::box_height); description->setMargins(gui::Margins(style::margins::small, style::margins::big, 0, style::margins::very_big)); - description->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + description->setEdges(gui::RectangleEdge::None); description->setFont(style::window::font::medium); description->setAlignment(gui::Alignment{gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center}); } diff --git a/module-apps/application-calendar/widgets/DayLabel.cpp b/module-apps/application-calendar/widgets/DayLabel.cpp index 0701f39f5..7c4b81888 100644 --- a/module-apps/application-calendar/widgets/DayLabel.cpp +++ b/module-apps/application-calendar/widgets/DayLabel.cpp @@ -16,14 +16,14 @@ namespace gui bool isDayEmpty) : Rect(parent, 0, 0, width, height) { - this->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + this->setEdges(RectangleEdge::None); this->vBox = new gui::VBox(this, 0, 0, 0, 0); - this->vBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + this->vBox->setEdges(gui::RectangleEdge::None); this->dayNumber = new gui::Label(this->vBox, 0, 0, 0, 0); this->dayNumber->setMinimumSize(width, height - 22); - this->dayNumber->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + this->dayNumber->setEdges(RectangleEdge::None); this->dayNumber->setAlignment( gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); this->dayNumber->setMargins(gui::Margins(0, 11, 0, 0)); @@ -78,7 +78,7 @@ namespace gui }; this->setPenWidth(style::window::default_border_no_focus_w); this->setPenFocusWidth(style::window::default_border_focus_w); - this->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_TOP | RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + this->setEdges(RectangleEdge::Top | RectangleEdge::Bottom); } } diff --git a/module-apps/application-calendar/widgets/EventDetailDescriptionItem.cpp b/module-apps/application-calendar/widgets/EventDetailDescriptionItem.cpp index cbb053e7a..f61ab649a 100644 --- a/module-apps/application-calendar/widgets/EventDetailDescriptionItem.cpp +++ b/module-apps/application-calendar/widgets/EventDetailDescriptionItem.cpp @@ -10,17 +10,17 @@ namespace gui EventDetailDescriptionItem::EventDetailDescriptionItem() { - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); setMinimumSize(style::window::default_body_width, style::window::calendar::item::eventDetail::height_min); setMaximumSize(style::window::default_body_width, style::window::calendar::item::eventDetail::height_max); setMargins(gui::Margins(style::margins::small, style::window::calendar::item::eventDetail::margin_top, 0, 0)); vBox = new VBox(this, 0, 0, 0, 0); - vBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + vBox->setEdges(RectangleEdge::None); title = new gui::Label(vBox, 0, 0, 0, 0); title->setMinimumSize(style::window::default_body_width, style::window::calendar::item::eventDetail::title_h); - title->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + title->setEdges(RectangleEdge::None); title->setFont(style::window::font::small); title->setAlignment(gui::Alignment{gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center}); title->setLineMode(true); @@ -29,7 +29,7 @@ namespace gui eventTime = new gui::Label(vBox, 0, 0, 0, 0); eventTime->setMinimumSize(style::window::default_body_width, style::window::calendar::item::eventDetail::label_h); - eventTime->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + eventTime->setEdges(RectangleEdge::None); eventTime->setMargins( gui::Margins(0, style::window::calendar::item::eventDetail::event_time_margin, 0, style::margins::small)); eventTime->setFont(style::window::font::bigbold); @@ -39,7 +39,7 @@ namespace gui description = new gui::Text(vBox, 0, 0, 0, 0); description->setMinimumSize(style::window::default_body_width, style::window::calendar::item::eventDetail::label_h); - description->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + description->setEdges(RectangleEdge::None); description->setMaximumSize(style::window::default_body_width, 2 * style::window::calendar::item::eventDetail::label_h); description->setFont(style::window::font::big); diff --git a/module-apps/application-calendar/widgets/EventTimeItem.cpp b/module-apps/application-calendar/widgets/EventTimeItem.cpp index f538bc4f1..d76e5007b 100644 --- a/module-apps/application-calendar/widgets/EventTimeItem.cpp +++ b/module-apps/application-calendar/widgets/EventTimeItem.cpp @@ -17,17 +17,17 @@ namespace gui { setMinimumSize(style::window::default_body_width, style::window::calendar::item::eventTime::height); - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); setMargins(gui::Margins(style::margins::small, style::window::calendar::item::eventTime::margin, 0, 0)); vBox = new gui::VBox(this, 0, 0, 0, 0); - vBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + vBox->setEdges(gui::RectangleEdge::None); vBox->activeItem = false; descriptionLabel = new gui::Label(vBox, 0, 0, 0, 0); descriptionLabel->setMinimumSize(style::window::default_body_width, style::window::calendar::item::eventTime::separator); - descriptionLabel->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + descriptionLabel->setEdges(gui::RectangleEdge::None); descriptionLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); descriptionLabel->setFont(style::window::font::small); descriptionLabel->activeItem = false; @@ -36,11 +36,11 @@ namespace gui hBox->setMinimumSize(style::window::default_body_width, style::window::calendar::item::eventTime::height - style::window::calendar::item::eventTime::separator); - hBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + hBox->setEdges(gui::RectangleEdge::None); hBox->activeItem = false; hourInput = new gui::Text(hBox, 0, 0, 0, 0); - hourInput->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + hourInput->setEdges(gui::RectangleEdge::Bottom); hourInput->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); hourInput->setFont(style::window::font::largelight); hourInput->setInputMode(new InputMode({InputMode::digit})); @@ -52,14 +52,14 @@ namespace gui colonLabel->setMinimumSize(style::window::calendar::item::eventTime::separator, style::window::calendar::item::eventTime::height - style::window::calendar::item::eventTime::separator); - colonLabel->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + colonLabel->setEdges(gui::RectangleEdge::None); colonLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); colonLabel->setFont(style::window::font::medium); colonLabel->setText(":"); colonLabel->activeItem = false; minuteInput = new gui::Text(hBox, 0, 0, 0, 0); - minuteInput->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + minuteInput->setEdges(gui::RectangleEdge::Bottom); minuteInput->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); minuteInput->setFont(style::window::font::largelight); minuteInput->setInputMode(new InputMode({InputMode::digit})); @@ -216,7 +216,7 @@ namespace gui { if (!mode24H) { mode12hInput = new gui::Label(hBox, 0, 0, 0, 0); - mode12hInput->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + mode12hInput->setEdges(gui::RectangleEdge::Bottom); mode12hInput->setAlignment( gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); mode12hInput->setFont(style::window::font::largelight); diff --git a/module-apps/application-calendar/widgets/RepeatAndReminderItem.cpp b/module-apps/application-calendar/widgets/RepeatAndReminderItem.cpp index 38dfdd98b..191e95bc1 100644 --- a/module-apps/application-calendar/widgets/RepeatAndReminderItem.cpp +++ b/module-apps/application-calendar/widgets/RepeatAndReminderItem.cpp @@ -10,28 +10,28 @@ namespace gui RepeatAndReminderItem::RepeatAndReminderItem(app::ApplicationCalendar *application) : app(application) { activeItem = false; - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); setMinimumSize(style::window::default_body_width, style::window::calendar::item::repeatAndReminder::height); hBox = new HBox(this, 0, 0, 0, 0); - hBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + hBox->setEdges(RectangleEdge::None); repeatVBox = new VBox(hBox, 0, 0, 0, 0); repeatVBox->setMinimumSize(style::window::default_body_width / 2, style::window::calendar::item::repeatAndReminder::height); - repeatVBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + repeatVBox->setEdges(RectangleEdge::None); reminderVBox = new VBox(hBox, 0, 0, 0, 0); reminderVBox->setMinimumSize(style::window::default_body_width / 2, style::window::calendar::item::repeatAndReminder::height); - reminderVBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + reminderVBox->setEdges(RectangleEdge::None); repeatTitle = new gui::Label(repeatVBox, 0, 0, 0, 0); repeatTitle->setMinimumSize(style::window::calendar::item::repeatAndReminder::description_w, style::window::calendar::item::repeatAndReminder::title_label_h); repeatTitle->setMargins( gui::Margins(0, 0, 0, style::window::calendar::item::repeatAndReminder::title_label_margin)); - repeatTitle->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + repeatTitle->setEdges(RectangleEdge::None); repeatTitle->setFont(style::window::font::small); repeatTitle->setAlignment(gui::Alignment{gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center}); repeatTitle->setLineMode(true); @@ -40,7 +40,7 @@ namespace gui repeat = new gui::Label(repeatVBox, 0, 0, 0, 0); repeat->setMinimumSize(style::window::calendar::item::repeatAndReminder::description_w, style::window::calendar::item::repeatAndReminder::description_h); - repeat->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + repeat->setEdges(RectangleEdge::None); repeat->setFont(style::window::font::medium); repeat->setAlignment(gui::Alignment{gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center}); repeat->activeItem = false; @@ -50,7 +50,7 @@ namespace gui style::window::calendar::item::repeatAndReminder::title_label_h); reminderTitle->setMargins( gui::Margins(0, 0, 0, style::window::calendar::item::repeatAndReminder::title_label_margin)); - reminderTitle->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + reminderTitle->setEdges(RectangleEdge::None); reminderTitle->setFont(style::window::font::small); reminderTitle->setAlignment(gui::Alignment{gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center}); reminderTitle->setLineMode(true); @@ -59,7 +59,7 @@ namespace gui reminder = new gui::Label(reminderVBox, 0, 0, 0, 0); reminder->setMinimumSize(style::window::default_body_width / 2, style::window::calendar::item::repeatAndReminder::description_h); - reminder->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + reminder->setEdges(RectangleEdge::None); reminder->setFont(style::window::font::medium); reminder->setAlignment(gui::Alignment{gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center}); reminder->activeItem = false; diff --git a/module-apps/application-calendar/widgets/SeveralOptionsItem.cpp b/module-apps/application-calendar/widgets/SeveralOptionsItem.cpp index 70b8bf35a..8a7e22093 100644 --- a/module-apps/application-calendar/widgets/SeveralOptionsItem.cpp +++ b/module-apps/application-calendar/widgets/SeveralOptionsItem.cpp @@ -23,18 +23,18 @@ namespace gui setMinimumSize(style::window::default_body_width, style::window::calendar::item::severalOptions::height); - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + setEdges(RectangleEdge::Bottom); setPenWidth(style::window::default_border_rect_no_focus); setMargins(gui::Margins(style::margins::small, style::margins::huge / 2, 0, style::margins::huge / 2)); vBox = new gui::VBox(this, 0, 0, 0, 0); - vBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + vBox->setEdges(gui::RectangleEdge::None); vBox->activeItem = false; descriptionLabel = new gui::Label(vBox, 0, 0, 0, 0); descriptionLabel->setMinimumSize(style::window::default_body_width, style::window::calendar::item::severalOptions::label_h); - descriptionLabel->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + descriptionLabel->setEdges(gui::RectangleEdge::None); descriptionLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); descriptionLabel->setFont(style::window::font::small); descriptionLabel->activeItem = false; @@ -44,7 +44,7 @@ namespace gui hBox->setMinimumSize(style::window::default_body_width, style::window::calendar::item::severalOptions::height - style::window::calendar::item::severalOptions::label_h); - hBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + hBox->setEdges(gui::RectangleEdge::None); hBox->activeItem = false; leftArrow = new gui::Image(hBox, 0, 0, 0, 0); @@ -59,7 +59,7 @@ namespace gui 2 * style::window::calendar::item::severalOptions::arrow_w_h, style::window::calendar::item::severalOptions::height - style::window::calendar::item::severalOptions::label_h); - optionLabel->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + optionLabel->setEdges(gui::RectangleEdge::None); optionLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); optionLabel->setFont(style::window::font::medium); optionLabel->activeItem = false; diff --git a/module-apps/application-calendar/widgets/TextWithLabelItem.cpp b/module-apps/application-calendar/widgets/TextWithLabelItem.cpp index bbb0d5250..4ac69d499 100644 --- a/module-apps/application-calendar/widgets/TextWithLabelItem.cpp +++ b/module-apps/application-calendar/widgets/TextWithLabelItem.cpp @@ -12,11 +12,11 @@ namespace gui { setMinimumSize(style::window::default_body_width, style::window::calendar::item::textWithLabel::height); setMargins(gui::Margins(style::margins::small, 0, 0, 0)); - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); bottomBarRestoreFromTemporaryMode(); vBox = new gui::VBox(this, 0, 0, 0, 0); - vBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + vBox->setEdges(gui::RectangleEdge::None); vBox->setPenFocusWidth(style::window::default_border_focus_w); vBox->setPenWidth(style::window::default_border_rect_no_focus); @@ -24,7 +24,7 @@ namespace gui descriptionLabel->setMinimumSize(style::window::default_body_width, style::window::calendar::item::textWithLabel::description_h); descriptionLabel->setMargins(gui::Margins(0, style::margins::small, 0, 0)); - descriptionLabel->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + descriptionLabel->setEdges(gui::RectangleEdge::None); descriptionLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Top)); descriptionLabel->setFont(style::window::font::small); descriptionLabel->activeItem = false; @@ -33,7 +33,7 @@ namespace gui textInput = new gui::Text(vBox, 0, 0, 0, 0); textInput->setMinimumSize(style::window::default_body_width, style::window::calendar::item::textWithLabel::text_input_h); - textInput->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + textInput->setEdges(gui::RectangleEdge::Bottom); textInput->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Bottom)); textInput->setFont(style::window::font::medium); textInput->setInputMode(new InputMode( diff --git a/module-apps/application-call/widgets/Icon.hpp b/module-apps/application-call/widgets/Icon.hpp index 67a54937e..d9bf68b21 100644 --- a/module-apps/application-call/widgets/Icon.hpp +++ b/module-apps/application-call/widgets/Icon.hpp @@ -42,17 +42,17 @@ namespace gui Icon(Item *parent, const uint32_t &x, const uint32_t &y, const uint32_t &w_margin, T state, const IconMap &data) : Rect(parent, x, y, icon::w + 2 * w_margin, icon::h), data(data) { - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); setPenFocusWidth(style::window::default_border_no_focus_w); setPenWidth(style::window::default_border_no_focus_w); boundingRect = new Rect(this, w_margin, 0, icon::w, icon::h); - boundingRect->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + boundingRect->setEdges(RectangleEdge::Bottom | RectangleEdge::Top); boundingRect->setPenFocusWidth(style::window::default_border_focus_w); boundingRect->setPenWidth(style::window::default_border_no_focus_w); img = new gui::Image(boundingRect, icon::img::x, icon::img::y, 0, 0); label = new gui::Label(this, icon::label::x, icon::label::y, icon::label::w + 2 * w_margin, icon::label::h); - label->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + label->setEdges(RectangleEdge::None); label->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); label->setFont(style::window::font::verysmall); diff --git a/module-apps/application-call/windows/EnterNumberWindow.cpp b/module-apps/application-call/windows/EnterNumberWindow.cpp index e7db3d854..aa367732b 100644 --- a/module-apps/application-call/windows/EnterNumberWindow.cpp +++ b/module-apps/application-call/windows/EnterNumberWindow.cpp @@ -59,7 +59,7 @@ namespace gui numberLabel = new gui::Label(this, numberLabel::x, numberLabel::y, numberLabel::w, numberLabel::h); numberLabel->setPenWidth(numberLabel::borderW); numberLabel->setFont(style::window::font::largelight); - numberLabel->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + numberLabel->setEdges(RectangleEdge::Bottom); numberLabel->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top)); numberLabel->setEllipsis(Ellipsis::Left); diff --git a/module-apps/application-calllog/widgets/CalllogItem.cpp b/module-apps/application-calllog/widgets/CalllogItem.cpp index 12ff6eda5..c2d29192c 100644 --- a/module-apps/application-calllog/widgets/CalllogItem.cpp +++ b/module-apps/application-calllog/widgets/CalllogItem.cpp @@ -26,7 +26,7 @@ namespace gui setMaximumSize(clItemStyle::w, clItemStyle::h); setRadius(0); - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + setEdges(RectangleEdge::Bottom | RectangleEdge::Top); setPenFocusWidth(style::window::default_border_focus_w); setPenWidth(style::window::default_border_no_focus_w); diff --git a/module-apps/application-calllog/windows/CallLogDetailsWindow.cpp b/module-apps/application-calllog/windows/CallLogDetailsWindow.cpp index 4e3578286..f4f604cc3 100644 --- a/module-apps/application-calllog/windows/CallLogDetailsWindow.cpp +++ b/module-apps/application-calllog/windows/CallLogDetailsWindow.cpp @@ -104,7 +104,7 @@ namespace gui for (uint32_t i = 0; i < 2; ++i) { rects[i] = new gui::Rect(this, 0, 0, information::imgs::w, information::imgs::h); rects[i]->setFilled(false); - rects[i]->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + rects[i]->setEdges(RectangleEdge::Bottom | RectangleEdge::Top); rects[i]->setPenFocusWidth(style::window::default_border_focus_w); rects[i]->setPenWidth(style::window::default_border_no_focus_w); } diff --git a/module-apps/application-desktop/windows/DesktopMainWindow.cpp b/module-apps/application-desktop/windows/DesktopMainWindow.cpp index 50d0dd33d..80f3caa64 100644 --- a/module-apps/application-desktop/windows/DesktopMainWindow.cpp +++ b/module-apps/application-desktop/windows/DesktopMainWindow.cpp @@ -309,7 +309,7 @@ namespace gui // 3. Set hbox layout properties el->setPenWidth(style::window::default_border_no_focus_w); el->setPenFocusWidth(style::window::default_border_focus_w); - el->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + el->setEdges(RectangleEdge::Bottom | RectangleEdge::Top); el->inputCallback = [showCallback, clearCallback](Item &, const InputEvent &event) -> bool { if (event.state != InputEvent::State::keyReleasedShort) { return false; diff --git a/module-apps/application-desktop/windows/MenuWindow.cpp b/module-apps/application-desktop/windows/MenuWindow.cpp index 8da187ee0..dc792b3fe 100644 --- a/module-apps/application-desktop/windows/MenuWindow.cpp +++ b/module-apps/application-desktop/windows/MenuWindow.cpp @@ -54,7 +54,7 @@ namespace gui this->activatedCallback = activatedCallback; this->setPenWidth(style::window::default_border_no_focus_w); this->setPenFocusWidth(style::window::default_border_focus_w); - this->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_TOP | RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + this->setEdges(RectangleEdge::Top | RectangleEdge::Bottom); addWidget(it); }; diff --git a/module-apps/application-desktop/windows/PinLockBaseWindow.cpp b/module-apps/application-desktop/windows/PinLockBaseWindow.cpp index f6aa28412..0aff2193b 100644 --- a/module-apps/application-desktop/windows/PinLockBaseWindow.cpp +++ b/module-apps/application-desktop/windows/PinLockBaseWindow.cpp @@ -34,7 +34,7 @@ namespace gui titleLabel->setBorderColor(gui::ColorFullBlack); titleLabel->setFont(style::header::font::title); titleLabel->setText(utils::localize.get("app_desktop_pin_info1")); - titleLabel->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + titleLabel->setEdges(RectangleEdge::None); titleLabel->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Bottom)); } void PinLockBaseWindow::buildInfoText(unsigned int h) diff --git a/module-apps/application-desktop/windows/PowerOffWindow.cpp b/module-apps/application-desktop/windows/PowerOffWindow.cpp index 89a002219..cf7e66f11 100644 --- a/module-apps/application-desktop/windows/PowerOffWindow.cpp +++ b/module-apps/application-desktop/windows/PowerOffWindow.cpp @@ -55,7 +55,7 @@ namespace gui titleLabel->setBorderColor(gui::ColorFullBlack); titleLabel->setFont(style::header::font::title); titleLabel->setText(utils::localize.get("app_desktop_poweroff_title")); - titleLabel->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + titleLabel->setEdges(RectangleEdge::None); titleLabel->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Bottom)); // label with question for powering down @@ -76,7 +76,7 @@ namespace gui label->setPenFocusWidth(2); label->setRadius(5); label->setFont(style::window::font::medium); - label->setEdges(RectangleEdgeFlags::GUI_RECT_ALL_EDGES); + label->setEdges(RectangleEdge::All); label->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); selectionLabels.push_back(label); pinLabelX += 193; @@ -95,7 +95,7 @@ namespace gui eventMgrLabel->setRadius(5); eventMgrLabel->setFont(style::window::font::bigbold); eventMgrLabel->setText("TURN PWR MGR OFF"); - eventMgrLabel->setEdges(RectangleEdgeFlags::GUI_RECT_ALL_EDGES); + eventMgrLabel->setEdges(RectangleEdge::All); eventMgrLabel->setAlignment( gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); diff --git a/module-apps/application-desktop/windows/PukLockBox.cpp b/module-apps/application-desktop/windows/PukLockBox.cpp index 72db03234..95d2a88b5 100644 --- a/module-apps/application-desktop/windows/PukLockBox.cpp +++ b/module-apps/application-desktop/windows/PukLockBox.cpp @@ -32,11 +32,11 @@ namespace gui const uint32_t pinLabelWidth = style::window_width - 2 * lock_style::pin_label_x; LockWindow->pinLabel = new gui::Label( LockWindow, lock_style::pin_label_x, lock_style::pin_label_y, pinLabelWidth, lock_style::label_size); - LockWindow->pinLabel->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + LockWindow->pinLabel->setEdges(RectangleEdge::Bottom); LockWindow->buildPinLabels(LockWindow->pinLabel, pinSize, lock_style::label_size); for (auto label : LockWindow->pinLabels) { - label->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + label->setEdges(RectangleEdge::None); } } void PukLockBox::setVisibleStateEnterPin() diff --git a/module-apps/application-desktop/windows/Reboot.cpp b/module-apps/application-desktop/windows/Reboot.cpp index 9dc0e20d3..8d106cb33 100644 --- a/module-apps/application-desktop/windows/Reboot.cpp +++ b/module-apps/application-desktop/windows/Reboot.cpp @@ -34,7 +34,7 @@ namespace gui text->setFilled(false); text->setBorderColor(gui::ColorFullBlack); text->setFont(style::header::font::title); - text->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + text->setEdges(RectangleEdge::None); text->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Bottom)); } diff --git a/module-apps/application-desktop/windows/ScreenLockBox.cpp b/module-apps/application-desktop/windows/ScreenLockBox.cpp index 11889ec3c..26de6ecf5 100644 --- a/module-apps/application-desktop/windows/ScreenLockBox.cpp +++ b/module-apps/application-desktop/windows/ScreenLockBox.cpp @@ -31,11 +31,11 @@ namespace gui const uint32_t pinLabelWidth = style::window_width - 2 * lock_style::pin_label_x_screen; LockWindow->pinLabel = new gui::Label( LockWindow, lock_style::pin_label_x_screen, lock_style::pin_label_y, pinLabelWidth, lock_style::label_size); - LockWindow->pinLabel->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + LockWindow->pinLabel->setEdges(RectangleEdge::None); LockWindow->buildPinLabels(LockWindow->pinLabel, pinSize, lock_style::label_size_screen); for (auto label : LockWindow->pinLabels) { - label->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + label->setEdges(RectangleEdge::Bottom); } } void ScreenLockBox::setVisibleStateEnterPin() diff --git a/module-apps/application-desktop/windows/SimLockBox.cpp b/module-apps/application-desktop/windows/SimLockBox.cpp index dd22d4e0f..43bcbc310 100644 --- a/module-apps/application-desktop/windows/SimLockBox.cpp +++ b/module-apps/application-desktop/windows/SimLockBox.cpp @@ -33,11 +33,11 @@ namespace gui const uint32_t pinLabelWidth = style::window_width - 2 * lock_style::pin_label_x; LockWindow->pinLabel = new gui::Label( LockWindow, lock_style::pin_label_x, lock_style::pin_label_y, pinLabelWidth, lock_style::label_size); - LockWindow->pinLabel->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + LockWindow->pinLabel->setEdges(RectangleEdge::Bottom); LockWindow->buildPinLabels(LockWindow->pinLabel, pinSize, lock_style::label_size); for (auto label : LockWindow->pinLabels) { - label->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + label->setEdges(RectangleEdge::None); } } void SimLockBox::setVisibleStateEnterPin() diff --git a/module-apps/application-meditation/widgets/MeditationTimer.cpp b/module-apps/application-meditation/widgets/MeditationTimer.cpp index bc20b8935..864d1227f 100644 --- a/module-apps/application-meditation/widgets/MeditationTimer.cpp +++ b/module-apps/application-meditation/widgets/MeditationTimer.cpp @@ -22,7 +22,7 @@ namespace gui Item *_parent) : HBox(_parent, x, y, width, height), application{app} { - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); build(); } @@ -40,7 +40,7 @@ namespace gui progressBar = new CircularProgressBar(this, params); timer = new Text(progressBar, 0, 0, getWidth(), getHeight()); - timer->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + timer->setEdges(RectangleEdge::None); timer->setFont(style::window::font::supersizemelight); timer->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); timer->setEditMode(EditMode::BROWSE); diff --git a/module-apps/application-messages/widgets/BaseThreadItem.cpp b/module-apps/application-messages/widgets/BaseThreadItem.cpp index c947d53a6..d8fcfef1c 100644 --- a/module-apps/application-messages/widgets/BaseThreadItem.cpp +++ b/module-apps/application-messages/widgets/BaseThreadItem.cpp @@ -16,7 +16,7 @@ namespace gui setMaximumSize(window::default_body_width, style::messages::threadItem::sms_thread_item_h); setRadius(0); - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + setEdges(RectangleEdge::Bottom | RectangleEdge::Top); setPenFocusWidth(window::default_border_focus_w); setPenWidth(window::default_border_no_focus_w); diff --git a/module-apps/application-messages/widgets/SMSInputWidget.cpp b/module-apps/application-messages/widgets/SMSInputWidget.cpp index 8bcaa46e0..035efb4ff 100644 --- a/module-apps/application-messages/widgets/SMSInputWidget.cpp +++ b/module-apps/application-messages/widgets/SMSInputWidget.cpp @@ -18,10 +18,10 @@ namespace gui { setMinimumSize(style::window::default_body_width, style::messages::smsInput::min_h); setMargins(Margins(0, style::messages::smsInput::new_sms_vertical_spacer, 0, 0)); - setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(gui::RectangleEdge::None); body = new HBox(this, 0, 0, 0, 0); - body->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + body->setEdges(RectangleEdge::Bottom); body->setMaximumSize(style::window::default_body_width, style::messages::smsInput::max_input_h); deleteByList = false; @@ -34,7 +34,7 @@ namespace gui inputText->setPadding(Padding(0, 0, 0, style::messages::smsInput::bottom_padding)); inputText->setPenFocusWidth(style::window::default_border_focus_w); inputText->setPenWidth(style::window::default_border_focus_w); - inputText->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + inputText->setEdges(gui::RectangleEdge::None); replyImage = new Image(body, 0, 0, "messages_reply"); replyImage->setAlignment(Alignment(gui::Alignment::Vertical::Bottom)); diff --git a/module-apps/application-messages/widgets/SMSOutputWidget.cpp b/module-apps/application-messages/widgets/SMSOutputWidget.cpp index 8f749dbc1..db4a1fab3 100644 --- a/module-apps/application-messages/widgets/SMSOutputWidget.cpp +++ b/module-apps/application-messages/widgets/SMSOutputWidget.cpp @@ -15,10 +15,10 @@ namespace gui { setMinimumSize(style::window::default_body_width, style::messages::smsOutput::default_h); setMargins(Margins(0, style::messages::smsOutput::sms_vertical_spacer, 0, 0)); - setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(gui::RectangleEdge::None); body = new HBox(this, 0, 0, 0, 0); - body->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + body->setEdges(RectangleEdge::None); body->setMaximumSize(style::window::default_body_width, style::window::default_body_height); smsBubble = new TextBubble(nullptr, 0, 0, 0, 0); @@ -37,20 +37,20 @@ namespace gui // Handle in the same way as case below. (pending sending display as already sent) [[fallthrough]]; case SMSType::OUTBOX: - smsBubble->setYaps(RectangleYapFlags::GUI_RECT_YAP_TOP_RIGHT); + smsBubble->setYaps(RectangleYap::TopRight); body->setReverseOrder(true); body->addWidget(smsBubble); timeLabelBuild(record->date); break; case SMSType::INBOX: smsBubble->setPadding(style::messages::smsOutput::sms_left_bubble_padding); - smsBubble->setYaps(RectangleYapFlags::GUI_RECT_YAP_TOP_LEFT); + smsBubble->setYaps(RectangleYap::TopLeft); body->setReverseOrder(false); body->addWidget(smsBubble); timeLabelBuild(record->date); break; case SMSType::FAILED: - smsBubble->setYaps(RectangleYapFlags::GUI_RECT_YAP_TOP_RIGHT); + smsBubble->setYaps(RectangleYap::TopRight); body->setReverseOrder(true); errorIconBuild(); body->addWidget(smsBubble); @@ -118,7 +118,7 @@ namespace gui timeLabel->setText(utils::time::Time(timestamp)); timeLabel->setVisible(false); timeLabel->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); - timeLabel->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + timeLabel->setEdges(RectangleEdge::None); } void SMSOutputWidget::errorIconBuild() diff --git a/module-apps/application-messages/windows/NewMessage.cpp b/module-apps/application-messages/windows/NewMessage.cpp index b9b19d965..e94a66048 100644 --- a/module-apps/application-messages/windows/NewMessage.cpp +++ b/module-apps/application-messages/windows/NewMessage.cpp @@ -169,13 +169,13 @@ namespace gui auto recipientLabel = new Label(body, 0, 0, body->getWidth(), msgStyle::recipientLabel::h); recipientLabel->setText(utils::localize.get("sms_add_rec_num")); recipientLabel->activeItem = false; - recipientLabel->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + recipientLabel->setEdges(gui::RectangleEdge::None); recipientLabel->setFont(style::window::font::small); recipientLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Bottom)); auto reciepientHbox = new gui::HBox(body, 0, 0, body->getWidth(), msgStyle::text::h); reciepientHbox->setAlignment(gui::Alignment::Vertical::Center); - reciepientHbox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + reciepientHbox->setEdges(gui::RectangleEdge::Bottom); reciepientHbox->setPenFocusWidth(style::window::default_border_focus_w); reciepientHbox->setPenWidth(style::window::default_border_rect_no_focus); @@ -186,7 +186,7 @@ namespace gui msgStyle::text::h, "", ExpandMode::EXPAND_NONE); - recipient->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + recipient->setEdges(gui::RectangleEdge::None); recipient->setInputMode(new InputMode({InputMode::phone})); recipient->setFont(style::window::font::mediumbold); recipient->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); @@ -208,13 +208,13 @@ namespace gui auto labelMessage = new Label(body, 0, 0, body->getWidth(), msgStyle::messageLabel::h); labelMessage->setText(utils::localize.get("app_messages_message")); labelMessage->activeItem = false; - labelMessage->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + labelMessage->setEdges(gui::RectangleEdge::None); labelMessage->setFont(style::window::font::small); labelMessage->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Bottom)); message = new gui::Text(nullptr, 0, 0, body->getWidth(), msgStyle::text::h, "", ExpandMode::EXPAND_UP); message->setMaximumSize(body->getWidth(), body->getHeight()); - message->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + message->setEdges(gui::RectangleEdge::Bottom); message->setInputMode(new InputMode( {InputMode::ABC, InputMode::abc, InputMode::digit}, [=](const UTF8 &text) { bottomBarTemporaryMode(text); }, @@ -247,7 +247,7 @@ namespace gui body->addWidget(new Span(Axis::Y, body->getHeight())); message->setText(""); // to set actual size of Text - body->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + body->setEdges(gui::RectangleEdge::None); body->setVisible(true); body->setNavigation(); setFocusItem(body); diff --git a/module-apps/application-music-player/widgets/SongItem.cpp b/module-apps/application-music-player/widgets/SongItem.cpp index a5050f35e..2bf19fef5 100644 --- a/module-apps/application-music-player/widgets/SongItem.cpp +++ b/module-apps/application-music-player/widgets/SongItem.cpp @@ -11,24 +11,24 @@ namespace gui setMargins(Margins(0, style::margins::small, 0, style::margins::small)); vBox = new VBox(this, 0, 0, 0, 0); - vBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + vBox->setEdges(RectangleEdge::None); firstHBox = new HBox(vBox, 0, 0, 0, 0); firstHBox->setMinimumSize(songItem::w, songItem::bold_text_h); firstHBox->setMargins(Margins(0, songItem::topMargin, 0, 0)); firstHBox->setReverseOrder(true); - firstHBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + firstHBox->setEdges(RectangleEdge::None); secondHBox = new HBox(vBox, 0, 0, 0, 0); secondHBox->setMinimumSize(songItem::w, songItem::text_h); secondHBox->setMargins(Margins(0, songItem::topMargin, 0, 0)); secondHBox->setReverseOrder(true); - secondHBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + secondHBox->setEdges(RectangleEdge::None); durationText = new TextFixedSize(firstHBox, 0, 0, 0, 0); durationText->setMinimumSize(songItem::duration_w, songItem::text_h); durationText->setMargins(Margins(0, 0, songItem::rightMargin, 0)); - durationText->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + durationText->setEdges(RectangleEdge::None); durationText->setUnderline(false); durationText->setFont(style::window::font::verysmall); durationText->setAlignment(Alignment(gui::Alignment::Horizontal::Right, gui::Alignment::Vertical::Center)); @@ -39,7 +39,7 @@ namespace gui songText->setMinimumHeight(songItem::bold_text_h); songText->setMaximumWidth(songItem::w); songText->setMargins(Margins(songItem::leftMargin, 0, 0, 0)); - songText->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + songText->setEdges(RectangleEdge::None); songText->setUnderline(false); songText->setFont(style::window::font::verysmallbold); songText->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); @@ -54,7 +54,7 @@ namespace gui authorText->setMinimumHeight(songItem::text_h); authorText->setMaximumWidth(songItem::w); authorText->setMargins(Margins(songItem::leftMargin, 0, 0, 0)); - authorText->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + authorText->setEdges(RectangleEdge::None); authorText->setUnderline(false); authorText->setFont(style::window::font::verysmall); authorText->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); diff --git a/module-apps/application-music-player/windows/MusicPlayerEmptyWindow.cpp b/module-apps/application-music-player/windows/MusicPlayerEmptyWindow.cpp index 06d6eef65..ac0c3b97b 100644 --- a/module-apps/application-music-player/windows/MusicPlayerEmptyWindow.cpp +++ b/module-apps/application-music-player/windows/MusicPlayerEmptyWindow.cpp @@ -38,7 +38,7 @@ namespace gui text->setText(utils::localize.get("app_music_player_music_empty_window_notification")); text->setTextType(TextType::MULTI_LINE); text->setEditMode(EditMode::BROWSE); - text->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + text->setEdges(RectangleEdge::None); text->setFont(style::window::font::medium); text->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); diff --git a/module-apps/application-phonebook/widgets/ContactFlagIconWidget.cpp b/module-apps/application-phonebook/widgets/ContactFlagIconWidget.cpp index 1cb828ff8..1af43fbde 100644 --- a/module-apps/application-phonebook/widgets/ContactFlagIconWidget.cpp +++ b/module-apps/application-phonebook/widgets/ContactFlagIconWidget.cpp @@ -34,7 +34,7 @@ namespace gui { icon = new Image( this, 0, 0, style::widget::ContactFlag::iconsSize, style::widget::ContactFlag::iconsSize, iconName); - icon->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + icon->setEdges(RectangleEdge::None); } void ContactFlagIconWidget::buildItemWithText() @@ -44,24 +44,24 @@ namespace gui numericLabel->setFont(style::window::font::bigbold); numericLabel->setText(std::to_string(number)); numericLabel->setAlignment(Alignment(Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); - numericLabel->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + numericLabel->setEdges(RectangleEdge::None); } void ContactFlagIconWidget::buildItem() { - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); label = new Label(this, 0, 0, style::widget::ContactFlag::itemWidth, style::widget::ContactFlag::labelHeight); label->setFilled(false); label->setFont(style::window::font::verysmall); label->setText(itemText); label->setEllipsis(gui::Ellipsis::None); - label->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + label->setEdges(RectangleEdge::None); label->setAlignment(Alignment(Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); mainBox = new VBox(this, 0, 0, style::widget::ContactFlag::itemWidth, style::widget::ContactFlag::itemHeight); mainBox->setAlignment(Alignment(Alignment::Horizontal::Center, Alignment::Vertical::Center)); - mainBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + mainBox->setEdges(RectangleEdge::None); if (numericIcon) { mainBox->addWidget(numericLabel); } diff --git a/module-apps/application-phonebook/widgets/ContactFlagsWidget.cpp b/module-apps/application-phonebook/widgets/ContactFlagsWidget.cpp index 25af4e13f..db6f58ec0 100644 --- a/module-apps/application-phonebook/widgets/ContactFlagsWidget.cpp +++ b/module-apps/application-phonebook/widgets/ContactFlagsWidget.cpp @@ -18,7 +18,7 @@ namespace gui { favourites = speedDial = ice = true; blocked = false; - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + setEdges(RectangleEdge::Bottom); initGUIIcons(); buildWidget(); repositionIcons(); @@ -72,7 +72,7 @@ namespace gui { mainBox = new HBox(this, 0, 0, style::window_width, style::widget::ContactFlag::itemHeight); mainBox->setAlignment(Alignment(Alignment::Horizontal::Center)); - mainBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + mainBox->setEdges(RectangleEdge::None); mainBox->addWidget(favouritesIcon); mainBox->addWidget(iceIcon); mainBox->addWidget(speedDialIcon); diff --git a/module-apps/application-phonebook/widgets/InformationWidget.cpp b/module-apps/application-phonebook/widgets/InformationWidget.cpp index 4eac950df..7c938626a 100644 --- a/module-apps/application-phonebook/widgets/InformationWidget.cpp +++ b/module-apps/application-phonebook/widgets/InformationWidget.cpp @@ -16,12 +16,12 @@ namespace gui phonebookStyle::informationWidget::title_label_h + style::margins::huge); vBox = new VBox(this, 0, 0, 0, 0); - vBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + vBox->setEdges(RectangleEdge::None); titleLabel = new Label(vBox, 0, 0, 0, 0, utils::localize.get("app_phonebook_contact_information")); titleLabel->setMinimumSize(phonebookStyle::informationWidget::w, phonebookStyle::informationWidget::title_label_h); - titleLabel->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + titleLabel->setEdges(RectangleEdge::None); titleLabel->setMargins(Margins(0, 0, 0, style::margins::very_big)); titleLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Top)); titleLabel->setFont(style::window::font::verysmall); @@ -62,7 +62,7 @@ namespace gui emailText->setMargins(Margins(0, style::margins::very_big, 0, 0)); emailText->setFont(style::window::font::medium); emailText->setEditMode(EditMode::BROWSE); - emailText->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + emailText->setEdges(RectangleEdge::None); emailText->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); emailText->setText(contact->mail); emailText->activeItem = false; @@ -98,7 +98,7 @@ namespace gui return vBox->onInput(event); }; - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); } auto InformationWidget::onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) -> bool diff --git a/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.cpp b/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.cpp index b27741a28..02098fd44 100644 --- a/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.cpp +++ b/module-apps/application-phonebook/widgets/InputBoxWithLabelAndIconWidget.cpp @@ -22,7 +22,7 @@ namespace gui setMargins(gui::Margins(0, style::margins::big, 0, 0)); hBox = new gui::HBox(this, 0, 0, phonebookStyle::inputBoxWithLabelAndIconIWidget::w, 0); - hBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + hBox->setEdges(gui::RectangleEdge::None); hBox->setPenFocusWidth(style::window::default_border_focus_w); hBox->setPenWidth(style::window::default_border_rect_no_focus); @@ -31,7 +31,7 @@ namespace gui phonebookStyle::inputBoxWithLabelAndIconIWidget::input_box_h); inputBoxLabel->setMargins( gui::Margins(0, 0, phonebookStyle::inputBoxWithLabelAndIconIWidget::input_box_right_margin, 0)); - inputBoxLabel->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + inputBoxLabel->setEdges(gui::RectangleEdge::Bottom); inputBoxLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); inputBoxLabel->setFont(style::window::font::medium); inputBoxLabel->activeItem = false; @@ -51,7 +51,7 @@ namespace gui phonebookStyle::inputBoxWithLabelAndIconIWidget::description_label_h); descriptionLabel->setMargins( gui::Margins(0, 0, phonebookStyle::inputBoxWithLabelAndIconIWidget::description_label_right_margin, 0)); - descriptionLabel->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + descriptionLabel->setEdges(gui::RectangleEdge::None); descriptionLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); descriptionLabel->setFont(style::window::font::medium); descriptionLabel->activeItem = false; @@ -62,7 +62,7 @@ namespace gui applyItemNameSpecificSettings(); - setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(gui::RectangleEdge::None); } auto InputBoxWithLabelAndIconWidget::onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) diff --git a/module-apps/application-phonebook/widgets/InputLinesWithLabelIWidget.cpp b/module-apps/application-phonebook/widgets/InputLinesWithLabelIWidget.cpp index c09af71e2..3cc1b4395 100644 --- a/module-apps/application-phonebook/widgets/InputLinesWithLabelIWidget.cpp +++ b/module-apps/application-phonebook/widgets/InputLinesWithLabelIWidget.cpp @@ -24,12 +24,12 @@ namespace gui setMargins(gui::Margins(0, style::margins::huge, 0, 0)); vBox = new VBox(this, 0, 0, 0, 0); - vBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + vBox->setEdges(RectangleEdge::None); titleLabel = new Label(vBox); titleLabel->setMinimumSize(phonebookStyle::inputLinesWithLabelWidget::w, phonebookStyle::inputLinesWithLabelWidget::title_label_h); - titleLabel->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + titleLabel->setEdges(RectangleEdge::None); titleLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Top)); titleLabel->setFont(style::window::font::verysmall); titleLabel->activeItem = false; @@ -40,7 +40,7 @@ namespace gui inputText->setMargins(Margins(0, phonebookStyle::inputLinesWithLabelWidget::span_size, 0, 0)); inputText->setUnderlinePadding(phonebookStyle::inputLinesWithLabelWidget::underline_padding); - inputText->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + inputText->setEdges(RectangleEdge::None); inputText->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Top)); inputText->setFont(style::window::font::medium); inputText->setInputMode(new InputMode( @@ -77,7 +77,7 @@ namespace gui } return result; }; - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); } auto InputLinesWithLabelIWidget::onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) -> bool diff --git a/module-apps/application-phonebook/widgets/NumberWithIconsWidget.cpp b/module-apps/application-phonebook/widgets/NumberWithIconsWidget.cpp index 0f64fb3fc..895abd6ee 100644 --- a/module-apps/application-phonebook/widgets/NumberWithIconsWidget.cpp +++ b/module-apps/application-phonebook/widgets/NumberWithIconsWidget.cpp @@ -15,7 +15,7 @@ namespace gui { setReverseOrder(true); setMinimumSize(phonebookStyle::informationWidget::w, phonebookStyle::numbersWithIconsWidget::h); - setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(gui::RectangleEdge::None); setAlignment(Alignment(gui::Alignment::Horizontal::Right, gui::Alignment::Vertical::Center)); smsImage = new ImageBox(this, @@ -55,7 +55,7 @@ namespace gui numberText->setMaximumSize(phonebookStyle::informationWidget::w, phonebookStyle::numbersWithIconsWidget::number_text_h); numberText->setFont(font); - numberText->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + numberText->setEdges(gui::RectangleEdge::None); numberText->setEditMode(EditMode::BROWSE); numberText->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); numberText->setText(number.getFormatted()); @@ -68,24 +68,24 @@ namespace gui phoneImage->focusChangedCallback = [&, app](Item &item) { if (phoneImage->focus) { - phoneImage->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + phoneImage->setEdges(RectangleEdge::Bottom | RectangleEdge::Top); app->getCurrentWindow()->bottomBarTemporaryMode( utils::localize.get(style::strings::common::call), BottomBar::Side::CENTER, false); } else { - phoneImage->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + phoneImage->setEdges(RectangleEdge::None); } return true; }; smsImage->focusChangedCallback = [&, app](Item &item) { if (smsImage->focus) { - smsImage->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + smsImage->setEdges(RectangleEdge::Bottom | RectangleEdge::Top); app->getCurrentWindow()->bottomBarTemporaryMode( utils::localize.get(style::strings::common::send), BottomBar::Side::CENTER, false); } else { - smsImage->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + smsImage->setEdges(RectangleEdge::None); } return true; }; diff --git a/module-apps/application-phonebook/widgets/OutputLinesTextWithLabelWidget.cpp b/module-apps/application-phonebook/widgets/OutputLinesTextWithLabelWidget.cpp index 4cace23c5..23466cd28 100644 --- a/module-apps/application-phonebook/widgets/OutputLinesTextWithLabelWidget.cpp +++ b/module-apps/application-phonebook/widgets/OutputLinesTextWithLabelWidget.cpp @@ -16,12 +16,12 @@ namespace gui setMargins(gui::Margins(0, style::margins::huge, 0, 0)); vBox = new VBox(this, 0, 0, 0, 0); - vBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + vBox->setEdges(RectangleEdge::None); titleLabel = new Label(vBox); titleLabel->setMinimumSize(phonebookStyle::outputLinesTextWithLabelWidget::w, phonebookStyle::outputLinesTextWithLabelWidget::title_label_h); - titleLabel->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + titleLabel->setEdges(RectangleEdge::None); titleLabel->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center)); titleLabel->setFont(style::window::font::verysmall); titleLabel->setLineMode(true); @@ -31,7 +31,7 @@ namespace gui multilineText->setMaximumSize(phonebookStyle::outputLinesTextWithLabelWidget::w, phonebookStyle::outputLinesTextWithLabelWidget::input_text_h * 10); multilineText->setMargins(Margins(0, phonebookStyle::outputLinesTextWithLabelWidget::span_size, 0, 0)); - multilineText->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + multilineText->setEdges(RectangleEdge::None); multilineText->setAlignment(Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Bottom)); multilineText->setFont(style::window::font::medium); multilineText->setEditMode(EditMode::BROWSE); @@ -44,7 +44,7 @@ namespace gui }; this->activeItem = false; - setEdges(RectangleEdgeFlags::GUI_RECT_ALL_EDGES); + setEdges(RectangleEdge::All); } auto OutputLinesTextWithLabelWidget::onDimensionChanged(const BoundingBox &oldDim, const BoundingBox &newDim) diff --git a/module-apps/application-phonebook/widgets/PhonebookItem.cpp b/module-apps/application-phonebook/widgets/PhonebookItem.cpp index e3580a623..c23bd0c74 100644 --- a/module-apps/application-phonebook/widgets/PhonebookItem.cpp +++ b/module-apps/application-phonebook/widgets/PhonebookItem.cpp @@ -11,10 +11,10 @@ namespace gui setMargins(Margins(0, style::margins::big, 0, 0)); setMinimumSize(phonebookStyle::contactItem::w, phonebookStyle::contactItem::h); - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + setEdges(RectangleEdge::Bottom | RectangleEdge::Top); hBox = new gui::HBox(this, 0, 0, 0, 0); - hBox->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + hBox->setEdges(gui::RectangleEdge::None); hBox->setPenFocusWidth(style::window::default_border_focus_w); hBox->setPenWidth(style::window::default_border_rect_no_focus); @@ -50,7 +50,7 @@ namespace gui contactName->setText(text); contactName->setLineMode(true); activeItem = false; - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); } UTF8 PhonebookItem::getLabelMarker() diff --git a/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp b/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp index de7abdb62..1dbedf1d7 100644 --- a/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp +++ b/module-apps/application-phonebook/windows/PhonebookContactDetails.cpp @@ -74,13 +74,13 @@ namespace gui contactFlagsWidget->setBlocked(contact->isOnBlocked()); contactFlagsWidget->setFavourites(contact->isOnFavourites()); if (contactFlagsWidget->visible) { - title->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + title->setEdges(RectangleEdge::None); bodyList->setY(phonebookStyle::contactDetailsWindow::contactDetailsList::y); bodyList->setSize(phonebookStyle::contactDetailsWindow::contactDetailsList::w, phonebookStyle::contactDetailsWindow::contactDetailsList::h); } else { - title->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + title->setEdges(RectangleEdge::Bottom); bodyList->setY(phonebookStyle::contactDetailsWindow::contactDetailsListNoFlags::y); bodyList->setSize(phonebookStyle::contactDetailsWindow::contactDetailsListNoFlags::w, phonebookStyle::contactDetailsWindow::contactDetailsListNoFlags::h); diff --git a/module-apps/application-settings/windows/CellularPassthroughWindow.cpp b/module-apps/application-settings/windows/CellularPassthroughWindow.cpp index 39ea01809..0adf5bbcf 100644 --- a/module-apps/application-settings/windows/CellularPassthroughWindow.cpp +++ b/module-apps/application-settings/windows/CellularPassthroughWindow.cpp @@ -172,8 +172,8 @@ namespace gui separatorLower->setBorderColor(gui::ColorFullBlack); separatorUpper->setPenWidth(1); separatorLower->setPenWidth(1); - separatorUpper->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); - separatorLower->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + separatorUpper->setEdges(RectangleEdge::Bottom); + separatorLower->setEdges(RectangleEdge::Top); separatorLayout->addWidget(separatorUpper); separatorLayout->addWidget(separatorLower); diff --git a/module-apps/application-settings/windows/DateTimeWindow.cpp b/module-apps/application-settings/windows/DateTimeWindow.cpp index e8c872d42..812c4e058 100644 --- a/module-apps/application-settings/windows/DateTimeWindow.cpp +++ b/module-apps/application-settings/windows/DateTimeWindow.cpp @@ -110,7 +110,7 @@ namespace gui dateBody->addWidget(toAdd->second); } - dateBody->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + dateBody->setEdges(gui::RectangleEdge::None); // create time items @@ -153,7 +153,7 @@ namespace gui timeItems.insert(std::pair(DateTimeItems::Hour, item)); timeBody->addWidget(item); - timeBody->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + timeBody->setEdges(gui::RectangleEdge::None); setFocusItem(timeBody); timeBody->setNavigationItem(NavigationDirection::UP, dateBody); @@ -183,7 +183,7 @@ namespace gui { auto label = new gui::Label( nullptr, 0, 0, style::settings::date::date_time_spacer_width, style::settings::date::date_time_item_height); - label->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + label->setEdges(gui::RectangleEdge::None); label->setText(text); label->setFont(style::window::font::largelight); label->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); @@ -206,7 +206,7 @@ namespace gui label->setPenWidth(1); label->setFont(style::window::font::largelight); label->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); - label->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + label->setEdges(gui::RectangleEdge::Bottom); label->activatedCallback = [=](gui::Item &) { this->setRTC(); return true; @@ -219,7 +219,7 @@ namespace gui style::settings::date::date_time_item_width, style::settings::date::date_time_item_title_height); title->setText(itemTitle); - title->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + title->setEdges(gui::RectangleEdge::None); title->setFont(style::window::font::verysmall); return label; } diff --git a/module-apps/application-settings/windows/Info.cpp b/module-apps/application-settings/windows/Info.cpp index 0d4e1bbce..6472ba23f 100644 --- a/module-apps/application-settings/windows/Info.cpp +++ b/module-apps/application-settings/windows/Info.cpp @@ -71,12 +71,12 @@ namespace gui void Info::addAlignedLabelWithValue(BoxLayout *layout, const std::string &labelText, const std::string &valueText) { auto lineBox = new gui::VBox(layout, 0, 0, style::window_width, style::window::label::small_h * 2); - lineBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + lineBox->setEdges(RectangleEdge::Bottom); auto label = new gui::Label(lineBox, 0, 0, 0, 0); label->setMinimumHeight(style::window::label::small_h); label->setMaximumWidth(style::window_width); - label->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + label->setEdges(RectangleEdge::None); label->setMargins(gui::Margins(style::window::default_left_margin, 0, 0, 0)); label->setText(labelText); label->setFont(style::window::font::smallbold); @@ -84,7 +84,7 @@ namespace gui auto value = new gui::Label(lineBox, 0, 0, 0, 0); value->setMinimumHeight(style::window::label::small_h); value->setMaximumWidth(style::window_width); - value->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + value->setEdges(RectangleEdge::None); value->setMargins(gui::Margins(0, 0, style::window::default_right_margin, 0)); value->setAlignment(gui::Alignment::Horizontal::Right); value->setText(valueText); diff --git a/module-apps/application-settings/windows/SettingsChange.cpp b/module-apps/application-settings/windows/SettingsChange.cpp index 5112f6094..dc790487f 100644 --- a/module-apps/application-settings/windows/SettingsChange.cpp +++ b/module-apps/application-settings/windows/SettingsChange.cpp @@ -45,7 +45,7 @@ namespace gui::option auto font_bold = FontManager::getInstance().getFont(style::window::font::mediumbold); auto settings = app->getSettings(); - rect->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + rect->setEdges(RectangleEdge::None); rect->setReverseOrder(true); auto text = new TextFixedSize(nullptr, style::option::text_left_padding, 0, 0, 0); @@ -70,7 +70,7 @@ namespace gui::option pin_text->setPenWidth(0); pin_text->setInputMode(new InputMode( {InputMode::digit}, [=](const UTF8 &text) {}, [=]() {}, [=]() {})); - pin_text->setEdges(RectangleEdgeFlags::GUI_RECT_ALL_EDGES); + pin_text->setEdges(RectangleEdge::All); auto lapp = app; pin_text->activatedCallback = [pin_text, lapp](gui::Item &item) { diff --git a/module-apps/application-settings/windows/USSDWindow.cpp b/module-apps/application-settings/windows/USSDWindow.cpp index 644f19444..fea7548e9 100644 --- a/module-apps/application-settings/windows/USSDWindow.cpp +++ b/module-apps/application-settings/windows/USSDWindow.cpp @@ -106,7 +106,7 @@ namespace gui text->setFont(style::window::font::verysmall); text->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); - text->setEdges(RectangleEdgeFlags::GUI_RECT_ALL_EDGES); + text->setEdges(RectangleEdge::All); return text; } diff --git a/module-apps/application-special-input/widgets/SpecialInputTableWidget.cpp b/module-apps/application-special-input/widgets/SpecialInputTableWidget.cpp index 7e82edc57..9829ec799 100644 --- a/module-apps/application-special-input/widgets/SpecialInputTableWidget.cpp +++ b/module-apps/application-special-input/widgets/SpecialInputTableWidget.cpp @@ -17,7 +17,7 @@ namespace gui : application(app) { setMinimumSize(specialCharacterTableWidget::window_grid_w, specialCharacterTableWidget::window_grid_h); - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); box = new GridLayout(0, 0, @@ -87,7 +87,7 @@ namespace gui { auto rect = new Rect( nullptr, 0, 0, specialCharacterTableWidget::char_label_w, specialCharacterTableWidget::char_label_h); - rect->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_TOP | gui::RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + rect->setEdges(gui::RectangleEdge::Top | gui::RectangleEdge::Bottom); rect->setPenWidth(0); new gui::Image(rect, specialCharacterTableWidget::char_newline_x, diff --git a/module-apps/widgets/SearchBox.cpp b/module-apps/widgets/SearchBox.cpp index 5e2afdf76..a339bd9bd 100644 --- a/module-apps/widgets/SearchBox.cpp +++ b/module-apps/widgets/SearchBox.cpp @@ -52,7 +52,7 @@ namespace gui horizontalBox::inputField::h); inputField->setTextType(TextType::SINGLE_LINE); inputField->setEditMode(EditMode::EDIT); - inputField->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + inputField->setEdges(RectangleEdge::None); inputField->setInputMode(new InputMode({InputMode::ABC, InputMode::abc})); inputField->setFont(style::window::font::mediumbold); @@ -66,10 +66,10 @@ namespace gui icon)); horizontalBox->setPenWidth(horizontalBox::penWidth); - horizontalBox->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + horizontalBox->setEdges(RectangleEdge::Bottom); - const RectangleEdgeFlags edges = RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES; - const Alignment alignment = Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Bottom); + const RectangleEdge edges = RectangleEdge::None; + const Alignment alignment = Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Bottom); auto l = new Label(parent, searchHeader::x, searchHeader::y, searchHeader::w, searchHeader::h); l->setFont(style::window::font::small); diff --git a/module-apps/windows/AppWindow.cpp b/module-apps/windows/AppWindow.cpp index 5e6223b1b..b4163826a 100644 --- a/module-apps/windows/AppWindow.cpp +++ b/module-apps/windows/AppWindow.cpp @@ -48,7 +48,7 @@ namespace gui title->setFont(font::title); title->clear(); title->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Top)); - title->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + title->setEdges(RectangleEdge::Bottom); title->setEllipsis(Ellipsis::Right); title->visible = false; diff --git a/module-apps/windows/Dialog.cpp b/module-apps/windows/Dialog.cpp index 5832077a7..ed38c74a7 100644 --- a/module-apps/windows/Dialog.cpp +++ b/module-apps/windows/Dialog.cpp @@ -58,7 +58,7 @@ Dialog::Dialog(app::Application *app, const std::string &name) : gui::AppWindow( text->setRichText("lol"); text->setTextType(TextType::MULTI_LINE); text->setEditMode(EditMode::BROWSE); - text->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + text->setEdges(RectangleEdge::None); text->setFont(style::window::font::medium); text->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); } @@ -106,7 +106,7 @@ DialogYesNo::DialogYesNo(app::Application *app, const std::string &name) : Dialo no->setPenFocusWidth(3); no->setFilled(false); no->setBorderColor(ColorFullBlack); - no->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + no->setEdges(RectangleEdge::Bottom | RectangleEdge::Top); no->setFont(style::window::font::big); no->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); no->activatedCallback = [=](Item &) -> bool { @@ -124,7 +124,7 @@ DialogYesNo::DialogYesNo(app::Application *app, const std::string &name) : Dialo yes->setPenFocusWidth(3); yes->setFilled(false); yes->setBorderColor(ColorFullBlack); - yes->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + yes->setEdges(RectangleEdge::Bottom | RectangleEdge::Top); yes->setFont(style::window::font::big); yes->setAlignment(Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); yes->activatedCallback = [=](Item &) -> bool { return false; }; @@ -155,7 +155,7 @@ DialogYesNoIconTxt::DialogYesNoIconTxt(app::Application *app, const std::string iconText->setText(""); iconText->setTextType(TextType::SINGLE_LINE); iconText->setEditMode(EditMode::BROWSE); - iconText->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + iconText->setEdges(RectangleEdge::None); iconText->setFont(style::window::font::largelight); iconText->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::None)); setFocusItem(no); diff --git a/module-gui/gui/Common.hpp b/module-gui/gui/Common.hpp index 683f3dd41..ab84b1551 100644 --- a/module-gui/gui/Common.hpp +++ b/module-gui/gui/Common.hpp @@ -96,46 +96,42 @@ namespace gui return lhs; } - enum class RectangleEdgeFlags + enum class RectangleEdge { - GUI_RECT_EDGE_NO_EDGES = 0x00, - GUI_RECT_EDGE_TOP = 0x01, - GUI_RECT_EDGE_BOTTOM = 0x02, - GUI_RECT_EDGE_LEFT = 0x04, - GUI_RECT_EDGE_RIGHT = 0x08, - GUI_RECT_ALL_EDGES = 0x0F + None = 0x00, + Top = 0x01, + Bottom = 0x02, + Left = 0x04, + Right = 0x08, + All = 0x0F }; - // bool operator&( const RectangleEdgeFlags& lhs, const RectangleEdgeFlags& rhs ); - // RectangleEdgeFlags operator|( const RectangleEdgeFlags& lhs, const RectangleEdgeFlags& rhs ); - // RectangleEdgeFlags operator|=( const RectangleEdgeFlags& lhs, const RectangleEdgeFlags& rhs ); - - enum class RectangleCornerFlags + enum class RectangleRoundedCorner { - GUI_RECT_CORNER_NO_CORNERS = 0x00, - GUI_RECT_CORNER_TOP_LEFT = 0x10, - GUI_RECT_CORNER_TOP_RIGHT = 0x20, - GUI_RECT_CORNER_BOTTOM_LEFT = 0x40, - GUI_RECT_CORNER_BOTTOM_RIGHT = 0x80, - GUI_RECT_ALL_CORNERS = 0xF0, + None = 0x00, + TopLeft = 0x10, + TopRight = 0x20, + BottomLeft = 0x40, + BottomRight = 0x80, + All = 0xF0, }; - enum class RectangleFlatFlags + enum class RectangleFlatEdge { - GUI_RECT_FLAT_NO_FLAT = 0x00, - GUI_RECT_FLAT_TOP_LEFT = 0x01, - GUI_RECT_FLAT_TOP_RIGHT = 0x02, - GUI_RECT_FLAT_BOTTOM_LEFT = 0x04, - GUI_RECT_FLAT_BOTTOM_RIGHT = 0x08 + None = 0x00, + TopLeft = 0x01, + TopRight = 0x02, + BottomLeft = 0x04, + BottomRight = 0x08 }; - enum class RectangleYapFlags + enum class RectangleYap { - GUI_RECT_YAP_NO_YAPS = 0x00, - GUI_RECT_YAP_TOP_LEFT = 0x10, - GUI_RECT_YAP_TOP_RIGHT = 0x20, - GUI_RECT_YAP_BOTTOM_LEFT = 0x40, - GUI_RECT_YAP_BOTTOM_RIGHT = 0x80, + None = 0x00, + TopLeft = 0x10, + TopRight = 0x20, + BottomLeft = 0x40, + BottomRight = 0x80, }; typedef uint32_t (*timeSecondsFunctionPtr)(); diff --git a/module-gui/gui/GuiCommon.cpp b/module-gui/gui/GuiCommon.cpp index 131bc1351..b41c8a22f 100644 --- a/module-gui/gui/GuiCommon.cpp +++ b/module-gui/gui/GuiCommon.cpp @@ -13,18 +13,19 @@ namespace gui static timeSecondsFunctionPtr timeSecondsFunction = nullptr; - bool operator&(const gui::RectangleEdgeFlags &lhs, const gui::RectangleEdgeFlags &rhs) + bool operator&(const gui::RectangleEdge &lhs, const gui::RectangleEdge &rhs) { - return static_cast(lhs) & static_cast(rhs); + using T = std::underlying_type_t; + return static_cast(static_cast(lhs) & static_cast(rhs)); } - RectangleEdgeFlags operator|(const RectangleEdgeFlags &lhs, const RectangleEdgeFlags &rhs) + RectangleEdge operator|(const RectangleEdge &lhs, const RectangleEdge &rhs) { - using T = std::underlying_type_t; - return static_cast(static_cast(lhs) | static_cast(rhs)); + using T = std::underlying_type_t; + return static_cast(static_cast(lhs) | static_cast(rhs)); } - RectangleEdgeFlags operator|=(RectangleEdgeFlags &lhs, const RectangleEdgeFlags &rhs) + RectangleEdge operator|=(RectangleEdge &lhs, const RectangleEdge &rhs) { lhs = lhs | rhs; return lhs; diff --git a/module-gui/gui/core/CMakeLists.txt b/module-gui/gui/core/CMakeLists.txt index 41816a472..0d6cd561c 100644 --- a/module-gui/gui/core/CMakeLists.txt +++ b/module-gui/gui/core/CMakeLists.txt @@ -11,6 +11,11 @@ target_sources( ${PROJECT_NAME} "${CMAKE_CURRENT_LIST_DIR}/BoundingBox.cpp" "${CMAKE_CURRENT_LIST_DIR}/Context.cpp" "${CMAKE_CURRENT_LIST_DIR}/Renderer.cpp" + "${CMAKE_CURRENT_LIST_DIR}/renderers/PixelRenderer.cpp" + "${CMAKE_CURRENT_LIST_DIR}/renderers/LineRenderer.cpp" + "${CMAKE_CURRENT_LIST_DIR}/renderers/ArcRenderer.cpp" + "${CMAKE_CURRENT_LIST_DIR}/renderers/CircleRenderer.cpp" + "${CMAKE_CURRENT_LIST_DIR}/renderers/RectangleRenderer.cpp" "${CMAKE_CURRENT_LIST_DIR}/PixMap.cpp" "${CMAKE_CURRENT_LIST_DIR}/ImageManager.cpp" "${CMAKE_CURRENT_LIST_DIR}/ImageMap.cpp" @@ -24,6 +29,11 @@ target_sources( ${PROJECT_NAME} "${CMAKE_CURRENT_LIST_DIR}/BoundingBox.hpp" "${CMAKE_CURRENT_LIST_DIR}/Context.hpp" "${CMAKE_CURRENT_LIST_DIR}/Renderer.hpp" + "${CMAKE_CURRENT_LIST_DIR}/renderers/PixelRenderer.hpp" + "${CMAKE_CURRENT_LIST_DIR}/renderers/LineRenderer.hpp" + "${CMAKE_CURRENT_LIST_DIR}/renderers/ArcRenderer.hpp" + "${CMAKE_CURRENT_LIST_DIR}/renderers/CircleRenderer.hpp" + "${CMAKE_CURRENT_LIST_DIR}/renderers/RectangleRenderer.hpp" "${CMAKE_CURRENT_LIST_DIR}/PixMap.hpp" "${CMAKE_CURRENT_LIST_DIR}/ImageManager.hpp" "${CMAKE_CURRENT_LIST_DIR}/ImageMap.hpp" diff --git a/module-gui/gui/core/DrawCommand.hpp b/module-gui/gui/core/DrawCommand.hpp index e7bf489b5..ff4b29691 100644 --- a/module-gui/gui/core/DrawCommand.hpp +++ b/module-gui/gui/core/DrawCommand.hpp @@ -115,13 +115,13 @@ namespace gui uint16_t h; uint16_t radius; // flags that defines whether paint given border - RectangleEdgeFlags edges; + RectangleEdge edges; // flags that defines which edge should be flat. This will disable roundness on both sides of the edge. - RectangleFlatFlags flatEdges; + RectangleFlatEdge flatEdges; // flags that defines whether paint given corner (only for rounded corners) - RectangleCornerFlags corners; + RectangleRoundedCorner corners; // flags indicating yaps for speech bubbles, it takes precendece over other properties - RectangleYapFlags yaps; + RectangleYap yaps; // defines which of the edges and corners are painted unsigned short yapSize = 0; bool filled; @@ -129,9 +129,8 @@ namespace gui Color fillColor; Color borderColor; CommandRectangle() - : x{0}, y{0}, w{0}, h{0}, radius{0}, edges{RectangleEdgeFlags::GUI_RECT_ALL_EDGES}, - flatEdges{RectangleFlatFlags::GUI_RECT_FLAT_NO_FLAT}, corners{RectangleCornerFlags::GUI_RECT_ALL_CORNERS}, - yaps{RectangleYapFlags::GUI_RECT_YAP_NO_YAPS}, yapSize{0}, filled{false}, penWidth{1}, + : x{0}, y{0}, w{0}, h{0}, radius{0}, edges{RectangleEdge::All}, flatEdges{RectangleFlatEdge::None}, + corners{RectangleRoundedCorner::All}, yaps{RectangleYap::None}, yapSize{0}, filled{false}, penWidth{1}, fillColor(ColorFullBlack), borderColor(ColorFullBlack) { id = DrawCommandID::GUI_DRAW_RECT; diff --git a/module-gui/gui/core/Renderer.cpp b/module-gui/gui/core/Renderer.cpp index debf48ea2..ddab0970c 100644 --- a/module-gui/gui/core/Renderer.cpp +++ b/module-gui/gui/core/Renderer.cpp @@ -11,6 +11,11 @@ extern "C" #include "Context.hpp" #include "ImageManager.hpp" #include "../Common.hpp" +// renderers +#include "renderers/LineRenderer.hpp" +#include "renderers/ArcRenderer.hpp" +#include "renderers/CircleRenderer.hpp" +#include "renderers/RectangleRenderer.hpp" // utils #include "log/log.hpp" @@ -34,905 +39,85 @@ extern "C" namespace gui { - void Renderer::drawPixel(Context *ctx, Point point, Color color) - { - const auto contextWidth = ctx->getW(); - const auto position = point.y * contextWidth + point.x; - memset(ctx->getData() + position, color.intensity, 1); - } - void Renderer::drawLine(Context *ctx, CommandLine *cmd) { + using renderer::LineRenderer; const Point p1{cmd->x1, cmd->y1}; const Point p2{cmd->x2, cmd->y2}; const auto color = cmd->color; - drawLine(ctx, p1, p2, color); - } - - void Renderer::drawLine(Context *ctx, Point start, Point end, Color color) - { - if (color.alpha == Color::FullTransparent) { - return; - } - - const int distanceX = std::abs(end.x - start.x); - const int distanceY = std::abs(end.y - start.y); - const auto step = distanceX >= distanceY ? distanceX : distanceY; - - auto dx = static_cast(distanceX) / step; - dx = end.x < start.x ? -dx : dx; - auto dy = static_cast(distanceY) / step; - dy = end.y < start.y ? -dy : dy; - - float x = start.x; - float y = start.y; - for (int i = 0; i < step; ++i) { - drawPixel(ctx, Point(x, y), color); - x += dx; - y += dy; - } - } - - // any checks are not performed as this should be done by function handling draw command - void Renderer::drawHorizontalLine( - Context *ctx, int16_t x, int16_t y, uint16_t width, uint16_t penWidth, Color color, LineExpansionDirection dir) - { - // if color is fully transparent - return - if (color.alpha == Color::FullTransparent) { - return; - } - // If expansion is neither down or up - return. - if (dir != LineExpansionDirection::LINE_EXPAND_DOWN && dir != LineExpansionDirection::LINE_EXPAND_UP) { - return; - } - - for (int i = 0; i < penWidth; ++i) { - const auto offset = (dir == LineExpansionDirection::LINE_EXPAND_DOWN) ? i : -i - 1; - drawLine(ctx, Point{x, y + offset}, Point{x + width, y + offset}, color); - } - } - - // any checks are not performed as this should be done by function handling draw command - void Renderer::drawVerticalLine( - Context *ctx, int16_t x, int16_t y, uint16_t height, uint16_t penWidth, Color color, LineExpansionDirection dir) - { - // if color is fully transparent - return. - if (color.alpha == Color::FullTransparent) { - return; - } - // If expansion is neither left or right - return. - if (dir != LineExpansionDirection::LINE_EXPAND_LEFT && dir != LineExpansionDirection::LINE_EXPAND_RIGHT) { - return; - } - - for (int i = 0; i < penWidth; ++i) { - const auto offset = (dir == LineExpansionDirection::LINE_EXPAND_RIGHT) ? i : -i - 1; - drawLine(ctx, Point{x + offset, y}, Point{x + offset, y + height}, color); - } - } - - void Renderer::draw45degLine(Context *ctx, - int16_t x, - int16_t y, - uint16_t side, - uint16_t penWidth, - Color color, - LineExpansionDirection dir, - bool toRight, - Line45degEnd lineEnds) - { - // if color is fully transparent - return - if (color.alpha == 0x0F) { - return; - } - - uint16_t penWidthAcross = 0; - switch (penWidth) { - case 1: - penWidthAcross = 1; - break; - case 2: - penWidthAcross = 3; - break; - case 3: - penWidthAcross = 5; - break; - default: - penWidthAcross = penWidth * 141 / 100; - break; - } - - // approach: as in drawVertical rather than drawHorizontal. draw small horizontal lines offset to preceding one - uint32_t drawOffset = y * ctx->getW() + x; - if (dir & LineExpansionDirection::LINE_EXPAND_RIGHT) { - // no action needed unless there is need to draw gradient - } - else if (dir & LineExpansionDirection::LINE_EXPAND_LEFT) { - drawOffset -= penWidthAcross; - } - - int32_t rowStride = ctx->getW(); - if (dir & LineExpansionDirection::LINE_EXPAND_DOWN) {} - else if (dir & LineExpansionDirection::LINE_EXPAND_UP) { - drawOffset -= rowStride * penWidth; - } - // memsets are vertical. they fill a column - - // produces top tip - if (lineEnds & Line45degEnd::TOP_TIP) { - drawOffset -= rowStride * penWidthAcross; - for (uint32_t skew = 0; skew < penWidthAcross; skew++) { - if (toRight) { - memset(ctx->getData() + drawOffset, color.intensity, skew); - } - else { - memset(ctx->getData() + drawOffset + (penWidthAcross - skew), color.intensity, (skew)); - } - drawOffset += rowStride; - } - } - // produces \\\ with flat top and bottom - for (uint32_t skew = 0; skew < side; skew++) { - memset(ctx->getData() + drawOffset, color.intensity, penWidthAcross); - drawOffset += rowStride; - drawOffset += (toRight ? 1 : -1); // add skew - } - // produces bottom tip - if (lineEnds & Line45degEnd::BOTTOM_TIP) { - for (uint32_t skew = 0; skew < penWidthAcross; skew++) { - if (toRight) { - memset(ctx->getData() + (drawOffset + skew), color.intensity, (penWidthAcross - skew) - 1); - } - else { - memset(ctx->getData() + drawOffset + 1, color.intensity, (penWidthAcross - skew) - 1); - } - drawOffset += rowStride; - } - } + LineRenderer::draw(ctx, p1, p2, color); } void Renderer::drawRectangle(Context *ctx, CommandRectangle *cmd) { + using renderer::RectangleRenderer; - // check if there is anything to draw + // First, check if there is anything to draw if (cmd->w == 0 || cmd->h == 0) { return; } - - if (((cmd->fillColor.alpha == 0x0F) && (cmd->borderColor.alpha == 0x0F)) || - ((cmd->filled == false) && (cmd->borderColor.alpha == 0x0F))) { + if (cmd->fillColor.alpha == Color::FullTransparent && cmd->borderColor.alpha == Color::FullTransparent) { return; } - // get copy of original context using x,y of draw coordinates and original size of the widget - Context *drawCtx; - bool copyContext = false; - int16_t wgtX = 0, wgtY = 0; - uint16_t wgtW = cmd->areaW, wgtH = cmd->areaH; - int16_t wgtR = cmd->radius; - - if (cmd->yaps & (RectangleYapFlags::GUI_RECT_YAP_BOTTOM_LEFT | RectangleYapFlags::GUI_RECT_YAP_TOP_LEFT)) { - wgtX += cmd->yapSize; - wgtW -= cmd->yapSize; - } - if (cmd->yaps & (RectangleYapFlags::GUI_RECT_YAP_BOTTOM_RIGHT | RectangleYapFlags::GUI_RECT_YAP_TOP_RIGHT)) { - wgtW -= cmd->yapSize; + if (!cmd->filled && cmd->borderColor.alpha == Color::FullTransparent) { + return; } - // check if there is a need or making copy of context to use is as background - if ((cmd->areaW == cmd->w) && (cmd->areaH == cmd->h)) { - drawCtx = ctx; - wgtX += cmd->x; - wgtY += cmd->y; + Context *drawingContext = ctx; + Point position; + if (cmd->yaps & (RectangleYap::BottomLeft | RectangleYap::TopLeft)) { + position.x += cmd->yapSize; + } + Length width = cmd->areaW; + Length height = cmd->areaH; + if (cmd->yaps != RectangleYap::None) { + width -= cmd->yapSize; + } + + if (cmd->areaW == cmd->w && cmd->areaH == cmd->h) { + position.x += cmd->x; + position.y += cmd->y; } else { - copyContext = true; - int16_t x = cmd->x; - int16_t y = cmd->y; - if (cmd->areaX < 0) - x += cmd->areaX; - if (cmd->areaY < 0) - y += cmd->areaY; - drawCtx = ctx->get(x, y, cmd->areaW, cmd->areaH); + const auto x = cmd->areaX < 0 ? cmd->x + cmd->areaX : cmd->x; + const auto y = cmd->areaY < 0 ? cmd->y + cmd->areaY : cmd->y; + drawingContext = ctx->get(x, y, cmd->areaW, cmd->areaH); } - // if rounding of corners is 0 - if (wgtR == 0) { - // fill field inside the rectangle if fill flag is set - if (cmd->filled) { - uint32_t offset = wgtY * drawCtx->getW() + wgtX; - for (int32_t y = 0; y < cmd->areaH; y++) { - memset(drawCtx->getData() + offset, cmd->fillColor.intensity, wgtW); - offset += drawCtx->getW(); - } - } - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_TOP) - drawHorizontalLine(drawCtx, - wgtX, - wgtY, - wgtW, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_DOWN); - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM) - drawHorizontalLine(drawCtx, - wgtX, - wgtY + wgtH, - wgtW, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_UP); - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_LEFT) - drawVerticalLine(drawCtx, - wgtX, - wgtY, - wgtH, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_RIGHT); - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_RIGHT) - drawVerticalLine(drawCtx, - wgtX + wgtW, - wgtY, - wgtH, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_LEFT); + Length radius = cmd->radius; + if (radius == 0) { + RectangleRenderer::drawFlat( + drawingContext, position, width, height, RectangleRenderer::DrawableStyle::from(*cmd)); } else { - - // calculate centers of circle for all corners - int16_t xcTopRight = wgtX + wgtW - wgtR; - int16_t xcTopLeft = wgtX + wgtR; - int16_t xcBottomRight = xcTopRight; - int16_t xcBottomLeft = xcTopLeft; - - int16_t ycTopRight = wgtY + wgtR; - int16_t ycTopLeft = ycTopRight; - int16_t ycBottomRight = wgtY + cmd->h - wgtR; - int16_t ycBottomLeft = ycBottomRight; - - int x = wgtR, y = 0; - - // Calculate coordinates of the points on the circle's quarter. - std::unique_ptr Px, Py; - try { - Px = std::unique_ptr(new int16_t[2 * wgtR * sizeof(int16_t)]); - Py = std::unique_ptr(new int16_t[2 * wgtR * sizeof(int16_t)]); - } - catch (const std::bad_alloc &) { - LOG_ERROR("Allocation error"); - return; - } - - memset(Px.get(), 0, 2 * wgtR * sizeof(int16_t)); - memset(Py.get(), 0, 2 * wgtR * sizeof(int16_t)); - int32_t index = 0; - // index where middle point of quarter of arc is located. This means that Y starts to grow faster than X - int32_t middleIndex = 0; - // number of points in the quater arc - int32_t pointCount = 0; - Px[index] = x; - Py[index] = y; - ++index; - pointCount++; - - int P = 1 - wgtR; - - while (y < wgtR) // just a failsafe - { - y++; - - // Mid-point is inside or on the perimeter - if (P <= 0) - P = P + 2 * y + 1; - - // Mid-point is outside the perimeter - else { - x--; - P = P + 2 * y - 2 * x + 1; - } - - Px[index] = x; - Py[index] = y; - - // All the perimeter points have already been printed - if (x <= y) { - - int16_t pointsLeft = 0; - int indexOut = index; - if (x == y) { - // we have a central point. it can be drawn with either type of line - middleIndex = index; - pointsLeft = index; - pointsLeft++; - } - else if (x < y) { - pointsLeft = index; - // we don't have a central point. halves are alike - index--; - middleIndex = index; - } - int xValue = 0; // Px[index]; - - while (pointsLeft > 0) { - Px[indexOut] = Py[index]; - Py[indexOut] = Px[index] - 2 * xValue; - index--; - indexOut++; - pointCount++; - pointsLeft--; - } - break; - } - ++index; - pointCount++; - } - - // fill the rectangle if fill flag is set using fillColor. Painting is divieded into 3 parts - // First part takes into consideration if top corners exists, are they rounded or are they sharp. - // Second draws simple lines between between left and right edges. - // Third part takes into consideration if bottom corners exists, are they rounded or are they sharp. - - if (cmd->filled) { - // corners - if (cmd->corners & RectangleCornerFlags::GUI_RECT_CORNER_TOP_RIGHT) { - // if corner then evaluate: sharp corner (aka flat), sms (aka yap), else: round. - if (cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_TOP_RIGHT) {} - else if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_TOP_RIGHT) { - } - else { - // draw arc from 0 index up to mid point using horizontal line - index = 0; - // X is growing faster - for (index = 1; index < middleIndex; ++index) { - // then draw the outline - // fill the quarter first - drawHorizontalLine(drawCtx, - xcTopRight, - ycTopRight - Py[index], - Px[index], - 1, - cmd->fillColor, - gui::LineExpansionDirection::LINE_EXPAND_DOWN); - ; - } - // Y is growing faster - for (index = middleIndex; index < pointCount - 1; ++index) { - drawVerticalLine(drawCtx, - xcTopRight + Px[index], - ycTopRight - Py[index] + cmd->penWidth, - Py[index] - cmd->penWidth, - 1, - cmd->fillColor, - gui::LineExpansionDirection::LINE_EXPAND_LEFT); - } - } - } - if (cmd->corners & RectangleCornerFlags::GUI_RECT_CORNER_BOTTOM_RIGHT) { - if (cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_BOTTOM_RIGHT) {} - else if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_BOTTOM_RIGHT) { - } - else { - // draw arc from 0 index up to mid point using horizontal line - index = 0; - // X is growing faster - for (index = 1; index < middleIndex; ++index) { - // fill the quarter first - drawHorizontalLine(drawCtx, - xcBottomRight, - ycBottomRight + Py[index], - Px[index] - cmd->penWidth, - 1, - cmd->fillColor, - gui::LineExpansionDirection::LINE_EXPAND_UP); - } - // Y is growing faster - for (index = middleIndex; index < pointCount - 1; ++index) { - drawVerticalLine(drawCtx, - xcBottomRight + Px[index], - ycBottomRight /*+ 1*/, - Py[index], - 1, - cmd->fillColor, - gui::LineExpansionDirection::LINE_EXPAND_LEFT); - } - } - } - if (cmd->corners & RectangleCornerFlags::GUI_RECT_CORNER_TOP_LEFT) { - if (cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_TOP_LEFT) {} - else if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_TOP_LEFT) { - } - else { - // draw arc from 0 index up to mid point using horizontal line - index = 0; - // X is growing faster - for (index = 1; index < middleIndex; ++index) { - // fill the quarter first - drawHorizontalLine(drawCtx, - xcTopLeft - Px[index] + cmd->penWidth, - ycTopLeft - Py[index], - Px[index] - cmd->penWidth, - 1, - cmd->fillColor, - gui::LineExpansionDirection::LINE_EXPAND_DOWN); - } - // Y is growing faster - for (index = middleIndex; index < pointCount - 1; ++index) { - drawVerticalLine(drawCtx, - xcTopLeft - Px[index] /*+ 1*/, - ycTopLeft - Py[index] + cmd->penWidth, - Py[index] - cmd->penWidth, - 1, - cmd->fillColor, - gui::LineExpansionDirection::LINE_EXPAND_RIGHT); - } - } - } - if (cmd->corners & RectangleCornerFlags::GUI_RECT_CORNER_BOTTOM_LEFT) { - if (cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_BOTTOM_LEFT) {} - else if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_BOTTOM_LEFT) { - } - else { - // draw arc from 0 index up to mid point using horizontal line - index = 0; - // X is growing faster - for (index = 1; index < middleIndex; ++index) { - // fill the quarter first - drawHorizontalLine(drawCtx, - xcBottomLeft - Px[index] + cmd->penWidth, - ycBottomLeft + Py[index], - Px[index] - cmd->penWidth, - 1, - cmd->fillColor, - gui::LineExpansionDirection::LINE_EXPAND_UP); - } - - ; - // Y is growing faster - for (index = middleIndex; index < pointCount - 1; ++index) { - drawVerticalLine(drawCtx, - xcBottomLeft - Px[index], - ycBottomLeft, - Py[index] - cmd->penWidth, - 1, - cmd->fillColor, - gui::LineExpansionDirection::LINE_EXPAND_RIGHT); - } - } - } - - // edges - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_TOP) { - drawHorizontalLine(drawCtx, - wgtX + wgtR, - wgtY, - wgtW - 2 * wgtR, - wgtR, - cmd->fillColor, - LineExpansionDirection::LINE_EXPAND_DOWN); - } - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM) { - drawHorizontalLine(drawCtx, - wgtX + wgtR, - wgtY + wgtH - wgtR, - wgtW - 2 * wgtR, - wgtR, - cmd->fillColor, - LineExpansionDirection::LINE_EXPAND_DOWN); - } - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_LEFT) { - drawHorizontalLine(drawCtx, - wgtX, - wgtY + wgtR, - wgtR, - wgtH - 2 * wgtR, - cmd->fillColor, - LineExpansionDirection::LINE_EXPAND_DOWN); - } - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_RIGHT) { - drawHorizontalLine(drawCtx, - wgtX + wgtW - wgtR, - wgtY + wgtR, - wgtR, - wgtH - 2 * wgtR, - cmd->fillColor, - LineExpansionDirection::LINE_EXPAND_DOWN); - } - - // center - drawHorizontalLine(drawCtx, - wgtX + wgtR, - wgtY + wgtR, - wgtW - 2 * wgtR, - wgtH - 2 * wgtR, - cmd->fillColor, - LineExpansionDirection::LINE_EXPAND_DOWN); - } - - // Here rounded border is painted - - // upper right corner - if (cmd->corners & RectangleCornerFlags::GUI_RECT_CORNER_TOP_RIGHT) { - // if corner then evaluate: sharp corner (aka flat), sms (aka yap), else: round. - if (cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_TOP_RIGHT) {} - else if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_TOP_RIGHT) { - } - else { - // draw arc from 0 index up to mid point using horizontal line - index = 0; - // X is growing faster - for (index = 0; index < middleIndex; ++index) { - // then draw the outline - drawHorizontalLine(drawCtx, - xcTopRight + Px[index] - cmd->penWidth, - ycTopRight - Py[index], - cmd->penWidth, - 1, - cmd->borderColor, - gui::LineExpansionDirection::LINE_EXPAND_DOWN); - } - // Y is growing faster - for (index = middleIndex; index < pointCount; ++index) { - drawVerticalLine(drawCtx, - xcTopRight + Px[index], - ycTopRight - Py[index], - cmd->penWidth, - 1, - cmd->borderColor, - gui::LineExpansionDirection::LINE_EXPAND_LEFT); - - ; - } - } - } - - // bottom right corner - if (cmd->corners & RectangleCornerFlags::GUI_RECT_CORNER_BOTTOM_RIGHT) { - if (cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_BOTTOM_RIGHT) {} - else if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_BOTTOM_RIGHT) { - } - else { - // draw arc from 0 index up to mid point using horizontal line - index = 0; - // X is growing faster - for (index = 0; index < middleIndex; ++index) { - drawHorizontalLine(drawCtx, - xcBottomRight + Px[index] - cmd->penWidth, - ycBottomRight + Py[index], - cmd->penWidth, - 1, - cmd->borderColor, - gui::LineExpansionDirection::LINE_EXPAND_UP); - } - // Y is growing faster - for (index = middleIndex; index < pointCount; ++index) { - drawVerticalLine(drawCtx, - xcBottomRight + Px[index], - ycBottomRight + Py[index] - cmd->penWidth /*+ 1*/, - cmd->penWidth, - 1, - cmd->borderColor, - gui::LineExpansionDirection::LINE_EXPAND_LEFT); - } - } - } - - // upper left corner - if (cmd->corners & RectangleCornerFlags::GUI_RECT_CORNER_TOP_LEFT) { - if (cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_TOP_LEFT) {} - else if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_TOP_LEFT) { - } - else { - // draw arc from 0 index up to mid point using horizontal line - index = 0; - // X is growing faster - for (index = 0; index < middleIndex; ++index) { - drawHorizontalLine(drawCtx, - xcTopLeft - Px[index], - ycTopLeft - Py[index], - cmd->penWidth, - 1, - cmd->borderColor, - gui::LineExpansionDirection::LINE_EXPAND_DOWN); - } - // Y is growing faster - for (index = middleIndex; index < pointCount; ++index) { - drawVerticalLine(drawCtx, - xcTopLeft - Px[index] /*+ 1*/, - ycTopLeft - Py[index], - cmd->penWidth, - 1, - cmd->borderColor, - gui::LineExpansionDirection::LINE_EXPAND_RIGHT); - } - } - } - - // lower left corner - if (cmd->corners & RectangleCornerFlags::GUI_RECT_CORNER_BOTTOM_LEFT) { - if (cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_BOTTOM_LEFT) {} - else if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_BOTTOM_LEFT) { - } - else { - // draw arc from 0 index up to mid point using horizontal line - index = 0; - // X is growing faster - for (index = 0; index < middleIndex; ++index) { - - drawHorizontalLine(drawCtx, - xcBottomLeft - Px[index], - ycBottomLeft + Py[index], - cmd->penWidth, - 1, - cmd->borderColor, - gui::LineExpansionDirection::LINE_EXPAND_UP); - } - // Y is growing faster - for (index = middleIndex; index < pointCount; ++index) { - - drawVerticalLine(drawCtx, - xcBottomLeft - Px[index], - ycBottomLeft + Py[index] - cmd->penWidth, - cmd->penWidth, - 1, - cmd->borderColor, - gui::LineExpansionDirection::LINE_EXPAND_RIGHT); - } - } - } - - // render edges between corners - int16_t xs, ys, le; - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_TOP) { - le = wgtW; - // left "corner" first - if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_TOP_LEFT) { - xs = -cmd->yapSize; - xs += cmd->penWidth; - } - else { - xs = wgtR * (!(cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_TOP_LEFT)); - } - // right "corner" now - le -= xs; - if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_TOP_RIGHT) { - le += (cmd->yapSize - cmd->penWidth); - } - else { - le -= wgtR * (!(cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_TOP_RIGHT)); - } - ys = 0; - drawHorizontalLine(drawCtx, - wgtX + xs, - wgtY + ys, - le, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_DOWN); - } - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM) { - le = wgtW; - // left "corner" first - if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_BOTTOM_LEFT) { - xs = -cmd->yapSize; - xs += cmd->penWidth; - } - else { - xs = wgtR * (!(cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_BOTTOM_LEFT)); - } - // right "corner" now - le -= xs; - if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_BOTTOM_RIGHT) { - le += (cmd->yapSize - cmd->penWidth); - } - else { - le -= wgtR * (!(cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_BOTTOM_RIGHT)); - } - ys = wgtH; // beware. doesn't -1 break rounded corners ? - drawHorizontalLine(drawCtx, - wgtX + xs, - wgtY + ys, - le, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_UP); - } - - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_LEFT) { - // top "corner" first - xs = 0; - if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_TOP_LEFT) { - ys = cmd->yapSize; - draw45degLine(drawCtx, - wgtX + xs - cmd->yapSize, - wgtY + ys - cmd->yapSize, - cmd->yapSize, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_RIGHT, - true, - Line45degEnd::BOTTOM_TIP); - } - else { - ys = wgtR * (!(cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_TOP_LEFT)); - } - // bottom "corner" now - le = wgtH - ys; - - if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_BOTTOM_LEFT) { - le -= cmd->yapSize; - draw45degLine(drawCtx, - wgtX + xs, - wgtY + ys + le, - cmd->yapSize, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_RIGHT, - false, - Line45degEnd::TOP_TIP); - } - else { - le -= wgtR * (!(cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_BOTTOM_LEFT)); - } - drawVerticalLine(drawCtx, - wgtX + xs, - wgtY + ys, - le, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_RIGHT); - } - if (cmd->edges & RectangleEdgeFlags::GUI_RECT_EDGE_RIGHT) { - // top "corner" first - xs = wgtW; - if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_TOP_RIGHT) { - ys = cmd->yapSize; - draw45degLine(drawCtx, - wgtX + xs + cmd->yapSize, - wgtY + ys - cmd->yapSize, - cmd->yapSize, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_LEFT, - false, - Line45degEnd::BOTTOM_TIP); - } - else { - ys = wgtR * (!(cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_TOP_RIGHT)); - } - // bottom "corner" now - le = wgtH - ys; - - if (cmd->yaps & RectangleYapFlags::GUI_RECT_YAP_BOTTOM_RIGHT) { - le -= cmd->yapSize; - draw45degLine(drawCtx, - wgtX + xs, - wgtY + ys + le, - cmd->yapSize, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_LEFT, - true, - Line45degEnd::TOP_TIP); - } - else { - le -= wgtR * (!(cmd->flatEdges & RectangleFlatFlags::GUI_RECT_FLAT_BOTTOM_RIGHT)); - } - drawVerticalLine(drawCtx, - wgtX + xs, - wgtY + ys, - le, - cmd->penWidth, - cmd->borderColor, - LineExpansionDirection::LINE_EXPAND_LEFT); - } + RectangleRenderer::draw( + drawingContext, position, width, height, RectangleRenderer::DrawableStyle::from(*cmd)); } - // if drawing was performed in temporary context - // reinsert drawCtx into last context - if (copyContext) { - ctx->insertArea(cmd->x, cmd->y, cmd->areaX, cmd->areaY, cmd->w, cmd->h, drawCtx); - delete drawCtx; + if (drawingContext != ctx) { + ctx->insertArea(cmd->x, cmd->y, cmd->areaX, cmd->areaY, cmd->w, cmd->h, drawingContext); + delete drawingContext; } } void Renderer::drawArc(Context *ctx, CommandArc *cmd) { + using renderer::ArcRenderer; const auto center{cmd->center}; const auto radius{cmd->radius}; const auto startAngle{cmd->start}; const auto sweepAngle{cmd->sweep}; - const auto color{cmd->borderColor}; - const auto width{cmd->width}; - drawArc(ctx, center, radius, startAngle, sweepAngle, color, width); - } - - void Renderer::drawArc(Context *ctx, - Point center, - Length radius, - trigonometry::Degrees begin, - trigonometry::Degrees sweep, - Color color, - int width) - { - if (width == 1) { - drawArc(ctx, center, radius, begin, sweep, color); - return; - } - - const auto start = trigonometry::toRadians(begin); - const auto end = trigonometry::toRadians(begin + sweep); - constexpr double step{0.001}; - - double cosine = .0; - double sine = .0; - for (double radians = start; radians <= end; radians += step) { - cosine = std::cos(radians); - sine = std::sin(radians); - for (int i = 0; i < width; ++i) { - const auto r = radius - i; - const auto x = trigonometry::AdjacentSide::fromCosine(cosine, r); - const auto y = trigonometry::OppositeSide::fromSine(sine, r); - drawPixel(ctx, Point(center.x + x, center.y + y), color); - } - } - } - - void Renderer::drawArc(Context *ctx, - Point center, - Length radius, - trigonometry::Degrees begin, - trigonometry::Degrees sweep, - Color color) - { - const auto start = trigonometry::toRadians(begin); - const auto end = trigonometry::toRadians(begin + sweep); - constexpr double step{0.001}; - - long int x{0}; - long int y{0}; - for (double radians = start; radians <= end; radians += step) { - x = trigonometry::AdjacentSide::fromAngle(radians, radius); - y = trigonometry::OppositeSide::fromAngle(radians, radius); - drawPixel(ctx, Point(center.x + x, center.y + y), color); - } + const auto style = ArcRenderer::DrawableStyle::from(*cmd); + ArcRenderer::draw(ctx, center, radius, startAngle, sweepAngle, style); } void Renderer::drawCircle(Context *ctx, CommandCircle *cmd) { + using renderer::CircleRenderer; const auto center{cmd->center}; const auto radius{cmd->radius}; - const auto color{cmd->borderColor}; - const auto width{cmd->width}; - if (cmd->filled) { - const auto fillColor{cmd->fillColor}; - drawFilledCircle(ctx, center, radius, color, width, fillColor); - return; - } - - drawCircle(ctx, center, radius, color, width); - } - - void Renderer::drawFilledCircle( - Context *ctx, Point center, Length radius, Color borderColor, int borderWidth, Color fillColor) - { - // First, fill the desired area. - const auto r = static_cast(radius); - const auto rr = r * r; - for (auto x = -r; x < r; ++x) { - const auto height = static_cast(std::sqrt(rr - (x * x))); - for (auto y = -height; y < height; ++y) { - drawPixel(ctx, Point(center.x + x, center.y + y), fillColor); - } - } - - // Next, draw a border on top. - drawCircle(ctx, center, radius, borderColor, borderWidth); - } - - void Renderer::drawCircle(Context *ctx, Point center, Length radius, Color color, int width) - { - drawArc(ctx, center, radius, 0, trigonometry::FullAngle, color, width); + const auto style = CircleRenderer::DrawableStyle::from(*cmd); + CircleRenderer::draw(ctx, center, radius, style); } void Renderer::drawChar(Context *context, const int16_t x, const int16_t y, FontGlyph *glyph, const Color color) diff --git a/module-gui/gui/core/Renderer.hpp b/module-gui/gui/core/Renderer.hpp index ffc05ee09..5844ff810 100644 --- a/module-gui/gui/core/Renderer.hpp +++ b/module-gui/gui/core/Renderer.hpp @@ -12,22 +12,6 @@ namespace gui class RawFont; class FontGlyph; - enum class LineExpansionDirection - { - LINE_EXPAND_UP = 1, - LINE_EXPAND_DOWN = 1 << 1, - LINE_EXPAND_LEFT = 1 << 2, - LINE_EXPAND_RIGHT = 1 << 3 - }; - - enum class Line45degEnd - { - TOP_FLAT = 1, - TOP_TIP = 1 << 1, - BOTTOM_FLAT = 1 << 2, - BOTTOM_TIP = 1 << 3 - }; - class Renderer { /** @@ -45,69 +29,14 @@ namespace gui * */ protected: - void drawPixel(Context *ctx, Point point, Color color); - void drawLine(Context *ctx, CommandLine *cmd); - void drawLine(Context *ctx, Point start, Point end, Color color); - - void drawHorizontalLine(Context *ctx, - int16_t x, - int16_t y, - uint16_t width, - uint16_t penWidth, - Color color, - LineExpansionDirection dir); - - void drawVerticalLine(Context *ctx, - int16_t x, - int16_t y, - uint16_t height, - uint16_t penWidth, - Color color, - LineExpansionDirection dir); - - /** - * @brief Function for drawing a line skewed at 45 deg with given width in specified direction. by default the - * line is drawn from top to bottom in V-dim and from left to right in H-dim. - * @param[in] toRight changes H-dim draw direction, so it is drawn to the right of vertical axis. - */ - void draw45degLine(Context *ctx, - int16_t x, - int16_t y, - uint16_t side, - uint16_t penWidth, - Color color, - LineExpansionDirection dir, - bool toRight, - Line45degEnd lineEnds = Line45degEnd::TOP_FLAT | Line45degEnd::BOTTOM_FLAT); - void drawRectangle(Context *ctx, CommandRectangle *cmd); void drawArc(Context *ctx, CommandArc *cmd); - void drawArc(Context *ctx, - Point center, - Length radius, - trigonometry::Degrees begin, - trigonometry::Degrees sweep, - Color color); - - void drawArc(Context *ctx, - Point center, - Length radius, - trigonometry::Degrees begin, - trigonometry::Degrees sweep, - Color color, - int width); - void drawCircle(Context *ctx, CommandCircle *cmd); - void drawCircle(Context *ctx, Point center, Length radius, Color color, int width); - - void drawFilledCircle( - Context *ctx, Point center, Length radius, Color borderColor, int borderWidth, Color fillColor); - void drawText(Context *ctx, CommandText *cmd); void drawChar(Context *context, const int16_t x, const int16_t y, FontGlyph *glyph, const Color color); diff --git a/module-gui/gui/core/renderers/ArcRenderer.cpp b/module-gui/gui/core/renderers/ArcRenderer.cpp new file mode 100644 index 000000000..9e00ecb41 --- /dev/null +++ b/module-gui/gui/core/renderers/ArcRenderer.cpp @@ -0,0 +1,74 @@ +#include "ArcRenderer.hpp" +#include "PixelRenderer.hpp" + +namespace gui::renderer +{ + auto ArcRenderer::DrawableStyle::from(const CommandArc &command) -> DrawableStyle + { + return DrawableStyle{command.width, command.borderColor}; + } + + void ArcRenderer::draw(Context *ctx, + Point center, + Length radius, + trigonometry::Degrees begin, + trigonometry::Degrees sweep, + const DrawableStyle &style) + { + if (style.penWidth == 1) { + draw(ctx, center, radius, begin, sweep, style.color); + } + else { + draw(ctx, center, radius, begin, sweep, style.color, style.penWidth); + } + } + + void ArcRenderer::draw(Context *ctx, + Point center, + Length radius, + trigonometry::Degrees begin, + trigonometry::Degrees sweep, + Color color, + Length width) + { + if (width == 1) { + draw(ctx, center, radius, begin, sweep, color); + return; + } + + const auto start = trigonometry::toRadians(begin); + const auto end = trigonometry::toRadians(begin + sweep); + constexpr double step{0.001}; + + double cosine, sine; + for (double radians = start; radians <= end; radians += step) { + cosine = std::cos(radians); + sine = std::sin(radians); + for (Length i = 0; i < width; ++i) { + const auto r = radius - i; + const auto x = trigonometry::AdjacentSide::fromCosine(cosine, r); + const auto y = trigonometry::OppositeSide::fromSine(sine, r); + PixelRenderer::draw(ctx, Point(center.x + x, center.y + y), color); + } + } + } + + void ArcRenderer::draw(Context *ctx, + Point center, + Length radius, + trigonometry::Degrees begin, + trigonometry::Degrees sweep, + Color color) + { + const auto start = trigonometry::toRadians(begin); + const auto end = trigonometry::toRadians(begin + sweep); + constexpr double step{0.001}; + + long int x, y; + for (double radians = start; radians <= end; radians += step) { + x = trigonometry::AdjacentSide::fromAngle(radians, radius); + y = trigonometry::OppositeSide::fromAngle(radians, radius); + PixelRenderer::draw(ctx, Point(center.x + x, center.y + y), color); + } + } +} // namespace gui::renderer diff --git a/module-gui/gui/core/renderers/ArcRenderer.hpp b/module-gui/gui/core/renderers/ArcRenderer.hpp new file mode 100644 index 000000000..32219ef85 --- /dev/null +++ b/module-gui/gui/core/renderers/ArcRenderer.hpp @@ -0,0 +1,51 @@ +#pragma once + +#include "Color.hpp" +#include "Common.hpp" + +#include "DrawCommand.hpp" + +#include + +namespace gui +{ + class Context; +} // namespace gui + +namespace gui::renderer +{ + class ArcRenderer + { + public: + struct DrawableStyle + { + Length penWidth{1}; + Color color{ColorFullBlack}; + + static auto from(const CommandArc &command) -> DrawableStyle; + }; + + static void draw(Context *ctx, + Point center, + Length radius, + trigonometry::Degrees begin, + trigonometry::Degrees sweep, + const DrawableStyle &style); + + private: + static void draw(Context *ctx, + Point center, + Length radius, + trigonometry::Degrees begin, + trigonometry::Degrees sweep, + Color color); + + static void draw(Context *ctx, + Point center, + Length radius, + trigonometry::Degrees begin, + trigonometry::Degrees sweep, + Color color, + Length width); + }; +} // namespace gui::renderer diff --git a/module-gui/gui/core/renderers/CircleRenderer.cpp b/module-gui/gui/core/renderers/CircleRenderer.cpp new file mode 100644 index 000000000..5e3c379a7 --- /dev/null +++ b/module-gui/gui/core/renderers/CircleRenderer.cpp @@ -0,0 +1,45 @@ +#include "CircleRenderer.hpp" + +#include "ArcRenderer.hpp" +#include "PixelRenderer.hpp" + +namespace gui::renderer +{ + auto CircleRenderer::DrawableStyle::from(const CommandCircle &command) -> DrawableStyle + { + return DrawableStyle{command.width, command.borderColor, command.filled ? command.fillColor : ColorNoColor}; + } + + void CircleRenderer::draw(Context *ctx, Point center, Length radius, const DrawableStyle &style) + { + if (style.fillColor == ColorNoColor) { + draw(ctx, center, radius, style.borderColor, style.penWidth); + } + else { + draw(ctx, center, radius, style.borderColor, style.penWidth, style.fillColor); + } + } + + void CircleRenderer::draw( + Context *ctx, Point center, Length radius, Color borderColor, Length borderWidth, Color fillColor) + { + // First, fill the desired area. + const auto r = static_cast(radius); + const auto rr = r * r; + for (auto x = -r; x < r; ++x) { + const auto height = static_cast(std::sqrt(rr - (x * x))); + for (auto y = -height; y < height; ++y) { + PixelRenderer::draw(ctx, Point(center.x + x, center.y + y), fillColor); + } + } + + // Next, draw a border on top. + draw(ctx, center, radius, borderColor, borderWidth); + } + + void CircleRenderer::draw(Context *ctx, Point center, Length radius, Color color, Length width) + { + ArcRenderer::draw(ctx, center, radius, 0, trigonometry::FullAngle, ArcRenderer::DrawableStyle{width, color}); + } + +} // namespace gui::renderer diff --git a/module-gui/gui/core/renderers/CircleRenderer.hpp b/module-gui/gui/core/renderers/CircleRenderer.hpp new file mode 100644 index 000000000..af20a76a3 --- /dev/null +++ b/module-gui/gui/core/renderers/CircleRenderer.hpp @@ -0,0 +1,35 @@ +#pragma once + +#include "Color.hpp" +#include "Common.hpp" + +#include "DrawCommand.hpp" + +namespace gui +{ + class Context; +} // namespace gui + +namespace gui::renderer +{ + class CircleRenderer + { + public: + struct DrawableStyle + { + Length penWidth{1}; + Color borderColor{ColorFullBlack}; + Color fillColor{ColorNoColor}; + + static auto from(const CommandCircle &command) -> DrawableStyle; + }; + + static void draw(Context *ctx, Point center, Length radius, const DrawableStyle &style); + + private: + static void draw(Context *ctx, Point center, Length radius, Color color, Length width); + + static void draw( + Context *ctx, Point center, Length radius, Color borderColor, Length borderWidth, Color fillColor); + }; +} // namespace gui::renderer diff --git a/module-gui/gui/core/renderers/LineRenderer.cpp b/module-gui/gui/core/renderers/LineRenderer.cpp new file mode 100644 index 000000000..5106aff64 --- /dev/null +++ b/module-gui/gui/core/renderers/LineRenderer.cpp @@ -0,0 +1,119 @@ +#include "LineRenderer.hpp" +#include "PixelRenderer.hpp" + +#include "Context.hpp" + +#include + +namespace gui::renderer +{ + namespace + { + constexpr auto toSymmetricPenWidth(std::uint16_t penWidth) noexcept -> std::uint16_t + { + switch (penWidth) { + case 1: + return 1; + case 2: + return 3; + case 3: + return 5; + default: + return penWidth * M_SQRT2; + } + } + } // namespace + + auto LineRenderer::DrawableStyle::from(const CommandLine &command) -> DrawableStyle + { + DrawableStyle details; + details.penWidth = command.penWidth; + details.color = command.color; + return details; + } + + void LineRenderer::draw(Context *ctx, Point start, Point end, Color color) + { + if (color.alpha == Color::FullTransparent) { + return; + } + + const int distanceX = std::abs(end.x - start.x); + const int distanceY = std::abs(end.y - start.y); + const auto step = distanceX >= distanceY ? distanceX : distanceY; + + auto dx = static_cast(distanceX) / step; + dx = end.x < start.x ? -dx : dx; + auto dy = static_cast(distanceY) / step; + dy = end.y < start.y ? -dy : dy; + + float x = start.x; + float y = start.y; + for (int i = 0; i < step; ++i) { + PixelRenderer::draw(ctx, Point(x, y), color); + x += dx; + y += dy; + } + } + + void LineRenderer::drawHorizontal(Context *ctx, Point start, Length width, const DrawableStyle &style) + { + if (style.color.alpha == Color::FullTransparent) { + return; + } + if (style.direction != LineExpansionDirection::Down && style.direction != LineExpansionDirection::Up) { + return; + } + + for (Length i = 0; i < style.penWidth; ++i) { + const auto offset = (style.direction == LineExpansionDirection::Down) ? i : -i - 1; + draw(ctx, Point(start.x, start.y + offset), Point(start.x + width, start.y + offset), style.color); + } + } + + void LineRenderer::drawVertical(Context *ctx, Point start, Length height, const DrawableStyle &style) + { + if (style.color.alpha == Color::FullTransparent) { + return; + } + if (style.direction != LineExpansionDirection::Left && style.direction != LineExpansionDirection::Right) { + return; + } + + for (Length i = 0; i < style.penWidth; ++i) { + const auto offset = (style.direction == LineExpansionDirection::Right) ? i : -i - 1; + draw(ctx, Point(start.x + offset, start.y), Point(start.x + offset, start.y + height), style.color); + } + } + + void LineRenderer::draw45deg(Context *ctx, Point start, Length length, const DrawableStyle &style, bool toRight) + { + // if color is fully transparent - return + if (style.color.alpha == Color::FullTransparent) { + return; + } + + const auto end = + toRight ? Point(start.x + length, start.y + length) : Point(start.x - length, start.y + length); + drawSlanting(ctx, start, end, toSymmetricPenWidth(style.penWidth), style.color, style.direction); + } + + void LineRenderer::drawSlanting( + Context *ctx, Point start, Point end, Length penWidth, Color color, LineExpansionDirection expansionDirection) + { + if (color.alpha == Color::FullTransparent) { + return; + } + if (expansionDirection != LineExpansionDirection::Left && expansionDirection != LineExpansionDirection::Right) { + return; + } + + const int directionFactor = expansionDirection == LineExpansionDirection::Left ? -1 : 1; + for (Length row = 0; row < penWidth; ++row) { + draw(ctx, + Point(start.x + (directionFactor * row), start.y), + Point(end.x + (directionFactor * row), end.y), + color); + } + } +} // namespace gui::renderer diff --git a/module-gui/gui/core/renderers/LineRenderer.hpp b/module-gui/gui/core/renderers/LineRenderer.hpp new file mode 100644 index 000000000..7548e4bc3 --- /dev/null +++ b/module-gui/gui/core/renderers/LineRenderer.hpp @@ -0,0 +1,57 @@ +#pragma once + +#include "Color.hpp" +#include "Common.hpp" + +#include "DrawCommand.hpp" + +namespace gui +{ + class Context; +} // namespace gui + +namespace gui::renderer +{ + enum class LineExpansionDirection + { + Up = 1, + Down = (1 << 1), + Left = (1 << 2), + Right = (1 << 3) + }; + + class LineRenderer + { + public: + struct DrawableStyle + { + Length penWidth{1}; + Color color{ColorFullBlack}; + LineExpansionDirection direction = LineExpansionDirection::Down; + + static auto from(const CommandLine &command) -> DrawableStyle; + + DrawableStyle &setExpansionDirection(LineExpansionDirection value) noexcept + { + direction = value; + return *this; + } + }; + + static void draw(Context *ctx, Point start, Point end, Color color); + + static void drawHorizontal(Context *ctx, Point start, Length width, const DrawableStyle &style); + + static void drawVertical(Context *ctx, Point start, Length height, const DrawableStyle &style); + + static void draw45deg(Context *ctx, Point start, Length length, const DrawableStyle &style, bool toRight); + + private: + static void drawSlanting(Context *ctx, + Point start, + Point end, + Length penWidth, + Color color, + LineExpansionDirection expansionDirection); + }; +} // namespace gui::renderer diff --git a/module-gui/gui/core/renderers/PixelRenderer.cpp b/module-gui/gui/core/renderers/PixelRenderer.cpp new file mode 100644 index 000000000..0714cd0e8 --- /dev/null +++ b/module-gui/gui/core/renderers/PixelRenderer.cpp @@ -0,0 +1,15 @@ +#include "PixelRenderer.hpp" + +#include "Context.hpp" + +#include + +namespace gui::renderer +{ + void PixelRenderer::draw(Context *ctx, Point point, Color color) + { + const auto contextWidth = ctx->getW(); + const auto position = point.y * contextWidth + point.x; + std::memset(ctx->getData() + position, color.intensity, 1); + } +} // namespace gui::renderer diff --git a/module-gui/gui/core/renderers/PixelRenderer.hpp b/module-gui/gui/core/renderers/PixelRenderer.hpp new file mode 100644 index 000000000..b985ee3f8 --- /dev/null +++ b/module-gui/gui/core/renderers/PixelRenderer.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include "Color.hpp" +#include "Common.hpp" + +namespace gui +{ + class Context; +} // namespace gui + +namespace gui::renderer +{ + class PixelRenderer + { + public: + static void draw(Context *ctx, Point point, Color color); + }; +} // namespace gui::renderer diff --git a/module-gui/gui/core/renderers/RectangleRenderer.cpp b/module-gui/gui/core/renderers/RectangleRenderer.cpp new file mode 100644 index 000000000..47cf8a02c --- /dev/null +++ b/module-gui/gui/core/renderers/RectangleRenderer.cpp @@ -0,0 +1,378 @@ +#include "RectangleRenderer.hpp" + +#include "ArcRenderer.hpp" +#include "LineRenderer.hpp" +#include "PixelRenderer.hpp" + +#include "Context.hpp" + +#include + +namespace gui::renderer +{ + namespace + { + std::uint8_t getPixelColor(Context *ctx, const Point &point, std::uint8_t defaultColor) + { + const auto contextWidth = ctx->getW(); + const auto position = point.y * contextWidth + point.x; + if (!ctx->addressInData(ctx->getData() + position)) { + return defaultColor; + } + return *(ctx->getData() + position); + } + } // namespace + + auto RectangleRenderer::DrawableStyle::from(const CommandRectangle &command) -> DrawableStyle + { + return DrawableStyle{command.penWidth, + command.radius, + command.yapSize, + command.edges, + command.flatEdges, + command.corners, + command.yaps, + command.borderColor, + command.filled ? command.fillColor : ColorNoColor}; + } + + void RectangleRenderer::drawFlat( + Context *ctx, Point position, Length width, Length height, const DrawableStyle &style) + { + if (style.fillColor != ColorNoColor) { + fillFlatRectangle(ctx, position, width, height, style.fillColor); + } + drawSides(ctx, position, width, height, style.borderWidth, style.borderColor, style.edges); + } + + void RectangleRenderer::fillFlatRectangle(Context *ctx, Point position, Length width, Length height, Color color) + { + for (unsigned int y = 1; y <= height; ++y) { + LineRenderer::drawHorizontal(ctx, + Point(position.x, position.y + y), + width, + LineRenderer::DrawableStyle{1, color, LineExpansionDirection::Up}); + } + } + + void RectangleRenderer::drawSides( + Context *ctx, Point position, Length width, Length height, Length penWidth, Color color, RectangleEdge sides) + { + if (sides & RectangleEdge::Top) { + drawTopSide(ctx, position, width, penWidth, color); + } + if (sides & RectangleEdge::Right) { + drawRightSide(ctx, position, width, height, penWidth, color); + } + if (sides & RectangleEdge::Bottom) { + drawBottomSide(ctx, position, width, height, penWidth, color); + } + if (sides & RectangleEdge::Left) { + drawLeftSide(ctx, position, height, penWidth, color); + } + } + + void RectangleRenderer::draw(Context *ctx, Point position, Length width, Length height, const DrawableStyle &style) + { + drawCorners(ctx, + position, + width, + height, + style.radius, + style.borderWidth, + style.borderColor, + style.roundedCorners, + style.flatEdges, + style.yaps); + drawSides(ctx, + position, + width, + height, + style.radius, + style.yapSize, + style.borderWidth, + style.flatEdges, + style.yaps, + style.borderColor, + style.edges); + if (style.fillColor != ColorNoColor) { + fill(ctx, Point(position.x + (width / 2), position.y + (height / 2)), style.borderColor, style.fillColor); + } + } + + void RectangleRenderer::drawCorners(Context *ctx, + Point position, + Length width, + Length height, + Length radius, + Length penWidth, + Color borderColor, + RectangleRoundedCorner rounded, + RectangleFlatEdge flats, + RectangleYap yaps) + { + + const ArcRenderer::DrawableStyle arcStyle{penWidth, borderColor}; + + const auto topRightCenter = Point(position.x + width - radius, position.y + radius); + const auto topLeftCenter = Point(position.x + radius, topRightCenter.y); + const auto bottomRightCenter = Point(topRightCenter.x, position.y + height - radius); + const auto bottomLeftCenter = Point(topLeftCenter.x, bottomRightCenter.y); + + const auto topRightCornerRounded = (rounded & RectangleRoundedCorner::TopRight) && + !(flats & RectangleFlatEdge::TopRight) && !(yaps & RectangleYap::TopRight); + if (topRightCornerRounded) { + ArcRenderer::draw(ctx, topRightCenter, radius, -90, 90, arcStyle); + } + + const auto topLeftCornerRounded = (rounded & RectangleRoundedCorner::TopLeft) && + !(flats & RectangleFlatEdge::TopLeft) && !(yaps & RectangleYap::TopLeft); + if (topLeftCornerRounded) { + ArcRenderer::draw(ctx, topLeftCenter, radius, -180, 90, arcStyle); + } + + const auto bottomRightCornerRounded = (rounded & RectangleRoundedCorner::BottomRight) && + !(flats & RectangleFlatEdge::BottomRight) && + !(yaps & RectangleYap::BottomRight); + if (bottomRightCornerRounded) { + ArcRenderer::draw(ctx, bottomRightCenter, radius, 0, 90, arcStyle); + } + + const auto bottomLeftCornerRounded = (rounded & RectangleRoundedCorner::BottomLeft) && + !(flats & RectangleFlatEdge::BottomLeft) && + !(yaps & RectangleYap::BottomLeft); + if (bottomLeftCornerRounded) { + ArcRenderer::draw(ctx, bottomLeftCenter, radius, -270, 90, arcStyle); + } + } + + void RectangleRenderer::drawSides(Context *ctx, + Point position, + Length width, + Length height, + Length radius, + Length yapSize, + Length penWidth, + RectangleFlatEdge flats, + RectangleYap yaps, + Color borderColor, + RectangleEdge sides) + { + if (sides & RectangleEdge::Top) { + drawTopSide(ctx, position, width, radius, yapSize, penWidth, flats, yaps, borderColor); + } + if (sides & RectangleEdge::Bottom) { + drawBottomSide(ctx, position, width, height, radius, yapSize, penWidth, flats, yaps, borderColor); + } + if (sides & RectangleEdge::Left) { + drawLeftSide(ctx, position, height, radius, yapSize, penWidth, flats, yaps, borderColor); + } + if (sides & RectangleEdge::Right) { + drawRightSide(ctx, position, width, height, radius, yapSize, penWidth, flats, yaps, borderColor); + } + } + + void RectangleRenderer::fill(Context *ctx, Point startPosition, Color borderColor, Color fillColor) + { + std::queue q; + q.push(startPosition); + + while (!q.empty()) { + const auto currPoint = q.front(); + q.pop(); + if (const auto color = getPixelColor(ctx, currPoint, borderColor.intensity); + color == borderColor.intensity || color == fillColor.intensity) { + continue; + } + + PixelRenderer::draw(ctx, currPoint, fillColor); + q.push(Point{currPoint.x + 1, currPoint.y}); + q.push(Point{currPoint.x - 1, currPoint.y}); + q.push(Point{currPoint.x, currPoint.y + 1}); + q.push(Point{currPoint.x, currPoint.y - 1}); + } + } + + void RectangleRenderer::drawTopSide(Context *ctx, Point position, Length length, Length penWidth, Color color) + { + LineRenderer::drawHorizontal( + ctx, position, length, LineRenderer::DrawableStyle{penWidth, color, LineExpansionDirection::Down}); + } + + void RectangleRenderer::drawTopSide(Context *ctx, + Point position, + Length width, + Length radius, + Length yapSize, + Length penWidth, + RectangleFlatEdge flat, + RectangleYap yaps, + Color borderColor) + { + int x = position.x; + if (yaps & RectangleYap::TopLeft) { + x -= yapSize; + width += yapSize; + } + else if (!(flat & RectangleFlatEdge::TopLeft)) { + x += radius; + width -= radius; + } + + if (yaps & RectangleYap::TopRight) { + width += yapSize; + } + else if (!(flat & RectangleFlatEdge::TopRight)) { + width -= radius; + } + LineRenderer::drawHorizontal(ctx, + Point(x, position.y), + width, + LineRenderer::DrawableStyle{penWidth, borderColor, LineExpansionDirection::Down}); + } + + void RectangleRenderer::drawRightSide( + Context *ctx, Point position, Length width, Length height, Length penWidth, Color color) + { + LineRenderer::drawVertical(ctx, + Point(position.x + width, position.y), + height, + LineRenderer::DrawableStyle{penWidth, color, LineExpansionDirection::Left}); + } + + void RectangleRenderer::drawRightSide(Context *ctx, + Point position, + Length width, + Length height, + Length radius, + Length yapSize, + Length penWidth, + RectangleFlatEdge flat, + RectangleYap yaps, + Color borderColor) + { + int x = position.x + width + 1; + int y = position.y; + int length = height; + if (yaps & RectangleYap::TopRight) { + LineRenderer::draw45deg(ctx, + Point(x + yapSize - 1, y), + yapSize, + LineRenderer::DrawableStyle{penWidth, borderColor, LineExpansionDirection::Left}, + false); + y += yapSize; + length -= yapSize; + } + else if (!(flat & RectangleFlatEdge::TopRight)) { + y += radius; + length -= radius; + } + + if (yaps & RectangleYap::BottomRight) { + LineRenderer::draw45deg(ctx, + Point(x, y + height), + yapSize, + LineRenderer::DrawableStyle{penWidth, borderColor, LineExpansionDirection::Left}, + true); + length -= yapSize; + } + else if (!(flat & RectangleFlatEdge::BottomRight)) { + length -= radius; + } + + LineRenderer::drawVertical( + ctx, Point(x, y), length, LineRenderer::DrawableStyle{penWidth, borderColor, LineExpansionDirection::Left}); + } + + void RectangleRenderer::drawBottomSide( + Context *ctx, Point position, Length width, Length height, Length penWidth, Color color) + { + LineRenderer::drawHorizontal(ctx, + Point(position.x, position.y + height), + width, + LineRenderer::DrawableStyle{penWidth, color, LineExpansionDirection::Up}); + } + + void RectangleRenderer::drawBottomSide(Context *ctx, + Point position, + Length width, + Length height, + Length radius, + Length yapSize, + Length penWidth, + RectangleFlatEdge flat, + RectangleYap yaps, + Color borderColor) + { + int x = position.x; + int y = position.y + height + 1; + int length = width; + if (yaps & RectangleYap::BottomLeft) { + x -= yapSize; + length += yapSize; + } + else if (!(flat & RectangleFlatEdge::BottomLeft)) { + x += radius; + length -= radius; + } + + if (yaps & RectangleYap::BottomRight) { + length += yapSize; + } + else if (!(flat & RectangleFlatEdge::BottomRight)) { + length -= radius; + } + LineRenderer::drawHorizontal( + ctx, Point(x, y), length, LineRenderer::DrawableStyle{penWidth, borderColor, LineExpansionDirection::Up}); + } + + void RectangleRenderer::drawLeftSide(Context *ctx, Point position, Length height, Length penWidth, Color color) + { + LineRenderer::drawVertical( + ctx, position, height, LineRenderer::DrawableStyle{penWidth, color, LineExpansionDirection::Right}); + } + + void RectangleRenderer::drawLeftSide(Context *ctx, + Point position, + Length height, + Length radius, + Length yapSize, + Length penWidth, + RectangleFlatEdge flat, + RectangleYap yaps, + Color borderColor) + { + int x = position.x; + int y = position.y; + int length = height; + if (yaps & RectangleYap::TopLeft) { + LineRenderer::draw45deg(ctx, + Point(x - yapSize, y), + yapSize, + LineRenderer::DrawableStyle{penWidth, borderColor, LineExpansionDirection::Right}, + true); + y += yapSize; + length -= yapSize; + } + else if (!(flat & RectangleFlatEdge::TopLeft)) { + y += radius; + length -= radius; + } + + if (yaps & RectangleYap::BottomLeft) { + LineRenderer::draw45deg(ctx, + Point(x, y + height), + yapSize, + LineRenderer::DrawableStyle{penWidth, borderColor, LineExpansionDirection::Right}, + false); + length -= yapSize; + } + else if (!(flat & RectangleFlatEdge::BottomLeft)) { + length -= radius; + } + LineRenderer::drawVertical(ctx, + Point(x, y), + length, + LineRenderer::DrawableStyle{penWidth, borderColor, LineExpansionDirection::Right}); + } +} // namespace gui::renderer diff --git a/module-gui/gui/core/renderers/RectangleRenderer.hpp b/module-gui/gui/core/renderers/RectangleRenderer.hpp new file mode 100644 index 000000000..2080a0e90 --- /dev/null +++ b/module-gui/gui/core/renderers/RectangleRenderer.hpp @@ -0,0 +1,119 @@ +#pragma once + +#include "Color.hpp" +#include "Common.hpp" + +#include "DrawCommand.hpp" + +namespace gui +{ + class Context; +} // namespace gui + +namespace gui::renderer +{ + class RectangleRenderer + { + public: + struct DrawableStyle + { + Length borderWidth{1}; + Length radius{0}; + Length yapSize{0}; + RectangleEdge edges{RectangleEdge::All}; + RectangleFlatEdge flatEdges{RectangleFlatEdge::None}; + RectangleRoundedCorner roundedCorners{RectangleRoundedCorner::None}; + RectangleYap yaps{RectangleYap::None}; + Color borderColor{ColorFullBlack}; + Color fillColor{ColorNoColor}; + + static auto from(const CommandRectangle &command) -> DrawableStyle; + }; + + static void drawFlat(Context *ctx, Point position, Length width, Length height, const DrawableStyle &style); + + static void draw(Context *ctx, Point position, Length width, Length height, const DrawableStyle &style); + + private: + static void fillFlatRectangle(Context *ctx, Point position, Length width, Length height, Color color); + static void fill(Context *ctx, Point startPosition, Color borderColor, Color fillColor); + + static void drawSides(Context *ctx, + Point position, + Length width, + Length height, + Length penWidth, + Color color, + RectangleEdge sides); + static void drawSides(Context *ctx, + Point position, + Length width, + Length height, + Length radius, + Length yapSize, + Length penWidth, + RectangleFlatEdge flats, + RectangleYap yaps, + Color borderColor, + RectangleEdge sides); + + static void drawCorners(Context *ctx, + Point position, + Length width, + Length height, + Length radius, + Length penWidth, + Color borderColor, + RectangleRoundedCorner rounded, + RectangleFlatEdge flats, + RectangleYap yaps); + + static void drawTopSide(Context *ctx, Point position, Length width, Length penWidth, Color color); + static void drawTopSide(Context *ctx, + Point position, + Length width, + Length radius, + Length yapSize, + Length penWidth, + RectangleFlatEdge flat, + RectangleYap yaps, + Color borderColor); + + static void drawRightSide( + Context *ctx, Point position, Length width, Length height, Length penWidth, Color color); + static void drawRightSide(Context *ctx, + Point position, + Length width, + Length height, + Length radius, + Length yapSize, + Length penWidth, + RectangleFlatEdge flat, + RectangleYap yaps, + Color borderColor); + + static void drawBottomSide( + Context *ctx, Point position, Length width, Length height, Length penWidth, Color color); + static void drawBottomSide(Context *ctx, + Point position, + Length width, + Length height, + Length radius, + Length yapSize, + Length penWidth, + RectangleFlatEdge flat, + RectangleYap yaps, + Color borderColor); + + static void drawLeftSide(Context *ctx, Point position, Length height, Length penWidth, Color color); + static void drawLeftSide(Context *ctx, + Point position, + Length height, + Length radius, + Length yapSize, + Length penWidth, + RectangleFlatEdge flat, + RectangleYap yaps, + Color borderColor); + }; +} // namespace gui::renderer diff --git a/module-gui/gui/widgets/CheckBox.cpp b/module-gui/gui/widgets/CheckBox.cpp index 6dc2eec19..36818b075 100644 --- a/module-gui/gui/widgets/CheckBox.cpp +++ b/module-gui/gui/widgets/CheckBox.cpp @@ -18,7 +18,7 @@ namespace gui bottomBarRestoreFromTemporaryMode(bottomBarRestoreFromTemporaryMode), textOnLeft(textOnLeft) { - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + setEdges(RectangleEdge::Bottom); setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); image = new Image("small_tick_W_M"); diff --git a/module-gui/gui/widgets/Icon.cpp b/module-gui/gui/widgets/Icon.cpp index 8418f525c..b12a87c51 100644 --- a/module-gui/gui/widgets/Icon.cpp +++ b/module-gui/gui/widgets/Icon.cpp @@ -32,7 +32,7 @@ Icon::Icon(Item *parent, const UTF8 &str) : Rect(parent, x, y, w, h) { - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); setPenFocusWidth(style::window::default_border_no_focus_w); setPenWidth(style::window::default_border_no_focus_w); @@ -40,7 +40,7 @@ Icon::Icon(Item *parent, text = new Text(this, style::text::x, style::text::y, style::text::w, style::text::h); text->setTextType(TextType::MULTI_LINE); text->setEditMode(EditMode::BROWSE); - text->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + text->setEdges(RectangleEdge::None); text->setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); auto format = TextFormat(Font(27).raw(), Color(7, 0)); diff --git a/module-gui/gui/widgets/ImageBox.cpp b/module-gui/gui/widgets/ImageBox.cpp index 154acbc38..d43675859 100644 --- a/module-gui/gui/widgets/ImageBox.cpp +++ b/module-gui/gui/widgets/ImageBox.cpp @@ -6,7 +6,7 @@ ImageBox::ImageBox( Item *parent, const uint32_t &x, const uint32_t &y, const uint32_t &w, const uint32_t &h, Image *image) : HBox(parent, x, y, w, h) { - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); setAlignment(gui::Alignment(gui::Alignment::Horizontal::Center, gui::Alignment::Vertical::Center)); setPenFocusWidth(style::window::default_border_focus_w); setPenWidth(style::window::default_border_no_focus_w); @@ -14,10 +14,10 @@ ImageBox::ImageBox( focusChangedCallback = [&](Item &item) { if (focus) { - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + setEdges(RectangleEdge::Bottom | RectangleEdge::Top); } else { - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + setEdges(RectangleEdge::None); } return true; }; diff --git a/module-gui/gui/widgets/Label.hpp b/module-gui/gui/widgets/Label.hpp index 5aa815c57..3854d7368 100644 --- a/module-gui/gui/widgets/Label.hpp +++ b/module-gui/gui/widgets/Label.hpp @@ -38,10 +38,9 @@ namespace gui return *this; } uint32_t x = 0, y = 0, w = 0, h = 0; - std::string font = style::window::font::medium; - Alignment align = Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center); - RectangleEdgeFlags edges = - gui::RectangleEdgeFlags::GUI_RECT_EDGE_TOP | gui::RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM; + std::string font = style::window::font::medium; + Alignment align = Alignment(gui::Alignment::Horizontal::Left, gui::Alignment::Vertical::Center); + RectangleEdge edges = gui::RectangleEdge::Top | gui::RectangleEdge::Bottom; }; struct Label : public Rect diff --git a/module-gui/gui/widgets/ListItem.cpp b/module-gui/gui/widgets/ListItem.cpp index 7eec000a2..e3a56d711 100644 --- a/module-gui/gui/widgets/ListItem.cpp +++ b/module-gui/gui/widgets/ListItem.cpp @@ -8,7 +8,7 @@ namespace gui ListItem::ListItem() { setRadius(0); - setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM | RectangleEdgeFlags::GUI_RECT_EDGE_TOP); + setEdges(RectangleEdge::Bottom | RectangleEdge::Top); setPenFocusWidth(style::window::default_border_focus_w); setPenWidth(style::window::default_border_no_focus_w); diff --git a/module-gui/gui/widgets/ListView.cpp b/module-gui/gui/widgets/ListView.cpp index 85ac32a13..62d687943 100644 --- a/module-gui/gui/widgets/ListView.cpp +++ b/module-gui/gui/widgets/ListView.cpp @@ -68,7 +68,7 @@ namespace gui body = new VBox{this, 0, 0, w, h}; body->setAlignment(Alignment::Vertical::Top); - body->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + body->setEdges(RectangleEdge::None); body->borderCallback = [this](const InputEvent &inputEvent) -> bool { if (inputEvent.state != InputEvent::State::keyReleasedShort) { diff --git a/module-gui/gui/widgets/Rect.cpp b/module-gui/gui/widgets/Rect.cpp index 2136f5459..17433d0af 100644 --- a/module-gui/gui/widgets/Rect.cpp +++ b/module-gui/gui/widgets/Rect.cpp @@ -49,16 +49,16 @@ namespace gui penFocusWidth = width; } - void Rect::setEdges(RectangleEdgeFlags edges) + void Rect::setEdges(RectangleEdge edges) { this->edges = edges; } - void Rect::setCorners(RectangleCornerFlags corners) + void Rect::setCorners(RectangleRoundedCorner corners) { this->corners = corners; } - void Rect::setFlat(RectangleFlatFlags flats) + void Rect::setFlat(RectangleFlatEdge flats) { flatEdges = flats; } @@ -68,16 +68,16 @@ namespace gui filled = val; } - void Rect::setYaps(RectangleYapFlags yaps) + void Rect::setYaps(RectangleYap yaps) { this->yaps = yaps; - if (yaps & (RectangleYapFlags::GUI_RECT_YAP_BOTTOM_LEFT | RectangleYapFlags::GUI_RECT_YAP_TOP_LEFT)) { + if (yaps & (RectangleYap::BottomLeft | RectangleYap::TopLeft)) { padding.left = yapSize; } else { padding.left = 0; } - if (yaps & (RectangleYapFlags::GUI_RECT_YAP_BOTTOM_RIGHT | RectangleYapFlags::GUI_RECT_YAP_TOP_RIGHT)) { + if (yaps & (RectangleYap::BottomRight | RectangleYap::TopRight)) { padding.right = yapSize; } else { diff --git a/module-gui/gui/widgets/Rect.hpp b/module-gui/gui/widgets/Rect.hpp index 06a8da28b..d6153d8e0 100644 --- a/module-gui/gui/widgets/Rect.hpp +++ b/module-gui/gui/widgets/Rect.hpp @@ -23,13 +23,13 @@ namespace gui /// mark if rectangle should be filled with fill color. bool filled = false; /// mark how to draw borders - RectangleEdgeFlags edges{RectangleEdgeFlags::GUI_RECT_ALL_EDGES}; + RectangleEdge edges{RectangleEdge::All}; /// mark which edge should be flat. This will disable roundness on both sides of the edge. - RectangleFlatFlags flatEdges = {RectangleFlatFlags::GUI_RECT_FLAT_NO_FLAT}; + RectangleFlatEdge flatEdges = {RectangleFlatEdge::None}; /// mark if given corners should be painted (only for rounded corners) - RectangleCornerFlags corners = {RectangleCornerFlags::GUI_RECT_ALL_CORNERS}; + RectangleRoundedCorner corners = {RectangleRoundedCorner::All}; /// mark if we japs should be painted. small protrusions indicating a speech bubble - RectangleYapFlags yaps = {RectangleYapFlags::GUI_RECT_YAP_NO_YAPS}; + RectangleYap yaps = {RectangleYap::None}; /// yap size in horizontal width. unsigned short yapSize = style::window::default_rect_yaps; @@ -41,10 +41,10 @@ namespace gui void setBorderColor(const Color &color); void setPenWidth(uint8_t width); void setPenFocusWidth(uint8_t width); - void setEdges(RectangleEdgeFlags edges); - void setCorners(RectangleCornerFlags corners); - void setFlat(RectangleFlatFlags flats); - virtual void setYaps(RectangleYapFlags yaps); + void setEdges(RectangleEdge edges); + void setCorners(RectangleRoundedCorner corners); + void setFlat(RectangleFlatEdge flats); + virtual void setYaps(RectangleYap yaps); virtual void setYapSize(unsigned short value); void setFilled(bool val); std::list buildDrawList() override; diff --git a/module-gui/gui/widgets/Style.cpp b/module-gui/gui/widgets/Style.cpp index 279a84b6e..99ded3aea 100644 --- a/module-gui/gui/widgets/Style.cpp +++ b/module-gui/gui/widgets/Style.cpp @@ -11,7 +11,7 @@ namespace style::window } el->setPenWidth(default_border_no_focus_w); el->setPenFocusWidth(default_border_focus_w); - el->setEdges(gui::RectangleEdgeFlags::GUI_RECT_EDGE_TOP | gui::RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + el->setEdges(gui::RectangleEdge::Top | gui::RectangleEdge::Bottom); el->setFilled(false); } diff --git a/module-gui/gui/widgets/Text.cpp b/module-gui/gui/widgets/Text.cpp index 69b937d19..d4ffbc357 100644 --- a/module-gui/gui/widgets/Text.cpp +++ b/module-gui/gui/widgets/Text.cpp @@ -57,7 +57,7 @@ namespace gui buildDocument(text); setBorderColor(gui::ColorFullBlack); - setEdges(RectangleEdgeFlags::GUI_RECT_ALL_EDGES); + setEdges(RectangleEdge::All); } Text::Text() : Text(nullptr, 0, 0, 0, 0) diff --git a/module-gui/gui/widgets/TextBubble.cpp b/module-gui/gui/widgets/TextBubble.cpp index f5fc69eaf..5cf4b597f 100644 --- a/module-gui/gui/widgets/TextBubble.cpp +++ b/module-gui/gui/widgets/TextBubble.cpp @@ -6,10 +6,10 @@ namespace gui TextBubble::TextBubble(Item *parent, Position x, Position y, Length w, Length h) : Text(parent, x, y, w, h) { setEditMode(EditMode::SCROLL); - setEdges(RectangleEdgeFlags::GUI_RECT_ALL_EDGES); + setEdges(RectangleEdge::All); } - void TextBubble::setYaps(RectangleYapFlags yaps) + void TextBubble::setYaps(RectangleYap yaps) { if (this->yaps != yaps) { this->yaps = yaps; diff --git a/module-gui/gui/widgets/TextBubble.hpp b/module-gui/gui/widgets/TextBubble.hpp index 1d30f6382..e9e9ee7fa 100644 --- a/module-gui/gui/widgets/TextBubble.hpp +++ b/module-gui/gui/widgets/TextBubble.hpp @@ -9,6 +9,6 @@ namespace gui { public: TextBubble(Item *parent, Position x, Position y, Length w, Length h); - void setYaps(RectangleYapFlags yaps) override; + void setYaps(RectangleYap yaps) override; }; } // namespace gui diff --git a/module-gui/gui/widgets/TextLine.cpp b/module-gui/gui/widgets/TextLine.cpp index 8768da652..2b058e8cb 100644 --- a/module-gui/gui/widgets/TextLine.cpp +++ b/module-gui/gui/widgets/TextLine.cpp @@ -17,7 +17,7 @@ namespace gui item->setFont(format->getFont()); item->setTextColor(format->getColor()); item->setSize(item->getTextNeedSpace(), item->getTextHeight()); - item->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_NO_EDGES); + item->setEdges(RectangleEdge::None); return item; } @@ -265,7 +265,7 @@ namespace gui if (drawUnderline) { underline = new Rect(nullptr, 0, 0, max_width, init_height); - underline->setEdges(RectangleEdgeFlags::GUI_RECT_EDGE_BOTTOM); + underline->setEdges(RectangleEdge::Bottom); if (drawUnderlineMode == UnderlineDrawMode::WholeLine) { height_used = std::max(height_used, (Length)init_height);