From fe50b6a30ab477b9e0cd5f594a0962c4873e7fef Mon Sep 17 00:00:00 2001 From: David Capello Date: Sat, 12 Feb 2011 09:32:57 -0300 Subject: [PATCH] Change painting code of some widgets from JM_DRAW to onPaint(). This need future work to avoid using ji_screen and access to the drawable area only through Graphics pointer inside the PaintEvent. --- src/gui/box.cpp | 9 +++++---- src/gui/box.h | 1 + src/gui/button.cpp | 18 ++++++++--------- src/gui/button.h | 1 + src/gui/entry.cpp | 9 +++++---- src/gui/entry.h | 1 + src/gui/frame.cpp | 9 +++++---- src/gui/frame.h | 1 + src/gui/grid.cpp | 9 +++++---- src/gui/grid.h | 1 + src/gui/image_view.cpp | 28 +++++++++++++------------- src/gui/image_view.h | 1 + src/gui/label.cpp | 8 +++++--- src/gui/label.h | 1 + src/gui/link_label.cpp | 9 +++++---- src/gui/link_label.h | 1 + src/gui/popup_frame.cpp | 40 ++++++++++++++++++------------------- src/gui/popup_frame.h | 1 + src/gui/theme.h | 19 +++++++++--------- src/gui/tooltips.cpp | 44 ++++++++++++++++++++--------------------- src/gui/tooltips.h | 1 + src/skin/skin_theme.cpp | 33 ++++++++++++++++++++----------- src/skin/skin_theme.h | 18 ++++++++--------- 23 files changed, 145 insertions(+), 118 deletions(-) diff --git a/src/gui/box.cpp b/src/gui/box.cpp index db4ee2de2..b4356fe1c 100644 --- a/src/gui/box.cpp +++ b/src/gui/box.cpp @@ -37,10 +37,6 @@ bool Box::onProcessMessage(JMessage msg) box_set_position(&msg->setpos.rect); return true; - case JM_DRAW: - getTheme()->draw_box(this, &msg->draw.rect); - return true; - } return Widget::onProcessMessage(msg); @@ -110,6 +106,11 @@ void Box::onPreferredSize(PreferredSizeEvent& ev) ev.setPreferredSize(Size(w, h)); } +void Box::onPaint(PaintEvent& ev) +{ + getTheme()->paintBox(ev); +} + void Box::box_set_position(JRect rect) { #define FIXUP(x, y, w, h, l, t, r, b) \ diff --git a/src/gui/box.h b/src/gui/box.h index 5a0e0913b..8bf7ec9a2 100644 --- a/src/gui/box.h +++ b/src/gui/box.h @@ -18,6 +18,7 @@ protected: // Events bool onProcessMessage(JMessage msg); void onPreferredSize(PreferredSizeEvent& ev); + void onPaint(PaintEvent& ev); private: void box_set_position(JRect rect); diff --git a/src/gui/button.cpp b/src/gui/button.cpp index fa1e6bd5c..2d010dbee 100644 --- a/src/gui/button.cpp +++ b/src/gui/button.cpp @@ -86,15 +86,6 @@ bool ButtonBase::onProcessMessage(JMessage msg) { switch (msg->type) { - case JM_DRAW: { - switch (m_drawType) { - case JI_BUTTON: getTheme()->draw_button(this, &msg->draw.rect); break; - case JI_CHECK: getTheme()->draw_check(this, &msg->draw.rect); break; - case JI_RADIO: getTheme()->draw_radio(this, &msg->draw.rect); break; - } - return true; - } - case JM_FOCUSENTER: case JM_FOCUSLEAVE: if (this->isEnabled()) { @@ -324,6 +315,15 @@ void ButtonBase::onPreferredSize(PreferredSizeEvent& ev) this->border_width.t + jrect_h(&box) + this->border_width.b); } +void ButtonBase::onPaint(PaintEvent& ev) +{ + switch (m_drawType) { + case JI_BUTTON: getTheme()->paintButton(ev); break; + case JI_CHECK: getTheme()->paintCheckBox(ev); break; + case JI_RADIO: getTheme()->paintRadioButton(ev); break; + } +} + void ButtonBase::generateButtonSelectSignal() { // Deselect diff --git a/src/gui/button.h b/src/gui/button.h index 4d54b6c78..f4a7897bf 100644 --- a/src/gui/button.h +++ b/src/gui/button.h @@ -41,6 +41,7 @@ protected: // Events bool onProcessMessage(JMessage msg); void onPreferredSize(PreferredSizeEvent& ev); + void onPaint(PaintEvent& ev); // New events virtual void onClick(Event& ev); diff --git a/src/gui/entry.cpp b/src/gui/entry.cpp index 1b252a6c5..7207ab279 100644 --- a/src/gui/entry.cpp +++ b/src/gui/entry.cpp @@ -166,10 +166,6 @@ bool Entry::onProcessMessage(JMessage msg) { switch (msg->type) { - case JM_DRAW: - getTheme()->draw_entry(this, &msg->draw.rect); - return true; - case JM_TIMER: if (this->hasFocus() && msg->timer.timer_id == m_timer_id) { @@ -384,6 +380,11 @@ void Entry::onPreferredSize(PreferredSizeEvent& ev) ev.setPreferredSize(w, h); } +void Entry::onPaint(PaintEvent& ev) +{ + getTheme()->paintEntry(ev); +} + void Entry::onEntryChange() { EntryChange(); diff --git a/src/gui/entry.h b/src/gui/entry.h index ec68eb8ea..538d959aa 100644 --- a/src/gui/entry.h +++ b/src/gui/entry.h @@ -39,6 +39,7 @@ protected: // Events bool onProcessMessage(JMessage msg); void onPreferredSize(PreferredSizeEvent& ev); + void onPaint(PaintEvent& ev); // New Events void onEntryChange(); diff --git a/src/gui/frame.cpp b/src/gui/frame.cpp index 01d293246..8b9e7dd7e 100644 --- a/src/gui/frame.cpp +++ b/src/gui/frame.cpp @@ -378,10 +378,6 @@ bool Frame::onProcessMessage(JMessage msg) } break; - case JM_DRAW: - getTheme()->draw_frame(this, &msg->draw.rect); - return true; - } return Widget::onProcessMessage(msg); @@ -422,6 +418,11 @@ void Frame::onPreferredSize(PreferredSizeEvent& ev) } } +void Frame::onPaint(PaintEvent& ev) +{ + getTheme()->paintFrame(ev); +} + void Frame::window_set_position(JRect rect) { JWidget child; diff --git a/src/gui/frame.h b/src/gui/frame.h index 5c8bda3ab..25880a114 100644 --- a/src/gui/frame.h +++ b/src/gui/frame.h @@ -57,6 +57,7 @@ public: protected: bool onProcessMessage(JMessage msg); void onPreferredSize(PreferredSizeEvent& ev); + void onPaint(PaintEvent& ev); private: void window_set_position(JRect rect); diff --git a/src/gui/grid.cpp b/src/gui/grid.cpp index 5caf1e162..3b4e6d366 100644 --- a/src/gui/grid.cpp +++ b/src/gui/grid.cpp @@ -101,10 +101,6 @@ bool Grid::onProcessMessage(JMessage msg) setGridPosition(&msg->setpos.rect); return true; - case JM_DRAW: - getTheme()->draw_grid(this, &msg->draw.rect); - return true; - } return Widget::onProcessMessage(msg); @@ -128,6 +124,11 @@ void Grid::onPreferredSize(PreferredSizeEvent& ev) ev.setPreferredSize(Size(w, h)); } +void Grid::onPaint(PaintEvent& ev) +{ + getTheme()->paintGrid(ev); +} + void Grid::sumStripSize(const std::vector& strip, int& size) { int i, j; diff --git a/src/gui/grid.h b/src/gui/grid.h index bc2d82ad2..5f8b01066 100644 --- a/src/gui/grid.h +++ b/src/gui/grid.h @@ -22,6 +22,7 @@ protected: // Events bool onProcessMessage(JMessage msg); void onPreferredSize(PreferredSizeEvent& ev); + void onPaint(PaintEvent& ev); private: struct Cell { diff --git a/src/gui/image_view.cpp b/src/gui/image_view.cpp index 52190cb1c..97a63ff78 100644 --- a/src/gui/image_view.cpp +++ b/src/gui/image_view.cpp @@ -39,21 +39,21 @@ bool ImageView::onProcessMessage(JMessage msg) return true; } - case JM_DRAW: { - struct jrect box, text, icon; - - jwidget_get_texticon_info(this, &box, &text, &icon, - getAlign(), m_bmp->w, m_bmp->h); - - jdraw_rectexclude(rc, &icon, - jwidget_get_bg_color(this)); - - blit(m_bmp, ji_screen, 0, 0, - icon.x1, icon.y1, jrect_w(&icon), jrect_h(&icon)); - - return true; - } } return Widget::onProcessMessage(msg); } + +void ImageView::onPaint(PaintEvent& ev) +{ + struct jrect box, text, icon; + + jwidget_get_texticon_info(this, &box, &text, &icon, + getAlign(), m_bmp->w, m_bmp->h); + + jdraw_rectexclude(rc, &icon, + jwidget_get_bg_color(this)); + + blit(m_bmp, ji_screen, 0, 0, + icon.x1, icon.y1, jrect_w(&icon), jrect_h(&icon)); +} diff --git a/src/gui/image_view.h b/src/gui/image_view.h index 9839d5367..e7087e80b 100644 --- a/src/gui/image_view.h +++ b/src/gui/image_view.h @@ -18,6 +18,7 @@ public: protected: bool onProcessMessage(JMessage msg); + void onPaint(PaintEvent& ev); private: BITMAP* m_bmp; diff --git a/src/gui/label.cpp b/src/gui/label.cpp index 2ff337b0e..726c3057c 100644 --- a/src/gui/label.cpp +++ b/src/gui/label.cpp @@ -34,10 +34,12 @@ bool Label::onProcessMessage(JMessage msg) msg->reqsize.h += this->border_width.t + this->border_width.b; return true; - case JM_DRAW: - this->getTheme()->draw_label(this, &msg->draw.rect); - return true; } return Widget::onProcessMessage(msg); } + +void Label::onPaint(PaintEvent& ev) +{ + getTheme()->paintLabel(ev); +} diff --git a/src/gui/label.h b/src/gui/label.h index 6cf409ff4..2cfe5b156 100644 --- a/src/gui/label.h +++ b/src/gui/label.h @@ -16,6 +16,7 @@ public: protected: bool onProcessMessage(JMessage msg); + void onPaint(PaintEvent& ev); }; diff --git a/src/gui/link_label.cpp b/src/gui/link_label.cpp index a641b33d7..fd391d0a0 100644 --- a/src/gui/link_label.cpp +++ b/src/gui/link_label.cpp @@ -44,10 +44,6 @@ bool LinkLabel::onProcessMessage(JMessage msg) invalidate(); break; - case JM_DRAW: - getTheme()->draw_link_label(this, &msg->draw.rect); - return true; - case JM_BUTTONRELEASED: if (isEnabled()) { if (!m_url.empty()) @@ -59,3 +55,8 @@ bool LinkLabel::onProcessMessage(JMessage msg) return CustomLabel::onProcessMessage(msg); } + +void LinkLabel::onPaint(PaintEvent& ev) +{ + getTheme()->paintLinkLabel(ev); +} diff --git a/src/gui/link_label.h b/src/gui/link_label.h index c51e66235..c578aa3a4 100644 --- a/src/gui/link_label.h +++ b/src/gui/link_label.h @@ -23,6 +23,7 @@ public: protected: bool onProcessMessage(JMessage msg); + void onPaint(PaintEvent& ev); }; diff --git a/src/gui/popup_frame.cpp b/src/gui/popup_frame.cpp index 2ef57ab0a..c10c8cfbb 100644 --- a/src/gui/popup_frame.cpp +++ b/src/gui/popup_frame.cpp @@ -139,26 +139,6 @@ bool PopupFrame::onProcessMessage(JMessage msg) } break; - case JM_DRAW: { - JRect pos = jwidget_get_rect(this); - int oldt; - - jdraw_rect(pos, makecol(0, 0, 0)); - - jrect_shrink(pos, 1); - jdraw_rectfill(pos, this->getBgColor()); - - oldt = this->border_width.t; - this->border_width.t = 3 * jguiscale(); - _ji_theme_textbox_draw(ji_screen, this, NULL, NULL, - this->getBgColor(), - ji_color_foreground()); - this->border_width.t = oldt; - - jrect_free(pos); - return true; - } - } return Frame::onProcessMessage(msg); @@ -192,3 +172,23 @@ void PopupFrame::onPreferredSize(PreferredSizeEvent& ev) ev.setPreferredSize(resultSize); } + +void PopupFrame::onPaint(PaintEvent& ev) +{ + JRect pos = jwidget_get_rect(this); + int oldt; + + jdraw_rect(pos, makecol(0, 0, 0)); + + jrect_shrink(pos, 1); + jdraw_rectfill(pos, this->getBgColor()); + + oldt = this->border_width.t; + this->border_width.t = 3 * jguiscale(); + _ji_theme_textbox_draw(ji_screen, this, NULL, NULL, + this->getBgColor(), + ji_color_foreground()); + this->border_width.t = oldt; + + jrect_free(pos); +} diff --git a/src/gui/popup_frame.h b/src/gui/popup_frame.h index 4badf3af0..b826e29a7 100644 --- a/src/gui/popup_frame.h +++ b/src/gui/popup_frame.h @@ -20,6 +20,7 @@ public: protected: bool onProcessMessage(JMessage msg); void onPreferredSize(PreferredSizeEvent& ev); + void onPaint(PaintEvent& ev); private: bool m_close_on_buttonpressed; diff --git a/src/gui/theme.h b/src/gui/theme.h index b8c88caa5..0cec1ce32 100644 --- a/src/gui/theme.h +++ b/src/gui/theme.h @@ -12,7 +12,6 @@ struct BITMAP; struct FONT; -class Box; class ButtonBase; class Entry; class PaintEvent; @@ -47,19 +46,19 @@ public: virtual int color_selected() = 0; virtual int color_background() = 0; - virtual void draw_box(Box* widget, JRect clip) = 0; - virtual void draw_button(ButtonBase* widget, JRect clip) = 0; - virtual void draw_check(ButtonBase* widget, JRect clip) = 0; - virtual void draw_entry(Entry* widget, JRect clip) = 0; - virtual void draw_grid(JWidget widget, JRect clip) = 0; - virtual void draw_label(JWidget widget, JRect clip) = 0; - virtual void draw_link_label(JWidget widget, JRect clip) = 0; + virtual void paintBox(PaintEvent& ev) = 0; + virtual void paintButton(PaintEvent& ev) = 0; + virtual void paintCheckBox(PaintEvent& ev) = 0; + virtual void paintEntry(PaintEvent& ev) = 0; + virtual void paintGrid(PaintEvent& ev) = 0; + virtual void paintLabel(PaintEvent& ev) = 0; + virtual void paintLinkLabel(PaintEvent& ev) = 0; virtual void draw_listbox(JWidget widget, JRect clip) = 0; virtual void draw_listitem(JWidget widget, JRect clip) = 0; virtual void draw_menu(JWidget widget, JRect clip) = 0; virtual void draw_menuitem(JWidget widget, JRect clip) = 0; virtual void draw_panel(JWidget widget, JRect clip) = 0; - virtual void draw_radio(ButtonBase* widget, JRect clip) = 0; + virtual void paintRadioButton(PaintEvent& ev) = 0; virtual void draw_separator(JWidget widget, JRect clip) = 0; virtual void paintSlider(PaintEvent& ev) = 0; virtual void draw_combobox_entry(Entry* widget, JRect clip) = 0; @@ -68,7 +67,7 @@ public: virtual void draw_view(JWidget widget, JRect clip) = 0; virtual void draw_view_scrollbar(JWidget widget, JRect clip) = 0; virtual void draw_view_viewport(JWidget widget, JRect clip) = 0; - virtual void draw_frame(Frame* frame, JRect clip) = 0; + virtual void paintFrame(PaintEvent& ev) = 0; protected: virtual void onRegenerate() = 0; diff --git a/src/gui/tooltips.cpp b/src/gui/tooltips.cpp index 2fc158552..0ff7a743c 100644 --- a/src/gui/tooltips.cpp +++ b/src/gui/tooltips.cpp @@ -255,28 +255,6 @@ bool TipWindow::onProcessMessage(JMessage msg) } break; - case JM_DRAW: { - JRect pos = jwidget_get_rect(this); - int oldt; - - for (int i=0; igetBgColor()); - - oldt = this->border_width.t; - this->border_width.t = 3 * jguiscale(); - _ji_theme_textbox_draw(ji_screen, this, NULL, NULL, - this->getBgColor(), - ji_color_foreground()); - this->border_width.t = oldt; - - jrect_free(pos); - return true; - } - } return Frame::onProcessMessage(msg); @@ -310,3 +288,25 @@ void TipWindow::onPreferredSize(PreferredSizeEvent& ev) ev.setPreferredSize(resultSize); } + +void TipWindow::onPaint(PaintEvent& ev) +{ + JRect pos = jwidget_get_rect(this); + int oldt; + + for (int i=0; igetBgColor()); + + oldt = this->border_width.t; + this->border_width.t = 3 * jguiscale(); + _ji_theme_textbox_draw(ji_screen, this, NULL, NULL, + this->getBgColor(), + ji_color_foreground()); + this->border_width.t = oldt; + + jrect_free(pos); +} diff --git a/src/gui/tooltips.h b/src/gui/tooltips.h index 6dff3edba..2d5cbf33d 100644 --- a/src/gui/tooltips.h +++ b/src/gui/tooltips.h @@ -25,6 +25,7 @@ public: protected: bool onProcessMessage(JMessage msg); void onPreferredSize(PreferredSizeEvent& ev); + void onPaint(PaintEvent& ev); }; void jwidget_add_tooltip_text(Widget* widget, const char *text); diff --git a/src/skin/skin_theme.cpp b/src/skin/skin_theme.cpp index 459ffe3a1..814660ef3 100644 --- a/src/skin/skin_theme.cpp +++ b/src/skin/skin_theme.cpp @@ -616,13 +616,16 @@ int SkinTheme::color_background() return COLOR_BACKGROUND; } -void SkinTheme::draw_box(Box* widget, JRect clip) +void SkinTheme::paintBox(PaintEvent& ev) { - jdraw_rectfill(clip, BGCOLOR); + Widget* widget = static_cast(ev.getSource()); + Graphics* g = ev.getGraphics(); + g->fillRect(BGCOLOR, g->getClipBounds()); } -void SkinTheme::draw_button(ButtonBase* widget, JRect clip) +void SkinTheme::paintButton(PaintEvent& ev) { + ButtonBase* widget = static_cast(ev.getSource()); BITMAP* icon_bmp = widget->getButtonIcon(); int icon_align = widget->getButtonIconAlign(); struct jrect box, text, icon; @@ -713,8 +716,9 @@ void SkinTheme::draw_button(ButtonBase* widget, JRect clip) } } -void SkinTheme::draw_check(ButtonBase* widget, JRect clip) +void SkinTheme::paintCheckBox(PaintEvent& ev) { + ButtonBase* widget = static_cast(ev.getSource()); struct jrect box, text, icon; int bg; @@ -754,13 +758,16 @@ void SkinTheme::draw_check(ButtonBase* widget, JRect clip) } } -void SkinTheme::draw_grid(JWidget widget, JRect clip) +void SkinTheme::paintGrid(PaintEvent& ev) { - jdraw_rectfill(clip, BGCOLOR); + Widget* widget = static_cast(ev.getSource()); + Graphics* g = ev.getGraphics(); + g->fillRect(BGCOLOR, g->getClipBounds()); } -void SkinTheme::draw_entry(Entry* widget, JRect clip) +void SkinTheme::paintEntry(PaintEvent& ev) { + Entry* widget = static_cast(ev.getSource()); bool password = widget->isPassword(); int scroll, caret, state, selbeg, selend; const char *text = widget->getText(); @@ -831,8 +838,9 @@ void SkinTheme::draw_entry(Entry* widget, JRect clip) draw_entry_caret(widget, x, y); } -void SkinTheme::draw_label(JWidget widget, JRect clip) +void SkinTheme::paintLabel(PaintEvent& ev) { + Widget* widget = static_cast(ev.getSource()); int bg = BGCOLOR; jdraw_rectfill(widget->rc, bg); @@ -840,8 +848,9 @@ void SkinTheme::draw_label(JWidget widget, JRect clip) draw_textstring(NULL, -1, bg, false, widget, widget->rc, 0); } -void SkinTheme::draw_link_label(JWidget widget, JRect clip) +void SkinTheme::paintLinkLabel(PaintEvent& ev) { + Widget* widget = static_cast(ev.getSource()); int bg = BGCOLOR; jdraw_rectfill(widget->rc, bg); @@ -1024,8 +1033,9 @@ void SkinTheme::draw_panel(JWidget widget, JRect clip) jdraw_rectfill(widget->rc, get_panel_face_color()); } -void SkinTheme::draw_radio(ButtonBase* widget, JRect clip) +void SkinTheme::paintRadioButton(PaintEvent& ev) { + ButtonBase* widget = static_cast(ev.getSource()); struct jrect box, text, icon; int bg = BGCOLOR; @@ -1408,8 +1418,9 @@ void SkinTheme::draw_view_viewport(JWidget widget, JRect clip) jdraw_rectfill(widget->rc, BGCOLOR); } -void SkinTheme::draw_frame(Frame* window, JRect clip) +void SkinTheme::paintFrame(PaintEvent& ev) { + Frame* window = static_cast(ev.getSource()); JRect pos = jwidget_get_rect(window); JRect cpos = jwidget_get_child_rect(window); diff --git a/src/skin/skin_theme.h b/src/skin/skin_theme.h index 15498929f..035cdd4c2 100644 --- a/src/skin/skin_theme.h +++ b/src/skin/skin_theme.h @@ -422,19 +422,19 @@ public: int color_selected(); int color_background(); - void draw_box(Box* widget, JRect clip); - void draw_button(ButtonBase* widget, JRect clip); - void draw_check(ButtonBase* widget, JRect clip); - void draw_entry(Entry* widget, JRect clip); - void draw_grid(JWidget widget, JRect clip); - void draw_label(JWidget widget, JRect clip); - void draw_link_label(JWidget widget, JRect clip); + void paintBox(PaintEvent& ev); + void paintButton(PaintEvent& ev); + void paintCheckBox(PaintEvent& ev); + void paintEntry(PaintEvent& ev); + void paintGrid(PaintEvent& ev); + void paintLabel(PaintEvent& ev); + void paintLinkLabel(PaintEvent& ev); void draw_listbox(JWidget widget, JRect clip); void draw_listitem(JWidget widget, JRect clip); void draw_menu(JWidget widget, JRect clip); void draw_menuitem(JWidget widget, JRect clip); void draw_panel(JWidget widget, JRect clip); - void draw_radio(ButtonBase* widget, JRect clip); + void paintRadioButton(PaintEvent& ev); void draw_separator(JWidget widget, JRect clip); void paintSlider(PaintEvent& ev); void draw_combobox_entry(Entry* widget, JRect clip); @@ -443,7 +443,7 @@ public: void draw_view(JWidget widget, JRect clip); void draw_view_scrollbar(JWidget widget, JRect clip); void draw_view_viewport(JWidget widget, JRect clip); - void draw_frame(Frame* frame, JRect clip); + void paintFrame(PaintEvent& ev); void draw_frame_button(ButtonBase* widget, JRect clip); int get_button_normal_text_color() const { return makecol(0, 0, 0); }