[haiku-commits] haiku: hrev48002 - src/kits/interface headers/os/interface

  • From: pulkomandy@xxxxxxxxxxxxx
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sun, 12 Oct 2014 16:05:25 +0200 (CEST)

hrev48002 adds 1 changeset to branch 'master'
old head: 3b61a4b53d32ff3daf297401d2f6a7a25c2c7eb7
new head: bdb4ae32fd5a6282583f17e35dcb382fc8c994b8
overview: http://cgit.haiku-os.org/haiku/log/?qt=range&q=bdb4ae3+%5E3b61a4b

----------------------------------------------------------------------------

bdb4ae3: Fix unarchiving of BScrollView with layout
  
  * We archive views using "managed" archives, and the children are not
  attached in the BView(BMessage*) constructor, but later. So it's not
  possible to find the target and scrollbars in the constructor of
  BScrollView.
  * Make BScrollView override AllUnarchived and find the target and
  scrollbars again there. The code is slightly different as there is no
  guarantee that the first child will be the target in that case. The
  existing code in the constructor is preserved for non-managed archives.

                                 [ Adrien Destugues <pulkomandy@xxxxxxxxx> ]

----------------------------------------------------------------------------

Revision:    hrev48002
Commit:      bdb4ae32fd5a6282583f17e35dcb382fc8c994b8
URL:         http://cgit.haiku-os.org/haiku/commit/?id=bdb4ae3
Author:      Adrien Destugues <pulkomandy@xxxxxxxxx>
Date:        Sun Oct 12 14:02:34 2014 UTC

----------------------------------------------------------------------------

2 files changed, 54 insertions(+), 2 deletions(-)
headers/os/interface/ScrollView.h |  1 +
src/kits/interface/ScrollView.cpp | 55 +++++++++++++++++++++++++++++++++--

----------------------------------------------------------------------------

diff --git a/headers/os/interface/ScrollView.h 
b/headers/os/interface/ScrollView.h
index 8caf7cf..bb2e874 100644
--- a/headers/os/interface/ScrollView.h
+++ b/headers/os/interface/ScrollView.h
@@ -34,6 +34,7 @@ public:
 
        static  BArchivable*            Instantiate(BMessage* archive);
        virtual status_t                        Archive(BMessage* archive, bool 
deep = true) const;
+       virtual status_t                        AllUnarchived(const BMessage* 
archive);
 
        // Hook methods
        virtual void                            AllAttached();
diff --git a/src/kits/interface/ScrollView.cpp 
b/src/kits/interface/ScrollView.cpp
index 6725b87..2aebfde 100644
--- a/src/kits/interface/ScrollView.cpp
+++ b/src/kits/interface/ScrollView.cpp
@@ -70,6 +70,9 @@ BScrollView::BScrollView(BMessage* archive)
                fTarget = NULL;
 
        // search for our scroll bars
+       // This will not work for managed archives (when the layout kit is 
used).
+       // In that case the children are attached later, and we perform the 
search
+       // again in the AllUnarchived method.
 
        fHorizontalScrollBar = NULL;
        fVerticalScrollBar = NULL;
@@ -88,6 +91,7 @@ BScrollView::BScrollView(BMessage* archive)
 
        fPreviousWidth = uint16(Bounds().Width());
        fPreviousHeight = uint16(Bounds().Height());
+
 }
 
 
@@ -127,11 +131,58 @@ BScrollView::Archive(BMessage* archive, bool deep) const
        // The highlighted state is not archived, but since it is
        // usually (or should be) used to indicate focus, this
        // is probably the right thing to do.
-
+       
        return status;
 }
 
 
+status_t
+BScrollView::AllUnarchived(const BMessage* archive)
+{
+       status_t result = BView::AllUnarchived(archive);
+       if (result != B_OK)
+               return result;
+
+       // search for our scroll bars and target
+       int32 firstBar = 0;
+       BView* view;
+       while ((view = ChildAt(firstBar++)) != NULL) {
+               printf("scaning %s\n", view->Name());
+               BScrollBar *bar = dynamic_cast<BScrollBar *>(view);
+               // We assume that the first non-scrollbar child view is the 
target.
+               // So the target view can't be a BScrollBar, but who would do 
that?
+               if (bar == NULL) {
+                       // in a shallow archive, we may not have a target 
anymore. We must
+                       // be prepared for this case
+                       if (fTarget == NULL && 
!archive->FindBool("_no_target_"))
+                               fTarget = view;
+                       continue;
+               }
+
+               if (bar->Orientation() == B_HORIZONTAL)
+                       fHorizontalScrollBar = bar;
+               else if (bar->Orientation() == B_VERTICAL)
+                       fVerticalScrollBar = bar;
+       }
+
+       printf("UA %p %p %p\n", fTarget, fHorizontalScrollBar, 
fVerticalScrollBar);
+
+       // Now connect the bars to the target, and make the target aware of them
+       if (fHorizontalScrollBar)
+               fHorizontalScrollBar->SetTarget(fTarget);
+       if (fVerticalScrollBar)
+               fVerticalScrollBar->SetTarget(fTarget);
+
+       if (fTarget)
+               fTarget->TargetedByScrollView(this);
+
+       fPreviousWidth = uint16(Bounds().Width());
+       fPreviousHeight = uint16(Bounds().Height());
+
+       return B_OK;
+}
+
+
 // #pragma mark - Hook methods
 
 
@@ -682,7 +733,7 @@ BScrollView::_Init(bool horizontal, bool vertical)
                        fTarget, 0, 1000, B_VERTICAL);
                AddChild(fVerticalScrollBar);
        }
-       
+
        BRect targetFrame;
        if (fTarget) {
                // layout target and add it


Other related posts:

  • » [haiku-commits] haiku: hrev48002 - src/kits/interface headers/os/interface - pulkomandy