# HG changeset patch # User frosch # Date 2013-05-26 19:27:44 # Node ID 68e5b14aeae7424dc5b63e727a6f4bee61a716cd # Parent 215a33b6727c3101c7155ca6831dc88c3c0b921a (svn r25292) -Feature: Save stickyness of windows when Ctrl+Clicking the sticky button. diff --git a/src/table/window_settings.ini b/src/table/window_settings.ini --- 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 --- a/src/window.cpp +++ b/src/window.cpp @@ -95,7 +95,8 @@ WindowDesc::WindowDesc(WindowPosition de 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; @@ -147,6 +148,19 @@ void WindowDesc::SaveToConfig() } /** + * 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. * @param widget Widget number of the widget clicked in. @@ -551,6 +565,7 @@ static void DispatchLeftClickEvent(Windo 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_ 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 --- a/src/window_gui.h +++ b/src/window_gui.h @@ -181,6 +181,8 @@ struct WindowDesc : ZeroedMemoryAllocato 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.