~ubuntu-branches/debian/squeeze/pyrenamer/squeeze

« back to all changes in this revision

Viewing changes to src/pyrenamer.py

  • Committer: Bazaar Package Importer
  • Author(s): Adolfo González Blázquez
  • Date: 2007-07-30 20:08:09 UTC
  • mfrom: (1.1.1 upstream)
  • Revision ID: james.westby@ubuntu.com-20070730200809-ddmgnjaczyu7qzgh
Tags: 0.3-1
* New upstream relase
* Added libxml-parser-perl to Build-Depends-Indep (intltool need it)

Show diffs side-by-side

added added

removed removed

Lines of Context:
30
30
 
31
31
import pygtk
32
32
if gtk.pygtk_version < (2, 0):
33
 
      print "PyGtk 2.0 or later required for this widget"
 
33
      print "PyGtk 2.0 or later required for this app to run"
34
34
      raise SystemExit
35
35
 
36
36
  
43
43
 
44
44
import treefilebrowser
45
45
import pyrenamerfilefuncs as renamerfilefuncs
46
 
import pyrenamer_globals as glob
 
46
import pyrenamer_globals as pyrenamerglob
47
47
import tooltips
48
48
 
49
49
import threading
50
50
import os
51
51
 
 
52
import locale
 
53
import gettext
 
54
 
 
55
from gettext import gettext as _
 
56
gettext.bindtextdomain(pyrenamerglob.name, pyrenamerglob.locale_dir)
 
57
gettext.textdomain(pyrenamerglob.name)
 
58
gtk.glade.bindtextdomain(pyrenamerglob.name, pyrenamerglob.locale_dir)
 
59
gtk.glade.textdomain(pyrenamerglob.name)
 
60
 
52
61
class pyRenamer:
53
62
    
54
63
    def __init__(self):
59
68
        self.home = os.environ["HOME"]
60
69
        self.current_dir = self.home
61
70
        self.window_maximized = False
62
 
        self.count = 1
 
71
        self.count = 0
63
72
        self.populate_id = []
64
73
        self.window_width = 1
65
74
        self.window_height = 1
69
78
        self.listing_thread = None
70
79
        
71
80
        # Gconf preferences stuff
72
 
        self.gconf_path = '/apps/' + glob.name
 
81
        self.gconf_path = '/apps/' + pyrenamerglob.name
73
82
        self.gconf_key_dir = self.gconf_path + '/dir'
74
 
        self.gconf_window_maximized = self.gconf_path + '/window_maximized'
 
83
        self.gconf_window_maximized = self.gconf_path + '/window_maximized'
75
84
        self.gconf_pane_position = self.gconf_path + '/pane_position'
76
85
        self.gconf_window_width = self.gconf_path + '/window_width'
77
86
        self.gconf_window_height = self.gconf_path + '/window_height'
79
88
        self.gconf_window_posy = self.gconf_path + '/window_posy'
80
89
        
81
90
        # Init Glade stuff
82
 
        self.glade_tree = gtk.glade.XML(glob.gladefile, "main_window")
 
91
        self.glade_tree = gtk.glade.XML(pyrenamerglob.gladefile, "main_window")
83
92
        
84
93
        # Get some widgets
85
94
        self.main_window = self.glade_tree.get_widget("main_window")
87
96
        self.selected_files, selected_files_scrolled = self.create_selected_files_treeview()
88
97
        self.file_pattern = self.glade_tree.get_widget("file_pattern")
89
98
        self.add_recursive = self.glade_tree.get_widget("add_recursive")
90
 
        self.show_hidden_dirs = self.glade_tree.get_widget("show_hidden_dirs")
91
99
        self.original_pattern = self.glade_tree.get_widget("original_pattern")
92
100
        self.renamed_pattern = self.glade_tree.get_widget("renamed_pattern")
93
101
        self.statusbar = self.glade_tree.get_widget("statusbar")
111
119
        self.delete_to = self.glade_tree.get_widget("delete_to")
112
120
        self.manual = self.glade_tree.get_widget("manual")
113
121
        self.menu_rename = self.glade_tree.get_widget("menu_rename")
 
122
        self.images_original_pattern = self.glade_tree.get_widget("images_original_pattern")
 
123
        self.images_renamed_pattern = self.glade_tree.get_widget("images_renamed_pattern")
 
124
        self.music_original_pattern = self.glade_tree.get_widget("music_original_pattern")
 
125
        self.music_renamed_pattern = self.glade_tree.get_widget("music_renamed_pattern")
114
126
        
115
127
        self.statusbar_context = self.statusbar.get_context_id("file_renamer")
