LynnaLab.WarpEditor.SetWarpIndex C# (CSharp) Method

SetWarpIndex() private method

private SetWarpIndex ( int i ) : void
i int
return void
        void SetWarpIndex(int i)
        {
            List<WarpSourceData> sourceDataList = sourceGroup.GetMapWarpSourceData(map);

            indexSpinButton.Adjustment.Lower = -1;
            indexSpinButton.Adjustment.Upper = sourceDataList.Count-1;

            if (i > indexSpinButton.Adjustment.Upper)
                i = (int)indexSpinButton.Adjustment.Upper;

            indexSpinButton.Value = i;

            valueEditorContainer.Remove(valueEditorContainer.Child);

            if (i == -1) {
                SetDestIndex(-1,-1);
                return;
            }

            Gtk.HBox hbox = new Gtk.HBox();

            WarpSourceData warpSourceData = sourceDataList[i];

            if (warpSourceData.WarpSourceType == WarpSourceType.StandardWarp)
                SetDestIndex(warpSourceData.DestGroup, warpSourceData.DestIndex);

            sourceEditor = new ValueReferenceEditor(Project,
                    warpSourceData);

            Alignment a = new Alignment(0,0,0,0);
            a.Add(sourceEditor);
            hbox.Add(a);

            if (warpSourceData.WarpSourceType == WarpSourceType.PointerWarp) {
                Table table = new Table(1, 1, false);
                table.ColumnSpacing = 6;
                table.RowSpacing = 6;

                SpinButton pointerSpinButton = new SpinButton(0,10,1);

                EventHandler valueChangedHandler = delegate(object sender, EventArgs e) {
                    WarpSourceData pointedData = warpSourceData.GetPointedWarp();

                    pointerSpinButton.Adjustment.Lower = 0;
                    pointerSpinButton.Adjustment.Upper = warpSourceData.GetPointedChainLength()-1;

                    if (pointerSpinButton.ValueAsInt > pointerSpinButton.Adjustment.Upper) {
                        pointerSpinButton.Value = pointerSpinButton.Adjustment.Upper;
                    }
                    int index = pointerSpinButton.ValueAsInt;

                    while (index > 0) {
                        pointedData = pointedData.GetNextWarp();
                        index--;
                    }

                    table.Remove(destEditor);

                    destEditor = new ValueReferenceEditor(Project, pointedData);

                    destEditor.AddDataModifiedHandler(delegate() {
                            SetDestIndex(pointedData.DestGroup, pointedData.DestIndex);
                        });

                    table.Attach(destEditor, 0, 2, 1, 2);

                    SetDestIndex(pointedData.DestGroup, pointedData.DestIndex);
                };

                pointerSpinButton.ValueChanged += valueChangedHandler;

                // Button which, when clicked, adds a new PointedData to the
                // "chain".
                Gtk.Button addPointedWarpButton =
                    new Gtk.Button(new Gtk.Image(Gtk.Stock.Add, Gtk.IconSize.Button));

                addPointedWarpButton.Clicked += delegate(object sender, EventArgs e) {
                    WarpSourceData pointedData = warpSourceData.GetPointedWarp();

                    while (pointedData.GetNextWarp() != null) {
                        pointedData = pointedData.GetNextWarp();
                    }

                    WarpSourceData nextData = new WarpSourceData(Project,
                            WarpSourceData.WarpCommands[(int)WarpSourceType.PointedWarp],
                            WarpSourceData.DefaultValues[(int)WarpSourceType.PointedWarp],
                            pointedData.FileParser,
                            new List<int>{-1});
                    pointedData.SetNextWarp(nextData);

                    pointerSpinButton.Adjustment.Upper++;
                    pointerSpinButton.Value = warpSourceData.GetPointedChainLength()-1;
                    valueChangedHandler(null, null);
                };

                // Button which removes a PointedData from the "chain", unless
                // there is only one remaining.
                Gtk.Button removePointedWarpButton =
                    new Gtk.Button(new Gtk.Image(Gtk.Stock.Remove, Gtk.IconSize.Button));

                removePointedWarpButton.Clicked += delegate(object sender, EventArgs e) {
                    int index = pointerSpinButton.ValueAsInt;
                    WarpSourceData pointedData = warpSourceData.GetPointedWarp();

                    if (pointedData.GetPointedChainLength() <= 1) // Don't delete the last one
                        return;

                    while (index > 0) {
                        pointedData = pointedData.GetNextWarp();
                        index--;
                    }

                    pointedData.FileParser.RemoveFileComponent(pointedData);

                    valueChangedHandler(null, null);
                };

                table.Attach(new Gtk.Label("Pointer index"), 0, 1, 0, 1);
                table.Attach(pointerSpinButton, 1, 2, 0, 1);
                table.Attach(addPointedWarpButton, 2, 3, 0, 1);
                table.Attach(removePointedWarpButton, 3, 4, 0, 1);

                // Invoke handler
                valueChangedHandler(pointerSpinButton, null);

                Frame frame = new Frame(warpSourceData.PointerString);
                frame.Add(table);

                hbox.Add(frame);
            }
            else { // Not pointerWarp
                sourceEditor.AddDataModifiedHandler(delegate() {
                        SetDestIndex(warpSourceData.DestGroup, warpSourceData.DestIndex);
                        });
            }

            valueEditorContainer.Add(hbox);
            valueEditorContainer.ShowAll();
        }

