Beispiel #1
0
        public Minimap()
        {
            Selectable    = true;
            SelectedIndex = 0;

            dungeonEventWrapper.Bind <DungeonRoomChangedEventArgs>("RoomChangedEvent", OnDungeonRoomChanged);
            dungeonEventWrapper.Bind <EventArgs>("FloorsChangedEvent", OnDungeonFloorsChanged);
        }
Beispiel #2
0
    void SetTileset(Tileset tileset)
    {
        if (Project == null)
        {
            return;
        }
        if (tileset == tilesetViewer1.Tileset)
        {
            return;
        }

        eventGroup.Lock();

        tilesetViewer1.SetTileset(tileset);
        ActiveRoom.TilesetIndex = tileset.Index;

        if (tilesetModifiedEventWrapper == null)
        {
            tilesetModifiedEventWrapper = new WeakEventWrapper <ValueReferenceGroup>();
            tilesetModifiedEventWrapper.Bind <ValueModifiedEventArgs>("ModifiedEvent",
                                                                      (sender, args) => UpdateLayoutGroupWarning());
        }
        tilesetModifiedEventWrapper.ReplaceEventSource(tileset.GetValueReferenceGroup());

        eventGroup.Unlock();

        UpdateLayoutGroupWarning();
    }
Beispiel #3
0
    // Called when room index (or season) is changed
    void OnRoomChanged()
    {
        if (ActiveRoom == null)
        {
            return;
        }

        eventGroup.Lock();

        roomSpinButton.Value = ActiveRoom.Index;
        warpEditor.SetMap(ActiveRoom.Index >> 8, ActiveRoom.Index & 0xff);
        SetTileset(ActiveRoomLayout.Tileset);

        if (roomVre == null)
        {
            // This only runs once
            roomVre = new ValueReferenceEditor(Project, ActiveRoom.ValueReferenceGroup);
            roomVre.AddWidgetToRight("Tileset", editTilesetButton);
            roomVreHolder.Add(roomVre);
            roomVre.ShowAll();

            roomTilesetModifiedEventWrapper.Bind <ValueModifiedEventArgs>("ModifiedEvent",
                                                                          (sender, args) => SetTileset((sender as ValueReference).GetIntValue(), ActiveSeason));
        }
        else
        {
            roomVre.ReplaceValueReferenceGroup(ActiveRoom.ValueReferenceGroup);
        }

        // Watch for changes to this room's tileset
        roomTilesetModifiedEventWrapper.ReplaceEventSource(ActiveRoom.ValueReferenceGroup["Tileset"]);

        // Watch for changes to the chest

        UpdateChestData();

        eventGroup.Unlock();

        UpdateLayoutGroupWarning();
    }
Beispiel #4
0
        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();
        }
