Example #1
0
        static DockySurface[] GetSlices(DockySurface model)
        {
            if (menu_slices != null)
            {
                return(menu_slices);
            }

            DockySurface main = new DockySurface(TotalWidth, TotalHeight, model);

            using (Gdk.Pixbuf pixbuf = DockServices.Drawing.LoadIcon(DockServices.Theme.MenuSvg)) {
                Gdk.CairoHelper.SetSourcePixbuf(main.Context, pixbuf, ShadowSize, ShadowSize);
                main.Context.Paint();
            }

            Gdk.Rectangle extents;
            if (ShadowSize > 0)
            {
                using (DockySurface shadow = main.CreateMask(0, out extents)) {
                    shadow.GaussianBlur(ShadowSize);
                    shadow.Context.Operator = Operator.DestOut;
                    for (int i = 0; i < 4; i++)
                    {
                        shadow.Context.SetSource(main.Internal);
                        shadow.Context.Paint();
                    }

                    main.Context.Operator = Operator.DestOver;
                    main.Context.SetSource(shadow.Internal);
                    main.Context.PaintWithAlpha(1);
                    main.Context.Operator = Operator.Over;
                }
            }

            int middleWidth   = TotalWidth - 2 * SliceSize;
            int middleHeight  = TotalHeight - 2 * SliceSize - TailHeight;
            int tailSliceSize = TailHeight + SliceSize;
            int tailSideSize  = (middleWidth - TailWidth) / 2;

            DockySurface[] results = new DockySurface[11];
            results[(int)Slice.TopLeft] = main.CreateSlice(new Gdk.Rectangle(
                                                               0,
                                                               0,
                                                               SliceSize,
                                                               SliceSize));

            results[(int)Slice.Top] = main.CreateSlice(new Gdk.Rectangle(
                                                           SliceSize,
                                                           0,
                                                           middleWidth,
                                                           SliceSize));

            results[(int)Slice.TopRight] = main.CreateSlice(new Gdk.Rectangle(
                                                                TotalWidth - SliceSize,
                                                                0,
                                                                SliceSize,
                                                                SliceSize));

            results[(int)Slice.Left] = main.CreateSlice(new Gdk.Rectangle(
                                                            0,
                                                            SliceSize,
                                                            SliceSize,
                                                            middleHeight));

            results[(int)Slice.Center] = main.CreateSlice(new Gdk.Rectangle(
                                                              SliceSize,
                                                              SliceSize,
                                                              middleWidth,
                                                              middleHeight));

            results[(int)Slice.Right] = main.CreateSlice(new Gdk.Rectangle(
                                                             TotalWidth - SliceSize,
                                                             SliceSize,
                                                             SliceSize,
                                                             middleHeight));

            results[(int)Slice.BottomLeft] = main.CreateSlice(new Gdk.Rectangle(
                                                                  0,
                                                                  TotalHeight - tailSliceSize,
                                                                  SliceSize,
                                                                  tailSliceSize));

            results[(int)Slice.TailLeft] = main.CreateSlice(new Gdk.Rectangle(
                                                                SliceSize,
                                                                TotalHeight - tailSliceSize,
                                                                tailSideSize,
                                                                tailSliceSize));

            results[(int)Slice.Tail] = main.CreateSlice(new Gdk.Rectangle(
                                                            SliceSize + tailSideSize,
                                                            TotalHeight - tailSliceSize,
                                                            TailWidth,
                                                            tailSliceSize));

            results[(int)Slice.TailRight] = main.CreateSlice(new Gdk.Rectangle(
                                                                 SliceSize + middleWidth - tailSideSize,
                                                                 TotalHeight - tailSliceSize,
                                                                 tailSideSize,
                                                                 tailSliceSize));

            results[(int)Slice.BottomRight] = main.CreateSlice(new Gdk.Rectangle(
                                                                   SliceSize + middleWidth,
                                                                   TotalHeight - tailSliceSize,
                                                                   SliceSize,
                                                                   tailSliceSize));

            menu_slices = results;

            main.Dispose();

            return(menu_slices);
        }