mirror of
https://github.com/OpenTTD/OpenTTD
synced 2025-12-10 06:52:05 +01:00
Codechange: Precalculate group column rects.
Simplifies drawing group list which no longer needs to calculate horizontal positions for each row.
This commit is contained in:
committed by
Peter Nelson
parent
e15539c430
commit
91a12a3928
@@ -193,20 +193,21 @@ void BuildGuiGroupList(GUIGroupList &list, bool fold, Owner owner, VehicleType v
|
||||
}
|
||||
}
|
||||
|
||||
/* Columns in the group list */
|
||||
enum VehicleGroupColumns : uint8_t {
|
||||
VGC_FOLD, ///< Fold / Unfold button.
|
||||
VGC_NAME, ///< Group name.
|
||||
VGC_PROTECT, ///< Autoreplace protect icon.
|
||||
VGC_AUTOREPLACE, ///< Autoreplace active icon.
|
||||
VGC_PROFIT, ///< Profit icon.
|
||||
VGC_NUMBER, ///< Number of vehicles in the group.
|
||||
|
||||
VGC_END
|
||||
};
|
||||
DECLARE_INCREMENT_DECREMENT_OPERATORS(VehicleGroupColumns);
|
||||
|
||||
class VehicleGroupWindow : public BaseVehicleListWindow {
|
||||
private:
|
||||
/* Columns in the group list */
|
||||
enum ListColumns : uint8_t {
|
||||
VGC_FOLD, ///< Fold / Unfold button.
|
||||
VGC_NAME, ///< Group name.
|
||||
VGC_PROTECT, ///< Autoreplace protect icon.
|
||||
VGC_AUTOREPLACE, ///< Autoreplace active icon.
|
||||
VGC_PROFIT, ///< Profit icon.
|
||||
VGC_NUMBER, ///< Number of vehicles in the group.
|
||||
|
||||
VGC_END
|
||||
};
|
||||
|
||||
GroupID group_sel = GroupID::Invalid(); ///< Selected group (for drag/drop)
|
||||
GroupID group_rename = GroupID::Invalid(); ///< Group being renamed, GroupID::Invalid() if none
|
||||
GroupID group_over = GroupID::Invalid(); ///< Group over which a vehicle is dragged, GroupID::Invalid() if none
|
||||
@@ -216,6 +217,7 @@ private:
|
||||
Scrollbar *group_sb = nullptr;
|
||||
|
||||
std::array<Dimension, VGC_END> column_size{}; ///< Size of the columns in the group list.
|
||||
std::array<Rect, VGC_END> column_rects{};
|
||||
bool last_overlay_state = false;
|
||||
|
||||
/**
|
||||
@@ -279,6 +281,28 @@ private:
|
||||
WidgetDimensions::scaled.framerect.right;
|
||||
}
|
||||
|
||||
/**
|
||||
* Update precalculated column rects for drawing group information.
|
||||
*/
|
||||
void UpdateColumnRects()
|
||||
{
|
||||
bool rtl = _current_text_dir == TD_RTL;
|
||||
Rect r = this->GetWidget<NWidgetCore>(WID_GL_LIST_GROUP)->GetCurrentRect().Shrink(WidgetDimensions::scaled.framerect);
|
||||
|
||||
/* Place columns before VGC_NAME from start to end. */
|
||||
for (VehicleGroupColumns lc{}; lc != VGC_NAME; ++lc) {
|
||||
this->column_rects[lc] = r.WithWidth(this->column_size[lc].width, rtl);
|
||||
r = r.Indent(this->column_size[lc].width + WidgetDimensions::scaled.hsep_normal, rtl);
|
||||
}
|
||||
/* Place columns after VGC_NAME from end to start. */
|
||||
for (VehicleGroupColumns lc{VGC_END - 1}; lc != VGC_NAME; --lc) {
|
||||
this->column_rects[lc] = r.WithWidth(this->column_size[lc].width, !rtl);
|
||||
r = r.Indent(this->column_size[lc].width + WidgetDimensions::scaled.hsep_normal, !rtl);
|
||||
}
|
||||
/* Name column fills remaining space. */
|
||||
this->column_rects[VGC_NAME] = r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the string to draw for the given group.
|
||||
* @param g_id Group to get string for.
|
||||
@@ -348,42 +372,33 @@ private:
|
||||
}
|
||||
|
||||
/* draw fold / unfold button */
|
||||
r = r.Indent(indent * WidgetDimensions::scaled.hsep_indent, rtl);
|
||||
if (has_children) {
|
||||
DrawSpriteIgnorePadding(Group::Get(g_id)->folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, r.WithWidth(this->column_size[VGC_FOLD].width, rtl), SA_CENTER);
|
||||
DrawSpriteIgnorePadding(Group::Get(g_id)->folded ? SPR_CIRCLE_FOLDED : SPR_CIRCLE_UNFOLDED, PAL_NONE, r.WithX(this->column_rects[VGC_FOLD]).Translate(indent * level_width, 0), SA_CENTER);
|
||||
}
|
||||
|
||||
/* Group name text column shrinks to fit available space. */
|
||||
int text_width = this->column_size[VGC_NAME].width - indent * WidgetDimensions::scaled.hsep_indent;
|
||||
|
||||
/* draw group name */
|
||||
r = r.Indent(this->column_size[VGC_FOLD].width + WidgetDimensions::scaled.hsep_normal, rtl);
|
||||
DrawString(r.WithWidth(text_width, rtl).CentreToHeight(this->column_size[VGC_NAME].height), this->GetGroupNameString(g_id), colour);
|
||||
DrawString(r.WithX(this->column_rects[VGC_NAME]).Indent(indent * WidgetDimensions::scaled.hsep_indent, rtl).CentreToHeight(this->column_size[VGC_NAME].height), this->GetGroupNameString(g_id), colour);
|
||||
|
||||
/* draw autoreplace protection */
|
||||
r = r.Indent(text_width + WidgetDimensions::scaled.hsep_wide, rtl);
|
||||
if (protection) {
|
||||
DrawSpriteIgnorePadding(SPR_GROUP_REPLACE_PROTECT, PAL_NONE, r.WithWidth(this->column_size[VGC_PROTECT].width, rtl), SA_CENTER);
|
||||
DrawSpriteIgnorePadding(SPR_GROUP_REPLACE_PROTECT, PAL_NONE, r.WithX(this->column_rects[VGC_PROTECT]), SA_CENTER);
|
||||
}
|
||||
|
||||
/* draw autoreplace status */
|
||||
r = r.Indent(this->column_size[VGC_PROTECT].width + WidgetDimensions::scaled.hsep_normal, rtl);
|
||||
if (stats.autoreplace_defined) {
|
||||
DrawSpriteIgnorePadding(SPR_GROUP_REPLACE_ACTIVE, stats.autoreplace_finished ? PALETTE_CRASH : PAL_NONE, r.WithWidth(this->column_size[VGC_AUTOREPLACE].width, rtl), SA_CENTER);
|
||||
DrawSpriteIgnorePadding(SPR_GROUP_REPLACE_ACTIVE, stats.autoreplace_finished ? PALETTE_CRASH : PAL_NONE, r.WithX(this->column_rects[VGC_AUTOREPLACE]), SA_CENTER);
|
||||
}
|
||||
|
||||
/* draw the profit icon */
|
||||
r = r.Indent(this->column_size[VGC_AUTOREPLACE].width + WidgetDimensions::scaled.hsep_normal, rtl);
|
||||
DrawSpriteIgnorePadding(this->GetGroupProfitSpriteID(g_id), PAL_NONE, r.WithWidth(this->column_size[VGC_PROFIT].width, rtl), SA_CENTER);
|
||||
DrawSpriteIgnorePadding(this->GetGroupProfitSpriteID(g_id), PAL_NONE, r.WithX(this->column_rects[VGC_PROFIT]), SA_CENTER);
|
||||
|
||||
/* draw the number of vehicles of the group */
|
||||
r = r.Indent(this->column_size[VGC_PROFIT].width + WidgetDimensions::scaled.hsep_normal, rtl);
|
||||
int num_vehicle_with_subgroups = GetGroupNumVehicle(this->vli.company, g_id, this->vli.vtype);
|
||||
int num_vehicle = GroupStatistics::Get(this->vli.company, g_id, this->vli.vtype).num_vehicle;
|
||||
if (IsAllGroupID(g_id) || IsDefaultGroupID(g_id) || num_vehicle_with_subgroups == num_vehicle) {
|
||||
DrawString(r.CentreToHeight(this->column_size[VGC_NUMBER].height), GetString(STR_JUST_COMMA, num_vehicle), colour, SA_RIGHT | SA_FORCE, false, FS_SMALL);
|
||||
DrawString(r.WithX(this->column_rects[VGC_NUMBER]).CentreToHeight(this->column_size[VGC_NUMBER].height), GetString(STR_JUST_COMMA, num_vehicle), colour, SA_RIGHT | SA_FORCE, false, FS_SMALL);
|
||||
} else {
|
||||
DrawString(r.CentreToHeight(this->column_size[VGC_NUMBER].height), GetString(STR_GROUP_COUNT_WITH_SUBGROUP, num_vehicle, num_vehicle_with_subgroups - num_vehicle), colour, SA_RIGHT | SA_FORCE);
|
||||
DrawString(r.WithX(this->column_rects[VGC_NUMBER]).CentreToHeight(this->column_size[VGC_NUMBER].height), GetString(STR_GROUP_COUNT_WITH_SUBGROUP, num_vehicle, num_vehicle_with_subgroups - num_vehicle), colour, SA_RIGHT | SA_FORCE);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -997,6 +1012,7 @@ public:
|
||||
{
|
||||
this->group_sb->SetCapacityFromWidget(this, WID_GL_LIST_GROUP);
|
||||
this->vscroll->SetCapacityFromWidget(this, WID_GL_LIST_VEHICLE);
|
||||
this->UpdateColumnRects();
|
||||
}
|
||||
|
||||
void OnDropdownSelect(WidgetID widget, int index, int) override
|
||||
|
||||
Reference in New Issue
Block a user