summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/newgrf_gui.cpp52
-rw-r--r--src/window_type.h8
2 files changed, 44 insertions, 16 deletions
diff --git a/src/newgrf_gui.cpp b/src/newgrf_gui.cpp
index 9ed21e5c5..ad37b3542 100644
--- a/src/newgrf_gui.cpp
+++ b/src/newgrf_gui.cpp
@@ -612,6 +612,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
bool execute; ///< On pressing 'apply changes' are grf changes applied immediately, or only list is updated.
int preset; ///< Selected preset or \c -1 if none selected.
int active_over; ///< Active GRF item over which another one is dragged, \c -1 if none.
+ bool modified; ///< The list of active NewGRFs has been modified since the last time they got saved.
Scrollbar *vscroll;
Scrollbar *vscroll2;
@@ -654,7 +655,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
this->avails.SetFilterFuncs(this->filter_funcs);
this->avails.ForceRebuild();
- this->OnInvalidateData(GOID_NEWGRF_LIST_EDITED);
+ this->OnInvalidateData(GOID_NEWGRF_CURRENT_LOADED);
}
~NewGRFWindow()
@@ -663,7 +664,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
DeleteWindowByClass(WC_TEXTFILE);
DeleteWindowByClass(WC_SAVE_PRESET);
- if (this->editable && !this->execute && !_exit_game) {
+ if (this->editable && this->modified && !this->execute && !_exit_game) {
CopyGRFConfigList(this->orig_list, this->actives, true);
ResetGRFConfig(false);
ReloadNewGRFData();
@@ -970,7 +971,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
}
this->vscroll->ScrollTowards(pos);
this->preset = -1;
- this->InvalidateData();
+ this->InvalidateData(GOID_NEWGRF_LIST_EDITED);
break;
}
@@ -989,7 +990,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
}
this->vscroll->ScrollTowards(pos);
this->preset = -1;
- this->InvalidateData();
+ this->InvalidateData(GOID_NEWGRF_LIST_EDITED);
break;
}
@@ -1095,6 +1096,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
CopyGRFConfigList(this->orig_list, this->actives, true);
ResetGRFConfig(false);
ReloadNewGRFData();
+ this->InvalidateData(GOID_NEWGRF_CHANGES_APPLIED);
}
this->DeleteChildWindows(WC_QUERY_STRING); // Remove the parameter query window
break;
@@ -1104,6 +1106,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
if (this->active_sel == nullptr || !this->show_params || this->active_sel->num_valid_params == 0) break;
OpenGRFParameterWindow(this->active_sel, this->editable);
+ this->InvalidateData(GOID_NEWGRF_CHANGES_MADE);
break;
}
@@ -1111,6 +1114,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
if (this->active_sel != nullptr && this->editable) {
this->active_sel->palette ^= GRFP_USE_MASK;
this->SetDirty();
+ this->InvalidateData(GOID_NEWGRF_CHANGES_MADE);
}
break;
@@ -1157,7 +1161,7 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
DeleteWindowByClass(WC_GRF_PARAMETERS);
DeleteWindowByClass(WC_TEXTFILE);
this->active_sel = nullptr;
- this->InvalidateData(GOID_NEWGRF_PRESET_LOADED);
+ this->InvalidateData(GOID_NEWGRF_CHANGES_MADE);
}
void OnQueryTextFinished(char *str) override
@@ -1179,6 +1183,20 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
}
/**
+ * Updates the scroll bars for the active and inactive NewGRF lists.
+ */
+ void UpdateScrollBars()
+ {
+ /* Update scrollbars */
+ int i = 0;
+ for (const GRFConfig *c = this->actives; c != nullptr; c = c->next, i++) {}
+
+ this->vscroll->SetCount(i + 1); // Reserve empty space for drag and drop handling.
+
+ if (this->avail_pos >= 0) this->vscroll2->ScrollTowards(this->avail_pos);
+ }
+
+ /**
* Some data on this window has become invalid.
* @param data Information about the changed data. @see GameOptionsInvalidationData
* @param gui_scope Whether the call is done from GUI scope. You may not do everything when not in GUI scope. See #InvalidateWindowData() for details.
@@ -1212,27 +1230,34 @@ struct NewGRFWindow : public Window, NewGRFScanCallback {
this->avails.ForceRebuild();
FALLTHROUGH;
+ case GOID_NEWGRF_CURRENT_LOADED:
+ this->modified = false;
+ UpdateScrollBars();
+ break;
+
case GOID_NEWGRF_LIST_EDITED:
this->preset = -1;
FALLTHROUGH;
- case GOID_NEWGRF_PRESET_LOADED: {
- /* Update scrollbars */
- int i = 0;
- for (const GRFConfig *c = this->actives; c != nullptr; c = c->next, i++) {}
+ case GOID_NEWGRF_CHANGES_MADE:
+ UpdateScrollBars();
- this->vscroll->SetCount(i + 1); // Reserve empty space for drag and drop handling.
+ /* Changes have been made to the list of active NewGRFs */
+ this->modified = true;
- if (this->avail_pos >= 0) this->vscroll2->ScrollTowards(this->avail_pos);
break;
- }
+
+ case GOID_NEWGRF_CHANGES_APPLIED:
+ /* No changes have been made to the list of active NewGRFs since the last time the changes got applied */
+ this->modified = false;
+ break;
}
this->BuildAvailables();
+ this->SetWidgetDisabledState(WID_NS_APPLY_CHANGES, !this->editable || !this->modified);
this->SetWidgetsDisabledState(!this->editable,
WID_NS_PRESET_LIST,
- WID_NS_APPLY_CHANGES,
WID_NS_TOGGLE_PALETTE,
WIDGET_LIST_END
);
@@ -1973,6 +1998,7 @@ static void NewGRFConfirmationCallback(Window *w, bool confirmed)
for (c = nw->actives; c != nullptr && i > 0; c = c->next, i--) {}
nw->active_sel = c;
nw->avails.ForceRebuild();
+ nw->modified = false;
w->InvalidateData();
diff --git a/src/window_type.h b/src/window_type.h
index 86dcc6fb3..e4b08e6e5 100644
--- a/src/window_type.h
+++ b/src/window_type.h
@@ -703,9 +703,11 @@ enum WindowClass {
/** Data value for #Window::OnInvalidateData() of windows with class #WC_GAME_OPTIONS. */
enum GameOptionsInvalidationData {
GOID_DEFAULT = 0,
- GOID_NEWGRF_RESCANNED, ///< NewGRFs were just rescanned.
- GOID_NEWGRF_LIST_EDITED, ///< List of active NewGRFs is being edited.
- GOID_NEWGRF_PRESET_LOADED, ///< A NewGRF preset was picked.
+ GOID_NEWGRF_RESCANNED, ///< NewGRFs were just rescanned.
+ GOID_NEWGRF_CURRENT_LOADED, ///< The current list of active NewGRF has been loaded.
+ GOID_NEWGRF_LIST_EDITED, ///< List of active NewGRFs is being edited.
+ GOID_NEWGRF_CHANGES_MADE, ///< Changes have been made to a given NewGRF either through the palette or its parameters.
+ GOID_NEWGRF_CHANGES_APPLIED, ///< The active NewGRF list changes have been applied.
};
struct Window;