# HG changeset patch # User Radek Brich # Date 1362928493 -3600 # Node ID 3a41b351b1223622d34f7e20ed67a21d3288f7b8 # Parent 39f777341db41eb8e02a4ac2d32ec1f1d3886b93 Port pgconsole to Python3 + GTK3. diff -r 39f777341db4 -r 3a41b351b122 README --- a/README Thu Mar 07 18:26:52 2013 +0100 +++ b/README Sun Mar 10 16:14:53 2013 +0100 @@ -2,6 +2,22 @@ pgtoolkit ========= +Requirements +------------ + + * Python 3.2+ + * Psycopg2 + +Optional: + * MyManager: + * MySQLdb 1.2.3 + * see extras for Python3 patch + * pgconsole: + * GTK3 + Python bindings + Cairo + GtkSource + * packages in Debian: python3-gi python3-gi-cairo gir1.2-gtk-3.0 gir1.2-gtksource-3.0 + * browser: + * tuikit (http://hg.devl.cz/tuikit) + General Python Modules ---------------------- diff -r 39f777341db4 -r 3a41b351b122 pgconsole/app.py --- a/pgconsole/app.py Thu Mar 07 18:26:52 2013 +0100 +++ b/pgconsole/app.py Sun Mar 10 16:14:53 2013 +0100 @@ -1,11 +1,15 @@ -import time -import gobject, gtk, pango, cairo -import gtksourceview2 as gtksourceview +from gi.repository import GObject +from gi.repository import Gtk, Gdk +from gi.repository import GdkPixbuf +from gi.repository import cairo, Pango +from gi.repository import GtkSource import psycopg2 import psycopg2.extensions import psycopg2.extras +import time + from pgconsole.config import cfg from pgconsole.editor import Editor from pgconsole.dataview import DataView @@ -19,7 +23,7 @@ self.db = Database() self.conn = None - win = gtk.Window(gtk.WINDOW_TOPLEVEL) + win = Gtk.Window() self.win = win win.set_title('PostgreSQL Console') win.set_size_request(300, 200) # minimal size @@ -30,18 +34,18 @@ win.connect('configure-event', self.on_configure) # toolbar - toolbar = gtk.Toolbar() - toolbar.set_style(gtk.TOOLBAR_ICONS) - toolbar.set_property("icon-size", gtk.ICON_SIZE_SMALL_TOOLBAR) + toolbar = Gtk.Toolbar() + toolbar.set_style(Gtk.ToolbarStyle.ICONS) + toolbar.set_property("icon-size", Gtk.IconSize.SMALL_TOOLBAR) - tb = gtk.ToolButton(gtk.STOCK_PREFERENCES) + tb = Gtk.ToolButton(Gtk.STOCK_PREFERENCES) tb.set_label('Settings') tb.set_tooltip_text('Settings') tb.connect('clicked', self.settings) self.tb_settings = tb toolbar.add(tb) - self.cb_server = gtk.combo_box_entry_new_text() + self.cb_server = Gtk.ComboBoxText.new_with_entry() self.cb_server.set_tooltip_text('Server') self.cb_server.get_child().set_property("editable", False) self.cb_server.set_property("add_tearoffs", True) @@ -49,52 +53,52 @@ self.cb_server.set_property("can-focus", True) self.cb_server.connect('changed', self.on_server_changed) self.cb_server.connect("key_press_event", self.toolbar_server_keypress) - ti = gtk.ToolItem() + ti = Gtk.ToolItem() ti.add(self.cb_server) toolbar.add(ti) - self.cb_dbname = gtk.combo_box_entry_new_text() + self.cb_dbname = Gtk.ComboBoxText.new_with_entry() self.cb_dbname.set_tooltip_text('Database') self.cb_dbname.get_child().set_property("editable", False) self.cb_dbname.set_property("add_tearoffs", True) #self.cb_dbname.set_property("focus-on-click", False) self.cb_dbname.set_property("can-focus", True) - ti = gtk.ToolItem() + ti = Gtk.ToolItem() ti.add(self.cb_dbname) toolbar.add(ti) - tb = gtk.ToolButton(gtk.STOCK_CONNECT) + tb = Gtk.ToolButton(Gtk.STOCK_CONNECT) tb.set_label('Connect') tb.set_tooltip_text('Connect') tb.connect('clicked', self.connect) toolbar.add(tb) self.tb_connect = tb - sep = gtk.SeparatorToolItem() + sep = Gtk.SeparatorToolItem() toolbar.add(sep) - tb = gtk.ToolButton(gtk.STOCK_EXECUTE) + tb = Gtk.ToolButton(Gtk.STOCK_EXECUTE) tb.set_label('Execute') tb.set_tooltip_text('Execute') tb.connect('clicked', self.execute) toolbar.add(tb) tb.set_sensitive(False) self.tb_execute = tb - tb = gtk.ToolButton(gtk.STOCK_NEW) + tb = Gtk.ToolButton(Gtk.STOCK_NEW) tb.set_label('Begin transaction') tb.set_tooltip_text('Begin transaction') tb.connect('clicked', self.begin) tb.set_sensitive(False) toolbar.add(tb) self.tb_begin = tb - tb = gtk.ToolButton(gtk.STOCK_APPLY) + tb = Gtk.ToolButton(Gtk.STOCK_APPLY) tb.set_label('Commit') tb.set_tooltip_text('Commit') tb.connect('clicked', self.commit) tb.set_sensitive(False) self.tb_commit = tb toolbar.add(tb) - tb = gtk.ToolButton(gtk.STOCK_CANCEL) + tb = Gtk.ToolButton(Gtk.STOCK_CANCEL) tb.set_label('Rollback') tb.set_tooltip_text('Rollback') tb.connect('clicked', self.rollback) @@ -102,7 +106,7 @@ self.tb_rollback = tb toolbar.add(tb) - sep = gtk.SeparatorToolItem() + sep = Gtk.SeparatorToolItem() toolbar.add(sep) # editor @@ -112,19 +116,19 @@ self.dataview = DataView() - vbox = gtk.VBox(False, 2) + vbox = Gtk.VBox(False, 2) - sep = gtk.SeparatorToolItem() + sep = Gtk.SeparatorToolItem() sep.set_expand(True) sep.set_draw(False) toolbar.add(sep) - self.throbber_anim = gtk.gdk.PixbufAnimation('data/Throbber.gif') - self.throbber = gtk.Image() - tb = gtk.ToolItem() + self.throbber_anim = GdkPixbuf.PixbufAnimation.new_from_file('data/Throbber.gif') + self.throbber = Gtk.Image() + tb = Gtk.ToolItem() tb.add(self.throbber) toolbar.add(tb) - sep = gtk.SeparatorToolItem() + sep = Gtk.SeparatorToolItem() sep.set_draw(False) toolbar.add(sep) @@ -151,20 +155,20 @@ self.hpaned = hpaned # log - self.logbuf = gtk.TextBuffer() - view = gtk.TextView(self.logbuf) + self.logbuf = Gtk.TextBuffer() + view = Gtk.TextView.new_with_buffer(self.logbuf) view.set_editable(False) - font_desc = pango.FontDescription('monospace') + font_desc = Pango.FontDescription('monospace') if font_desc: view.modify_font(font_desc) - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN) sw.add(view) hpaned.add2(sw) - vbox.pack_start(vpaned, padding=0) + vbox.pack_start(vpaned, expand=True, fill=True, padding=0) win.add(vbox) @@ -178,13 +182,13 @@ def main(self): - gtk.main() + Gtk.main() def destroy(self, widget, data=None): self.save_win_state() cfg.save() - gtk.main_quit() + Gtk.main_quit() def on_configure(self, w, ev): @@ -251,7 +255,7 @@ self.conn = None self.cb_server.set_sensitive(True) self.cb_dbname.set_sensitive(True) - self.tb_connect.set_stock_id(gtk.STOCK_CONNECT) + self.tb_connect.set_stock_id(Gtk.STOCK_CONNECT) self.tb_connect.set_label('Connect') self.tb_connect.set_tooltip_text('Connect') self.tb_execute.set_sensitive(False) @@ -266,7 +270,7 @@ return self.cb_server.set_sensitive(False) self.cb_dbname.set_sensitive(False) - self.tb_connect.set_stock_id(gtk.STOCK_DISCONNECT) + self.tb_connect.set_stock_id(Gtk.STOCK_DISCONNECT) self.tb_connect.set_label('Disconnect') self.tb_connect.set_tooltip_text('Disconnect') self.tb_execute.set_sensitive(True) @@ -341,9 +345,9 @@ if state == psycopg2.extensions.POLL_OK: self.execute_finish() elif state == psycopg2.extensions.POLL_WRITE: - gobject.io_add_watch(self.conn.fileno(), gobject.IO_OUT, self.execute_poll) + GObject.io_add_watch(self.conn.fileno(), GObject.IO_OUT, self.execute_poll) elif state == psycopg2.extensions.POLL_READ: - gobject.io_add_watch(self.conn.fileno(), gobject.IO_IN, self.execute_poll) + GObject.io_add_watch(self.conn.fileno(), GObject.IO_IN, self.execute_poll) else: self.logbuf.insert(self.logbuf.get_end_iter(), "poll() returned %s" % state) return @@ -388,7 +392,7 @@ def keypress(self, w, event): - keyname = gtk.gdk.keyval_name(event.keyval) + keyname = Gdk.keyval_name(event.keyval) if keyname == 'F1': self.simulate_click(self.tb_settings) return True @@ -418,7 +422,7 @@ def toolbar_server_keypress(self, w, event): - keyname = gtk.gdk.keyval_name(event.keyval) + keyname = Gdk.keyval_name(event.keyval) if keyname == 'Tab': self.populate_db_list() self.cb_dbname.grab_focus() @@ -446,7 +450,7 @@ self.db.put_conn(conninfo, conn) for i in range(self.cb_dbname.get_model().iter_n_children(None)): - self.cb_dbname.remove_text(0) + self.cb_dbname.remove(0) for row in rows: self.cb_dbname.append_text(row[0]) @@ -457,7 +461,7 @@ def reload_server_list(self, sel=None): # clean for i in range(self.cb_server.get_model().iter_n_children(None)): - self.cb_server.remove_text(0) + self.cb_server.remove(0) self.cb_server.get_child().set_text('') try: diff -r 39f777341db4 -r 3a41b351b122 pgconsole/database.py --- a/pgconsole/database.py Thu Mar 07 18:26:52 2013 +0100 +++ b/pgconsole/database.py Sun Mar 10 16:14:53 2013 +0100 @@ -37,7 +37,7 @@ try: conn = psycopg2.connect(conninfo, async=1) psycopg2.extras.wait_select(conn) - except psycopg2.DatabaseError, e: + except psycopg2.DatabaseError as e: raise DatabaseError(str(e)) return conn @@ -71,12 +71,12 @@ curs.execute(q, args) psycopg2.extras.wait_select(curs.connection) # conn.commit() - except psycopg2.OperationalError, e: + except psycopg2.OperationalError as e: # disconnected? # conn.rollback() conn.close() raise BadConnectionError(str(e)) - except psycopg2.DatabaseError, e: + except psycopg2.DatabaseError as e: # conn.rollback() raise DatabaseError(str(e), curs.query) return curs diff -r 39f777341db4 -r 3a41b351b122 pgconsole/dataview.py --- a/pgconsole/dataview.py Thu Mar 07 18:26:52 2013 +0100 +++ b/pgconsole/dataview.py Sun Mar 10 16:14:53 2013 +0100 @@ -1,33 +1,36 @@ -import gtk, gobject, pango +from gi.repository import GObject +from gi.repository import Gtk +from gi.repository import Pango + from cgi import escape -class DataView(gtk.ScrolledWindow): +class DataView(Gtk.ScrolledWindow): def __init__(self): super(DataView, self).__init__() sw = self - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) - self.treeview = gtk.TreeView(gtk.ListStore(str)) - self.treeview.get_selection().set_mode(gtk.SELECTION_MULTIPLE) + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN) + self.treeview = Gtk.TreeView(Gtk.ListStore(str)) + self.treeview.get_selection().set_mode(Gtk.SelectionMode.MULTIPLE) self.treeview.set_property("rubber-banding", True) sw.add(self.treeview) def load_data(self, names, rows): x = [str] * (len(names) + 1) - liststore = gtk.ListStore(*x) + liststore = Gtk.ListStore(*x) for c in self.treeview.get_columns(): self.treeview.remove_column(c) - tvcolumn = gtk.TreeViewColumn() + tvcolumn = Gtk.TreeViewColumn() cell = DataViewCellRenderer() cell.set_property('head', True) tvcolumn.pack_start(cell, True) tvcolumn.set_property('resizable', True) - #tvcolumn.set_property('sizing', gtk.TREE_VIEW_COLUMN_FIXED) + #tvcolumn.set_property('sizing', Gtk.TREE_VIEW_COLUMN_FIXED) tvcolumn.set_attributes(cell, text=0) tvcolumn.set_min_width(2) self.treeview.append_column(tvcolumn) @@ -40,10 +43,10 @@ if typename: title += '\n%s' % typename - tvcolumn = gtk.TreeViewColumn() + tvcolumn = Gtk.TreeViewColumn() cell = DataViewCellRenderer() - lab = gtk.Label() + lab = Gtk.Label() lab.set_use_underline(False) lab.set_markup(title) lab.show() @@ -63,21 +66,21 @@ -class DataViewCellRenderer(gtk.GenericCellRenderer): +class DataViewCellRenderer(Gtk.CellRenderer): __gtype_name__ = 'DataViewCellRenderer' __gproperties__ = { - 'text': (gobject.TYPE_STRING, None, None, '', gobject.PARAM_READWRITE), - 'head': (gobject.TYPE_BOOLEAN, None, None, False, gobject.PARAM_READWRITE)} + 'text': (GObject.TYPE_STRING, None, None, '', GObject.PARAM_READWRITE), + 'head': (GObject.TYPE_BOOLEAN, None, None, False, GObject.PARAM_READWRITE)} def __init__(self): - gtk.GenericCellRenderer.__init__(self) + Gtk.CellRenderer.__init__(self) self._props = {'text' : '', 'head' : False} def do_set_property(self, pspec, value): if not pspec.name in self._props: - raise AttributeError, 'Unknown property: %s' % pspec.name + raise AttributeError('Unknown property: %s' % pspec.name) self._props[pspec.name] = value @@ -88,7 +91,7 @@ def on_get_size(self, widget, cell_area): if cell_area == None: pangoctx = widget.get_pango_context() - layout = pango.Layout(pangoctx) + layout = Pango.Layout(pangoctx) layout.set_width(-1) layout.set_text(self.get_property('text') or 'NULL') w,h = layout.get_pixel_size() @@ -120,7 +123,7 @@ ctx.stroke() pangoctx = widget.get_pango_context() - layout = pango.Layout(pangoctx) + layout = Pango.Layout(pangoctx) text = self.get_property('text') head = self.get_property('head') @@ -132,7 +135,7 @@ else: layout.set_text(text) - widget.style.paint_layout(window, gtk.STATE_NORMAL, True, + widget.style.paint_layout(window, Gtk.STATE_NORMAL, True, cell_area, widget, '', cell_area.x, cell_area.y, layout) diff -r 39f777341db4 -r 3a41b351b122 pgconsole/editor.py --- a/pgconsole/editor.py Thu Mar 07 18:26:52 2013 +0100 +++ b/pgconsole/editor.py Sun Mar 10 16:14:53 2013 +0100 @@ -1,88 +1,90 @@ -import gtk, pango -import gtksourceview2 as gtksourceview +from gi.repository import Gtk +from gi.repository import Pango +from gi.repository import GtkSource + from lxml import etree -from panedext import HPanedExt -from config import cfg +from pgconsole.panedext import HPanedExt +from pgconsole.config import cfg class Editor(HPanedExt): def __init__(self): super(Editor, self).__init__() - self.view = gtksourceview.View() + self.view = GtkSource.View() self.view.connect('toggle-overwrite', self.on_toggle_overwrite) - vbox = gtk.VBox() + vbox = Gtk.VBox() self.vbox1 = vbox self.add1(vbox) - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) - sw.set_shadow_type(gtk.SHADOW_IN) - vbox.pack_start(sw) - tree = gtk.TreeView() + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + sw.set_shadow_type(Gtk.ShadowType.IN) + vbox.pack_start(sw, expand=True, fill=True, padding=0) + tree = Gtk.TreeView() tree.set_headers_visible(False) - tree.get_selection().set_mode(gtk.SELECTION_BROWSE) + tree.get_selection().set_mode(Gtk.SelectionMode.BROWSE) sw.add(tree) - model = gtk.ListStore(str, str, object, bool) # title, filename, buffer, modified + model = Gtk.ListStore(str, str, object, bool) # title, filename, buffer, modified tree.set_model(model) - cell = gtk.CellRendererPixbuf() - cell.set_property('stock-id', gtk.STOCK_SAVE) - column = gtk.TreeViewColumn("File", cell, visible=3) + cell = Gtk.CellRendererPixbuf() + cell.set_property('stock-id', Gtk.STOCK_SAVE) + column = Gtk.TreeViewColumn("File", cell, visible=3) tree.append_column(column) - column = gtk.TreeViewColumn("File", gtk.CellRendererText(), text=0) + column = Gtk.TreeViewColumn("File", Gtk.CellRendererText(), text=0) tree.append_column(column) tree.get_selection().connect('changed', self.item_change) tree.set_property('can-focus', False) self.filelist = tree - hbox = gtk.HBox() + hbox = Gtk.HBox() - img = gtk.Image() - img.set_from_stock(gtk.STOCK_NEW, gtk.ICON_SIZE_SMALL_TOOLBAR) - btn = gtk.Button() - btn.set_relief(gtk.RELIEF_NONE) + img = Gtk.Image() + img.set_from_stock(Gtk.STOCK_NEW, Gtk.IconSize.SMALL_TOOLBAR) + btn = Gtk.Button() + btn.set_relief(Gtk.ReliefStyle.NONE) btn.set_focus_on_click(False) btn.set_image(img) btn.connect('clicked', self.item_new) - hbox.pack_start(btn, expand=False) + hbox.pack_start(btn, expand=False, fill=True, padding=0) - img = gtk.Image() - img.set_from_stock(gtk.STOCK_OPEN, gtk.ICON_SIZE_SMALL_TOOLBAR) - btn = gtk.Button() - btn.set_relief(gtk.RELIEF_NONE) + img = Gtk.Image() + img.set_from_stock(Gtk.STOCK_OPEN, Gtk.IconSize.SMALL_TOOLBAR) + btn = Gtk.Button() + btn.set_relief(Gtk.ReliefStyle.NONE) btn.set_focus_on_click(False) btn.set_image(img) btn.connect('clicked', self.item_open) - hbox.pack_start(btn, expand=False) + hbox.pack_start(btn, expand=False, fill=True, padding=0) - img = gtk.Image() - img.set_from_stock(gtk.STOCK_CLOSE, gtk.ICON_SIZE_SMALL_TOOLBAR) - btn = gtk.Button() - btn.set_relief(gtk.RELIEF_NONE) + img = Gtk.Image() + img.set_from_stock(Gtk.STOCK_CLOSE, Gtk.IconSize.SMALL_TOOLBAR) + btn = Gtk.Button() + btn.set_relief(Gtk.ReliefStyle.NONE) btn.set_focus_on_click(False) btn.set_image(img) btn.connect('clicked', self.item_close) - hbox.pack_start(btn, expand=False) - hbox.connect('size-request', self.leftbuttons_size_request) + hbox.pack_start(btn, expand=False, fill=True, padding=0) + hbox.connect('size-allocate', self.leftbuttons_size_request) - vbox.pack_start(hbox, expand=False) + vbox.pack_start(hbox, expand=False, fill=True, padding=0) - vbox = gtk.VBox() + vbox = Gtk.VBox() vbox.set_property("width-request", 200) self.add2(vbox) self.child_set_property(vbox, 'shrink', False) # scroll - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_AUTOMATIC, gtk.POLICY_AUTOMATIC) - sw.set_shadow_type(gtk.SHADOW_ETCHED_IN) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.AUTOMATIC, Gtk.PolicyType.AUTOMATIC) + sw.set_shadow_type(Gtk.ShadowType.ETCHED_IN) sw.add(self.view) - vbox.pack_start(sw) + vbox.pack_start(sw, expand=True, fill=True, padding=0) self.view.set_show_line_numbers(True) @@ -92,76 +94,76 @@ self.view.set_auto_indent(True) # font - font_desc = pango.FontDescription('monospace') + font_desc = Pango.FontDescription('monospace') if font_desc: self.view.modify_font(font_desc) # status bar - hbox = gtk.HBox() + hbox = Gtk.HBox() self.st_file, fr1 = self.construct_status('SQL snippet') - self.st_file.set_ellipsize(pango.ELLIPSIZE_START) + self.st_file.set_ellipsize(Pango.EllipsizeMode.START) self.st_insovr, fr2 = self.construct_status('INS') self.st_linecol, fr3 = self.construct_status('Line: 0 Col: 0') - img = gtk.Image() - img.set_from_stock(gtk.STOCK_SAVE, gtk.ICON_SIZE_SMALL_TOOLBAR) + img = Gtk.Image() + img.set_from_stock(Gtk.STOCK_SAVE, Gtk.IconSize.SMALL_TOOLBAR) #save = img - save = gtk.Button() - save.set_relief(gtk.RELIEF_NONE) + save = Gtk.Button() + save.set_relief(Gtk.ReliefStyle.NONE) save.set_focus_on_click(False) save.set_image(img) save.connect('clicked', self.item_save) - hbox.pack_start(save, expand=False) + hbox.pack_start(save, expand=False, fill=True, padding=0) - hbox.pack_start(fr1, expand=True) - hbox.pack_start(fr2, expand=False) - hbox.pack_start(fr3, expand=False) + hbox.pack_start(fr1, expand=True, fill=True, padding=0) + hbox.pack_start(fr2, expand=False, fill=True, padding=0) + hbox.pack_start(fr3, expand=False, fill=True, padding=0) - #sep = gtk.HSeparator() + #sep = Gtk.HSeparator() #vbox.pack_start(sep, expand=False, fill=False, padding=0) - #align = gtk.Alignment() + #align = Gtk.Alignment() #align.set_property("bottom-padding", 3) #align.set_property("xscale", 1.0) #align.add(hbox) - #frame = gtk.Frame() + #frame = Gtk.Frame() #frame.add(hbox) - #frame.set_shadow_type(gtk.SHADOW_ETCHED_IN) - vbox.pack_start(hbox, expand=False, padding=0) + #frame.set_shadow_type(Gtk.SHADOW_ETCHED_IN) + vbox.pack_start(hbox, expand=False, fill=True, padding=0) self.load_nodes() self.build_context_menu() def build_context_menu(self): - menu = gtk.Menu() - item = gtk.ImageMenuItem(gtk.STOCK_SAVE, "Save") + menu = Gtk.Menu() + item = Gtk.ImageMenuItem(use_stock=True, label=Gtk.STOCK_SAVE) item.connect("activate", self.item_save) item.show() menu.append(item) - item = gtk.ImageMenuItem(gtk.STOCK_SAVE_AS, "Save as") + item = Gtk.ImageMenuItem(use_stock=True, label=Gtk.STOCK_SAVE_AS) item.connect("activate", self.item_save_as) item.show() menu.append(item) - item = gtk.ImageMenuItem(gtk.STOCK_CLOSE, "Close") + item = Gtk.ImageMenuItem(use_stock=True, label=Gtk.STOCK_CLOSE) item.connect("activate", self.item_close) item.show() menu.append(item) - item = gtk.SeparatorMenuItem() + item = Gtk.SeparatorMenuItem() item.show() menu.append(item) - item = gtk.ImageMenuItem(gtk.STOCK_GO_UP, "Move up") + item = Gtk.ImageMenuItem(use_stock=True, label=Gtk.STOCK_GO_UP) item.show() menu.append(item) - item = gtk.ImageMenuItem(gtk.STOCK_GO_DOWN, "Move down") + item = Gtk.ImageMenuItem(use_stock=True, label=Gtk.STOCK_GO_DOWN) item.show() menu.append(item) @@ -179,24 +181,24 @@ path, col, cellx, celly = pathinfo self.filelist.grab_focus() self.filelist.set_cursor(path, col, 0) - self.filelist_menu.popup(None, None, None, event.button, event.time) + self.filelist_menu.popup(None, None, None, None, event.button, event.time) return True def make_buffer(self): - buffer = gtksourceview.Buffer() + buffer = GtkSource.Buffer() buffer.connect('mark-set', self.buffer_mark_set) buffer.connect('changed', self.buffer_changed) # style - mgr = gtksourceview.style_scheme_manager_get_default() + mgr = GtkSource.StyleSchemeManager.get_default() style_scheme = mgr.get_scheme('kate') if style_scheme: buffer.set_style_scheme(style_scheme) # syntax - lngman = gtksourceview.language_manager_get_default() + lngman = GtkSource.LanguageManager.get_default() langsql = lngman.get_language('sql') buffer.set_language(langsql) buffer.set_highlight_syntax(True) @@ -216,7 +218,10 @@ buffer.set_text(node.text) if type == 'file': filename = node.text - content = open(filename).read() + try: + content = open(filename).read() + except IOError: + content = '' buffer.set_text(content) iter = model.append([name, filename, buffer, False]) if sel == name: @@ -240,12 +245,12 @@ def construct_status(self, text): - st = gtk.Label(text) + st = Gtk.Label(text) st.set_property("single-line-mode", True) st.set_property("xpad", 3) st.set_alignment(0.0, 0.5) - fr = gtk.Frame() - fr.set_shadow_type(gtk.SHADOW_ETCHED_OUT) + fr = Gtk.Frame() + fr.set_shadow_type(Gtk.ShadowType.ETCHED_OUT) fr.add(st) return st, fr @@ -319,23 +324,23 @@ def item_open(self, w): - dialog = gtk.FileChooserDialog(title='Open file', action=gtk.FILE_CHOOSER_ACTION_OPEN, - buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_OPEN,gtk.RESPONSE_OK)) - dialog.set_default_response(gtk.RESPONSE_OK) + dialog = Gtk.FileChooserDialog(title='Open file', action=Gtk.FileChooserAction.OPEN, + buttons=(Gtk.STOCK_CANCEL,Gtk.ResponseType.CANCEL,Gtk.STOCK_OPEN,Gtk.ResponseType.OK)) + dialog.set_default_response(Gtk.ResponseType.OK) dialog.set_select_multiple(True) - filter = gtk.FileFilter() + filter = Gtk.FileFilter() filter.set_name("SQL files") filter.add_pattern("*.sql") dialog.add_filter(filter) - filter = gtk.FileFilter() + filter = Gtk.FileFilter() filter.set_name("All files") filter.add_pattern("*") dialog.add_filter(filter) response = dialog.run() - if response == gtk.RESPONSE_OK: + if response == Gtk.ResponseType.OK: filenames = dialog.get_filenames() for fname in filenames: self.open_file(fname) @@ -393,24 +398,24 @@ path, file = filename.rsplit('/',1) - dialog = gtk.FileChooserDialog(title='Save as', action=gtk.FILE_CHOOSER_ACTION_SAVE, - buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,gtk.STOCK_SAVE,gtk.RESPONSE_OK)) - dialog.set_default_response(gtk.RESPONSE_OK) + dialog = Gtk.FileChooserDialog(title='Save as', action=Gtk.FileChooserAction.SAVE, + buttons=(Gtk.STOCK_CANCEL,Gtk.ResponseType.CANCEL,Gtk.STOCK_SAVE,Gtk.ResponseType.OK)) + dialog.set_default_response(Gtk.ResponseType.OK) dialog.set_current_folder(path) dialog.set_current_name(file) - filter = gtk.FileFilter() + filter = Gtk.FileFilter() filter.set_name("SQL files") filter.add_pattern("*.sql") dialog.add_filter(filter) - filter = gtk.FileFilter() + filter = Gtk.FileFilter() filter.set_name("All files") filter.add_pattern("*") dialog.add_filter(filter) response = dialog.run() - if response == gtk.RESPONSE_OK: + if response == Gtk.ResponseType.OK: filename = dialog.get_filename() data = buffer.get_text(*buffer.get_bounds()) open(filename, 'w').write(data) @@ -430,8 +435,8 @@ return iter = model.get_iter(sel[0]) newiter = model.iter_next(iter) - if newiter is None and sel[0][0] > 0: - newiter = model.get_iter((sel[0][0]-1,)) + if newiter is None and sel[0].get_indices()[0] > 0: + newiter = model.get_iter((sel[0].get_indices()[0]-1,)) title, buffer = model.get(iter, 0, 2) #buffer.destroy() @@ -450,6 +455,6 @@ def leftbuttons_size_request(self, w, request): - self.set_snap1(request[0]) + self.set_snap1(request.width) return True diff -r 39f777341db4 -r 3a41b351b122 pgconsole/panedext.py --- a/pgconsole/panedext.py Thu Mar 07 18:26:52 2013 +0100 +++ b/pgconsole/panedext.py Sun Mar 10 16:14:53 2013 +0100 @@ -1,8 +1,8 @@ -import gtk +from gi.repository import Gtk -class PanedExt(gtk.Paned): - """Extended gtk.Paned (abstract) +class PanedExt(Gtk.Paned): + """Extended Gtk.Paned (abstract) set_snap1(int), set_snap2(int) set minimum size of child widget @@ -23,7 +23,7 @@ def on_position_change(self, w, scrolltype): - if self.allocation[0] == -1: + if self.get_allocation().width == -1: return False pos = self.get_position() @@ -48,14 +48,14 @@ return False -class HPanedExt(gtk.HPaned, PanedExt): +class HPanedExt(Gtk.HPaned, PanedExt): def __init__(self): - gtk.HPaned.__init__(self) + Gtk.HPaned.__init__(self) PanedExt.__init__(self) -class VPanedExt(gtk.VPaned, PanedExt): +class VPanedExt(Gtk.VPaned, PanedExt): def __init__(self): - gtk.VPaned.__init__(self) + Gtk.VPaned.__init__(self) PanedExt.__init__(self) diff -r 39f777341db4 -r 3a41b351b122 pgconsole/settings.py --- a/pgconsole/settings.py Thu Mar 07 18:26:52 2013 +0100 +++ b/pgconsole/settings.py Sun Mar 10 16:14:53 2013 +0100 @@ -1,44 +1,45 @@ -import gtk +from gi.repository import Gtk +from gi.repository import Gdk -from config import cfg +from pgconsole.config import cfg -class Settings(gtk.Window): +class Settings(Gtk.Window): def __init__(self, parent): - super(Settings, self).__init__(gtk.WINDOW_TOPLEVEL) + super(Settings, self).__init__() self._parent = parent self.set_title('Settings') self.set_modal(True) self.set_transient_for(parent.win) - self.set_position(gtk.WIN_POS_CENTER) + self.set_position(Gtk.WindowPosition.CENTER_ON_PARENT) #self.set_border_width(10) self.connect("key_press_event", self.on_keypress) self.connect("destroy", self.on_destroy) - self.tabs = gtk.Notebook() + self.tabs = Gtk.Notebook() self.add(self.tabs) ### Servers - vbox = gtk.VBox(spacing=10) + vbox = Gtk.VBox(spacing=10) vbox.set_border_width(10) - self.tabs.append_page(vbox, gtk.Label('Servers')) + self.tabs.append_page(vbox, Gtk.Label('Servers')) - hbox = gtk.HBox(spacing=10) - vbox.pack_start(hbox) - sw = gtk.ScrolledWindow() - sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) - sw.set_shadow_type(gtk.SHADOW_IN) - hbox.pack_start(sw) - tree = gtk.TreeView() + hbox = Gtk.HBox(spacing=10) + vbox.pack_start(hbox, expand=True, fill=True, padding=0) + sw = Gtk.ScrolledWindow() + sw.set_policy(Gtk.PolicyType.NEVER, Gtk.PolicyType.AUTOMATIC) + sw.set_shadow_type(Gtk.ShadowType.IN) + hbox.pack_start(sw, expand=True, fill=True, padding=0) + tree = Gtk.TreeView() tree.set_headers_visible(False) sw.add(tree) - tree.get_selection().set_mode(gtk.SELECTION_BROWSE) + tree.get_selection().set_mode(Gtk.SelectionMode.BROWSE) - model = gtk.ListStore(str, object) + model = Gtk.ListStore(str, object) tree.set_model(model) - column = gtk.TreeViewColumn("Server", gtk.CellRendererText(), text=0) + column = Gtk.TreeViewColumn("Server", Gtk.CellRendererText(), text=0) tree.append_column(column) tree.get_selection().connect('changed', self.item_change) tree.set_size_request(100, -1) @@ -55,69 +56,69 @@ self.itemtree = tree - vbox = gtk.VBox(spacing=10) - hbox.pack_start(vbox) + vbox = Gtk.VBox(spacing=10) + hbox.pack_start(vbox, expand=True, fill=True, padding=0) - table = gtk.Table(5, 2) + table = Gtk.Table(5, 2) table.set_row_spacings(4) table.set_col_spacings(10) - vbox.pack_start(table) + vbox.pack_start(table, expand=True, fill=True, padding=0) - label = gtk.Label("Name:") + label = Gtk.Label("Name:") label.set_alignment(0.0, 0.5) table.attach(label, 0, 1, 0, 1) - entry = gtk.Entry() + entry = Gtk.Entry() table.attach(entry, 1, 2, 0, 1) self.entry_name = entry - label = gtk.Label("Host:") + label = Gtk.Label("Host:") label.set_alignment(0.0, 0.5) table.attach(label, 0, 1, 1, 2) - entry = gtk.Entry() + entry = Gtk.Entry() entry.set_text('127.0.0.1') table.attach(entry, 1, 2, 1, 2) self.entry_host = entry - label = gtk.Label("Port:") + label = Gtk.Label("Port:") label.set_alignment(0.0, 0.5) table.attach(label, 0, 1, 2, 3) - entry = gtk.Entry() + entry = Gtk.Entry() entry.set_text('5432') table.attach(entry, 1, 2, 2, 3) self.entry_port = entry - label = gtk.Label("User:") + label = Gtk.Label("User:") label.set_alignment(0.0, 0.5) table.attach(label, 0, 1, 3, 4) - entry = gtk.Entry() + entry = Gtk.Entry() entry.set_text('postgres') table.attach(entry, 1, 2, 3, 4) self.entry_user = entry - label = gtk.Label("Password:") + label = Gtk.Label("Password:") label.set_alignment(0.0, 0.5) table.attach(label, 0, 1, 4, 5) - entry = gtk.Entry() + entry = Gtk.Entry() table.attach(entry, 1, 2, 4, 5) self.entry_password = entry - hbox = gtk.HBox() - vbox.pack_start(hbox) + hbox = Gtk.HBox() + vbox.pack_start(hbox, expand=True, fill=True, padding=0) - btn = gtk.Button('Add') + btn = Gtk.Button('Add') btn.connect('clicked', self.item_add) - hbox.pack_start(btn) - btn = gtk.Button('Save') + hbox.pack_start(btn, expand=True, fill=True, padding=0) + btn = Gtk.Button('Save') btn.connect('clicked', self.item_save) - hbox.pack_start(btn) - btn = gtk.Button('Remove') + hbox.pack_start(btn, expand=True, fill=True, padding=0) + btn = Gtk.Button('Remove') btn.connect('clicked', self.item_remove) - hbox.pack_start(btn) + hbox.pack_start(btn, expand=True, fill=True, padding=0) ### Editor - vbox = gtk.VBox(spacing=10) + vbox = Gtk.VBox(spacing=10) vbox.set_border_width(10) - self.tabs.append_page(vbox, gtk.Label('Editor')) + self.tabs.append_page(vbox, Gtk.Label('Editor')) self.show_all() self.itemtree.grab_focus() @@ -180,7 +181,7 @@ def on_keypress(self, w, event): - keyname = gtk.gdk.keyval_name(event.keyval) + keyname = Gdk.keyval_name(event.keyval) if keyname == 'Escape': self.destroy() @@ -191,7 +192,7 @@ def on_destroy(self, w): model, sel = self.itemtree.get_selection().get_selected_rows() if sel: - sel = sel[0][0] + sel = sel[0].get_indices()[0] else: sel = None self._parent.reload_server_list(sel)