Mercurial > text
changeset 6:fc3ea7da521a
printing
| author | Radomir Dopieralski <moindev@sheep.art.pl> |
|---|---|
| date | Thu, 05 Jun 2008 22:03:05 +0200 |
| parents | a4ced379fb2e |
| children | |
| files | editor_view.py main_window.glade main_window.py |
| diffstat | 3 files changed, 202 insertions(+), 22 deletions(-) [+] |
line wrap: on
line diff
--- a/editor_view.py Tue May 06 02:01:35 2008 +0200 +++ b/editor_view.py Thu Jun 05 22:03:05 2008 +0200 @@ -22,6 +22,9 @@ show_right_margin = property( lambda s: s.get_show_right_margin(), lambda s, v: s.set_show_right_margin(v)) + show_line_numbers = property( + lambda s: s.get_show_line_numbers(), + lambda s, v: s.set_show_line_numbers(v)) font_name = property( lambda s: s._font_name, lambda s, v: s.set_font_name(v)) @@ -75,6 +78,11 @@ f.close() self.buffer.set_modified(False) + def jump(self, line): + position = self.buffer.get_iter_at_line(line-1) + self.scroll_to_iter(position, False) + self.buffer.place_cursor(position) + def close(self): """Save and clean up everything.""" pass @@ -97,3 +105,27 @@ self._color_style = style_id + def draw_page(self, operation, context, page_nr): + from math import floor, ceil + paper_height = context.get_height() + height = self.layout.get_size()[1]/pango.SCALE + line_height = height/self.layout.get_line_count() + max_lines = int(floor(paper_height/line_height)) + start_line = page_nr * max_lines + end_line = min(start_line + max_lines, self.buffer.get_line_count()) + start_iter = self.buffer.get_iter_at_line(start_line) + end_iter = self.buffer.get_iter_at_line(end_line) + self.layout.set_text(self.buffer.get_text(start_iter, end_iter)) + context.get_cairo_context().show_layout(self.layout) + + def begin_print(self, operation, context): + from math import floor, ceil + self.layout = context.create_pango_layout() + desc = pango.FontDescription("monospace 10") + self.layout.set_font_description(desc) + start, end = self.buffer.get_bounds() + self.layout.set_text(self.buffer.get_text(start, end)) + height = self.layout.get_size()[1]/pango.SCALE + paper_height = context.get_height() + n_pages = int(ceil(height/paper_height)) + operation.set_n_pages(n_pages)
--- a/main_window.glade Tue May 06 02:01:35 2008 +0200 +++ b/main_window.glade Thu Jun 05 22:03:05 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 Tue May 6 01:50:37 2008 --> +<!--Generated with glade3 3.4.2 on Fri May 9 10:42:40 2008 --> <glade-interface> <widget class="GtkWindow" id="window"> <property name="title" translatable="yes">Text Editor</property> @@ -22,12 +22,22 @@ <widget class="GtkMenu" id="menu1"> <property name="visible">True</property> <child> - <widget class="GtkImageMenuItem" id="menu_properties"> + <widget class="GtkImageMenuItem" id="menuitem_print"> <property name="visible">True</property> - <property name="label" translatable="yes">gtk-properties</property> + <property name="label" translatable="yes">gtk-print</property> <property name="use_underline">True</property> <property name="use_stock">True</property> - <signal name="activate" handler="on_menu_properties_activate"/> + <signal name="activate" handler="on_menuitem_print_activate"/> + <accelerator key="P" modifiers="GDK_CONTROL_MASK" signal="activate"/> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="menuitem_preview"> + <property name="visible">True</property> + <property name="label" translatable="yes">gtk-print-preview</property> + <property name="use_underline">True</property> + <property name="use_stock">True</property> + <signal name="activate" handler="on_menuitem_preview_activate"/> </widget> </child> <child> @@ -64,6 +74,7 @@ <property name="use_underline">True</property> <property name="use_stock">True</property> <signal name="activate" handler="on_menu_undo_activate"/> + <accelerator key="Z" modifiers="GDK_CONTROL_MASK" signal="activate"/> </widget> </child> <child> @@ -73,6 +84,7 @@ <property name="use_underline">True</property> <property name="use_stock">True</property> <signal name="activate" handler="on_menu_redo_activate"/> + <accelerator key="Y" modifiers="GDK_CONTROL_MASK" signal="activate"/> </widget> </child> <child> @@ -114,6 +126,46 @@ <property name="use_underline">True</property> <property name="use_stock">True</property> <signal name="activate" handler="on_menu_select_all_activate"/> + <accelerator key="A" modifiers="GDK_CONTROL_MASK" signal="activate"/> + </widget> + </child> + <child> + <widget class="GtkSeparatorMenuItem" id="separatormenuitem8"> + <property name="visible">True</property> + </widget> + </child> + <child> + <widget class="GtkCheckMenuItem" id="menuitem_tabs_spaces"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Indent with spaces</property> + <property name="use_underline">True</property> + <signal name="toggled" handler="on_menuitem_tabs_spaces_toggled"/> + </widget> + </child> + <child> + <widget class="GtkCheckMenuItem" id="menuitem_indent"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Autoindent</property> + <property name="use_underline">True</property> + <signal name="toggled" handler="on_menuitem_indent_toggled"/> + </widget> + </child> + <child> + <widget class="GtkSeparatorMenuItem" id="separatormenuitem10"> + <property name="visible">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="menu_save_defaults"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Save defaults</property> + <property name="use_underline">True</property> + <child internal-child="image"> + <widget class="GtkImage" id="menu-item-image3"> + <property name="visible">True</property> + <property name="stock">gtk-preferences</property> + </widget> + </child> </widget> </child> </widget> @@ -129,29 +181,33 @@ <widget class="GtkMenu" id="menu4"> <property name="visible">True</property> <child> - <widget class="GtkCheckMenuItem" id="menu_line_numbers"> + <widget class="GtkCheckMenuItem" id="menuitem_margin"> <property name="visible">True</property> - <property name="tooltip" translatable="yes">Toggle displaying line numbers</property> - <property name="label" translatable="yes">_Line numbers</property> + <property name="label" translatable="yes">Show right _margin</property> <property name="use_underline">True</property> - <signal name="toggled" handler="on_menu_line_numbers_toggled"/> + <signal name="toggled" handler="on_menuitem_margin_toggled"/> </widget> </child> <child> - <widget class="GtkCheckMenuItem" id="menu_wrap"> + <widget class="GtkCheckMenuItem" id="menuitem_wrap"> <property name="visible">True</property> <property name="tooltip" translatable="yes">Wrap long lines of text</property> - <property name="label" translatable="yes">_Wrap lines</property> + <property name="label" translatable="yes">_Wrap long lines</property> <property name="use_underline">True</property> - <signal name="toggled" handler="on_menu_wrap_toggled"/> + <signal name="toggled" handler="on_menuitem_wrap_toggled"/> </widget> </child> <child> - <widget class="GtkCheckMenuItem" id="menu_match"> + <widget class="GtkCheckMenuItem" id="menuitem_words"> <property name="visible">True</property> - <property name="label" translatable="yes">_Match brackets</property> + <property name="label" translatable="yes">Don't _break words</property> <property name="use_underline">True</property> - <signal name="toggled" handler="on_menu_match_toggled"/> + <signal name="toggled" handler="on_menuitem_words_toggled"/> + </widget> + </child> + <child> + <widget class="GtkSeparatorMenuItem" id="separatormenuitem9"> + <property name="visible">True</property> </widget> </child> <child> @@ -192,15 +248,33 @@ </widget> </child> <child> - <widget class="GtkSeparatorMenuItem" id="separatormenuitem1"> + <widget class="GtkSeparatorMenuItem" id="separatormenuitem5"> <property name="visible">True</property> </widget> </child> <child> - <widget class="GtkMenuItem" id="menu_save_defaults"> + <widget class="GtkCheckMenuItem" id="menuitem_numbers"> + <property name="visible">True</property> + <property name="tooltip" translatable="yes">Toggle displaying line numbers</property> + <property name="label" translatable="yes">Show _line numbers</property> + <property name="use_underline">True</property> + <signal name="toggled" handler="on_menuitem_numbers_toggled"/> + </widget> + </child> + <child> + <widget class="GtkCheckMenuItem" id="menu_match"> <property name="visible">True</property> - <property name="label" translatable="yes">_Save defaults</property> + <property name="label" translatable="yes">Match _brackets</property> <property name="use_underline">True</property> + <signal name="toggled" handler="on_menu_match_toggled"/> + </widget> + </child> + <child> + <widget class="GtkCheckMenuItem" id="menuitem_line"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Highlight current line</property> + <property name="use_underline">True</property> + <signal name="toggled" handler="on_menuitem_line_toggled"/> </widget> </child> </widget> @@ -222,6 +296,7 @@ <property name="use_underline">True</property> <property name="use_stock">True</property> <signal name="activate" handler="on_menu_jump_activate"/> + <accelerator key="J" modifiers="GDK_CONTROL_MASK" signal="activate"/> </widget> </child> <child> @@ -254,6 +329,40 @@ <property name="use_underline">True</property> <property name="use_stock">True</property> <signal name="activate" handler="on_menuitem_clear_activate"/> + <accelerator key="H" modifiers="GDK_CONTROL_MASK" signal="activate"/> + </widget> + </child> + <child> + <widget class="GtkSeparatorMenuItem" id="separatormenuitem7"> + <property name="visible">True</property> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="menuitem_directory"> + <property name="visible">True</property> + <property name="label" translatable="yes">Containing _directory</property> + <property name="use_underline">True</property> + <accelerator key="D" modifiers="GDK_CONTROL_MASK" signal="activate"/> + <child internal-child="image"> + <widget class="GtkImage" id="menu-item-image1"> + <property name="visible">True</property> + <property name="stock">gtk-directory</property> + </widget> + </child> + </widget> + </child> + <child> + <widget class="GtkImageMenuItem" id="menuitem_term"> + <property name="visible">True</property> + <property name="label" translatable="yes">_Terminal</property> + <property name="use_underline">True</property> + <accelerator key="T" modifiers="GDK_CONTROL_MASK" signal="activate"/> + <child internal-child="image"> + <widget class="GtkImage" id="menu-item-image2"> + <property name="visible">True</property> + <property name="icon_name">terminal</property> + </widget> + </child> </widget> </child> </widget> @@ -319,6 +428,7 @@ <property name="can_focus">True</property> <property name="truncate_multiline">True</property> <signal name="focus_out_event" handler="on_entry_jump_focus_out_event"/> + <signal name="key_press_event" handler="on_entry_jump_key_press_event"/> <signal name="activate" handler="on_entry_jump_activate"/> </widget> <packing> @@ -328,6 +438,7 @@ </widget> <packing> <property name="expand">False</property> + <property name="padding">2</property> <property name="position">2</property> </packing> </child> @@ -358,6 +469,7 @@ </widget> <packing> <property name="expand">False</property> + <property name="padding">2</property> <property name="position">3</property> </packing> </child> @@ -388,6 +500,7 @@ </widget> <packing> <property name="expand">False</property> + <property name="padding">2</property> <property name="position">4</property> </packing> </child>
--- a/main_window.py Tue May 06 02:01:35 2008 +0200 +++ b/main_window.py Thu Jun 05 22:03:05 2008 +0200 @@ -13,7 +13,7 @@ import editor_view class MainWindow: - def __init__(self, filename="main_window.py"): + def __init__(self, filename): self.xml = gtk.glade.XML("main_window.glade") self.xml.signal_autoconnect(self) scrolled_window = self.xml.get_widget("scrolledwindow") @@ -79,6 +79,19 @@ self.menuitem_undo.set_sensitive(self.editor.buffer.can_undo()) self.menuitem_redo.set_sensitive(self.editor.buffer.can_redo()) + def on_menuitem_margin_toggled(self, menuitem): + self.editor.show_right_margin = menuitem.get_active() + + def on_menuitem_numbers_toggled(self, menuitem): + self.editor.show_line_numbers = menuitem.get_active() + + def on_menuitem_wrap_toggled(self, menuitem): + print "wrap" + if menuitem.get_active(): + self.editor.set_wrap_mode(gtk.WRAP_WORD) + else: + self.editor.set_wrap_mode(gtk.WRAP_NONE) + def on_menu_about_activate(self, menuitem): dialog = gtk.AboutDialog() dialog.set_name("Text Editor") @@ -110,6 +123,12 @@ def on_entry_jump_focus_out_event(self, x, y): self.hbox_jump.hide() + def on_entry_jump_key_press_event(self, entry, event): + if event.keyval == 65307: # The ESC key + self.hbox_jump.hide() + self.editor.grab_focus() + return False + def on_entry_jump_activate(self, entry): text = entry.get_text() try: @@ -117,10 +136,9 @@ except ValueError: return if self.editor.buffer.get_line_count() >= line >= 1: + self.editor.jump(line) 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) + self.editor.grab_focus() def on_menu_find_activate(self, menuitem): self.hbox_find.show() @@ -131,6 +149,7 @@ def on_entry_find_activate(self, entry): self.hbox_find.hide() + self.editor.grab_focus() def on_menu_replace_activate(self, menuitem): self.hbox_replace.show() @@ -138,9 +157,25 @@ def on_entry_replace_focus_out_event(self, x, y): self.hbox_replace.hide() + self.editor.grab_focus() def on_entry_replace_activate(self, entry): self.hbox_replace.hide() + self.editor.grab_focus() + + def on_menuitem_preview_activate(self, menuitem): + dialog = gtk.PrintOperation() + dialog.set_job_name(self.editor.buffer.filename) + dialog.connect("draw-page", self.editor.draw_page) + dialog.connect("begin-print", self.editor.begin_print) + result = dialog.run(gtk.PRINT_OPERATION_ACTION_PREVIEW, self.window) + + def on_menuitem_print_activate(self, menuitem): + dialog = gtk.PrintOperation() + dialog.set_job_name(self.editor.buffer.filename) + dialog.connect("draw-page", self.editor.draw_page) + dialog.connect("begin-print", self.editor.begin_print) + result = dialog.run(gtk.PRINT_OPERATION_ACTION_PRINT_DIALOG, self.window) def close(self): self.editor.close() @@ -148,5 +183,5 @@ sys.exit() if __name__ == "__main__": - window = MainWindow() + window = MainWindow(__file__) gtk.main()
