[Author Prev][Author Next][Thread Prev][Thread Next][Author Index][Thread Index]

gEDA-cvs: geda_manager.git: branch: master updated (2b4ccc07a13c79397c7563d762756be6bac8c506)



The branch, master has been updated
       via  2b4ccc07a13c79397c7563d762756be6bac8c506 (commit)
      from  184e9c531e0ca6e9b1ee04b15a30040bca700d05 (commit)

Those revisions listed above that are new to this repository have
not appeared on any other notification email; so we list those
revisions in full, below.


=========
 Summary
=========

 src/file_popup.xml |    2 +-
 src/gedamanager.py |  227 ++++++++++++++++++++++++++++++++-------------------
 src/menu.xml       |    2 +-
 src/newproject.py  |    4 +-
 src/project.py     |   10 ++-
 src/settings.py    |    5 +-
 src/utils.py       |  231 ++++++++++++++++++++++++++++++++++++++--------------
 7 files changed, 327 insertions(+), 154 deletions(-)


=================
 Commit Messages
=================

commit 2b4ccc07a13c79397c7563d762756be6bac8c506
Author: Newell Jensen <jensen@xxxxxxxxxxxxxxx>
Date:   Mon Aug 18 00:18:43 2008 -0700

    Added a separate threaded watch using the pyinotify module to help track
    the filesystem changes that are taking place in the projects directory
    structure.  Added a bunch of icons and also some extra classes.

:100644 100644 e8f414a... e336cf8... M	src/file_popup.xml
:100644 100644 2f64bd8... 7f0bf5c... M	src/gedamanager.py
:100644 100644 555f505... 65f5c33... M	src/menu.xml
:100644 100644 ac95ac6... daf080e... M	src/newproject.py
:100644 100644 14823a3... 98f449e... M	src/project.py
:100644 100644 f9001f8... 9a782fd... M	src/settings.py
:100644 100644 900bd4f... 44c9d17... M	src/utils.py

=========
 Changes
=========

commit 2b4ccc07a13c79397c7563d762756be6bac8c506
Author: Newell Jensen <jensen@xxxxxxxxxxxxxxx>
Date:   Mon Aug 18 00:18:43 2008 -0700

    Added a separate threaded watch using the pyinotify module to help track
    the filesystem changes that are taking place in the projects directory
    structure.  Added a bunch of icons and also some extra classes.

diff --git a/src/file_popup.xml b/src/file_popup.xml
index e8f414a..e336cf8 100644
--- a/src/file_popup.xml
+++ b/src/file_popup.xml
@@ -3,7 +3,7 @@
     <separator/>
     <menuitem action="Delete"/>
     <menuitem action="Rename"/>
-    <menuitem action="Copy Existing Dependency..."/>
+    <menuitem action="Copy Existing Dependency for Selected File to the Project..."/>
     <separator/>
   </popup>
 </ui>
diff --git a/src/gedamanager.py b/src/gedamanager.py
index 2f64bd8..7f0bf5c 100644
--- a/src/gedamanager.py
+++ b/src/gedamanager.py
@@ -31,6 +31,7 @@ from project import *
 from settings import *
 from utils import *
 from newproject import *
+from dependencyloop import *
 
 
 class gEDAManager:
@@ -42,7 +43,7 @@ class gEDAManager:
     def __init__(self):
         """ gEDAManager Constructor. """
        # Initialize gEDA Manager
-        self.no_project_name = 'No project loaded...\n\n Select:\n  File->Open Project\n  or File->New Project'
+        self.no_project_name = 'No project loaded...\n\n Select:\n  Project->Open Project\n  or Project->New Project'
         self.settings = Settings()
         if self.settings.project != None:
             self.project = Project(self.settings.project)
@@ -52,7 +53,13 @@ class gEDAManager:
         self.project.connect('saved', self.cb_project_saved)
         self.project.connect('opened', self.cb_project_opened)
         self.project.connect('created', self.cb_project_created)
+        # Set up the project's dependency dictionary
+        self.project.dependency_dict = {}
         self.utils = Utils()
+        gtk.gdk.threads_init()
+        gtk.gdk.threads_enter()
+        self.dependencyloop = DependencyLoop(self)
+        gtk.gdk.threads_leave()
         # Create top-level window
         self.window = gtk.Window(gtk.WINDOW_TOPLEVEL)
         self.window.connect('destroy', self.cb_destroy)
@@ -60,7 +67,7 @@ class gEDAManager:
         self.merge_id = 0
         # TODO create gEDA Manager icon
         self.window.set_icon_from_file('../images/icons/geda-xgsch2pcb-48.png')
-        self.window.set_size_request(900,700)
+        self.window.set_size_request(900,600)
         # Create a Menu UIManager and a Popup UIManager
         self.menu_uimanager = gtk.UIManager()
         self.popup_uimanager = gtk.UIManager()
