diff --git a/src/kits/interface/Menu.cpp b/src/kits/interface/Menu.cpp index 636f9fd0a7..7ae8f90ff4 100644 --- a/src/kits/interface/Menu.cpp +++ b/src/kits/interface/Menu.cpp @@ -291,7 +291,7 @@ BMenu::Archive(BMessage *data, bool deep) const if (err != B_OK) break; if (fLayout == B_ITEMS_IN_MATRIX) { - // TODO Store location of items + err = data->AddRect("_i_frames", item->fBounds); } } } @@ -1172,10 +1172,16 @@ BMenu::InitData(BMessage *data) data->FindFloat("_maxwidth", &fMaxContentWidth); BMessage msg; - for (int32 i = 0; data->FindMessage("_items", i, &msg) == B_OK; i++) { + for (int32 i = 0; data->FindMessage("_items", i, &msg) == B_OK; i++) { BArchivable *object = instantiate_object(&msg); - if (BMenuItem *item = dynamic_cast(object)) - AddItem(item); + if (BMenuItem *item = dynamic_cast(object)) { + BRect bounds; + if ((fLayout == B_ITEMS_IN_MATRIX) + && (data->FindRect("_i_frames", i, &bounds) == B_OK)) + AddItem(item, bounds); + else + AddItem(item); + } } } } diff --git a/src/kits/interface/MenuItem.cpp b/src/kits/interface/MenuItem.cpp index 39cb55b2f8..5f79d61e68 100644 --- a/src/kits/interface/MenuItem.cpp +++ b/src/kits/interface/MenuItem.cpp @@ -179,11 +179,17 @@ BMenuItem::Instantiate(BMessage *data) } +extern const char* B_CLASS_FIELD; + + status_t BMenuItem::Archive(BMessage *data, bool deep) const { status_t ret = B_OK; - if (fLabel) + if (!data->HasString(B_CLASS_FIELD)) + ret = data->AddString(B_CLASS_FIELD, "BMenuItem"); + + if (ret == B_OK && fLabel) ret = data->AddString("_label", Label()); if (ret == B_OK && !IsEnabled()) diff --git a/src/kits/interface/SeparatorItem.cpp b/src/kits/interface/SeparatorItem.cpp index 318bcf6667..8339fe1d68 100644 --- a/src/kits/interface/SeparatorItem.cpp +++ b/src/kits/interface/SeparatorItem.cpp @@ -33,9 +33,14 @@ BSeparatorItem::~BSeparatorItem() } +extern const char* B_CLASS_FIELD; + status_t BSeparatorItem::Archive(BMessage* archive, bool deep) const { + if (!archive->HasString(B_CLASS_FIELD)) + archive->AddString(B_CLASS_FIELD, "BMenuItem"); + return BMenuItem::Archive(archive, deep); }