public DungeonEditorImplementation(PluginManager manager) { this.manager = manager; Box tmpBox, tmpBox2; Alignment tmpAlign; Box vbox = new Gtk.VBox(); vbox.Spacing = 3; Box hbox = new Gtk.HBox(); hbox.Spacing = 3; dungeonVreContainer = new Gtk.VBox(); roomVreContainer = new Gtk.VBox(); dungeonVre = null; roomVre = null; Alignment frame = new Alignment(0, 0, 0, 0); dungeonSpinButton = new SpinButton(0, 15, 1); floorSpinButton = new SpinButton(0, 15, 1); roomSpinButton = new SpinButtonHexadecimal(0, 255, 1); roomSpinButton.Digits = 2; dungeonSpinButton.ValueChanged += (a, b) => { DungeonChanged(); }; floorSpinButton.ValueChanged += (a, b) => { DungeonChanged(); }; frame.Add(vbox); tmpBox = new Gtk.HBox(); tmpBox.Add(new Gtk.Label("Dungeon ")); tmpBox.Add(dungeonSpinButton); tmpBox.Add(new Gtk.Label("Floor ")); tmpBox.Add(floorSpinButton); tmpAlign = new Alignment(0, 0, 0, 0); tmpAlign.Add(tmpBox); vbox.Add(tmpAlign); vbox.Add(hbox); // Leftmost column tmpBox = new VBox(); tmpBox.Add(dungeonVreContainer); var addFloorAboveButton = new Button("Add Floor Above"); addFloorAboveButton.Image = new Gtk.Image(Gtk.Stock.Add, Gtk.IconSize.Button); addFloorAboveButton.Clicked += (a, b) => { int floorIndex = floorSpinButton.ValueAsInt + 1; (minimap.Map as Dungeon).InsertFloor(floorIndex); DungeonChanged(); floorSpinButton.Value = floorIndex; }; tmpAlign = new Gtk.Alignment(0.5f, 0, 0, 0); tmpAlign.Add(addFloorAboveButton); tmpBox.Add(tmpAlign); var addFloorBelowButton = new Button("Add Floor Below"); addFloorBelowButton.Image = new Gtk.Image(Gtk.Stock.Add, Gtk.IconSize.Button); addFloorBelowButton.Clicked += (a, b) => { int floorIndex = floorSpinButton.ValueAsInt; (minimap.Map as Dungeon).InsertFloor(floorIndex); DungeonChanged(); }; tmpAlign = new Gtk.Alignment(0.5f, 0, 0, 0); tmpAlign.Add(addFloorBelowButton); tmpBox.Add(tmpAlign); var removeFloorButton = new Button("Remove Floor"); removeFloorButton.Image = new Gtk.Image(Gtk.Stock.Remove, Gtk.IconSize.Button); removeFloorButton.Clicked += (a, b) => { Dungeon dungeon = minimap.Map as Dungeon; if (dungeon.NumFloors <= 1) { return; } Gtk.MessageDialog d = new MessageDialog(null, DialogFlags.DestroyWithParent, MessageType.Warning, ButtonsType.YesNo, "Really delete this floor?"); var response = (ResponseType)d.Run(); d.Dispose(); if (response == Gtk.ResponseType.Yes) { dungeon.RemoveFloor(floorSpinButton.ValueAsInt); DungeonChanged(); } }; tmpAlign = new Gtk.Alignment(0.5f, 0, 0, 0); tmpAlign.Add(removeFloorButton); tmpBox.Add(tmpAlign); hbox.Add(tmpBox); // Middle column (minimap) minimap = new Minimap(); minimap.AddTileSelectedHandler((sender, index) => { RoomChanged(); }); hbox.Add(minimap); // Rightmost column tmpAlign = new Alignment(0, 0, 0, 0); tmpAlign.Add(roomVreContainer); tmpBox2 = new HBox(); tmpBox2.Add(new Gtk.Label("Room ")); roomSpinButton.ValueChanged += (a, b) => { (minimap.Map as Dungeon).SetRoom(minimap.SelectedX, minimap.SelectedY, minimap.Floor, roomSpinButton.ValueAsInt); }; tmpBox2.Add(roomSpinButton); tmpBox = new VBox(); tmpBox.Add(tmpBox2); tmpBox.Add(tmpAlign); hbox.Add(tmpBox); Map map = manager.GetActiveMap(); if (map is Dungeon) { dungeonSpinButton.Value = (map as Dungeon).Index; } DungeonChanged(); dungeonEventWrapper.Bind <DungeonRoomChangedEventArgs>("RoomChangedEvent", (sender, args) => RoomChanged()); vbox.Destroyed += (a, b) => dungeonEventWrapper.UnbindAll(); this.Add(frame); ShowAll(); }