1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-07-27 13:17:44 +00:00

LibGUI: Use a separate data role for the table model sorting order.

This allows data to be displayed nicely while sorting happens based on some
underlying raw data. :^)
This commit is contained in:
Andreas Kling 2019-03-09 14:24:34 +01:00
parent 3681a402ba
commit 46caa2663b
11 changed files with 43 additions and 15 deletions

View file

@ -54,9 +54,9 @@ GTableModel::ColumnMetadata GSortingProxyTableModel::column_metadata(int index)
return target().column_metadata(index);
}
GVariant GSortingProxyTableModel::data(const GModelIndex& index) const
GVariant GSortingProxyTableModel::data(const GModelIndex& index, Role role) const
{
return target().data(map_to_target(index));
return target().data(map_to_target(index), role);
}
void GSortingProxyTableModel::activate(const GModelIndex& index)
@ -102,8 +102,8 @@ void GSortingProxyTableModel::resort()
auto& context = *(Context*)(ctx);
GModelIndex index1 { row1, context.key_column };
GModelIndex index2 { row2, context.key_column };
auto data1 = context.target->data(index1);
auto data2 = context.target->data(index2);
auto data1 = context.target->data(index1, GTableModel::Role::Sort);
auto data2 = context.target->data(index2, GTableModel::Role::Sort);
if (data1 == data2)
return 0;
bool is_less_than = data1 < data2;

View file

@ -12,7 +12,7 @@ public:
virtual String row_name(int) const override;
virtual String column_name(int) const override;
virtual ColumnMetadata column_metadata(int) const override;
virtual GVariant data(const GModelIndex&) const override;
virtual GVariant data(const GModelIndex&, Role = Role::Display) const override;
virtual void update() override;
virtual void activate(const GModelIndex&) override;

View file

@ -40,6 +40,8 @@ public:
TextAlignment text_alignment { TextAlignment::CenterLeft };
};
enum class Role { Display, Sort, Custom };
virtual ~GTableModel();
virtual int row_count() const = 0;
@ -47,7 +49,7 @@ public:
virtual String row_name(int) const { return { }; }
virtual String column_name(int) const { return { }; }
virtual ColumnMetadata column_metadata(int) const { return { }; }
virtual GVariant data(const GModelIndex&) const = 0;
virtual GVariant data(const GModelIndex&, Role = Role::Display) const = 0;
virtual void update() = 0;
virtual void activate(const GModelIndex&) { }

View file

@ -108,7 +108,7 @@ void GTableView::mousedown_event(GMouseEvent& event)
for (int i = 0; i < m_model->column_count(); ++i) {
auto header_rect = this->header_rect(i);
if (header_rect.contains(adjusted_position)) {
auto new_sort_order = GSortOrder::Descending;
auto new_sort_order = GSortOrder::Ascending;
if (m_model->key_column() == i)
new_sort_order = m_model->sort_order() == GSortOrder::Ascending ? GSortOrder::Descending : GSortOrder::Ascending;
m_model->set_key_column_and_sort_order(i, new_sort_order);