116
128
        
127
139
                    "on_exit_button_clicked": self.on_main_quit,
128
140
                    "on_menu_preview_activate": self.on_preview_button_clicked,
129
141
                    "on_menu_rename_activate": self.on_rename_button_clicked,
130
 
                    "on_show_hidden_dirs_toggled": self.on_show_hidden_dirs_toggled,
131
142
                    "on_subs_spaces_toggled": self.on_subs_spaces_toggled,
132
143
                    "on_subs_capitalization_toggled": self.on_subs_capitalization_toggled,
133
144
                    "on_subs_spaces_combo_changed": self.on_subs_spaces_combo_changed,
143
154
                    "on_delete_radio_toggled": self.on_delete_radio_toggled,
144
155
                    "on_delete_from_changed": self.on_delete_from_changed,
145
156
                    "on_delete_to_changed": self.on_delete_to_changed,
 
157
                    "on_images_original_pattern_changed": self.on_images_original_pattern_changed,
 
158
                    "on_images_renamed_pattern_changed": self.on_images_renamed_pattern_changed,
 
159
                    "on_music_original_pattern_changed": self.on_music_original_pattern_changed,
 
160
                    "on_music_renamed_pattern_changed": self.on_music_renamed_pattern_changed,
146
161
                    "on_menu_quit_activate": self.on_main_quit,
147
162
                    "on_menu_about_activate": self.about_info,
 
163
                    "on_notebook_switch_page": self.on_notebook_switch_page,
 
164
                    "on_cut_activate": self.on_cut_activate,
 
165
                    "on_copy_activate": self.on_copy_activate,
 
166
                    "on_paste_activate": self.on_paste_activate,
 
167
                    "on_clear_activate": self.on_clear_activate,
 
168
                    "on_select_all_activate": self.on_select_all_activate,
 
169
                    "on_select_nothing_activate": self.on_select_nothing_activate,
 
170
                    "on_manual_key_press_event": self.on_manual_key_press_event,
148
171
                    "on_quit_button_clicked": self.on_main_quit }
149
172
        self.glade_tree.signal_autoconnect(signals)
150
173
        
189
212
        self.subs_spaces_combo.set_active(0)
190
213
        self.subs_capitalization_combo.set_active(0)
191
214
        
192
 
        # Init menu items and window name
 
215
        # Init menu items, some widgets and window name
193
216
        self.menu_rename.set_sensitive(False)
194
 
        self.main_window.set_title(glob.name_long)
195
 
        self.main_window.set_icon_from_file(glob.icon)
 
217
        self.main_window.set_title(pyrenamerglob.name_long)
 
218
        self.main_window.set_icon_from_file(pyrenamerglob.icon)
 
219
        self.delete_from.set_sensitive(False)
 
220
        self.delete_to.set_sensitive(False)
196
221
        
197
222
        # Read preferences using Gconf
198
223
        if HAS_GCONF: self.preferences_read()
200
225
        # Init tooltips
201
226
        tips = tooltips.ToolTips(self.column_preview)
202
227
        tips.add_view(self.selected_files)
 
228
        
 
229
        # Hide music tab if necessary
 
230
        if not pyrenamerglob.have_eyed3:
 
231
            self.notebook.get_nth_page(5).hide()
203
232
    
204
233
 
205
234
 
213
242
        view.set_enable_search(True)
214
243
        view.set_reorderable(False)
215
244
        view.set_rules_hint(True)
 
245
        view.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
216
246
        view.connect("cursor-changed", self.on_selected_files_cursor_changed)
217
247
    
218
248
        # Create scrollbars around the view
232
262
        self.selected_files.set_model(self.file_selected_model)
233
263
        
234
264
        renderer1 = gtk.CellRendererText()
235
 
        column1 = gtk.TreeViewColumn("Original file name", renderer1, text=0)
 
265
        column1 = gtk.TreeViewColumn(_("Original file name"), renderer1, text=0)
236
266
        #column1.set_resizable(True)
237
267
        self.selected_files.append_column(column1)
238
268
 
239
269
        renderer2 = gtk.CellRendererText()
240
 
        column2 = gtk.TreeViewColumn("Renamed file name", renderer2, text=2)
 
270
        column2 = gtk.TreeViewColumn(_("Renamed file name"), renderer2, text=2)
241
271
        self.column_preview = column2
242
272
        #column2.set_resizable(True)
243
273
        self.selected_files.append_column(column2)
250
280
        ori = model.get_value(iter, 1)
251
281
        new = model.get_value(iter, 3)
252
282
        
253
 
        if new != None:
 
283
        if new != None and new != '':
