class MainFrame(wx.Frame): def __init__(self, *args, **kwds): # begin wxGlade: MainFrame.__init__ kwds["style"] = wx.DEFAULT_FRAME_STYLE wx.Frame.__init__(self, *args, **kwds) # Menu Bar self.main_frame_menubar = wx.MenuBar() self.File = wx.Menu() self.Exit = wx.MenuItem(self.File, wx.ID_EXIT, _("E&xit\tCtrl-Q"), _("Exit"), wx.ITEM_NORMAL) self.File.AppendItem(self.Exit) self.main_frame_menubar.Append(self.File, _("&File")) self.Help = wx.Menu() self.About = wx.MenuItem(self.Help, wx.ID_ABOUT, _("&About"), _("About"), wx.ITEM_NORMAL) self.Help.AppendItem(self.About) self.main_frame_menubar.Append(self.Help, _("&Help")) self.SetMenuBar(self.main_frame_menubar) # Menu Bar end self.logo_bitmap = wx.StaticBitmap(self, wx.ID_ANY, wx.NullBitmap) self.src_dir_text_ctrl = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_READONLY) self.src_dir_button = wx.Button(self, wx.ID_ANY, _("Source folder")) self.dest_dir_text_ctrl = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_READONLY) self.dst_folder_button = wx.Button(self, wx.ID_ANY, _("Destination folder")) self.tiff_checkbox = wx.CheckBox(self, wx.ID_ANY, _("TIFF")) self.dng_checkbox = wx.CheckBox(self, wx.ID_ANY, _("DNG")) self.thumb_checkbox = wx.CheckBox(self, wx.ID_ANY, _("Thumbnail")) self.rotate_checkbox = wx.CheckBox(self, wx.ID_ANY, _("Rotation")) self.convert_button = wx.Button(self, wx.ID_ANY, _("Convert")) self.status_text_ctrl = wx.TextCtrl(self, wx.ID_ANY, "", style=wx.TE_MULTILINE | wx.TE_READONLY) self.abort_button = wx.Button(self, wx.ID_ANY, _("Abort")) self.__set_properties() self.__do_layout() self.Bind(wx.EVT_MENU, self.OnClose, self.Exit) self.Bind(wx.EVT_MENU, self.OnMenuAbout, self.About) self.Bind(wx.EVT_BUTTON, self.OnSrcFolder, self.src_dir_button) self.Bind(wx.EVT_BUTTON, self.OnDstFolder, self.dst_folder_button) self.Bind(wx.EVT_CHECKBOX, self.OnTIFFClicked, self.tiff_checkbox) self.Bind(wx.EVT_CHECKBOX, self.OnDNGClicked, self.dng_checkbox) self.Bind(wx.EVT_CHECKBOX, self.OnThumbnailClicked, self.thumb_checkbox) self.Bind(wx.EVT_CHECKBOX, self.OnRotationClicked, self.rotate_checkbox) self.Bind(wx.EVT_BUTTON, self.OnConvert, self.convert_button) self.Bind(wx.EVT_BUTTON, self.OnAbort, self.abort_button) # end wxGlade self.images = Images() self.logo_bitmap.SetBitmap(self.images.bmp_logo) self.proc = None self.Bind(wx.EVT_CLOSE, self.OnClose) self.SetMinSize(self.GetSize()) self.prefs = Preferences() self.dng_checkbox.SetValue(self.prefs.get_dng()) self.tiff_checkbox.SetValue(self.prefs.get_tiff()) self.thumb_checkbox.SetValue(self.prefs.get_thumbnail()) self.rotate_checkbox.SetValue(self.prefs.get_rotate()) def __set_properties(self): # begin wxGlade: MainFrame.__set_properties self.SetTitle(_("SJCAM RAW Converter")) self.SetSize((600, 300)) self.src_dir_button.SetFocus() self.tiff_checkbox.SetToolTip(wx.ToolTip(_("Convert to TIFF"))) self.dng_checkbox.SetToolTip(wx.ToolTip(_("Convert to DNG"))) self.dng_checkbox.SetValue(1) self.thumb_checkbox.SetToolTip(wx.ToolTip(_("Create thumbnail (needed by some editors e.g. darktable)"))) self.rotate_checkbox.SetToolTip(wx.ToolTip(_("Check if images were taken with rotation enabled in camera"))) self.abort_button.Enable(False) # end wxGlade def __do_layout(self): # begin wxGlade: MainFrame.__do_layout grid_sizer_1 = wx.FlexGridSizer(5, 2, 0, 0) grid_sizer_2 = wx.GridSizer(1, 4, 0, 0) grid_sizer_1.Add((20, 20), 0, 0, 0) grid_sizer_1.Add(self.logo_bitmap, 0, wx.ALIGN_CENTER, 0) grid_sizer_1.Add(self.src_dir_text_ctrl, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.src_dir_button, 0, wx.ALIGN_RIGHT | wx.EXPAND, 0) grid_sizer_1.Add(self.dest_dir_text_ctrl, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.dst_folder_button, 0, wx.ALIGN_RIGHT | wx.EXPAND, 0) grid_sizer_2.Add(self.tiff_checkbox, 0, 0, 0) grid_sizer_2.Add(self.dng_checkbox, 0, 0, 0) grid_sizer_2.Add(self.thumb_checkbox, 0, 0, 0) grid_sizer_2.Add(self.rotate_checkbox, 0, 0, 0) grid_sizer_1.Add(grid_sizer_2, 1, 0, 0) grid_sizer_1.Add(self.convert_button, 0, wx.ALL | wx.EXPAND, 2) grid_sizer_1.Add(self.status_text_ctrl, 0, wx.EXPAND, 0) grid_sizer_1.Add(self.abort_button, 0, wx.EXPAND, 0) self.SetSizer(grid_sizer_1) grid_sizer_1.AddGrowableRow(4) grid_sizer_1.AddGrowableCol(0) self.Layout() self.Centre() # end wxGlade def OnSrcFolder(self, event): # wxGlade: MainFrame.<event_handler> dialog = wx.DirDialog(self, _('Choose source folder'), style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON) if dialog.ShowModal() == wx.ID_OK: self.src_dir_text_ctrl.SetValue(dialog.GetPath()) dialog.Destroy() event.Skip() def OnDstFolder(self, event): # wxGlade: MainFrame.<event_handler> dialog = wx.DirDialog(self, _('Choose destination folder'), style=wx.DD_DEFAULT_STYLE | wx.DD_NEW_DIR_BUTTON) if dialog.ShowModal() == wx.ID_OK: self.dest_dir_text_ctrl.SetValue(dialog.GetPath()) dialog.Destroy() event.Skip() def OnConvert(self, event): # wxGlade: MainFrame.<event_handler> self.status_text_ctrl.Clear() if not self.tiff_checkbox.IsChecked() and not self.dng_checkbox.IsChecked(): dlg = wx.MessageDialog(self, _('Must select at least one output format (DNG/TIFF)'), _('Error!'), wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() event.Skip() return args = ['./sjcam_raw2dng'] if self.tiff_checkbox.IsChecked(): args.append('-t') if self.dng_checkbox.IsChecked(): args.append('-d') if self.thumb_checkbox.IsChecked(): args.append('-m') if self.rotate_checkbox.IsChecked(): args.append('-r') if not self.dest_dir_text_ctrl.IsEmpty(): args.append('-o') args.append(self.dest_dir_text_ctrl.GetValue()) if self.src_dir_text_ctrl.IsEmpty(): dlg = wx.MessageDialog(self, _('Must select source folder'), _('Error!'), wx.OK | wx.ICON_ERROR) dlg.ShowModal() dlg.Destroy() event.Skip() return args.append(self.src_dir_text_ctrl.GetValue()) self.convert_button.Disable() self.abort_button.Enable() self.thr = Thread(target=subprocess_thread, args=(self, args)) self.thr.daemon = True self.thr.start() event.Skip() def OnAbort(self, event): # wxGlade: MainFrame.<event_handler> if self.proc: self.proc.kill() event.Skip() def OnMenuAbout(self, event): # wxGlade: MainFrame.<event_handler> dlg = AboutBox(self) dlg.ShowModal() dlg.Destroy() event.Skip() def OnClose(self, event): # wxGlade: MainFrame.<event_handler> self.OnAbort(event) self.Destroy() def OnTIFFClicked(self, event): # wxGlade: MainFrame.<event_handler> self.prefs.set_tiff(str(event.IsChecked())) event.Skip() def OnDNGClicked(self, event): # wxGlade: MainFrame.<event_handler> self.prefs.set_dng(str(event.IsChecked())) event.Skip() def OnThumbnailClicked(self, event): # wxGlade: MainFrame.<event_handler> self.prefs.set_thumbnail(str(event.IsChecked())) event.Skip() def OnRotationClicked(self, event): # wxGlade: MainFrame.<event_handler> self.prefs.set_rotate(str(event.IsChecked())) event.Skip()