fixed: Position of context menu in bookmarks and favourites dialog.
[xbmc:xbmc-antiquated.git] / XBMC / xbmc / GUIDialogFavourites.cpp
1 /*
2  *      Copyright (C) 2005-2008 Team XBMC
3  *      http://www.xbmc.org
4  *
5  *  This Program is free software; you can redistribute it and/or modify
6  *  it under the terms of the GNU General Public License as published by
7  *  the Free Software Foundation; either version 2, or (at your option)
8  *  any later version.
9  *
10  *  This Program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  *  GNU General Public License for more details.
14  *
15  *  You should have received a copy of the GNU General Public License
16  *  along with XBMC; see the file COPYING.  If not, write to
17  *  the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
18  *  http://www.gnu.org/copyleft/gpl.html
19  *
20  */
21
22 #include "stdafx.h"
23 #include "GUIDialogFavourites.h"
24 #include "GUIDialogContextMenu.h"
25 #include "Favourites.h"
26 #include "GUIWindowManager.h"
27 #include "GUIDialogKeyboard.h"
28 #include "FileItem.h"
29
30 #define FAVOURITES_LIST 450
31
32 CGUIDialogFavourites::CGUIDialogFavourites(void)
33     : CGUIDialog(WINDOW_DIALOG_FAVOURITES, "DialogFavourites.xml")
34 {
35   m_favourites = new CFileItemList;
36 }
37
38 CGUIDialogFavourites::~CGUIDialogFavourites(void)
39 {
40   delete m_favourites;
41 }
42
43 bool CGUIDialogFavourites::OnMessage(CGUIMessage &message)
44 {
45   if (message.GetMessage() == GUI_MSG_CLICKED)
46   {
47     if (message.GetSenderId() == FAVOURITES_LIST)
48     {
49       int item = GetSelectedItem();
50       int action = message.GetParam1();
51       if (action == ACTION_SELECT_ITEM || action == ACTION_MOUSE_LEFT_CLICK)
52         OnClick(item);
53       else if (action == ACTION_MOVE_ITEM_UP)
54         OnMoveItem(item, -1);
55       else if (action == ACTION_MOVE_ITEM_DOWN)
56         OnMoveItem(item, 1);
57       else if (action == ACTION_CONTEXT_MENU || action == ACTION_MOUSE_RIGHT_CLICK)
58         OnPopupMenu(item);
59       else if (action == ACTION_DELETE_ITEM)
60         OnDelete(item);
61       else
62         return false;
63       return true;
64     }
65   }
66   else if (message.GetMessage() == GUI_MSG_WINDOW_DEINIT)
67   {
68     CGUIDialog::OnMessage(message);
69     // clear our favourites
70     CGUIMessage message(GUI_MSG_LABEL_RESET, GetID(), FAVOURITES_LIST);
71     OnMessage(message);
72     m_favourites->Clear();
73     return true;
74   }
75   return CGUIDialog::OnMessage(message);
76 }
77
78 void CGUIDialogFavourites::OnInitWindow()
79 {
80   CFavourites::Load(*m_favourites);
81   UpdateList();
82   CGUIWindow::OnInitWindow();
83 }
84
85 int CGUIDialogFavourites::GetSelectedItem()
86 {
87   CGUIMessage message(GUI_MSG_ITEM_SELECTED, GetID(), FAVOURITES_LIST);
88   OnMessage(message);
89   return message.GetParam1();
90 }
91
92 void CGUIDialogFavourites::OnClick(int item)
93 {
94   if (item < 0 || item >= m_favourites->Size())
95     return;
96
97   // grab our message, close the dialog, and send
98   CFileItemPtr pItem = (*m_favourites)[item];
99   CStdString execute(pItem->m_strPath);
100
101   Close();
102
103   CGUIMessage message(GUI_MSG_EXECUTE, 0, GetID());
104   message.SetStringParam(execute);
105   g_graphicsContext.SendMessage(message);
106 }
107
108 void CGUIDialogFavourites::OnPopupMenu(int item)
109 {
110   if (item < 0 || item >= m_favourites->Size())
111     return;
112
113   CGUIDialogContextMenu *pMenu = (CGUIDialogContextMenu *)m_gWindowManager.GetWindow(WINDOW_DIALOG_CONTEXT_MENU);
114   if (pMenu)
115   {
116     // highlight the item
117     (*m_favourites)[item]->Select(true);
118
119     // initialize the positioning
120     CPoint pos;
121     const CGUIControl *pList = GetControl(FAVOURITES_LIST);
122     if (pList)
123       pos = pList->GetRenderPosition() + CPoint(pList->GetWidth() * 0.5f, pList->GetHeight() * 0.5f);
124     pMenu->Initialize();
125
126     int btn_MoveUp = m_favourites->Size() > 1 ? pMenu->AddButton(13332) : 0;
127     int btn_MoveDown = m_favourites->Size() > 1 ? pMenu->AddButton(13333) : 0;
128     int btn_Remove = pMenu->AddButton(15015);
129     int btn_Rename = pMenu->AddButton(118);
130
131     pMenu->OffsetPosition(pos.x, pos.y);
132     pMenu->DoModal(GetID());
133     int button = pMenu->GetButton();
134
135     // unhighlight the item
136     (*m_favourites)[item]->Select(false);
137
138     if (button == btn_MoveUp)
139       OnMoveItem(item, -1);
140     else if (button == btn_MoveDown)
141       OnMoveItem(item, 1);
142     else if (button == btn_Remove)
143       OnDelete(item);
144     else if (button == btn_Rename)
145       OnRename(item);
146   }
147 }
148
149 void CGUIDialogFavourites::OnMoveItem(int item, int amount)
150 {
151   if (item < 0 || item >= m_favourites->Size() || m_favourites->Size() <= 1 || 0 == amount) return;
152
153   int nextItem = (item + amount) % m_favourites->Size();
154   if (nextItem < 0) nextItem += m_favourites->Size();
155
156   m_favourites->Swap(item, nextItem);
157   CFavourites::Save(*m_favourites);
158
159   CGUIMessage message(GUI_MSG_ITEM_SELECT, GetID(), FAVOURITES_LIST, nextItem);
160   OnMessage(message);
161
162   UpdateList();
163 }
164
165 void CGUIDialogFavourites::OnDelete(int item)
166 {
167   if (item < 0 || item >= m_favourites->Size())
168     return;
169   m_favourites->Remove(item);
170   CFavourites::Save(*m_favourites);
171
172   CGUIMessage message(GUI_MSG_ITEM_SELECT, GetID(), FAVOURITES_LIST, item < m_favourites->Size() ? item : item - 1);
173   OnMessage(message);
174
175   UpdateList();
176 }
177
178 void CGUIDialogFavourites::OnRename(int item)
179 {
180   if (item < 0 || item >= m_favourites->Size())
181     return;
182
183   CStdString label((*m_favourites)[item]->GetLabel());
184   if (CGUIDialogKeyboard::ShowAndGetInput(label, g_localizeStrings.Get(16008), false))
185     (*m_favourites)[item]->SetLabel(label);
186
187   CFavourites::Save(*m_favourites);
188
189   UpdateList();
190 }
191
192 void CGUIDialogFavourites::UpdateList()
193 {
194   int currentItem = GetSelectedItem();
195   CGUIMessage message(GUI_MSG_LABEL_BIND, GetID(), FAVOURITES_LIST, currentItem >= 0 ? currentItem : 0, 0, m_favourites);
196   OnMessage(message);
197 }
198
199 CFileItemPtr CGUIDialogFavourites::GetCurrentListItem(int offset)
200 {
201   int currentItem = GetSelectedItem();
202   if (currentItem < 0 || !m_favourites->Size()) return CFileItemPtr();
203
204   int item = (currentItem + offset) % m_favourites->Size();
205   if (item < 0) item += m_favourites->Size();
206   return (*m_favourites)[item];
207 }
208