254
284
            result = renamerfilefuncs.rename_file(ori, new)
255
 
            if not result: self.display_error_dialog("Could not rename file %s to %s" % (ori, new))
256
 
 
257
 
 
258
 
    def preview_rename_rows(self, model, path, iter, user_data):
 
285
            if not result: self.display_error_dialog(_("Could not rename file %s to %s") % (ori, new))
 
286
 
 
287
 
 
288
    def preview_rename_rows(self, model, path, iter, paths):
259
289
        """ Called when Preview button is clicked.
260
290
        Get new names and paths and add it to the model """
261
291
        
 
292
        if (paths != None) and (path not in paths) and (paths != []) and self.notebook.get_current_page() != 3:
 
293
            # Preview only selected rows (if we're not on manual rename)
 
294
            model.set_value(iter, 2, None)
 
295
            model.set_value(iter, 3, None)
 
296
            return
 
297
        
262
298
        # Get current values
263
299
        name = model.get_value(iter, 0)
264
300
        path = model.get_value(iter, 1)
316
352
                    newname = model.get_value(iter, 2)
317
353
                    newpath = model.get_value(iter, 3)
318
354
        
 
355
        elif self.notebook.get_current_page() == 4:
 
356
            # Replace images using patterns
 
357
            pattern_ini = self.images_original_pattern.get_text()
 
358
            pattern_end = self.images_renamed_pattern.get_text()
 
359
            newname, newpath = renamerfilefuncs.rename_using_patterns(name, path, pattern_ini, pattern_end, self.count)
 
360
            newname, newpath = renamerfilefuncs.replace_images(name, path, newname, newpath)
 
361
            
 
362
        elif self.notebook.get_current_page() == 5 and pyrenamerglob.have_eyed3:
 
363
            # Replace music using patterns
 
364
            pattern_ini = self.music_original_pattern.get_text()
 
365
            pattern_end = self.music_renamed_pattern.get_text()
 
366
            newname, newpath = renamerfilefuncs.rename_using_patterns(name, path, pattern_ini, pattern_end, self.count)
 
367
            newname, newpath = renamerfilefuncs.replace_music(name, path, newname, newpath)
 
368
        
 
369
        
319
370
        # Set new values on model
320
 
        model.set_value(iter, 2, newname)
321
 
        model.set_value(iter, 3, newpath)
 
371
        if newname != '' and newname != None:
 
372
            model.set_value(iter, 2, newname)
 
373
            model.set_value(iter, 3, newpath)
 
374
        else:
 
375
            model.set_value(iter, 2, None)
 
376
            model.set_value(iter, 3, None)
322
377
        self.count += 1
323
378
        
324
379
 
359
414
    
360
415
    def on_rename_button_clicked(self, widget):
361
416
        """ For everyrow rename the files as requested """
 
417
        
362
418
        self.file_selected_model.foreach(self.rename_rows, None)
363
419
        self.dir_reload_current()
364
420
        self.rename_button.set_sensitive(False)
367
423
 
368
424
    def on_preview_button_clicked(self, widget):
369
425
        """ Set the item count to zero and get new names and paths for files on model """
370
 
        self.count = 1
371
 
        self.file_selected_model.foreach(self.preview_rename_rows, None)
 
426
        self.count = 0
 
427
            
 
428
        # Get selected rows and execute rename function
 
429
        model, paths = self.selected_files.get_selection().get_selected_rows()
 
430
        self.file_selected_model.foreach(self.preview_rename_rows, paths)
 
431
        
372
432
        self.selected_files.columns_autosize()
373
433
        self.rename_button.set_sensitive(True)
374
434
        self.menu_rename.set_sensitive(True)
375
 
        
376
 
 
377
 
    def on_show_hidden_dirs_toggled(self, widget):
378
 
        """ Show hidden directories on dir browser """
379
 
        self.file_browser.set_show_hidden(self.show_hidden_dirs.get_active())
380
 
        self.file_browser.set_active_dir(self.current_dir)
381
435
 
382
436
 
383
437
    def on_add_recursive_toggled(self, widget):
459
513
        """ Disable Rename button (user has to click on Preview again) """
460
514
        self.rename_button.set_sensitive(False)
461
515
        self.menu_rename.set_sensitive(False)
 
516
        self.insert_entry.set_sensitive(True)
 
517
        self.insert_pos.set_sensitive(True)
 
518
        self.insert_end.set_sensitive(True)
 
519
        self.delete_from.set_sensitive(False)
 
520
        self.delete_to.set_sensitive(False)
462
521
        
463
522
        
464
523
    def on_insert_entry_changed(self, widget):