@@ -85,7 +92,7 @@ class gEDAManager:
         subprocess instances of the gEDA tools.
         """
         # More to be added
-        self.tools = {'sch': None, 'pcb': None, 'gbr': None, 'gattrib': None,
+        self.tools = {'sch': None, 'pcb': None, 'gerbv': None, 'gattrib': None,
                       'editor': None}
         
 
@@ -93,7 +100,7 @@ class gEDAManager:
         """ Method to create the menu bar. """
 
         actiongroup0 = gtk.ActionGroup('gEDAManager')
-        actiongroup0_list = [('File', None, '_File'),
+        actiongroup0_list = [('Project', None, '_Project'),
         ('New Project', None, 'Ne_w Project', None, 'Create New Project', self.cb_new_project),
         ('Open Project', None, 'Open P_roject', None, 'Open Existing Project', self.cb_open_project),
         ('Close Project', None, 'Close Projec_t', None, 'Close Active Project', self.cb_close_project),
@@ -121,17 +128,17 @@ class gEDAManager:
         
         # Set up tooltips
         tooltips = gtk.Tooltips()
-        widget = self.menu_uimanager.get_widget('/MenuBar/File/New Project')
-        action = self.menu_uimanager.get_action('/MenuBar/File/New Project')
+        widget = self.menu_uimanager.get_widget('/MenuBar/Project/New Project')
+        action = self.menu_uimanager.get_action('/MenuBar/Project/New Project')
         tooltips.set_tip(widget, action.get_property('tooltip'))
-        widget = self.menu_uimanager.get_widget('/MenuBar/File/Open Project')
-        action = self.menu_uimanager.get_action('/MenuBar/File/Open Project')
+        widget = self.menu_uimanager.get_widget('/MenuBar/Project/Open Project')
+        action = self.menu_uimanager.get_action('/MenuBar/Project/Open Project')
         tooltips.set_tip(widget, action.get_property('tooltip'))        
-        widget = self.menu_uimanager.get_widget('/MenuBar/File/Close Project')
-        action = self.menu_uimanager.get_action('/MenuBar/File/Close Project')
+        widget = self.menu_uimanager.get_widget('/MenuBar/Project/Close Project')
+        action = self.menu_uimanager.get_action('/MenuBar/Project/Close Project')
         tooltips.set_tip(widget, action.get_property('tooltip'))        
-        widget = self.menu_uimanager.get_widget('/MenuBar/File/Exit')
-        action = self.menu_uimanager.get_action('/MenuBar/File/Exit')
+        widget = self.menu_uimanager.get_widget('/MenuBar/Project/Exit')
+        action = self.menu_uimanager.get_action('/MenuBar/Project/Exit')
         tooltips.set_tip(widget, action.get_property('tooltip'))        
         widget = self.menu_uimanager.get_widget('/MenuBar/Edit/Preferences...')
         action = self.menu_uimanager.get_action('/MenuBar/Edit/Preferences...')
@@ -154,27 +161,17 @@ class gEDAManager:
     def __init_gui_sections__(self):
         """ Method to create the main gui sections of the top-level window. """
         # Partitioning the window
-        vpaned1 = gtk.VPaned()
-        self.vbox1.pack_start(vpaned1, True, True, 0)
-        vpaned1.set_position(500)
-        vpaned1.show()
-
         hpaned1 = gtk.HPaned()
-        vpaned1.pack1(hpaned1, True, True)
-        hpaned1.set_position(250)
+        self.vbox1.pack_start(hpaned1, True, True, 0)
         hpaned1.show()
 
-        vbox2 = gtk.VBox()
-        vbox2.show()
-        hpaned1.pack2(vbox2, True, True)
-
         # Main Window
         # TODO -- once I know what we are going to put there
 
         # Notebook
-        vpaned2 = gtk.VPaned()
-        vpaned2.show()
+        vpaned2 = gtk.VPaned() # This is the vpaned for sources and process
         hpaned1.pack1(vpaned2, True, True)
+        vpaned2.show()
         sources_notebook = gtk.Notebook()
         sources_notebook.show()
         processes_notebook = gtk.Notebook()
@@ -205,7 +202,7 @@ class gEDAManager:
 
         # Models for the Tree Views
         self.sources = gtk.TreeStore(gtk.gdk.Pixbuf, str, str)
-        self.processes = gtk.TreeStore(str, gtk.gdk.Pixbuf)
+        self.processes = gtk.TreeStore(str, gtk.gdk.Pixbuf, gtk.gdk.Pixbuf)
         
         # Tree Views
         self.sources_tree = gtk.TreeView(self.sources)
@@ -229,9 +226,13 @@ class gEDAManager:
         column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
         self.processes_tree.append_column(column)
         processes_pixbuf = gtk.CellRendererPixbuf()
-        processes_pixbuf.set_property('xalign', 0)
+        processes_pixbuf.set_property('xalign', 0.2)
         column = gtk.TreeViewColumn(None, processes_pixbuf, pixbuf=1)
         self.processes_tree.append_column(column)
+        column = gtk.TreeViewColumn(None, processes_pixbuf, pixbuf=2)
+        column.set_sizing(gtk.TREE_VIEW_COLUMN_AUTOSIZE)
+        self.processes_tree.append_column(column)
+        
         
         # set some properties
         self.sources_tree.set_property('enable-tree-lines', True)
@@ -252,7 +253,7 @@ class gEDAManager:
         
         notebook = gtk.Notebook()
         notebook.show()
-        vpaned1.pack2(notebook, True, True)
+        hpaned1.pack2(notebook, True, True)
         notebook.set_tab_pos(gtk.POS_BOTTOM)
         terminal_scrolled_window = gtk.ScrolledWindow()
         terminal_scrolled_window.show()
@@ -273,10 +274,11 @@ class gEDAManager:
         terminal_scrolled_window.add_with_viewport(self.terminal)
         notebook.add(terminal_scrolled_window)
 
-        terminal_icon = gtk.Image()
-        terminal_icon.set_from_file('../images/icons/terminal.jpg')
-        terminal_icon.show()
-        notebook.set_tab_label(notebook.get_nth_page(0), terminal_icon)
+        icon = gtk.IconTheme()
+        terminal_icon = icon.load_icon(self.utils.icon_lut['terminal'], 22, 0)
+        terminal_pixbuf = gtk.Image()
+        terminal_pixbuf.set_from_pixbuf(terminal_icon)
+        notebook.set_tab_label(notebook.get_nth_page(0), terminal_pixbuf)
 
         output_scolled_window = gtk.ScrolledWindow()
         output_scolled_window.show()
@@ -292,10 +294,10 @@ class gEDAManager:
         output_textview.show()
         output_scolled_window.add(output_textview)
 
-        output_icon = gtk.image_new_from_stock('gtk-justify-fill',
-                                               gtk.ICON_SIZE_BUTTON)
-        output_icon.show()
-        notebook.set_tab_label(notebook.get_nth_page(1), output_icon)
+        output_icon = icon.load_icon(self.utils.icon_lut['output'], 22, 0)
+        output_pixbuf = gtk.Image()
+        output_pixbuf.set_from_pixbuf(output_icon)
+        notebook.set_tab_label(notebook.get_nth_page(1), output_pixbuf)
 
         errors_scrolled_window = gtk.ScrolledWindow()
         errors_scrolled_window.show()
@@ -311,10 +313,13 @@ class gEDAManager:
         errors_textview.show()
         errors_scrolled_window.add(errors_textview)
 
-        errors_icon = gtk.image_new_from_stock('gtk-dialog-error',
-                                               gtk.ICON_SIZE_BUTTON)
-        errors_icon.show()
-        notebook.set_tab_label(notebook.get_nth_page(2), errors_icon)
+        errors_icon = icon.load_icon(self.utils.icon_lut['errors'], 22, 0)
+        errors_pixbuf = gtk.Image()
+        errors_pixbuf.set_from_pixbuf(errors_icon)
+        notebook.set_tab_label(notebook.get_nth_page(2), errors_pixbuf)
+
+        self.output_textbuffer.insert(self.output_textiter, 'Output log:\n')
+        self.errors_textbuffer.insert(self.errors_textiter, 'Error log:\n')
 
         # Finally add data to the store
         self.set_sources_tree_to_project()
@@ -382,8 +387,8 @@ class gEDAManager:
         self.sources_tree.set_property('headers-visible', True)
         column = self.sources_tree.get_column(0)
         column.set_title(self.project.name)
-        save_project_as_menuitem = self.menu_uimanager.get_widget('/MenuBar/File/Save Project As...')
-        close_project_menuitem = self.menu_uimanager.get_widget('/MenuBar/File/Close Project')
+        save_project_as_menuitem = self.menu_uimanager.get_widget('/MenuBar/Project/Save Project As...')
+        close_project_menuitem = self.menu_uimanager.get_widget('/MenuBar/Project/Close Project')
         close_project_menuitem.set_sensitive(False)
 
 
@@ -393,8 +398,8 @@ class gEDAManager:
         """
         # File Menu
         self.sources_tree.set_property('headers-visible', False)        
