From cb2eb74ff0ee69b2ad2e9ee229eb0eae7c9bd4d0 Mon Sep 17 00:00:00 2001 From: David Capello Date: Tue, 15 Feb 2011 09:02:51 -0300 Subject: [PATCH] Add ArrowAlign to TipWindow so the tip is pointing to some widget. --- data/skins/default_skin/sheet.png | Bin 6984 -> 6953 bytes src/commands/cmd_cel_properties.cpp | 3 +- src/gui/tooltips.cpp | 70 +++++++++++++++++++++++----- src/gui/tooltips.h | 15 ++++-- src/skin/skin_theme.cpp | 53 +++++++++++++++++++-- src/widgets/color_selector.cpp | 2 +- src/widgets/toolbar.cpp | 1 + src/xml_widgets.cpp | 2 +- 8 files changed, 123 insertions(+), 23 deletions(-) diff --git a/data/skins/default_skin/sheet.png b/data/skins/default_skin/sheet.png index e5e8aa9070655d84d6f3017c81ba9b45ea7e50bd..312303c0b615b11fc8e717536b72c07a99550dc2 100644 GIT binary patch delta 6740 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 Ri|GLF(Nuk?(x7A)^*?lNij@EW delta 6780 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 G^8WxqWy8n- diff --git a/src/commands/cmd_cel_properties.cpp b/src/commands/cmd_cel_properties.cpp index 21c83450b..9fe1671d2 100644 --- a/src/commands/cmd_cel_properties.cpp +++ b/src/commands/cmd_cel_properties.cpp @@ -113,7 +113,8 @@ void CelPropertiesCommand::onExecute(Context* context) if (layer->is_background()) { slider_opacity->setEnabled(false); jwidget_add_tooltip_text(slider_opacity, "The `Background' layer is opaque,\n" - "you can't change its opacity."); + "you can't change its opacity.", + JI_LEFT); } } else { diff --git a/src/gui/tooltips.cpp b/src/gui/tooltips.cpp index 7bb389f1c..6c6f47018 100644 --- a/src/gui/tooltips.cpp +++ b/src/gui/tooltips.cpp @@ -24,12 +24,13 @@ struct TipData Frame* window; // Frame where is the tooltip std::string text; int timer_id; + int arrowAlign; }; static int tip_type(); static bool tip_hook(JWidget widget, JMessage msg); -void jwidget_add_tooltip_text(JWidget widget, const char *text) +void jwidget_add_tooltip_text(JWidget widget, const char *text, int arrowAlign) { TipData* tip = reinterpret_cast(jwidget_get_data(widget, tip_type())); @@ -42,6 +43,7 @@ void jwidget_add_tooltip_text(JWidget widget, const char *text) tip->window = NULL; tip->text = text; tip->timer_id = -1; + tip->arrowAlign = arrowAlign; jwidget_add_hook(widget, tip_type(), tip_hook, tip); } @@ -98,25 +100,60 @@ static bool tip_hook(JWidget widget, JMessage msg) case JM_TIMER: if (msg->timer.timer_id == tip->timer_id) { if (!tip->window) { - Frame* window = new TipWindow(tip->text.c_str(), true); -/* int x = tip->widget->rc->x1; */ -/* int y = tip->widget->rc->y2; */ + TipWindow* window = new TipWindow(tip->text.c_str(), true); + gfx::Rect bounds = tip->widget->getBounds(); int x = jmouse_x(0)+12*jguiscale(); int y = jmouse_y(0)+12*jguiscale(); int w, h; tip->window = window; + window->setArrowAlign(tip->arrowAlign); window->remap_window(); w = jrect_w(window->rc); h = jrect_h(window->rc); - if (x+w > JI_SCREEN_W) { - x = jmouse_x(0) - w - 4*jguiscale(); - y = jmouse_y(0); + switch (tip->arrowAlign) { + case JI_TOP | JI_LEFT: + x = bounds.x + bounds.w; + y = bounds.y + bounds.h; + break; + case JI_TOP | JI_RIGHT: + x = bounds.x - w; + y = bounds.y + bounds.h; + break; + case JI_BOTTOM | JI_LEFT: + x = bounds.x + bounds.w; + y = bounds.y - h; + break; + case JI_BOTTOM | JI_RIGHT: + x = bounds.x - w; + y = bounds.y - h; + break; + case JI_TOP: + x = bounds.x + bounds.w/2 - w/2; + y = bounds.y + bounds.h; + break; + case JI_BOTTOM: + x = bounds.x + bounds.w/2 - w/2; + y = bounds.y - h; + break; + case JI_LEFT: + x = bounds.x + bounds.w; + y = bounds.y + bounds.h/2 - h/2; + break; + case JI_RIGHT: + x = bounds.x - w; + y = bounds.y + bounds.h/2 - h/2; + break; } + // if (x+w > JI_SCREEN_W) { + // x = jmouse_x(0) - w - 4*jguiscale(); + // y = jmouse_y(0); + // } + window->position_window(MID(0, x, JI_SCREEN_W-w), MID(0, y, JI_SCREEN_H-h)); window->open_window(); @@ -140,6 +177,7 @@ TipWindow::TipWindow(const char *text, bool close_on_buttonpressed) m_close_on_buttonpressed = close_on_buttonpressed; m_hot_region = NULL; m_filtering = false; + m_arrowAlign = 0; set_sizeable(false); set_moveable(false); @@ -186,6 +224,16 @@ void TipWindow::set_hotregion(JRegion region) m_hot_region = region; } +int TipWindow::getArrowAlign() const +{ + return m_arrowAlign; +} + +void TipWindow::setArrowAlign(int arrowAlign) +{ + m_arrowAlign = arrowAlign; +} + bool TipWindow::onProcessMessage(JMessage msg) { switch (msg->type) { @@ -201,10 +249,10 @@ bool TipWindow::onProcessMessage(JMessage msg) case JM_SIGNAL: if (msg->signal.num == JI_SIGNAL_INIT_THEME) { - this->border_width.l = 4 * jguiscale(); - this->border_width.t = 4 * jguiscale(); - this->border_width.r = 4 * jguiscale(); - this->border_width.b = 5 * jguiscale(); + this->border_width.l = 6 * jguiscale(); + this->border_width.t = 6 * jguiscale(); + this->border_width.r = 6 * jguiscale(); + this->border_width.b = 7 * jguiscale(); // Setup the background color. setBgColor(makecol(255, 255, 200)); diff --git a/src/gui/tooltips.h b/src/gui/tooltips.h index 2d5cbf33d..937fa1535 100644 --- a/src/gui/tooltips.h +++ b/src/gui/tooltips.h @@ -12,22 +12,27 @@ class TipWindow : public Frame { - bool m_close_on_buttonpressed; - JRegion m_hot_region; - bool m_filtering; - public: TipWindow(const char *text, bool close_on_buttonpressed = false); ~TipWindow(); void set_hotregion(JRegion region); + int getArrowAlign() const; + void setArrowAlign(int arrowAlign); + protected: bool onProcessMessage(JMessage msg); void onPreferredSize(PreferredSizeEvent& ev); void onPaint(PaintEvent& ev); + +private: + bool m_close_on_buttonpressed; + JRegion m_hot_region; + bool m_filtering; + int m_arrowAlign; }; -void jwidget_add_tooltip_text(Widget* widget, const char *text); +void jwidget_add_tooltip_text(Widget* widget, const char* text, int arrowAlign = 0); #endif diff --git a/src/skin/skin_theme.cpp b/src/skin/skin_theme.cpp index 98e4739c8..2f7e31e5f 100644 --- a/src/skin/skin_theme.cpp +++ b/src/skin/skin_theme.cpp @@ -1482,13 +1482,58 @@ void SkinTheme::paintTooltip(PaintEvent& ev) { TipWindow* widget = static_cast(ev.getSource()); Graphics* g = ev.getGraphics(); - gfx::Rect pos = widget->getClientBounds(); + gfx::Rect rc = widget->getClientBounds(); int bg = makecol(255, 255, 125); - draw_bounds_nw(g, pos, PART_TOOLTIP_NW, bg); - pos.shrink(widget->getBorder()); + int nw = PART_TOOLTIP_NW; + int n = PART_TOOLTIP_N; + int ne = PART_TOOLTIP_NE; + int e = PART_TOOLTIP_E; + int se = PART_TOOLTIP_SE; + int s = PART_TOOLTIP_S; + int sw = PART_TOOLTIP_SW; + int w = PART_TOOLTIP_W; - g->drawString(widget->getText(), ji_color_foreground(), bg, pos, widget->getAlign()); + switch (widget->getArrowAlign()) { + case JI_TOP | JI_LEFT: nw = PART_TOOLTIP_ARROW_NW; break; + case JI_TOP | JI_RIGHT: ne = PART_TOOLTIP_ARROW_NE; break; + case JI_BOTTOM | JI_LEFT: sw = PART_TOOLTIP_ARROW_SW; break; + case JI_BOTTOM | JI_RIGHT: se = PART_TOOLTIP_ARROW_SE; break; + } + + draw_bounds_template(g, rc, nw, n, ne, e, se, s, sw, w); + + // Draw arrow in sides + BITMAP* arrow = NULL; + switch (widget->getArrowAlign()) { + case JI_TOP: + arrow = m_part[PART_TOOLTIP_ARROW_N]; + g->drawAlphaBitmap(arrow, rc.x+rc.w/2-arrow->w/2, rc.y); + break; + case JI_BOTTOM: + arrow = m_part[PART_TOOLTIP_ARROW_S]; + g->drawAlphaBitmap(arrow, rc.x+rc.w/2-arrow->w/2, rc.y+rc.h-arrow->h); + break; + case JI_LEFT: + arrow = m_part[PART_TOOLTIP_ARROW_W]; + g->drawAlphaBitmap(arrow, rc.x, rc.y+rc.h/2-arrow->h/2); + break; + case JI_RIGHT: + arrow = m_part[PART_TOOLTIP_ARROW_E]; + g->drawAlphaBitmap(arrow, rc.x+rc.w-arrow->w, rc.y+rc.h/2-arrow->h/2); + break; + } + + + // Fill background + g->fillRect(bg, gfx::Rect(rc).shrink(gfx::Border(m_part[w]->w, + m_part[n]->h, + m_part[e]->w, + m_part[s]->h))); + + rc.shrink(widget->getBorder()); + + g->drawString(widget->getText(), ji_color_foreground(), bg, rc, widget->getAlign()); } int SkinTheme::get_bg_color(JWidget widget) diff --git a/src/widgets/color_selector.cpp b/src/widgets/color_selector.cpp index 0f463523e..4bf16eaf8 100644 --- a/src/widgets/color_selector.cpp +++ b/src/widgets/color_selector.cpp @@ -102,7 +102,7 @@ Frame* colorselector_new() colorselector->selected_model = &models[0]; /* palette */ - jwidget_add_tooltip_text(pal, "Use SHIFT or CTRL to select ranges"); + jwidget_add_tooltip_text(pal, "Use SHIFT or CTRL to select ranges", JI_TOP); /* data for a better layout */ grid1->child_spacing = 0; diff --git a/src/widgets/toolbar.cpp b/src/widgets/toolbar.cpp index 8b0431db9..1eaa6d3f4 100644 --- a/src/widgets/toolbar.cpp +++ b/src/widgets/toolbar.cpp @@ -489,6 +489,7 @@ void ToolBar::openTipWindow(int group_index, Tool* tool) } m_tipWindow = new TipWindow(tooltip.c_str(), true); + m_tipWindow->setArrowAlign(JI_TOP | JI_RIGHT); m_tipWindow->remap_window(); Rect toolrc = getToolGroupBounds(group_index); diff --git a/src/xml_widgets.cpp b/src/xml_widgets.cpp index a29199926..5d2183835 100644 --- a/src/xml_widgets.cpp +++ b/src/xml_widgets.cpp @@ -333,7 +333,7 @@ static Widget* convert_xmlelement_to_widget(TiXmlElement* elem, Widget* root) widget->setName(name); if (tooltip != NULL) - jwidget_add_tooltip_text(widget, tooltip); + jwidget_add_tooltip_text(widget, tooltip, JI_LEFT); if (selected) widget->setSelected(selected);