~phoenix1987/gtumbler/uas

« back to all changes in this revision

Viewing changes to gtumbler/GtumblerWindow.py

  • Committer: Gabriele N. Tornetta
  • Date: 2012-07-09 11:48:39 UTC
  • Revision ID: phoenix1987@gmail.com-20120709114839-b5g7geazllfs0z4a
SaveĀ AsĀ implemented

Show diffs side-by-side

added added

removed removed

Lines of Context:
37
37
import gtumbler.mimes as mimes
38
38
import os
39
39
import poppler
 
40
import re
40
41
import session
41
42
import shutil
42
43
import threading
418
419
                tot = float(len(self.main.ui.ls_documents))
419
420
                i = 0
420
421
                for row in self.main.ui.ls_documents:
421
 
                        temp_file = Session.doc_temp.get(row[DOC_COLUMN.UID])
422
 
                        old_name = '/'.join((row[DOC_COLUMN.PATH], row[DOC_COLUMN.FILENAME]))
423
 
                        gtk.gdk.threads_enter()
424
 
                        self.parent.set_current_task('Processing "%s"...' % old_name)
425
 
                        gtk.gdk.threads_leave()
426
 
                        if temp_file:
427
 
                                filename = old_name if row[DOC_COLUMN.MIMETYPE] not in mimes.CONVERT_MIMES \
428
 
                                                    else '.'.join( (os.path.splitext(old_name)[0], 'pdf') )
429
 
                                gtk.gdk.threads_enter()
430
 
                                self.parent.set_current_task('Overwriting "%s"...' % old_name)
431
 
                                gtk.gdk.threads_leave()
432
 
 
433
 
                                os.rename(temp_file, filename)
434
 
                                Session.doc_temp[row[DOC_COLUMN.UID]] = None
435
 
                        else:
436
 
                                # Look for page ranges
437
 
                                pass
438
 
                        i += 1
439
 
                        gtk.gdk.threads_enter()
440
 
                        self.parent.set_fraction(i / tot)
441
 
                        gtk.gdk.threads_leave()
442
 
 
443
 
                # STEPS
444
 
                # 1. look for temp_file
445
 
                # 2. otherwise use original file name
446
 
                # 3. if PS see if the user wishes it to be converted
447
 
                gtk.gdk.threads_enter()
448
 
                self.parent.set_current_task("Done.")
449
 
                gtk.gdk.threads_leave()
450
 
                self.parent.response(gtk.RESPONSE_OK)
451
 
 
452
 
class SaveAsThread(ProgressThread):
453
 
        def __init__(self, parent, data):
454
 
                self.main = data
455
 
                super(SaveAsThread, self).__init__(parent)
456
 
 
457
 
        def run(self):
458
 
                tot = float(len(self.main.ui.ls_documents))
459
 
                i = 0
460
 
                for row in self.main.ui.ls_documents:
461
422
                        uid = row[DOC_COLUMN.UID]
462
423
                        temp_file = Session.doc_temp.get(uid)
463
424
                        old_name = '/'.join((row[DOC_COLUMN.PATH], row[DOC_COLUMN.FILENAME]))
469
430
                                # Adjust file name for PostScript
470
431
                                fout = filename = old_name if row[DOC_COLUMN.MIMETYPE] not in mimes.CONVERT_MIMES \
471
432
                                                           else '.'.join( (os.path.splitext(old_name)[0], 'pdf') )
472
 
                        else
 
433
                        else:
473
434
                                fin = filename = old_name
474
435
                                fout = Session.temp_new('overwrite').new_file('.pdf')
475
436
 
477
438
                        self.parent.set_current_task('Overwriting "%s"...' % old_name)
478
439
                        gtk.gdk.threads_leave()
479
440
 
480
 
                        ranges = Session.doc_ranges[uid]
481
 
                        if ranges == (True, '') and temp_file:
482
 
                                os.rename(temp_file, filename)
 
441
                        ranges = Session.doc_ranges.get(uid)
 
442
                        if not ranges:
 
443
                                if temp_file: os.rename(temp_file, filename)
483
444
                        else:
