Пример #1
0
    def __init__(self):
        mydir = os.path.dirname(__file__) 
        builder = gtk.Builder()
        builder.add_from_file( os.path.join( mydir, "ide.glade" ) )

        self.window = builder.get_object( "window" )
        self.textInfo = builder.get_object( "textInfo" )
        self.imgObject = builder.get_object( "imgObject" )
        self.labObject = builder.get_object( "labObject" )
        self.formView = builder.get_object( "formView" )
        self.formContainer = builder.get_object( "formContainer" )
        self.formFrame = builder.get_object( "formFrame" )
        self.formBox = builder.get_object( "formBox" )
        self.formTitle = builder.get_object( "formTitle" )
        self.formTitleBar = builder.get_object( "formTitleBar" )
        self.listProps = builder.get_object( "listProps" )
        self.storeProps = builder.get_object( "storeProps" )
        self.listSignals = builder.get_object( "listSignals" )
        self.storeSignals = builder.get_object( "storeSignals" )
        self.labAccess = builder.get_object( "labAccess" )
        self.btnOpenGlade = builder.get_object( "btnOpenGlade" )
        self.btnImplementSignal = builder.get_object( "btnImplementSignal" )
        self.listObjects = builder.get_object( "listObjects" )
        self.storeObjects = builder.get_object( "storeObjects" )
        self.checkConnectAfter = builder.get_object("checkConnectAfter")
        self.comboCallbacks = builder.get_object( "comboCallbacks" )
        self.storeCallbacks = builder.get_object( "storeCallbacks" )
        self.labInvalidObjects = builder.get_object("labInvalidObjects")        
        self.checkContainers = builder.get_object( "checkContainers" )

        self.textInfo.modify_base( gtk.STATE_NORMAL, gtk.gdk.color_parse("#ffffbd") )
        self.textInfo.modify_font( pango.FontDescription("8") )
        #self.formView.modify_bg( gtk.STATE_NORMAL, gtk.gdk.color_parse("white") )
        self.formView.modify_bg( gtk.STATE_NORMAL, gtk.gdk.color_parse("#7b7878") )
        
        self.formTitleBar.set_app_paintable( True )
        self.formTitleBar.modify_bg( gtk.STATE_NORMAL, gtk.gdk.color_parse("#7b7878") )

        self.objectInspector = ObjectInspector( self )
        self.form = Form( self )
        self.analyser = None
        self.glade_file = None

        self.formTitleBar.connect( "expose-event",      self.on_draw_titlebar )
        self.formBox.connect_after( "expose-event",     self.on_draw_border )
        self.window.connect( "delete-event",            self.on_close )
        self.btnOpenGlade.connect( "clicked",           self.on_open_glade )
        self.btnImplementSignal.connect( "clicked",     self.on_implement_signal )
        self.labAccess.connect( "activate-link",        self.on_access_activate_link )
        self.listObjects.connect( "cursor-changed",     self.on_list_objects_select )

        self.listProps.connect( "cursor-changed",       self.objectInspector.on_select_prop )
        self.listSignals.connect( "cursor-changed",     self.objectInspector.on_select_signal )
        self.listProps.connect( "row-activated",        self.objectInspector.on_exec_prop )
        self.listSignals.connect( "row-activated",      self.on_implement_signal )
        self.labInvalidObjects.connect( "activate-link", self.on_labInvalidObjects_activate_link )
        self.checkContainers.connect( "toggled",        self.on_checkContainers_toggled )
