Dopesheet: Keyframe size can be adjusted as part of theme settings
authorJoshua Leung <aligorith@gmail.com>
Sat, 2 Jul 2016 15:42:28 +0000 (03:42 +1200)
committerJoshua Leung <aligorith@gmail.com>
Thu, 7 Jul 2016 13:49:22 +0000 (01:49 +1200)
This commit introduces a scale factor setting for scaling all keyframe indicators
in the Dopesheet Editor up/down, in order to make them easier to select. It is perhaps
most useful for keyframe types which are usually indicated using smaller keyframes
(e.g. breakdown), which may get tricky to quickly select.

12 files changed:
source/blender/editors/animation/anim_channels_edit.c
source/blender/editors/animation/anim_filter.c
source/blender/editors/animation/keyframes_draw.c
source/blender/editors/include/ED_anim_api.h
source/blender/editors/include/ED_keyframes_draw.h
source/blender/editors/interface/resources.c
source/blender/editors/space_action/action_draw.c
source/blender/editors/space_action/action_edit.c
source/blender/editors/space_action/action_select.c
source/blender/editors/space_graph/graph_draw.c
source/blender/makesdna/DNA_userdef_types.h
source/blender/makesrna/intern/rna_userdef.c

index c98470fb194c304d2e31a098b3020cd9e6ef0ab3..838e23b609138b903f6d361d83bca81d3f38cd1d 100644 (file)
@@ -2356,7 +2356,7 @@ static void borderselect_anim_channels(bAnimContext *ac, rcti *rect, short selec
        }
        else {
                ymin = 0.0f;
-               ymax = (float)(-ACHANNEL_HEIGHT);
+               ymax = (float)(-ACHANNEL_HEIGHT(ac));
        }
        
        /* convert border-region to view coordinates */
@@ -2372,7 +2372,7 @@ static void borderselect_anim_channels(bAnimContext *ac, rcti *rect, short selec
                if (ac->datatype == ANIMCONT_NLA)
                        ymin = ymax - NLACHANNEL_STEP(snla);
                else
-                       ymin = ymax - ACHANNEL_STEP;
+                       ymin = ymax - ACHANNEL_STEP(ac);
                
                /* if channel is within border-select region, alter it */
                if (!((ymax < rectf.ymin) || (ymin > rectf.ymax))) {
@@ -2573,7 +2573,7 @@ static int animchannels_channel_get(bAnimContext *ac, const int mval[2])
                UI_view2d_listview_view_to_cell(v2d, NLACHANNEL_NAMEWIDTH, NLACHANNEL_STEP(snla), 0, (float)NLACHANNEL_HEIGHT_HALF(snla), x, y, NULL, &channel_index);
        }
        else {
-               UI_view2d_listview_view_to_cell(v2d, ACHANNEL_NAMEWIDTH, ACHANNEL_STEP, 0, (float)ACHANNEL_HEIGHT_HALF, x, y, NULL, &channel_index);
+               UI_view2d_listview_view_to_cell(v2d, ACHANNEL_NAMEWIDTH, ACHANNEL_STEP(ac), 0, (float)ACHANNEL_HEIGHT_HALF(ac), x, y, NULL, &channel_index);
        }
 
        return channel_index;
@@ -2988,7 +2988,7 @@ static int animchannels_mouseclick_invoke(bContext *C, wmOperator *op, const wmE
         *              ACHANNEL_HEIGHT_HALF.
         */
        UI_view2d_region_to_view(v2d, event->mval[0], event->mval[1], &x, &y);
-       UI_view2d_listview_view_to_cell(v2d, ACHANNEL_NAMEWIDTH, ACHANNEL_STEP, 0, (float)ACHANNEL_HEIGHT_HALF, x, y, NULL, &channel_index);
+       UI_view2d_listview_view_to_cell(v2d, ACHANNEL_NAMEWIDTH, ACHANNEL_STEP(&ac), 0, (float)ACHANNEL_HEIGHT_HALF(&ac), x, y, NULL, &channel_index);
        
        /* handle mouse-click in the relevant channel then */
        notifierFlags = mouse_anim_channels(C, &ac, channel_index, selectmode);
index 0a1a4787eb0c7b82a9cb9b94e04677b642db454d..9bd177e1173f7b60e1f1a084fa2e87cc723bc3b1 100644 (file)
@@ -71,6 +71,7 @@
 #include "DNA_world_types.h"
 #include "DNA_gpencil_types.h"
 #include "DNA_object_types.h"
+#include "DNA_userdef_types.h"
 
 #include "MEM_guardedalloc.h"
 
 #include "ED_anim_api.h"
 #include "ED_markers.h"
 
+#include "UI_resources.h"  /* for TH_KEYFRAME_SCALE lookup */
+
 /* ************************************************************ */
 /* Blender Context <-> Animation Context mapping */
 
+/* ----------- Private Stuff - General -------------------- */
+
+/* Get vertical scaling factor (i.e. typically used for keyframe size) */
+static void animedit_get_yscale_factor(bAnimContext *ac)
+{
+       bTheme *btheme = UI_GetTheme();
+       
+       /* grab scale factor directly from action editor setting
+        * NOTE: This theme setting doesn't have an ID, as it cannot be accessed normally
+        *       since it is a float, and the theem settings methods can only handle chars.
+        */
+       ac->yscale_fac = btheme->tact.keyframe_scale_fac;
+       
+       /* clamp to avoid problems with uninitialised values... */
+       if (ac->yscale_fac < 0.1f)
+               ac->yscale_fac = 1.0f;
+       //printf("yscale_fac = %f\n", ac->yscale_fac);
+}
+
 /* ----------- Private Stuff - Action Editor ------------- */
 
 /* Get shapekey data being edited (for Action Editor -> ShapeKey mode) */
@@ -352,6 +374,9 @@ bool ANIM_animdata_get_context(const bContext *C, bAnimContext *ac)
        ac->spacetype = (sa) ? sa->spacetype : 0;
        ac->regiontype = (ar) ? ar->regiontype : 0;
        
+       /* initialise default y-scale factor */
+       animedit_get_yscale_factor(ac);
+       
        /* get data context info */
        // XXX: if the below fails, try to grab this info from context instead... (to allow for scripting)
        return ANIM_animdata_context_getdata(ac);
index 011a25ca2195cfe309d5bdd6fe8a410dd99eb87b..4ec2cb2ba374ac9da052f3435269fd1fc0310da2 100644 (file)
@@ -557,13 +557,13 @@ void draw_keyframe_shape(float x, float y, float xscale, float hsize, short sel,
        glTranslatef(-x, -y, 0.0f);
 }
 
-static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, float ypos, short channelLocked)
+static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, float ypos, float yscale_fac, bool channelLocked)
 {
        ActKeyColumn *ak;
        ActKeyBlock *ab;
        float alpha;
        float xscale;
-       float iconsize = U.widget_unit / 4.0f;
+       float iconsize = (U.widget_unit / 4.0f) * yscale_fac;
        glEnable(GL_BLEND);
        
        /* get View2D scaling factor */
@@ -619,7 +619,7 @@ static void draw_keylist(View2D *v2d, DLRBT_Tree *keys, DLRBT_Tree *blocks, floa
 
 /* *************************** Channel Drawing Funcs *************************** */
 
-void draw_summary_channel(View2D *v2d, bAnimContext *ac, float ypos)
+void draw_summary_channel(View2D *v2d, bAnimContext *ac, float ypos, float yscale_fac)
 {
        DLRBT_Tree keys, blocks;
        
@@ -631,13 +631,13 @@ void draw_summary_channel(View2D *v2d, bAnimContext *ac, float ypos)
        BLI_dlrbTree_linkedlist_sync(&keys);
        BLI_dlrbTree_linkedlist_sync(&blocks);
        
-       draw_keylist(v2d, &keys, &blocks, ypos, 0);
+       draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, false);
        
        BLI_dlrbTree_free(&keys);
        BLI_dlrbTree_free(&blocks);
 }
 
-void draw_scene_channel(View2D *v2d, bDopeSheet *ads, Scene *sce, float ypos)
+void draw_scene_channel(View2D *v2d, bDopeSheet *ads, Scene *sce, float ypos, float yscale_fac)
 {
        DLRBT_Tree keys, blocks;
        
@@ -649,13 +649,13 @@ void draw_scene_channel(View2D *v2d, bDopeSheet *ads, Scene *sce, float ypos)
        BLI_dlrbTree_linkedlist_sync(&keys);
        BLI_dlrbTree_linkedlist_sync(&blocks);
        
-       draw_keylist(v2d, &keys, &blocks, ypos, 0);
+       draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, false);
        
        BLI_dlrbTree_free(&keys);
        BLI_dlrbTree_free(&blocks);
 }
 
