* Implemented Min/Max/PreferredSize().

* Reworked the internal layout. _ValidateLayoutData() computes and caches the
  layout related data and all other methods just use those values. Now, in
  layout-aware mode the class should properly work not only when using the
  layout items. And when using layout items, the class does actually do
  internal layout; it was basically good luck that it worked in the tests,
  before. Vertical resizing is supported, too. 
* We do a few mean tricks to get the probably mostly preferred layout behavior:
  By default our own explicit max width and that of the menu bar layout item is
  set to unlimited and the horizontal menu bar alignment to left aligned. This
  allows to horizontally resize a BMenuField beyond its preferred size,
  although both label and menu bar have a limited max width. The user can, of
  course, override those explicit sizes/alignments to get a different behavior,
  if desired.
* Fixed invalidation in SetDivider(). When having the focus, the left and top
  border of the blue frame were not invalidated.
* The label is no longer drawn at vertical position font ascent + descent
  + leading + 2 (not sure how this calculation was supposed to work), but
  vertically centers the label around the ascent. With big fonts the label is
  shown a bit too far to the bottom. Not sure how to fix this in a generic way.


git-svn-id: file:///srv/svn/repos/haiku/haiku/trunk@21466 a95241bf-73f2-0310-859d-f6bbb57e9c96
This commit is contained in:
Ingo Weinhold
2007-06-19 23:38:00 +00:00
parent ec592aa9e5
commit b321303cf9
2 changed files with 254 additions and 98 deletions
+18 -7
View File
@@ -28,7 +28,7 @@ class BMenuField : public BView {
BMessage* message,
uint32 flags = B_WILL_DRAW | B_NAVIGABLE);
BMenuField(const char* label,
BMenu* menu, BMessage* message);
BMenu* menu, BMessage* message = NULL);
BMenuField(BMessage* data);
virtual ~BMenuField();
@@ -77,20 +77,31 @@ class BMenuField : public BView {
virtual void ResizeToPreferred();
virtual void GetPreferredSize(float* width, float* height);
BLayoutItem* CreateLabelLayoutItem();
BLayoutItem* CreateMenuBarLayoutItem();
virtual BSize MinSize();
virtual BSize MaxSize();
virtual BSize PreferredSize();
virtual void InvalidateLayout(bool descendants = false);
BLayoutItem* CreateLabelLayoutItem();
BLayoutItem* CreateMenuBarLayoutItem();
/*----- Private or reserved -----------------------------------------*/
virtual status_t Perform(perform_code d, void* arg);
protected:
virtual void DoLayout();
private:
class LabelLayoutItem;
class MenuBarLayoutItem;
struct LayoutData;
friend class _BMCMenuBar_;
friend class LabelLayoutItem;
friend class MenuBarLayoutItem;
friend class LayoutData;
virtual void _ReservedMenuField1();
virtual void _ReservedMenuField2();
@@ -108,22 +119,22 @@ class BMenuField : public BView {
void _InitMenuBar(BMenu* menu,
BRect frame, bool fixedSize);
void _ValidateLayoutData();
char* fLabel;
BMenu* fMenu;
BMenuBar* fMenuBar;
alignment fAlign;
float fDivider;
float fStringWidth;
bool fEnabled;
bool fSelected;
bool fTransition;
bool fFixedSizeMB;
thread_id fMenuTaskID;
BLayoutItem* fLabelLayoutItem;
BLayoutItem* fMenuBarLayoutItem;
LayoutData* fLayoutData;
uint32 _reserved[1];
uint32 _reserved[3];
};
#endif // _MENU_FIELD_H