def __OnShowDatabaseWizard(self, event): """ User wants to switch DB's or upgrade, or create a DB, or create a demo db. This can also be auto invoked by the application to let the user select a DB """ dlg = WelcomeDlg.WelcomeDlg(self) dlg.Centre() dlg.ShowModal() dlg.Destroy() if not db.engine.Get().IsOpened(): self.Close() return viewmgr.signalDbChange()
def __init__(self, *args, **kwds): kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) # create menu self.__menuBar = wx.MenuBar() self.SetMenuBar(self.__menuBar) # file menu mnu = wx.Menu() self.__menuShowDatabaseWizard = wx.MenuItem(mnu, wx.NewId(), "&Show Database Wizard ...", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuShowDatabaseWizard) self.__menuOptions = wx.MenuItem(mnu, wx.NewId(), "&Preferences ...", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuOptions) mnu.AppendSeparator() self.__menuExit = wx.MenuItem(mnu, wx.NewId(), "E&xit", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuExit) self.__menuBar.Append(mnu, "&File") # songs menu mnu = wx.Menu() self.__menuAddNewSong = wx.MenuItem(mnu, wx.NewId(), "&Add New ...\tCtrl+N", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuAddNewSong) self.__menuEditSong = wx.MenuItem(mnu, wx.NewId(), "&Edit ...\tCtrl+E", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuEditSong) self.__menuDeleteSong = wx.MenuItem(mnu, wx.NewId(), "&Delete\tCtrl+D", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuDeleteSong) # status submenu self.__menu_status_lookup = {} items = [ ("&In progress", songs.SS_STARTED), ("&Not Practicing", songs.SS_POSTPONED), ("&Completed!", songs.SS_COMPLETED) ] smnu = wx.Menu() for i in items: mi = wx.MenuItem(smnu, wx.NewId(), i[0], "", wx.ITEM_NORMAL) smnu.AppendItem(mi) self.__menu_status_lookup[mi.GetId()] = i[1] self.Bind(wx.EVT_MENU, self.__OnChangeStatus, mi) mnu.AppendSubMenu(smnu, "Set &Status To") self.__menuSongStatus = smnu self.__menuEditReset = wx.MenuItem(mnu, wx.NewId(), "Reset &History", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuEditReset) mnu.AppendSeparator() self.__menuEditCategories = wx.MenuItem(mnu, wx.NewId(), "Edit &Categories ...\tCtrl+Shift+C", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuEditCategories) self.__menuBar.Append(mnu, "&Song") # window layout menu mnu = wx.Menu() self.__menuRestoreLayout = wx.MenuItem(mnu, wx.NewId(), "&Restore Default Layout", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuRestoreLayout) mnu.AppendSeparator() self.__menuToggleEditView = wx.MenuItem(mnu, wx.NewId(), "Show &Editors", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuToggleEditView) self.__menuToggleSongSelect = wx.MenuItem(mnu, wx.NewId(), "Show &Song Selector", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuToggleSongSelect) self.__menuToggelSongFilter = wx.MenuItem(mnu, wx.NewId(), "Show Song &Filter", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuToggelSongFilter) mnu.AppendSeparator() self.__menuBrowserMode = wx.MenuItem(mnu, wx.NewId(), "&Browser Mode", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuBrowserMode) self.__menuEditorMode = wx.MenuItem(mnu, wx.NewId(), "Editor &Mode", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuEditorMode) self.__menuBar.Append(mnu, "&Windows") # attachments menu mnu = wx.Menu() self.__menuCreateAttachDir = wx.MenuItem(mnu, wx.NewId(), "&Create Folder ...", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuCreateAttachDir) mnu.AppendSeparator() self.__menuAddAttachments = wx.MenuItem(mnu, wx.NewId(), "&Add ...", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuAddAttachments) self.__menuEditAttachments = wx.MenuItem(mnu, wx.NewId(), "&Edit ...", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuEditAttachments) self.__menuRefreshAttachments = wx.MenuItem(mnu, wx.NewId(), "&Refresh", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuRefreshAttachments) self.__menuBar.Append(mnu, "&Attachments") # help menu mnu = wx.Menu() self.__menuHelpVisitSite = wx.MenuItem(mnu, wx.NewId(), "&Visit Site .. ", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuHelpVisitSite) mnu.AppendSeparator() self.__menuHelpAbout = wx.MenuItem(mnu, wx.NewId(), "&About ...", "", wx.ITEM_NORMAL) mnu.AppendItem(self.__menuHelpAbout) self.__menuBar.Append(mnu, "&Help") # set all properties self.SetTitle("Guitar Portfolio") self.Layout() self.Bind(wx.EVT_MENU, self.__OnShowDatabaseWizard, self.__menuShowDatabaseWizard) self.Bind(wx.EVT_MENU, self.__OnShowOptions, self.__menuOptions) self.Bind(wx.EVT_MENU, self.OnExit, self.__menuExit) self.Bind(wx.EVT_MENU, self.__OnAddNewSong, self.__menuAddNewSong) self.Bind(wx.EVT_MENU, self.__OnEditNewSong, self.__menuEditSong) self.Bind(wx.EVT_MENU, self.__OnDeleteSong, self.__menuDeleteSong) self.Bind(wx.EVT_MENU, self.__OnEditCategories, self.__menuEditCategories) self.Bind(wx.EVT_MENU, self.__OnRestoreLayout, self.__menuRestoreLayout) self.Bind(wx.EVT_MENU, self.__OnToggleEditWindow, self.__menuToggleEditView) self.Bind(wx.EVT_MENU, self.__OnToggleSongSelector, self.__menuToggleSongSelect) self.Bind(wx.EVT_MENU, self.__OnToggleFilterWindow, self.__menuToggelSongFilter) self.Bind(wx.EVT_MENU, self.__OnBrowserMode, self.__menuBrowserMode) self.Bind(wx.EVT_MENU, self.__OnEditorMode, self.__menuEditorMode) self.Bind(wx.EVT_MENU, self.__OnVisitSite, self.__menuHelpVisitSite) self.Bind(wx.EVT_MENU, self.__OnAbout, self.__menuHelpAbout) self.Bind(wx.EVT_MENU, self.__OnCreateAttachmentsDir, self.__menuCreateAttachDir) self.Bind(wx.EVT_MENU, self.__OnAddAttachments, self.__menuAddAttachments) self.Bind(wx.EVT_MENU, self.__OnEditAttachments, self.__menuEditAttachments) self.Bind(wx.EVT_MENU, self.__OnRefreshAttachments, self.__menuRefreshAttachments) self.SetIcon(wx.IconFromBitmap(icon_main_window.getBitmap())) self.Bind(wx.EVT_CLOSE, self.__OnClose) # tell AUI to manage this frame self.__aui = wx.aui.AuiManager() self.__aui.SetManagedWindow(self) # construct the left panels self.__aui.AddPane(SongsPanel.SongsPanel(parent = self), wx.aui.AuiPaneInfo(). Name("songspanel").Caption("Songs").MinSize(wx.Size(280,100)). BestSize(wx.Size(280, 200)).Left().MaximizeButton(True)) self.__aui.AddPane(SongFilterPanel.SongFilterPanel(self), wx.aui.AuiPaneInfo().Name("filterpanel").Caption("Filter"). MinSize(wx.Size(250,100)).BestSize(wx.Size(250, 100)).Left().MaximizeButton(True)) # construct the bottom panel self.__songEditNotebook = EditorNotebook.EditorNotebook(self) self.__aui.AddPane(self.__songEditNotebook, wx.aui.AuiPaneInfo(). Name("editpanel").Caption("Edit").MinSize(wx.Size(200,205)). Bottom().MaximizeButton(True)) # construct the middle part self.__aui.AddPane(CurrInfoNotebook.CurrInfoNotebook(self), wx.aui.AuiPaneInfo(). Name("currsong").Caption("Information"). CenterPane().CloseButton(False).MaximizeButton(True)) self.__aui.Update() self._filter = viewmgr.Get() # hook up event handlers Publisher().subscribe(self.__SignalOnQueryAddSong, viewmgr.SIGNAL_ADD_SONG) Publisher().subscribe(self.__SignalOnSongSelected, viewmgr.SIGNAL_SONG_SELECTED) Publisher().subscribe(self.__SignalOnQueryEditSong, viewmgr.SIGNAL_EDIT_SONG) Publisher().subscribe(self.__SignalOnQueryDeleteSong, viewmgr.SIGNAL_DELETE_SONG) Publisher().subscribe(self.__SignalOnSongUpdated, viewmgr.SIGNAL_SONG_UPDATED) Publisher().subscribe(self.__SignalOnQueryEditAttachments, viewmgr.SIGNAL_EDIT_LINKS) Publisher().subscribe(self.__SignalOnOpenEditInformation, viewmgr.SIGNAL_SHOW_EDIT_INFO) Publisher().subscribe(self.__SignalOnOpenEditLyrics, viewmgr.SIGNAL_SHOW_EDIT_LYRICS) Publisher().subscribe(self.__SignalOnOpenEditProgres, viewmgr.SIGNAL_SHOW_EDIT_PROGR) Publisher().subscribe(self.__SignalOnCreateLinksDir, viewmgr.SIGNAL_LINKS_DIR_CREATED) # dependent on the layout settings, we restore the old perspective, or save the default cfg = appcfg.Get() pers = cfg.Read(appcfg.CFG_LAYOUT_DEFAULT, '') if not pers: # save default for restoring pers = self.__aui.SavePerspective() cfg.Write(appcfg.CFG_LAYOUT_DEFAULT, pers) else: # load last one pers = cfg.Read(appcfg.CFG_LAYOUT_LAST, '') if pers: self.__aui.LoadPerspective(pers) # retrieve height / width of main window width = cfg.ReadInt(appcfg.CFG_LAYOUT_LAST_W, 800) height = cfg.ReadInt(appcfg.CFG_LAYOUT_LAST_H, 800) self.SetSize((width, height)) self.Center() # open database (or not) when unsuccesful an event is posted to # show the wizard on the next OnIdle event self.__dbValid = False dbpath = appcfg.Get().Read(appcfg.CFG_DBPATH, '') if dbpath: status = db.engine.Get().Open(dbpath) self.__dbValid = (status == db.engine.DB_OPEN_OK) if not self.__dbValid: evt = wx.CommandEvent(wx.wxEVT_COMMAND_MENU_SELECTED, self.__menuShowDatabaseWizard.GetId()) self.AddPendingEvent(evt) else: viewmgr.signalDbChange() # at the end, make sure we are in the correct edit state # TODO: Shouldn't we use OnUpdateUI event instead? self.__SyncMenuItems()