Changeset - r10674:cd3481e9e96f
[Not reviewed]
master
0 1 0
rubidium - 15 years ago 2009-01-10 19:22:05
rubidium@openttd.org
(svn r14978) -Codechange: simplify the control flow of the OnClick of the settings window
1 file changed with 80 insertions and 81 deletions:
0 comments (0 inline, 0 general)
src/settings_gui.cpp
Show inline comments
 
@@ -1269,103 +1269,102 @@ struct PatchesSelectionWindow : Window {
 

	
 
	virtual void OnClick(Point pt, int widget)
 
	{
 
		switch (widget) {
 
			case PATCHSEL_OPTIONSPANEL: {
 
				int y = pt.y - SETTINGTREE_TOP_OFFSET;  // Shift y coordinate
 
				if (y < 0) return;  // Clicked above first entry
 
		if (widget != PATCHSEL_OPTIONSPANEL) return;
 

	
 
				byte btn = this->vscroll.pos + y / SETTING_HEIGHT;  // Compute which setting is selected
 
				if (y % SETTING_HEIGHT > SETTING_HEIGHT - 2) return;  // Clicked too low at the setting
 
		int y = pt.y - SETTINGTREE_TOP_OFFSET;  // Shift y coordinate
 
		if (y < 0) return;  // Clicked above first entry
 

	
 
				uint cur_row = 0;
 
				PatchEntry *pe = _patches_main_page.FindEntry(btn, &cur_row);
 

	
 
				if (pe == NULL) return;  // Clicked below the last setting of the page
 
		byte btn = this->vscroll.pos + y / SETTING_HEIGHT;  // Compute which setting is selected
 
		if (y % SETTING_HEIGHT > SETTING_HEIGHT - 2) return;  // Clicked too low at the setting
 

	
 
				int x = pt.x - SETTINGTREE_LEFT_OFFSET - (pe->level + 1) * LEVEL_WIDTH;  // Shift x coordinate
 
				if (x < 0) return;  // Clicked left of the entry
 
		uint cur_row = 0;
 
		PatchEntry *pe = _patches_main_page.FindEntry(btn, &cur_row);
 

	
 
				if ((pe->flags & PEF_KIND_MASK) == PEF_SUBTREE_KIND) {
 
					pe->d.sub.folded = !pe->d.sub.folded; // Flip 'folded'-ness of the sub-page
 
		if (pe == NULL) return;  // Clicked below the last setting of the page
 

	
 
					SetVScrollCount(this, _patches_main_page.Length());
 
					this->SetDirty();
 
					return;
 
				}
 
		int x = pt.x - SETTINGTREE_LEFT_OFFSET - (pe->level + 1) * LEVEL_WIDTH;  // Shift x coordinate
 
		if (x < 0) return;  // Clicked left of the entry
 

	
 
				assert((pe->flags & PEF_KIND_MASK) == PEF_SETTING_KIND);
 
				const SettingDesc *sd = pe->d.entry.setting;
 
		if ((pe->flags & PEF_KIND_MASK) == PEF_SUBTREE_KIND) {
 
			pe->d.sub.folded = !pe->d.sub.folded; // Flip 'folded'-ness of the sub-page
 

	
 
				/* return if action is only active in network, or only settable by server */
 
				if (!(sd->save.conv & SLF_NETWORK_NO) && _networking && !_network_server) return;
 
				if ((sd->desc.flags & SGF_NETWORK_ONLY) && !_networking) return;
 
				if ((sd->desc.flags & SGF_NO_NETWORK) && _networking) return;
 
			SetVScrollCount(this, _patches_main_page.Length());
 
			this->SetDirty();
 
			return;
 
		}
 

	
 
				void *var = GetVariableAddress(patches_ptr, &sd->save);
 
				int32 value = (int32)ReadValue(var, sd->save.conv);
 

	
 
				/* clicked on the icon on the left side. Either scroller or bool on/off */
 
				if (x < 21) {
 
					const SettingDescBase *sdb = &sd->desc;
 
					int32 oldvalue = value;
 
		assert((pe->flags & PEF_KIND_MASK) == PEF_SETTING_KIND);
 
		const SettingDesc *sd = pe->d.entry.setting;
 

	
 
					switch (sdb->cmd) {
 
					case SDT_BOOLX: value ^= 1; break;
 
					case SDT_ONEOFMANY:
 
					case SDT_NUMX: {
 
						/* Add a dynamic step-size to the scroller. In a maximum of
 
							* 50-steps you should be able to get from min to max,
 
							* unless specified otherwise in the 'interval' variable
 
							* of the current patch. */
 
						uint32 step = (sdb->interval == 0) ? ((sdb->max - sdb->min) / 50) : sdb->interval;
 
						if (step == 0) step = 1;
 
		/* return if action is only active in network, or only settable by server */
 
		if (!(sd->save.conv & SLF_NETWORK_NO) && _networking && !_network_server) return;
 
		if ((sd->desc.flags & SGF_NETWORK_ONLY) && !_networking) return;
 
		if ((sd->desc.flags & SGF_NO_NETWORK) && _networking) return;
 

	
 
						/* don't allow too fast scrolling */
 
						if ((this->flags4 & WF_TIMEOUT_MASK) > WF_TIMEOUT_TRIGGER) {
 
							_left_button_clicked = false;
 
							return;
 
						}
 
		void *var = GetVariableAddress(patches_ptr, &sd->save);
 
		int32 value = (int32)ReadValue(var, sd->save.conv);
 

	
 
		/* clicked on the icon on the left side. Either scroller or bool on/off */
 
		if (x < 21) {
 
			const SettingDescBase *sdb = &sd->desc;
 
			int32 oldvalue = value;
 

	
 
						/* Increase or decrease the value and clamp it to extremes */
 
						if (x >= 10) {
 
							value += step;
 
							if (value > sdb->max) value = sdb->max;
 
							if (value < sdb->min) value = sdb->min; // skip between "disabled" and minimum
 
						} else {
 
							value -= step;
 
							if (value < sdb->min) value = (sdb->flags & SGF_0ISDISABLED) ? 0 : sdb->min;
 
						}
 
			switch (sdb->cmd) {
 
				case SDT_BOOLX: value ^= 1; break;
 
				case SDT_ONEOFMANY:
 
				case SDT_NUMX: {
 
					/* Add a dynamic step-size to the scroller. In a maximum of
 
					 * 50-steps you should be able to get from min to max,
 
					 * unless specified otherwise in the 'interval' variable
 
					 * of the current patch. */
 
					uint32 step = (sdb->interval == 0) ? ((sdb->max - sdb->min) / 50) : sdb->interval;
 
					if (step == 0) step = 1;
 

	
 
						/* Set up scroller timeout for numeric values */
 
						if (value != oldvalue && !(sd->desc.flags & SGF_MULTISTRING)) {
 
							if (this->clicked_entry != NULL) { // Release previous buttons if any
 
								this->clicked_entry->SetButtons(0);
 
							}
 
							this->clicked_entry = pe;
 
							this->clicked_entry->SetButtons((x >= 10) ? PEF_RIGHT_DEPRESSED : PEF_LEFT_DEPRESSED);
 
							this->flags4 |= WF_TIMEOUT_BEGIN;
 
							_left_button_clicked = false;
 
						}
 
					} break;
 
					default: NOT_REACHED();
 
					/* don't allow too fast scrolling */
 
					if ((this->flags4 & WF_TIMEOUT_MASK) > WF_TIMEOUT_TRIGGER) {
 
						_left_button_clicked = false;
 
						return;
 
					}
 

	
 
					if (value != oldvalue) {
 
						SetPatchValue(pe->d.entry.index, value);
 
						this->SetDirty();
 
					/* Increase or decrease the value and clamp it to extremes */
 
					if (x >= 10) {
 
						value += step;
 
						if (value > sdb->max) value = sdb->max;
 
						if (value < sdb->min) value = sdb->min; // skip between "disabled" and minimum
 
					} else {
 
						value -= step;
 
						if (value < sdb->min) value = (sdb->flags & SGF_0ISDISABLED) ? 0 : sdb->min;
 
					}
 

	
 
					/* Set up scroller timeout for numeric values */
 
					if (value != oldvalue && !(sd->desc.flags & SGF_MULTISTRING)) {
 
						if (this->clicked_entry != NULL) { // Release previous buttons if any
 
							this->clicked_entry->SetButtons(0);
 
						}
 
						this->clicked_entry = pe;
 
						this->clicked_entry->SetButtons((x >= 10) ? PEF_RIGHT_DEPRESSED : PEF_LEFT_DEPRESSED);
 
						this->flags4 |= WF_TIMEOUT_BEGIN;
 
						_left_button_clicked = false;
 
					}
 
				} else {
 
					/* only open editbox for types that its sensible for */
 
					if (sd->desc.cmd != SDT_BOOLX && !(sd->desc.flags & SGF_MULTISTRING)) {
 
						/* Show the correct currency-translated value */
 
						if (sd->desc.flags & SGF_CURRENCY) value *= _currency->rate;
 
				} break;
 

	
 
				default: NOT_REACHED();
 
			}
 

	
 
						this->valuewindow_entry = pe;
 
						SetDParam(0, value);
 
						ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_CONFIG_PATCHES_QUERY_CAPT, 10, 100, this, CS_NUMERAL, QSF_NONE);
 
					}
 
				}
 
			} break;
 
			if (value != oldvalue) {
 
				SetPatchValue(pe->d.entry.index, value);
 
				this->SetDirty();
 
			}
 
		} else {
 
			/* only open editbox for types that its sensible for */
 
			if (sd->desc.cmd != SDT_BOOLX && !(sd->desc.flags & SGF_MULTISTRING)) {
 
				/* Show the correct currency-translated value */
 
				if (sd->desc.flags & SGF_CURRENCY) value *= _currency->rate;
 

	
 
				this->valuewindow_entry = pe;
 
				SetDParam(0, value);
 
				ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_CONFIG_PATCHES_QUERY_CAPT, 10, 100, this, CS_NUMERAL, QSF_NONE);
 
			}
 
		}
 
	}
 

	
0 comments (0 inline, 0 general)