484
 
                                with file(fin, 'rb') as fin, file(fout, 'wb') as fout:
485
 
                                        pdf_in = pdf.PdfFileReader(fin)
 
445
                                with file(fin, 'rb') as src, file(fout, 'wb') as dest:
 
446
                                        pdf_in = pdf.PdfFileReader(src)
486
447
                                        pdf_out = pdf.PdfFileWriter()
487
448
                                        j = -1
488
 
                                        ranges = produce_ranges(Session.doc_ranges[uid])
 
449
                                        ranges = produce_ranges(*Session.doc_ranges.get(uid, (True, '')), n_pages = pdf_in.getNumPages())
489
450
                                        for page in pdf_in.pages:
490
451
                                                j += 1
491
452
                                                if j not in ranges: continue
492
453
                                                pdf_out.addPage(page)
493
454
                                                
494
 
                                        pdf_out.write(fout)
 
455
                                        pdf_out.write(dest)
 
456
                                        
495
457
                                if not temp_file: os.rename(fout, fin)
496
458
                                        
497
459
                        Session.doc_temp[uid] = None
501
463
                        self.parent.set_fraction(i / tot)
502
464
                        gtk.gdk.threads_leave()
503
465
 
504
 
                # STEPS
505
 
                # 1. look for temp_file
506
 
                # 2. otherwise use original file name
507
 
                # 3. if PS see if the user wishes it to be converted
508
 
                gtk.gdk.threads_enter()
509
 
                self.parent.set_current_task("Done.")
510
 
                gtk.gdk.threads_leave()
511
 
                self.parent.response(gtk.RESPONSE_OK)
512
 
 
 
466
                gtk.gdk.threads_enter()
 
467
                self.parent.set_current_task("Done.")
 
468
                gtk.gdk.threads_leave()
 
469
                self.parent.response(gtk.RESPONSE_OK)
 
470
                
 
471
class SaveAsThread(ProgressThread):
 
472
        def __init__(self, parent, data):
 
473
                self.main = data
 
474
                super(SaveAsThread, self).__init__(parent)
 
475
 
 
476
        def run(self):
 
477
                tot = float(len(self.main.ui.ls_documents))
 
478
                n = 0
 
479
                
 
480
                # Determine numbering
 
481
                pattern  = Session.main.ui.txt_pattern.get_text()
 
482
                match = re.search('#{([0-9]),([0-9]+?),([0-9]+?)}', pattern)
 
483
                if match:
 
484
                        d, s, i = match.groups()
 
485
                        d, s, i = int(d), int(s), int(i)
 
486
                        num_pattern = re.search('(#{%d,%d,%d})' % (d,s,i) , pattern).group(0)
 
487
 
 
488
                prototype = pattern.replace('*name*', '')
 
489
                prototype = prototype.replace('*ext*', '')
 
490
                prototype = prototype.replace('*path*', '')
 
491
                prototype = prototype.replace('*title*', '')
 
492
                prototype = prototype.replace('*author*', '')
 
493
 
 
494
                for row in self.main.ui.ls_documents:
 
495
                        uid = row[DOC_COLUMN.UID]
 
496
                        filename = Session.doc_temp.get(uid)
 
497
                        old_name = '/'.join((row[DOC_COLUMN.PATH], row[DOC_COLUMN.FILENAME]))
 
498
                        if not filename: filename = old_name
 
499
 
 
500
                        gtk.gdk.threads_enter()
 
501
                        self.parent.set_current_task('Processing "%s"...' % old_name)
 
502
                        gtk.gdk.threads_leave()
 
503
 
 
504
                        new_name = pattern.replace('*name*', os.path.splitext(row[DOC_COLUMN.FILENAME])[0])
 
505
                        new_name = new_name.replace('*ext*', os.path.splitext(row[DOC_COLUMN.FILENAME])[1])
 
506
                        new_name = new_name.replace('*path*', row[DOC_COLUMN.PATH])
 
507
                        new_name = new_name.replace('*title*', row[DOC_COLUMN.TITLE] if row[DOC_COLUMN.TITLE] else '')
 
