diff --git a/src/group_gui.cpp b/src/group_gui.cpp index 69044577fe..1b0dc461d0 100644 --- a/src/group_gui.cpp +++ b/src/group_gui.cpp @@ -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 column_size{}; ///< Size of the columns in the group list. + std::array 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(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