def __init__(self, parent, project=None,
                 size=(650, 550),
                 style=wx.NO_BORDER):

        wx.Panel.__init__(self, parent, -1,
                          size=size,
                          style=style)
        self.SetBackgroundColour("white")
        iconCache = parent.app.iconCache
        # Setup sizer
        self.contentBox = wx.BoxSizer()
        self.SetSizer(self.contentBox)
        self.sizer = wx.BoxSizer(wx.VERTICAL)
        self.contentBox.Add(self.sizer, proportion=1, border=12, flag=wx.ALL | wx.EXPAND)
        # Head sizer
        self.headSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.sizer.Add(self.headSizer, border=0, flag=wx.EXPAND)
        # Icon
        self.icon = utils.ImageCtrl(self, bitmap=wx.Bitmap(), size=(128, 128))
        self.icon.SetBackgroundColour("#f2f2f2")
        self.icon.Bind(wx.EVT_FILEPICKER_CHANGED, self.updateProject)
        self.headSizer.Add(self.icon, border=6, flag=wx.ALL)
        self.icon.SetToolTip(_translate(
            "An image to represent this project, this helps it stand out when browsing on Pavlovia."
        ))
        # Title sizer
        self.titleSizer = wx.BoxSizer(wx.VERTICAL)
        self.headSizer.Add(self.titleSizer, proportion=1, flag=wx.EXPAND)
        # Title
        self.title = wx.TextCtrl(self,
                                 size=(-1, 30 if sys.platform == 'darwin' else -1),
                                 value="")
        self.title.Bind(wx.EVT_KILL_FOCUS, self.updateProject)
        self.title.SetFont(
            wx.Font(24, wx.FONTFAMILY_SWISS, wx.FONTSTYLE_NORMAL, wx.FONTWEIGHT_BOLD)
        )
        self.titleSizer.Add(self.title, border=6, flag=wx.ALL | wx.EXPAND)
        self.title.SetToolTip(_translate(
            "Title of the project. Unlike the project name, this isn't used as a filename anywhere; so you can "
            "add spaces, apostrophes and emojis to your heart's content! 🦕✨"
        ))
        # Author
        self.author = wx.StaticText(self, size=(-1, -1), label="by ---")
        self.titleSizer.Add(self.author, border=6, flag=wx.LEFT | wx.RIGHT)
        # Pavlovia link
        self.link = wxhl.HyperLinkCtrl(self, -1,
                                       label="https://pavlovia.org/",
                                       URL="https://pavlovia.org/",
                                       )
        self.link.SetBackgroundColour("white")
        self.titleSizer.Add(self.link, border=6, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM)
        self.link.SetToolTip(_translate(
            "Click to view the project in Pavlovia."
        ))
        # Button sizer
        self.btnSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.titleSizer.Add(self.btnSizer, flag=wx.EXPAND)
        # Star button
        self.starLbl = wx.StaticText(self, label="-")
        self.btnSizer.Add(self.starLbl, border=6, flag=wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL)
        self.starBtn = self.StarBtn(self, iconCache=iconCache)
        self.starBtn.Bind(wx.EVT_BUTTON, self.star)
        self.btnSizer.Add(self.starBtn, border=6, flag=wx.ALL | wx.EXPAND)
        self.starBtn.SetToolTip(_translate(
            "'Star' this project to get back to it easily. Projects you've starred will appear first in your searches "
            "and projects with more stars in total will appear higher in everyone's searches."
        ))
        # Fork button
        self.forkLbl = wx.StaticText(self, label="-")
        self.btnSizer.Add(self.forkLbl, border=6, flag=wx.LEFT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL)
        self.forkBtn = wx.Button(self, label=_translate("Fork"))
        self.forkBtn.SetBitmap(iconCache.getBitmap(name="fork", size=16))
        self.forkBtn.Bind(wx.EVT_BUTTON, self.fork)
        self.btnSizer.Add(self.forkBtn, border=6, flag=wx.ALL | wx.EXPAND)
        self.forkBtn.SetToolTip(_translate(
            "Create a copy of this project on your own Pavlovia account so that you can make changes without affecting "
            "the original project."
        ))
        # Create button
        self.createBtn = wx.Button(self, label=_translate("Create"))
        self.createBtn.SetBitmap(iconCache.getBitmap(name="plus", size=16))
        self.createBtn.Bind(wx.EVT_BUTTON, self.create)
        self.btnSizer.Add(self.createBtn, border=6, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL)
        self.createBtn.SetToolTip(_translate(
            "Create a Pavlovia project for the current experiment."
        ))
        # Sync button
        self.syncBtn = wx.Button(self, label=_translate("Sync"))
        self.syncBtn.SetBitmap(iconCache.getBitmap(name="view-refresh", size=16))
        self.syncBtn.Bind(wx.EVT_BUTTON, self.sync)
        self.btnSizer.Add(self.syncBtn, border=6, flag=wx.ALL | wx.EXPAND)
        self.syncBtn.SetToolTip(_translate(
            "Synchronise this project's local files with their online counterparts. This will 'pull' changes from "
            "Pavlovia and 'push' changes from your local files."
        ))
        # Get button
        self.downloadBtn = wx.Button(self, label=_translate("Download"))
        self.downloadBtn.SetBitmap(iconCache.getBitmap(name="download", size=16))
        self.downloadBtn.Bind(wx.EVT_BUTTON, self.sync)
        self.btnSizer.Add(self.downloadBtn, border=6, flag=wx.ALL | wx.EXPAND)
        self.downloadBtn.SetToolTip(_translate(
            "'Clone' this project, creating local copies of all its files and tracking any changes you make so that "
            "they can be applied when you next 'sync' the project."
        ))
        # Sync label
        self.syncLbl = wx.StaticText(self, size=(-1, -1), label="---")
        self.btnSizer.Add(self.syncLbl, border=6, flag=wx.RIGHT | wx.TOP | wx.BOTTOM | wx.ALIGN_CENTER_VERTICAL)
        self.syncLbl.SetToolTip(_translate(
            "Last synced at..."
        ))
        self.btnSizer.AddStretchSpacer(1)
        # Sep
        self.sizer.Add(wx.StaticLine(self, -1), border=6, flag=wx.EXPAND | wx.ALL)
        # Local root
        self.rootSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.sizer.Add(self.rootSizer, flag=wx.EXPAND)
        self.localRootLabel = wx.StaticText(self, label="Local root:")
        self.rootSizer.Add(self.localRootLabel, border=6, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
        self.localRoot = utils.FileCtrl(self, dlgtype="dir")
        self.localRoot.Bind(wx.EVT_FILEPICKER_CHANGED, self.updateProject)
        self.rootSizer.Add(self.localRoot, proportion=1, border=6, flag=wx.EXPAND | wx.LEFT | wx.RIGHT | wx.BOTTOM)
        self.localRoot.SetToolTip(_translate(
            "Folder in which local files are stored for this project. Changes to files in this folder will be tracked "
            "and applied to the project when you 'sync', so make sure the only files in this folder are relevant!"
        ))
        # Sep
        self.sizer.Add(wx.StaticLine(self, -1), border=6, flag=wx.EXPAND | wx.ALL)
        # Description
        self.description = wx.TextCtrl(self, size=(-1, -1), value="", style=wx.TE_MULTILINE)
        self.description.Bind(wx.EVT_KILL_FOCUS, self.updateProject)
        self.sizer.Add(self.description, proportion=1, border=6, flag=wx.ALL | wx.EXPAND)
        self.description.SetToolTip(_translate(
            "Description of the project to be shown on Pavlovia. Note: This is different than a README file!"
        ))
        # Sep
        self.sizer.Add(wx.StaticLine(self, -1), border=6, flag=wx.EXPAND | wx.ALL)
        # Visibility
        self.visSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.sizer.Add(self.visSizer, flag=wx.EXPAND)
        self.visLbl = wx.StaticText(self, label=_translate("Visibility:"))
        self.visSizer.Add(self.visLbl, border=6, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
        self.visibility = wx.Choice(self, choices=["Private", "Public"])
        self.visibility.Bind(wx.EVT_CHOICE, self.updateProject)
        self.visSizer.Add(self.visibility, proportion=1, border=6, flag=wx.EXPAND | wx.ALL)
        self.visibility.SetToolTip(_translate(
            "Visibility of the current project; whether its visible only to its creator (Private) or to any user "
            "(Public)."
        ))
        # Status
        self.statusSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.sizer.Add(self.statusSizer, flag=wx.EXPAND)
        self.statusLbl = wx.StaticText(self, label=_translate("Status:"))
        self.statusSizer.Add(self.statusLbl, border=6, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
        self.status = wx.Choice(self, choices=["Running", "Piloting", "Inactive"])
        self.status.Bind(wx.EVT_CHOICE, self.updateProject)
        self.statusSizer.Add(self.status, proportion=1, border=6, flag=wx.EXPAND | wx.ALL)
        self.status.SetToolTip(_translate(
            "Project status; whether it can be run to collect data (Running), run by its creator without saving "
            "data (Piloting) or cannot be run (Inactive)."
        ))
        # Tags
        self.tagSizer = wx.BoxSizer(wx.HORIZONTAL)
        self.sizer.Add(self.tagSizer, flag=wx.EXPAND)
        self.tagLbl = wx.StaticText(self, label=_translate("Keywords:"))
        self.tagSizer.Add(self.tagLbl, border=6, flag=wx.ALIGN_CENTER_VERTICAL | wx.ALL)
        self.tags = utils.ButtonArray(self, orient=wx.HORIZONTAL, items=[], itemAlias=_translate("tag"))
        self.tags.Bind(wx.EVT_LIST_INSERT_ITEM, self.updateProject)
        self.tags.Bind(wx.EVT_LIST_DELETE_ITEM, self.updateProject)
        self.tagSizer.Add(self.tags, proportion=1, border=6, flag=wx.EXPAND | wx.ALL)
        self.tags.SetToolTip(_translate(
            "Keywords associated with this project, helping others to find it. For example, if your experiment is "
            "useful to psychophysicists, you may want to add the keyword 'psychophysics'."
        ))
        # Populate
        if project is not None:
            project.refresh()
        self.project = project