-void draw_object_channel(View2D *v2d, bDopeSheet *ads, Object *ob, float ypos)
+void draw_object_channel(View2D *v2d, bDopeSheet *ads, Object *ob, float ypos, float yscale_fac)
 {
        DLRBT_Tree keys, blocks;
        
@@ -667,19 +667,19 @@ void draw_object_channel(View2D *v2d, bDopeSheet *ads, Object *ob, float ypos)
        BLI_dlrbTree_linkedlist_sync(&keys);
        BLI_dlrbTree_linkedlist_sync(&blocks);
        
-       draw_keylist(v2d, &keys, &blocks, ypos, 0);
+       draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, false);
        
        BLI_dlrbTree_free(&keys);
        BLI_dlrbTree_free(&blocks);
 }
 
-void draw_fcurve_channel(View2D *v2d, AnimData *adt, FCurve *fcu, float ypos)
+void draw_fcurve_channel(View2D *v2d, AnimData *adt, FCurve *fcu, float ypos, float yscale_fac)
 {
        DLRBT_Tree keys, blocks;
        
-       short locked = (fcu->flag & FCURVE_PROTECTED) ||
-                      ((fcu->grp) && (fcu->grp->flag & AGRP_PROTECTED)) ||
-                      ((adt && adt->action) && ID_IS_LINKED_DATABLOCK(adt->action));
+       bool locked = (fcu->flag & FCURVE_PROTECTED) ||
+                     ((fcu->grp) && (fcu->grp->flag & AGRP_PROTECTED)) ||
+                     ((adt && adt->action) && ID_IS_LINKED_DATABLOCK(adt->action));
        
        BLI_dlrbTree_init(&keys);
        BLI_dlrbTree_init(&blocks);
@@ -689,18 +689,18 @@ void draw_fcurve_channel(View2D *v2d, AnimData *adt, FCurve *fcu, float ypos)
        BLI_dlrbTree_linkedlist_sync(&keys);
        BLI_dlrbTree_linkedlist_sync(&blocks);
        
-       draw_keylist(v2d, &keys, &blocks, ypos, locked);
+       draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, locked);
        
        BLI_dlrbTree_free(&keys);
        BLI_dlrbTree_free(&blocks);
 }
 
