mirror of
https://github.com/RGBCube/serenity
synced 2025-07-25 23:37:35 +00:00
LibGUI: Add GTableModel::Role::ForegroundColor.
This makes it possible to specify the text color for each table cell. Use this to make the IRCClient show unread window list items in red.
This commit is contained in:
parent
f4b8e4966f
commit
d466f2634d
10 changed files with 120 additions and 63 deletions
|
@ -42,7 +42,7 @@ public:
|
|||
const Font* font { nullptr };
|
||||
};
|
||||
|
||||
enum class Role { Display, Sort, Custom };
|
||||
enum class Role { Display, Sort, Custom, ForegroundColor, BackgroundColor };
|
||||
|
||||
virtual ~GTableModel();
|
||||
|
||||
|
|
|
@ -116,15 +116,14 @@ void GTableView::paint_event(GPaintEvent& event)
|
|||
int y_offset = header_height();
|
||||
|
||||
for (int row_index = 0; row_index < m_model->row_count(); ++row_index) {
|
||||
bool is_selected_row = row_index == m_model->selected_index().row();
|
||||
int y = y_offset + painted_item_index * item_height();
|
||||
|
||||
Color background_color;
|
||||
Color key_column_background_color;
|
||||
Color text_color;
|
||||
if (row_index == m_model->selected_index().row()) {
|
||||
if (is_selected_row) {
|
||||
background_color = is_focused() ? Color::from_rgb(0x84351a) : Color::from_rgb(0x606060);
|
||||
key_column_background_color = is_focused() ? Color::from_rgb(0x84351a) : Color::from_rgb(0x606060);
|
||||
text_color = Color::White;
|
||||
} else {
|
||||
if (alternating_row_colors() && (painted_item_index % 2)) {
|
||||
background_color = Color(210, 210, 210);
|
||||
|
@ -133,10 +132,9 @@ void GTableView::paint_event(GPaintEvent& event)
|
|||
background_color = Color::White;
|
||||
key_column_background_color = Color(235, 235, 235);
|
||||
}
|
||||
text_color = Color::Black;
|
||||
}
|
||||
|
||||
painter.fill_rect(row_rect(painted_item_index), background_color);
|
||||
|
||||
int x_offset = 0;
|
||||
for (int column_index = 0; column_index < m_model->column_count(); ++column_index) {
|
||||
auto column_metadata = m_model->column_metadata(column_index);
|
||||
|
@ -148,11 +146,18 @@ void GTableView::paint_event(GPaintEvent& event)
|
|||
auto cell_rect_for_fill = cell_rect.inflated(horizontal_padding() * 2, 0);
|
||||
painter.fill_rect(cell_rect_for_fill, key_column_background_color);
|
||||
}
|
||||
auto data = m_model->data({ row_index, column_index });
|
||||
if (data.is_bitmap())
|
||||
GModelIndex cell_index(row_index, column_index);
|
||||
auto data = m_model->data(cell_index);
|
||||
if (data.is_bitmap()) {
|
||||
painter.blit(cell_rect.location(), data.as_bitmap(), data.as_bitmap().rect());
|
||||
else
|
||||
} else {
|
||||
Color text_color;
|
||||
if (is_selected_row)
|
||||
text_color = Color::White;
|
||||
else
|
||||
text_color = m_model->data(cell_index, GTableModel::Role::ForegroundColor).to_color(Color::Black);
|
||||
painter.draw_text(cell_rect, data.to_string(), font, column_metadata.text_alignment, text_color);
|
||||
}
|
||||
x_offset += column_width + horizontal_padding() * 2;
|
||||
}
|
||||
++painted_item_index;
|
||||
|
|
|
@ -1,5 +1,9 @@
|
|||
#include <LibGUI/GVariant.h>
|
||||
|
||||
GVariant::GVariant()
|
||||
{
|
||||
}
|
||||
|
||||
GVariant::~GVariant()
|
||||
{
|
||||
switch (m_type) {
|
||||
|
@ -48,6 +52,12 @@ GVariant::GVariant(const GraphicsBitmap& value)
|
|||
AK::retain_if_not_null(m_value.as_bitmap);
|
||||
}
|
||||
|
||||
GVariant::GVariant(Color color)
|
||||
: m_type(Type::Color)
|
||||
{
|
||||
m_value.as_color = color.value();
|
||||
}
|
||||
|
||||
bool GVariant::operator==(const GVariant& other) const
|
||||
{
|
||||
if (m_type != other.m_type)
|
||||
|
@ -63,6 +73,8 @@ bool GVariant::operator==(const GVariant& other) const
|
|||
return as_string() == other.as_string();
|
||||
case Type::Bitmap:
|
||||
return m_value.as_bitmap == other.m_value.as_bitmap;
|
||||
case Type::Color:
|
||||
return m_value.as_color == other.m_value.as_color;
|
||||
case Type::Invalid:
|
||||
break;
|
||||
}
|
||||
|
@ -85,6 +97,8 @@ bool GVariant::operator<(const GVariant& other) const
|
|||
case Type::Bitmap:
|
||||
// FIXME: Maybe compare bitmaps somehow differently?
|
||||
return m_value.as_bitmap < other.m_value.as_bitmap;
|
||||
case Type::Color:
|
||||
return m_value.as_color < other.m_value.as_color;
|
||||
case Type::Invalid:
|
||||
break;
|
||||
}
|
||||
|
@ -104,6 +118,8 @@ String GVariant::to_string() const
|
|||
return as_string();
|
||||
case Type::Bitmap:
|
||||
return "[GraphicsBitmap]";
|
||||
case Type::Color:
|
||||
return as_color().to_string();
|
||||
case Type::Invalid:
|
||||
break;
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ public:
|
|||
GVariant(int);
|
||||
GVariant(const String&);
|
||||
GVariant(const GraphicsBitmap&);
|
||||
GVariant(Color);
|
||||
~GVariant();
|
||||
|
||||
enum class Type {
|
||||
|
@ -20,6 +21,7 @@ public:
|
|||
Float,
|
||||
String,
|
||||
Bitmap,
|
||||
Color,
|
||||
};
|
||||
|
||||
bool is_valid() const { return m_type != Type::Invalid; }
|
||||
|
@ -28,6 +30,7 @@ public:
|
|||
bool is_float() const { return m_type == Type::Float; }
|
||||
bool is_string() const { return m_type == Type::String; }
|
||||
bool is_bitmap() const { return m_type == Type::Bitmap; }
|
||||
bool is_color() const { return m_type == Type::Color; }
|
||||
Type type() const { return m_type; }
|
||||
|
||||
bool as_bool() const
|
||||
|
@ -60,6 +63,19 @@ public:
|
|||
return *m_value.as_bitmap;
|
||||
}
|
||||
|
||||
Color as_color() const
|
||||
{
|
||||
ASSERT(type() == Type::Color);
|
||||
return Color::from_rgba(m_value.as_color);
|
||||
}
|
||||
|
||||
Color to_color(Color default_value) const
|
||||
{
|
||||
if (type() == Type::Color)
|
||||
return as_color();
|
||||
return default_value;
|
||||
}
|
||||
|
||||
String to_string() const;
|
||||
|
||||
bool operator==(const GVariant&) const;
|
||||
|
@ -72,6 +88,7 @@ private:
|
|||
bool as_bool;
|
||||
int as_int;
|
||||
float as_float;
|
||||
RGBA32 as_color;
|
||||
} m_value;
|
||||
|
||||
Type m_type { Type::Invalid };
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue