1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-26 01:27:43 +00:00

GTabWidget: Highlight tab buttons when hovered.

The active tab's button doesn't get highlighted, since the highlight is
supposed to indicate that the widget can be interacted with.
This commit is contained in:
Andreas Kling 2019-05-07 14:01:20 +02:00
parent 67108f872f
commit 5c4b421d56
3 changed files with 43 additions and 13 deletions

View file

@ -31,9 +31,7 @@ void GTabWidget::set_active_widget(GWidget* widget)
m_active_widget->set_visible(true);
}
auto invalidation_rect = bar_rect();
invalidation_rect.set_height(invalidation_rect.height() + 1);
update(invalidation_rect);
update_bar();
}
void GTabWidget::resize_event(GResizeEvent& event)
@ -97,16 +95,18 @@ void GTabWidget::paint_event(GPaintEvent& event)
for (int i = 0; i < m_tabs.size(); ++i) {
if (m_tabs[i].widget == m_active_widget)
continue;
bool hovered = i == m_hovered_tab_index;
auto button_rect = this->button_rect(i);
StylePainter::paint_tab_button(painter, button_rect, false, m_tabs[i].hovered, m_tabs[i].widget->is_enabled());
StylePainter::paint_tab_button(painter, button_rect, false, hovered, m_tabs[i].widget->is_enabled());
painter.draw_text(button_rect, m_tabs[i].title, TextAlignment::Center);
}
for (int i = 0; i < m_tabs.size(); ++i) {
if (m_tabs[i].widget != m_active_widget)
continue;
bool hovered = i == m_hovered_tab_index;
auto button_rect = this->button_rect(i);
StylePainter::paint_tab_button(painter, button_rect, true, m_tabs[i].hovered, m_tabs[i].widget->is_enabled());
StylePainter::paint_tab_button(painter, button_rect, true, hovered, m_tabs[i].widget->is_enabled());
painter.draw_text(button_rect, m_tabs[i].title, TextAlignment::Center);
painter.draw_line(button_rect.bottom_left().translated(1, 1), button_rect.bottom_right().translated(-1, 1), background_color());
break;
@ -141,5 +141,38 @@ void GTabWidget::mousedown_event(GMouseEvent& event)
if (!button_rect.contains(event.position()))
continue;
set_active_widget(m_tabs[i].widget);
return;
}
}
void GTabWidget::mousemove_event(GMouseEvent& event)
{
int hovered_tab = -1;
for (int i = 0; i < m_tabs.size(); ++i) {
auto button_rect = this->button_rect(i);
if (!button_rect.contains(event.position()))
continue;
hovered_tab = i;
if (m_tabs[i].widget == m_active_widget)
break;
}
if (hovered_tab == m_hovered_tab_index)
return;
m_hovered_tab_index = hovered_tab;
update_bar();
}
void GTabWidget::leave_event(CEvent&)
{
if (m_hovered_tab_index != -1) {
m_hovered_tab_index = -1;
update_bar();
}
}
void GTabWidget::update_bar()
{
auto invalidation_rect = bar_rect();
invalidation_rect.set_height(invalidation_rect.height() + 1);
update(invalidation_rect);
}

View file

@ -22,11 +22,14 @@ protected:
virtual void child_event(CChildEvent&) override;
virtual void resize_event(GResizeEvent&) override;
virtual void mousedown_event(GMouseEvent&) override;
virtual void mousemove_event(GMouseEvent&) override;
virtual void leave_event(CEvent&) override;
private:
Rect child_rect_for_size(const Size&) const;
Rect button_rect(int index) const;
Rect bar_rect() const;
void update_bar();
GWidget* m_active_widget { nullptr };
@ -35,7 +38,7 @@ private:
int width(const Font&) const;
String title;
GWidget* widget { nullptr };
bool hovered { false };
};
Vector<TabData> m_tabs;
int m_hovered_tab_index { -1 };
};

View file

@ -7,14 +7,8 @@ void StylePainter::paint_tab_button(Painter& painter, const Rect& rect, bool act
Color highlight_color2 = Color::from_rgb(0xdfdfdf);
Color shadow_color1 = Color::from_rgb(0x808080);
Color shadow_color2 = Color::from_rgb(0x404040);
ASSERT(!hovered);
if (enabled) {
if (hovered)
base_color = Color::from_rgb(0xe3dfdb);
//else
// button_color = Color::from_rgb(0xd6d2ce);
} else if (hovered && enabled)
if (hovered && enabled && !active)
base_color = Color::from_rgb(0xd4d4d4);
PainterStateSaver saver(painter);