-void draw_agroup_channel(View2D *v2d, AnimData *adt, bActionGroup *agrp, float ypos)
+void draw_agroup_channel(View2D *v2d, AnimData *adt, bActionGroup *agrp, float ypos, float yscale_fac)
 {
        DLRBT_Tree keys, blocks;
        
-       short locked = (agrp->flag & AGRP_PROTECTED) ||
-                      ((adt && adt->action) && ID_IS_LINKED_DATABLOCK(adt->action));
+       bool locked = (agrp->flag & AGRP_PROTECTED) ||
+                     ((adt && adt->action) && ID_IS_LINKED_DATABLOCK(adt->action));
        
        BLI_dlrbTree_init(&keys);
        BLI_dlrbTree_init(&blocks);
@@ -710,17 +710,17 @@ void draw_agroup_channel(View2D *v2d, AnimData *adt, bActionGroup *agrp, float y
        BLI_dlrbTree_linkedlist_sync(&keys);
        BLI_dlrbTree_linkedlist_sync(&blocks);
        
-       draw_keylist(v2d, &keys, &blocks, ypos, locked);
+       draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, locked);
        
        BLI_dlrbTree_free(&keys);
        BLI_dlrbTree_free(&blocks);
 }
 
-void draw_action_channel(View2D *v2d, AnimData *adt, bAction *act, float ypos)
+void draw_action_channel(View2D *v2d, AnimData *adt, bAction *act, float ypos, float yscale_fac)
 {
        DLRBT_Tree keys, blocks;
        
-       short locked = (act && ID_IS_LINKED_DATABLOCK(act));
+       bool locked = (act && ID_IS_LINKED_DATABLOCK(act));
        
        BLI_dlrbTree_init(&keys);
        BLI_dlrbTree_init(&blocks);
@@ -730,13 +730,13 @@ void draw_action_channel(View2D *v2d, AnimData *adt, bAction *act, float ypos)
        BLI_dlrbTree_linkedlist_sync(&keys);
        BLI_dlrbTree_linkedlist_sync(&blocks);
        
-       draw_keylist(v2d, &keys, &blocks, ypos, locked);
+       draw_keylist(v2d, &keys, &blocks, ypos, yscale_fac, locked);
        
        BLI_dlrbTree_free(&keys);
        BLI_dlrbTree_free(&blocks);
 }
 
