aboutsummaryrefslogtreecommitdiff
path: root/Src/Wasabi/api/wnd/wndclass/status.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/wnd/wndclass/status.cpp
parent537bcbc86291b32fc04ae4133ce4d7cac8ebe9a7 (diff)
downloadwinamp-20d28e80a5c861a9d5f449ea911ab75b4f37ad0d.tar.gz
Initial community commit
Diffstat (limited to 'Src/Wasabi/api/wnd/wndclass/status.cpp')
-rw-r--r--Src/Wasabi/api/wnd/wndclass/status.cpp242
1 files changed, 242 insertions, 0 deletions
diff --git a/Src/Wasabi/api/wnd/wndclass/status.cpp b/Src/Wasabi/api/wnd/wndclass/status.cpp
new file mode 100644
index 00000000..9ef5af9a
--- /dev/null
+++ b/Src/Wasabi/api/wnd/wndclass/status.cpp
@@ -0,0 +1,242 @@
+#include <precomp.h>
+#include "status.h"
+
+#include <tataki/color/skinclr.h>
+#include <tataki/canvas/canvas.h>
+
+#include <api/wnd/wndclass/buttbar.h>
+#include <api/wnd/wndclass/buttwnd.h>
+#include <api/wndmgr/appcmds.h>
+#include <bfc/parse/paramparser.h>
+
+#include <api/script/objects/c_script/c_text.h>
+
+#define STATUS_TIMER_DECAY 1
+
+#define COMPLETED_WIDTH 96
+
+static SkinColor textcolor(L"wasabi.statusbar.text");
+
+class CmdButton : public ButtonWnd
+{
+public:
+ CmdButton(const wchar_t *name, AppCmds *_cmd, int _id) : ButtonWnd(name), cmd(_cmd), id(_id) {}
+
+ virtual void onLeftPush(int x, int y) {
+ cmd->appcmds_onCommand(id, &windowRect(), AppCmds::LEFT_CLICK);
+ }
+
+ virtual void onRightPush(int x, int y) {
+ cmd->appcmds_onCommand(id, &windowRect(), AppCmds::RIGHT_CLICK);
+ }
+
+ virtual int wantAutoContextMenu() { return 0; }
+
+ AppCmds *cmd;
+ int id;
+};
+
+StatusBar::StatusBar() {
+ overtimer = 0;
+ max = 0;
+ completed = 0;
+ progress_width = 0;
+ bg.setContent(L"wasabi.statusbar");
+ bbleft = bbright = NULL;
+}
+
+StatusBar::~StatusBar()
+{
+ killTimer(STATUS_TIMER_DECAY);
+ delete bbleft;
+ delete bbright;
+}
+
+int StatusBar::onInit() {
+ STATUSBAR_PARENT::onInit();
+
+ bg.init(this);
+
+ #ifdef WASABI_COMPILE_WNDMGR
+ getGuiObject()->guiobject_registerStatusCB(this); // watched
+ #endif
+
+ regenerate();
+
+ return 1;
+}
+
+void StatusBar::timerCallback(int id) {
+ switch (id) {
+ case STATUS_TIMER_DECAY: {
+ killTimer(STATUS_TIMER_DECAY);
+ onSetStatusText(status_text, FALSE); // revert to main text
+ }
+ break;
+ default:
+ STATUSBAR_PARENT::timerCallback(id);
+ break;
+ }
+}
+
+void StatusBar::pushCompleted(int _max) {
+ max = MAX(_max, 0);
+ completed = 0;
+
+ GuiObject *outer = bg.findObject(L"wasabi.statusbar.progress.outline");
+ outer->guiobject_setXmlParam(L"visible", L"0");
+ ASSERT(outer != NULL);
+ ifc_window *outerw = outer->guiobject_getRootWnd();
+ RECT cr;
+ outerw->getClientRect(&cr);
+ progress_width = cr.right - cr.left;
+
+ outerw->setVisible(TRUE);//CUT
+ outer->guiobject_setTargetA(255);
+ outer->guiobject_setTargetSpeed(0.1f);
+ outer->guiobject_gotoTarget();
+
+ GuiObject *inner = bg.findObject(L"wasabi.statusbar.progress.inside");
+ inner->guiobject_setTargetA(255);
+ inner->guiobject_setTargetSpeed(1.0f);
+ inner->guiobject_gotoTarget();
+ inner->guiobject_setXmlParam(L"visible", L"0");
+
+ incCompleted(0);
+}
+
+void StatusBar::incCompleted(int add) {
+ setCompleted(completed + add);
+}
+
+void StatusBar::setCompleted(int _completed) {
+ completed = _completed;
+ GuiObject *inner = bg.findObject(L"wasabi.statusbar.progress.inside");
+ ASSERT(inner != NULL);
+ if (!inner->guiobject_getRootWnd()->isVisible(1)) {
+ inner->guiobject_setXmlParam(L"visible", L"1");
+ inner->guiobject_setTargetA(255);
+ inner->guiobject_setTargetSpeed(0.75);
+ inner->guiobject_gotoTarget();
+ }
+ int pos = (int)(((float)completed / (float)max)*(float)progress_width);
+ inner->guiobject_setXmlParam(L"w", StringPrintfW(L"%d", pos));
+}
+
+void StatusBar::popCompleted() {
+ completed = 0;
+ max = 0;
+ GuiObject *inner = bg.findObject(L"wasabi.statusbar.progress.inside");
+ inner->guiobject_setXmlParam(L"w", L"0");
+ inner->guiobject_setTargetA(0);
+ inner->guiobject_setTargetSpeed(0.75);
+ inner->guiobject_gotoTarget();
+
+//CUT later
+ inner->guiobject_setXmlParam(L"visible", L"0");
+ GuiObject *outer = bg.findObject(L"wasabi.statusbar.progress.outline");
+ outer->guiobject_setXmlParam(L"visible", L"0");
+}
+
+int StatusBar::onResize() {
+ STATUSBAR_PARENT::onResize();
+
+ RECT cr = clientRect();
+
+ bbleft->resize(cr.left, cr.top, bbleft->getWidth(), cr.bottom - cr.top);
+
+ bbright->resize(cr.right-bbright->getWidth(), cr.top, bbright->getWidth(), cr.bottom - cr.top);
+
+ cr.left += bbleft->getWidth();
+ cr.right -= bbright->getWidth();
+
+ bg.resizeToRect(&cr); // put bg group in place
+
+ invalidate();
+ return 1;
+}
+
+void StatusBar::onSetStatusText(const wchar_t *text, int overlay)
+{
+ killTimer(STATUS_TIMER_DECAY);
+ if (!overlay)
+ status_text = text;
+ else setTimer(STATUS_TIMER_DECAY, 4000);
+ ScriptObject *tx = bg.findScriptObject(L"wasabi.statusbar.text");
+ if (tx == NULL) return;
+ C_Text(tx).setText(text ? text : L"");
+}
+
+void StatusBar::onAddAppCmds(AppCmds *commands) {
+ if (appcmds.haveItem(commands)) appcmds.removeItem(commands);
+ appcmds.addItem(commands);
+ regenerate();
+}
+
+void StatusBar::onRemoveAppCmds(AppCmds *commands) {
+ if (appcmds.haveItem(commands)) {
+ appcmds.removeItem(commands);
+ regenerate();
+ }
+}
+
+void StatusBar::regenerate() {
+ if (!isInited()) return;
+
+ delete bbleft; bbleft = new ButtBar;
+ delete bbright; bbright = new ButtBar;
+ bbleft->init(this);
+ bbright->init(this);
+
+ ParamParser exclude(exclude_list, L";");
+ ParamParser showonly(include_only, L";");
+
+ foreach(appcmds)
+ int n = appcmds.getfor()->appcmds_getNumCmds();
+ for (int i = 0; i < n; i++) {
+ int side, id;
+ const wchar_t *name = appcmds.getfor()->appcmds_enumCmd(i, &side, &id);
+ if (name == NULL) break;
+ if (exclude.hasString(name)) continue; // exclusion list
+ if (showonly.getNumItems()) {
+ if (!showonly.hasString(name)) continue; // include-only list
+ }
+ CmdButton *cb = new CmdButton(name, appcmds.getfor(), id);
+// cb->setXmlParam("wantfocus", "1");
+ if (side == AppCmds::SIDE_LEFT) bbleft->addChild(cb);
+ else bbright->addChild(cb);
+ }
+ endfor
+ if (isPostOnInit())
+ onResize();
+}
+
+void StatusBar::fakeButtonPush(const wchar_t *name) {
+ if (!fakeButtonPush(bbleft, name))
+ fakeButtonPush(bbright, name);
+}
+
+int StatusBar::fakeButtonPush(ButtBar *bb, const wchar_t *name)
+{
+ for (int i = 0; i < bb->getNumChildren(); i++) {
+ ButtonWnd *cmdb = bb->enumChild(i);
+ if (!WCSICMP(cmdb->getName(), name)) {
+ int x, y;
+ Wasabi::Std::getMousePos(&x, &y);
+ cmdb->screenToClient(&x, &y);
+ cmdb->onLeftPush(x, y);
+ return 1;
+ }
+ }
+ return 0;
+}
+
+void StatusBar::setExclude(const wchar_t *val) {
+ exclude_list = val;
+ regenerate();
+}
+
+void StatusBar::setIncludeOnly(const wchar_t *val) {
+ include_only = val;
+ regenerate();
+}