About
GeUserArea is the base class for all gadgets that can be displayed in a GeDialog. A new gadget is created by implementing a subclass of GeUserArea. Such a gadget manages user interaction and draws the gadget interface in the GUI.
- Note
- GeUserArea based classes can only be used with a GeDialog or GeDialog based classes. To create a custom GUI element that can be used in the Attribute Manager one must implement a CustomGuiData / iCustomGui based plugin.
Allocation
An instance of a GeUserArea based class is typically stored as a member of the parent GeDialog. It is added to the dialog layout using:
See GeDialog Manual.
private:
MyUserArea _geUserArea;
public:
{
SetTitle("GeUserArea Dialog"_s);
if (userAreaGadget)
this->AttachUserArea(_geUserArea, userAreaGadget);
Represents a gadget in a dialog.
Definition: c4d_gui.h:108
maxon::Bool Bool
Definition: ge_sys_math.h:51
@ BFH_LEFT
Aligned to the left. 1<<3.
Definition: gui.h:312
The parent dialog is accessible with:
GeUserArea Based Classes
A custom user area is created by implementing a subclass of GeUserArea. This subclass can implement different virtual functions that define the behaviour of the gadget.
The user area is initiated with:
{
this->SetTimer(500);
return true;
}
The size of the user area is handled with:
{
w = 400;
h = 100;
return true;
}
{
_width = w;
_height = h;
}
maxon::Int32 Int32
Definition: ge_sys_math.h:56
Different messages are sent to a user area:
{
{
{
return true;
}
}
}
Definition: c4d_basecontainer.h:48
virtual Int32 Message(const BaseContainer &msg, BaseContainer &result)
PyObject PyObject * result
Definition: abstract.h:43
@ BFM_GETCURSORINFO
Definition: gui.h:560
@ RESULT_BUBBLEHELP
String Bubble help text.
Definition: gui.h:564
@ RESULT_CURSOR
Int32 Mouse cursor: MOUSE
Definition: gui.h:563
static const Int32 MOUSE_POINT_HAND
Point hand cursor.
Definition: ge_prepass.h:2708
const char const char * msg
Definition: object.h:438
The primary purpose of a user area is to draw the actual user interface:
{
OffScreenOn();
SetClippingRegion(x1, y1, x2, y2);
DrawRectangle(x1, y1, x2, y2);
}
maxon::Vec3< maxon::Float64, 1 > Vector
Definition: ge_math.h:141
- Note
- To optimize the drawing call skip the redraw if only the focus has changed, see BFM_DRAW_REASON in Draw.
A user area can catch user interaction events:
{
{
{
Global2Local(&mx, &my);
return true;
}
}
return false;
}
static String IntToString(Int32 v)
Definition: c4d_string.h:497
@ BFM_INPUT_MOUSE
Mouse.
Definition: gui.h:710
@ BFM_INPUT_Y
Float Y value.
Definition: gui.h:727
@ BFM_INPUT_DEVICE
Int32 Device:
Definition: gui.h:709
@ BFM_INPUT_X
Float X value.
Definition: gui.h:726
#define ApplicationOutput(formatString,...)
Definition: debugdiagnostics.h:204
See also GeDialog Gadget Interaction.
Read-Only Properties
These properties can be read from a user area:
SendParentMessage(action);
@ BFM_ACTION_ID
Int32 ID of the dialog element that triggered the action.
Definition: gui.h:745
@ BFM_ACTION
One of the child elements made any action:
Definition: gui.h:744
{
OffScreenOn();
SetClippingRegion(x1, y1, x2, y2);
if (this->HasFocus())
DrawSetPen(
Vector(0.0, 0.0, 1.0));
else
DrawSetPen(
Vector(0.0, 0.2, 0.8));
DrawRectangle(x1, y1, x2, y2);
}
Timer
A user area can use an internal timer that calls GeUserArea::Timer() periodically.
{
this->SetTimer(500);
return true;
}
User Interaction
A user area can handle user interaction events by implementing GeUserArea::InputEvent(). The following functions are used to get more detailed information on the current event:
A special operation is a mouse drag event inside the user area. Such a mouse drag is initiated in reaction to certain user interaction using these functions:
{
Global2Local(&startX, &startY);
{
break;
break;
if (deltaX != 0.0 || deltaY != 0.0)
}
MouseDragEnd();
return true;
}
Bool GetInputState(Int32 askdevice, Int32 askchannel, BaseContainer &res)
PyArena _PyASTOptimizeState * state
Definition: compile.h:99
maxon::Float Float
Definition: ge_sys_math.h:62
@ BFM_INPUT_MOUSELEFT
Left mouse button.
Definition: gui.h:715
@ BFM_INPUT_VALUE
Int32 Value of the input channel (true/false or a Int32 value, e.g. for scroll wheel data).
Definition: gui.h:724
@ BFM_INPUT_CHANNEL
Int32 Contains the key or mouse button. See also KEY.
Definition: gui.h:714
@ DONTHIDEMOUSE
Show mouse pointer during drag.
@ CONTINUE
Drag still in progress.
Drag and Drop
The user can drag and drop various elements onto a user area. The user area is informed about this event through messages sent to GeUserArea::Message(). These functions are used to react to those messages:
See also Drag and Drop.
{
if (!CheckDropArea(
msg,
true,
true))
break;
void* data = nullptr;
if (!GetDragObject(
msg, &
type, &data))
return false;
return false;
return false;
{
{
{
}
}
}
else
{
}
return true;
}
Py_ssize_t i
Definition: abstract.h:645
Definition: c4d_baselist.h:1795
Int32 GetCount() const
Definition: c4d_baselist.h:1826
C4DAtom * GetIndex(Int32 idx) const
Definition: c4d_baselist.h:1841
Definition: c4d_baselist.h:2376
String GetName() const
Definition: c4d_baselist.h:2543
Definition: c4d_baseobject.h:248
Definition: c4d_baselist.h:1520
#define atom
Definition: graminit.h:72
@ BFM_DRAG_FINISHED
Bool Drag finished.
Definition: gui.h:795
@ DRAGTYPE_ATOMARRAY
AtomArray.
Definition: gui.h:784
@ BFM_DRAGRECEIVE
Drag receive. (See DragAndDrop.)
Definition: gui.h:772
#define Tbaselist2d
2D list.
Definition: ge_prepass.h:996
PyObject ** type
Definition: pycore_pyerrors.h:34
It is also possible to start a drag and drop operation from a user area. This is typically done in reaction to some user interaction.
{
{
{
return true;
}
}
return false;
}
@ DRAGTYPE_RGB
RGB color.
Definition: gui.h:786
Parent Message
A user area can send messages to its parent GeDialog. This is typically done to inform the dialog that some user interaction occurred and that the managed values changed.
See GUI and Interaction Messages Manual.
SendParentMessage(action);
Drawing
Drawing Basics
The central task of a user area is to draw something to Cinema 4D's user interface. The drawing operations have to happen inside the GeUserArea::DrawMsg() function.
The drawing operation can be triggered with:
Drawing Operations
The following functions can be used to draw inside the canvas provided by the user area. For more advanced drawing operations one can use a GeClipMap and GeUserArea::DrawBitmap().
The color and opacity settings are handled with:
DrawRectangle(x1, y1, x2, y2);
#define DRAWTEXT_HALIGN_LEFT
Align to the left.
Definition: c4d_gui.h:189
Different styles used with various drawing functions are (LINESTYLE):
These functions draw primitive shapes:
{
DrawEllipseFill(center, radius);
DrawEllipseLine(center, radius);
}
{
DrawEllipseFill(center, radius);
}
{
DrawEllipseFill(center, radius);
}
{
}
unsigned char * p
Definition: floatobject.h:87
maxon::Vec2< maxon::Float64, 1 > Vector2d
Definition: ge_math.h:143
#define MAXON_SCOPE
Definition: apibase.h:2886
Block< T > ToSingletonBlock(T &value)
Definition: block.h:984
Definition: ge_prepass.h:41
A BaseBitmap can both be drawn to the canvas and filled with the current pen:
See also BaseBitmap Manual.
if (clipMap)
{
clipMap->Init(200, 50, 32);
clipMap->BeginDraw();
clipMap->SetColor(255, 255, 255, 255);
clipMap->FillRect(0, 0, 200, 50);
clipMap->SetFont(&font, 20.0);
clipMap->SetColor(0, 0, 0, 255);
clipMap->TextAt(0, clipMap->GetTextHeight(), "This is some text.");
clipMap->EndDraw();
if (bitmap)
{
}
}
Definition: ge_autoptr.h:37
Definition: c4d_basebitmap.h:435
Int32 GetBw() const
Definition: c4d_basebitmap.h:574
Int32 GetBh() const
Definition: c4d_basebitmap.h:580
static Bool GetDefaultFont(GeFontDefaultType type, BaseContainer *font_description)
@ BMP_NORMAL
Standard scaling by the operating system. Fast but low quality when using uneven scaling factors.
Definition: gui.h:171
@ GE_FONT_DEFAULT_MONOSPACED
The Cinema 4D monospaced font.
Definition: lib_clipmap.h:122
unsigned long Py_ssize_t width
Definition: pycore_traceback.h:88
The border style of the user area is defined with:
@ BORDER_ROUND
Border with round corners.
Definition: gui.h:271
Text is drawn with these functions:
const Int32 baseline = DrawGetFontBaseLine() + 1;
DrawLine(left, baseline, left +
length, baseline);
Definition: c4d_string.h:41
@ FONT_MONOSPACED
Monospaced font.
Definition: gui.h:26
PyWideStringList Py_ssize_t length
Definition: initconfig.h:448
PyObject * text
Definition: pycore_traceback.h:70
A user area can support a dynamic fading effect that is typically used to change the background color of the gadget after the cursor moved over it:
See also Fading.
{
public:
FadingUserArea() { };
~FadingUserArea() { };
{
{
{
return true;
}
{
return true;
}
}
}
{
}
};
@ COLOR_BG_HIGHLIGHT
Definition: c4d_colors.h:329
@ COLOR_TRANS
Definition: c4d_colors.h:14
@ COLOR_CONSOLE_TEXT
Definition: c4d_colors.h:94
@ COLOR_BG
Definition: c4d_colors.h:16
Definition: c4d_gui.h:172
void DrawSetFont(Int32 fontid)
void AdjustColor(Int32 colorid, Int32 highlightid, Float percent)
virtual void DrawMsg(Int32 x1, Int32 y1, Int32 x2, Int32 y2, const BaseContainer &msg)
void ActivateFading(Int32 milliseconds)
void Redraw(Bool threaded=false)
void DrawSetPen(const Vector &color)
void DrawText(const maxon::String &txt, Int32 x, Int32 y, Int32 flags=(0|(0<< 4)))
void DrawSetTextCol(Int32 fg, Int32 bg)
void DrawRectangle(Int32 x1, Int32 y1, Int32 x2, Int32 y2)
void SetClippingRegion(Int32 x, Int32 y, Int32 w, Int32 h)
@ BFM_FADE
Definition: gui.h:1007
It is also possible to be informed when the cursor leaves the user area:
static void RemoveCursorInfo();
class RemoveCursorUserArea;
static RemoveCursorUserArea* g_userArea = nullptr;
{
public:
RemoveCursorUserArea()
{
if (g_userArea == this)
g_userArea = nullptr;
};
~RemoveCursorUserArea() { };
{
{
{
g_userArea = this;
_cursorInside = true;
return true;
}
{
_cursorInside = false;
break;
}
}
}
{
if (_cursorInside)
else
}
private:
Bool _cursorInside =
false;
};
static void RemoveCursorInfo()
{
if (g_userArea == nullptr)
return;
}
Bool RemoveLastCursorInfo(LASTCURSORINFOFUNC func)
@ BFM_CURSORINFO_REMOVE
Sent when mouse cursor has left a user area.
Definition: gui.h:576
Clipping
Clipping is used to limit drawing operations to certain areas:
{
OffScreenOn();
SetClippingRegion(x1, y1, x2, y2);
DrawRectangle(x1, y1, x2, y2);
}
Miscellaneous
Miscellaneous functions are:
Coordinate Transformation
These functions are used to transform coordinates into different spaces:
{
{
return true;
}
return false;
}
Int32 ShowPopupMenu(CDialog *cd, Int32 screenx, Int32 screeny, const BaseContainer &bc, Int32 flags=POPUP_RIGHT|POPUP_EXECUTECOMMANDS|POPUP_ALLOW_FILTERING, Int32 *res_mainid=nullptr)
GeData * InsData(Int32 id, const GeData &n)
Definition: c4d_basecontainer.h:258
PyObject * x
Definition: bytesobject.h:38
@ BFM_INPUT_MOUSERIGHT
Right mouse button.
Definition: gui.h:716
const Class< R > & Get(const Id &cls)
Definition: objectbase.h:2073
Further Reading