508
                        new_name = new_name.replace('*author*', row[DOC_COLUMN.AUTHOR] if row[DOC_COLUMN.AUTHOR] else '')
 
509
                        if match:
 
510
                                new_name = new_name.replace(num_pattern, ("%%0%dd" % d) % s)
 
511
                                s += i
 
512
                        else:
 
513
                                if new_name == prototype: continue
 
514
                        new_name = '.'.join((new_name, 'pdf'))
 
515
                        path = Session.main.ui.fcb_dest_folder.get_filename()
 
516
                        print '/'.join((path,new_name))
 
517
                        
 
518
                        ranges = Session.doc_ranges.get(uid)
 
519
 
 
520
                        gtk.gdk.threads_enter()
 
521
                        self.parent.set_current_task('Saving "%s" as "%s"...' % (filename, new_name))
 
522
                        gtk.gdk.threads_leave()
 
523
 
 
524
                        if ranges:
 
525
                                temp_file = Session.temp_new('saveas').new_file('.pdf')
 
526
                                with file(filename, 'rb') as src, file(temp_file, 'wb') as dest:
 
527
                                        pdf_in = pdf.PdfFileReader(src)
 
528
                                        pdf_out = pdf.PdfFileWriter()
 
529
                                        j = -1
 
530
                                        ranges = produce_ranges(*Session.doc_ranges.get(uid, (True, '')), n_pages = pdf_in.getNumPages())
 
531
                                        for page in pdf_in.pages:
 
532
                                                j += 1
 
533
                                                if j not in ranges: continue
 
534
                                                pdf_out.addPage(page)
 
535
                                                
 
536
                                        pdf_out.write(dest)
 
537
                                        
 
538
                                os.rename(temp_file, '/'.join((path, new_name)))
 
539
                        else:
 
540
                                shutil.copyfile(filename, '/'.join((path, new_name)))
 
541
 
 
542
                        n += 1
 
543
                        gtk.gdk.threads_enter()
 
544
                        self.parent.set_fraction(i / tot)
 
545
                        gtk.gdk.threads_leave()
 
546
 
 
547
                gtk.gdk.threads_enter()
 
548
                self.parent.set_current_task("Done.")
 
549
                gtk.gdk.threads_leave()
 
550
                self.parent.response(gtk.RESPONSE_OK)
 
551
                
513
552
### END THREAD CLASSES
514
553
 
515
554
### BEGIN COMMAND CLASSES
783
822
        
784
823
        def ask_proceed_with_action(self):
785
824
                if Session.has_changed and Session.filename:
786
 
                        ans = message.yesnocancel(self, "There are unsaved changes. Would you like to save the current file before creating a new session?")
 
825
                        ans = message.yesnocancel(self, "There are unsaved changes. Would you like to save the current session before?")
787
826
                        if ans == gtk.RESPONSE_YES:
788
827
                                if self.on_mnu_file_save_activate(widget, data) != gtk.RESPONSE_OK: return False
789
828
                        elif ans == gtk.RESPONSE_CANCEL:
881
920
        
882
921
        def process(self):
883
922
                with ProgressDialog() as pd:
884
 
                        pd.thread = OverwriteThread(pd, self) if self.ui.rdo_overwrite.get_active() else SaveAsThread()
 
923
                        pd.thread = OverwriteThread(pd, self) if self.ui.rdo_overwrite.get_active() else SaveAsThread(pd, self)
885
924
                        resp = pd.start()
886
925
                        if resp != gtk.RESPONSE_OK:
887
926
                                pd.stop()
1055
1094
                color = gtk.gdk.Color(preferences["cb_box%d" % box])
1056
1095
                self.draw_rectangle(widget, Session.boxes[box], (color.red_float, color.green_float, color.blue_float))
1057
1096
 
 
1097
        def on_gtumbler_window_delete_event(self, widget, *args):
 
1098
                return not self.ask_proceed_with_action()
 
1099
 
1058
1100
        def on_ls_documents_row_changed(self, widget, path, it, *args):
1059
1101
                self.on_tv_documents_cursor_changed(widget, *args)
1060
1102