diff options
author | Julian Eisel <eiseljulian@gmail.com> | 2015-06-11 18:20:29 +0300 |
---|---|---|
committer | Julian Eisel <eiseljulian@gmail.com> | 2015-06-11 18:20:29 +0300 |
commit | 939948c23384119dbcc7d94614cabf76dde22391 (patch) | |
tree | ee70ead880a234ab45bd21b6591f1ae629762880 /source/blender/blenlib | |
parent | 356afe0085718cd326f4e830c943537923c2e976 (diff) |
File Browser Arrow Keys Navigation
Adds support for selecting/deselecting files in File Browser using the
arrow keys. All directions (up, down, left, right) are possible.
When to Select, When to Deselect?
Standard behaviour is selecting, however if we move into a block of
already selected files (meaning 2+ files are selected) we start
deselecting
Possible Selection Methods
Simple selection (arrow-key): All other files are deselected
Expand selection (Shift+arrow key): Add to/remove from existing
selection
ill-Expand selection (Ctrl+Shift+arrow key): Add to/remove from existing
selection and fill everything in-between
From which file do we start navigating?
From each available selection method (Mouse-, Walk-, All-, Border
Select), we use the last selected file. If there's no selection at all
we use the first (down/right arrow) or last (up/left arrow) file.
(Ideally, the view would automatically be set to the new selection, but
this behaviour overlaps with an other patch I've been working on, so
prefer to do that separately)
(Also tweaks color for highlighted file for better feedback)
D1297, Review done by @campbellbarton, thx a lot :)
Diffstat (limited to 'source/blender/blenlib')
-rw-r--r-- | source/blender/blenlib/BLI_rect.h | 4 | ||||
-rw-r--r-- | source/blender/blenlib/intern/rct.c | 32 |
2 files changed, 36 insertions, 0 deletions
diff --git a/source/blender/blenlib/BLI_rect.h b/source/blender/blenlib/BLI_rect.h index e0a0b34ac5f..242ba9f860a 100644 --- a/source/blender/blenlib/BLI_rect.h +++ b/source/blender/blenlib/BLI_rect.h @@ -78,6 +78,10 @@ bool BLI_rctf_isect_x(const rctf *rect, const float x); bool BLI_rctf_isect_y(const rctf *rect, const float y); bool BLI_rctf_isect_pt(const struct rctf *rect, const float x, const float y); bool BLI_rctf_isect_pt_v(const struct rctf *rect, const float xy[2]); +int BLI_rcti_length_x(const rcti *rect, const int x); +int BLI_rcti_length_y(const rcti *rect, const int y); +float BLI_rctf_length_x(const rctf *rect, const float x); +float BLI_rctf_length_y(const rctf *rect, const float y); bool BLI_rcti_isect_segment(const struct rcti *rect, const int s1[2], const int s2[2]); bool BLI_rctf_isect_segment(const struct rctf *rect, const float s1[2], const float s2[2]); bool BLI_rcti_isect_circle(const struct rcti *rect, const float xy[2], const float radius); diff --git a/source/blender/blenlib/intern/rct.c b/source/blender/blenlib/intern/rct.c index 1edc9002611..8de5d2ef172 100644 --- a/source/blender/blenlib/intern/rct.c +++ b/source/blender/blenlib/intern/rct.c @@ -123,6 +123,38 @@ bool BLI_rctf_isect_pt_v(const rctf *rect, const float xy[2]) } /** + * \returns shortest distance from \a rect to x/y (0 if inside) +*/ + +int BLI_rcti_length_x(const rcti *rect, const int x) +{ + if (x < rect->xmin) return rect->xmin - x; + if (x > rect->xmax) return x - rect->xmax; + return 0; +} + +int BLI_rcti_length_y(const rcti *rect, const int y) +{ + if (y < rect->ymin) return rect->ymin - y; + if (y > rect->ymax) return y - rect->ymax; + return 0; +} + +float BLI_rctf_length_x(const rctf *rect, const float x) +{ + if (x < rect->xmin) return rect->xmin - x; + if (x > rect->xmax) return x - rect->xmax; + return 0.0f; +} + +float BLI_rctf_length_y(const rctf *rect, const float y) +{ + if (y < rect->ymin) return rect->ymin - y; + if (y > rect->ymax) return y - rect->ymax; + return 0.0f; +} + +/** * is \a rct_b inside \a rct_a */ bool BLI_rctf_inside_rctf(rctf *rct_a, const rctf *rct_b) |