summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/table/window_settings.ini4
-rw-r--r--src/window.cpp18
-rw-r--r--src/window_gui.h4
3 files changed, 25 insertions, 1 deletions
diff --git a/src/table/window_settings.ini b/src/table/window_settings.ini
index 766ab5b5b..e57c1c4b0 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 a50890d42..86702842d 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<WindowDesc*, 16>();
*_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(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 918c3374a..45e0bad9f 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.