mirror of
https://github.com/OpenTTD/OpenTTD.git
synced 2025-02-04 13:23:46 +00:00
(svn r14966) -Codechange: simplify and generalise finding patch entries (Alberth)
This commit is contained in:
parent
eec72275f1
commit
d6d8411a5f
@ -635,6 +635,7 @@ struct PatchEntry {
|
|||||||
void SetButtons(byte new_val);
|
void SetButtons(byte new_val);
|
||||||
|
|
||||||
uint Length() const;
|
uint Length() const;
|
||||||
|
PatchEntry *FindEntry(uint row, uint *cur_row);
|
||||||
};
|
};
|
||||||
|
|
||||||
/** Data structure describing one page of patches in the patch settings window. */
|
/** Data structure describing one page of patches in the patch settings window. */
|
||||||
@ -645,6 +646,7 @@ struct PatchPage {
|
|||||||
void Init(byte level = 0);
|
void Init(byte level = 0);
|
||||||
|
|
||||||
uint Length() const;
|
uint Length() const;
|
||||||
|
PatchEntry *FindEntry(uint row, uint *cur_row) const;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -713,7 +715,7 @@ void PatchEntry::SetButtons(byte new_val)
|
|||||||
/** Return numbers of rows needed to display the entry */
|
/** Return numbers of rows needed to display the entry */
|
||||||
uint PatchEntry::Length() const
|
uint PatchEntry::Length() const
|
||||||
{
|
{
|
||||||
switch(this->flags & PEF_KIND_MASK) {
|
switch (this->flags & PEF_KIND_MASK) {
|
||||||
case PEF_SETTING_KIND:
|
case PEF_SETTING_KIND:
|
||||||
return 1;
|
return 1;
|
||||||
case PEF_SUBTREE_KIND:
|
case PEF_SUBTREE_KIND:
|
||||||
@ -724,6 +726,33 @@ uint PatchEntry::Length() const
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find patch entry at row \a row_num
|
||||||
|
* @param row_num Index of entry to return
|
||||||
|
* @param cur_row Current row number
|
||||||
|
* @return The requested patch entry or \c NULL if it not found
|
||||||
|
*/
|
||||||
|
PatchEntry *PatchEntry::FindEntry(uint row_num, uint *cur_row)
|
||||||
|
{
|
||||||
|
if (row_num == *cur_row) return this;
|
||||||
|
|
||||||
|
switch (this->flags & PEF_KIND_MASK) {
|
||||||
|
case PEF_SETTING_KIND:
|
||||||
|
(*cur_row)++;
|
||||||
|
break;
|
||||||
|
case PEF_SUBTREE_KIND:
|
||||||
|
(*cur_row)++; // add one for row containing the title
|
||||||
|
if (this->d.sub.folded) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* sub-page is visible => search it too */
|
||||||
|
return this->d.sub.page->FindEntry(row_num, cur_row);
|
||||||
|
default: NOT_REACHED();
|
||||||
|
}
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* == PatchPage methods == */
|
/* == PatchPage methods == */
|
||||||
|
|
||||||
@ -748,6 +777,25 @@ uint PatchPage::Length() const
|
|||||||
return length;
|
return length;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Find the patch entry at row number \a row_num
|
||||||
|
* @param row_num Index of entry to return
|
||||||
|
* @param cur_row Variable used for keeping track of the current row number. Should point to memory initialized to \c 0 when first called.
|
||||||
|
* @return The requested patch entry or \c NULL if it does not exist
|
||||||
|
*/
|
||||||
|
PatchEntry *PatchPage::FindEntry(uint row_num, uint *cur_row) const
|
||||||
|
{
|
||||||
|
PatchEntry *pe = NULL;
|
||||||
|
|
||||||
|
for (uint field = 0; field < this->num; field++) {
|
||||||
|
pe = this->entries[field].FindEntry(row_num, cur_row);
|
||||||
|
if (pe != NULL) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return pe;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
static PatchEntry _patches_ui[] = {
|
static PatchEntry _patches_ui[] = {
|
||||||
PatchEntry("gui.vehicle_speed"),
|
PatchEntry("gui.vehicle_speed"),
|
||||||
@ -1026,11 +1074,13 @@ struct PatchesSelectionWindow : Window {
|
|||||||
if (y % SETTING_HEIGHT > SETTING_HEIGHT - 2) return; // Clicked too low at the setting
|
if (y % SETTING_HEIGHT > SETTING_HEIGHT - 2) return; // Clicked too low at the setting
|
||||||
|
|
||||||
const PatchPage *page = &_patches_page[this->page];
|
const PatchPage *page = &_patches_page[this->page];
|
||||||
|
uint cur_row = 0;
|
||||||
|
PatchEntry *pe = page->FindEntry(btn, &cur_row);
|
||||||
|
|
||||||
if (btn >= page->Length()) return; // Clicked below the last setting of the page
|
if (pe == NULL) return; // Clicked below the last setting of the page
|
||||||
|
|
||||||
assert((page->entries[btn].flags & PEF_KIND_MASK) == PEF_SETTING_KIND);
|
assert((pe->flags & PEF_KIND_MASK) == PEF_SETTING_KIND);
|
||||||
const SettingDesc *sd = page->entries[btn].d.entry.setting;
|
const SettingDesc *sd = pe->d.entry.setting;
|
||||||
|
|
||||||
/* return if action is only active in network, or only settable by server */
|
/* 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->save.conv & SLF_NETWORK_NO) && _networking && !_network_server) return;
|
||||||
@ -1077,7 +1127,7 @@ struct PatchesSelectionWindow : Window {
|
|||||||
if (this->clicked_entry != NULL) { // Release previous buttons if any
|
if (this->clicked_entry != NULL) { // Release previous buttons if any
|
||||||
this->clicked_entry->SetButtons(0);
|
this->clicked_entry->SetButtons(0);
|
||||||
}
|
}
|
||||||
this->clicked_entry = &page->entries[btn];
|
this->clicked_entry = pe;
|
||||||
this->clicked_entry->SetButtons((x >= 10) ? PEF_RIGHT_DEPRESSED : PEF_LEFT_DEPRESSED);
|
this->clicked_entry->SetButtons((x >= 10) ? PEF_RIGHT_DEPRESSED : PEF_LEFT_DEPRESSED);
|
||||||
this->flags4 |= WF_TIMEOUT_BEGIN;
|
this->flags4 |= WF_TIMEOUT_BEGIN;
|
||||||
_left_button_clicked = false;
|
_left_button_clicked = false;
|
||||||
@ -1087,7 +1137,7 @@ struct PatchesSelectionWindow : Window {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (value != oldvalue) {
|
if (value != oldvalue) {
|
||||||
SetPatchValue(page->entries[btn].d.entry.index, value);
|
SetPatchValue(pe->d.entry.index, value);
|
||||||
this->SetDirty();
|
this->SetDirty();
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -1096,7 +1146,7 @@ struct PatchesSelectionWindow : Window {
|
|||||||
/* Show the correct currency-translated value */
|
/* Show the correct currency-translated value */
|
||||||
if (sd->desc.flags & SGF_CURRENCY) value *= _currency->rate;
|
if (sd->desc.flags & SGF_CURRENCY) value *= _currency->rate;
|
||||||
|
|
||||||
this->valuewindow_entry = &page->entries[btn];
|
this->valuewindow_entry = pe;
|
||||||
SetDParam(0, value);
|
SetDParam(0, value);
|
||||||
ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_CONFIG_PATCHES_QUERY_CAPT, 10, 100, this, CS_NUMERAL, QSF_NONE);
|
ShowQueryString(STR_CONFIG_PATCHES_INT32, STR_CONFIG_PATCHES_QUERY_CAPT, 10, 100, this, CS_NUMERAL, QSF_NONE);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user