#!/usr/bin/python # # Author : Ben Lau # Version : 0.1 # License : New BSD License # import gtk import vte import gtkmozembed import sys import os import re import gobject class Commander(gtk.Window): def __init__(self): self.issue_id = "" self.path = os.getcwd() self._create_ui() # Signal binding self._signal_connect() self.vbox.show_all() return # Change path to the location of ditz repository def change_path(self,path): self.path = path self.index_page = path + "/html/index.html" self.html_created = os.path.exists(self.index_page) if self.html_created: self.browser.load_url("file://" + self.index_page) else: self.browser.load_url("file://" + self.path) self.EditButton.set_sensitive(False) self.CommentButton.set_sensitive(False) self.gohome() return # Open Folder Selection Dialog def open_folder_selection(self,button): dialog = gtk.FileChooserDialog(title = "Open Folder" , action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER, buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL, gtk.STOCK_OK, gtk.RESPONSE_OK)) response = dialog.run() if (response == gtk.RESPONSE_OK): self.change_path(dialog.get_filename()) dialog.destroy() return def gohome(self): self.vte.feed_child("cd " + self.path + " \n") # Add an issue def add_issue(self): self.gohome() self.vte.feed_child("ditz add\n") def edit_issue(self): if self.issue_id != "": self.gohome() self.vte.feed_child("ditz edit " + self.issue_id +" \n") def comment_issue(self): if self.issue_id != "": self.gohome() self.vte.feed_child("ditz comment " + self.issue_id +" \n") # Generate HTML and reload current path def refresh_html(self): self.gohome() self.vte.feed_child("ditz html\n") #self.browser.reload(gtk.GtkMozEmbedReloadFlags.GTK_MOZ_EMBED_FLAG_RELOADNORMAL) gobject.timeout_add(2000,self.browser_reload) def browser_reload(self): if self.html_created: self.browser.reload(0) else: self.html_created = os.path.exists(self.index_page) if self.html_created: self.browser.load_url("file://" + self.index_page) return False def _create_ui(self): #Create UI gtk.Window.__init__(self) width = 800 height = 600 self.set_title("Ditz Commander") self.vbox = gtk.VBox() self.add(self.vbox) self._create_toolbar() self.vpaned = gtk.VPaned() self.vpaned.show() self.vbox.add(self.vpaned) self.browser = gtkmozembed.MozEmbed() self.browser.show() self.browser.set_size_request(width,height * 2 / 3) self.vpaned.add1(self.browser) self.vte = vte.Terminal () self.vte.set_size_request(width,height / 3) self.vte.set_scroll_on_output(True) self.vte.show() self.vte.fork_command() self.vpaned.add2(self.vte) self._create_button_group() return def _create_toolbar(self): self.toolbar = gtk.Toolbar() self.vbox.pack_start(self.toolbar,expand=False,fill=True) self.OpenButton = gtk.ToolButton(gtk.STOCK_OPEN) self.toolbar.add(self.OpenButton) separator = gtk.SeparatorToolItem() self.toolbar.add(separator) self.QuitButton = gtk.ToolButton(gtk.STOCK_QUIT) self.toolbar.add(self.QuitButton) return def _create_button_group(self): # HBox to hold ButtonBox1 and ButtonBox2 hbox = gtk.HBox() self.vbox.pack_end(hbox,expand=False,fill=True) LeftButtonBox = gtk.HButtonBox() LeftButtonBox.set_layout(gtk.BUTTONBOX_START) hbox.add(LeftButtonBox) RightButtonBox = gtk.HButtonBox() RightButtonBox.set_layout(gtk.BUTTONBOX_END) hbox.add(RightButtonBox) self.AddButton = gtk.Button(label="Add") self.AddButton.set_relief(gtk.RELIEF_NONE) LeftButtonBox.add(self.AddButton) self.EditButton = gtk.Button(label="Edit") self.EditButton.set_relief(gtk.RELIEF_NONE) self.EditButton.set_sensitive(False) LeftButtonBox.add(self.EditButton) self.CommentButton = gtk.Button(label="Comment") self.CommentButton.set_relief(gtk.RELIEF_NONE) self.CommentButton.set_sensitive(False) LeftButtonBox.add(self.CommentButton) self.RefreshButton = gtk.Button(label="Refresh") self.RefreshButton.set_relief(gtk.RELIEF_NONE) RightButtonBox.add(self.RefreshButton) def _signal_connect(self): self.connect('delete-event', lambda window, event: gtk.main_quit()) self.QuitButton.connect('clicked', lambda button: gtk.main_quit() ) self.vte.connect('child-exited',gtk.main_quit) self.browser.connect('open-uri',self._open_uri_callback) self.OpenButton.connect('clicked' , self.open_folder_selection) self.RefreshButton.connect('clicked' , lambda button : self.refresh_html() ) self.AddButton.connect('clicked' , lambda button : self.add_issue() ) self.EditButton.connect('clicked' , lambda button : self.edit_issue() ) self.CommentButton.connect('clicked' , lambda button : self.comment_issue() ) def _open_uri_callback(self,mozembed, uri): pattern = r'^.*issue-(?P[0-9a-zA-Z]{40}).html' m = re.search(pattern,uri) if m: self.issue_id = m.group('ID') self.EditButton.set_sensitive(True) self.CommentButton.set_sensitive(True) else: self.issue_id = "" self.EditButton.set_sensitive(False) self.CommentButton.set_sensitive(False) return if __name__ == "__main__": commander = Commander() commander.show() if len(sys.argv) > 1: commander.change_path(sys.argv[1]) else: commander.change_path(os.getcwd()) gtk.main()