From 126d77c5d5dcd1791b3ad8070ba67df9f2909457 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Axel=20D=C3=B6rfler?= Date: Thu, 9 Apr 2009 21:21:42 +0000 Subject: [PATCH] * Changed ContinuousMessageFilter to register for parameter value changes, and change its slider value when such a message arrives. * Currently, this will only work if such a view already received a message; added a TODO about how it should be done, but since those would require some more changes, I don't want to do that as long as Sean Healy is working on that file. git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@30083 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/media/DefaultMediaTheme.cpp | 151 ++++++++++++++++++--------- 1 file changed, 100 insertions(+), 51 deletions(-) diff --git a/src/kits/media/DefaultMediaTheme.cpp b/src/kits/media/DefaultMediaTheme.cpp index c1019eab92..6abac46e8a 100644 --- a/src/kits/media/DefaultMediaTheme.cpp +++ b/src/kits/media/DefaultMediaTheme.cpp @@ -1,28 +1,29 @@ /* - * Copyright 2003-2007, Axel Dörfler, axeld@pinc-software.de. All rights reserved. + * Copyright 2003-2009, Axel Dörfler, axeld@pinc-software.de. * Distributed under the terms of the MIT License. */ #include "DefaultMediaTheme.h" -#include "debug.h" -#include - -#include -#include -#include -#include -#include -#include -#include #include +#include +#include #include -#include +#include #include #include +#include +#include +#include +#include +#include +#include +#include #include +#include "debug.h" + using namespace BPrivate; @@ -121,7 +122,11 @@ class ContinuousMessageFilter : public MessageFilter { virtual filter_result Filter(BMessage *message, BHandler **target); private: + void _UpdateControl(); + + BControl *fControl; BContinuousParameter &fParameter; + bool fRegistered; }; class DiscreteMessageFilter : public MessageFilter { @@ -588,33 +593,22 @@ MessageFilter::FilterFor(BView *view, BParameter ¶meter) ContinuousMessageFilter::ContinuousMessageFilter(BControl *control, BContinuousParameter ¶meter) : MessageFilter(), - fParameter(parameter) + fControl(control), + fParameter(parameter), + fRegistered(false) { // initialize view for us control->SetMessage(new BMessage(kMsgParameterChanged)); - // set initial value - // ToDo: response support! - - float value[fParameter.CountChannels()]; - size_t size = sizeof(value); - if (parameter.GetValue((void *)&value, &size, NULL) < B_OK) { - ERROR("ContinuousMessageFilter: Could not get value for continuous " - "parameter %p (name '%s', node %d)\n", ¶meter, - parameter.Name(), (int)(parameter.Web()->Node().node)); - return; - } - - if (BSlider *slider = dynamic_cast(control)) { - slider->SetValue((int32) (1000 * value[0])); + if (BSlider *slider = dynamic_cast(fControl)) slider->SetModificationMessage(new BMessage(kMsgParameterChanged)); - } else if (BChannelSlider *slider = dynamic_cast(control)) { - for (int32 i = 0; i < fParameter.CountChannels(); i++) - slider->SetValueFor(i, (int32) (1000 * value[i])); - + else if (BChannelSlider *slider = dynamic_cast(fControl)) slider->SetModificationMessage(new BMessage(kMsgParameterChanged)); - } else + else ERROR("ContinuousMessageFilter: unknown continuous parameter view\n"); + + // set initial value + _UpdateControl(); } @@ -626,32 +620,87 @@ ContinuousMessageFilter::~ContinuousMessageFilter() filter_result ContinuousMessageFilter::Filter(BMessage *message, BHandler **target) { - BControl *control; - - if (message->what != kMsgParameterChanged - || (control = dynamic_cast(*target)) == NULL) + if (*target != fControl) return B_DISPATCH_MESSAGE; - // update view - // ToDo: support for response! + // TODO: remove this work-around! We can solve this by subclassing the + // slider classes, and start watching in their AttachedToWindow() method + if (!fRegistered) { + if (BMediaRoster* roster = BMediaRoster::CurrentRoster()) { + roster->StartWatching(fControl, fParameter.Web()->Node(), + B_MEDIA_NEW_PARAMETER_VALUE); + } + fRegistered = true; + } + + if (message->what == kMsgParameterChanged) { + // update parameter from control + // TODO: support for response! + + float value[fParameter.CountChannels()]; + + if (BSlider *slider = dynamic_cast(fControl)) { + value[0] = (float)(slider->Value() / 1000.0); + } else if (BChannelSlider *slider + = dynamic_cast(fControl)) { + for (int32 i = 0; i < fParameter.CountChannels(); i++) + value[i] = (float)(slider->ValueFor(i) / 1000.0); + } + + TRACE("ContinuousMessageFilter::Filter: update view %s, %ld " + "channels\n", control->Name(), fParameter.CountChannels()); + + if (fParameter.SetValue((void *)value, sizeof(value), + system_time()) < B_OK) { + ERROR("ContinuousMessageFilter::Filter: Could not set parameter " + "value for %p\n", &fParameter); + return B_DISPATCH_MESSAGE; + } + return B_SKIP_MESSAGE; + } + if (message->what == B_MEDIA_NEW_PARAMETER_VALUE) { + // update view from parameter -- if the message concerns us + const media_node* node; + int32 parameterID; + ssize_t size; + if (message->FindInt32("parameter", ¶meterID) != B_OK + || fParameter.ID() != parameterID + || message->FindData("node", B_RAW_TYPE, (const void**)&node, + &size) != B_OK + || fParameter.Web()->Node() != *node) + return B_DISPATCH_MESSAGE; + + _UpdateControl(); + return B_SKIP_MESSAGE; + } + + return B_DISPATCH_MESSAGE; +} + + +void +ContinuousMessageFilter::_UpdateControl() +{ + // TODO: response support! float value[fParameter.CountChannels()]; - - if (BSlider *slider = dynamic_cast(control)) { - value[0] = (float)(slider->Value() / 1000.0); - } else if (BChannelSlider *slider = dynamic_cast(control)) { - for (int32 i = 0; i < fParameter.CountChannels(); i++) - value[i] = (float)(slider->ValueFor(i) / 1000.0); + size_t size = sizeof(value); + if (fParameter.GetValue((void *)&value, &size, NULL) < B_OK) { + ERROR("ContinuousMessageFilter: Could not get value for continuous " + "parameter %p (name '%s', node %d)\n", &fParameter, + fParameter.Name(), (int)fParameter.Web()->Node().node); + return; } - TRACE("ContinuousMessageFilter::Filter: update view %s, %ld channels\n", control->Name(), fParameter.CountChannels()); - - if (fParameter.SetValue((void *)value, sizeof(value), system_time()) < B_OK) { - ERROR("ContinuousMessageFilter::Filter: Could not set parameter value for %p\n", &fParameter); - return B_DISPATCH_MESSAGE; + if (BSlider *slider = dynamic_cast(fControl)) { + slider->SetValue((int32) (1000 * value[0])); + slider->SetModificationMessage(new BMessage(kMsgParameterChanged)); + } else if (BChannelSlider *slider + = dynamic_cast(fControl)) { + for (int32 i = 0; i < fParameter.CountChannels(); i++) { + slider->SetValueFor(i, (int32) (1000 * value[i])); + } } - - return B_SKIP_MESSAGE; }