1 /*****************************************************************************
3 *****************************************************************************
4 * Copyright (C) 2003 the VideoLAN team
7 * Authors: Cyril Deguet <asmax@via.ecp.fr>
8 * Olivier Teulière <ipkiss@via.ecp.fr>
10 * This program is free software; you can redistribute it and/or modify
11 * it under the terms of the GNU General Public License as published by
12 * the Free Software Foundation; either version 2 of the License, or
13 * (at your option) any later version.
15 * This program is distributed in the hope that it will be useful,
16 * but WITHOUT ANY WARRANTY; without even the implied warranty of
17 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 * GNU General Public License for more details.
20 * You should have received a copy of the GNU General Public License along
21 * with this program; if not, write to the Free Software Foundation, Inc.,
22 * 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
23 *****************************************************************************/
25 #ifndef GENERIC_LAYOUT_HPP
26 #define GENERIC_LAYOUT_HPP
28 #include "skin_common.hpp"
29 #include "top_window.hpp"
30 #include "../utils/pointer.hpp"
31 #include "../utils/position.hpp"
42 /// Control and its associated layer
45 LayeredControl( CtrlGeneric
*pControl
, int layer
):
46 m_pControl( pControl
), m_layer( layer
) { }
48 /// Pointer on the control
49 CtrlGeneric
*m_pControl
;
55 /// Base class for layouts
56 class GenericLayout
: public SkinObject
59 GenericLayout( intf_thread_t
*pIntf
, int width
, int height
,
60 int minWidth
, int maxWidth
, int minHeight
, int maxHeight
);
62 virtual ~GenericLayout();
64 /// Attach the layout to a window
65 virtual void setWindow( TopWindow
*pWindow
);
67 /// Get the associated window, if any
68 virtual TopWindow
*getWindow() const { return m_pWindow
; }
70 /// Called by a control which wants to capture the mouse
71 virtual void onControlCapture( const CtrlGeneric
&rCtrl
);
73 /// Called by a control which wants to release the mouse
74 virtual void onControlRelease( const CtrlGeneric
&rCtrl
);
76 /// Refresh the window
77 virtual void refreshAll();
79 /// Refresh a rectangular portion of the window
80 virtual void refreshRect( int x
, int y
, int width
, int height
);
82 /// Get the image of the layout
83 virtual OSGraphics
*getImage() const { return m_pImage
; }
85 /// Get the position of the layout (relative to the screen)
87 * Note: These values are different from the m_rect.getLeft() and
88 * m_rect.getTop(), which always return 0.
89 * The latter methods are there as a "root rect" for the panels and
90 * controls, since each control knows its parent rect, but returns
91 * coordinates relative to the root rect.
93 virtual int getLeft() const { return m_pWindow
->getLeft(); }
94 virtual int getTop() const { return m_pWindow
->getTop(); }
96 /// Get the size of the layout
97 virtual int getWidth() const { return m_rect
.getWidth(); }
98 virtual int getHeight() const { return m_rect
.getHeight(); }
99 virtual const GenericRect
&getRect() const { return m_rect
; }
101 /// Get the minimum and maximum size of the layout
102 virtual int getMinWidth() const { return m_minWidth
; }
103 virtual int getMaxWidth() const { return m_maxWidth
; }
104 virtual int getMinHeight() const { return m_minHeight
; }
105 virtual int getMaxHeight() const { return m_maxHeight
; }
107 /// Resize the layout
108 virtual void resize( int width
, int height
);
111 * Add a control in the layout at the given position, and
112 * the optional given layer
114 virtual void addControl( CtrlGeneric
*pControl
,
115 const Position
&rPosition
,
118 /// Get the list of the controls in this layout, by layer order
119 virtual const list
<LayeredControl
> &getControlList() const;
121 /// Called by a control when its image has changed
123 * The arguments indicate the size of the rectangle to refresh,
124 * and the offset (from the control position) of this rectangle.
125 * Use a negative width or height to refresh the layout completely
127 virtual void onControlUpdate( const CtrlGeneric
&rCtrl
,
128 int width
, int height
,
129 int xOffSet
, int yOffSet
);
131 /// Get the list of the anchors of this layout
132 virtual const list
<Anchor
*>& getAnchorList() const;
134 /// Add an anchor to this layout
135 virtual void addAnchor( Anchor
*pAnchor
);
137 /// Called when the layout is shown
138 virtual void onShow();
140 /// Called when the layout is hidden
141 virtual void onHide();
143 /// Give access to the "active layout" variable
144 // FIXME: we give read/write access
145 VarBoolImpl
&getActiveVar() { return *m_pVarActive
; }
148 /// Parent window of the layout
149 TopWindow
*m_pWindow
;
152 int m_minWidth
, m_maxWidth
;
153 int m_minHeight
, m_maxHeight
;
154 /// Image of the layout
155 OSGraphics
*m_pImage
;
156 /// List of the controls in the layout
157 list
<LayeredControl
> m_controlList
;
159 set
<CtrlVideo
*> m_pVideoCtrlSet
;
160 /// List of the anchors in the layout
161 list
<Anchor
*> m_anchorList
;
162 /// Flag to know if the layout is visible
164 /// Variable for the "active state" of the layout
166 * Note: the layout is not an observer on this variable, because it
167 * cannot be changed externally (i.e. without an explicit change of
168 * layout). This way, we avoid using a setActiveLayoutInner method.
170 mutable VarBoolImpl
*m_pVarActive
;
174 typedef CountedPtr
<GenericLayout
> GenericLayoutPtr
;