Blender V5.0
interface_align.cc File Reference
#include "DNA_screen_types.h"
#include "DNA_userdef_types.h"
#include "BLI_listbase.h"
#include "BLI_math_vector.h"
#include "BLI_math_vector_types.hh"
#include "BLI_rect.h"
#include "BLI_vector.hh"
#include "interface_intern.hh"
#include "MEM_guardedalloc.h"

Go to the source code of this file.

Classes

struct  ButAlign

Macros

#define SIDE_TO_UI_BUT_ALIGN   {UI_BUT_ALIGN_LEFT, UI_BUT_ALIGN_TOP, UI_BUT_ALIGN_RIGHT, UI_BUT_ALIGN_DOWN}
#define SIDE1(_s)
#define OPPOSITE(_s)
#define SIDE2(_s)
#define IS_COLUMN(_s)
#define STITCH(_s)
#define MAX_DELTA   0.45f * max_ii(UI_UNIT_Y, UI_UNIT_X)

Enumerations

enum  {
  LEFT = 0 , TOP = 1 , RIGHT = 2 , DOWN = 3 ,
  TOTSIDES = 4 , STITCH_LEFT = 1 << LEFT , STITCH_TOP = 1 << TOP , STITCH_RIGHT = 1 << RIGHT ,
  STITCH_DOWN = 1 << DOWN
}

Functions

bool ui_but_can_align (const uiBut *but)
static void block_align_proximity_compute (ButAlign *butal, ButAlign *butal_other)
static void block_align_stitch_neighbors (ButAlign *butal, const int side, const int side_opp, const int side_s1, const int side_s2, const int align, const int align_opp, const float co)
static bool ui_block_align_butal_cmp (const ButAlign &butal, const ButAlign &butal_other)
static void ui_block_align_but_to_region (uiBut *but, const ARegion *region)
void ui_block_align_calc (uiBlock *block, const ARegion *region)
int ui_but_align_opposite_to_area_align_get (const ARegion *region)

Macro Definition Documentation

◆ IS_COLUMN

#define IS_COLUMN ( _s)
Value:
((_s) % 2)

Definition at line 87 of file interface_align.cc.

Referenced by block_align_proximity_compute().

◆ MAX_DELTA

#define MAX_DELTA   0.45f * max_ii(UI_UNIT_Y, UI_UNIT_X)

Definition at line 93 of file interface_align.cc.

Referenced by block_align_proximity_compute(), and ui_block_align_calc().

◆ OPPOSITE

#define OPPOSITE ( _s)
Value:
(((_s) + 2) % TOTSIDES)
@ TOTSIDES

Definition at line 83 of file interface_align.cc.

Referenced by block_align_proximity_compute(), and ui_block_align_calc().

◆ SIDE1

#define SIDE1 ( _s)
Value:
(((_s) + 1) % TOTSIDES)

Definition at line 82 of file interface_align.cc.

Referenced by block_align_proximity_compute(), and ui_block_align_calc().

◆ SIDE2

#define SIDE2 ( _s)
Value:
(((_s) + 3) % TOTSIDES)

Definition at line 84 of file interface_align.cc.

Referenced by block_align_proximity_compute(), and ui_block_align_calc().

◆ SIDE_TO_UI_BUT_ALIGN

Definition at line 78 of file interface_align.cc.

Referenced by ui_block_align_calc().

◆ STITCH

#define STITCH ( _s)
Value:
(1 << (_s))

Definition at line 90 of file interface_align.cc.

Referenced by block_align_proximity_compute(), and block_align_stitch_neighbors().

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
LEFT 
TOP 
RIGHT 
DOWN 
TOTSIDES 
STITCH_LEFT 
STITCH_TOP 
STITCH_RIGHT 
STITCH_DOWN 

Definition at line 61 of file interface_align.cc.

Function Documentation

◆ block_align_proximity_compute()

void block_align_proximity_compute ( ButAlign * butal,
ButAlign * butal_other )
static

This function checks a pair of buttons (assumed in a same align group), and if they are neighbors, set needed data accordingly.

Note
It is designed to be called in total random order of buttons. Order-based optimizations are done by caller.

Definition at line 115 of file interface_align.cc.

References ButAlign::borders, ButAlign::but, ButAlign::dists, DOWN, fabsf, ButAlign::flags, IS_COLUMN, LEFT, MAX_DELTA, max_ff(), ButAlign::neighbors, OPPOSITE, RIGHT, SIDE1, SIDE2, STITCH, TOP, and ui_but_can_align().

Referenced by ui_block_align_calc().

◆ block_align_stitch_neighbors()

void block_align_stitch_neighbors ( ButAlign * butal,
const int side,
const int side_opp,
const int side_s1,
const int side_s2,
const int align,
const int align_opp,
const float co )
static

This function takes care of case described in this schema:

+-----------+-----------+
|   BUT_1   |   BUT_2   |
|-----------------------+
|   BUT_3   |
+-----------+

Here, BUT_3 RIGHT side would not get 'dragged' to align with BUT_1 RIGHT side, since BUT_3 has not RIGHT neighbor. So, this function, when called with BUT_1, will 'walk' the whole column in side_s1 direction (TOP or DOWN when called for RIGHT side), and force buttons like BUT_3 to align as needed, if BUT_1 and BUT_3 were detected as needing top-right corner stitching in block_align_proximity_compute() step.

Note
To avoid doing this twice, some stitching flags are cleared to break the 'stitching connection' between neighbors.

Definition at line 249 of file interface_align.cc.

References ButAlign::borders, ButAlign::but, ButAlign::dists, uiBut::drawflag, ButAlign::flags, LEFT, ButAlign::neighbors, STITCH, TOP, UI_BUT_ALIGN_STITCH_LEFT, and UI_BUT_ALIGN_STITCH_TOP.

Referenced by ui_block_align_calc().

◆ ui_block_align_but_to_region()

◆ ui_block_align_butal_cmp()

bool ui_block_align_butal_cmp ( const ButAlign & butal,
const ButAlign & butal_other )
static

Helper to sort ButAlign items by:

  • Their align group.
  • Their vertical position in descending order.
  • Their horizontal position.

Definition at line 302 of file interface_align.cc.

References uiBut::alignnr, ButAlign::borders, ButAlign::but, LEFT, and TOP.

Referenced by ui_block_align_calc().

◆ ui_block_align_calc()

◆ ui_but_align_opposite_to_area_align_get()

◆ ui_but_can_align()

bool ui_but_can_align ( const uiBut * but)