Changeset 546

Show
Ignore:
Timestamp:
07/29/08 15:44:50 (4 months ago)
Author:
Mike Wey
Message:

make TreeModel? extendable

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/src/gtk/TreeModel.d

    r541 r546  
    2929 * realStrct= 
    3030 * ctorStrct= 
    31  * clss    = TreeModel 
     31 * clss    =  
    3232 * interf  =  
    3333 * class Code: Yes 
    3434 * interface Code: No 
    3535 * template for: 
    36  * extend  = ObjectG 
     36 * extend  =  
    3737 * implements: 
    38  *  - TreeModelIF 
    3938 * prefixes: 
    4039 * omit structs: 
     
    4342 * omit signals: 
    4443 * imports: 
     44 *  - glib.Str 
     45 *  - gobject.Type 
    4546 *  - gobject.ObjectG 
    46  *  - glib.Str 
     47 *  - gobject.Signals 
     48 *  - gobject.Value 
    4749 *  - gtk.TreeIter 
    4850 *  - gtk.TreePath 
    49  *  - gobject.Value 
    5051 *  - gtk.TreeModelT 
    5152 *  - gtk.TreeModelIF 
    52  *  - gobject.Signals 
     53 *  - gtkc.gobject 
     54 *  - gtkc.Loader 
     55 *  - gtkc.paths 
    5356 * structWrap: 
    5457 * module aliases: 
     
    6568 
    6669 
     70private import glib.Str; 
     71private import gobject.Type; 
    6772private import gobject.ObjectG; 
    68 private import glib.Str; 
     73private import gobject.Signals; 
     74private import gobject.Value; 
    6975private import gtk.TreeIter; 
    7076private import gtk.TreePath; 
    71 private import gobject.Value; 
    7277private import gtk.TreeModelT; 
    7378private import gtk.TreeModelIF; 
    74 private import gobject.Signals; 
    75  
    76  
    77  
     79private import gtkc.gobject; 
     80private import gtkc.Loader; 
     81private import gtkc.paths; 
     82 
     83 
     84 
     85 
     86struct CustomTreeModelClass 
     87
     88    // Padding, not perssent in the GtkD structs. 
     89    GType g_type; 
     90    GSList* construct_properties; 
     91     
     92    GObjectClass parentClass; 
     93     
     94    // padding 
     95    gpointer dummy[7]; 
     96
     97 
     98//We need this function for the interface implementation. 
     99extern(C) GType function()gtk_tree_model_get_type; 
     100 
     101private Symbol[] links = [{ "gtk_tree_model_get_type",  cast(void**)&gtk_tree_model_get_type}]; 
    78102 
    79103/** 
     
    81105public class TreeModel : ObjectG, TreeModelIF 
    82106{ 
     107    static GObjectClass* parentClass = null; 
     108     
     109    static this() 
     110    { 
     111        Linker linker; 
     112         
     113        linker = new Linker(libPath ~ importLibs[LIBRARY.GTK] ); 
     114        linker.link(links); 
     115    } 
    83116     
    84117    // Minimal implementation. 
     
    89122    { 
    90123        return cast(void*)gtkTreeModel; 
     124    } 
     125     
     126    public this () 
     127    { 
     128        auto p =  super(customTreeModelgetType(), null); 
     129        gtkTreeModel = cast(GtkTreeModel*) p.getObjectGStruct(); 
     130         
     131        objectGSetDataFull("customTreeModel", cast(void*)this); 
    91132    } 
    92133     
     
    102143        } 
    103144         
     145        //Check if there already is a D object for this gtk struct 
     146        void* ptr = g_object_get_data(cast(GObject*) gtkTreeModel, Str.toStringz("customTreeModel")); 
     147        if( ptr !is null ) 
     148        { 
     149            this = cast(TreeModel)ptr; 
     150            return; 
     151        } 
     152         
    104153        super(cast(GObject*)gtkTreeModel); 
    105154        this.gtkTreeModel = gtkTreeModel; 
    106155    } 
    107156     
    108     /** 
    109      */ 
     157     
     158    extern(C) 
     159    { 
     160        /* 
     161         *  here we register our new type and its interfaces 
     162         *  with the type system. If you want to implement 
     163         *  additional interfaces like GtkTreeSortable, you 
     164         *  will need to do it here. 
     165         */ 
     166         
     167        static GType customTreeModelgetType() 
     168        { 
     169            GType customTreeModelType = GType.INVALID; 
     170             
     171            /* Some boilerplate type registration stuff */ 
     172            if (customTreeModelType == GType.INVALID) 
     173            { 
     174                GTypeInfo customTreeModelInfo = 
     175                { 
     176                    CustomTreeModelClass.sizeof,                   /* class size */ 
     177                    null,                                          /* base_init */ 
     178                    null,                                          /* base_finalize */ 
     179                    cast(GClassInitFunc) &customTreeModelClassInit,/* class init function */ 
     180                    null,                                          /* class finalize */ 
     181                    null,                                          /* class_data */ 
     182                    CustomTreeModelClass.sizeof + 1,               /* instance size */ 
     183                    0,                                             /* n_preallocs */ 
     184                    cast(GInstanceInitFunc) &customTreeModelInit   /* instance init */ 
     185                }; 
     186                GInterfaceInfo treeModelInfo = 
     187                { 
     188                    cast(GInterfaceInitFunc) &customTreeModelInit, 
     189                    null, 
     190                    null 
     191                }; 
     192                 
     193                /* First register the new derived type with the GObject type system */ 
     194                customTreeModelType = Type.registerStatic (GType.OBJECT, "CustomTreeModel", 
     195                &customTreeModelInfo, cast(GTypeFlags)0); 
     196                 
     197                /* Now register our GtkTreeModel interface with the type system */ 
     198                Type.addInterfaceStatic (customTreeModelType, gtk_tree_model_get_type() /*GTK_TYPE_TREE_MODEL*/, &treeModelInfo); 
     199            } 
     200             
     201            return customTreeModelType; 
     202        } 
     203         
     204        /* 
     205         *  boilerplate GObject/GType stuff. 
     206         *  Init callback for the type system, 
     207         *  called once when our new class is created. 
     208         */ 
     209         
     210        static void customTreeModelClassInit (void* klass) 
     211        { 
     212            GObjectClass* objectClass; 
     213             
     214            parentClass = cast(GObjectClass*) Type.classPeekParent(klass); 
     215            objectClass = cast(GObjectClass*) klass; 
     216             
     217            objectClass.finalize = &customTreeModelFinalize; 
     218        } 
     219         
     220        /* 
     221         *  init callback for the interface registration 
     222         *  in customTreeModelGetType. Here we override 
     223         *  the GtkTreeModel interface functions that 
     224         *  we implement. 
     225         */ 
     226         
     227        static void customTreeModelInit (GtkTreeModelIface *iface) 
     228        { 
     229            iface.getFlags      = &customTreeModelGetFlags; 
     230            iface.getNColumns   = &customTreeModelGetNColumns; 
     231            iface.getColumnType = &customTreeModelGetColumnType; 
     232            iface.getIter       = &customTreeModelGetIter; 
     233            iface.getPath       = &customTreeModelGetPath; 
     234            iface.getValue      = &customTreeModelGetValue; 
     235            iface.iterNext      = &customTreeModelIterNext; 
     236            iface.iterChildren  = &customTreeModelIterChildren; 
     237            iface.iterHasChild  = &customTreeModelIterHasChild; 
     238            iface.iterNChildren = &customTreeModelIterNChildren; 
     239            iface.iterNthChild  = &customTreeModelIterNthChild; 
     240            iface.iterParent    = &customTreeModelIterParent; 
     241        } 
     242         
     243        /* 
     244         *  this is called just before a custom list is 
     245         *  destroyed. Free dynamically allocated memory here. 
     246         */ 
     247         
     248        static void customTreeModelFinalize (GObject *object) 
     249        { 
     250            /* must chain up - finalize parent */ 
     251            parentClass.finalize(object); 
     252        } 
     253         
     254        static GtkTreeModelFlags customTreeModelGetFlags(GtkTreeModel *tree_model) 
     255        { 
     256            auto tm = new TreeModel(tree_model); 
     257             
     258            return tm.getFlags(); 
     259        } 
     260         
     261        static int customTreeModelGetNColumns(GtkTreeModel *tree_model) 
     262        { 
     263            auto tm = new TreeModel(tree_model); 
     264             
     265            return tm.getNColumns(); 
     266        } 
     267         
     268        static GType customTreeModelGetColumnType(GtkTreeModel *tree_model, int index) 
     269        { 
     270            auto tm = new TreeModel(tree_model); 
     271             
     272            return tm.getColumnType(index); 
     273        } 
     274         
     275        static gboolean customTreeModelGetIter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path) 
     276        { 
     277            auto tm = new TreeModel(tree_model); 
     278             
     279            return tm.getIter(new TreeIter(iter), new TreePath(path)); 
     280        } 
     281         
     282        static GtkTreePath* customTreeModelGetPath(GtkTreeModel *tree_model, GtkTreeIter *iter) 
     283        { 
     284            auto tm = new TreeModel(tree_model); 
     285            TreePath path = tm.getPath(new TreeIter(iter)); 
     286             
     287            return (path is null) ? null : path.getTreePathStruct(); 
     288        } 
     289         
     290        static void customTreeModelGetValue(GtkTreeModel *tree_model, GtkTreeIter *iter, int column, GValue *value) 
     291        { 
     292            auto tm = new TreeModel(tree_model); 
     293             
     294            tm.getValue(new TreeIter(iter), column, new Value(value)); 
     295        } 
     296         
     297        static gboolean customTreeModelIterNext(GtkTreeModel *tree_model, GtkTreeIter *iter) 
     298        { 
     299            auto tm = new TreeModel(tree_model); 
     300             
     301            return tm.iterNext(new TreeIter(iter)); 
     302        } 
     303         
     304        static gboolean customTreeModelIterChildren(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent) 
     305        { 
     306            auto tm = new TreeModel(tree_model); 
     307             
     308            return tm.iterChildren(new TreeIter(iter), new TreeIter(parent)); 
     309        } 
     310         
     311        static gboolean customTreeModelIterHasChild(GtkTreeModel *tree_model, GtkTreeIter *iter) 
     312        { 
     313            auto tm = new TreeModel(tree_model); 
     314             
     315            return tm.iterHasChild(new TreeIter(iter)); 
     316        } 
     317         
     318        static int customTreeModelIterNChildren(GtkTreeModel *tree_model, GtkTreeIter *iter) 
     319        { 
     320            auto tm = new TreeModel(tree_model); 
     321             
     322            return tm.iterNChildren(new TreeIter(iter)); 
     323        } 
     324         
     325        static gboolean customTreeModelIterNthChild(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, int n) 
     326        { 
     327            auto tm = new TreeModel(tree_model); 
     328             
     329            return tm.iterNthChild(new TreeIter(iter), new TreeIter(parent), n); 
     330        } 
     331         
     332        static gboolean customTreeModelIterParent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child) 
     333        { 
     334            auto tm = new TreeModel(tree_model); 
     335             
     336            return tm.iterParent(new TreeIter(iter), new TreeIter(child)); 
     337        } 
     338    } 
    110339} 
     340 
     341/** 
     342 */ 
     343 
  • trunk/src/gtkc/gobjecttypes.d

    r543 r546  
    233233 * An opaque structure used as the base of all interface types. 
    234234 */ 
    235 public struct GTypeInterface{} 
     235public struct GTypeInterface 
     236
     237    GType gType;         /* iface type */ 
     238    GType gInstanceType; 
     239
    236240 
    237241 
  • trunk/src/gtkc/gtk.d

    r525 r546  
    14171417     
    14181418     
    1419     // gtk.TreeModel 
     1419    // gtk. 
    14201420     
    14211421     
  • trunk/wrap/APILookupGtk.txt

    r541 r546  
    28342834 
    28352835 
     2836 
    28362837file: 
    2837 class: TreeModel 
    2838 extend: ObjectG 
    2839 implements: TreeModelIF 
     2838import: glib.Str 
     2839import: gobject.Type 
    28402840import: gobject.ObjectG 
    2841  
    2842 # imports for TreeModel Interface 
    2843 import: glib.Str 
     2841import: gobject.Signals 
     2842import: gobject.Value 
    28442843import: gtk.TreeIter 
    28452844import: gtk.TreePath 
    2846 import: gobject.Value 
    28472845import: gtk.TreeModelT 
    28482846import: gtk.TreeModelIF 
    2849 import: gobject.Signals 
     2847import: gtkc.gobject 
     2848import: gtkc.Loader 
     2849import: gtkc.paths 
    28502850 
    28512851code: start 
     2852struct CustomTreeModelClass 
     2853{ 
     2854    // Padding, not perssent in the GtkD structs. 
     2855    GType g_type;  
     2856    GSList* construct_properties; 
     2857 
     2858    GObjectClass parentClass; 
     2859 
     2860    // padding 
     2861    gpointer dummy[7]; 
     2862} 
     2863 
     2864//We need this function for the interface implementation. 
     2865extern(C) GType function()gtk_tree_model_get_type; 
     2866 
     2867private Symbol[] links = [{ "gtk_tree_model_get_type",  cast(void**)&gtk_tree_model_get_type}]; 
     2868 
     2869/** 
     2870 */ 
     2871public class TreeModel : ObjectG, TreeModelIF 
     2872{ 
     2873    static GObjectClass* parentClass = null; 
     2874 
     2875    static this() 
     2876    { 
     2877        Linker linker; 
     2878 
     2879        linker = new Linker(libPath ~ importLibs[LIBRARY.GTK] ); 
     2880        linker.link(links); 
     2881    } 
     2882 
    28522883    // Minimal implementation. 
    28532884    mixin TreeModelT!(GtkTreeModel); 
    2854  
     2885     
    28552886    /** the main Gtk struct as a void* */ 
    28562887    protected override void* getStruct() 
     
    28582889        return cast(void*)gtkTreeModel; 
    28592890    } 
     2891 
     2892    public this () 
     2893    { 
     2894        auto p =  super(customTreeModelgetType(), null); 
     2895        gtkTreeModel = cast(GtkTreeModel*) p.getObjectGStruct(); 
     2896 
     2897        objectGSetDataFull("customTreeModel", cast(void*)this); 
     2898    } 
    28602899     
    28612900    /** 
     
    28702909        } 
    28712910 
     2911        //Check if there already is a D object for this gtk struct 
     2912        void* ptr = g_object_get_data(cast(GObject*) gtkTreeModel, Str.toStringz("customTreeModel")); 
     2913        if( ptr !is null ) 
     2914        { 
     2915            this = cast(TreeModel)ptr; 
     2916            return; 
     2917        } 
     2918         
    28722919        super(cast(GObject*)gtkTreeModel); 
    28732920        this.gtkTreeModel = gtkTreeModel; 
    28742921    } 
     2922 
     2923 
     2924    extern(C) 
     2925    { 
     2926        /* 
     2927         *  here we register our new type and its interfaces 
     2928         *  with the type system. If you want to implement 
     2929         *  additional interfaces like GtkTreeSortable, you 
     2930         *  will need to do it here. 
     2931         */ 
     2932 
     2933        static GType customTreeModelgetType() 
     2934        { 
     2935            GType customTreeModelType = GType.INVALID; 
     2936 
     2937            /* Some boilerplate type registration stuff */ 
     2938            if (customTreeModelType == GType.INVALID) 
     2939            { 
     2940                GTypeInfo customTreeModelInfo = 
     2941                { 
     2942                    CustomTreeModelClass.sizeof,                   /* class size */ 
     2943                    null,                                          /* base_init */ 
     2944                    null,                                          /* base_finalize */ 
     2945                    cast(GClassInitFunc) &customTreeModelClassInit,/* class init function */ 
     2946                    null,                                          /* class finalize */ 
     2947                    null,                                          /* class_data */ 
     2948                    CustomTreeModelClass.sizeof + 1,               /* instance size */ 
     2949                    0,                                             /* n_preallocs */ 
     2950                    cast(GInstanceInitFunc) &customTreeModelInit   /* instance init */ 
     2951                }; 
     2952                GInterfaceInfo treeModelInfo = 
     2953                { 
     2954                    cast(GInterfaceInitFunc) &customTreeModelInit, 
     2955                    null, 
     2956                    null 
     2957                }; 
     2958 
     2959                /* First register the new derived type with the GObject type system */ 
     2960                customTreeModelType = Type.registerStatic (GType.OBJECT, "CustomTreeModel", 
     2961                                                   &customTreeModelInfo, cast(GTypeFlags)0); 
     2962 
     2963                /* Now register our GtkTreeModel interface with the type system */ 
     2964                Type.addInterfaceStatic (customTreeModelType, gtk_tree_model_get_type() /*GTK_TYPE_TREE_MODEL*/, &treeModelInfo); 
     2965            } 
     2966 
     2967            return customTreeModelType; 
     2968        } 
     2969 
     2970        /* 
     2971         *  boilerplate GObject/GType stuff. 
     2972         *  Init callback for the type system, 
     2973         *  called once when our new class is created. 
     2974         */ 
     2975 
     2976        static void customTreeModelClassInit (void* klass) 
     2977        { 
     2978            GObjectClass* objectClass; 
     2979 
     2980            parentClass = cast(GObjectClass*) Type.classPeekParent(klass); 
     2981            objectClass = cast(GObjectClass*) klass; 
     2982 
     2983            objectClass.finalize = &customTreeModelFinalize; 
     2984        } 
     2985 
     2986        /* 
     2987         *  init callback for the interface registration 
     2988         *  in customTreeModelGetType. Here we override 
     2989         *  the GtkTreeModel interface functions that 
     2990         *  we implement. 
     2991         */ 
     2992 
     2993        static void customTreeModelInit (GtkTreeModelIface *iface) 
     2994        { 
     2995            iface.getFlags      = &customTreeModelGetFlags; 
     2996            iface.getNColumns   = &customTreeModelGetNColumns; 
     2997            iface.getColumnType = &customTreeModelGetColumnType; 
     2998            iface.getIter       = &customTreeModelGetIter; 
     2999            iface.getPath       = &customTreeModelGetPath; 
     3000            iface.getValue      = &customTreeModelGetValue; 
     3001            iface.iterNext      = &customTreeModelIterNext; 
     3002            iface.iterChildren  = &customTreeModelIterChildren; 
     3003            iface.iterHasChild  = &customTreeModelIterHasChild; 
     3004            iface.iterNChildren = &customTreeModelIterNChildren; 
     3005            iface.iterNthChild  = &customTreeModelIterNthChild; 
     3006            iface.iterParent    = &customTreeModelIterParent; 
     3007        } 
     3008 
     3009        /* 
     3010         *  this is called just before a custom list is 
     3011         *  destroyed. Free dynamically allocated memory here. 
     3012         */ 
     3013 
     3014        static void customTreeModelFinalize (GObject *object) 
     3015        { 
     3016            /* must chain up - finalize parent */ 
     3017            parentClass.finalize(object); 
     3018        } 
     3019 
     3020        static GtkTreeModelFlags customTreeModelGetFlags(GtkTreeModel *tree_model) 
     3021        { 
     3022            auto tm = new TreeModel(tree_model); 
     3023 
     3024            return tm.getFlags(); 
     3025        } 
     3026 
     3027        static int customTreeModelGetNColumns(GtkTreeModel *tree_model) 
     3028        { 
     3029            auto tm = new TreeModel(tree_model); 
     3030 
     3031            return tm.getNColumns(); 
     3032        } 
     3033 
     3034        static GType customTreeModelGetColumnType(GtkTreeModel *tree_model, int index) 
     3035        { 
     3036            auto tm = new TreeModel(tree_model); 
     3037 
     3038            return tm.getColumnType(index); 
     3039        } 
     3040 
     3041        static gboolean customTreeModelGetIter(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreePath *path) 
     3042        { 
     3043            auto tm = new TreeModel(tree_model); 
     3044 
     3045            return tm.getIter(new TreeIter(iter), new TreePath(path)); 
     3046        } 
     3047 
     3048        static GtkTreePath* customTreeModelGetPath(GtkTreeModel *tree_model, GtkTreeIter *iter) 
     3049        { 
     3050            auto tm = new TreeModel(tree_model); 
     3051            TreePath path = tm.getPath(new TreeIter(iter)); 
     3052             
     3053            return (path is null) ? null : path.getTreePathStruct(); 
     3054        } 
     3055 
     3056        static void customTreeModelGetValue(GtkTreeModel *tree_model, GtkTreeIter *iter, int column, GValue *value) 
     3057        { 
     3058            auto tm = new TreeModel(tree_model); 
     3059 
     3060            tm.getValue(new TreeIter(iter), column, new Value(value)); 
     3061        } 
     3062 
     3063        static gboolean customTreeModelIterNext(GtkTreeModel *tree_model, GtkTreeIter *iter) 
     3064        { 
     3065            auto tm = new TreeModel(tree_model); 
     3066 
     3067            return tm.iterNext(new TreeIter(iter)); 
     3068        } 
     3069 
     3070        static gboolean customTreeModelIterChildren(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent) 
     3071        { 
     3072            auto tm = new TreeModel(tree_model); 
     3073 
     3074            return tm.iterChildren(new TreeIter(iter), new TreeIter(parent)); 
     3075        } 
     3076 
     3077        static gboolean customTreeModelIterHasChild(GtkTreeModel *tree_model, GtkTreeIter *iter) 
     3078        { 
     3079            auto tm = new TreeModel(tree_model); 
     3080 
     3081            return tm.iterHasChild(new TreeIter(iter)); 
     3082        } 
     3083 
     3084        static int customTreeModelIterNChildren(GtkTreeModel *tree_model, GtkTreeIter *iter) 
     3085        { 
     3086            auto tm = new TreeModel(tree_model); 
     3087 
     3088            return tm.iterNChildren(new TreeIter(iter)); 
     3089        } 
     3090 
     3091        static gboolean customTreeModelIterNthChild(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *parent, int n) 
     3092        { 
     3093            auto tm = new TreeModel(tree_model); 
     3094 
     3095            return tm.iterNthChild(new TreeIter(iter), new TreeIter(parent), n); 
     3096        } 
     3097 
     3098        static gboolean customTreeModelIterParent(GtkTreeModel *tree_model, GtkTreeIter *iter, GtkTreeIter *child) 
     3099        { 
     3100            auto tm = new TreeModel(tree_model); 
     3101 
     3102            return tm.iterParent(new TreeIter(iter), new TreeIter(child)); 
     3103        } 
     3104    } 
     3105} 
    28753106code: end 
    28763107outFile: TreeModel 
     3108 
    28773109 
    28783110 
  • trunk/wrap/utils/GtkDClass.d

    r543 r546  
    17371737                getStructInternals(structDef, convParms); 
    17381738                collectedStructs ~= "\n}"; 
     1739            } 
     1740            else if ( structName == "GTypeInterface") 
     1741            { 
     1742                //Special case to get custom treemodels working. 
     1743                collectedStructs ~= "public struct GTypeInterface"; 
     1744                collectedStructs ~= "{"; 
     1745                collectedStructs ~= "\tGType gType;         /* iface type */"; 
     1746                collectedStructs ~= "\tGType gInstanceType;"; 
     1747                collectedStructs ~= "}"; 
    17391748            } 
    17401749            else