Changeset - r28030:99c289b7c6ba
[Not reviewed]
master
0 1 0
Peter Nelson - 12 months ago 2023-10-19 18:50:43
peter1138@openttd.org
Codechange: Hide toolbar buttons by setting width to zero.

Zero-width is how widgets are hidden elsewhere.
This removes the need for an extra array to lookup if a button is hidden.
1 file changed with 3 insertions and 11 deletions:
0 comments (0 inline, 0 general)
src/toolbar_gui.cpp
Show inline comments
 
@@ -1355,13 +1355,12 @@ static MenuClickedProc * const _menu_cli
 
	MenuClickNewspaper,   // 28
 
	MenuClickHelp,        // 29
 
};
 

	
 
/** Full blown container to make it behave exactly as we want :) */
 
class NWidgetToolbarContainer : public NWidgetContainer {
 
	bool visible[WID_TN_END]; ///< The visible headers
 
protected:
 
	uint spacers;          ///< Number of spacer widgets in this toolbar
 

	
 
public:
 
	NWidgetToolbarContainer() : NWidgetContainer(NWID_HORIZONTAL)
 
	{
 
@@ -1417,22 +1416,19 @@ public:
 
		this->pos_x = x;
 
		this->pos_y = y;
 
		this->current_x = given_width;
 
		this->current_y = given_height;
 

	
 
		/* Figure out what are the visible buttons */
 
		memset(this->visible, 0, sizeof(this->visible));
 
		uint arrangable_count, button_count, spacer_count;
 
		const byte *arrangement = GetButtonArrangement(given_width, arrangable_count, button_count, spacer_count);
 
		for (uint i = 0; i < arrangable_count; i++) {
 
			this->visible[arrangement[i]] = true;
 
		}
 

	
 
		/* Create us ourselves a quick lookup table */
 
		NWidgetBase *widgets[WID_TN_END];
 
		for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) {
 
			child_wid->current_x = 0; /* Hide widget, it will be revealed in the next step. */
 
			if (child_wid->type == NWID_SPACER) continue;
 
			widgets[((NWidgetCore*)child_wid)->index] = child_wid;
 
		}
 

	
 
		/* Now assign the widgets to their rightful place */
 
		uint position = 0; // Place to put next child relative to origin of the container.
 
@@ -1458,12 +1454,14 @@ public:
 

	
 
			/* Buttons can be scaled, the others not. */
 
			if (this->IsButton(child_wid->type)) {
 
				child_wid->current_x = button_space / (button_count - button_i);
 
				button_space -= child_wid->current_x;
 
				button_i++;
 
			} else {
 
				child_wid->current_x = child_wid->smallest_x;
 
			}
 
			child_wid->AssignSizePosition(sizing, x + position, y, child_wid->current_x, this->current_y, rtl);
 
			position += child_wid->current_x;
 

	
 
			if (rtl) {
 
				cur_wid--;
 
@@ -1478,27 +1476,21 @@ public:
 
		/* Draw brown-red toolbar bg. */
 
		GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, PC_VERY_DARK_RED);
 
		GfxFillRect(this->pos_x, this->pos_y, this->pos_x + this->current_x - 1, this->pos_y + this->current_y - 1, PC_DARK_RED, FILLRECT_CHECKER);
 

	
 
		bool rtl = _current_text_dir == TD_RTL;
 
		for (NWidgetBase *child_wid = rtl ? this->tail : this->head; child_wid != nullptr; child_wid = rtl ? child_wid->prev : child_wid->next) {
 
			if (child_wid->type == NWID_SPACER) continue;
 
			if (!this->visible[((NWidgetCore*)child_wid)->index]) continue;
 

	
 
			child_wid->Draw(w);
 
		}
 
	}
 

	
 
	NWidgetCore *GetWidgetFromPos(int x, int y) override
 
	{
 
		if (!IsInsideBS(x, this->pos_x, this->current_x) || !IsInsideBS(y, this->pos_y, this->current_y)) return nullptr;
 

	
 
		for (NWidgetBase *child_wid = this->head; child_wid != nullptr; child_wid = child_wid->next) {
 
			if (child_wid->type == NWID_SPACER) continue;
 
			if (!this->visible[((NWidgetCore*)child_wid)->index]) continue;
 

	
 
			NWidgetCore *nwid = child_wid->GetWidgetFromPos(x, y);
 
			if (nwid != nullptr) return nwid;
 
		}
 
		return nullptr;
 
	}
 

	
0 comments (0 inline, 0 general)