206 lines
5.7 KiB
Text
206 lines
5.7 KiB
Text
|
/**
|
||
|
* PANDA 3D SOFTWARE
|
||
|
* Copyright (c) Carnegie Mellon University. All rights reserved.
|
||
|
*
|
||
|
* All use of this software is subject to the terms of the revised BSD
|
||
|
* license. You should have received a copy of this license along
|
||
|
* with this source code in a file named "LICENSE."
|
||
|
*
|
||
|
* @file pgScrollFrame.I
|
||
|
* @author drose
|
||
|
* @date 2005-08-17
|
||
|
*/
|
||
|
|
||
|
/**
|
||
|
* Sets the bounding rectangle of the virtual frame. This is the size of the
|
||
|
* large, virtual canvas which we can see only a portion of at any given time.
|
||
|
*/
|
||
|
INLINE void PGScrollFrame::
|
||
|
set_virtual_frame(PN_stdfloat left, PN_stdfloat right, PN_stdfloat bottom, PN_stdfloat top) {
|
||
|
set_virtual_frame(LVecBase4(left, right, bottom, top));
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the bounding rectangle of the virtual frame. This is the size of the
|
||
|
* large, virtual canvas which we can see only a portion of at any given time.
|
||
|
*/
|
||
|
INLINE void PGScrollFrame::
|
||
|
set_virtual_frame(const LVecBase4 &frame) {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
_has_virtual_frame = true;
|
||
|
_virtual_frame = frame;
|
||
|
|
||
|
if (_auto_hide) {
|
||
|
_needs_remanage = true;
|
||
|
}
|
||
|
_needs_recompute_clip = true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the bounding rectangle of the virtual frame. See
|
||
|
* set_virtual_frame(). If has_virtual_frame() is false, this returns the
|
||
|
* item's clip frame.
|
||
|
*/
|
||
|
INLINE const LVecBase4 &PGScrollFrame::
|
||
|
get_virtual_frame() const {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
return _has_virtual_frame ? _virtual_frame : get_clip_frame();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns true if the virtual frame has a bounding rectangle; see
|
||
|
* set_virtual_frame(). Most PGScrollFrame objects will have a virtual frame.
|
||
|
*/
|
||
|
INLINE bool PGScrollFrame::
|
||
|
has_virtual_frame() const {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
return _has_virtual_frame;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes the virtual frame from the item. This effectively sets the virtual
|
||
|
* frame to the same size as the clip frame. Scrolling will no longer be
|
||
|
* possible.
|
||
|
*/
|
||
|
INLINE void PGScrollFrame::
|
||
|
clear_virtual_frame() {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
_has_virtual_frame = false;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the manage_pieces flag. When this is true, the sub-pieces of the
|
||
|
* scroll frame--that is, the two scroll bars--are automatically positioned
|
||
|
* and/or resized when the scroll frame's overall frame is changed. They are
|
||
|
* also automatically resized to fill in the gap when one or the other is
|
||
|
* hidden.
|
||
|
*/
|
||
|
INLINE void PGScrollFrame::
|
||
|
set_manage_pieces(bool manage_pieces) {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
_manage_pieces = manage_pieces;
|
||
|
_needs_remanage = true;
|
||
|
_needs_recompute_clip = true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the manage_pieces flag. See set_manage_pieces().
|
||
|
*/
|
||
|
INLINE bool PGScrollFrame::
|
||
|
get_manage_pieces() const {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
return _manage_pieces;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the auto_hide flag. When this is true, the two scroll bars are
|
||
|
* automatically hidden if they are not needed (that is, if the virtual frame
|
||
|
* would fit within the clip frame without them), and they are automatically
|
||
|
* shown when they are needed.
|
||
|
*
|
||
|
* Setting this flag true forces the manage_pieces flag to also be set true.
|
||
|
*/
|
||
|
INLINE void PGScrollFrame::
|
||
|
set_auto_hide(bool auto_hide) {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
_auto_hide = auto_hide;
|
||
|
if (_auto_hide) {
|
||
|
set_manage_pieces(true);
|
||
|
_needs_remanage = true;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the auto_hide flag. See set_auto_hide().
|
||
|
*/
|
||
|
INLINE bool PGScrollFrame::
|
||
|
get_auto_hide() const {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
return _auto_hide;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the PGSliderBar object that will serve as the horizontal scroll bar
|
||
|
* for this frame. It is your responsibility to parent this slider bar to the
|
||
|
* frame and move it to the appropriate place.
|
||
|
*/
|
||
|
INLINE void PGScrollFrame::
|
||
|
set_horizontal_slider(PGSliderBar *horizontal_slider) {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
if (_horizontal_slider != nullptr) {
|
||
|
_horizontal_slider->set_notify(nullptr);
|
||
|
}
|
||
|
_horizontal_slider = horizontal_slider;
|
||
|
if (_horizontal_slider != nullptr) {
|
||
|
_horizontal_slider->set_notify(this);
|
||
|
}
|
||
|
_needs_recompute_clip = true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes the horizontal scroll bar from control of the frame. It is your
|
||
|
* responsibility to actually remove or hide the object itself.
|
||
|
*/
|
||
|
INLINE void PGScrollFrame::
|
||
|
clear_horizontal_slider() {
|
||
|
set_horizontal_slider(nullptr);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the PGSliderBar that serves as the horizontal scroll bar for this
|
||
|
* frame, if any, or NULL if it is not set.
|
||
|
*/
|
||
|
INLINE PGSliderBar *PGScrollFrame::
|
||
|
get_horizontal_slider() const {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
return _horizontal_slider;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Sets the PGSliderBar object that will serve as the vertical scroll bar for
|
||
|
* this frame. It is your responsibility to parent this slider bar to the
|
||
|
* frame and move it to the appropriate place.
|
||
|
*/
|
||
|
INLINE void PGScrollFrame::
|
||
|
set_vertical_slider(PGSliderBar *vertical_slider) {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
if (_vertical_slider != nullptr) {
|
||
|
_vertical_slider->set_notify(nullptr);
|
||
|
}
|
||
|
_vertical_slider = vertical_slider;
|
||
|
if (_vertical_slider != nullptr) {
|
||
|
_vertical_slider->set_notify(this);
|
||
|
}
|
||
|
_needs_recompute_clip = true;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Removes the vertical scroll bar from control of the frame. It is your
|
||
|
* responsibility to actually remove or hide the object itself.
|
||
|
*/
|
||
|
INLINE void PGScrollFrame::
|
||
|
clear_vertical_slider() {
|
||
|
set_vertical_slider(nullptr);
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Returns the PGSliderBar that serves as the vertical scroll bar for this
|
||
|
* frame, if any, or NULL if it is not set.
|
||
|
*/
|
||
|
INLINE PGSliderBar *PGScrollFrame::
|
||
|
get_vertical_slider() const {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
return _vertical_slider;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Forces the PGScrollFrame to recompute itself right now. Normally this
|
||
|
* should not be required.
|
||
|
*/
|
||
|
INLINE void PGScrollFrame::
|
||
|
recompute() {
|
||
|
LightReMutexHolder holder(_lock);
|
||
|
recompute_clip();
|
||
|
recompute_canvas();
|
||
|
}
|