def do_activate(self): self.tab = self.view.get_parent().get_parent().get_parent() self.tab.set_orientation(Gtk.Orientation.HORIZONTAL) # hide vertical scrollbar self.scrolled = self.view.get_parent() self.scrolled.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.EXTERNAL) self.source_map = GtkSource.Map() self.set_font_desc() self.source_map.set_view(self.view) self.source_map.show() self.sep = Gtk.Separator() self.tab.pack_end(self.sep, False, True, 0) self.tab.pack_end(self.source_map, False, True, 0) self.update_display_on_left() self.on_separator_changed() if settings is not None: self.settings_handlers = [ settings.connect('changed::display-on-left', self.on_display_on_left_changed), settings.connect('changed::show-separator', self.on_separator_changed) ]
def __init__(self, openPath): super(IDEWindow, self).__init__() ## Win General self.set_title('IDE') self.set_position(Gtk.WindowPosition.CENTER) self.set_default_size(1000, 500) # i = Gtk.Image.new_from_icon_name('document-edit-symbolic', Gtk.IconSize.MENU) self.set_default_icon_name('document-edit-symbolic') #self.set_border_width(10) self.connect('delete-event', self._quit) ### Win Accels accel = Gtk.AccelGroup() accel.connect(Gdk.keyval_from_name('s'), Gdk.ModifierType.CONTROL_MASK, 0, self.saveFile) accel.connect(Gdk.keyval_from_name('b'), Gdk.ModifierType.CONTROL_MASK, 0, self.compile) accel.connect(Gdk.keyval_from_name('f'), Gdk.ModifierType.CONTROL_MASK, 0, self.toggleSearch) # accel.connect(16777215, Gdk.ModifierType.SHIFT_MASK, 0, self.bracketComplete) #accel.connect(Gdk.keyval_from_name('p'), Gdk.ModifierType.CONTROL_MASK | Gdk.ModifierType.SHIFT_MASK, 0, self.command) #future Ctrl + Shift + P command popup self.add_accel_group(accel) ## Editor General self.projectPath = None self.projectName = None self.curFileName = None self.curFileIndex = None self.curLanguage = None self.curSettings = None self.files = [] self.tempFilesText = [] self.langs = [] self.compilerOptions = [] self.running = False self.runningProccess = None self.filesObject = [] self.comp = None self.waitingForBracketCompletion = False self.autoToggling = False ## Header Bar self.hb = Gtk.HeaderBar() # system-run = engine icon, media-playback-start = red play icon, gtk-media-play = white play self.compileBtn = Gtk.Button.new_from_icon_name('media-playback-start-symbolic', Gtk.IconSize.MENU) self.compileBtn.set_tooltip_text('Compile + Run') self.compileBtn.connect('clicked', self.compile) # self.compileBtn.set_sensitive(False) self.terminalBtn = Gtk.Button.new_from_icon_name('utilities-terminal-symbolic', Gtk.IconSize.MENU) self.terminalBtn.set_tooltip_text('Toggle terminal') self.terminalBtn.connect('clicked', self.toggleTerminal) ### Creating popup menu self.settingsBtn = Gtk.Button.new_from_icon_name('view-more-symbolic', Gtk.IconSize.MENU) self.settingsBtn.connect('clicked', self.onSettingsBtnClick) self.settingsPopover = Gtk.Popover() self.settingsList = Gtk.ListBox() r = Gtk.ListBoxRow() a = Gtk.CheckButton() a.set_label('Toggle Dark Mode') self.toggleDarkCheck = a self.toggleDarkCheck.connect('toggled', self.onToggleDark) r.add(a) r.set_margin_left(5) r.set_margin_right(5) r.set_margin_top(5) self.settingsList.insert(r, -1) r = Gtk.ListBoxRow() a = Gtk.CheckButton() a.set_label('Highlight Matching Brackets') self.toggleHighlightCheck = a self.toggleHighlightCheck.connect('toggled', self.onToggleHighlight) r.add(a) r.set_margin_left(5) r.set_margin_right(5) self.settingsList.insert(r, -1) r = Gtk.ListBoxRow() a = Gtk.CheckButton() a.set_label('Show Line Numbers') self.toggleLineCheck = a self.toggleLineCheck.connect('toggled', self.onToggleLine) r.add(a) r.set_margin_left(5) r.set_margin_right(5) self.settingsList.insert(r, -1) r = Gtk.ListBoxRow() a = Gtk.CheckButton() a.set_label('Word Wrap') self.toggleWordWrap = a self.toggleWordWrap.connect('toggled', self.onToggleWrap) r.add(a) r.set_margin_left(5) r.set_margin_right(5) self.settingsList.insert(r, -1) r = Gtk.ListBoxRow() _hb = Gtk.HBox() _hb.get_style_context().add_class('linked') self.styleChooserButton = GtkSource.StyleSchemeChooserButton() self.applyStyleButton = Gtk.Button.new_from_icon_name('emblem-ok-symbolic', Gtk.IconSize.MENU) self.applyStyleButton.connect('clicked', self.applyStyle) _hb.pack_start(self.styleChooserButton, True, True, 0) _hb.pack_start(self.applyStyleButton, True, True, 0) r.add(_hb) r.set_margin_left(5) r.set_margin_right(5) r.set_margin_bottom(5) self.settingsList.insert(r, -1) r = Gtk.ListBoxRow() _hb = Gtk.HBox() btn = Gtk.Button.new_from_icon_name('system-run-symbolic', Gtk.IconSize.MENU) btn.set_tooltip_text('Build Project') _hb.pack_start(btn, True, True, 0) btn = Gtk.Button.new_from_icon_name('media-playback-start-symbolic', Gtk.IconSize.MENU) btn.set_tooltip_text('Run Project') _hb.pack_start(btn, True, True, 0) btn = Gtk.Button.new_from_icon_name('document-edit-symbolic', Gtk.IconSize.MENU) btn.set_tooltip_text('Edit Project') _hb.pack_start(btn, True, True, 0) _hb.get_style_context().add_class('linked') r.add(_hb) r.set_margin_left(5) r.set_margin_right(5) r.set_margin_bottom(5) self.settingsList.insert(r, -1) # bx = Gtk.VBox() # bx.pack_start(self.settingsList, False, False, 0) # bx.set_border_width(10) self.settingsList.set_selection_mode(Gtk.SelectionMode.NONE) self.settingsPopover.add(self.settingsList) self.settingsPopover.set_relative_to(self.settingsBtn) self.hb.pack_end(self.settingsBtn) #self.folderBtn = Gtk.Button.new_from_icon_name('folder-new', Gtk.IconSize.MENU) #self.folderBtn.set_tooltip_text('Open Project Folder') #self.folderBtn.connect('clicked', self.openProject) #self.hb.pack_start(self.folderBtn) ######################################## bx = Gtk.HBox() bx.get_style_context().add_class('linked') bx.pack_start(self.compileBtn, False, False, 0) self.stateEntry = Gtk.Entry() self.stateEntry.set_sensitive(False) self.stateEntry.set_text('Loaded') bx.pack_start(self.stateEntry, False, False, 0) self.hb.pack_start(bx) #self.hb.pack_start(self.terminalBtn) ######################################## self.hb.set_title('Py IDE') self.hb.set_show_close_button(True) #self.hb.pack_end(self.searchEntry) ## Views And Buffers self.sview = GtkSource.View() self.stable = Gtk.TextTagTable() self.sbuff = GtkSource.Buffer.new(self.stable) self.found_tag = self.sbuff.create_tag('found-tag', background='rgba(200,200,200,.8)') self.error_tag = self.sbuff.create_tag('error-tag', underline=Pango.Underline.ERROR) self.lmngr = GtkSource.LanguageManager() self.sviewScroll = Gtk.ScrolledWindow() self.sviewBox = Gtk.HBox() self.smap = GtkSource.Map() self.smap.set_view(self.sview) self.sview.set_auto_indent(True) self.sview.set_buffer(self.sbuff) self.sview.set_indent_on_tab(True) self.sview.set_insert_spaces_instead_of_tabs(False) self.sview.set_left_margin(10) self.sview.set_property('smart-home-end', GtkSource.SmartHomeEndType.ALWAYS) self.sview.set_smart_backspace(True) font = Pango.FontDescription('Monospace 10') self.sview.modify_font(font) # self.sview.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.sview.set_tab_width(8) # self.sview.set_hscroll_policy(Gtk.ScrollablePolicy.MINIMAL) # self.sview.set_draw_spaces(GtkSource.DrawSpacesFlags.TAB) self.sbuff.connect('insert-text', self.onTextInsert) self.sbuff.connect('changed', self.onTextChanged) # self.sbuff.set_style_scheme(GtkSource.StyleScheme.get_style('tango')) #self.sview.set_pixels_above_lines(5) ### Testing completion self.sview_completion = self.sview.get_completion() self.sview_completion.set_property('remember-info-visibility', True) self.sview_completion.set_property('auto-complete-delay', 0) self.sview_provider = GtkSource.CompletionWords.new('PyIDE Completion 2', self.getPix('folder')) self.sview_provider.register(self.sbuff) self.sview_completion.add_provider(self.sview_provider) # provider = GtkSource.CompletionWords.new('PyIDE Completion 2') # context = GtkSource.CompletionContext() # context.add_proposals(provider, [GtkSource.CompletionItem(label='class', text='class', icon=self.getPix('insert-object-symbolic'), info='Define a class')], True) # self.sview_completion.add_provider(provider) ## TreeView self.treeView = None # Turn this into a Gtk.TreeView(self.fileStore) when fileStore has something self.fileList = [] self.fileStore = None # Turn this into a Gtk.ListStore (lists that TreeView can display) ## Lines self.lines = Gtk.Button('0 Lines') self.linesPopover = Gtk.Popover() self.linesPopover.set_relative_to(self.lines) vb = Gtk.VBox() a = Gtk.Label('Lines: ') self.linesLbl = a vb.pack_start(a, True, True, 0) a = Gtk.Label('Chars: ') self.charsLbl = a vb.pack_start(a, True, True, 0) a = Gtk.Label('Language: ') self.languageLbl = a vb.pack_start(a, True, True, 0) vb.set_border_width(10) self.linesPopover.add(vb) self.lines.connect('clicked', self.onLinesCliked) ## hb = Gtk.HBox() hb.get_style_context().add_class('linked') self.sideNewFileBtn = Gtk.Button.new_from_icon_name('document-new-symbolic', Gtk.IconSize.MENU) self.sideNewFileBtn.connect('clicked', self.createNewFile) self.sideNewFolderBtn = Gtk.Button.new_from_icon_name('folder-new-symbolic', Gtk.IconSize.MENU) self.sideNewFolderBtn.connect('clicked', self.createNewFolder) hb.pack_start(self.sideNewFileBtn, False, False, 0) hb.pack_start(self.sideNewFolderBtn, False, False, 0) hb.pack_end(self.terminalBtn, False, False, 0) hb.pack_start(self.lines, True, True, 0) self.pane = Gtk.Paned.new(Gtk.Orientation.HORIZONTAL) self.pane.set_wide_handle(False) self.terminalPane = Gtk.Paned.new(Gtk.Orientation.VERTICAL) #self.terminalPane.set_wide_handle(True) self.terminal = Vte.Terminal() self.sideVBox = Gtk.VBox() self.sideVBox.pack_end(hb, False, False, 0) self.sideView = Gtk.ListBox() self.sideView.set_selection_mode(Gtk.SelectionMode.SINGLE) self.sideView.set_activate_on_single_click(True) self.sideView.connect('row-selected', self.handleSideClick) self.sideScroller = Gtk.ScrolledWindow() #self.sideScroller.add(self.sideView) # self.sideScroller.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) self.sideVBox.pack_start(self.sideScroller, True, True, 0) # MD Preview self.mdPreviewer = WebKit.WebView() self.mdPreviewer.load_uri('file://' + os.path.dirname(os.path.abspath(__file__)) + '/browser/index.html') ##################################### self.searchToolbar = Gtk.Revealer() self.searchToolbar.set_transition_type(Gtk.RevealerTransitionType.SLIDE_DOWN) self.searchToolbar.set_transition_duration(300) self.searchEntry = Gtk.Entry() self.searchEntry.set_icon_from_icon_name(Gtk.EntryIconPosition.PRIMARY, 'preferences-system-search-symbolic') self.searchEntry.connect('changed', self.find) self.searchEntry.set_width_chars(50) self.searchFindButton = Gtk.Button('Find') self.searchFindButton.connect('clicked', self.find) self.searchCloseButton = Gtk.Button.new_from_icon_name('window-close-symbolic', Gtk.IconSize.MENU) self.searchCloseButton.connect('clicked', self.toggleSearch) self.searchVBox = Gtk.HBox() bx = Gtk.HBox() bx.pack_start(self.searchEntry, False, False, 0) bx.pack_start(self.searchFindButton, False, False, 0) bx.set_halign(Gtk.Align.CENTER) self.searchVBox.add(bx) self.searchVBox.pack_end(self.searchCloseButton, False, False, 0) self.searchToolbar.add(self.searchVBox) self.searchToolbar.set_reveal_child(False) ##################################### # SVIEWSCROLL EVENTS #self.sviewScroll.connect('event-after', self.sviewScrollEvents) #self.sviewScroll.connect('scroll-child', self.updateMinimap) self.sviewScroll.add(self.sview) self.sviewBox.pack_start(self.sviewScroll, True, True, 0) self.sviewBox.pack_start(self.smap, False, False, 0) ########################################## self.searchPane = Gtk.VBox() self.sviewPaned = Gtk.Paned() self.sviewPaned.pack1(self.sviewBox, False, False) self.sviewPaned.pack2(self.mdPreviewer) self.pane.pack1(self.sideVBox, False, False) self.terminalPane.pack1(self.sviewPaned, True, True) ################## self.terminalPane.add2(self.terminal) self.searchPane.pack_start(self.searchToolbar, False, False, 0) self.searchPane.pack_start(self.terminalPane, True, True, 0) self.pane.add2(self.searchPane) self.add(self.pane) self.set_titlebar(self.hb) self.loadSettings() self.show_all() self.openProject(openPath) self.sviewPaned.get_child2().hide() ## Appending modules self.modules = [] self.autoBracket = AutoBracket(self) self.modules.append(self.autoBracket) self.autoComplete = GediPlugin(self) self.modules.append(self.autoComplete) self.linter = Linter(self) self.modules.append(self.linter) for module in self.modules: module.do_activate() Gtk.main()