From 0096a29e9c782bd3b8a6df25fafeb9b089338f45 Mon Sep 17 00:00:00 2001 From: John Scipione Date: Fri, 8 Nov 2013 19:28:22 -0500 Subject: [PATCH] Add BMenuField class documentation --- docs/user/interface/MenuField.dox | 420 ++++++++++++++++++ .../interface/images/BMenuField_example.png | Bin 0 -> 6767 bytes 2 files changed, 420 insertions(+) create mode 100644 docs/user/interface/MenuField.dox create mode 100644 docs/user/interface/images/BMenuField_example.png diff --git a/docs/user/interface/MenuField.dox b/docs/user/interface/MenuField.dox new file mode 100644 index 0000000000..d1ce312f48 --- /dev/null +++ b/docs/user/interface/MenuField.dox @@ -0,0 +1,420 @@ +/* + * Copyright 2013 Haiku Inc. All rights reserved. + * Distributed under the terms of the MIT License. + * + * Authors: + * John Scipione, jscipione@gmail.com + * + * Corresponds to: + * headers/os/interface/MenuField.h hrev46323 + * src/kits/interface/MenuField.cpp hrev46323 + */ + + +/*! + \file MenuField.h + \ingroup interface + \ingroup libbe + \brief BMenuField class definition and support structures. +*/ + + +/*! + \class BMenuField + \ingroup interface + \ingroup libbe + \brief A labeled pop-up menu. + + A menu field consists of a label and a menu bar. The label, if used, is + located to the left of the menu bar. The frame rectangle is divided + in half by default. You can call SetDivider() to change the ratio used by + the label and menu bar. + + \image html BMenuField_example.png + + A fixed-size menu field's menu bar width and height are limited + by the bounds set by the divider position and \a frame rectangle. + + A variable-size menu field's menu bar is only as wide as it needs to + be in order to fit the currently selected menu item, and it's height + depends on the user's menu font size preference. The height of the + frame rectangle is ignored. + + If a menu field's frame rectangle is less than 20 pixels wide, the width + is unbounded, the menu bar grows as wide as it needs to in order to fit + the currently selected item. If the frame rectangle is wider than 20 + pixels then the divider position and the width of the frame rectangle set + the maximum menu bar width. + + \remark Layout-enabled menu field's are always fixed-size, however, you can + make them act like variable-size menu fields by adding them to a + horizontal group followed by glue. + + If you're using the menu field as part of a BLayout you can get better + control over the placement of the label and menu bar by splitting the + label and menu field into separate BLayoutItem objects using the + CreateLabelLayoutItem() and CreateMenuBarLayoutItem() methods. + + You must pass a menu object into the constructor containing the choices + the user can select from. The menu is owned by the menu field and its + memory will be freed when the menu field is deleted. A BPopUpMenu is + typically used instead of a regular BMenu because it opens directly + underneath the mouse pointer and is set to radio mode and + label-from-marked mode by default, but, this is entirely up to you. +*/ + + +/*! + \fn BMenuField::BMenuField(BRect frame, const char* name, const char* label, + BMenu* menu, uint32 resizingMode, uint32 flags) + \brief Creates a new variable-size BMenuField object. + + \param frame The \a frame rectangle of the menu field including the label. + \param name The \a name of the menu field, internal only, can be \c NULL. + \param label The \a label shown to the user, can be blank. + \param menu The \a menu of choices shown to the user, typically a BPopUpMenu. + \param resizingMode Defines the menu field's behavior when its parent is + resized, see BView for details. + \param flags The view flags, see BView for details. +*/ + + +/*! + \fn BMenuField::BMenuField(BRect frame, const char* name, const char* label, + BMenu* menu, bool fixedSize, uint32 resizingMode, uint32 flags) + \brief Creates a new BMenuField object. This constructor allows a you to + create either a fixed-size or variable-size menu field. + + \param frame The \a frame rectangle of the menu field including the label. + \param name The \a name of the menu field, internal only, can be \c NULL. + \param label The \a label shown to the user, can be blank. + \param menu The \a menu of choices shown to the user, typically a BPopUpMenu. + \param fixedSize \c true for fixed-size, \c false for variable-size. + \param resizingMode Defines the menu field's behavior when its parent is + resized, see BView for details. + \param flags The view flags, see BView for details. +*/ + + +/*! + \fn BMenuField::BMenuField(const char* name, const char* label, BMenu* menu, + uint32 flags) + \brief Creates a new BMenuField object suitable as part of a BLayout. + + \note This method was not available in BeOS R5. + + \param name The \a name of the menu field, internal only, can be \c NULL. + \param label The \a label shown to the user, can be blank. + \param menu The \a menu of choices shown to the user, typically a BPopUpMenu. + \param flags The view flags, see BView for details. +*/ + + +/*! + \fn BMenuField::BMenuField(const char* label, BMenu* menu, uint32 flags) + \brief Creates a new BMenuField object suitable as part of a BLayout. + This constructor omits the internal name parameter. + + \note This method was not available in BeOS R5. + + \param label The \a label shown to the user, can be blank. + \param menu The \a menu of choices shown to the user, typically a BPopUpMenu. + \param flags The view flags, see BView for details. +*/ + + +/*! + \fn BMenuField::BMenuField(BMessage* data) + \brief Archive constructor. + + \param data The message \a data to construct the menu field from. +*/ + + +/*! + \fn BMenuField::~BMenuField() + \brief Destructor. + + Also frees the memory used by the label and menu. +*/ + + +/*! + \fn BArchivable* BMenuField::Instantiate(BMessage* data) + \brief Creates a new BMenuField object from an \a data message. + + \returns A newly created BMenuField object or \c NULL if the message + doesn't contain an archived BMenuField. +*/ + + +/*! + \fn status_t BMenuField::Archive(BMessage* data, bool deep) const + \brief Archives the the BMenuField object into the \a data message. + + Adds the label, divider, and current state of the BMenuField to the archive. + + \param data A pointer to the BMessage to archive the object into. + \param deep Whether or not to archive attached menu and menu items as well. + + \return A status code, \c B_OK if everything went well or an error code + otherwise. + \retval B_OK The object was archived successfully. + \retval B_NO_MEMORY Ran out of memory while archiving the object. +*/ + + +/*! + \fn status_t BMenuField::AllArchived(BMessage* into) const + \brief Hook method called when all views have been archived. + + Also archives the label and menu bar. + + \param into Archived data message. +*/ + + +/*! + \fn status_t BMenuField::AllUnarchived(const BMessage* from) + \brief Hook method called when all views have been unarchived. + + Also unarchives the label and menu bar. + + \param from Unarchived data message. +*/ + + +/*! + \fn void BMenuField::AttachedToWindow() + \brief Hook method called when the menu field is attached to a window. + + Adjusts the background color to match the background color of the parent + view and adjusts the height to be the attached menu bar which depends on + the user's current menu font setting. +*/ + + +/*! + \fn void BMenuField::AllAttached() + \brief Similar to AttachedToWindow() but this method is triggered after + all child views have already been attached to a window. + + If the attached menu bar is too narrow it is resized it to fit the menu + items. +*/ + + +/*! + \fn void BMenuField::Draw(BRect updateRect) + \brief Draws the area of the menu field that intersects \a updateRect. + + The menu field is drawn differently based on whether or not it is the + current focus view and whether or not it is enabled. + + \param updateRect The rectangular area to be drawn. +*/ + + +/*! + \fn void BMenuField::FrameResized(float newWidth, float newHeight) + \brief Hook method called when the menu bar is resized. + + Adjusts the menu bar size and location. + + \param newWidth The new \a width of the menu field. + \param newHeight The new \a height of the menu field. +*/ + + +/*! + \fn void BMenuField::KeyDown(const char* bytes, int32 numBytes) + \brief Hook method called when a keyboard key is pressed. + + Provides for keyboard navigation allowing users to open the menu by pressing + the space bar, right arrow, or down arrow. + + \param bytes The bytes of the key combination pressed. + \param numBytes The number of bytes in \a bytes. +*/ + + +/*! + \fn void BMenuField::MouseDown(BPoint where) + \brief Hook method called when a mouse button is pressed. + + Provides the ability to open the menu field menu using the mouse, even if + the user clicks on the menu field label. + + \param where The point on the screen where to mouse pointer is when + the mouse button is pressed. +*/ + + +/*! + \fn void BMenuField::WindowActivated(bool state) + \brief Hook method called when the attached window is activated or + deactivated. + + Redraws the focus ring around the menu field when the window is activated + and deactivated if it is the window's current focus view. + + \param state \c true if the window becomes activated, \c false if the + window becomes deactivated. +*/ + + +/*! + \fn void BMenuField::MakeFocus(bool focused) + \brief Makes the view the current focus view of the window or gives up + being the focus view of the window. + + Enables or disables keyboard navigation and invalidates the menu field. + + \param focused \a true to set focus, \a false to remove it. +*/ + + +/*! + \fn BMenu* BMenuField::Menu() const + \brief Returns a pointer to the menu attached to the menu bar that opens + when the user clicks on the menu field. +*/ + + +/*! + \fn BMenuBar* BMenuField::MenuBar() const + \brief Returns a pointer to the attached menu bar that contains the pop-up + menu. +*/ + + +/*! + \fn BMenuItem* BMenuField::MenuItem() const + \brief Returns the first menu item attached to the menu bar containing + the pop-up menu. +*/ + + +/*! + \fn void BMenuField::SetLabel(const char* label) + \brief Sets the menu field label to \a label. + + \param label The \a label to set to the menu field. +*/ + + +/*! + \fn const char* BMenuField::Label() const + \brief Returns the menu field label. + + \return The menu field label or \c NULL if not assigned. +*/ + + +/*! + \fn void BMenuField::SetEnabled(bool on) + \brief Enables or disables the menu field. + + \param on \c true to enable the menu field, \c false to disable it. +*/ + + +/*! + \fn bool BMenuField::IsEnabled() const + \brief Returns whether or not the menu is enabled. + + \return \c true if the menu is enabled, \c false if disabled. +*/ + + +/*! + \fn void BMenuField::SetAlignment(alignment label) + \brief Set the alignment of the menu field label. The default alignment + is \c B_ALIGN_LEFT. + + \remark For menu fields that are part of a BLayout consider + using BLayoutItem::SetExplicitAlignment() instead. + + \param label The alignment to set, choices include: + - \c B_ALIGN_LEFT + - \c B_ALIGN_CENTER + - \c B_ALIGN_RIGHT +*/ + + +/*! + \fn alignment BMenuField::Alignment() const + \brief Returns the label's current alignment. + + \return The label's current alignment constant. + + \see SetAlignment() for more details. +*/ + + +/*! + \fn void BMenuField::SetDivider(float position) + \brief Sets the horizontal \a position of the divider that separates the + label from the menu bar. + + \remark It is not recommended to use this method for menu fields that are + part of a BLayout. Instead split the label and menu bar into + separate layout items using CreateLabelLayoutItem() and + CreateMenuBarLayoutItem(). This allows you to have better control + over the position of the label and menu bar portions of your + menu fields. + + \param position The divider \a position to set, should be an integral value. +*/ + + +/*! + \fn float BMenuField::Divider() const + \brief Returns the current divider position. + + \return The current divider position as a float. + + \see SetDivider() for more details. +*/ + + +/*! + \fn void BMenuField::ShowPopUpMarker() + \brief Shows the pop-up marker located on the right edge of the menu bar. + + \note This method was not available in BeOS R5. + + \sa HidePopUpMarker() +*/ + + +/*! + \fn void BMenuField::HidePopUpMarker() + \brief Hides to pop-up marker. + + \note This method was not available in BeOS R5. + + \sa ShowPopUpMarker() +*/ + + +/*! + \fn BLayoutItem* BMenuField::CreateLabelLayoutItem() + \brief Returns a pointer to the label layout item. + (Layout constructor only) + + \note This method was not available in BeOS R5. + + \sa CreateMenuBarLayoutItem() +*/ + + +/*! + \fn BLayoutItem* BMenuField::CreateMenuBarLayoutItem() + \brief Returns a pointer to the menu bar layout item. + (Layout constructor only) + + \note This method was not available in BeOS R5. + + \sa CreateLabelLayoutItem() +*/ diff --git a/docs/user/interface/images/BMenuField_example.png b/docs/user/interface/images/BMenuField_example.png new file mode 100644 index 0000000000000000000000000000000000000000..be3fe76dae5435d88ce9fd468e1d5f107e52c615 GIT binary patch literal 6767 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