def __init__(self, parent, title): wx.Dialog.__init__(self, parent, name=u'DlgNewProject', style=wx.DEFAULT_DIALOG_STYLE, title=title) self._InitCtrls() self._InitSizers() self.pnlHdr.SetTitle(title) self.pnlHdr.SetBitmap(wx.ArtProvider.GetBitmap('PFS_ICON_32')) self.choiceAspect.Append(Aspect.ASPECT_16_9) self.choiceAspect.Append(Aspect.ASPECT_4_3) self.choiceAspect.Append(Aspect.ASPECT_3_2) self.choiceAspect.Select(0) self.tcProject.SetMinSize(wx.Size(300, -1)) self.tcFolder.SetMinSize(wx.Size(300, -1)) self.choiceAspect.SetMinSize(wx.Size(300, -1)) self.tcProject.SetValue(_(u"Unnamed project")) self.tcProject.SelectAll() self.tcProject.SetFocus() projPath = Settings().GetProjectPath() if not projPath: projPath = os.path.join(wx.GetHomeDir(), _(u"My PhotoFilmStrips")) Settings().SetProjectPath(projPath) self.tcFolder.SetValue(projPath) self.Fit() self.CenterOnParent() self.SetFocus()
def OnImportPics(self, event): dlg = wx.FileDialog(self, _("Import images"), Settings().GetImagePath(), "", _("Image files") + " (*.*)|*.*", wx.FD_OPEN | wx.FD_MULTIPLE | wx.FD_PREVIEW) if dlg.ShowModal() == wx.ID_OK: pics = [] for path in dlg.GetPaths(): if not self._CheckImportedPic(path): continue pic = Picture(path) pics.append(pic) ImageCache().RegisterPicture(pic) selItms = self.lvPics.GetSelected() self.InsertPictures(pics, selItms[0] + 1 if selItms else None, autopath=True) Settings().SetImagePath(os.path.dirname(path)) selPics = self.lvPics.GetSelectedPictures() self.pnlEditPicture.SetPictures(selPics) dlg.Destroy()
def __init__(self, parent, rendererProvider, aspectRatio): self._init_ctrls(parent) self.Bind(wx.EVT_CLOSE, self.OnCmdCancelButton) self.pnlHdr.SetTitle(_('Configure output and start render process')) self.pnlHdr.SetBitmap(wx.ArtProvider.GetBitmap('PFS_RENDER_32')) self.cbDraft.SetToolTip( _(u"Activate this option to generate a preview of your PhotoFilmStrip. The rendering process will speed up dramatically, but results in lower quality." )) self.aspectRatio = aspectRatio self.__InitProfiles() self.choiceFormat.SetRendererProvider(rendererProvider) defaultFormat = rendererProvider.GetDefault() if isinstance(defaultFormat, str): self.choiceFormat.SetStringSelection(defaultFormat) elif isinstance(defaultFormat, int): self.choiceFormat.SetSelection(defaultFormat) self.OnChoiceFormat(None) settings = Settings() self.__SelectProfileByName(settings.GetLastProfile()) self.SetEscapeId(wxID_DLGRENDERCMDCANCEL) self.SetInitialSize(self.GetEffectiveMinSize()) self.Fit() self.CentreOnParent() self.SetFocus() self.profile = None self.draftMode = False self.formatData = None
def _SaveSettings(self): settings = Settings() settings.SetLastProfile(self.__profile.GetName()) try: idxRenderer = RENDERERS.index(self.__rendererClass) except ValueError: return settings.SetUsedRenderer(idxRenderer)
def OnCmdBrowseAudioButton(self, event): # pylint: disable=unused-argument dlg = wx.FileDialog(self, _("Select music"), Settings().GetAudioPath(), "", _("Audio files") + " (*.*)|*.*", wx.FD_OPEN | wx.FD_MULTIPLE) if dlg.ShowModal() == wx.ID_OK: for path in dlg.GetPaths(): Settings().SetAudioPath(os.path.dirname(path)) self.__AddAudioItem(path, select=True) dlg.Destroy()
def OnCmdBrowseAudioButton(self, event): # pylint: disable=unused-argument dlg = wx.FileDialog(self, _(u"Select music"), Settings().GetAudioPath(), "", _(u"Audio files") + " (*.*)|*.*", wx.FD_OPEN | wx.FD_MULTIPLE) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() Settings().SetAudioPath(os.path.dirname(path)) for path in dlg.GetPaths(): self.lvAudio.Append(path) dlg.Destroy()
def Execute(self): audioFiles = [] audioLength = 0 for audioFile in self.__photoFilmStrip.GetAudioFiles(): if CheckFile(audioFile): length = GPlayer(audioFile).GetLength() audioFiles.append(audioFile) logging.debug("Using audiofile '%s' with length: %s", audioFile, length) audioLength += length else: logging.warning("Missing audiofile '%s'!", audioFile) outFile = self._CheckAndGetOutFile() self._SaveSettings() savedProps = Settings().GetRenderProperties(self.__rendererClass.__name__) for prop in self.__rendererClass.GetProperties(): value = savedProps.get(prop.lower(), self.__rendererClass.GetProperty(prop)) self.__rendererClass.SetProperty(prop, value) totalLength = self.__photoFilmStrip.GetDuration(False) if totalLength == -1: totalLength = int(round((audioLength + 500) / 1000.0)) renderer = self.__rendererClass() renderer.Init(self.__profile, self.__photoFilmStrip.GetAspect(), outFile) renderer.SetAudioFiles(audioFiles) if self.__photoFilmStrip.GetTimelapse(): uxEvent = "RenderTimeLapse" renderEngine = RenderEngineTimelapse(self.__profile, self.__photoFilmStrip.GetPictures(), self.__draftMode) else: uxEvent = "RenderSlideshow" renderEngine = RenderEngineSlideshow(self.__profile, self.__photoFilmStrip.GetPictures(), self.__draftMode, totalLength) name = "%s (%s)" % (self.__photoFilmStrip.GetName(), self.__profile.GetName()) self.__renderJob = RenderJob(name, renderer, renderEngine.GetTasks()) self.__renderJob.AddUxEvent(uxEvent) self.__renderJob.AddUxEvent(self.__profile.GetName())
def Execute(self): audioFiles = [] audioLength = 0 for audioFile in self.__photoFilmStrip.GetAudioFiles(): if self.CheckFile(audioFile): length = GPlayer(audioFile).GetLength() audioFiles.append(audioFile) logging.debug("Using audiofile '%s' with length: %s", audioFile, length) audioLength += length else: logging.warn("Missing audiofile '%s'!", audioFile) outpath = self._CheckAndGetOutpath() self._SaveSettings() savedProps = Settings().GetRenderProperties(self.__rendererClass.__name__) for prop in self.__rendererClass.GetProperties(): value = savedProps.get(prop.lower(), self.__rendererClass.GetProperty(prop)) self.__rendererClass.SetProperty(prop, value) totalLength = self.__photoFilmStrip.GetDuration(False) if totalLength == -1: totalLength = int(round((audioLength + 500) / 1000.0)) renderer = self.__rendererClass() renderer.Init(self.__profile, self.__photoFilmStrip.GetAspect(), outpath) renderer.SetAudioFiles(audioFiles) if self.__photoFilmStrip.GetTimelapse(): renderEngine = RenderEngineTimelapse(outpath, self.__profile, self.__photoFilmStrip.GetPictures(), self.__draftMode) else: renderEngine = RenderEngineSlideshow(outpath, self.__profile, self.__photoFilmStrip.GetPictures(), self.__draftMode, totalLength) name = "%s (%s)" % (self.__photoFilmStrip.GetName(), self.__profile.GetName()) self.__renderJob = RenderJob(name, renderer, renderEngine.GetTasks())
def OnProjectLoad(self, event): dlg = wx.FileDialog(self, _(u"Select %s-Project") % Constants.APP_NAME, Settings().GetProjectPath(), "", Constants.APP_NAME + u'-' + _(u"Files") + " (*.pfs;*.pfstory)|*.pfs;*.pfstory", wx.FD_OPEN) if dlg.ShowModal() == wx.ID_OK: self.LoadProject(dlg.GetPath())
def RefreshPage(self, withHistory=True): if withHistory: htmlParts = [] fileHistory = Settings().GetFileHistory() for recentFile in fileHistory: if ProjectFile(filename=recentFile).IsOk(): htmlPart = """<td align="center" valign="bottom"> <wxp module="photofilmstrip.gui.PnlWelcome" class="LinkOpenPfs"> <param name="filename" value="%s"> </wxp> </td>""" % recentFile htmlParts.append(htmlPart) breakAt = 4 for idx in xrange((len(htmlParts) - 1) / breakAt): htmlParts.insert(idx + ((idx + 1) * breakAt), "</tr><tr>") if htmlParts: self.htmlTitle = _(u"Recent projects") self.htmlText = "" else: self.htmlTitle = _(u"How to start...") self.htmlText = _(u"Create a new project or load an existing one.") self.htmlRecentProjects = "".join(htmlParts) html = HTML_TEMPLATE % {'title': self.htmlTitle, 'text': self.htmlText, 'htmlRecentProjects': self.htmlRecentProjects, 'htmlUpdate': self.htmlUpdate} self.htmlWin.SetPage(html)
def __NotifyUpdate(self): if not self.__updateChecker.IsDone(): wx.CallLater(100, self.__NotifyUpdate) return if not self.__updateChecker.IsOk(): return # if not self.__updateChecker.IsNewer(Settings().GetLastKnownVersion()): # return if not self.__updateChecker.IsNewer(Constants.APP_VERSION): return Settings().SetLastKnownVersion(self.__updateChecker.GetVersion()) html = """<h3 align="center">%(title)s</h3> <center> <wxp module="photofilmstrip.gui.PnlWelcome" class="PfsHyperlink"> <param name="label" value="Download %(appname)s %(version)s"> </wxp> </center> <p>%(msg)s</p> <pre>%(changes)s</pre>""" % {"title": _("Update available"), "appname": Constants.APP_NAME, "version": self.__updateChecker.GetVersion(), "msg": _(u'The following changes has been made:'), "changes": self.__updateChecker.GetChanges(), "url": Constants.APP_URL} self.htmlUpdate = html self.RefreshPage(withHistory=False)
def OnInit(self): lang = Settings().GetLanguage() wxLangInfo = wx.Locale.FindLanguageInfo(lang) if wxLangInfo is None: wxLang = wx.Locale.GetSystemLanguage() else: wxLang = wxLangInfo.Language if not wx.Locale.IsAvailable(wxLang): wxLang = wx.Locale.GetSystemLanguage() self.locale = wx.Locale(wxLang) # pylint: disable=attribute-defined-outside-init ArtProvider.Init() frame = FrmMain() frame.Show() frame.Maximize() self.SetTopWindow(frame) DlgBugReport.Initialize(frame) if len(sys.argv) > 1: for arg in sys.argv[1:]: if os.path.isfile(arg): frame.LoadProject(arg) return True
def OnCmdOkButton(self, event): propDict = {} for prop in self.rendererClass.GetProperties(): if self.rendererClass.GetProperty(prop) != self.rendererClass.GetDefaultProperty(prop): propDict[prop] = self.rendererClass.GetProperty(prop) Settings().SetRenderProperties(self.rendererClass.__name__, propDict) self.EndModal(wx.ID_OK)
def OnProjectImport(self, event): dlg = wx.FileDialog( self, _("Import Slideshow"), Settings().GetProjectPath(), "", "%s %s" % (_("Portable slideshow"), "(*.ppfs)|*.ppfs"), wx.FD_OPEN) if dlg.ShowModal() == wx.ID_OK: filepath = dlg.GetPath() prjFile = WxProjectFile(self, filename=filepath) prjFile.Load()
def OnCmdBrowseFolderButton(self, event): dlg = wx.DirDialog(self, _("Browse for folder"), defaultPath=self.tcFolder.GetValue()) if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() if self.__ValidateOutDir(path): self.tcFolder.SetValue(path) Settings().SetProjectPath(path) dlg.Destroy()
def OnChangeLanguage(self, event): lang = ActionManager.LANG_MAP.get(event.GetId(), "en") Settings().SetLanguage(lang) ActionI18N().Execute() dlg = wx.MessageDialog(self, _(u"You must restart %s for your new language setting to take effect.") % Constants.APP_NAME, _(u"Information"), wx.ICON_INFORMATION | wx.OK) dlg.ShowModal() dlg.Destroy()
def AddFileToHistory(self, filename): if os.path.splitext(filename)[1].lower() != ".pfs": return fileList = Settings().GetFileHistory() if filename in fileList: fileList.remove(filename) fileList.insert(0, filename) Settings().SetFileHistory(fileList)
def __init__(self, parent, rendererClass): self._init_ctrls(parent) self.Bind(wx.EVT_CLOSE, self.OnCmdCancelButton) self.pnlHdr.SetTitle(_(u'Edit extended output properties')) self.pnlHdr.SetBitmap(wx.ArtProvider.GetBitmap('PFS_VIDEO_FORMAT_32')) self.rendererClass = rendererClass self.lcProps.DeleteAllItems() savedProps = Settings().GetRenderProperties(rendererClass.__name__) for prop in rendererClass.GetProperties(): value = savedProps.get(prop.lower(), rendererClass.GetProperty(prop)) self.lcProps.Append([prop, value]) rendererClass.SetProperty(prop, value) self.SetAffirmativeId(wxID_DLGRENDERERPROPSCMDOK) self.SetEscapeId(wxID_DLGRENDERERPROPSCMDCANCEL) self.SetInitialSize(self.GetEffectiveMinSize()) self.CentreOnParent() self.SetFocus()
def __init__(self, parent, rendererClass): self._init_ctrls(parent) self.Bind(wx.EVT_CLOSE, self.OnCmdCancelButton) self.pnlHdr.SetTitle(_(u"Edit extended output properties")) self.pnlHdr.SetBitmap(wx.ArtProvider.GetBitmap("wxART_EXECUTABLE_FILE", wx.ART_TOOLBAR, (32, 32))) self.rendererClass = rendererClass self.lcProps.DeleteAllItems() savedProps = Settings().GetRenderProperties(rendererClass.__name__) for prop in rendererClass.GetProperties(): value = savedProps.get(prop.lower(), rendererClass.GetProperty(prop)) self.lcProps.Append([prop, value]) rendererClass.SetProperty(prop, value) self.SetAffirmativeId(wxID_DLGRENDERERPROPSCMDOK) self.SetEscapeId(wxID_DLGRENDERERPROPSCMDCANCEL) self.SetInitialSize(self.GetEffectiveMinSize()) self.CentreOnParent() self.SetFocus()
def OnProjectExport(self, event): prj = self.__project curFilePath = prj.GetFilename() dlg = wx.FileDialog( self, _("Export slideshow"), Settings().GetProjectPath(), curFilePath, "%s %s" % (_("Portable slideshow"), "(*.ppfs)|*.ppfs"), wx.FD_SAVE) if dlg.ShowModal() == wx.ID_OK: filepath = dlg.GetPath() if os.path.splitext(filepath)[1].lower() != ".ppfs": filepath += ".ppfs" prjFile = WxProjectFile(self, self.__project, filepath) prjFile.Save(True)
def _OnAddMedia(self, event): # pylint: disable=unused-argument dlg = wx.FileDialog(self, _(u"Add media"), Settings().GetProjectPath(), "", _(u"Media files") + " (*.*)|*.*", wx.FD_OPEN | wx.FD_PREVIEW | wx.FD_MULTIPLE) if dlg.ShowModal() == wx.ID_OK: itmParent, offset = self.treeCtrlr.GetInsertInfo() for idx, path in enumerate(dlg.GetPaths()): media = Media(path) media.AddObserver(self) itmNew = self.treeCtrlr.AddMedia(itmParent, media, offset + idx) self.pnlMedias.SelectItem(itmNew) dlg.Destroy()
def OnImportPics(self, event): dlg = wx.FileDialog(self, _(u"Import images"), Settings().GetImagePath(), "", _(u"Imagefiles") + " (*.*)|*.*", wx.FD_OPEN | wx.FD_MULTIPLE | wx.FD_PREVIEW) if dlg.ShowModal() == wx.ID_OK: pics = [] for path in dlg.GetPaths(): if self.__project.GetTimelapse(): picPattern = PicturePattern.Create(path) if not picPattern.IsOk(): dlgErr = wx.MessageDialog( self, _(u"Filename '%s' does not match a number pattern " u"which is necessary for a time lapse slide " u"show!") % path, _(u"Error"), wx.OK | wx.ICON_ERROR) dlgErr.ShowModal() dlgErr.Destroy() continue pic = Picture(path) pics.append(pic) ImageCache().RegisterPicture(pic) selItms = self.lvPics.GetSelected() self.InsertPictures(pics, selItms[0] + 1 if selItms else None, autopath=True) Settings().SetImagePath(os.path.dirname(path)) selPics = self.lvPics.GetSelectedPictures() self.pnlEditPicture.SetPictures(selPics) dlg.Destroy()
def OnChoiceFormat(self, event): if event is None: formatData = self.__GetChoiceDataSelected(self.choiceFormat) else: formatData = event.GetClientData() if isinstance(formatData, FormatData): self.cmdStart.Enable(formatData.IsOk()) if formatData.IsMPEG(): self.__InitProfiles( formatData.GetRendererClass().GetName().split(" ")[0], GetMPEGProfiles()) else: self.__InitProfiles() self.__SelectProfileByName(Settings().GetLastProfile())
def __init__(self, frame, menuBar, toolBar): self._frame = frame self._menuBar = menuBar self._toolBar = toolBar self._prevEditor = None self._toolFix = 0 menuFile = self.__CreateMenuFile() menuEdit = self.__CreateMenuEdit() menuHelp = self.__CreateMenuHelp() self._menuBar.Append(menuFile, _(u'&File')) self._menuBar.Append(menuEdit, _(u'&Edit')) self._menuBar.Append(menuHelp, _(u'&Help')) self.__MakeToolBar(toolBar) self.__SelectLanguage(Settings().GetLanguage())
def Execute(self): curLang = Settings().GetLanguage() localeDir = None for localeDir in (os.path.join(Constants.APP_DIR, "share", "locale"), os.path.join(Constants.APP_DIR, "locale"),): if os.path.isdir(localeDir): break if localeDir is None: gettext.install(Constants.APP_NAME, unicode=True) return try: lang = gettext.translation(Constants.APP_NAME, localeDir, languages=[curLang, "en"]) lang.install(True) except IOError: gettext.install(Constants.APP_NAME, unicode=True)
def _OnRender(self, event): # pylint: disable=unused-argument dlg = DlgRender(self, RendererProvider(), Aspect.ASPECT_16_9) try: if dlg.ShowModal() != wx.ID_OK: return profile = dlg.GetProfile() gstElements = dlg.GetFormatData().GetData() finally: dlg.Destroy() dlg = wx.FileDialog(self, _("Video file"), Settings().GetProjectPath(), "", _("Video files") + " (*.*)|*.*", wx.FD_SAVE) try: if dlg.ShowModal() == wx.ID_OK: self._OnStart(dlg.GetPath(), profile, gstElements) else: return finally: dlg.Destroy()
def OnProcess(self, wxParent): dlg = wx.MessageDialog( wxParent, _(u"Some images does not exist in the folder '%s' anymore. If the files has moved you can select the new path. Do you want to select a new path?" ) % self.__imgPath, _(u"Question"), wx.YES_NO | wx.ICON_QUESTION) try: if dlg.ShowModal() == wx.ID_NO: self.GetJob().SetAltPath(self.__imgPath, self.__imgPath) return finally: dlg.Destroy() dlg = wx.DirDialog(wxParent, defaultPath=Settings().GetImagePath()) try: if dlg.ShowModal() == wx.ID_OK: path = dlg.GetPath() self.GetJob().SetAltPath(self.__imgPath, path) return else: self.Skip() finally: dlg.Destroy()
def __init__(self, parent, project=None): wx.Dialog.__init__(self, parent, name=u'DlgProjectProps', style=wx.DEFAULT_DIALOG_STYLE, title=_(u'Project properties')) self.Bind(wx.EVT_CLOSE, self.OnDlgProjectPropsClose) self._InitCtrls(parent) self.SetSizeHints(700, 250) self.szCtrls.AddGrowableCol(1) self.pnlHdr.SetTitle(_(u'PhotoFilmStrip project')) self.pnlHdr.SetBitmap( wx.ArtProvider.GetBitmap('PFS_ICON_48', wx.ART_TOOLBAR, (32, 32))) self.choiceAspect.Append(Aspect.ASPECT_16_9) self.choiceAspect.Append(Aspect.ASPECT_4_3) self.choiceAspect.Append(Aspect.ASPECT_3_2) self.choiceAspect.Select(0) self.tcProject.SetMinSize(wx.Size(300, -1)) self.tcFolder.SetMinSize(wx.Size(300, -1)) self.choiceAspect.SetMinSize(wx.Size(300, -1)) self.timeCtrlTotalLength.SetMinSize(wx.Size(300, -1)) self.lvAudio.SetMinSize(wx.Size(300, -1)) defTime = wx.DateTime.Now() defTime.SetHMS(0, 0, 30) minTime = wx.DateTime.Now() minTime.SetHMS(0, 0, 1) maxTime = wx.DateTime.Now() maxTime.SetHMS(1, 59, 59) self.timeCtrlTotalLength.SetValue(defTime) self.timeCtrlTotalLength.SetMin(minTime) self.timeCtrlTotalLength.SetMax(maxTime) self.timeCtrlTotalLength.SetLimited(True) self.mediaCtrl = None self.__project = project if project is None: projName = _(u"Unnamed PhotoFilmStrip") self.tcProject.SetValue(projName) self.tcProject.SelectAll() self.tcProject.SetFocus() projPath = Settings().GetProjectPath() if not projPath: projPath = os.path.join(wx.GetHomeDir(), _(u"My PhotoFilmStrips")) Settings().SetProjectPath(projPath) self.tcFolder.SetValue(projPath) self.cbTotalLength.SetValue(False) self.rbManual.SetValue(True) else: projName = os.path.splitext(os.path.basename( project.GetFilename()))[0] self.tcProject.SetValue(projName) self.tcProject.Enable(False) self.tcFolder.SetValue(os.path.dirname(project.GetFilename())) self.tcFolder.Enable(False) self.cmdBrowseFolder.Enable(False) self.choiceAspect.SetStringSelection(project.GetAspect()) self.choiceAspect.Enable(False) pfsDur = project.GetDuration(calc=True) duration = project.GetDuration(calc=False) if project.GetTimelapse(): self.cbTotalLength.SetValue(True) self.rbTimelapse.SetValue(True) elif duration is None: self.cbTotalLength.SetValue(False) elif duration <= 0: self.cbTotalLength.SetValue(True) self.rbAudio.SetValue(True) else: self.cbTotalLength.SetValue(True) self.rbManual.SetValue(True) pfsDur = duration pfsDur = int(round(pfsDur)) dur = wx.DateTime.Now() dur.SetHMS(0, pfsDur // 60, pfsDur % 60) try: self.timeCtrlTotalLength.SetWxDateTime(dur) except ValueError: # duration is invalid if there are no photos pass for audioFile in project.GetAudioFiles(): idx = self.lvAudio.Append(audioFile) self.lvAudio.Select(idx) self.__ControlStatusTotalLength() self.__ControlStatusAudio() self.Fit() self.CenterOnParent() self.SetFocus()
def _GetDefaultSaveFolder(self): return Settings().GetProjectPath()
def AddFileToHistory(self, filename): fileList = Settings().GetFileHistory() if filename in fileList: fileList.remove(filename) fileList.insert(0, filename) Settings().SetFileHistory(fileList)
def GetDefault(self): settings = Settings() if settings.GetUsedRenderer() is None: return self.DEFAULT_FORMAT else: return settings.GetUsedRenderer()
def _SaveSettings(self): settings = Settings() settings.SetLastProfile(self.__profile.GetName()) idxRenderer = RENDERERS.index(self.__rendererClass) settings.SetUsedRenderer(idxRenderer)