Пример #2
0
class IDE:
    def __init__(self):
        mydir = os.path.dirname(__file__) 
        builder = gtk.Builder()
        builder.add_from_file( os.path.join( mydir, "ide.glade" ) )

        self.window = builder.get_object( "window" )
        self.textInfo = builder.get_object( "textInfo" )
        self.imgObject = builder.get_object( "imgObject" )
        self.labObject = builder.get_object( "labObject" )
        self.formView = builder.get_object( "formView" )
        self.formContainer = builder.get_object( "formContainer" )
        self.formFrame = builder.get_object( "formFrame" )
        self.formBox = builder.get_object( "formBox" )
        self.formTitle = builder.get_object( "formTitle" )
        self.formTitleBar = builder.get_object( "formTitleBar" )
        self.listProps = builder.get_object( "listProps" )
        self.storeProps = builder.get_object( "storeProps" )
        self.listSignals = builder.get_object( "listSignals" )
        self.storeSignals = builder.get_object( "storeSignals" )
        self.labAccess = builder.get_object( "labAccess" )
        self.btnOpenGlade = builder.get_object( "btnOpenGlade" )
        self.btnImplementSignal = builder.get_object( "btnImplementSignal" )
        self.listObjects = builder.get_object( "listObjects" )
        self.storeObjects = builder.get_object( "storeObjects" )
        self.checkConnectAfter = builder.get_object("checkConnectAfter")
        self.comboCallbacks = builder.get_object( "comboCallbacks" )
        self.storeCallbacks = builder.get_object( "storeCallbacks" )
        self.labInvalidObjects = builder.get_object("labInvalidObjects")        
        self.checkContainers = builder.get_object( "checkContainers" )

        self.textInfo.modify_base( gtk.STATE_NORMAL, gtk.gdk.color_parse("#ffffbd") )
        self.textInfo.modify_font( pango.FontDescription("8") )
        #self.formView.modify_bg( gtk.STATE_NORMAL, gtk.gdk.color_parse("white") )
        self.formView.modify_bg( gtk.STATE_NORMAL, gtk.gdk.color_parse("#7b7878") )
        
        self.formTitleBar.set_app_paintable( True )
        self.formTitleBar.modify_bg( gtk.STATE_NORMAL, gtk.gdk.color_parse("#7b7878") )

        self.objectInspector = ObjectInspector( self )
        self.form = Form( self )
        self.analyser = None
        self.glade_file = None

        self.formTitleBar.connect( "expose-event",      self.on_draw_titlebar )
        self.formBox.connect_after( "expose-event",     self.on_draw_border )
        self.window.connect( "delete-event",            self.on_close )
        self.btnOpenGlade.connect( "clicked",           self.on_open_glade )
        self.btnImplementSignal.connect( "clicked",     self.on_implement_signal )
        self.labAccess.connect( "activate-link",        self.on_access_activate_link )
        self.listObjects.connect( "cursor-changed",     self.on_list_objects_select )

        self.listProps.connect( "cursor-changed",       self.objectInspector.on_select_prop )
        self.listSignals.connect( "cursor-changed",     self.objectInspector.on_select_signal )
        self.listProps.connect( "row-activated",        self.objectInspector.on_exec_prop )
        self.listSignals.connect( "row-activated",      self.on_implement_signal )
        self.labInvalidObjects.connect( "activate-link", self.on_labInvalidObjects_activate_link )
        self.checkContainers.connect( "toggled",        self.on_checkContainers_toggled )




    def run(self, glade_file = None, parentWindow = None, analyser = None):
        self.analyser = analyser
        self.glade_file = glade_file

        self.window.show()

        if self.glade_file != None:
            self.form.load_from_file( glade_file )
            if self.analyser != None:
                self.check_for_objects_declared()
        
        self.objectInspector.read_callbacks()

        self.parentWindow = parentWindow
        if self.parentWindow:
            self.window.set_transient_for( parentWindow )
        else:
            gtk.main()


    def on_close(self, *args):
        if hasattr(self, 'parentWindow') and self.parentWindow != None:
            self.window.hide()
            return True
        else:
            gtk.main_quit()
            return False


    def on_draw_titlebar(self, sender, event):
        cr = event.window.cairo_create()
        w = self.formTitle.get_allocation().width
        h = self.formTitle.get_allocation().height

        self.form.draw_title_bar( cr, w, h )
        return False


    def on_draw_border(self, sender, event):
        cr = event.window.cairo_create()
        w = self.formBox.get_allocation().width
        h = self.formBox.get_allocation().height

        cr.set_line_width( 1 )
        cr.set_source_rgba( 0, 0, 0, 1 )
        cr.rectangle( 0 + 0.5, -1 + 0.5, w-1, h )
        cr.stroke()

        return True
   

    def on_list_objects_select(self, *args):
        path, col = self.listObjects.get_cursor()
        if path == None:
            return

        it = self.storeObjects.get_iter( path )
        obj = self.storeObjects.get_value( it, 2 )
        
        self.form.ctrl_selected = obj 
        self.form.ctrl_over = None
        self.formContainer.queue_draw()        
        self.objectInspector.select_obj( obj, select_item_in_list=False )




    def on_implement_signal(self, *args):
        path, col = self.listSignals.get_cursor()
        if path == None:
            return
        
        it = self.storeSignals.get_iter( path )

        obj_name = get_object_name( self.objectInspector.selected_obj )
        event_name = self.storeSignals.get_value( it, 1 )
        
        # podemos usar um callback existente ou criar um novo
        i = self.comboCallbacks.get_active()
        if i == -1 or i == 0:
            callback_name = self.objectInspector.signal_callback( it, True )
            callback_decl = self.objectInspector.signal_callback_full( it, indent = "    " )
        else:
            callback_name = self.storeCallbacks[i][1]
            callback_decl = None
        
        
        # podemos usar connect() ou connect_after(). depois de fazer isso,
        # volta pro estado default, que é connect() simplesmente.
        callback_after = self.checkConnectAfter.get_active()
        self.checkConnectAfter.set_active( False )        

        sig_implemented, sig_line = self.analyser.check_obj_signal( \
            obj_name, event_name )
        if sig_implemented:
            print "Signal already implemented: %s.%s" % (obj_name, event_name)
            return

        self.analyser.code_add_for_event( obj_name, event_name, \
            callback_name, callback_decl, callback_after )

        #self.on_close()

        while gtk.events_pending(): gtk.main_iteration( block=False )

        self.analyser.view.place_cursor_onscreen()
        self.analyser.view.grab_focus()

        while gtk.events_pending(): gtk.main_iteration( block=False )
        
        self.renova()



    def renova(self):
        self.objectInspector.select_obj( self.objectInspector.selected_obj )
        self.objectInspector.read_callbacks()

        self.analyser.re_inspect()
        self.check_for_objects_declared()


    def check_for_objects_declared(self):
        # checks if all declared objects in the code [self.xx = builder.get_object('xx')]
        # are indeed declared in the glade file.
        #
        not_found = []
        
        objs = self.analyser.list_for_get_object # [obj, line]
        for sobj, line_num in objs:
            
            found_in_glade = False

            #for obj_info in self.storeObjects:
            #    if obj_info[3] == sobj:
            for obj in self.form.formControls.objs:
                if get_object_name( obj ) == sobj:
                    
                    found_in_glade = True
                    break
            
            if not found_in_glade:
                not_found.append( [sobj, line_num] )
        
        self.labInvalidObjects.set_visible( len(not_found) > 0 )
        self.labInvalidObjects.set_data( "easy-gui-code-invalid-objects", not_found )

            

    def on_labInvalidObjects_activate_link(self, *args):
        self.labInvalidObjects.hide()
        not_found = self.labInvalidObjects.get_data( "easy-gui-code-invalid-objects" )

        lines_to_remove = [ line_num for sobj, line_num in not_found ]
        lines_to_remove.sort( reverse=True )
        
        for line_to_remove in lines_to_remove:
            print "Removing line %d..." % (line_to_remove+1)
        
        self.analyser.code_remove( lines_to_remove )
                    
        self.renova()        
        return True
    


    def on_access_activate_link(self, *args):
        obj_name = get_object_name( self.objectInspector.selected_obj )
        self.analyser.code_add_for_get_object( obj_name )
        
        self.renova()
        return True


    def on_checkContainers_toggled(self, widget):
        self.form.read_objects()


    def on_open_glade(self, sender):
        if self.glade_file:
            os.system( "glade \"%s\" &" % self.glade_file )
            self.on_close()
        else:
            alert( "No glade file!", "Open Glade file" )