-        save_project_as_menuitem = self.menu_uimanager.get_widget('/MenuBar/File/Save Project As...')
-        close_project_menuitem = self.menu_uimanager.get_widget('/MenuBar/File/Close Project')
+        save_project_as_menuitem = self.menu_uimanager.get_widget('/MenuBar/Project/Save Project As...')
+        close_project_menuitem = self.menu_uimanager.get_widget('/MenuBar/Project/Close Project')
         close_project_menuitem.set_sensitive(True)
 
 
@@ -437,12 +442,6 @@ class gEDAManager:
         self.sources.append(parent, [image, self.project.name + '.gm', path])
         self.sources_tree.expand_all()
 
-        """ This is the only place in the gEDA Manager where we actually
-         manipulate the project's file list.  The rest is done in the Utils
-         class.  The reason we do it here is because it is a brand new project
-         and it is not a bid deal to push out a utility just for this. """
-        self.project.file_list = [self.project.name, [self.project.name + '.gm']]
-
 
     def load_tree(self, file_list, parent=None, parent_path=None):
         """!
@@ -460,7 +459,7 @@ class gEDAManager:
             parent = n_parent # parent used below
             file_list = file_list[1] # Now pointing to the nested list
 
-        # In the file_list we have folders, nodes, and lists to recurse over
+        # In the file_list we have folders, nodes --> lists to recurse over
         for index, f in enumerate(file_list):
             if (index + 1) < len(file_list): # Check for folder
                 if isinstance(file_list[index+1], list):
@@ -605,7 +604,6 @@ class gEDAManager:
     # Callback Methods -- signal handlers are event driven
     ######################################################
 
-    # Help Menu #
     def cb_show_about_dialog(self, menuitem, data=None):
         """!
         Event handler for About menu button.
@@ -701,6 +699,7 @@ class gEDAManager:
         self.save_settings()
         self.write_logs()
         self.kill_processes()
+        self.dependencyloop.kill_thread()        
         
 
     def cb_delete(self, menuitem, data=None):
@@ -737,7 +736,7 @@ class gEDAManager:
         else:
             self.output_textbuffer.insert(self.output_textiter, 'Project saved.\n')
         self.set_menu_defaults()
-        self.set_sources_tree_to_project()
+#        self.set_sources_tree_to_project()
 
 
     def cb_project_opened(self, widget, event):
@@ -842,14 +841,14 @@ class gEDAManager:
         
         def response_to_dialog(entry, dialog, response):
             dialog.response(response)
-            print response
+
 
         dialog = gtk.MessageDialog(self.window,
                                    (gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT),
                                    gtk.MESSAGE_QUESTION,
                                    gtk.BUTTONS_OK_CANCEL,
                                    gtk.STOCK_DIRECTORY)
-        dialog.set_markup('<b>Please enter the new file name (extension will be added):</b>')
+        dialog.set_markup('<b>Please enter the new file name\n(add extension to override defaults):</b>')
         entry = gtk.Entry()
         entry.show()
         entry.connect('activate', response_to_dialog, dialog, gtk.RESPONSE_OK)
@@ -878,13 +877,15 @@ class gEDAManager:
         # populate the tree view
         icon = gtk.IconTheme()
         image = icon.load_icon(self.utils.icon_lut['pcb'], 22, 0)
-        newsources.append(None, [image, 'PCB'])
+        newsources.append(None, [image, 'PCB (.pcb)'])
         image = icon.load_icon(self.utils.icon_lut['sch'], 22, 0)
-        newsources.append(None, [image, 'Schematic'])
+        newsources.append(None, [image, 'Schematic (.sch)'])
         image = icon.load_icon(self.utils.icon_lut['v'], 22, 0)
-        newsources.append(None, [image, 'Verilog'])
+        newsources.append(None, [image, 'Verilog (.v)'])
         image = icon.load_icon(self.utils.icon_lut['vhd'], 22, 0)
-        newsources.append(None, [image, 'VHDL'])
+        newsources.append(None, [image, 'VHDL (.vhd)'])
+        image = icon.load_icon(self.utils.icon_lut['sym'], 22, 0)
+        newsources.append(None, [image, 'Symbol (.sym)'])
 
         # add to the hbox
         hbox.pack_start(newsources_tree, False, False)
@@ -901,6 +902,12 @@ class gEDAManager:
         else:
             print 'empty'
 