-void draw_gpencil_channel(View2D *v2d, bDopeSheet *ads, bGPdata *gpd, float ypos)
+void draw_gpencil_channel(View2D *v2d, bDopeSheet *ads, bGPdata *gpd, float ypos, float yscale_fac)
 {
        DLRBT_Tree keys;
        
@@ -746,38 +746,42 @@ void draw_gpencil_channel(View2D *v2d, bDopeSheet *ads, bGPdata *gpd, float ypos
        
        BLI_dlrbTree_linkedlist_sync(&keys);
        
-       draw_keylist(v2d, &keys, NULL, ypos, 0);
+       draw_keylist(v2d, &keys, NULL, ypos, yscale_fac, false);
        
        BLI_dlrbTree_free(&keys);
 }
 
-void draw_gpl_channel(View2D *v2d, bDopeSheet *ads, bGPDlayer *gpl, float ypos)
+void draw_gpl_channel(View2D *v2d, bDopeSheet *ads, bGPDlayer *gpl, float ypos, float yscale_fac)
 {
        DLRBT_Tree keys;
        
+       bool locked = (gpl->flag & GP_LAYER_LOCKED) != 0;
+       
        BLI_dlrbTree_init(&keys);
        
        gpl_to_keylist(ads, gpl, &keys);
        
        BLI_dlrbTree_linkedlist_sync(&keys);
        
-       draw_keylist(v2d, &keys, NULL, ypos, (gpl->flag & GP_LAYER_LOCKED));
+       draw_keylist(v2d, &keys, NULL, ypos, yscale_fac, locked);
        
        BLI_dlrbTree_free(&keys);
 }
 
-void draw_masklay_channel(View2D *v2d, bDopeSheet *ads, MaskLayer *masklay, float ypos)
+void draw_masklay_channel(View2D *v2d, bDopeSheet *ads, MaskLayer *masklay, float ypos, float yscale_fac)
 {
        DLRBT_Tree keys;
-
+       
+       bool locked = (masklay->flag & MASK_LAYERFLAG_LOCKED) != 0;
+       
        BLI_dlrbTree_init(&keys);
-
+       
        mask_to_keylist(ads, masklay, &keys);
-
+       
        BLI_dlrbTree_linkedlist_sync(&keys);
-
-       draw_keylist(v2d, &keys, NULL, ypos, (masklay->flag & MASK_LAYERFLAG_LOCKED));
-
+       
+       draw_keylist(v2d, &keys, NULL, ypos, yscale_fac, locked);
+       
        BLI_dlrbTree_free(&keys);
 }
 
index 27e1051a3360c21081e0a134d23d946c24e9636e..0940f5944828bb5e17649cc6476a8bb9a8536f8c 100644 (file)
@@ -74,6 +74,7 @@ typedef struct bAnimContext {
        short mode;             /* editor->mode */
        short spacetype;        /* sa->spacetype */
        short regiontype;       /* active region -> type (channels or main) */
+       
        struct ScrArea *sa;     /* editor host */
        struct SpaceLink *sl;   /* editor data */
        struct ARegion *ar;     /* region within editor */
@@ -85,6 +86,8 @@ typedef struct bAnimContext {
        ListBase *markers;      /* active set of markers */
        
        struct ReportList *reports; /* pointer to current reports list */
+       
+       float yscale_fac;       /* scale factor for height of channels (i.e. based on the size of keyframes) */
 } bAnimContext;
 
 /* Main Data container types */
@@ -331,11 +334,11 @@ typedef enum eAnimFilter_Flags {
 /* -------------- Channel Defines -------------- */
 
 /* channel heights */
-#define ACHANNEL_FIRST          (-0.8f * U.widget_unit)
-#define ACHANNEL_HEIGHT         (0.8f * U.widget_unit)
-#define ACHANNEL_HEIGHT_HALF    (0.4f * U.widget_unit)
-#define ACHANNEL_SKIP           (0.1f * U.widget_unit)
-#define ACHANNEL_STEP           (ACHANNEL_HEIGHT + ACHANNEL_SKIP)
+#define ACHANNEL_FIRST(ac)          (-0.8f * (ac)->yscale_fac * U.widget_unit)
+#define ACHANNEL_HEIGHT(ac)         (0.8f * (ac)->yscale_fac * U.widget_unit)
+#define ACHANNEL_HEIGHT_HALF(ac)    (0.4f * (ac)->yscale_fac * U.widget_unit)
+#define ACHANNEL_SKIP               (0.1f * U.widget_unit)
+#define ACHANNEL_STEP(ac)           (ACHANNEL_HEIGHT(ac) + ACHANNEL_SKIP)
 
 /* channel widths */
 #define ACHANNEL_NAMEWIDTH      (10 * U.widget_unit)
@@ -347,7 +350,6 @@ typedef enum eAnimFilter_Flags {
 /* -------------- NLA Channel Defines -------------- */
 
 /* NLA channel heights */
-// XXX: NLACHANNEL_FIRST isn't used?
 #define NLACHANNEL_FIRST                (-0.8f * U.widget_unit)
 #define NLACHANNEL_HEIGHT(snla)         ((snla && (snla->flag & SNLA_NOSTRIPCURVES)) ? (0.8f * U.widget_unit) : (1.2f * U.widget_unit))
 #define NLACHANNEL_HEIGHT_HALF(snla)    ((snla && (snla->flag & SNLA_NOSTRIPCURVES)) ? (0.4f * U.widget_unit) : (0.6f * U.widget_unit))
index 7d163da0db0ab535b0014e2eaa79bce261e9229c..43264a6edaac6554c1ef46ff33a98153fc44fa89 100644 (file)
@@ -108,23 +108,23 @@ void draw_keyframe_shape(float x, float y, float xscale, float hsize, short sel,
 
 /* Channel Drawing ------------------ */
 /* F-Curve */
-void draw_fcurve_channel(struct View2D *v2d, struct AnimData *adt, struct FCurve *fcu, float ypos);
+void draw_fcurve_channel(struct View2D *v2d, struct AnimData *adt, struct FCurve *fcu, float ypos, float yscale_fac);
 /* Action Group Summary */
-void draw_agroup_channel(struct View2D *v2d, struct AnimData *adt, struct bActionGroup *agrp, float ypos);
+void draw_agroup_channel(struct View2D *v2d, struct AnimData *adt, struct bActionGroup *agrp, float ypos, float yscale_fac);
 /* Action Summary */
-void draw_action_channel(struct View2D *v2d, struct AnimData *adt, struct bAction *act, float ypos);
+void draw_action_channel(struct View2D *v2d, struct AnimData *adt, struct bAction *act, float ypos, float yscale_fac);
 /* Object Summary */
-void draw_object_channel(struct View2D *v2d, struct bDopeSheet *ads, struct Object *ob, float ypos);
+void draw_object_channel(struct View2D *v2d, struct bDopeSheet *ads, struct Object *ob, float ypos, float yscale_fac);
 /* Scene Summary */
-void draw_scene_channel(struct View2D *v2d, struct bDopeSheet *ads, struct Scene *sce, float ypos);
+void draw_scene_channel(struct View2D *v2d, struct bDopeSheet *ads, struct Scene *sce, float ypos, float yscale_fac);
 /* DopeSheet Summary */
-void draw_summary_channel(struct View2D *v2d, struct bAnimContext *ac, float ypos);
+void draw_summary_channel(struct View2D *v2d, struct bAnimContext *ac, float ypos, float yscale_fac);
 /* Grease Pencil datablock summary */
-void draw_gpencil_channel(struct View2D *v2d, struct bDopeSheet *ads, struct bGPdata *gpd, float ypos);
+void draw_gpencil_channel(struct View2D *v2d, struct bDopeSheet *ads, struct bGPdata *gpd, float ypos, float yscale_fac);
 /* Grease Pencil Layer */
-void draw_gpl_channel(struct View2D *v2d, struct bDopeSheet *ads, struct bGPDlayer *gpl, float ypos);
+void draw_gpl_channel(struct View2D *v2d, struct bDopeSheet *ads, struct bGPDlayer *gpl, float ypos, float yscale_fac);
 /* Mask Layer */
-void draw_masklay_channel(struct View2D *v2d, struct bDopeSheet *ads, struct MaskLayer *masklay, float ypos);
+void draw_masklay_channel(struct View2D *v2d, struct bDopeSheet *ads, struct MaskLayer *masklay, float ypos, float yscale_fac);
 
 /* Keydata Generation --------------- */
 /* F-Curve */
index e2e2413c717f213b2a03bb2c57fb77d6d5f5efa5..a9607d93672547875b123f23bfccfcf4e967230e 100644 (file)
@@ -1011,6 +1011,8 @@ void ui_theme_init_default(void)
        rgba_char_args_set(btheme->tact.keyborder,               0,   0,   0, 255);
        rgba_char_args_set(btheme->tact.keyborder_select,        0,   0,   0, 255);
        
+       btheme->tact.keyframe_scale_fac = 1.0f;
+       
        /* space nla */
        btheme->tnla = btheme->tact;
        
@@ -2699,6 +2701,14 @@ void init_userdef_do_versions(void)
                        }
                }
        }
+       
+       if (!USER_VERSION_ATLEAST(277, 2)) {
+               bTheme *btheme;
+               for (btheme = U.themes.first; btheme; btheme = btheme->next) {
+                       if (btheme->tact.keyframe_scale_fac < 0.1f)
+                               btheme->tact.keyframe_scale_fac = 1.0f;
+               }
+       }
 
        /**
         * Include next version bump.
index 10748c2fe15f8873c18328c335a1a1dab393328a..9fc96e06299b7962a1538ded0d5086e9cdbf4a31 100644 (file)
@@ -81,7 +81,7 @@ void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
        filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS);
        items = ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
        
-       height = ((items * ACHANNEL_STEP) + (ACHANNEL_HEIGHT));
+       height = ((items * ACHANNEL_STEP(ac)) + (ACHANNEL_HEIGHT(ac)));
        if (height > BLI_rcti_size_y(&v2d->mask)) {
                /* don't use totrect set, as the width stays the same 
                 * (NOTE: this is ok here, the configuration is pretty straightforward) 
@@ -95,11 +95,11 @@ void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
        {   /* first pass: just the standard GL-drawing for backdrop + text */
                size_t channel_index = 0;
                
-               y = (float)ACHANNEL_FIRST;
+               y = (float)ACHANNEL_FIRST(ac);
                
                for (ale = anim_data.first; ale; ale = ale->next) {
-                       float yminc = (float)(y - ACHANNEL_HEIGHT_HALF);
-                       float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF);
+                       float yminc = (float)(y - ACHANNEL_HEIGHT_HALF(ac));
+                       float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF(ac));
                        
                        /* check if visible */
                        if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
@@ -110,7 +110,7 @@ void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
                        }
                        
                        /* adjust y-position for next one */
