doors { name: "Repetitive Entrance" type: STANDARD receivers: "Components/Doors/entry_3" panels { room: "Main Area" name: "ASTOUNDING" } panels { room: "Main Area" name: "INFLEXIBLE" } panels { room: "Main Area" name: "AMONG" } location_room: "Main Area" } doors { name: "Symbolic Entrance" type: ITEM_ONLY receivers: "Components/Doors/entry_2" panels { room: "Main Area" name: "ASTOUNDING" } panels { room: "Main Area" name: "INFLEXIBLE" } panels { room: "Main Area" name: "AMONG" } } doors { name: "Sirenic Entrance" type: ITEM_ONLY receivers: "Components/Doors/entry_8" panels { room: "Main Area" name: "ASTOUNDING" } panels { room: "Main Area" name: "INFLEXIBLE" } panels { room: "Main Area" name: "AMONG" } } doors { name: "Turtle Entrance" type: STANDARD receivers: "Components/Doors/entry_1" panels { room: "Main Area" name: "COURTYARD" } location_room: "Main Area" } doors { name: "Top Left Door" type: STANDARD receivers: "Components/Doors/entry_6" panels { room: "Center Room" name: "REPORTER" } panels { room: "Center Room" name: "BIRD" } panels { room: "Center Room" name: "FOX" } panels { room: "Center Room" name: "JUDGE" } panels { room: "Center Room" name: "DENTIST" } panels { room: "Center Room" name: "SQUIRREL" } location_room: "Center Room" location_name: "First Room" } doors { name: "Top Right Door" type: ITEM_ONLY receivers: "Components/Doors/entry_7" panels { room: "Center Room" name: "REPORTER" } panels { room: "Center Room" name: "BIRD" } panels { room: "Center Room" name: "FOX" } panels { room: "Center Room" name: "JUDGE" } panels { room: "Center Room" name: "DENTIST" } panels { room: "Center Room" name: "SQUIRREL" } } doors { name: "Bottom Left Door" type: ITEM_ONLY receivers: "Components/Doors/entry_5" panels { room: "Center Room" name: "REPORTER" } panels { room: "Center Room" name: "BIRD" } panels { room: "Center Room" name: "FOX" } panels { room: "Center Room" name: "JUDGE" } panels { room: "Center Room" name: "DENTIST" } panels { room: "Center Room" name: "SQUIRREL" } } doors { name: "Bottom Right Door" type: ITEM_ONLY receivers: "Components/Doors/entry_4" panels { room: "Center Room" name: "REPORTER" } panels { room: "Center Room" name: "BIRD" } panels { room: "Center Room" name: "FOX" } panels { room: "Center Room" name: "JUDGE" } panels { room: "Center Room" name: "DENTIST" } panels { room: "Center Room" name: "SQUIRREL" } } doors { name: "Top Left Puzzles" type: LOCATION_ONLY panels { room: "Top Left Room" name: "BARE SOD" } panels { room: "Top Left Room" name: "SOD" } panels { room: "Top Left Room" name: "BARE" } panels { room: "Top Left Room" name: "KNOT TECTONIC" } panels { room: "Top Left Room" name: "TECTONIC" } panels { room: "Top Left Room" name: "KNOT" } panels { room: "Top Left Room" name: "SURE TEMPER" } panels { room: "Top Left Room" name: "TEMPER" } panels { room: "Top Left Room" name: "SURE" } panels { room: "Top Left Room" name: "BACKPACK SILVER" } panels { room: "Top Left Room" name: "COLOR (2)" } panels { room: "Top Left Room" name: "SILVER" } panels { room: "Top Left Room" name: "BACKPACK" } panels { room: "Top Left Room" name: "COLOR WHOLE" } panels { room: "Top Left Room" name: "WHOLE" } panels { room: "Top Left Room" name: "COLOR (1)" } panels { room: "Top Left Room" name: "CHILL BEAR" } panels { room: "Top Left Room" name: "BEAR" } panels { room: "Top Left Room" name: "CHILL" } panels { room: "Top Left Room" name: "SURE TEMPER BACKPACK SILVER" } panels { room: "Top Left Room" name: "KNOT TECTONIC BARE SOD" } panels { room: "Top Left Room" name: "COLOR WHOLE CHILL BEAR" } location_room: "Top Left Room" } doors { name: "Top Right Puzzles" type: LOCATION_ONLY panels { room: "Top Right Room" name: "RIGHT WING" } panels { room: "Top Right Room" name: "WING" } panels { room: "Top Right Room" name: "RIGHT" } panels { room: "Top Right Room" name: "TYPIST BEAR" } panels { room: "Top Right Room" name: "BEAR" } panels { room: "Top Right Room" name: "TYPIST" } panels { room: "Top Right Room" name: "HALVES ANNOYED" } panels { room: "Top Right Room" name: "ANNOYED" } panels { room: "Top Right Room" name: "HALVES" } panels { room: "Top Right Room" name: "SOUR GOOD" } panels { room: "Top Right Room" name: "GOOD" } panels { room: "Top Right Room" name: "SOUR" } panels { room: "Top Right Room" name: "HOLE TIME" } panels { room: "Top Right Room" name: "TIME" } panels { room: "Top Right Room" name: "HOLE" } panels { room: "Top Right Room" name: "KNOT CHEF" } panels { room: "Top Right Room" name: "CHEF" } panels { room: "Top Right Room" name: "KNOT" } panels { room: "Top Right Room" name: "HALVES ANNOYED SOUR GOOD" } panels { room: "Top Right Room" name: "TYPIST BEAR RIGHT WING" } panels { room: "Top Right Room" name: "KNOT CHEF HOLE TIME" } location_room: "Top Right Room" } doors { name: "Bottom Left Puzzles" type: LOCATION_ONLY panels { room: "Bottom Left Room" name: "SHELL (1)" } panels { room: "Bottom Left Room" name: "SHELL (2)" } panels { room: "Bottom Left Room" name: "SHELL (3)" } panels { room: "Bottom Left Room" name: "SHELL (4)" } panels { room: "Bottom Left Room" name: "SHELL (5)" } panels { room: "Bottom Left Room" name: "SHELL (6)" } location_room: "Bottom Left Room" } doors { name: "Bottom Right Puzzles" type: LOCATION_ONLY panels { room: "Bottom Right Room" name: "FLY" } panels { room: "Bottom Right Room" name: "DECLOG" } panels { room: "Bottom Right Room" name: "SWING" } panels { room: "Bottom Right Room" name: "HIBERNATE" } panels { room: "Bottom Right Room" name: "HONEY" } panels { room: "Bottom Right Room" name: "INJECT" } location_room: "Bottom Right Room" } doors { name: "Mastery" type: EVENT panels { room: "Top Left Room" name: "BARE SOD" } panels { room: "Top Left Room" name: "SOD" } panels { room: "Top Left Room" name: "BARE" } panels { room: "Top Left Room" name: "KNOT TECTONIC" } panels { room: "Top Left Room" name: "TECTONIC" } panels { room: "Top Left Room" name: "KNOT" } panels { room: "Top Left Room" name: "SURE TEMPER" } panels { room: "Top Left Room" name: "TEMPER" } panels { room: "Top Left Room" name: "SURE" } panels { room: "Top Left Room" name: "BACKPACK SILVER" } panels { room: "Top Left Room" name: "COLOR (2)" } panels { room: "Top Left Room" name: "SILVER" } panels { room: "Top Left Room" name: "BACKPACK" } panels { room: "Top Left Room" name: "COLOR WHOLE" } panels { room: "Top Left Room" name: "WHOLE" } panels { room: "Top Left Room" name: "COLOR (1)" } panels { room: "Top Left Room" name: "CHILL BEAR" } panels { room: "Top Left Room" name: "BEAR" } panels { room: "Top Left Room" name: "CHILL" } panels { room: "Top Left Room" name: "SURE TEMPER BACKPACK SILVER" } panels { room: "Top Left Room" name: "KNOT TECTONIC BARE SOD" } panels { room: "Top Left Room" name: "COLOR WHOLE CHILL BEAR" } panels { room: "Top Right Room" name: "RIGHT WING" } panels { room: "Top Right Room" name: "WING" } panels { room: "Top Right Room" name: "RIGHT" } panels { room: "Top Right Room" name: "TYPIST BEAR" } panels { room: "Top Right Room" name: "BEAR" } panels { room: "Top Right Room" name: "TYPIST" } panels { room: "Top Right Room" name: "HALVES ANNOYED" } panels { room: "Top Right Room" name: "ANNOYED" } panels { room: "Top Right Room" name: "HALVES" } panels { room: "Top Right Room" name: "SOUR GOOD" } panels { room: "Top Right Room" name: "GOOD" } panels { room: "Top Right Room" name: "SOUR" } panels { room: "Top Right Room" name: "HOLE TIME" } panels { room: "Top Right Room" name: "TIME" } panels { room: "Top Right Room" name: "HOLE" } panels { room: "Top Right Room" name: "KNOT CHEF" } panels { room: "Top Right Room" name: "CHEF" } panels { room: "Top Right Room" name: "KNOT" } panels { room: "Top Right Room" name: "HALVES ANNOYED SOUR GOOD" } panels { room: "Top Right Room" name: "TYPIST BEAR RIGHT WING" } panels { room: "Top Right Room" name: "KNOT CHEF HOLE TIME" } panels { room: "Bottom Left Room" name: "SHELL (1)" } panels { room: "Bottom Left Room" name: "SHELL (2)" } panels { room: "Bottom Left Room" name: "SHELL (3)" } panels { room: "Bottom Left Room" name: "SHELL (4)" } panels { room: "Bottom Left Room" name: "SHELL (5)" } panels { room: "Bottom Left Room" name: "SHELL (6)" } panels { room: "Bottom Right Room" name: "FLY" } panels { room: "Bottom Right Room" name: "DECLOG" } panels { room: "Bottom Right Room" name: "SWING" } panels { room: "Bottom Right Room" name: "HIBERNATE" } panels { room: "Bottom Right Room" name: "HONEY" } panels { room: "Bottom Right Room" name: "INJECT" } } c { color: #008800; font-weight: bold } /* Keyword.Constant */ .highlight .kd { color: #008800; font-weight: bold } /* Keyword.Declaration */ .highlight .kn { color: #008800; font-weight: bold } /* Keyword.Namespace */ .highlight .kp { color: #008800 } /* Keyword.Pseudo */ .highlight .kr { color: #008800; font-weight: bold } /* Keyword.Reserved */ .highlight .kt { color: #888888; font-weight: bold } /* Keyword.Type */ .highlight .m { color: #0000DD; font-weight: bold } /* Literal.Number */ .highlight .s { color: #dd2200; background-color: #fff0f0 } /* Literal.String */ .highlight .na { color: #336699 } /* Name.Attribute */ .highlight .nb { color: #003388 } /* Name.Builtin */ .highlight .nc { color: #bb0066; font-weight: bold } /* Name.Class */ .highlight .no { color: #003366; font-weight: bold } /* Name.Constant */ .highlight .nd { color: #555555 } /* Name.Decorator */ .highlight .ne { color: #bb0066; font-weight: bold } /* Name.Exception */ .highlight .nf { color: #0066bb; font-weight: bold } /* Name.Function */ .highlight .nl { color: #336699; font-style: italic } /* Name.Label */ .highlight .nn { color: #bb0066; font-weight: bold } /* Name.Namespace */ .highlight .py { color: #336699; font-weight: bold } /* Name.Property */ .highlight .nt { color: #bb0066; font-weight: bold } /* Name.Tag */ .highlight .nv { color: #336699 } /* Name.Variable */ .highlight .ow { color: #008800 } /* Operator.Word */ .highlight .w { color: #bbbbbb } /* Text.Whitespace */ .highlight .mb { color: #0000DD; font-weight: bold } /* Literal.Number.Bin */ .highlight .mf { color: #0000DD; font-weight: bold } /* Literal.Number.Float */ .highlight .mh { color: #0000DD; font-weight: bold } /* Literal.Number.Hex */ .highlight .mi { color: #0000DD; font-weight: bold } /* Literal.Number.Integer */ .highlight .mo { color: #0000DD; font-weight: bold } /* Literal.Number.Oct */ .highlight .sa { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Affix */ .highlight .sb { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Backtick */ .highlight .sc { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Char */ .highlight .dl { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Delimiter */ .highlight .sd { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Doc */ .highlight .s2 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Double */ .highlight .se { color: #0044dd; background-color: #fff0f0 } /* Literal.String.Escape */ .highlight .sh { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Heredoc */ .highlight .si { color: #3333bb; background-color: #fff0f0 } /* Literal.String.Interpol */ .highlight .sx { color: #22bb22; background-color: #f0fff0 } /* Literal.String.Other */ .highlight .sr { color: #008800; background-color: #fff0ff } /* Literal.String.Regex */ .highlight .s1 { color: #dd2200; background-color: #fff0f0 } /* Literal.String.Single */ .highlight .ss { color: #aa6600; background-color: #fff0f0 } /* Literal.String.Symbol */ .highlight .bp { color: #003388 } /* Name.Builtin.Pseudo */ .highlight .fm { color: #0066bb; font-weight: bold } /* Name.Function.Magic */ .highlight .vc { color: #336699 } /* Name.Variable.Class */ .highlight .vg { color: #dd7700 } /* Name.Variable.Global */ .highlight .vi { color: #3333bb } /* Name.Variable.Instance */ .highlight .vm { color: #336699 } /* Name.Variable.Magic */ .highlight .il { color: #0000DD; font-weight: bold } /* Literal.Number.Integer.Long */
#ifndef FRAME_H
#define FRAME_H

#include <wx/wxprec.h>

#ifndef WX_PRECOMP
#include <wx/wx.h>
#endif

#include <list>
#include <wx/notebook.h>
#include <memory>
#include <wx/treectrl.h>
#include <wx/splitter.h>

class Map;
class MapeditWidget;
class TileWidget;
class Undoable;
class UndoableTextBox;

#include "world.h"

class MapeditFrame : public wxFrame {
  public:
    MapeditFrame() {}
    MapeditFrame(World* world);
    ~MapeditFrame() { delete world; }
    
    MapeditWidget* GetMapEditor();
    void SetIsAddingEntity(bool isAddingEntity);
    void MapDirtyDidChange(bool dirty);
    void SetIsSettingStart(bool isSettingStart);
    
    static void NewWorld();
    static bool OpenWorld(std::string filename);
    
    std::list<wxWindow*>::iterator closer;

    static void LaunchWindow(World* world);
    void populateMapTree(wxTreeItemId node, std::list<std::shared_ptr<Map>> maps);
    void SelectMap(Map* map);
    wxTreeItemId MoveTreeNode(wxTreeItemId toCopy, wxTreeItemId newParent);
    void SetStartposLabel();
      
    void ZoomIn(wxCommandEvent& event);
    void ZoomOut(wxCommandEvent& event);
    void OnNew(wxCommandEvent& event);
    void OnOpen(wxCommandEvent& event);
    void OnSave(wxCommandEvent& event);
    void OnClose(wxCommandEvent& event);
    void OnExit(wxCloseEvent& event);
    void OnQuit(wxCommandEvent& event);
    void OnTitleChange(wxCommandEvent& event);
    void OnTabChange(wxBookCtrlEvent& event);
    void OnTabChanging(wxBookCtrlEvent& event);
    void OnAddEntity(wxCommandEvent& event);
    void OnCancelAddEntity(wxCommandEvent& event);
    void OnAddRoot(wxCommandEvent& event);
    void OnAddChild(wxCommandEvent& event);
    void OnDidSelectMap(wxTreeEvent& event);
    void OnWillDragMap(wxTreeEvent& event);
    void OnDidDragMap(wxTreeEvent& event);
    void OnRightClickTree(wxTreeEvent& event);
    void OnSetStartpos(wxCommandEvent& event);
    void OnCancelSetStartpos(wxCommandEvent& event);
    void OnOneMovingSash(wxSplitterEvent& event);
    void OnThreeMovingSash(wxSplitterEvent& event);
    void OnSetLeftmapType(wxCommandEvent& event);
    void OnSetLeftmapMap(wxCommandEvent& event);
    void OnSetRightmapType(wxCommandEvent& event);
    void OnSetRightmapMap(wxCommandEvent& event);
    void OnSetUpmapType(wxCommandEvent& event);
    void OnSetUpmapMap(wxCommandEvent& event);
    void OnSetDownmapType(wxCommandEvent& event);
    void OnSetDownmapMap(wxCommandEvent& event);
    void OnSelectEntity(wxCommandEvent& event);
    
    World* world;
    Map* currentMap;
    
    MapeditWidget* mapEditor;
    TileWidget* tileEditor;
    wxToolBar* toolbar;
    wxMenu* menuFile;
    wxSplitterWindow* layout1;
    wxSplitterWindow* layout3;
    wxPanel* propertyEditor;
    
    // Notebook
    wxNotebook* notebook;
    wxChoice* entityTypeBox;
    wxButton* addEntityButton;
    wxButton* cancelEntityButton;

    // Map tree
    wxTreeCtrl* mapTree;
    wxTreeItemId dragMap;
    wxMenu* mapTreePopup;
    bool dontSelectMap = false;
    
    // Property editor
    UndoableTextBox* titleBox;
    wxString prevTitle;
    wxStaticText* startposLabel;
    wxButton* setStartposButton;
    wxButton* cancelStartposButton;
    
    // Undo stuff
    wxMenu* menuEdit;
    std::list<std::shared_ptr<Undoable>> history;
    std::list<std::shared_ptr<Undoable>>::iterator currentAction {begin(history)};
    void OnUndo(wxCommandEvent& event);
    void OnRedo(wxCommandEvent& event);
    void UpdateUndoLabels();
    void commitAction(std::shared_ptr<Undoable> action);
    void commitAfter(std::shared_ptr<Undoable> action);
    
    bool addingEntity = false;
    
  private:
    wxDECLARE_EVENT_TABLE();
};

#endif