📄 meldapp.py
字号:
def on_notebook_label_changed(self, component, text): nbl = self.notebook.get_tab_label( component.widget ) nbl.label.set_text(text) self.widget.set_title(text + " - Meld") self.notebook.child_set_property(component.widget, "menu-label", text) def on_can_undo(self, undosequence, can): self.button_undo.set_sensitive(can) def on_can_redo(self, undosequence, can): self.button_redo.set_sensitive(can) def on_size_allocate(self, window, rect): self.prefs.window_size_x = rect.width self.prefs.window_size_y = rect.height # # Toolbar and menu items (file) # def on_menu_file_new_activate(self, menuitem): NewDocDialog(self, NewDocDialog.TYPE.DIFF2) def on_menu_save_activate(self, menuitem): self.current_doc().save() def on_menu_save_as_activate(self, menuitem): pane = self.current_doc()._get_focused_pane() if pane >= 0: self.current_doc().save_file(pane, 1) def on_menu_refresh_activate(self, *args): self.current_doc().refresh() def on_menu_close_activate(self, *extra): i = self.notebook.get_current_page() if i >= 0: page = self.notebook.get_nth_page(i).get_data("pyobject") self.try_remove_page(page) def on_menu_quit_activate(self, *extra): if not developer: for c in self.notebook.get_children(): response = c.get_data("pyobject").on_delete_event(appquit=1) if response == gtk.RESPONSE_CANCEL: return gtk.RESPONSE_CANCEL elif response == gtk.RESPONSE_CLOSE: break for c in self.notebook.get_children(): c.get_data("pyobject").on_quit_event() self.quit() return gtk.RESPONSE_CLOSE # # Toolbar and menu items (edit) # def on_menu_undo_activate(self, *extra): self.current_doc().on_undo_activate() def on_menu_redo_activate(self, *extra): self.current_doc().on_redo_activate() def on_menu_refresh_activate(self, *extra): self.current_doc().on_refresh_activate() def on_menu_reload_activate(self, *extra): self.current_doc().on_reload_activate() def on_menu_find_activate(self, *extra): self.current_doc().on_find_activate() def on_menu_find_next_activate(self, *extra): self.current_doc().on_find_next_activate() def on_menu_replace_activate(self, *extra): self.current_doc().on_replace_activate() def on_menu_copy_activate(self, *extra): self.current_doc().on_copy_activate() def on_menu_cut_activate(self, *extra): self.current_doc().on_cut_activate() def on_menu_paste_activate(self, *extra): self.current_doc().on_paste_activate() # # Toolbar and menu items (settings) # def on_menu_filter_activate(self, check): print check, check.child.get_text() def on_menu_preferences_activate(self, item): PreferencesDialog(self) # # Toolbar and menu items (help) # def on_menu_meld_home_page_activate(self, button): gnomeglade.url_show("http://meld.sourceforge.net") def on_menu_help_bug_activate(self, button): gnomeglade.url_show("http://bugzilla.gnome.org/buglist.cgi?product=meld") def on_menu_users_manual_activate(self, button): gnomeglade.url_show("ghelp:///"+os.path.abspath(paths.help_dir("C/meld.xml") )) def on_menu_about_activate(self, *extra): about = gtk.glade.XML(paths.share_dir("glade2/meldapp.glade"),"about").get_widget("about") about.set_property("name", "Meld") about.set_property("version", version) about.show() # # Toolbar and menu items (misc) # def on_menu_magic_activate(self, *args): for i in range(8): self.append_filediff( ("ntest/file%ia"%i, "ntest/file%ib"%i) ) #self.append_filediff( ("ntest/file9a", "ntest/file9b") ) pass def on_menu_edit_down_activate(self, *args): misc.safe_apply( self.current_doc(), "next_diff", gtk.gdk.SCROLL_DOWN ) def on_menu_edit_up_activate(self, *args): misc.safe_apply( self.current_doc(), "next_diff", gtk.gdk.SCROLL_UP ) def on_toolbar_new_clicked(self, *args): NewDocDialog(self, NewDocDialog.TYPE.DIFF2) def on_toolbar_stop_clicked(self, *args): self.current_doc().stop() def try_remove_page(self, page): "See if a page will allow itself to be removed" if page.on_delete_event() == gtk.RESPONSE_OK: self.scheduler.remove_scheduler( page.scheduler ) i = self.notebook.page_num( page.widget ) assert(i>=0) self.notebook.remove_page(i) if self.notebook.get_n_pages() == 0: self.widget.set_title("Meld") def on_file_changed(self, srcpage, filename): for c in self.notebook.get_children(): page = c.get_data("pyobject") if page != srcpage: page.on_file_changed(filename) def _append_page(self, page, icon): nbl = NotebookLabel(icon, onclose=lambda b: self.try_remove_page(page)) self.notebook.append_page( page.widget, nbl) self.notebook.set_current_page( self.notebook.page_num(page.widget) ) self.scheduler.add_scheduler(page.scheduler) page.connect("label-changed", self.on_notebook_label_changed) page.connect("file-changed", self.on_file_changed) page.connect("create-diff", lambda obj,arg: self.append_filediff(arg) ) page.connect("status-changed", lambda junk,arg: self.statusbar.set_doc_status(arg) ) def append_dirdiff(self, dirs): assert len(dirs) in (1,2,3) doc = dirdiff.DirDiff(self.prefs, len(dirs)) self._append_page(doc, "tree-folder-normal.png") doc.set_locations(dirs) def append_filediff(self, files): assert len(files) in (1,2,3) doc = filediff.FileDiff(self.prefs, len(files)) seq = doc.undosequence seq.clear() seq.connect("can-undo", self.on_can_undo) seq.connect("can-redo", self.on_can_redo) self._append_page(doc, "tree-file-normal.png") doc.set_files(files) def append_diff(self, paths): aredirs = [ os.path.isdir(p) for p in paths ] arefiles = [ os.path.isfile(p) for p in paths ] if (1 in aredirs) and (1 in arefiles): misc.run_dialog( _("Cannot compare a mixture of files and directories.\n"), parent = self, buttonstype = gtk.BUTTONS_OK) elif 1 in aredirs: self.append_dirdiff(paths) else: self.append_filediff(paths) def append_vcview(self, locations): assert len(locations) in (1,) location = locations[0] doc = vcview.VcView(self.prefs) self._append_page(doc, "vc-icon.png") doc.set_location(location) # # Current doc actions # def current_doc(self): "Get the current doc or a dummy object if there is no current" index = self.notebook.get_current_page() if index >= 0: return self.notebook.get_nth_page(index).get_data("pyobject") class DummyDoc(object): def __getattr__(self, a): return lambda *x: None return DummyDoc() # # Usage # def usage(self, msg): response = misc.run_dialog(msg, self, gtk.MESSAGE_ERROR, gtk.BUTTONS_NONE, [(gtk.STOCK_QUIT, gtk.RESPONSE_CANCEL), (gtk.STOCK_OK, gtk.RESPONSE_OK)] ) if response == gtk.RESPONSE_CANCEL: sys.exit(0) ################################################################################## usage#################################################################################usage_string = _("""Meld is a file and directory comparison tool. Usage: meld Start with no windows open meld <dir> Start with VC browser in 'dir' meld <file> Start with VC diff of 'file' meld <file> <file> [file] Start with 2 or 3 way file comparison meld <dir> <dir> [dir] Start with 2 or 3 way directory comparisonOptions: -h, --help Show this help text and exit -v, --version Display the version and exitFor more information choose help -> contents.Report bugs at http://bugzilla.gnome.org/buglist.cgi?product=meldDiscuss meld at http://mail.gnome.org/mailman/listinfo/meld-list""")version_string = _("""Meld %sWritten by Stephen Kennedy <stevek@gnome.org>""") % version################################################################################## Main#################################################################################def main(): class Unbuffered(object): def __init__(self, file): self.file = file def write(self, arg): self.file.write(arg) self.file.flush() def __getattr__(self, attr): return getattr(self.file, attr) sys.stdout = Unbuffered(sys.stdout) args = sys.argv[1:] if args: if "-h" in args or "--help" in args: print usage_string return if "-v" in args or "--version" in args: print version_string return app = MeldApp() if len(args) == 0: pass elif len(args) == 1: a = args[0] if os.path.isfile(a): doc = vcview.VcView(app.prefs) def cleanup(): app.scheduler.remove_scheduler(doc.scheduler) app.scheduler.add_task(cleanup) app.scheduler.add_scheduler(doc.scheduler) doc.set_location( os.path.dirname(a) ) doc.connect("create-diff", lambda obj,arg: app.append_diff(arg) ) doc.run_diff([a]) else: app.append_vcview( [a] ) elif len(args) in (2,3): app.append_diff(args) else: app.usage( _("Wrong number of arguments (Got %i)") % len(args)) app.main()
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -