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
21 * along with this program; if not, write to the Free Software
22 * Foundation, Inc., 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,
63 virtual ~GenericLayout();
65 /// Attach the layout to a window
66 virtual void setWindow( TopWindow *pWindow );
68 /// Get the associated window, if any
69 virtual TopWindow *getWindow() const { return m_pWindow; }
71 /// Called by a control which wants to capture the mouse
72 virtual void onControlCapture( const CtrlGeneric &rCtrl );
74 /// Called by a control which wants to release the mouse
75 virtual void onControlRelease( const CtrlGeneric &rCtrl );
77 /// Refresh the window
78 virtual void refreshAll();
80 /// Refresh a rectangular portion of the window
81 virtual void refreshRect( int x, int y, int width, int height );
83 /// Get the image of the layout
84 virtual OSGraphics *getImage() const { return m_pImage; }
86 /// Get the position of the layout (relative to the screen)
88 * Note: These values are different from the m_rect.getLeft() and
89 * m_rect.getTop(), which always return 0.
90 * The latter methods are there as a "root rect" for the panels and
91 * controls, since each control knows its parent rect, but returns
92 * coordinates relative to the root rect.
94 virtual int getLeft() const { return m_pWindow->getLeft(); }
95 virtual int getTop() const { return m_pWindow->getTop(); }
97 /// Get the size of the layout
98 virtual int getWidth() const { return m_rect.getWidth(); }
99 virtual int getHeight() const { return m_rect.getHeight(); }
100 virtual const GenericRect &getRect() const { return m_rect; }
102 /// Get the minimum and maximum size of the layout
103 virtual int getMinWidth() const { return m_minWidth; }
104 virtual int getMaxWidth() const { return m_maxWidth; }
105 virtual int getMinHeight() const { return m_minHeight; }
106 virtual int getMaxHeight() const { return m_maxHeight; }
108 /// specific refresh window (if video controls)
109 virtual void computeRefresh( int x, int y, int width, int height );
111 /// Resize the layout
112 virtual void resize( int width, int height );
115 * Add a control in the layout at the given position, and
116 * the optional given layer
118 virtual void addControl( CtrlGeneric *pControl,
119 const Position &rPosition,
122 /// Get the list of the controls in this layout, by layer order
123 virtual const list<LayeredControl> &getControlList() const;
125 /// Called by a control when its image has changed
127 * The arguments indicate the size of the rectangle to refresh,
128 * and the offset (from the control position) of this rectangle.
129 * Use a negative width or height to refresh the layout completely
131 virtual void onControlUpdate( const CtrlGeneric &rCtrl,
132 int width, int height,
133 int xOffSet, int yOffSet );
135 /// Get the list of the anchors of this layout
136 virtual const list<Anchor*>& getAnchorList() const;
138 /// Add an anchor to this layout
139 virtual void addAnchor( Anchor *pAnchor );
141 /// Called when the layout is shown
142 virtual void onShow();
144 /// Called when the layout is hidden
145 virtual void onHide();
147 /// Give access to the "active layout" variable
148 // FIXME: we give read/write access
149 VarBoolImpl &getActiveVar() { return *m_pVarActive; }
152 /// Parent window of the layout
153 TopWindow *m_pWindow;
156 int m_minWidth, m_maxWidth;
157 int m_minHeight, m_maxHeight;
158 /// Image of the layout
159 OSGraphics *m_pImage;
160 /// List of the controls in the layout
161 list<LayeredControl> m_controlList;
163 set<CtrlVideo *> m_pVideoCtrlSet;
164 /// List of the anchors in the layout
165 list<Anchor*> m_anchorList;
166 /// Flag to know if the layout is visible
168 /// Variable for the "active state" of the layout
170 * Note: the layout is not an observer on this variable, because it
171 * cannot be changed externally (i.e. without an explicit change of
172 * layout). This way, we avoid using a setActiveLayoutInner method.
174 mutable VarBoolImpl *m_pVarActive;
178 typedef CountedPtr<GenericLayout> GenericLayoutPtr;