From 2c323083e40bfb0ceaa0a99ab47711dcda4dd6d6 Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Fri, 4 Mar 2005 12:30:16 +0000 Subject: [PATCH] Implemented BChannelControl's InvokeChannel and Archive(). Actually this code was sitting somewhere on my hard driver for some time already... git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11572 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/ChannelControl.cpp | 59 +++++++++++++++++++++++++-- 1 file changed, 55 insertions(+), 4 deletions(-) diff --git a/src/kits/interface/ChannelControl.cpp b/src/kits/interface/ChannelControl.cpp index 8b89555b83..bad31b5ce1 100644 --- a/src/kits/interface/ChannelControl.cpp +++ b/src/kits/interface/ChannelControl.cpp @@ -39,6 +39,7 @@ BChannelControl::BChannelControl(BRect frame, const char *name, const char *labe BChannelControl::BChannelControl(BMessage *archive) : BControl(archive) { + } @@ -51,9 +52,34 @@ BChannelControl::~BChannelControl() status_t -BChannelControl::Archive(BMessage *into, bool deep) const +BChannelControl::Archive(BMessage *message, bool deep) const { - return B_ERROR; + status_t status = BControl::Archive(message, deep); + + status = message->AddInt32("be:_m_channel_count", fChannelCount); + if (status == B_OK) + message->AddInt32("be:_m_value_channel", fCurrentChannel); + if (status == B_OK) + message->AddString("be:_m_min_label", fMinLabel.String()); + if (status == B_OK) + message->AddString("be:_m_max_label", fMaxLabel.String()); + + if (status == B_OK && fChannelValues != NULL + && fChannelMax != NULL && fChannelMin != NULL) { + for (int32 i = 0; i < fChannelCount; i++) { + status = message->AddInt32("be:_m_channel_min", fChannelMin[i]); + if (status < B_OK) + break; + status = message->AddInt32("be:_m_channel_max", fChannelMax[i]); + if (status < B_OK) + break; + status = message->AddInt32("be:_m_channel_val", fChannelValues[i]); + if (status < B_OK) + break; + } + } + + return status; } @@ -105,7 +131,12 @@ BHandler * BChannelControl::ResolveSpecifier(BMessage *msg, int32 index, BMessage *specifier, int32 form, const char *property) { - return NULL; + BHandler *target = this; + BPropertyInfo propertyInfo(sPropertyInfo); + if (propertyInfo.FindMatch(msg, index, specifier, form, property) < B_OK) + target = BControl::ResolveSpecifier(msg, index, specifier, form, property); + + return target; } @@ -160,7 +191,27 @@ status_t BChannelControl::InvokeChannel(BMessage *msg, int32 fromChannel, int32 channelCount, const bool *inMask) { - return B_ERROR; + bool notify = false; + BMessage invokeMessage(InvokeKind(¬ify)); + + if (msg != NULL) + invokeMessage = *msg; + else if (Message() != NULL) + invokeMessage = *Message(); + + invokeMessage.AddInt32("be:current_channel", fCurrentChannel); + + if (channelCount == -1) + channelCount = fChannelCount - fromChannel; + + for (int32 i = fromChannel; i < fromChannel + channelCount; i++) { + invokeMessage.AddInt32("be:channel_value", fChannelValues[i]); + // TODO: Fix this: just send "be:channel_changed" = true + // for channels which have changed their values. + invokeMessage.AddBool("be:channel_changed", true); + } + + return BControl::Invoke(&invokeMessage); }