summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--examples/pygtk-demo/demos/stock_browser.py218
-rw-r--r--gtk/gtk.defs6
-rw-r--r--gtk/gtk.override93
4 files changed, 324 insertions, 5 deletions
diff --git a/ChangeLog b/ChangeLog
index e2815903..0682f277 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -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)