-                       y -= ACHANNEL_STEP;
+                       y -= ACHANNEL_STEP(ac);
                        channel_index++;
                }
        }
@@ -118,11 +118,11 @@ void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
                uiBlock *block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
                size_t channel_index = 0;
                
-               y = (float)ACHANNEL_FIRST;
+               y = (float)ACHANNEL_FIRST(ac);
                
                for (ale = anim_data.first; ale; ale = ale->next) {
-                       float yminc = (float)(y - ACHANNEL_HEIGHT_HALF);
-                       float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF);
+                       float yminc = (float)(y - ACHANNEL_HEIGHT_HALF(ac));
+                       float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF(ac));
                        
                        /* check if visible */
                        if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
@@ -133,7 +133,7 @@ void draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
                        }
                        
                        /* adjust y-position for next one */
-                       y -= ACHANNEL_STEP;
+                       y -= ACHANNEL_STEP(ac);
                        channel_index++;
                }
                
@@ -195,19 +195,19 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
        filter = (ANIMFILTER_DATA_VISIBLE | ANIMFILTER_LIST_VISIBLE | ANIMFILTER_LIST_CHANNELS);
        items = ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
        
-       height = ((items * ACHANNEL_STEP) + (ACHANNEL_HEIGHT));
+       height = ((items * ACHANNEL_STEP(ac)) + (ACHANNEL_HEIGHT(ac)));
        /* don't use totrect set, as the width stays the same 
         * (NOTE: this is ok here, the configuration is pretty straightforward) 
         */
        v2d->tot.ymin = (float)(-height);
        
        /* first backdrop strips */
-       y = (float)(-ACHANNEL_HEIGHT);
+       y = (float)(-ACHANNEL_HEIGHT(ac));
        glEnable(GL_BLEND);
        
        for (ale = anim_data.first; ale; ale = ale->next) {
-               const float yminc = (float)(y - ACHANNEL_HEIGHT_HALF);
-               const float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF);
+               const float yminc = (float)(y - ACHANNEL_HEIGHT_HALF(ac));
+               const float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF(ac));
                
                /* check if visible */
                if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
@@ -260,39 +260,39 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
                                        }
                                        
                                        /* draw region twice: firstly backdrop, then the current range */
-                                       glRectf(v2d->cur.xmin,  (float)y - ACHANNEL_HEIGHT_HALF,  v2d->cur.xmax + EXTRA_SCROLL_PAD,  (float)y + ACHANNEL_HEIGHT_HALF);
+                                       glRectf(v2d->cur.xmin,  (float)y - ACHANNEL_HEIGHT_HALF(ac),  v2d->cur.xmax + EXTRA_SCROLL_PAD,  (float)y + ACHANNEL_HEIGHT_HALF(ac));
                                        
                                        if (ac->datatype == ANIMCONT_ACTION)
