aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/wndmgr/msgbox.cpp
diff options
context:
space:
mode:
authorJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
committerJef <jef@targetspot.com>2024-09-24 08:54:57 -0400
commit20d28e80a5c861a9d5f449ea911ab75b4f37ad0d (patch)
tree12f17f78986871dd2cfb0a56e5e93b545c1ae0d0 /Src/Wasabi/api/wndmgr/msgbox.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Wasabi/api/wndmgr/msgbox.cpp')
-rw-r--r--Src/Wasabi/api/wndmgr/msgbox.cpp251
1 files changed, 251 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wndmgr/msgbox.cpp b/Src/Wasabi/api/wndmgr/msgbox.cpp
new file mode 100644
index 00000000..4a32cf66
--- /dev/null
+++ b/Src/Wasabi/api/wndmgr/msgbox.cpp
@@ -0,0 +1,251 @@
+#include <precomp.h>
+#include "msgbox.h"
+#include <api/wndmgr/skinwnd.h>
+#include <api/wnd/wndclass/guiobjwnd.h>
+#include <api/script/scriptguid.h>
+#include <api/script/objects/c_script/c_container.h>
+#include <api/script/objects/c_script/c_text.h>
+#include <api/script/objects/c_script/c_button.h>
+
+_btnstruct msgboxbtns[] =
+ {
+ { L"<<", MSGBOX_PREVIOUS },
+ { L"OK", MSGBOX_OK },
+ { L"Yes", MSGBOX_YES },
+ { L"All", MSGBOX_ALL },
+ { L"No", MSGBOX_NO },
+ { L">>", MSGBOX_NEXT },
+ { L"Cancel", MSGBOX_CANCEL },
+ };
+
+MsgBox::MsgBox(const wchar_t *_text, const wchar_t *_title, int _flags, const wchar_t *notanymore)
+{
+ text = _text;
+ title = _title;
+ flags = _flags;
+#ifdef WIN32
+#ifdef _DEBUG
+ DebugStringW(L"msgbox: %s: %s", title, text.getValue());
+#endif
+#endif
+ notanymore_id = notanymore;
+ sw = NULL;
+ if (flags == 0) flags = MSGBOX_OK;
+}
+
+MsgBox::~MsgBox()
+{
+ foreach(buttons)
+ WASABI_API_SKIN->xui_delete(buttons.getfor());
+ endfor
+}
+
+int MsgBox::run()
+{
+ int _r = -1;
+
+#ifdef WASABI_COMPILE_CONFIG
+ if (!notanymore_id.isempty())
+ {
+ StringPrintfW txt(L"msgbox_defaultvalue_%s", notanymore_id);
+ if ((GetKeyState(VK_SHIFT) & 0x8000))
+ WASABI_API_CONFIG->setIntPublic(txt, -1);
+ _r = WASABI_API_CONFIG->getIntPublic(txt, -1);
+ }
+#endif
+
+ if (_r == -1)
+ {
+ sw = new SkinWnd(L"msgbox.custom.group", L"modal", FALSE, NULL, 1, 1);
+ if (!sw->getWindow()) return -1;
+ ifc_window *grp = sw->getWindow();
+ ifc_window *l = grp->getDesktopParent();
+
+ GuiObject *_p = sw->findObject(L"msgbox.custom.group");
+ //CUT: api_window *p = _p->guiobject_getRootWnd();
+
+ C_Container cont(sw->getContainer());
+ cont.setName(title);
+
+ createButtons();
+ int min_w = reposButtons();
+
+ GuiObject *go_txt = sw->findObject(L"msgbox.text");
+ if (go_txt != NULL)
+ {
+ GuiObject *to = go_txt->guiobject_findObject(L"wasabi.text");
+ GuiObject *gto = sw->findObject(L"text");
+ if (to != NULL && gto != NULL)
+ {
+ go_txt->guiobject_setXmlParam(L"text", text);
+ C_GuiObject t(*go_txt);
+ int _w = t.getAutoWidth();
+ int _h = t.getAutoHeight();
+
+ to->guiobject_setXmlParam(L"w", StringPrintfW(_w));
+ to->guiobject_setXmlParam(L"h", StringPrintfW(_h));
+ to->guiobject_setXmlParam(L"relatw", L"0");
+ to->guiobject_setXmlParam(L"relath", L"0");
+
+ int x, rx, w, rw;
+ int y, ry, h, rh;
+ int gtow, gtoh;
+
+ go_txt->guiobject_getGuiPosition(&x, &y, &w, &h, &rx, &ry, &rw, &rh);
+ if (rw == 1)
+ _w += -w;
+ else
+ _w += x * 2;
+ if (rh == 1)
+ _h += -h;
+ else
+ _h += y * 2;
+
+ gtow = _w;
+ gtoh = _h;
+
+ GuiObject *grpo = grp->getGuiObject();
+ ASSERT(grpo != NULL);
+ gto->guiobject_getGuiPosition(&x, &y, &w, &h, &rx, &ry, &rw, &rh);
+ if (rw == 1)
+ _w += -w;
+ else
+ _w += x * 2;
+ if (rh == 1)
+ _h += -h;
+ else
+ _h += y * 2;
+
+ gto->guiobject_setXmlParam(L"w", StringPrintfW(gtow));
+ gto->guiobject_setXmlParam(L"h", StringPrintfW(gtoh));
+
+ grpo->guiobject_setXmlParam(L"w", StringPrintfW(_w));
+ grpo->guiobject_setXmlParam(L"h", StringPrintfW(_h));
+ grpo->guiobject_setXmlParam(L"lockminmax", L"1");
+ grpo->guiobject_setXmlParam(L"propagatesize", L"1");
+ XmlObject *xl = static_cast<XmlObject *>(l->getInterface(xmlObjectGuid));
+ xl->setXmlParam(L"minimum_h", StringPrintfW(L"%d", _h));
+ xl->setXmlParam(L"minimum_w", StringPrintfW(L"%d", (_w < min_w) ? min_w : _w));
+ }
+ }
+
+ if (!notanymore_id.isempty())
+ {
+ GuiObject *o = WASABI_API_SKIN->xui_new(L"Wasabi:CheckBox"); // that'll be deleted automatically when our parent group destroys
+ if (o != NULL)
+ {
+ ifc_window *w = o->guiobject_getRootWnd();
+ C_GuiObject go(*o);
+ go.init(_p->guiobject_getScriptObject());
+ o->guiobject_setXmlParam(L"text", L"Do not show this message anymore");
+ o->guiobject_setXmlParam(L"y", L"-50");
+ o->guiobject_setXmlParam(L"relaty", L"1");
+ o->guiobject_setXmlParam(L"x", L"12");
+ o->guiobject_setXmlParam(L"relatx", L"0");
+ o->guiobject_setXmlParam(L"w", L"-24");
+ o->guiobject_setXmlParam(L"relatw", L"1");
+ min_w = MAX(w->getPreferences(SUGGESTED_W), min_w);
+ }
+ }
+
+ sw->notifyMinMaxChanged();
+ reposButtons();
+ _r = sw->runModal(1);
+ }
+
+#ifdef WASABI_COMPILE_CONFIG
+ if (!notanymore_id.isempty() && _r != -1 && sw != NULL)
+ {
+ GuiObject *o = sw->findObject(L"checkbox.toggle");
+ if (o != NULL)
+ {
+ C_Button b(*o);
+ if (b.getActivated())
+ {
+ StringPrintfW txt(L"msgbox_defaultvalue_%s", notanymore_id);
+ WASABI_API_CONFIG->setIntPublic(txt, _r);
+ }
+ }
+ }
+#endif
+
+ if (sw) sw->destroy(); sw = NULL;
+
+ return _r;
+}
+
+void MsgBox::addButton(const wchar_t *text, int retcode)
+{
+ GuiObject *o = WASABI_API_SKIN->xui_new(L"Wasabi:Button"); // that wil NOT be deleted automatically when our parent group destroys because we did not init with guiobject
+ if (o != NULL)
+ {
+ o->guiobject_setXmlParam(L"action", L"endmodal");
+ o->guiobject_setXmlParam(L"retcode", StringPrintfW(retcode));
+ o->guiobject_setXmlParam(L"text", text);
+ buttons.addItem(o);
+ }
+}
+
+void MsgBox::createButtons()
+{
+ GuiObject *_p = sw->findObject(L"msgbox.custom.group");
+ if (!_p) return ;
+
+ ASSERT(buttons.getNumItems() == 0);
+ buttons.deleteAll();
+
+ for (int i = 0;i < sizeof(msgboxbtns) / sizeof(_btnstruct);i++)
+ {
+ if (flags & msgboxbtns[i].id)
+ {
+ addButton(msgboxbtns[i].txt, msgboxbtns[i].id);
+ }
+ }
+
+ ifc_window *p = _p->guiobject_getRootWnd();
+
+ foreach(buttons)
+ ifc_window *wnd = buttons.getfor()->guiobject_getRootWnd();
+ if (wnd != NULL)
+ {
+ wnd->setStartHidden(1);
+ wnd->setParent(p);
+ wnd->init(p);
+ }
+ endfor;
+}
+
+int MsgBox::reposButtons()
+{
+ RECT r;
+ GuiObject *_p = sw->findObject(L"msgbox.custom.group");
+ ifc_window *p = _p->guiobject_getRootWnd();
+ p->getClientRect(&r);
+
+ int shift = 0;
+
+ //CUT: int _w = 0;
+ //CUT: int _h = 0;
+ for (int i = buttons.getNumItems() - 1;i >= 0;i--)
+ {
+ ifc_window *wnd = buttons.enumItem(i)->guiobject_getRootWnd();
+ if (wnd != NULL)
+ {
+ int _w = wnd->getPreferences(SUGGESTED_W);
+ int _h = wnd->getPreferences(SUGGESTED_H);
+ if (_w == AUTOWH) _w = -1;
+ int w = MAX(_w, 64);
+ wnd->resize(r.right - w - 16 - shift, r.bottom - 8 - _h, w, _h);
+ _w = MAX(w, _w);
+ _h = MAX(_h, _h);
+ shift += w + 4;
+ }
+ }
+
+ foreach(buttons)
+ ifc_window *wnd = buttons.getfor()->guiobject_getRootWnd();
+ if (wnd != NULL)
+ wnd->setVisible(1);
+ endfor;
+ return shift;
+}