Change: track hover position on Online Players GUI

Especially if there are many players online, trying to chat with
the right one can be a visual challenge. This can be solved by
highlighting the row you are on. This visual cue is often enough
for humans to find the right row.
This commit is contained in:
Patric Stout 2021-04-23 15:01:02 +02:00 committed by Patric Stout
parent 54f69deb0c
commit c2e116a3d3
1 changed files with 24 additions and 0 deletions

View File

@ -1755,6 +1755,7 @@ private:
Scrollbar *vscroll; ///< Vertical scrollbar of this window.
uint line_height; ///< Current lineheight of each entry in the matrix.
uint line_count; ///< Amount of lines in the matrix.
int hover_index; ///< Index of the current line we are hovering over, or -1 if none.
std::map<uint, std::vector<std::unique_ptr<ButtonCommon>>> buttons; ///< Per line which buttons are available.
@ -2261,6 +2262,11 @@ public:
case WID_CL_MATRIX: {
uint line = 0;
if (this->hover_index >= 0) {
uint offset = this->hover_index * this->line_height;
GfxFillRect(r.left + 2, r.top + offset, r.right - 1, r.top + offset + this->line_height - 1, GREY_SCALE(9));
}
for (const Company *c : Company::Iterate()) {
this->DrawCompany(c, r.left, r.right, r.top, line);
}
@ -2271,6 +2277,24 @@ public:
}
}
}
virtual void OnMouseLoop() override
{
if (GetWidgetFromPos(this, _cursor.pos.x - this->left, _cursor.pos.y - this->top) != WID_CL_MATRIX) {
this->hover_index = -1;
this->SetDirty();
return;
}
NWidgetBase *nwi = this->GetWidget<NWidgetBase>(WID_CL_MATRIX);
int y = _cursor.pos.y - this->top - nwi->pos_y - 2;
int index = y / this->line_height;
if (index != this->hover_index) {
this->hover_index = index;
this->SetDirty();
}
}
};
void ShowClientList()