예제 #1
0
파일: Menu.cs 프로젝트: lanceewing/agile
        /// <summary>
        /// Shows the menu items for the given MenuHeader.
        /// </summary>
        /// <param name="header">The MenuHeader to show the menu items of.</param>
        private void ShowMenu(MenuHeader header)
        {
            // Interestingly, it would seem that the width is always calculated using the first item. The
            // original AGI games tended to make the item names a consistent length within each menu.
            MenuItem firstItem = (header.Items.Count > 0 ? header.Items[0] : null);
            int      height    = header.Height;
            int      width     = (firstItem != null ? firstItem.Name.Length : header.Title.Name.Length);
            int      column    = (firstItem != null ? firstItem.Col : header.Title.Col);

            // Compute window size and position and put them into the appropriate bytes of the words.
            int menuDim = ((height * CHARHEIGHT + 2 * VMARGIN) << 8) | (width * CHARWIDTH + 2 * HMARGIN);
            int menuPos = (((column - 1) * CHARWIDTH) << 8) | ((height + 1) * CHARHEIGHT + VMARGIN - 1);

            // Show the menu title as being selected.
            Select(header.Title);

            // Open a window for this menu using the calculated position and dimensions.
            textGraphics.OpenWindow(new TextWindow(menuPos, menuDim, 15, 0));

            // Render each of the items in this menu.
            foreach (MenuItem item in header.Items)
            {
                if (item == header.CurrentItem)
                {
                    Select(item);
                }
                else
                {
                    Deselect(item);
                }
            }
        }