Beispiel #5
0
    public MainWindow(string directory)
    {
        log.Debug("Beginning Program");

        Gtk.Window.DefaultIcon = new Gdk.Pixbuf(Helper.GetResourceStream("LynnaLab.icon.ico"));

        Gtk.Builder builder = new Builder();
        builder.AddFromString(Helper.ReadResourceFile("LynnaLab.Glade.MainWindow.ui"));
        builder.Autoconnect(this);

        mainWindow                 = (builder.GetObject("mainWindow") as Gtk.Window);
        menubar1                   = (Gtk.MenuBar)builder.GetObject("menubar1");
        editMenuItem               = (Gtk.MenuItem)builder.GetObject("editMenuItem");
        actionMenuItem             = (Gtk.MenuItem)builder.GetObject("actionMenuItem");
        debugMenuItem              = (Gtk.MenuItem)builder.GetObject("debugMenuItem");
        minimapNotebook            = (Gtk.Notebook)builder.GetObject("minimapNotebook");
        contextNotebook            = (Gtk.Notebook)builder.GetObject("contextNotebook");
        worldSpinButton            = (Gtk.SpinButton)builder.GetObject("worldSpinButton");
        viewObjectsCheckButton     = (Gtk.CheckButton)builder.GetObject("viewObjectsCheckButton");
        viewWarpsCheckButton       = (Gtk.CheckButton)builder.GetObject("viewWarpsCheckButton");
        darkenDungeonRoomsCheckbox = (Gtk.CheckButton)builder.GetObject("darkenDungeonRoomsCheckbox");
        dungeonSpinButton          = (Gtk.SpinButton)builder.GetObject("dungeonSpinButton");
        floorSpinButton            = (Gtk.SpinButton)builder.GetObject("floorSpinButton");
        roomVreHolder              = (Gtk.Box)builder.GetObject("roomVreHolder");
        chestAddHolder             = (Gtk.Box)builder.GetObject("chestAddHolder");
        chestEditorBox             = (Gtk.Box)builder.GetObject("chestEditorBox");
        chestVreHolder             = (Gtk.Box)builder.GetObject("chestVreHolder");
        treasureVreHolder          = (Gtk.Box)builder.GetObject("treasureVreHolder");
        nonExistentTreasureHolder  = (Gtk.Box)builder.GetObject("nonExistentTreasureHolder");
        overallEditingContainer    = (Gtk.Box)builder.GetObject("overallEditingContainer");
        treasureDataFrame          = (Gtk.Widget)builder.GetObject("treasureDataFrame");
        treasureDataLabel          = (Gtk.Label)builder.GetObject("treasureDataLabel");

        editTilesetButton          = new Gtk.Button("Edit");
        editTilesetButton.Clicked += OnTilesetEditorButtonClicked;

        roomSpinButton        = new SpinButtonHexadecimal();
        roomSpinButton.Digits = 3;
        objectgroupeditor1    = new ObjectGroupEditor();
        tilesetViewer1        = new TilesetViewer();
        roomeditor1           = new RoomEditor();
        worldMinimap          = new HighlightingMinimap();
        dungeonMinimap        = new Minimap();
        warpEditor            = new WarpEditor(this);
        statusbar1            = new PriorityStatusbar();
        seasonComboBox        = new ComboBoxFromConstants(showHelp: false);
        seasonComboBox.SpinButton.Adjustment.Upper = 3;

        ((Gtk.Box)builder.GetObject("roomSpinButtonHolder")).Add(roomSpinButton);
        ((Gtk.Box)builder.GetObject("objectGroupEditorHolder")).Add(objectgroupeditor1);
        ((Gtk.Box)builder.GetObject("tilesetViewerHolder")).Add(tilesetViewer1);
        ((Gtk.Box)builder.GetObject("roomEditorHolder")).Add(roomeditor1);
        ((Gtk.Box)builder.GetObject("worldMinimapHolder")).Add(worldMinimap);
        ((Gtk.Box)builder.GetObject("dungeonMinimapHolder")).Add(dungeonMinimap);
        ((Gtk.Box)builder.GetObject("warpEditorHolder")).Add(warpEditor);
        ((Gtk.Box)builder.GetObject("statusbarHolder")).Add(statusbar1);
        ((Gtk.Box)builder.GetObject("seasonComboBoxHolder")).Add(seasonComboBox);

        mainWindow.Title = "LynnaLab " + Helper.ReadResourceFile("LynnaLab.version.txt");

        roomeditor1.Scale             = 2;
        roomeditor1.TilesetViewer     = tilesetViewer1;
        roomeditor1.ObjectGroupEditor = objectgroupeditor1;
        roomeditor1.WarpEditor        = warpEditor;

        eventGroup.Lock();


        // Event handlers from widgets

        roomSpinButton.ValueChanged += eventGroup.Add(OnRoomSpinButtonValueChanged);

        worldSpinButton.ValueChanged   += eventGroup.Add(OnWorldSpinButtonValueChanged);
        dungeonSpinButton.ValueChanged += eventGroup.Add(OnDungeonSpinButtonValueChanged);
        floorSpinButton.ValueChanged   += eventGroup.Add(OnFloorSpinButtonValueChanged);
        seasonComboBox.Changed         += eventGroup.Add(OnSeasonComboBoxChanged);
        minimapNotebook.SwitchPage     += new SwitchPageHandler(eventGroup.Add <SwitchPageArgs>(OnMinimapNotebookSwitchPage));
        contextNotebook.SwitchPage     += new SwitchPageHandler(eventGroup.Add <SwitchPageArgs>(OnContextNotebookSwitchPage));

        roomeditor1.RoomChangedEvent += eventGroup.Add <RoomChangedEventArgs>((sender, args) => {
            eventGroup.Lock();
            OnRoomChanged();

            // Only update minimap if the room editor did a "follow warp". Otherwise, we'll decide
            // whether to update the minimap from whatever code changed the room.
            if (args.fromFollowWarp)
            {
                UpdateMinimapFromRoom(args.fromFollowWarp);
            }

            eventGroup.Unlock();
        });

        dungeonMinimap.AddTileSelectedHandler(eventGroup.Add <int>(delegate(object sender, int index) {
            OnMinimapTileSelected(sender, dungeonMinimap.SelectedIndex);
        }));
        worldMinimap.AddTileSelectedHandler(eventGroup.Add <int>(delegate(object sender, int index) {
            OnMinimapTileSelected(sender, worldMinimap.SelectedIndex);
        }));

        tilesetViewer1.HoverChangedEvent += eventGroup.Add <int>((sender, tile) => {
            if (tilesetViewer1.HoveringIndex != -1)
            {
                statusbar1.Set((uint)StatusbarMessage.TileHovering,
                               "Hovering Tile: 0x" + tilesetViewer1.HoveringIndex.ToString("X2"));
            }
            else
            {
                statusbar1.RemoveAll((uint)StatusbarMessage.TileHovering);
            }
        });
        tilesetViewer1.AddTileSelectedHandler(eventGroup.Add <int>(delegate(object sender, int index) {
            statusbar1.RemoveAll((uint)StatusbarMessage.TileHovering);
            statusbar1.Set((uint)StatusbarMessage.TileSelected, "Selected Tile: 0x" + index.ToString("X2"));
        }));

        roomeditor1.HoverChangedEvent += eventGroup.Add <int>((sender, tile) => {
            if (roomeditor1.HoveringIndex != -1)
            {
                statusbar1.Set((uint)StatusbarMessage.TileHovering, string.Format(
                                   "Hovering Pos: {0},{1} (${1:X}{0:X})", roomeditor1.HoveringX, roomeditor1.HoveringY));
            }
            else
            {
                statusbar1.RemoveAll((uint)StatusbarMessage.TileHovering);
            }
        });
        roomeditor1.WarpDestEditModeChangedEvent += eventGroup.Add <bool>((sender, activated) => {
            if (activated)
            {
                statusbar1.Set((uint)StatusbarMessage.WarpDestEditMode,
                               "Entered warp destination editing mode. To exit this mode, right-click on the warp destination and select \"Done\".");
            }
            else
            {
                statusbar1.RemoveAll((uint)StatusbarMessage.WarpDestEditMode);
            }
        });
        statusbar1.Set((uint)StatusbarMessage.TileSelected, "Selected Tile: 0x00");

        OnDarkenDungeonRoomsCheckboxToggled(null, null);


        // Event handlers from underlying data

        chestEventWrapper.Bind <ValueModifiedEventArgs>("ModifiedEvent", (sender, args) => UpdateChestData());
        chestEventWrapper.Bind <EventArgs>("DeletedEvent", (sender, args) => UpdateChestData());


        // Load "plugins"

        pluginCore = new PluginCore(this);
        LoadPlugins();

        mainWindow.ShowAll();

        eventGroup.UnlockAndClear();


        overallEditingContainer.Sensitive = false;

        if (directory != "")
        {
            OpenProject(directory);
        }
    }