aboutsummaryrefslogtreecommitdiff
path: root/guilib/GUIControl.h
diff options
context:
space:
mode:
authorAlTheKiller <AlTheKiller@svn>2009-09-23 01:49:50 +0000
committerAlTheKiller <AlTheKiller@svn>2009-09-23 01:49:50 +0000
commit45285e8a9300cd754a760560640b75b09f98035e (patch)
treead9f093885ad5c98e9dd4156674e7691c22ed0a2 /guilib/GUIControl.h
step 3/4: Move linuxport to trunk. How'd I get roped into this?
git-svn-id: https://xbmc.svn.sourceforge.net/svnroot/xbmc/trunk@23097 568bbfeb-2a22-0410-94d2-cc84cf5bfa90
Diffstat (limited to 'guilib/GUIControl.h')
-rw-r--r--guilib/GUIControl.h317
1 files changed, 317 insertions, 0 deletions
diff --git a/guilib/GUIControl.h b/guilib/GUIControl.h
new file mode 100644
index 0000000000..4de51176c3
--- /dev/null
+++ b/guilib/GUIControl.h
@@ -0,0 +1,317 @@
+/*!
+\file GUIControl.h
+\brief
+*/
+
+#ifndef GUILIB_GUICONTROL_H
+#define GUILIB_GUICONTROL_H
+#pragma once
+
+/*
+ * Copyright (C) 2005-2008 Team XBMC
+ * http://www.xbmc.org
+ *
+ * This Program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2, or (at your option)
+ * any later version.
+ *
+ * This Program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with XBMC; see the file COPYING. If not, write to
+ * the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
+ * http://www.gnu.org/copyleft/gpl.html
+ *
+ */
+
+#include "GraphicContext.h" // needed by any rendering operation (all controls)
+#include "GUIMessage.h" // needed by practically all controls
+#include "GUIFont.h" // needed for the CAngle member (CLabelInfo) among other stuff
+#include "VisibleEffect.h" // needed for the CAnimation members
+#include "GUIInfoColor.h" // needed for CGuiInfoColor to handle infolabel'ed colors
+#include "GUIActionDescriptor.h"
+
+class CGUIListItem; // forward
+class CAction;
+
+enum ORIENTATION { HORIZONTAL = 0, VERTICAL };
+
+class CLabelInfo
+{
+public:
+ CLabelInfo()
+ {
+ font = NULL;
+ align = XBFONT_LEFT;
+ offsetX = offsetY = 0;
+ width = 0;
+ angle = 0;
+ };
+ void UpdateColors()
+ {
+ textColor.Update();
+ shadowColor.Update();
+ selectedColor.Update();
+ disabledColor.Update();
+ focusedColor.Update();
+ };
+
+ CGUIInfoColor textColor;
+ CGUIInfoColor shadowColor;
+ CGUIInfoColor selectedColor;
+ CGUIInfoColor disabledColor;
+ CGUIInfoColor focusedColor;
+ uint32_t align;
+ float offsetX;
+ float offsetY;
+ float width;
+ float angle;
+ CGUIFont *font;
+};
+
+class CControlState
+{
+public:
+ CControlState(int id, int data)
+ {
+ m_id = id;
+ m_data = data;
+ }
+ int m_id;
+ int m_data;
+};
+
+/*!
+ \ingroup controls
+ \brief Base class for controls
+ */
+class CGUIControl
+{
+public:
+ CGUIControl();
+ CGUIControl(int parentID, int controlID, float posX, float posY, float width, float height);
+ virtual ~CGUIControl(void);
+ virtual CGUIControl *Clone() const=0;
+
+ virtual void DoRender(DWORD currentTime);
+ virtual void Render();
+ bool HasRendered() const { return m_hasRendered; };
+
+ // OnAction() is called by our window when we are the focused control.
+ // We should process any control-specific actions in the derived classes,
+ // and return true if we have taken care of the action. Returning false
+ // indicates that the message may be handed down to the window or application
+ // levels. This base class implementation handles basic movement, and should
+ // be called from the derived classes when the action has not been handled.
+ // Return true to indicate that the action has been dealt with.
+ virtual bool OnAction(const CAction &action);
+
+ // Common actions to make the code easier to read (no ugly switch statements in derived controls)
+ virtual void OnUp();
+ virtual void OnDown();
+ virtual void OnLeft();
+ virtual void OnRight();
+ virtual void OnNextControl();
+ virtual void OnPrevControl();
+ virtual void OnFocus() {};
+ virtual void OnUnFocus() {};
+
+ /// \brief Called when the mouse is over the control. Default implementation selects the control.
+ virtual bool OnMouseOver(const CPoint &point);
+ /// \brief Called when the mouse is dragging over the control. Default implementation does nothing.
+ virtual bool OnMouseDrag(const CPoint &offset, const CPoint &point) { return false; };
+ /// \brief Called when the left mouse button is pressed on the control. Default implementation does nothing.
+ virtual bool OnMouseClick(int button, const CPoint &point) { return false; };
+ /// \brief Called when the left mouse button is pressed on the control. Default implementation does nothing.
+ virtual bool OnMouseDoubleClick(int button, const CPoint &point) { return false; };
+ /// \brief Called when the mouse wheel has moved whilst over the control. Default implementation does nothing
+ virtual bool OnMouseWheel(char wheel, const CPoint &point) { return false; };
+ /// \brief Used to test whether the pointer location (fPosX, fPosY) is inside the control. For mouse events.
+ virtual bool HitTest(const CPoint &point) const;
+ /// \brief Focus a control from a screen location. Returns the coordinates of the screen location relative to the control and a pointer to the control.
+ virtual bool CanFocusFromPoint(const CPoint &point, CGUIControl **control, CPoint &controlPoint) const;
+ /// \brief Unfocus a control if it's not in a screen location.
+ virtual void UnfocusFromPoint(const CPoint &point);
+
+ virtual bool OnMessage(CGUIMessage& message);
+ virtual int GetID(void) const;
+ void SetID(int id) { m_controlID = id; };
+ virtual bool HasID(int id) const;
+ virtual bool HasVisibleID(int id) const;
+ int GetParentID() const;
+ virtual bool HasFocus() const;
+ virtual void AllocResources();
+ virtual void FreeResources();
+ virtual void DynamicResourceAlloc(bool bOnOff);
+ virtual bool IsDynamicallyAllocated() { return false; };
+ virtual bool CanFocus() const;
+ virtual bool IsVisible() const;
+ bool IsVisibleFromSkin() const { return m_visibleFromSkinCondition; };
+ virtual bool IsDisabled() const;
+ virtual void SetPosition(float posX, float posY);
+ virtual void SetHitRect(const CRect &rect);
+ virtual void SetCamera(const CPoint &camera);
+ void SetColorDiffuse(const CGUIInfoColor &color);
+ CPoint GetRenderPosition() const;
+ virtual float GetXPosition() const;
+ virtual float GetYPosition() const;
+ virtual float GetWidth() const;
+ virtual float GetHeight() const;
+ virtual void SetNavigation(int up, int down, int left, int right);
+ virtual void SetTabNavigation(int next, int prev);
+ virtual void SetNavigationActions(const std::vector<CGUIActionDescriptor> &up, const std::vector<CGUIActionDescriptor> &down,
+ const std::vector<CGUIActionDescriptor> &left, const std::vector<CGUIActionDescriptor> &right);
+ void ExecuteActions(const std::vector<CGUIActionDescriptor> &actions);
+ int GetControlIdUp() const { return m_controlUp;};
+ int GetControlIdDown() const { return m_controlDown;};
+ int GetControlIdLeft() const { return m_controlLeft;};
+ int GetControlIdRight() const { return m_controlRight;};
+ virtual int GetNextControl(int direction) const;
+ virtual void SetFocus(bool focus);
+ virtual void SetWidth(float width);
+ virtual void SetHeight(float height);
+ virtual void SetVisible(bool bVisible);
+ void SetVisibleCondition(int visible, const CGUIInfoBool &allowHiddenFocus);
+ int GetVisibleCondition() const { return m_visibleCondition; };
+ void SetEnableCondition(int condition);
+ virtual void UpdateVisibility(const CGUIListItem *item = NULL);
+ virtual void SetInitialVisibility();
+ virtual void SetEnabled(bool bEnable);
+ virtual void SetInvalid() { m_bInvalidated = true; };
+ virtual void SetPulseOnSelect(bool pulse) { m_pulseOnSelect = pulse; };
+ virtual CStdString GetDescription() const { return ""; };
+
+ void SetAnimations(const std::vector<CAnimation> &animations);
+ const std::vector<CAnimation> &GetAnimations() const { return m_animations; };
+
+ virtual void QueueAnimation(ANIMATION_TYPE anim);
+ virtual bool IsAnimating(ANIMATION_TYPE anim);
+ virtual bool HasAnimation(ANIMATION_TYPE anim);
+ CAnimation *GetAnimation(ANIMATION_TYPE type, bool checkConditions = true);
+ virtual void ResetAnimation(ANIMATION_TYPE type);
+ virtual void ResetAnimations();
+
+ // push information updates
+ virtual void UpdateInfo(const CGUIListItem *item = NULL) {};
+ virtual void SetPushUpdates(bool pushUpdates) { m_pushedUpdates = pushUpdates; };
+
+ virtual bool IsGroup() const { return false; };
+ virtual bool IsContainer() const { return false; };
+ virtual bool GetCondition(int condition, int data) const { return false; };
+
+ void SetParentControl(CGUIControl *control) { m_parentControl = control; };
+ CGUIControl *GetParentControl(void) const { return m_parentControl; };
+ virtual void SaveStates(std::vector<CControlState> &states);
+
+ enum GUICONTROLTYPES {
+ GUICONTROL_UNKNOWN,
+ GUICONTROL_BUTTON,
+ GUICONTROL_CHECKMARK,
+ GUICONTROL_FADELABEL,
+ GUICONTROL_IMAGE,
+ GUICONTROL_BORDEREDIMAGE,
+ GUICONTROL_LARGE_IMAGE,
+ GUICONTROL_LABEL,
+ GUICONTROL_LIST,
+ GUICONTROL_LISTGROUP,
+ GUICONTROL_LISTEX,
+ GUICONTROL_PROGRESS,
+ GUICONTROL_RADIO,
+ GUICONTROL_RSS,
+ GUICONTROL_SELECTBUTTON,
+ GUICONTROL_SLIDER,
+ GUICONTROL_SETTINGS_SLIDER,
+ GUICONTROL_SPINBUTTON,
+ GUICONTROL_SPIN,
+ GUICONTROL_SPINEX,
+ GUICONTROL_TEXTBOX,
+ GUICONTROL_THUMBNAIL,
+ GUICONTROL_TOGGLEBUTTON,
+ GUICONTROL_VIDEO,
+ GUICONTROL_MOVER,
+ GUICONTROL_RESIZE,
+ GUICONTROL_BUTTONBAR,
+ GUICONTROL_CONSOLE,
+ GUICONTROL_EDIT,
+ GUICONTROL_VISUALISATION,
+ GUICONTROL_MULTI_IMAGE,
+ GUICONTROL_GROUP,
+ GUICONTROL_GROUPLIST,
+ GUICONTROL_SCROLLBAR,
+ GUICONTROL_LISTLABEL,
+ GUICONTROL_MULTISELECT,
+ GUICONTAINER_LIST,
+ GUICONTAINER_WRAPLIST,
+ GUICONTAINER_FIXEDLIST,
+ GUICONTAINER_PANEL
+ };
+ GUICONTROLTYPES GetControlType() const { return ControlType; }
+
+ enum GUIVISIBLE { HIDDEN = 0, DELAYED, VISIBLE };
+
+#ifdef _DEBUG
+ virtual void DumpTextureUse() {};
+#endif
+protected:
+ virtual void UpdateColors();
+ virtual void Animate(DWORD currentTime);
+ virtual bool CheckAnimation(ANIMATION_TYPE animType);
+ void UpdateStates(ANIMATION_TYPE type, ANIMATION_PROCESS currentProcess, ANIMATION_STATE currentState);
+ bool SendWindowMessage(CGUIMessage &message);
+
+ // navigation
+ int m_controlLeft;
+ int m_controlRight;
+ int m_controlUp;
+ int m_controlDown;
+ int m_controlNext;
+ int m_controlPrev;
+
+ std::vector<CGUIActionDescriptor> m_leftActions;
+ std::vector<CGUIActionDescriptor> m_rightActions;
+ std::vector<CGUIActionDescriptor> m_upActions;
+ std::vector<CGUIActionDescriptor> m_downActions;
+ std::vector<CGUIActionDescriptor> m_nextActions;
+ std::vector<CGUIActionDescriptor> m_prevActions;
+
+ float m_posX;
+ float m_posY;
+ float m_height;
+ float m_width;
+ CRect m_hitRect;
+ CGUIInfoColor m_diffuseColor;
+ int m_controlID;
+ int m_parentID;
+ bool m_bHasFocus;
+ bool m_bInvalidated;
+ bool m_bAllocated;
+ bool m_pulseOnSelect;
+ GUICONTROLTYPES ControlType;
+
+ CGUIControl *m_parentControl; // our parent control if we're part of a group
+
+ // visibility condition/state
+ int m_visibleCondition;
+ GUIVISIBLE m_visible;
+ bool m_visibleFromSkinCondition;
+ bool m_forceHidden; // set from the code when a hidden operation is given - overrides m_visible
+ CGUIInfoBool m_allowHiddenFocus;
+ bool m_hasRendered;
+ // enable/disable state
+ int m_enableCondition;
+ bool m_enabled;
+
+ bool m_pushedUpdates;
+
+ // animation effects
+ std::vector<CAnimation> m_animations;
+ CPoint m_camera;
+ bool m_hasCamera;
+ TransformMatrix m_transform;
+};
+
+#endif