Esempio n. 1
0
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()