Ejemplo n.º 1
0
        unsafe void MeasureContentSizes(SpecialInputTab e, Font font, Size *sizes)
        {
            DrawTextArgs args = new DrawTextArgs(null, font, false);

            for (int i = 0; i < e.Contents.Length; i += e.CharsPerItem)
            {
                args.Text = e.Contents.Substring(i, e.CharsPerItem);
                sizes[i / e.CharsPerItem] = game.Drawer2D.MeasureText(ref args);
            }
        }
Ejemplo n.º 2
0
        unsafe Size CalculateContentSize(SpecialInputTab e, Size *sizes, out Size elemSize)
        {
            elemSize = Size.Empty;
            for (int i = 0; i < e.Contents.Length; i += e.CharsPerItem)
            {
                elemSize.Width = Math.Max(elemSize.Width, sizes[i / e.CharsPerItem].Width);
            }

            elemSize.Width += contentSpacing;
            elemSize.Height = sizes[0].Height + contentSpacing;
            int rows = Utils.CeilDiv(e.Contents.Length / e.CharsPerItem, e.ItemsPerRow);

            return(new Size(elemSize.Width * e.ItemsPerRow, elemSize.Height * rows));
        }
Ejemplo n.º 3
0
        void DrawContent(IDrawer2D drawer, Font font, SpecialInputTab e, int yOffset)
        {
            int          wrap = e.ItemsPerRow;
            DrawTextArgs args = new DrawTextArgs(null, font, false);

            for (int i = 0; i < e.Contents.Length; i += e.CharsPerItem)
            {
                args.Text = e.Contents.Substring(i, e.CharsPerItem);
                int item = i / e.CharsPerItem;

                int x = (item % wrap) * elementSize.Width, y = (item / wrap) * elementSize.Height;
                y += yOffset;
                drawer.DrawText(ref args, x, y);
            }
        }
Ejemplo n.º 4
0
        unsafe void MeasureContentSizes(SpecialInputTab e, Font font, Size *sizes)
        {
            string       s    = new String('\0', e.CharsPerItem);
            DrawTextArgs args = new DrawTextArgs(s, font, false);

            // avoid allocating temporary strings here
            fixed(char *ptr = s)
            {
                for (int i = 0; i < e.Contents.Length; i += e.CharsPerItem)
                {
                    for (int j = 0; j < e.CharsPerItem; j++)
                    {
                        ptr[j] = e.Contents[i + j];
                    }
                    sizes[i / e.CharsPerItem] = game.Drawer2D.MeasureSize(ref args);
                }
            }
        }
Ejemplo n.º 5
0
        void IntersectsBody(int widgetX, int widgetY)
        {
            widgetY -= elements[0].TitleSize.Height;
            widgetX /= elementSize.Width; widgetY /= elementSize.Height;
            SpecialInputTab e     = elements[selectedIndex];
            int             index = widgetY * e.ItemsPerRow + widgetX;

            if (index * e.CharsPerItem < e.Contents.Length)
            {
                if (selectedIndex == 0)
                {
                    // TODO: need to insert characters that don't affect caret index, adjust caret colour
                    input.Append(e.Contents[index * e.CharsPerItem]);
                    input.Append(e.Contents[index * e.CharsPerItem + 1]);
                }
                else
                {
                    input.Append(e.Contents[index]);
                }
            }
        }
Ejemplo n.º 6
0
        unsafe void DrawContent(IDrawer2D drawer, Font font, SpecialInputTab e, int yOffset)
        {
            string       s    = new String('\0', e.CharsPerItem);
            int          wrap = e.ItemsPerRow;
            DrawTextArgs args = new DrawTextArgs(s, font, false);

            fixed(char *ptr = s)
            {
                for (int i = 0; i < e.Contents.Length; i += e.CharsPerItem)
                {
                    for (int j = 0; j < e.CharsPerItem; j++)
                    {
                        ptr[j] = e.Contents[i + j];
                    }
                    int item = i / e.CharsPerItem;

                    int x = (item % wrap) * elementSize.Width, y = (item / wrap) * elementSize.Height;
                    y += yOffset;
                    drawer.DrawText(ref args, x, y);
                }
            }
        }
Ejemplo n.º 7
0
        unsafe void Make(SpecialInputTab e, Font font)
        {
            Size *sizes = stackalloc Size[e.Contents.Length / e.CharsPerItem];

            MeasureContentSizes(e, font, sizes);
            Size bodySize = CalculateContentSize(e, sizes, out elementSize);
            int  titleWidth = MeasureTitles(font), titleHeight = elements[0].TitleSize.Height;
            Size size = new Size(Math.Max(bodySize.Width, titleWidth), bodySize.Height + titleHeight);

            game.Graphics.DeleteTexture(ref texture);

            using (Bitmap bmp = IDrawer2D.CreatePow2Bitmap(size))
                using (IDrawer2D drawer = game.Drawer2D)
                {
                    drawer.SetBitmap(bmp);
                    DrawTitles(drawer, font);
                    drawer.Clear(new FastColour(30, 30, 30, 200), 0, titleHeight,
                                 size.Width, bodySize.Height);

                    DrawContent(drawer, font, e, titleHeight);
                    texture = drawer.Make2DTexture(bmp, size, X, Y);
                }
        }