477
536
        """ Disable Rename button (user has to click on Preview again) """
478
537
        self.rename_button.set_sensitive(False)
479
538
        self.menu_rename.set_sensitive(False)
 
539
        self.insert_pos.set_sensitive(not self.insert_end.get_active())
480
540
        
481
541
        
482
542
    def on_delete_radio_toggled(self, widget):
483
543
        """ Disable Rename button (user has to click on Preview again) """
484
544
        self.rename_button.set_sensitive(False)
485
545
        self.menu_rename.set_sensitive(False)
 
546
        self.delete_from.set_sensitive(True)
 
547
        self.delete_to.set_sensitive(True)
 
548
        self.insert_entry.set_sensitive(False)
 
549
        self.insert_pos.set_sensitive(False)
 
550
        self.insert_end.set_sensitive(False)
486
551
        
487
552
        
488
553
    def on_delete_from_changed(self, widget):
500
565
        if self.delete_to.get_value() < self.delete_from.get_value(): 
501
566
            self.delete_to.set_value(self.delete_from.get_value())
502
567
 
 
568
    def on_images_original_pattern_changed(self, widget):
 
569
        """ Reload current dir and disable Rename button """
 
570
        self.rename_button.set_sensitive(False)
 
571
        self.menu_rename.set_sensitive(False)
 
572
 
 
573
 
 
574
    def on_images_renamed_pattern_changed(self, widget):
 
575
        """ Disable Rename button (user has to click on Preview again) """
 
576
        self.rename_button.set_sensitive(False)
 
577
        self.menu_rename.set_sensitive(False)
 
578
 
 
579
 
 
580
    def on_music_original_pattern_changed(self, widget):
 
581
        """ Reload current dir and disable Rename button """
 
582
        self.rename_button.set_sensitive(False)
 
583
        self.menu_rename.set_sensitive(False)
 
584
 
 
585
 
 
586
    def on_music_renamed_pattern_changed(self, widget):
 
587
        """ Disable Rename button (user has to click on Preview again) """
 
588
        self.rename_button.set_sensitive(False)
 
589
        self.menu_rename.set_sensitive(False)
 
590
 
 
591
 
 
592
    def on_notebook_switch_page(self, notebook, page, page_num):
 
593
        """ Tab changed """
 
594
        if page_num == 3:
 
595
            self.selected_files.get_selection().set_mode(gtk.SELECTION_SINGLE)
 
596
        else:
 
597
            self.selected_files.get_selection().set_mode(gtk.SELECTION_MULTIPLE)
 
598
            
 
599
 
 
600
    def on_copy_activate(self, widget):
 
601
        """ Copy to clipboard """
 
602
        w = self.main_window.get_focus()
 
603
        if isinstance(w, gtk.Entry):
 
604
            w.emit('copy-clipboard')
 
605
        
 
606
        
 
607
    def on_paste_activate(self, widget):
 
608
        """ Paste from clipboard """
 
609
        w = self.main_window.get_focus()
 
610
        if isinstance(w, gtk.Entry):
 
611
            w.emit('paste-clipboard')
 
612
        
 
613
        
 
614
    def on_cut_activate(self, widget):
 
615
        """ Cut to clipboard """
 
616
        w = self.main_window.get_focus()
 
617
        if isinstance(w, gtk.Entry):
 
618
            w.emit('cut-clipboard')
 
619
        
 
620
        
 
621
    def on_clear_activate(self, widget):
 
622
        """ Clear text widget """
 
623
        w = self.main_window.get_focus()
 
624
        if isinstance(w, gtk.Entry):
 
625
            w.set_text('')
 
626
        
 
627
        
 
628
    def on_select_all_activate(self, widget):
 
629
        """ Select every row on selected-files treeview """
 
630
        self.selected_files.get_selection().select_all()
 
631
        
 
632
        
 
633
    def on_select_nothing_activate(self, widget):
 
634
        """ Select nothing on selected-files treeview """
 
635
        self.selected_files.get_selection().unselect_all()
 
636
 
 
637
    
 
638
    def on_manual_key_press_event(self, widget, event):
 
639
        """ Key pressed on manual rename entry """
 
640
        
 
641
        if self.notebook.get_current_page() == 3:
 
642
            if event.keyval == gtk.keysyms.Page_Up:
 
643
                try:
 
644
                    model, iter = self.selected_files.get_selection().get_selected()
 
645
                    path = model.get_path(iter)
 
646
                    path = path[0]-1
 
647
                    if path < 0: return
 
648
                    iter = model.get_iter(path)
 
649
                    name = model.get_value(iter,0)
 