Usage Example

示例#1
0
        void GenerateRoomComponents()
        {
            if (Room == null)
            {
                return;
            }

            roomComponents    = new List <RoomComponent>();
            hoveringComponent = null;

            // We only draw the 1 component if we're editing a warp destination
            if (EditingWarpDestination != null)
            {
                WarpDestRoomComponent com = new WarpDestRoomComponent(this, EditingWarpDestination);
                com.SelectedEvent += (sender, args) => {
                    WarpEditor.SetSelectedWarp(com.warp);
                };
                roomComponents.Add(com);
                goto addedAllComponents; // I love being evil
            }

            if (ViewObjects && ObjectGroupEditor.TopObjectGroup != null)
            {
                foreach (ObjectGroup group in ObjectGroupEditor.TopObjectGroup.GetAllGroups())
                {
                    for (int i = 0; i < group.GetNumObjects(); i++)
                    {
                        ObjectDefinition obj = group.GetObject(i);
                        if (!obj.HasXY())
                        {
                            continue;
                        }
                        ObjectRoomComponent com = new ObjectRoomComponent(obj);
                        com.SelectedEvent += (sender, args) => {
                            ObjectGroupEditor.SelectObject(obj.ObjectGroup, obj.Index);
                        };
                        roomComponents.Add(com);
                    }
                }
            }

            if (ViewWarps)
            {
                int       index = 0;
                WarpGroup group = room.GetWarpGroup();

                foreach (Warp warp in group.GetWarps())
                {
                    Action <int, int, int, int> addWarpComponent = (x, y, width, height) => {
                        var rect = new Cairo.Rectangle(x, y, width, height);
                        var com  = new WarpSourceRoomComponent(this, warp, index, rect);
                        com.SelectedEvent += (sender, args) => {
                            WarpEditor.SetWarpIndex(com.index);
                        };
                        roomComponents.Add(com);
                    };

                    if (warp.WarpSourceType == WarpSourceType.Standard)
                    {
                        int middle;
                        if (Room.Width == 15) // Large room
                        {
                            middle = ((Room.Width + 1) / 2) * 16;
                        }
                        else // Small room
                        {
                            middle = ((Room.Width + 1) / 2) * 16 + 8;
                        }
                        int right  = Room.Width * 16;
                        int bottom = Room.Height * 16 - 8;

                        if (warp.TopLeft)
                        {
                            addWarpComponent(0, -8, middle, 16);
                        }
                        if (warp.TopRight)
                        {
                            addWarpComponent(middle, -8, right - middle, 16);
                        }
                        if (warp.BottomLeft)
                        {
                            addWarpComponent(0, bottom, middle, 16);
                        }
                        if (warp.BottomRight)
                        {
                            addWarpComponent(middle, bottom, right - middle, 16);
                        }

                        if (!warp.TopLeft && !warp.TopRight && !warp.BottomLeft && !warp.BottomRight)
                        {
                            addWarpComponent(0, 16 * 13, Room.Width * 16, 32);
                        }
                    }
                    else if (warp.WarpSourceType == WarpSourceType.Pointed)
                    {
                        addWarpComponent(warp.SourceX * TileWidth, warp.SourceY * TileHeight, TileWidth, TileHeight);
                    }
                    index++;
                }
            }

            if (ViewChests)
            {
                if (Room.Chest != null)
                {
                    ChestRoomComponent com = new ChestRoomComponent(Room.Chest);
                    roomComponents.Add(com);
                }
            }


addedAllComponents:
            // The "selectedComponent" now refers to an old object. Look for the corresponding new
            // object.
            RoomComponent newSelectedComponent = null;

            foreach (RoomComponent com in roomComponents)
            {
                if (com.Compare(selectedComponent))
                {
                    newSelectedComponent = com;
                    break;
                }
            }

            selectedComponent = newSelectedComponent;

            QueueDraw();
        }