#!/usr/bin/env python import sys import gtk import subprocess as s import time import os import gobject import getopt try: import xml.etree.ElementTree as ET # python 2.5 except ImportError: try: import cElementTree as ET # cElementTree is faster except ImportError: import elementtree.ElementTree as ET # fallback on regular ElementTree class DirectoryGUI: def _on_window_destroy(self, widget, data=None): gtk.main_quit() def __init__(self): self.p = None self.builder = gtk.Builder() glade_xml_filename = os.path.join(os.path.dirname(sys.argv[0]), "directory.xml") self.builder.add_from_file(glade_xml_filename) self.window = self.builder.get_object("directory_search_window") self.builder.connect_signals(self) self.progress_bar = self.builder.get_object("progressbar1") self.scrolledwindow = self.builder.get_object("scrolledwindow1") self.entry = self.builder.get_object("entry1") self.entry.connect("changed", self.query_changed) self.button = self.builder.get_object("button1") self.result_label = self.builder.get_object("label10") self.run() self.timer = gobject.timeout_add(100, self.feature_types_progress_timeout) def build_query_command(self): cwd = os.getcwd() cmd = [] prog_path = os.path.join(os.path.dirname(sys.argv[0]), "directory.py") cmd.append(prog_path) cmd.append("--xml=query_results.xml") (model, pathlist) = self.listbox.get_selection().get_selected_rows() feature_types = [] for path in pathlist: row = self.listbox.get_model().get_iter(path) feature_types.append('%s' % self.listStore.get_value(row, 0)) cmd.append(",".join(feature_types)) cmd.append(self.entry.get_text()) self.cmd = cmd def _on_search(self, widget): self.build_query_command() self.progress_bar.set_text("Querying...") cwd = os.getcwd() self.p = s.Popen(self.cmd) self.timer = gobject.timeout_add(100, self.query_progress_timeout) #self.p = s.Popen(["ls","-l"], stderr=s.PIPE, stdout=s.PIPE) def query_progress_timeout(self): if self.p.poll() is None: self.progress_bar.pulse() return True else: self.progress_bar.set_text("Idle") self.populate_query_view() return False def feature_types_progress_timeout(self): try: if self.p.poll() is None: self.progress_bar.pulse() return True except AttributeError: pass self.progress_bar.set_text("Idle") self.populate_filter_treeview() return False def populate_query_view(self): cwd = os.getcwd() self.result_label.set_sensitive(True) self.result_label.set_text('%s\n\n%s:\n%s\n\n%s' % \ ("This window is not yet implemented to show results.", "Results Stored To", os.path.join(cwd, "query_results.xml"), "You may view this file in your browser")) def query_changed(self, widget): selected_rows = \ self.listbox.get_selection().get_selected_rows()[1] entry_text = self.entry.get_text() if len(selected_rows) == 0: self.button.set_sensitive(False) return if entry_text.strip() == '' or entry_text is None: self.button.set_sensitive(False) return self.button.set_sensitive(True) def populate_filter_treeview(self): import xml.etree.ElementTree as ET tree = ET.ElementTree() features_list_filename = os.path.join(os.path.dirname(sys.argv[0]), "features_list.xml") tree.parse(os.path.join(os.getcwd(), features_list_filename)) feature_types = tree.findall("feature_type") self.listStore = gtk.ListStore(str) for feature_type in feature_types: self.listStore.append([feature_type.text]) self.listColumn = gtk.TreeViewColumn("") self.textRenderer = gtk.CellRendererText() self.listColumn.pack_start(self.textRenderer, True) self.listColumn.set_attributes(self.textRenderer, text = 0) self.listbox = gtk.TreeView(self.listStore) self.listbox.append_column(self.listColumn) self.listbox.get_selection().set_mode(gtk.SELECTION_MULTIPLE) self.listbox.set_headers_visible(False) self.listbox.get_selection().connect('changed', self.query_changed) self.scrolledwindow.add(self.listbox) self.listbox.show() def run(self): if Settings.is_refresh_feature_types: cwd = os.getcwd() prog_path = os.path.join(os.path.dirname(sys.argv[0]), "directory.py") self.p = s.Popen([prog_path,"-l","--xml=features_list.xml"], stderr=s.PIPE, stdout=s.PIPE) self.progress_bar.set_text("Finding Filters") def alert(self): pass class Settings(object): is_refresh_feature_types = False def argument_parser(self): opts = [] args = [] try: opts, args = getopt.getopt(sys.argv[1:],"hr",["help","--refresh-feature-types"]) except getopt.GetoptError: self.help() sys.exit(1) for o,a in opts: if o in ("-h","--help"): self.help() sys.exit(0) if o in ("-r","--refresh-feature-types"): Settings.is_refresh_feature_types = True def help(self): print "Options:" print " -h | --help Print help information (this message)." print " -r | --refresh-feature-types Refresh the list of feature types by querying" print " the database when the GUI loads. These features" print " types are used as the search filters." print "" if __name__ == "__main__": settings = Settings() settings.argument_parser() dg = DirectoryGUI() dg.window.show() gtk.main()