-                                               glRectf(act_start,  (float)y - ACHANNEL_HEIGHT_HALF,  act_end,  (float)y + ACHANNEL_HEIGHT_HALF);
+                                               glRectf(act_start,  (float)y - ACHANNEL_HEIGHT_HALF(ac),  act_end,  (float)y + ACHANNEL_HEIGHT_HALF(ac));
                                }
                                else if (ac->datatype == ANIMCONT_GPENCIL) {
                                        /* frames less than one get less saturated background */
                                        if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);
                                        else glColor4ub(col2[0], col2[1], col2[2], 0x22);
-                                       glRectf(0.0f, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmin, (float)y + ACHANNEL_HEIGHT_HALF);
+                                       glRectf(0.0f, (float)y - ACHANNEL_HEIGHT_HALF(ac), v2d->cur.xmin, (float)y + ACHANNEL_HEIGHT_HALF(ac));
                                        
                                        /* frames one and higher get a saturated background */
                                        if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x44);
                                        else glColor4ub(col2[0], col2[1], col2[2], 0x44);
-                                       glRectf(v2d->cur.xmin, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmax + EXTRA_SCROLL_PAD,  (float)y + ACHANNEL_HEIGHT_HALF);
+                                       glRectf(v2d->cur.xmin, (float)y - ACHANNEL_HEIGHT_HALF(ac), v2d->cur.xmax + EXTRA_SCROLL_PAD,  (float)y + ACHANNEL_HEIGHT_HALF(ac));
                                }
                                else if (ac->datatype == ANIMCONT_MASK) {
                                        /* TODO --- this is a copy of gpencil */
                                        /* frames less than one get less saturated background */
                                        if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x22);
                                        else glColor4ub(col2[0], col2[1], col2[2], 0x22);
-                                       glRectf(0.0f, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmin, (float)y + ACHANNEL_HEIGHT_HALF);
+                                       glRectf(0.0f, (float)y - ACHANNEL_HEIGHT_HALF(ac), v2d->cur.xmin, (float)y + ACHANNEL_HEIGHT_HALF(ac));
 
                                        /* frames one and higher get a saturated background */
                                        if (sel) glColor4ub(col1[0], col1[1], col1[2], 0x44);
                                        else glColor4ub(col2[0], col2[1], col2[2], 0x44);
-                                       glRectf(v2d->cur.xmin, (float)y - ACHANNEL_HEIGHT_HALF, v2d->cur.xmax + EXTRA_SCROLL_PAD,  (float)y + ACHANNEL_HEIGHT_HALF);
+                                       glRectf(v2d->cur.xmin, (float)y - ACHANNEL_HEIGHT_HALF(ac), v2d->cur.xmax + EXTRA_SCROLL_PAD,  (float)y + ACHANNEL_HEIGHT_HALF(ac));
                                }
                        }
                }
                
                /*      Increment the step */
-               y -= ACHANNEL_STEP;
+               y -= ACHANNEL_STEP(ac);
        }
        glDisable(GL_BLEND);
        
@@ -301,11 +301,11 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
         *         This is to try to optimize this for heavier data sets
         *      2) Keyframes which are out of view horizontally are disregarded 
         */
-       y = (float)(-ACHANNEL_HEIGHT);
+       y = (float)(-ACHANNEL_HEIGHT(ac));
        
        for (ale = anim_data.first; ale; ale = ale->next) {
-               const float yminc = (float)(y - ACHANNEL_HEIGHT_HALF);
-               const float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF);
+               const float yminc = (float)(y - ACHANNEL_HEIGHT_HALF(ac));
+               const float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF(ac));
                
                /* check if visible */
                if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
@@ -318,34 +318,34 @@ void draw_channel_strips(bAnimContext *ac, SpaceAction *saction, ARegion *ar)
                                /* draw 'keyframes' for each specific datatype */
                                switch (ale->datatype) {
                                        case ALE_ALL:
-                                               draw_summary_channel(v2d, ale->data, y);
+                                               draw_summary_channel(v2d, ale->data, y, ac->yscale_fac);
                                                break;
                                        case ALE_SCE:
-                                               draw_scene_channel(v2d, ads, ale->key_data, y);
+                                               draw_scene_channel(v2d, ads, ale->key_data, y, ac->yscale_fac);
                                                break;
                                        case ALE_OB:
-                                               draw_object_channel(v2d, ads, ale->key_data, y);
+                                               draw_object_channel(v2d, ads, ale->key_data, y, ac->yscale_fac);
                                                break;
                                        case ALE_ACT:
-                                               draw_action_channel(v2d, adt, ale->key_data, y);
+                                               draw_action_channel(v2d, adt, ale->key_data, y, ac->yscale_fac);
                                                break;
                                        case ALE_GROUP:
-                                               draw_agroup_channel(v2d, adt, ale->data, y);
+                                               draw_agroup_channel(v2d, adt, ale->data, y, ac->yscale_fac);
                                                break;
                                        case ALE_FCURVE:
-                                               draw_fcurve_channel(v2d, adt, ale->key_data, y);
+                                               draw_fcurve_channel(v2d, adt, ale->key_data, y, ac->yscale_fac);
                                                break;
                                        case ALE_GPFRAME:
-                                               draw_gpl_channel(v2d, ads, ale->data, y);
+                                               draw_gpl_channel(v2d, ads, ale->data, y, ac->yscale_fac);
                                                break;
                                        case ALE_MASKLAY:
-                                               draw_masklay_channel(v2d, ads, ale->data, y);
+                                               draw_masklay_channel(v2d, ads, ale->data, y, ac->yscale_fac);
                                                break;
                                }
                        }
                }
                
