diff foosdk/sdk/libPPUI/CDialogResizeHelper.h @ 1:20d02a178406 default tip

*: check in everything else yay
author Paper <paper@tflc.us>
date Mon, 05 Jan 2026 02:15:46 -0500
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/foosdk/sdk/libPPUI/CDialogResizeHelper.h	Mon Jan 05 02:15:46 2026 -0500
@@ -0,0 +1,79 @@
+#pragma once
+
+#include "CDialogResizeHelperCompat.h"
+#include <vector>
+
+// ==========================================================
+// CDialogResizeHelper
+// ==========================================================
+// Usage:
+// Put CDialogResizeHelper member in your dialog class
+// Initialize with controls sizing info table, array of CDialogResizeHelper::Param
+// Put CHAIN_MSG_MAP_MEMBER(m_resizer) before your dialog message handlers
+// CDialogResizeHelper will do its own message handling without marking messages as handled, that is, your handlers of the same messages will be allowed to run.
+// CRect minMaxRange specifies allowed size min (left&top) and max (right&bottom) values, in DLU not pixels.
+// ==========================================================
+
+class CDialogResizeHelper : public CMessageMap {
+public:
+
+	typedef CDialogResizeHelperCompat::param ParamOld;
+
+	struct Param {
+		uint32_t id;
+		float snapLeft, snapTop, snapRight, snapBottom;
+	};
+private:
+	void AddSizeGrip();
+public:
+	inline void set_min_size(unsigned x, unsigned y) { min_x = x; min_y = y; }
+	inline void set_max_size(unsigned x, unsigned y) { max_x = x; max_y = y; }
+
+	bool m_autoSizeGrip = true;
+
+	BEGIN_MSG_MAP_EX(CDialogResizeHelper)
+		if (uMsg == WM_INITDIALOG) OnInitDialog(hWnd);
+		MSG_WM_SIZE(OnSize)
+		MSG_WM_DESTROY(OnDestroy)
+		MSG_WM_GETMINMAXINFO(OnGetMinMaxInfo)
+	END_MSG_MAP()
+
+	template<typename TParam, size_t paramCount> CDialogResizeHelper(const TParam(&src)[paramCount], CRect const& minMaxRange = CRect(0, 0, 0, 0)) {
+		InitTable(src, paramCount);
+		InitMinMax(minMaxRange);
+	}
+
+	void InitTable(const Param* table, size_t tableSize);
+	void InitTable(const ParamOld * table, size_t tableSize);
+	void InitMinMax(const CRect & range);
+
+	bool EvalRect(UINT id, CRect & out) const;
+
+	//! initData.id may be null, if so specify a non null window handle.
+	void AddControl( Param const & initData, CWindow wnd = NULL );
+	bool RemoveControl( CWindow wnd );
+	bool HaveControl(CWindow wnd) const;
+private:
+	struct runtime_t {
+		HWND userHWND = 0;
+		CRect origRect;
+		CSize origWindowSize;
+		Param initData = {};
+	};
+
+	CSize CurrentSize() const;
+	CWindow ResolveWnd( runtime_t const & rt ) const;
+
+	CRect _EvalRect(runtime_t const & rt, CSize wndSize) const;
+	void OnGetMinMaxInfo(LPMINMAXINFO lpMMI) const;
+	void OnSize(UINT nType, CSize size);
+	void OnInitDialog(CWindow thisWnd);
+	void OnDestroy();
+
+
+	std::vector<runtime_t> m_runtime;
+	std::vector<Param> m_initData;
+
+	CWindow m_thisWnd, m_sizeGrip;
+	unsigned min_x, min_y, max_x, max_y;
+};
\ No newline at end of file