Mercurial > text
changeset 5:a4ced379fb2e
fixed undo/redo, jump to line, some display of find/replace
| author | Radomir Dopieralski <moindev@sheep.art.pl> |
|---|---|
| date | Tue, 06 May 2008 02:01:35 +0200 |
| parents | c9d8b5166581 |
| children | fc3ea7da521a |
| files | editor_view.py main_window.glade main_window.py |
| diffstat | 3 files changed, 141 insertions(+), 43 deletions(-) [+] |
line wrap: on
line diff
--- a/editor_view.py Mon May 05 22:48:13 2008 +0200 +++ b/editor_view.py Tue May 06 02:01:35 2008 +0200 @@ -44,6 +44,8 @@ self.buffer = gtksourceview.Buffer() gtksourceview.View.__init__(self, self.buffer) + self.scheme_manager = gtksourceview.style_scheme_manager_get_default() + self.font_name = "" self.color_style = None self.highlight_brackets = True @@ -51,9 +53,9 @@ self.show_right_margin = True def load(self, filename, encoding=None): - mime, detected_encoding = mimetypes.guess_type(filename) + self.mime, detected_encoding = mimetypes.guess_type(filename) self.encoding = encoding or detected_encoding or "utf-8" - self.buffer.set_language(find_mime_lang(mime)) + self.buffer.set_language(find_mime_lang(self.mime)) self.buffer.filename = filename f = open(filename, "r") text = unicode(f.read(), self.encoding) @@ -94,3 +96,4 @@ self.highlight_syntax = False self._color_style = style_id +
--- a/main_window.glade Mon May 05 22:48:13 2008 +0200 +++ b/main_window.glade Tue May 06 02:01:35 2008 +0200 @@ -1,6 +1,6 @@ <?xml version="1.0" encoding="UTF-8" standalone="no"?> <!DOCTYPE glade-interface SYSTEM "glade-2.0.dtd"> -<!--Generated with glade3 3.4.2 on Mon May 5 22:10:53 2008 --> +<!--Generated with glade3 3.4.2 on Tue May 6 01:50:37 2008 --> <glade-interface> <widget class="GtkWindow" id="window"> <property name="title" translatable="yes">Text Editor</property> @@ -177,6 +177,7 @@ <property name="visible">True</property> <property name="label" translatable="yes">No colors</property> <property name="use_underline">True</property> + <property name="active">True</property> <property name="draw_as_radio">True</property> <signal name="toggled" handler="on_menuitem_style_toggled"/> </widget> @@ -300,10 +301,12 @@ </packing> </child> <child> - <widget class="GtkHBox" id="hbox_search"> + <widget class="GtkHBox" id="hbox_jump"> <child> - <widget class="GtkLabel" id="label_search"> - <property name="label" translatable="yes">Find:</property> + <widget class="GtkLabel" id="label_jump"> + <property name="visible">True</property> + <property name="label" translatable="yes">Jump to line:</property> + <property name="justify">GTK_JUSTIFY_RIGHT</property> <property name="single_line_mode">True</property> </widget> <packing> @@ -311,35 +314,15 @@ </packing> </child> <child> - <widget class="GtkLabel" id="label_line"> - <property name="label" translatable="yes">Jump to line:</property> - <property name="justify">GTK_JUSTIFY_RIGHT</property> - <property name="single_line_mode">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">1</property> - </packing> - </child> - <child> - <widget class="GtkLabel" id="label_replace"> - <property name="label" translatable="yes">Replace with:</property> - <property name="single_line_mode">True</property> - </widget> - <packing> - <property name="expand">False</property> - <property name="position">2</property> - </packing> - </child> - <child> - <widget class="GtkEntry" id="entry"> + <widget class="GtkEntry" id="entry_jump"> <property name="visible">True</property> <property name="can_focus">True</property> <property name="truncate_multiline">True</property> - <signal name="activate" handler="on_entry_activate"/> + <signal name="focus_out_event" handler="on_entry_jump_focus_out_event"/> + <signal name="activate" handler="on_entry_jump_activate"/> </widget> <packing> - <property name="position">3</property> + <property name="position">1</property> </packing> </child> </widget> @@ -348,6 +331,66 @@ <property name="position">2</property> </packing> </child> + <child> + <widget class="GtkHBox" id="hbox_find"> + <child> + <widget class="GtkLabel" id="label_find"> + <property name="visible">True</property> + <property name="label" translatable="yes">Find text:</property> + <property name="single_line_mode">True</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="entry_find"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="truncate_multiline">True</property> + <signal name="focus_out_event" handler="on_entry_find_focus_out_event"/> + <signal name="activate" handler="on_entry_find_activate"/> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">3</property> + </packing> + </child> + <child> + <widget class="GtkHBox" id="hbox_replace"> + <child> + <widget class="GtkLabel" id="label_replace"> + <property name="visible">True</property> + <property name="label" translatable="yes">Replace with:</property> + <property name="single_line_mode">True</property> + </widget> + <packing> + <property name="expand">False</property> + </packing> + </child> + <child> + <widget class="GtkEntry" id="entry_replace"> + <property name="visible">True</property> + <property name="can_focus">True</property> + <property name="truncate_multiline">True</property> + <signal name="focus_out_event" handler="on_entry_replace_focus_out_event"/> + <signal name="activate" handler="on_entry_replace_activate"/> + </widget> + <packing> + <property name="position">1</property> + </packing> + </child> + </widget> + <packing> + <property name="expand">False</property> + <property name="position">4</property> + </packing> + </child> </widget> </child> </widget>
--- a/main_window.py Mon May 05 22:48:13 2008 +0200 +++ b/main_window.py Tue May 06 02:01:35 2008 +0200 @@ -2,6 +2,7 @@ # -*- coding: utf-8 -*- import sys +import os import pygtk pygtk.require("2.0") @@ -12,19 +13,21 @@ import editor_view class MainWindow: - def __init__(self): + def __init__(self, filename="main_window.py"): self.xml = gtk.glade.XML("main_window.glade") self.xml.signal_autoconnect(self) scrolled_window = self.xml.get_widget("scrolledwindow") self.window = self.xml.get_widget("window") - self.search_bar = self.xml.get_widget("hbox_search") - self.label_search = self.xml.get_widget("label_search") - self.label_line = self.xml.get_widget("label_line") - self.label_replace = self.xml.get_widget("label_replace") self.menuitem_color = self.xml.get_widget("menuitem_color") self.menuitem_no_style = self.xml.get_widget("menuitem_no_style") self.menuitem_undo = self.xml.get_widget("menu_undo") self.menuitem_redo = self.xml.get_widget("menu_redo") + self.hbox_jump = self.xml.get_widget("hbox_jump") + self.entry_jump = self.xml.get_widget("entry_jump") + self.hbox_find = self.xml.get_widget("hbox_find") + self.entry_find = self.xml.get_widget("entry_find") + self.hbox_replace = self.xml.get_widget("hbox_replace") + self.entry_replace = self.xml.get_widget("entry_replace") # Add the gtksourceview widget self.editor = editor_view.EditorView() @@ -34,7 +37,6 @@ #self.editor.buffer.connect("can-undo", self.on_buffer_can_undo) #self.editor.buffer.connect("can-redo", self.on_buffer_can_redo) self.editor.buffer.connect("changed", self.on_buffer_can_undo) - self.editor.buffer.connect("changed", self.on_buffer_can_redo) # Populate the style list menu = self.menuitem_color.get_submenu() @@ -46,11 +48,17 @@ self.style_menu[scheme_id] = item menu.show_all() + basename = os.path.normcase(os.path.basename(filename)) + filepath = os.path.normcase(os.path.abspath(os.path.dirname(filename))) + home = os.path.expanduser("~") + if filepath.startswith(home): + filepath = "~" + filepath[len(home):] + title = "%s (%s) - Text Editor" % (basename, filepath) + self.window.set_title(title) + self.editor.load(filename) self.window.set_default_size(640, 480) self.window.show() - self.editor.load("main_window.py") - def on_window_destroy(self, window): self.close() @@ -59,22 +67,31 @@ def on_buffer_can_undo(self, buffer): self.menuitem_undo.set_sensitive(buffer.can_undo()) - - def on_buffer_can_redo(self, buffer): self.menuitem_redo.set_sensitive(buffer.can_redo()) def on_menu_undo_activate(self, menuitem): self.editor.buffer.undo() + self.menuitem_undo.set_sensitive(self.editor.buffer.can_undo()) + self.menuitem_redo.set_sensitive(self.editor.buffer.can_redo()) def on_menu_redo_activate(self, menuitem): self.editor.buffer.redo() + self.menuitem_undo.set_sensitive(self.editor.buffer.can_undo()) + self.menuitem_redo.set_sensitive(self.editor.buffer.can_redo()) def on_menu_about_activate(self, menuitem): - pass + dialog = gtk.AboutDialog() + dialog.set_name("Text Editor") + dialog.set_version("0.1") + dialog.set_copyright("(c) Copyright 2008 by Radomir Dopieralski") + dialog.set_comments("Mu License") + dialog.set_license("If you are asking what license this software is released under, you are asking the wrong question.") + dialog.set_logo_icon_name("edit") + dialog.run() + dialog.destroy() def on_menuitem_font_activate(self, menuitem): """Allow user to change the font.""" - dialog = gtk.FontSelectionDialog("Select font") if self.editor.font_name: dialog.set_font_name(self.editor.font_name) @@ -87,8 +104,43 @@ self.editor.color_style = style_id def on_menu_jump_activate(self, menuitem): - self.search_bar.show() + self.hbox_jump.show() + self.entry_jump.grab_focus() + + def on_entry_jump_focus_out_event(self, x, y): + self.hbox_jump.hide() + + def on_entry_jump_activate(self, entry): + text = entry.get_text() + try: + line = int(text) + except ValueError: + return + if self.editor.buffer.get_line_count() >= line >= 1: + self.hbox_jump.hide() + i = self.editor.buffer.get_iter_at_line(line-1) + self.editor.scroll_to_iter(i, False) + self.editor.buffer.place_cursor(i) + def on_menu_find_activate(self, menuitem): + self.hbox_find.show() + self.entry_find.grab_focus() + + def on_entry_find_focus_out_event(self, x, y): + self.hbox_find.hide() + + def on_entry_find_activate(self, entry): + self.hbox_find.hide() + + def on_menu_replace_activate(self, menuitem): + self.hbox_replace.show() + self.entry_replace.grab_focus() + + def on_entry_replace_focus_out_event(self, x, y): + self.hbox_replace.hide() + + def on_entry_replace_activate(self, entry): + self.hbox_replace.hide() def close(self): self.editor.close()