+        # Now call the program with the new file
+        # Check to see if there is already an instance open
+        # Add this file to the dependency dictionary
+        # Add this file to the project's file_list
+
+    @exceptions
     def cb_add_copy_source(self, menuitem, data=None):
         """!
         Event occurs when the user wants to add a source to the project
@@ -918,29 +925,30 @@ class gEDAManager:
         response = dialog.run()
         if response == gtk.RESPONSE_OK:
             filename = dialog.get_filename()
+            name = self.utils.get_node_name(filename)
+            print 'name adding:', name
             self.utils.update_file_list(self, 0, filename)
-            self.output_textbuffer.insert(self.output_textiter, 'Copy of existing source added: ' + filename + '.\n')                                
+            self.utils.add_to_dependency_dict(self, name)
         dialog.destroy()
 
 
+    @exceptions
     def cb_add_copy_dependency(self, menuitem, data=None):
         """!
         Event occurs when the user wants to add a source to the project
         @param menuitem that threw the event.
         @param data optional to pass in.
         """
-        # Make the user choose which destination directory they want this
-        # dependency file to be in
-        # Then, make the user choose which file they want.
-        # Make a window that has a directory chooser like in the assistant
-        # and then a FileChooserDialog box
+        selection = self.sources_tree.get_selection()
+        model, selection_iter = selection.get_selected()
+        selected_node = self.sources.get_value(selection_iter, 2)
         dialog = gtk.MessageDialog(self.window,
                                    (gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT),
                                    gtk.MESSAGE_OTHER,
                                    gtk.BUTTONS_OK_CANCEL,
                                    gtk.STOCK_DIRECTORY)
-        dialog.set_markup('<b>Select dependency file and its target location\nwithin the project.</b>')
-        dialog.set_title('Copy Existing Dependency...')
+        dialog.set_markup('<b>Choose file that is dependent on selected file.\nChoose target directory (within project) for this file.</b>')
+        dialog.set_title('Copy Existing Dependency for Selected File to the Project...')
         hbox = gtk.HBox()
         hbox.show()
         filebutton = gtk.FileChooserButton('Target Location')
@@ -964,10 +972,40 @@ class gEDAManager:
         label.show()
         hbox.pack_end(label)
         dialog.vbox.pack_end(hbox, True, True, 0)
-        
         dialog.show()
-        dialog.run()
-        new_text = filebutton.get_filename()
+        response = dialog.run()
+        if response == gtk.RESPONSE_OK:
+            directory = filebutton.get_filename()
+            new_file = embed_fc.get_filename()
+            if new_file != None:
+                
+                # add new file to the dependency_dict
+                self.utils.add_to_dependency_dict(self, directory + '/' + new_file)
+                # Find out what file it is so we can pick an icon for it
+                name = self.utils.get_node_name(new_file)        
+                icon = gtk.IconTheme()
+                image = icon.load_icon(self.utils.icon_lut[self.utils.get_node_ext(name)], 22, 0)
+
+                for row in self.sources:
+                    # Get the name of the node
+                    if row[2] == directory:
+                        row_iter = row.iterchildren() # This will be True for the root
+                    else:
+                        self.errors_textbuffer.insert(self.errors_textiter, directory + " is not present in the project's directory structure.\n")
+                        return
+
+                # Copy the new_file to the chosen directory
+                # Also update the sources with the proper node
+                files = os.listdir(directory)
+                if name not in files:
+                    os.system('cp ' + new_file + ' ' + directory)
+                    self.sources.append(row_iter, [image, name, path])
+                    self.output_textbuffer.insert(self.output_textiter, 'Added copy of source:' + new_file + ' to ' + directory + '.\n')
+                else:
+                    self.output_textbuffer.insert(self.output_textiter, name + ' is already present in the directory: ' + directory + '.\n')
+
+                # Add the new file as a dependency for the selected file
+                self.project.dependency_dict[selected_node].append((True, new_file))
         dialog.destroy()
         
 
@@ -1010,8 +1048,7 @@ class gEDAManager:
         path = selected_node + '/' + text
 
         # See if this directory already exists
-        f = os.path.exists(path)
-        if f: # delete directory recursively
+        if os.path.exists(path): # delete directory recursively
             shutil.rmtree(path)
             flag = True
             i = 0
@@ -1048,6 +1085,14 @@ class gEDAManager:
         Event handler for renaming a file, folder, or project.
         @param action is the gtk.Action object involved with this event.
         """
+        # TODO -- note...this is currently broken
+        # I need to add the functionality that when the project
+        # name is changed, that it iterates recursively over all
+        # the subdirectories and changes the names in the model.
+        # Currently I am getting errors because I change the project
+        # but not the subdirectory names in the nodes.
+        # The error for this is actually seen in the utils.get_processes_tree
+        # method in the Utils class.
         def response_to_dialog(entry, dialog, response):
             dialog.response(response)
 
@@ -1075,7 +1120,7 @@ class gEDAManager:
         dialog.destroy()
         new_path = old_path.rpartition('/')[0] + '/' + new_text
 
-        if old_path == self.project.directory and '.' not in new_text: 
+        if old_path == self.project.directory and '.' not in new_text:
             # Project Folder
             os.rename(old_path, new_path)
             model[path][1] = new_text
@@ -1086,13 +1131,13 @@ class gEDAManager:
             self.project.name = new_text
             self.project.file_list[0] = new_text
             self.project.file_list[1][0] = new_text + '.gm'
-            self.project.save()
 
             model[(0)][1] = new_text
-            model[(0)][2] = new_path + '/' + new_text
+            model[(0)][2] = new_path
             model[(0,0)][1] = new_text + '.gm'
             model[(0,0)][2] = new_path + '/' + new_text + '.gm'
-            self.output_textbuffer.insert(self.output_textiter, 'Project changed from ' + old_path + ' to ' + new_path + '.\n')                        
+            self.output_textbuffer.insert(self.output_textiter, 'Project changed from ' + old_path + ' to ' + new_path + '.\n')
+            self.project.save()
 
         elif '.' in new_text and '.' in old_path:
             # File
@@ -1132,21 +1177,32 @@ class gEDAManager:
         if selection_iter != None:
             selected_node = self.sources.get_value(selection_iter, 2)
             name = self.utils.get_node_name(selected_node)
-            if '.' in name:
+            if '.' in name and not name.endswith('.gm'):
                 # Logic to call function to find what type of file it is
                 # and then to populate the according tree view
                 ext = name.split('.')[-1]
-                self.utils.get_processes_tree(self, ext, None, True)
+                self.utils.get_processes_tree(self, selected_node, ext, None, True)
                 # Update 'Processes: ' for the 'Processes' tree
                 column = self.processes_tree.get_column(0)
                 column.set_title('Processes for: ' + name)
-            else: # We have a folder
-                # Logic to call the functions to populate the 'Processes' tree
-                # view.
-                self.utils.get_processes_tree(self, None, True, True)
-                # Update 'Processes: ' for the 'Processes' tree
+                column = self.processes_tree.get_column(2)
+                column.set_title('status')
+                
+##             elif selected_node != self.project.directory: # We have a folder
+##                 # Logic to call the functions to populate the 'Processes' tree
+##                 # view.
+##                 self.utils.get_processes_tree(self, selected_node, None, True, True)
+##                 # Update 'Processes: ' for the 'Processes' tree
+##                 column = self.processes_tree.get_column(0)
+##                 column.set_title('Processes for all files in: ' + name)
+            else: # We have the project folder
+                # Clear out the columns
                 column = self.processes_tree.get_column(0)
