From 016e74b2c551552ad3482dd51f0eaec836c0ff3c Mon Sep 17 00:00:00 2001 From: Stefano Ceccherini Date: Mon, 7 Mar 2005 08:45:18 +0000 Subject: [PATCH] Fixed a crash on exit (Attached views are deleted automatically), finished some missing stuff, corrected some issues. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@11609 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/kits/interface/ChannelControl.cpp | 51 +++++++++++++++++++++++---- src/kits/interface/ChannelSlider.cpp | 10 +++--- 2 files changed, 51 insertions(+), 10 deletions(-) diff --git a/src/kits/interface/ChannelControl.cpp b/src/kits/interface/ChannelControl.cpp index bad31b5ce1..362c5a472e 100644 --- a/src/kits/interface/ChannelControl.cpp +++ b/src/kits/interface/ChannelControl.cpp @@ -37,8 +37,46 @@ BChannelControl::BChannelControl(BRect frame, const char *name, const char *labe BChannelControl::BChannelControl(BMessage *archive) - : BControl(archive) + : BControl(archive), + fChannelCount(0), + fCurrentChannel(0), + fChannelMin(NULL), + fChannelMax(NULL), + fChannelValues(NULL), + fMultiLabels(NULL), + fModificationMsg(NULL) { + archive->FindInt32("be:_m_channel_count", &fChannelCount); + archive->FindInt32("be:_m_value_channel", &fCurrentChannel); + + if (fChannelCount > 0) { + fChannelMin = new int32[fChannelCount]; + memset(fChannelMin, 0, sizeof(int32) * fChannelCount); + + fChannelMax = new int32[fChannelCount]; + memset(fChannelMax, 100, sizeof(int32) * fChannelCount); + + fChannelValues = new int32[fChannelCount]; + memset(fChannelValues, 0, sizeof(int32) * fChannelCount); + + for (int32 c = 0; c < fChannelCount; c++) { + archive->FindInt32("be:_m_channel_min", c, &fChannelMin[c]); + archive->FindInt32("be:_m_channel_max", c, &fChannelMax[c]); + archive->FindInt32("be:_m_channel_val", c, &fChannelValues[c]); + } + } + + const char *label = NULL; + if (archive->FindString("be:_m_min_*label", &label) == B_OK) + fMinLabel = label; + if (archive->FindString("be:_m_max_label", &label) == B_OK) + fMaxLabel = label; + + BMessage *modificationMessage = new BMessage; + if (archive->FindMessage("_mod_msg", modificationMessage) == B_OK) + fModificationMsg = modificationMessage; + else + delete modificationMessage; } @@ -48,6 +86,7 @@ BChannelControl::~BChannelControl() delete[] fChannelMin; delete[] fChannelMax; delete[] fChannelValues; + delete fModificationMsg; } @@ -55,14 +94,14 @@ status_t BChannelControl::Archive(BMessage *message, bool deep) const { 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); + status = message->AddInt32("be:_m_channel_count", fChannelCount); if (status == B_OK) - message->AddString("be:_m_min_label", fMinLabel.String()); + status = message->AddInt32("be:_m_value_channel", fCurrentChannel); if (status == B_OK) - message->AddString("be:_m_max_label", fMaxLabel.String()); + status = message->AddString("be:_m_min_label", fMinLabel.String()); + if (status == B_OK) + status = message->AddString("be:_m_max_label", fMaxLabel.String()); if (status == B_OK && fChannelValues != NULL && fChannelMax != NULL && fChannelMin != NULL) { diff --git a/src/kits/interface/ChannelSlider.cpp b/src/kits/interface/ChannelSlider.cpp index e6d07fc662..444317dcca 100644 --- a/src/kits/interface/ChannelSlider.cpp +++ b/src/kits/interface/ChannelSlider.cpp @@ -100,8 +100,6 @@ BChannelSlider::~BChannelSlider() delete fLeftKnob; delete fMidKnob; delete fRightKnob; - delete fBacking; - delete fBackingView; delete fInitialValues; } @@ -373,8 +371,12 @@ BHandler * BChannelSlider::ResolveSpecifier(BMessage *msg, int32 index, BMessage *specifier, int32 form, const char *property) { - // TODO: Implement - return NULL; + BHandler *target = this; + BPropertyInfo propertyInfo(sPropertyInfo); + if (propertyInfo.FindMatch(msg, index, specifier, form, property) < B_OK) + target = BChannelControl::ResolveSpecifier(msg, index, specifier, form, property); + + return target; }