650
                    self.manual.set_text(name)
 
651
                    self.selected_files.get_selection().select_iter(iter)
 
652
                    self.selected_files.scroll_to_cell(path)
 
653
                except: pass
 
654
            elif event.keyval == gtk.keysyms.Page_Down:
 
655
                try:
 
656
                    model, iter = self.selected_files.get_selection().get_selected()
 
657
                    iter = model.iter_next(iter)
 
658
                    path = model.get_path(iter)
 
659
                    name = model.get_value(iter,0)
 
660
                    self.manual.set_text(name)
 
661
                    self.selected_files.get_selection().select_iter(iter)
 
662
                    self.selected_files.scroll_to_cell(path)
 
663
                except: pass
 
664
            
503
665
 
504
666
    def on_main_quit(self, *args):
505
667
        """ Bye bye! But first, save preferences """
529
691
        
530
692
        self.populate_selected_files(dir)
531
693
        self.selected_files.columns_autosize()
532
 
        self.statusbar.push(self.statusbar_context, "Reading contents of dir %s" % dir)
 
694
        self.statusbar.push(self.statusbar_context, _("Reading contents of dir %s") % dir)
533
695
        
534
696
        
535
697
    def populate_stop(self):
548
710
            
549
711
        self.selected_files.set_model(self.file_selected_model)
550
712
        self.progressbar.set_fraction(0)
551
 
        self.statusbar.push(self.statusbar_context, "Directory: %s - Files: %s" % (self.current_dir, self.count))
 
713
        self.statusbar.push(self.statusbar_context, _("Directory: %s - Files: %s") % (self.current_dir, self.count))
552
714
        
553
715
        
554
716
    def populate_get_listing(self, dir, pattern, recursive):
600
762
            self.file_selected_model.set_value(iter, 1, elem[1])
601
763
            
602
764
            self.progressbar.pulse()
603
 
            self.statusbar.push(self.statusbar_context, "Adding file %s" % elem[1])
 
765
            self.statusbar.push(self.statusbar_context, _("Adding file %s") % elem[1])
604
766
            self.count += 1
605
767
            yield True
606
768
    
607
769
        self.selected_files.set_model(self.file_selected_model)
608
770
        self.progressbar.set_fraction(0)
609
 
        self.statusbar.push(self.statusbar_context, "Directory: %s - Files: %s" % (self.current_dir, self.count))
 
771
        self.statusbar.push(self.statusbar_context, _("Directory: %s - Files: %s") % (self.current_dir, self.count))
610
772
        self.stop_button.hide()
611
 
        self.count = 1
 
773
        self.count = 0
612
774
        yield False
613
775
 
614
776
 
626
788
        """ Display the About dialog """
627
789
 
628
790
        about = gtk.AboutDialog()
629
 
        about.set_name(glob.name_long)
630
 
        about.set_version(glob.version)
631
 
        about.set_authors(glob.authors)
632
 
        #about.set_artists(glob.artists)
 
791
        about.set_name(pyrenamerglob.name_long)
 
792
        about.set_version(pyrenamerglob.version)
 
793
        about.set_authors(pyrenamerglob.authors)
 
794
        #about.set_artists(pyrenamerglob.artists)
633
795
        #about.set_translator_credits(_('translator-credits'))
634
 
        about.set_logo(gtk.gdk.pixbuf_new_from_file(glob.icon))
635
 
        about.set_license(glob.license)
 
796
        about.set_logo(gtk.gdk.pixbuf_new_from_file(pyrenamerglob.icon))
 
797
        about.set_license(pyrenamerglob.license)
636
798
        about.set_wrap_license(True)
637
 
        about.set_comments(glob.description)
638
 
        about.set_copyright(glob.copyright)
 
799
        about.set_comments(pyrenamerglob.description)
 
800
        about.set_copyright(pyrenamerglob.copyright)
639
801
 
640
802
        def openHomePage(widget,url,url2):
641
803
            import webbrowser
642
804
            webbrowser.open_new(url)
643
 
        gtk.about_dialog_set_url_hook(openHomePage,glob.website)
644
 
        about.set_website(glob.website)
 
805
        gtk.about_dialog_set_url_hook(openHomePage,pyrenamerglob.website)
 
806
        about.set_website(pyrenamerglob.website)
645
807
        
646
808
        about.run()
647
809
        about.destroy()
663
825
 
664
826
        
665
827
    def preferences_read(self):
666
 
        """ The name seys it all... """
 
828
        """ The name says it all... """
667
829
        client = gconf.client_get_default()
668
830
        
669
831
        #current_dir = client.get_string(self.gconf_key_dir)