diff --git a/src/table/window_settings.ini b/src/table/window_settings.ini index 766ab5b5b6..e57c1c4b00 100644 --- a/src/table/window_settings.ini +++ b/src/table/window_settings.ini @@ -32,6 +32,10 @@ cat = SC_ADVANCED +[SDT_BOOL] +var = pref_sticky +def = false + [SDT_END] }; diff --git a/src/window.cpp b/src/window.cpp index a50890d421..86702842d4 100644 --- a/src/window.cpp +++ b/src/window.cpp @@ -95,7 +95,8 @@ WindowDesc::WindowDesc(WindowPosition def_pos, const char *ini_key, int16 def_wi ini_key(ini_key), flags(flags), nwid_parts(nwid_parts), - nwid_length(nwid_length) + nwid_length(nwid_length), + pref_sticky(false) { if (_window_descs == NULL) _window_descs = new SmallVector(); *_window_descs->Append() = this; @@ -146,6 +147,19 @@ void WindowDesc::SaveToConfig() delete ini; } +/** + * Read default values from WindowDesc configuration an apply them to the window. + */ +void Window::ApplyDefaults() +{ + if (this->nested_root != NULL && this->nested_root->GetWidgetOfType(WWT_STICKYBOX) != NULL) { + if (this->window_desc->pref_sticky) this->flags |= WF_STICKY; + } else { + /* There is no stickybox; clear the preference in case someone tried to be funny */ + this->window_desc->pref_sticky = false; + } +} + /** * Compute the row of a widget that a user clicked in. * @param clickpos Vertical position of the mouse click. @@ -551,6 +565,7 @@ static void DispatchLeftClickEvent(Window *w, int x, int y, int click_count) case WWT_STICKYBOX: w->flags ^= WF_STICKY; nw->SetDirty(w); + if (_ctrl_pressed) w->window_desc->pref_sticky = w->flags & WF_STICKY; return; default: @@ -1574,6 +1589,7 @@ void Window::CreateNestedTree(bool fill_nested) void Window::FinishInitNested(WindowNumber window_number) { this->InitializeData(window_number); + this->ApplyDefaults(); Point pt = this->OnInitialPosition(this->nested_root->smallest_x, this->nested_root->smallest_y, window_number); this->InitializePositionSize(pt.x, pt.y, this->nested_root->smallest_x, this->nested_root->smallest_y); this->FindWindowPlacementAndResize(this->window_desc->default_width, this->window_desc->default_height); diff --git a/src/window_gui.h b/src/window_gui.h index 918c3374a2..45e0bad9fa 100644 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -181,6 +181,8 @@ struct WindowDesc : ZeroedMemoryAllocator { const NWidgetPart *nwid_parts; ///< Nested widget parts describing the window. int16 nwid_length; ///< Length of the #nwid_parts array. + bool pref_sticky; ///< Preferred stickyness. + static void LoadFromConfig(); static void SaveToConfig(); }; @@ -508,6 +510,8 @@ public: */ virtual void OnInit() { } + virtual void ApplyDefaults(); + /** * Compute the initial position of the window. * @param sm_width Smallest width of the window.