annotate foosdk/sdk/foobar2000/helpers/BumpableElem.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
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
1 #pragma once
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
2
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
3 #include <libPPUI/CFlashWindow.h>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
4 #include "atl-misc.h"
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
5
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
6 #include <utility>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
7
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
8 template<typename TClass>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
9 class ImplementBumpableElem : public TClass {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
10 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
11 typedef ImplementBumpableElem<TClass> TSelf;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
12 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
13 template<typename ... arg_t> ImplementBumpableElem( arg_t && ... arg ) : TClass(std::forward<arg_t>(arg) ... ) {_init(); }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
14
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
15 BEGIN_MSG_MAP_EX(ImplementBumpableElem)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
16 MSG_WM_DESTROY(OnDestroy)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
17 CHAIN_MSG_MAP(__super)
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
18 END_MSG_MAP_HOOK()
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
19
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
20 void notify(const GUID & p_what, t_size p_param1, const void * p_param2, t_size p_param2size) override {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
21 if (p_what == ui_element_notify_visibility_changed && p_param1 == 0 && m_flash.m_hWnd != NULL) m_flash.Deactivate();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
22 __super::notify(p_what, p_param1, p_param2, p_param2size);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
23 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
24
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
25 static bool Bump() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
26 for (auto& walk : instances) {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
27 if (walk->_bump()) return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
28 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
29 return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
30 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
31 ~ImplementBumpableElem() throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
32 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
33 instances -= this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
34 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
35 private:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
36 void OnDestroy() throw() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
37 m_selfDestruct = true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
38 m_flash.CleanUp();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
39 SetMsgHandled(FALSE);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
40 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
41 bool _bump() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
42 if (m_selfDestruct || this->m_hWnd == NULL) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
43 //PROBLEM: This assumes we're implementing service_base methods at this point. Explodes if called during constructors/destructors.
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
44 if (!this->m_callback->request_activation(this)) return false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
45 m_flash.Activate(*this);
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
46 this->set_default_focus();
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
47 return true;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
48 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
49 void _init() {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
50 PFC_ASSERT(core_api::is_main_thread());
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
51 instances += this;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
52 }
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
53 static pfc::avltree_t<TSelf*> instances;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
54 bool m_selfDestruct = false;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
55 CFlashWindow m_flash;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
56 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
57
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
58 template<typename TClass>
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
59 pfc::avltree_t<ImplementBumpableElem<TClass> *> ImplementBumpableElem<TClass>::instances;
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
60
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
61
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
62 template<typename TImpl, typename TInterface = ui_element_v2> class ui_element_impl_withpopup : public ui_element_impl<ImplementBumpableElem<TImpl>, TInterface> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
63 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
64 t_uint32 get_flags() {return ui_element_v2::KFlagHavePopupCommand | ui_element_v2::KFlagSupportsBump;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
65 bool bump() {return ImplementBumpableElem<TImpl>::Bump();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
66 };
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
67
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
68 template<typename TImpl, typename TInterface = ui_element_v2> class ui_element_impl_visualisation : public ui_element_impl<ImplementBumpableElem<TImpl>, TInterface> {
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
69 public:
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
70 t_uint32 get_flags() {return ui_element_v2::KFlagsVisualisation | ui_element_v2::KFlagSupportsBump;}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
71 bool bump() {return ImplementBumpableElem<TImpl>::Bump();}
20d02a178406 *: check in everything else
Paper <paper@tflc.us>
parents:
diff changeset
72 };