-                column.set_title('Processes for all files in: ' + name)
+                column.set_title('')
+                column = self.processes_tree.get_column(2)
+                column.set_title('')
+                # clear out the processes
+                self.processes.clear()
 
 
     def cb_popup_deactivate(self, popup_menu, merge_id):
@@ -1179,7 +1235,7 @@ class gEDAManager:
             actiongroup = gtk.ActionGroup('Popup')
             actiongroup_list = [('Rename', None, '_Rename', None, None, self.cb_rename),
                                 ('Delete', gtk.STOCK_DELETE, '_Delete', '<Control>d', None, self.cb_delete),
-                                ('Copy Existing Dependency...', None, 'Copy Existing _Dependency...', None, None, self.cb_add_copy_dependency),
+                                ('Copy Existing Dependency for Selected File to the Project...', None, 'Copy Existing _Dependency for Selected File to the Project...', None, None, self.cb_add_copy_dependency),
                                 ('New Source...', gtk.STOCK_FILE, '_New Source...', None, None, self.cb_new_source),
                                 ('Copy Existing Source To Project...', gtk.STOCK_DND_MULTIPLE, '_Copy Existing Source To Project...', None, None, self.cb_add_copy_source),
                                 ('New Folder', gtk.STOCK_DIRECTORY, 'New _Folder', None, None, self.cb_new_folder),
@@ -1219,6 +1275,7 @@ class gEDAManager:
         self.save_settings()
         self.write_logs()
         self.kill_processes()
+        self.dependencyloop.kill_thread()        
 
 
     ########################################################
diff --git a/src/menu.xml b/src/menu.xml
index 555f505..65f5c33 100644
--- a/src/menu.xml
+++ b/src/menu.xml
@@ -1,6 +1,6 @@
 <ui>
   <menubar name="MenuBar">
-    <menu action="File">
+    <menu action="Project">
       <menuitem action="New Project"/>
       <menuitem action="Open Project"/>
       <menuitem action="Close Project"/>
diff --git a/src/newproject.py b/src/newproject.py
index ac95ac6..daf080e 100644
--- a/src/newproject.py
+++ b/src/newproject.py
@@ -285,13 +285,13 @@ class NewProject:
             # Set new project attributes
             self.project.name = self.get_filename().split('.')[0]
             self.project.directory = self.get_path() + '/' + self.project.name.split('.')[0]
+            self.project.dependency_dict = {}
+            self.project.file_list = [self.project.name, [self.project.name + '.gm']]            
             # Remove directories with imported remove_tree
             if self.confirm_overwrite.get_active():
                 shutil.rmtree(self.project.directory)
 
             os.mkdir(self.project.directory)
-            # The file_list is populated in the gedamanager
-            self.project.file_list = None
             self.project.create()
         except IOError, (errno, strerror):
             md = gtk.MessageDialog(self.assistant,
diff --git a/src/project.py b/src/project.py
index 14823a3..98f449e 100644
--- a/src/project.py
+++ b/src/project.py
@@ -26,8 +26,6 @@
 import os, sys, yaml, gtk, pygtk, gobject
 pygtk.require('2.0')
 
-# i18n TODO
-import gettext
 
 class Project(gobject.GObject):
     """
@@ -76,13 +74,16 @@ class Project(gobject.GObject):
                 stream = file(path, 'r')
                 for data in yaml.load_all(stream):
                     self.file_list = data['file_list']
+                    self.dependency_dict = data['dependency_dict']
                     stream.close()
             elif not project:
                 self.file_list = None
+                self.dependency_dict = None
         else:
             self.name = None
             self.directory = None
             self.file_list = None
+            self.dependency_dict = None
         self.clean = False
 
 
@@ -94,6 +95,7 @@ class Project(gobject.GObject):
         self.name = None
         self.directory = None
         self.file_list = None
+        self.dependency_dict = None
         self.emit('closed', True)
 
 
@@ -115,7 +117,8 @@ class Project(gobject.GObject):
             path = self.directory + '/' + self.name + '.gm'
             try:
                 stream = file(path, 'w')
-                yaml.dump({'project': path, 'file_list': self.file_list},
+                yaml.dump({'project': path, 'file_list': self.file_list,
+                           'dependency_dict': self.dependency_dict},
                       stream, default_flow_style=False)
                 stream.close()
             except IOError:
@@ -138,6 +141,7 @@ class Project(gobject.GObject):
             stream = file(path, 'r')
             for data in yaml.load_all(stream):
                 self.file_list = data['file_list']
+                self.dependency_dict = data['dependency_dict']
             self.clean = True
             self.emit('opened', True)
         except IOError:
diff --git a/src/settings.py b/src/settings.py
index f9001f8..9a782fd 100644
--- a/src/settings.py
+++ b/src/settings.py
@@ -25,6 +25,7 @@
 #@author Newell Jensen
 
 import os, sys, gtk, string, signal, yaml
+from subprocess import *
 
 
 class Settings:
@@ -97,8 +98,8 @@ class Settings:
         apps = []
         for app in self.geda_apps:
             # Check to see if program is installed
-            cmd = os.popen("which "+ app)
-            path = cmd.read()
+            args = 'which ' + app
+            path = Popen(['which', app], stdout=PIPE).communicate()[0]
             #get name from path
             path = path.strip('\n')
             geda_app = path.rsplit('/',1)
diff --git a/src/utils.py b/src/utils.py
index 900bd4f..44c9d17 100644
--- a/src/utils.py
+++ b/src/utils.py
@@ -40,7 +40,7 @@ class Utils:
     def __init__(self):
         """ Constructor. """
         self.directory = os.getcwd()
-        self.__icons__()
+        self.__setup__()
         # Set up the DBUS session bus
         dbus_loop = DBusGMainLoop()
         self.session_bus = dbus.SessionBus(mainloop=dbus_loop)
@@ -49,12 +49,13 @@ class Utils:
         self.empty_char_array = dbus.Array('', signature='s')
 
 
-    def __icons__(self):
-        """ Method to load the icon look up table. """
+    def __setup__(self):
+        """ Method to load the icon look up table and netlists list. """
+
+        self.netlists = ['bom2','calay','mathematica','vipec','geda','systemc','allegro','redac','drc2','cascade','pads','bae','pcbpins','vams','drc','gsch2pcb','partslist2','partslist3','partslist-common','gossip','maxascii','PCB','vhdl','tango','spice-sdb','partstlist1','PCBboard','switchcap','osmond','spice','verilog','bom','eagle','protelII','futurenet2','gnetlist']
+        
         image = gtk.gdk.pixbuf_new_from_file('../images/icons/geda-xgsch2pcb-48.png')
         gtk.icon_theme_add_builtin_icon('gEDAManager', 22, image)
-        image = gtk.gdk.pixbuf_new_from_file('../images/icons/terminal.jpg')
-        gtk.icon_theme_add_builtin_icon('terminal', 22, image)
         image = gtk.gdk.pixbuf_new_from_file('../images/bitmaps/gq-folder.png')
         gtk.icon_theme_add_builtin_icon('folder', 22, image)
         image = gtk.gdk.pixbuf_new_from_file('../images/bitmaps/pn-project.bmp')
@@ -77,10 +78,24 @@ class Utils:
         gtk.icon_theme_add_builtin_icon('icarus', 22, image)        
         image = gtk.gdk.pixbuf_new_from_file('../images/bitmaps/GHDL_logo-22.png')
         gtk.icon_theme_add_builtin_icon('ghdl', 22, image)        
-
-
-
-        self.icon_lut = {'gattrib': 'geda-gattrib',
+        image = gtk.gdk.pixbuf_new_from_file('../images/bitmaps/application_xp_terminal.png')
+        gtk.icon_theme_add_builtin_icon('terminal', 22, image)        
+        image = gtk.gdk.pixbuf_new_from_file('../images/bitmaps/tick.png')
+        gtk.icon_theme_add_builtin_icon('updated', 22, image)        
+        image = gtk.gdk.pixbuf_new_from_file('../images/bitmaps/flag_red.png')
+        gtk.icon_theme_add_builtin_icon('outdated', 22, image)        
+        image = gtk.gdk.pixbuf_new_from_file('../images/bitmaps/report.png')
+        gtk.icon_theme_add_builtin_icon('output', 22, image)        
+        image = gtk.gdk.pixbuf_new_from_file('../images/bitmaps/exclamation.png')
+        gtk.icon_theme_add_builtin_icon('errors', 22, image)        
+
+
+        self.icon_lut = {'errors': 'errors',
+                         'output': 'output',
+                         'outdated': 'outdated',
+                         'updated': 'updated',
+                         'terminal': 'terminal',
+                         'gattrib': 'geda-gattrib',
                          'gschem': 'geda-gschem',
                          'spice': 'spice',
                          'icarus': 'icarus',
@@ -134,6 +149,26 @@ class Utils:
             return 'folder' 
 
 
+    def get_status_image(self, gedamanager, selected_node, process_ext):
+        """!
+        Method to get the status image for the process.
+        @param gedamanager is the current gEDAManager instance.
+        @param selected_node is the currently selected node in the 'Sources' tree view.
+        @param process_ext is the type of file that is having its status set (updated/outdated)
+        @return an IconTheme image from the self.icon_lut structure.
+        """
+        g = gedamanager
+        name = self.get_node_name(selected_node)
+        icon = gtk.IconTheme()        
+        if name in g.project.dependency_dict:
+            dependent_files = g.project.dependency_dict[name]
+            for tup in dependent_files:
+                if tup[0] and tup[1].endswith(process_ext):
+                    return icon.load_icon(self.icon_lut['updated'], 22, 0)
+        # If nothing found in the loop, then it is outdated
+        return icon.load_icon(self.icon_lut['outdated'], 22, 0)
+                    
+
     @exceptions
     def update_file_list(self, gedamanager, index=None, filename=None):
         """!
@@ -169,39 +204,53 @@ class Utils:
 
         selection = g.sources_tree.get_selection()
         model, selection_iter = selection.get_selected()
+        if selection_iter == None:
+            selection_iter = g.sources.get_iter_first()
         selected_node = g.sources.get_value(selection_iter, 2)
-        name = self.get_node_name(selected_node)
         if filename != None:
             name = self.get_node_name(filename)
+        else:
+            name = self.get_node_name(selected_node)
         icon = gtk.IconTheme()
         image = icon.load_icon(self.icon_lut[self.get_node_ext(name)], 22, 0)
         path = selected_node + '/' + name
-
+        
         if index == 0:
             # Logic here for copying the file to the selected_node's folder
             # First check that a file with the same name does not exist
-
             files = os.listdir(selected_node)
             if name not in files:
                 os.system('cp ' + filename + ' ' + selected_node)
                 g.sources.append(selection_iter, [image, name, path])
                 g.output_textbuffer.insert(g.output_textiter, 'Added copy of source:' + filename + ' to ' + selected_node + '.\n')
+                if name not in g.project.dependency_dict:
+                    g.project.dependency_dict[name] = []
             else:
-                g.output_textbuffer.insert(g.output_textiter, 'This file is already present in the directory.\n')
+                g.output_textbuffer.insert(g.output_textiter, name + ' is already present in the directory: ' + selected_node + '.\n')
         elif index == 1:
             # Logic here to delete the selected file
             f = os.path.exists(selected_node)
             if f:
                 os.system('rm ' + selected_node)
                 g.sources.remove(selection_iter)
-                g.output_textbuffer.insert(g.output_textiter, 'Deleted: ' + selected_node + '.\n')                                                    
+                g.output_textbuffer.insert(g.output_textiter, 'Deleted: ' + selected_node + '.\n')
+                node = self.get_node_name(selected_node)
+                print 'node:', node
+                if node in g.project.dependency_dict:
+                    print 'deleting from dependency list: ', node
+                    del g.project.dependency_dict[node]
         elif index == 2:
             # Logic here to delete the folder
             f = os.path.exists(selected_node)
             if f: # delete directory recursively
+                for f in os.listdir(selected_node):
+                    if f in g.project.dependency_dict:
+                        print 'yes'
+                        del g.project.dependency_dict[f]
                 os.system('rm -rf ' + selected_node)
                 g.sources.remove(selection_iter)
-                g.output_textbuffer.insert(g.output_textiter, 'Folder deleted: ' + selected_node + '.\n')                                                                        
+                g.output_textbuffer.insert(g.output_textiter, 'Folder deleted: ' + selected_node + '.\n')
+
         # Create Project's File List
         g.project.file_list = [] 
         for row in g.sources:
@@ -216,14 +265,16 @@ class Utils:
                         child_list.remove(None)
                 g.project.file_list.append(child_list)
 
+        g.project.save()
         g.sources_tree.expand_all()
 
 
     @exceptions
-    def get_processes_tree(self, gedamanager, ext=None, folder=None, clear=None):
+    def get_processes_tree(self, gedamanager, selected_node=None, ext=None, folder=None, clear=None):
         """!
         Method to populate the 'Processes' tree view in the gEDA Manager.
-        @param gedamanager is the current gEDAManager instance.        
+        @param gedamanager is the current gEDAManager instance.
+        @param selected_node is the selected node in the 'Sources' tree view.
         @param ext is the filename extension for the currently selected node
         in the 'Sources' tree view.
         @param folder is a flag used to let the method know whether or not a
@@ -255,82 +306,88 @@ class Utils:
             for ext in extensions:
                 # recursively structure the tree
                 if ext in self.icon_lut:
-                    self.get_processes_tree(g, ext, True)
+                    self.get_processes_tree(g, selected_node, ext, True)
                 else:
                     print 'self.icon_lut does not contain:', ext
             return
             
         if ext == 'sch':
             # Parent folders
-            simulation = g.processes.append(None, ['Simulate Schematic(s)', None])
-            create_pcb = g.processes.append(None, ['Create PCB for Schematic(s)', None])
-            create_netlist = g.processes.append(None, ['Create Netlist for Schematic(s)', None])
-            modify_attributes = g.processes.append(None, ['Modify Attributes for Schematic(s)', None])
+            simulation = g.processes.append(None, ['Simulate Schematic(s)', None, None])
+            create_pcb = g.processes.append(None, ['Create or Update PCB for Schematic(s)', None, None])
+            create_netlist = g.processes.append(None, ['Create or Update Netlist for Schematic(s)', None, None])
+            modify_attributes = g.processes.append(None, ['Modify Attributes for Schematic(s)', None, None])
 
             # Simulate
             image = icon.load_icon(self.icon_lut['spice'], 22, 0) 
-            g.processes.append(simulation, ['gspiceui', image])
+            g.processes.append(simulation, ['gspiceui', image, None])
 
             # PCB
             image = icon.load_icon(self.icon_lut['g2p'], 22, 0)
-            g.processes.append(create_pcb, ['gsch2pcb', image])
+            status_image = self.get_status_image(g, selected_node, 'pcb')
+            print 'selected_node:', selected_node
+            print 'status_image for pcb:',status_image
+            g.processes.append(create_pcb, ['gsch2pcb', image, status_image])
 
             # Netlists
-            netlists = ['bom2','calay','mathematica','vipec','geda','systemc','allegro','redac','drc2','cascade','pads','bae','pcbpins','vams','drc','gsch2pcb','partslist2','partslist3','partslist-common','gossip','maxascii','PCB','vhdl','tango','spice-sdb','partstlist1','PCBboard','switchcap','osmond','spice','verilog','bom','eagle','protelII','futurenet2']
             image = icon.load_icon(self.icon_lut['other'], 22, 0)
-            gnetlist = g.processes.append(create_netlist, ['gnetlist', image])
-            for netlist in sorted(netlists):
-                g.processes.append(gnetlist, [netlist, None])
+            gnetlist = g.processes.append(create_netlist, ['gnetlist', image, None])
+            for netlist in sorted(self.netlists):
+                status_image = self.get_status_image(g, selected_node, netlist)
+                g.processes.append(gnetlist, [netlist, None, status_image])
 
             # Modify attributes
             image = icon.load_icon(self.icon_lut['other'], 22, 0) #refdes
-            g.processes.append(modify_attributes, ['refdes_renum', image])
+            g.processes.append(modify_attributes, ['refdes_renum', image, None])
             image = icon.load_icon(self.icon_lut['other'], 22, 0) #grenum
-            g.processes.append(modify_attributes, ['grenum', image])
+            g.processes.append(modify_attributes, ['grenum', image, None])
             image = icon.load_icon(self.icon_lut['gattrib'], 22, 0) 
-            g.processes.append(modify_attributes, ['gattrib', image])
+            g.processes.append(modify_attributes, ['gattrib', image, None])
 
         elif ext == 'pcb':
             # Parent folders
-            create_gerber = g.processes.append(None, ['Create Gerber files', None])            
-            image = icon.load_icon(self.icon_lut['pcb'], 22, 0) 
-            g.processes.append(create_gerber, ['PCB', image])
+            create_gerber = g.processes.append(None, ['Create or Update Gerber files', None, None])            
+            image = icon.load_icon(self.icon_lut['pcb'], 22, 0)
+            status_image = self.get_status_image(g, selected_node, 'gbr')
+            g.processes.append(create_gerber, ['pcb', image, status_image])
 
         elif ext == 'gbr':
             # Parent folders
-            analyze_gerber = g.processes.append(None, ['View Gerber file', None])
+            analyze_gerber = g.processes.append(None, ['View Gerber file', None, None])
             image = icon.load_icon(self.icon_lut['gbr'], 22, 0) 
-            g.processes.append(analyze_gerber, ['Gerbv', image])
+            g.processes.append(analyze_gerber, ['gerbv', image, None])
 
         elif ext == 'sym':
             # Parent folders
-            check_symbols = g.processes.append(None, ['Check Symbols', None])
+            check_symbols = g.processes.append(None, ['Check Symbols', None, None])
             image = icon.load_icon(self.icon_lut['sym'], 22, 0) 
-            g.processes.append(check_symbols, ['gsymcheck', image])
+            g.processes.append(check_symbols, ['gsymcheck', image, None])
 
         elif ext == 'v':
             # Parent folders
-            compile_source = g.processes.append(None, ['Compile Verilog', None])
+            compile_source = g.processes.append(None, ['Compile Verilog', None, None])
             
-            comsim_source = g.processes.append(None, ['Compile and Simulate Verilog', None])
-            image = icon.load_icon(self.icon_lut['icarus'], 22, 0) 
-            g.processes.append(compile_source, ['icarus-compile', image])
-            g.processes.append(comsim_source, ['icarus-compile->simulate', image])
+            comsim_source = g.processes.append(None, ['Compile and Simulate Verilog', None, None])
+            image = icon.load_icon(self.icon_lut['icarus'], 22, 0)
+            g.processes.append(compile_source, ['icarus-compile', image, None])
+            g.processes.append(comsim_source, ['icarus-compile->gtkwave-simulate', image, None])
 
         elif ext == 'vcd':
             # Parent folders
-            simulate = g.processes.append(None, ['Simulate', None])
+            # TODO -- need to find out if this is a from a .vhd file
+            # or a .v file.  Then either put a ghdl icon or icarus icon
+            simulate = g.processes.append(None, ['Simulate', None, None])
             image = icon.load_icon(self.icon_lut['icarus'], 22, 0) 
-            g.processes.append(simulate, ['icarus verilog', image])
+            g.processes.append(simulate, ['iverilog', image, None])
 
         elif ext == 'vhd' or ext == 'vhdl':
             # Parent folders
-            compile_source = g.processes.append(None, ['Compile VHDL', None])
+            compile_source = g.processes.append(None, ['Compile VHDL', None, None])
             
-            comsim_source = g.processes.append(None, ['Compile and Simulate VHDL', None])
+            comsim_source = g.processes.append(None, ['Compile and Simulate VHDL', None, None])
             image = icon.load_icon(self.icon_lut['ghdl'], 22, 0) 
-            g.processes.append(compile_source, ['ghdl-compile', image])
-            g.processes.append(comsim_source, ['ghdl-compile->simulate', image])
+            g.processes.append(compile_source, ['ghdl-compile', image, None])
+            g.processes.append(comsim_source, ['ghdl-compile->gtkwave-simulate', image, None])
             
         os.chdir(current_directory)            
 
@@ -369,11 +426,12 @@ class Utils:
         """
         g = gedamanager
         selected_node = g.processes[path][0]
-        print 'selected_node:',selected_node
         selection = g.sources_tree.get_selection()
         model, selection_iter = selection.get_selected()
-        selected_source = g.sources.get_value(selection_iter, 2)
-        print 'selected_source:',selected_source
+        highlighted_source = g.sources.get_value(selection_iter, 2)
+        if highlighted_source not in g.project.dependency_dict:
+            g.project.dependency_dict[highlighted_source] = []
+        self.run_command(g, selected_node, highlighted_source)
 
         
     @exceptions
@@ -391,7 +449,7 @@ class Utils:
         # Sources
         if ext != None:
             if ext == 'sch' or ext == 'sym':
-                if g.tools['sch'] == None or g.sch.poll() == 0:
+                if g.tools['sch'] == None or g.tools['sch'].poll() == 0:
                     g.tools['sch'] = Popen(['gschem', selected_node], stdin=PIPE)
                 elif g.tools['sch'].poll() == None: # Process is still running
 ##                     pcb_instances = self.dbus_iface.ListQueuedOwners('org.seul.geda.gschem')
@@ -420,11 +478,12 @@ class Utils:
                     self.pcb_actions_iface = dbus.Interface(pcb_obj, 'org.seul.geda.pcb.actions')
                     self.pcb_actions_iface.ExecAction('Quit', self.empty_char_array)
             elif ext == 'gbr':
-                if g.tools['gbr'] == None or g.tools['gbr'].poll() == 0:
-                    g.tools['gbr'] = Popen(['gerbv', selected_node])
-                elif g.tools['gbr'].poll() == None: # Process is still running
+                if g.tools['gerbv'] == None or g.tools['gerbv'].poll() == 0:
+                    g.tools['gerbv'] = Popen(['gerbv', selected_node])
+                elif g.tools['gerbv'].poll() == None: # Process is still running
                     pass
             elif ext in files and g.settings.editor != None:
+                # Need to put some logic here to make sure it is a valid program
                 if g.tools['editor'] == None or g.tools['editor'].poll() == 0:
                     g.tools['editor'] = Popen([g.settings.editor, selected_node])
                 elif g.tools['editor'].poll() == None: # Process is still running
@@ -441,9 +500,61 @@ class Utils:
                 dialog.destroy()
 
         else: # Processes
-            pass
-        
-        
+            # Call the function for the row that was double clicked
+            # Need to figure out if the program to run will produce files
+            # and whether or not it is currently running (GUI only)
+
+            # If the program produces files or updates others I will need
+            # to makes sure that I handle the updates properly
+            print 'highlighted_source:',highlighted_source
+            print 'selected_node:',selected_node
+            print 'Running a process command'
+            
+            # Netlists
+            if selected_node in self.netlists: # use gnetlist
+                if selected_node == 'gnetlist':
+                    return
+                cmd = '-v -g ' + selected_node + ' ' + highlighted_source
+                subproc = Popen(['gnetlist', cmd])
+            elif selected_node == 'ghdl-compile':
+                pass
+            elif selected_node == 'ghdl-compile->gtkwave-simulate':
+                pass
+            elif selected_node == 'icarus-compile':
+                pass
+            elif selected_node == 'icarus-compile->gtkwave-simulate':
+                #subproc = Popen([selected_node, highlighted_source])
+                pass
+            elif selected_node == 'gattrib':
+                if g.tools['gattrib'] == None or g.tools['gattrib'].poll() == 0:
+                    g.tools['gattrib'] = Popen([selected_node, highlighted_source])
+                elif g.tools['gattrib'].poll() == None: # Process is still running
+                    pass
+            else:
+                subproc = Popen([selected_node, highlighted_source])
+                
 
 
-    
+    @exceptions
+    def update_dependency_dict(self, dependent_list):
+        """!
+        Method to update the dependencies for filename.
+        @param dependent_list is the list of files to iterate over.
+        """
+        # Iterate over the list
+        for f in dependent_list:
+            # Call the method to make the action that updates the icon
+            print 'update_dependency_dict since a file in the dependency_dict was written'
+
+        
+    def add_to_dependency_dict(self, gedamanager, filename):
+        """!
+        Method to add a file to the project's dependency_dict.
+        @param gedamanager is the current gEDAManager instance.
+        @param filename is the name of the file to add to the dependency_dict.
+        """
+        g = gedamanager
+        # add file to the dependency_dict
+        if filename not in g.project.dependency_dict:
+            g.project.dependency_dict[filename] = []
+            print g.project.dependency_dict




_______________________________________________
geda-cvs mailing list
geda-cvs@xxxxxxxxxxxxxx
http://www.seul.org/cgi-bin/mailman/listinfo/geda-cvs