diff options
-rw-r--r-- | ChangeLog | 12 | ||||
-rw-r--r-- | examples/pygtk-demo/demos/stock_browser.py | 218 | ||||
-rw-r--r-- | gtk/gtk.defs | 6 | ||||
-rw-r--r-- | gtk/gtk.override | 93 |
4 files changed, 324 insertions, 5 deletions
@@ -1,3 +1,15 @@ +2003-03-07 Johan Dahlin <jdahlin@async.com.br> + + * gtk/gtk.defs (gtk_label_new_with_mnemonic, gtk_label_new) + (render_icon): Allow some parameters to be NULL. + + * gtk/gtk.override (_wrap_gtk_stock_lookup) + (_wrap_gtk_stock_list_ids) + (_wrap_gtk_tree_view_insert_column_with_data_func): Impl. + (ignore-glob): Remove gtk_accelerator_* + + * examples/pygtk-demo/demos/stock_browser.py: Ported from C + 2003-03-04 Jon Trowbridge <trow@ximian.com> * gtk/gtkmodule.c (python_do_pending_calls): Block threads while diff --git a/examples/pygtk-demo/demos/stock_browser.py b/examples/pygtk-demo/demos/stock_browser.py new file mode 100644 index 00000000..179125cf --- /dev/null +++ b/examples/pygtk-demo/demos/stock_browser.py @@ -0,0 +1,218 @@ +"""Stock Item and Icon Browser + +This source code for this demo doesn't demonstrate anything +particularly useful in applications. The purpose of the "demo" is + just to provide a handy place to browse the available stock icons + and stock items.""" + +description = "Stock Browser" + +import gobject +import gtk + +window = None + +class StockItemInfo(gobject.GObject): + id = '' + item = None + small_icon = None + macro = '' + accel_str = '' +gobject.type_register(StockItemInfo) + +class StockItemDisplay: + pass + +def id_to_macro(str): + if str.startswith('gtk-'): + str = str.replace('gtk-', 'gtk-stock-') + str = str.upper() + return str.replace('-', '_') + +def create_model(): + store = gtk.ListStore(StockItemInfo) + + ids = gtk.stock_list_ids() + ids.sort() + + for id in ids: + info = StockItemInfo() + info.id = id + item = gtk.stock_lookup(info.id) + if item: + info.item = item + else: + info.item = [None, None, 0, 0, None] + + icon_set = gtk.icon_factory_lookup_default(info.id) + if icon_set: + sizes = icon_set.get_sizes() + if gtk.ICON_SIZE_MENU in sizes: + size = gtk.ICON_SIZE_MENU + else: + size = sizes[0] + + info.small_icon = window.render_icon(info.id, + size) + if size != gtk.ICON_SIZE_MENU: + #w, h = gtk.icon_size_lookup(gtk.ICON_SIZE_MENU) + raise NotImplementedError + + if info.item[2]: + info.accel_str = gtk.accelerator_name(info.item[3], + info.item[2]) + + info.macro = id_to_macro(info.id) + + iter = store.append() + store.set(iter, 0, info) + + return store + +def get_largest_size(id): + set = gtk.icon_factory_lookup_default(id) + best_size = gtk.ICON_SIZE_INVALID + best_pixels = 0 + + for size in set.get_sizes(): + width, height = gtk.icon_size_lookup(size) + if width * height > best_pixels: + best_size = size + best_pixels = width * height + + return best_size + +def selection_changed(selection): + treeview = selection.get_tree_view() + display = treeview.get_data('stock-display') + value = selection.get_selected() + if value: + model, iter = value + info = model.get_value(iter, 0) + + if info.small_icon and info.item[1]: + display.type_label.set_text('Icon and Item') + elif info.small_icon: + display.type_label.set_text('Icon only') + elif info.item[1]: + display.type_label.set_text('Item only') + else: + display.type_label.set_text('???????') + + display.macro_label.set_text(info.macro) + display.id_label.set_text(info.id) + + if info.item[1]: + display.label_accel_label.set_text_with_mnemonic('%s %s' % \ + (info.item[1], + info.accel_str)) + else: + display.label_accel_label.set_text('') + + if info.small_icon: + display.icon_image.set_from_stock(info.id, get_largest_size(info.id)) + else: + display.icon_image.set_from_pixbuf(None) + else: + display.type_label.set_text('No selected item') + display.macro_label.set_text('') + display.id_label.set_text('') + display.label_accel_label.set_text('') + display.icon_image.set_from_pixbuf(None) + +def macro_set_func_text(tree, cell, model, iter): + info = model.get_value(iter, 0) + cell.set_property('text', info.macro) + +def macro_set_func_pixbuf(tree, cell, model, iter): + info = model.get_value(iter, 0) + cell.set_property('pixbuf', info.small_icon) + +def id_set_func(tree, cell, model, iter): + info = model.get_value(iter, 0) + cell.set_property('text', info.id) + +def accel_set_func(tree, cell, model, iter): + info = model.get_value(iter, 0) + cell.set_property('text', info.accel_str) + +def label_set_func(tree, cell, model, iter): + info = model.get_value(iter, 0) + cell.set_property('text', info.item[1]) + +def main(): + global window + + window = gtk.Window(gtk.WINDOW_TOPLEVEL) + window.set_title('Stock Icons and Items') + window.set_default_size(-1, 500) + + window.connect('destroy', lambda *x: gtk.mainquit()) + window.set_border_width(8) + + hbox = gtk.HBox(False, 8) + window.add(hbox) + + sw = gtk.ScrolledWindow() + sw.set_policy(gtk.POLICY_NEVER, gtk.POLICY_AUTOMATIC) + hbox.pack_start(sw) + + model = create_model() + + treeview = gtk.TreeView(model) + sw.add(treeview) + + column = gtk.TreeViewColumn() + column.set_title('Macro') + + cell_renderer = gtk.CellRendererPixbuf() + column.pack_start(cell_renderer, False) + column.set_cell_data_func(cell_renderer, macro_set_func_pixbuf) + cell_renderer = gtk.CellRendererText() + column.pack_start(cell_renderer, True) + column.set_cell_data_func(cell_renderer, macro_set_func_text) + treeview.append_column(column) + + cell_renderer = gtk.CellRendererText() + treeview.insert_column_with_data_func(-1, "Label", cell_renderer, + label_set_func) + treeview.insert_column_with_data_func(-1, "Accel", cell_renderer, + accel_set_func) + treeview.insert_column_with_data_func(-1, "ID", cell_renderer, + id_set_func) + + align = gtk.Alignment(0.5, 0.0, 0.0, 0.0) + hbox.pack_start(align) + + frame = gtk.Frame("Selected Item") + align.add(frame) + + vbox = gtk.VBox(False, 8) + vbox.set_border_width(4) + frame.add(vbox) + + + display = StockItemDisplay() + treeview.set_data('stock-display', display) + display.type_label = gtk.Label() + display.macro_label = gtk.Label() + display.id_label = gtk.Label() + display.label_accel_label = gtk.Label() + display.icon_image = gtk.Image() + + vbox.pack_start(display.type_label) + vbox.pack_start(display.icon_image) + vbox.pack_start(display.label_accel_label) + vbox.pack_start(display.macro_label) + vbox.pack_start(display.id_label) + + selection = treeview.get_selection() + selection.set_mode(gtk.SELECTION_SINGLE) + selection.connect('changed', selection_changed) + + window.show_all() + +if __name__ == '__main__': + main() + gtk.main() + diff --git a/gtk/gtk.defs b/gtk/gtk.defs index be5e1a82..fea0672b 100644 --- a/gtk/gtk.defs +++ b/gtk/gtk.defs @@ -5842,7 +5842,7 @@ (is-constructor-of GtkLabel) (return-type "GtkWidget*") (parameters - '("const-char*" "str") + '("const-char*" "str" (null-ok) (default "NULL")) ) ) @@ -5851,7 +5851,7 @@ (is-constructor-of GtkLabel) (return-type "GtkWidget*") (parameters - '("const-char*" "str") + '("const-char*" "str" (null-ok) (default "NULL")) ) ) @@ -16283,7 +16283,7 @@ (parameters '("const-gchar*" "stock_id") '("GtkIconSize" "size") - '("const-gchar*" "detail") + '("const-gchar*" "detail" (null-ok) (default "NULL")) ) ) diff --git a/gtk/gtk.override b/gtk/gtk.override index 0fb1ff0c..e5c2c877 100644 --- a/gtk/gtk.override +++ b/gtk/gtk.override @@ -2761,7 +2761,7 @@ pygtk_cell_data_func_marshal (GtkTreeViewColumn *tree_column, PyGtkCustomNotify *cunote = data; PyObject *retobj; PyObject *pytreecolumn, *pycell, *pytreemodel, *pyiter; - + g_assert (cunote->func); pyg_block_threads(); @@ -2824,6 +2824,49 @@ _wrap_gtk_tree_view_column_set_cell_data_func (PyGObject *self, PyObject *args, return Py_None; } %% +override gtk_tree_view_insert_column_with_data_func kwargs +static PyObject * +_wrap_gtk_tree_view_insert_column_with_data_func (PyGObject *self, + PyObject *args, + PyObject *kwargs) +{ + int position; + gchar *title; + PyObject *pycell,*pyfunc, *pyarg = NULL; + GtkCellRenderer *cell; + PyGtkCustomNotify *cunote; + gint retval; + + if (!PyArg_ParseTuple(args, + "isOO|O:GtkTreeView.insert_column_with_data_func", + &position, &title, &pycell, &pyfunc, &pyarg)) + return NULL; + + if (pygobject_check(pycell, &PyGtkCellRenderer_Type)) + cell = GTK_CELL_RENDERER(pygobject_get(pycell)); + else { + PyErr_SetString(PyExc_TypeError, + "first argument must be a GtkCellRenderer"); + return NULL; + } + + cunote = g_new0(PyGtkCustomNotify, 1); + cunote->func = pyfunc; + cunote->data = pyarg; + Py_INCREF(cunote->func); + Py_XINCREF(cunote->data); + + retval = gtk_tree_view_insert_column_with_data_func ( + GTK_TREE_VIEW (self->obj), + position, + title, + cell, + pygtk_cell_data_func_marshal, + cunote, + pygtk_custom_destroy_notify); + return PyInt_FromLong(retval); +} +%% override gtk_tree_view_column_set_attributes kwargs static PyObject * _wrap_gtk_tree_view_column_set_attributes(PyGObject *self, PyObject *args, @@ -3390,7 +3433,6 @@ arg_error: ignore-glob _* *_get_type - gtk_accelerator_* gtk_arg_* gtk_args_* gtk_draw_* @@ -6760,6 +6802,53 @@ _wrap_gtk_stock_add(PyGObject *self, PyObject *args, PyObject *kwargs) return NULL; } %% +override gtk_stock_list_ids noargs +static PyObject * +_wrap_gtk_stock_list_ids(PyGObject *self) +{ + GSList *ids; + PyObject *list; + int i = 0; + + ids = gtk_stock_list_ids(); + + list = PyList_New(g_slist_length(ids)); + for (; ids; ids = ids->next, i++) { + PyObject *py_item; + + PyList_SetItem(list, i, PyString_FromString(ids->data)); + g_free(ids->data); + } + g_slist_free(ids); + + return list; +} +%% +override gtk_stock_lookup args +static PyObject * +_wrap_gtk_stock_lookup(PyGObject *self, PyObject *args) +{ + gchar *stock_id; + GtkStockItem item; + + if (!PyArg_ParseTuple(args, "s:gtk.stock_lookup", + &stock_id)) { + return NULL; + } + + if(gtk_stock_lookup(stock_id, &item)) { + return Py_BuildValue("zziiz", + item.stock_id, + item.label, + item.modifier, + item.keyval, + item.translation_domain); + } + + Py_INCREF(Py_None); + return Py_None; +} +%% override gtk_layout_get_size noargs static PyObject * _wrap_gtk_layout_get_size(PyGObject *self) |