-               y -= ACHANNEL_STEP;
+               y -= ACHANNEL_STEP(ac);
        }
        
        /* free tempolary channels used for drawing */
index 8261a211ed08e0d192e5deb346a0f72f5e8fd3e2..55b087c40e76d35e005c8bc30560f255396976eb 100644 (file)
@@ -333,7 +333,7 @@ static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *min,
        ANIM_animdata_filter(ac, &anim_data, filter, ac->data, ac->datatype);
        
        /* loop through all channels, finding the first one that's selected */
-       y = (float)ACHANNEL_FIRST;
+       y = (float)ACHANNEL_FIRST(ac);
        
        for (ale = anim_data.first; ale; ale = ale->next) {
                const bAnimChannelType *acf = ANIM_channel_get_typeinfo(ale);
@@ -343,8 +343,8 @@ static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *min,
                    ANIM_channel_setting_get(ac, ale, ACHANNEL_SETTING_SELECT))
                {
                        /* update best estimate */
-                       *min = (float)(y - ACHANNEL_HEIGHT_HALF);
-                       *max = (float)(y + ACHANNEL_HEIGHT_HALF);
+                       *min = (float)(y - ACHANNEL_HEIGHT_HALF(ac));
+                       *max = (float)(y + ACHANNEL_HEIGHT_HALF(ac));
                        
                        /* is this high enough priority yet? */
                        found = acf->channel_role;
@@ -358,7 +358,7 @@ static bool actkeys_channels_get_selected_extents(bAnimContext *ac, float *min,
                }
                
                /* adjust y-position for next one */
-               y -= ACHANNEL_STEP;
+               y -= ACHANNEL_STEP(ac);
        }
        
        /* free all temp data */
index 7900217e28eaabb844bc0ddf048615b390a28fe6..5a4b2fe300529ff0cb1441f0d718de708e75301f 100644 (file)
@@ -213,7 +213,7 @@ static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, s
        KeyframeEditFunc ok_cb, select_cb;
        View2D *v2d = &ac->ar->v2d;
        rctf rectf;
-       float ymin = 0, ymax = (float)(-ACHANNEL_HEIGHT_HALF);
+       float ymin = 0, ymax = (float)(-ACHANNEL_HEIGHT_HALF(ac));
        
        /* convert mouse coordinates to frame ranges and channel coordinates corrected for view pan/zoom */
        UI_view2d_region_to_view(v2d, rect.xmin, rect.ymin + 2, &rectf.xmin, &rectf.ymin);
@@ -239,7 +239,7 @@ static void borderselect_action(bAnimContext *ac, const rcti rect, short mode, s
                AnimData *adt = ANIM_nla_mapping_get(ac, ale);
                
                /* get new vertical minimum extent of channel */
-               ymin = ymax - ACHANNEL_STEP;
+               ymin = ymax - ACHANNEL_STEP(ac);
                
                /* set horizontal range (if applicable) */
                if (ELEM(mode, ACTKEYS_BORDERSEL_FRAMERANGE, ACTKEYS_BORDERSEL_ALLKEYS)) {
@@ -392,7 +392,7 @@ static void region_select_action_keys(bAnimContext *ac, const rctf *rectf_view,
        KeyframeEditFunc ok_cb, select_cb;
        View2D *v2d = &ac->ar->v2d;
        rctf rectf, scaled_rectf;
-       float ymin = 0, ymax = (float)(-ACHANNEL_HEIGHT_HALF);
+       float ymin = 0, ymax = (float)(-ACHANNEL_HEIGHT_HALF(ac));
        
        /* convert mouse coordinates to frame ranges and channel coordinates corrected for view pan/zoom */
        UI_view2d_region_to_view_rctf(v2d, rectf_view, &rectf);
@@ -426,10 +426,10 @@ static void region_select_action_keys(bAnimContext *ac, const rctf *rectf_view,
                AnimData *adt = ANIM_nla_mapping_get(ac, ale);
                
                /* get new vertical minimum extent of channel */
-               ymin = ymax - ACHANNEL_STEP;
+               ymin = ymax - ACHANNEL_STEP(ac);
                
                /* compute midpoint of channel (used for testing if the key is in the region or not) */
-               ked.channel_y = ymin + ACHANNEL_HEIGHT_HALF;
+               ked.channel_y = ymin + ACHANNEL_HEIGHT_HALF(ac);
                
                /* if channel is mapped in NLA, apply correction
                 * - Apply to the bounds being checked, not all the keyframe points,
@@ -1360,7 +1360,7 @@ static void mouse_action_keys(bAnimContext *ac, const int mval[2], short select_
        
        /* use View2D to determine the index of the channel (i.e a row in the list) where keyframe was */
        UI_view2d_region_to_view(v2d, mval[0], mval[1], &x, &y);
-       UI_view2d_listview_view_to_cell(v2d, 0, ACHANNEL_STEP, 0, (float)ACHANNEL_HEIGHT_HALF, x, y, NULL, &channel_index);
+       UI_view2d_listview_view_to_cell(v2d, 0, ACHANNEL_STEP(ac), 0, (float)ACHANNEL_HEIGHT_HALF(ac), x, y, NULL, &channel_index);
        
        /* x-range to check is +/- 7 (in screen/region-space) on either side of mouse click (size of keyframe icon) */
        UI_view2d_region_to_view(v2d, mval[0] - 7, mval[1], &rectf.xmin, &rectf.ymin);
index 3ac90200aea1158f9595c69133d142f5f2599a48..b837e5164222d5598f166b9716a5e6c8424d1cfa 100644 (file)
@@ -1130,18 +1130,18 @@ void graph_draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
         *      - offset of ACHANNEL_HEIGHT*2 is added to the height of the channels, as first is for 
         *        start of list offset, and the second is as a correction for the scrollers.
         */
-       height = (float)((items * ACHANNEL_STEP) + (ACHANNEL_HEIGHT * 2));
+       height = (float)((items * ACHANNEL_STEP(ac)) + (ACHANNEL_HEIGHT(ac) * 2));
        UI_view2d_totRect_set(v2d, ar->winx, height);
        
        /* loop through channels, and set up drawing depending on their type  */
        {   /* first pass: just the standard GL-drawing for backdrop + text */
                size_t channel_index = 0;
                
-               y = (float)ACHANNEL_FIRST;
+               y = (float)ACHANNEL_FIRST(ac);
                
                for (ale = anim_data.first, i = 0; ale; ale = ale->next, i++) {
-                       const float yminc = (float)(y - ACHANNEL_HEIGHT_HALF);
-                       const float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF);
+                       const float yminc = (float)(y - ACHANNEL_HEIGHT_HALF(ac));
+                       const float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF(ac));
                        
                        /* check if visible */
                        if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
@@ -1152,7 +1152,7 @@ void graph_draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
                        }
                        
                        /* adjust y-position for next one */
-                       y -= ACHANNEL_STEP;
+                       y -= ACHANNEL_STEP(ac);
                        channel_index++;
                }
        }
@@ -1160,15 +1160,15 @@ void graph_draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
                uiBlock *block = UI_block_begin(C, ar, __func__, UI_EMBOSS);
                size_t channel_index = 0;
                
-               y = (float)ACHANNEL_FIRST;
+               y = (float)ACHANNEL_FIRST(ac);
                
                /* set blending again, as may not be set in previous step */
                glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
                glEnable(GL_BLEND);
                
                for (ale = anim_data.first, i = 0; ale; ale = ale->next, i++) {
-                       const float yminc = (float)(y - ACHANNEL_HEIGHT_HALF);
-                       const float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF);
+                       const float yminc = (float)(y - ACHANNEL_HEIGHT_HALF(ac));
+                       const float ymaxc = (float)(y + ACHANNEL_HEIGHT_HALF(ac));
                        
                        /* check if visible */
                        if (IN_RANGE(yminc, v2d->cur.ymin, v2d->cur.ymax) ||
@@ -1179,7 +1179,7 @@ void graph_draw_channel_names(bContext *C, bAnimContext *ac, ARegion *ar)
                        }
                        
                        /* adjust y-position for next one */
-                       y -= ACHANNEL_STEP;
+                       y -= ACHANNEL_STEP(ac);
                        channel_index++;
                }
                
index af1dfc62894fff9d4871a03c684699872202bb59..02a0b414bb3a48a4baf8f600fa83aa116365dc2c 100644 (file)
@@ -284,7 +284,10 @@ typedef struct ThemeSpace {
        char nodeclass_pattern[4], nodeclass_layout[4];
        
        char movie[4], movieclip[4], mask[4], image[4], scene[4], audio[4];             /* for sequence editor */
-       char effect[4], transition[4], meta[4], text_strip[4], pad[4];
+       char effect[4], transition[4], meta[4], text_strip[4];
+       
+       float keyframe_scale_fac; /* for dopesheet - scale factor for size of keyframes (i.e. height of channels) */
+       
        char editmesh_active[4]; 
 
        char handle_vertex[4];
index d8dcbf1afd0394c3b7eef2fbdcebb76626c580a1..cbf7bb4d5e01461b0b9b8e53126eb3549f57cf41 100644 (file)
@@ -2790,6 +2790,13 @@ static void rna_def_userdef_theme_space_action(BlenderRNA *brna)
        RNA_def_property_ui_text(prop, "Keyframe Border Selected", "Color of selected keyframe border");
        RNA_def_property_update(prop, 0, "rna_userdef_update");
        
+       prop = RNA_def_property(srna, "keyframe_scale_factor", PROP_FLOAT, PROP_NONE);
+       RNA_def_property_float_sdna(prop, NULL, "keyframe_scale_fac");
+       RNA_def_property_float_default(prop, 1.0f);
+       RNA_def_property_ui_text(prop, "Keyframe Scale Factor", "Scale factor for adjusting the height of keyframes");
+       RNA_def_property_range(prop, 0.8f, 5.0f); /* Note: These limits prevent buttons overlapping (min), and excessive size... (max) */
+       RNA_def_property_update(prop, NC_SPACE | ND_SPACE_DOPESHEET, "rna_userdef_update");
+       
        
        prop = RNA_def_property(srna, "summary", PROP_FLOAT, PROP_COLOR_GAMMA);
        RNA_def_property_float_sdna(prop, NULL, "anim_active");