2 Copyright 2004-2007 Chris Tallon, Marten Richter
4 This file is part of VOMP.
6 VOMP is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
11 VOMP is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
16 You should have received a copy of the GNU General Public License
17 along with VOMP; if not, write to the Free Software
18 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
20 #include "vtabsviewman.h"
27 VTabsViewMan::VTabsViewMan()
31 backgroundColour = Colour::VIEWBACKGROUND;
35 VTabsViewMan::~VTabsViewMan()
40 int VTabsViewMan::add(View* v)
42 if (numViews == 16) return 0;
44 v->setTitleBarOn(0); //No Title Bar
45 v->setViewMan(this); //For this view, we are the viewman
46 v->setBackgroundColour(Colour::TABVIEWBACKGROUND);
48 views[numViews++] = v;
50 if (surface!=NULL) create(); //Recreating surface
55 int VTabsViewMan::removeView(View* toDelete)
57 if (numViews == 0) return 0;
63 toDelete = views[numViews-1];
68 // to be deleted view is more likely to be at the top
69 for (i = numViews-1; i >= 0; i--)
71 if (views[i] == toDelete) break;
75 // not a View we have!
81 // Shift the views on top down one
83 for(int j = i; j < numViews; j++) views[j] = views[j+1];
88 if (surface!=NULL) create(); //Recreating surface, if we are initted
89 if (selectedView >= numViews) selectedView = numViews-1;
94 void VTabsViewMan::removeAll()
96 for (; numViews > 0; --numViews)
98 delete views[numViews-1];
102 void VTabsViewMan::updateView(View* toUpdate, Region* regionToUpdate)
105 ViewMan::getInstance()->updateView(this,regionToUpdate);
108 void VTabsViewMan::create()
112 delete surface;//destroy old surface
124 for (i = 0; i < numViews; i++)
126 newarea.h=max(views[i]->getHeight(),newarea.h);
127 newarea.w=max(views[i]->getWidth(),newarea.w);
130 newarea.h += 30; //Title Bar
131 newarea.h += 30; //Tab bar
132 newarea.h += 2; //Border
137 newarea.y = Video::getInstance()->getScreenHeight()/2-newarea.h/2;
138 newarea.x = Video::getInstance()->getScreenWidth()/2-newarea.w/2;
139 setScreenPos(newarea.x,newarea.y);
141 //Now iterate through the views and set the position
143 for (i = 0; i < numViews; i++)
145 views[i]->setScreenPos(newarea.x+1,newarea.y+1+30+30);
147 View::create(newarea.w,newarea.h);
152 void VTabsViewMan::draw()
154 if (surface==NULL) return;
156 //Now Drawing the tabs bar
159 wsy.setSurface(surface);
163 wsy.nextSymbol = WSymbol::LEFTARROW;
164 wsy.nextColour = Colour::BUTTONBACKGROUND;
165 wsy.setSurfaceOffset(xpos, 40);
170 UINT textypos=30+30-2-surface->getFontHeight();
171 for (i = max(selectedView-1,0); i < numViews && xpos+150+20 < (int)area.w; i++)
173 if (i == selectedView)
175 rectangle(xpos+1,30+1,150,30,Colour::TABVIEWBACKGROUND);
179 rectangle(xpos+1,30+1,150,28,Colour::TABVIEWBACKGROUND);
181 if (i == selectedView && tabHasControl)
182 drawText(views[i]->getTitleText(),xpos+5,textypos,Colour::SELECTHIGHLIGHT);
184 drawText(views[i]->getTitleText(),xpos+5,textypos,Colour::LIGHTTEXT);
190 wsy.nextSymbol = WSymbol::RIGHTARROW;
191 wsy.nextColour = Colour::BUTTONBACKGROUND;
192 wsy.setSurfaceOffset(xpos+5, 40);
198 if (selectedView < numViews) views[selectedView]->draw();
201 void VTabsViewMan::blt(Region& r)
205 if (selectedView < numViews) {
207 helper.x = max(helper.x,views[selectedView]->area.x);
208 helper.w -= helper.x-r.x;
209 helper.y = max(helper.y,views[selectedView]->area.y);
210 helper.h -= helper.y-r.y;
211 helper.w = min(helper.w,views[selectedView]->area.w);
212 helper.h = min(helper.h,views[selectedView]->area.h);
213 views[selectedView]->blt(helper);
218 int VTabsViewMan::handleCommand(int command)
222 if (command == Remote::BACK)
224 for (i=0;i<numViews;i++)
226 views[i]->handleCommand(Remote::BACK);
228 // Instead of returning 4 here which would delete this view
229 // before the doSave messages are processed, let the message queue
230 // do the doSave then this close message. That will make the options menu
231 // disappear before this view
233 Message* m = new Message();
234 m->message = Message::CLOSE_ME;
236 m->to = ViewMan::getInstance();
237 Command::getInstance()->postMessageNoLock(m);
240 else if (tabHasControl) //our control bar is selected, we are the master of the universe
244 case Remote::DF_DOWN:
247 tabHasControl = false; //loose control
248 if (selectedView < numViews)
250 views[selectedView]->handleCommand(command);
252 viewman->updateView(this);
258 case Remote::DF_LEFT:
261 selectedView=max(0,selectedView-1);
263 viewman->updateView(this);
266 case Remote::DF_RIGHT:
269 selectedView=min(numViews-1,selectedView+1);
271 viewman->updateView(this);
277 else if (command != Remote::NA_NONE)
279 // handle command return values
280 // 0 - drop through to next view //this means me
281 // 1 - dont drop to next view, but not handled
282 // 2 - handled - stop command here
283 // 4 - handled - delete this view //delete me too
286 if (selectedView < numViews)
288 retVal = views[selectedView]->handleCommand(command);
291 // not handled but don't give to any more views
299 else if (retVal == 4)
301 // Log::getInstance()->log("ViewMan", Log::DEBUG, "Return 4: i=%i, views[i]=%p", i, views[i]);
304 } else if (retVal == 0) {
305 tabHasControl = true;
306 draw(); // I have control
307 viewman->updateView(this);
315 // fake the return code
323 void VTabsViewMan::processMessage(Message* m)
325 /* Handle mouse events*/
326 // They come in with m->to = ViewMan and just need to be delivered to selectedView?
327 if ((numViews > 0) && ((m->message == Message::MOUSE_MOVE) || (m->message == Message::MOUSE_LBDOWN)))
329 //TODO, add Tab bar interaction
330 int x=(m->parameter>>16)-getScreenX();
331 int y=(m->parameter&0xFFFF)-getScreenY();
332 if (x<0 || y <0 || x>getWidth() || y>getHeight())
334 if (m->message == Message::MOUSE_LBDOWN)
336 Message *newm=new Message();
338 newm->to=Command::getInstance();
339 newm->message=Message::UDP_BUTTON;
340 newm->parameter=Remote::BACK;
341 Command::getInstance()->postMessage(newm);
346 if (y >= 30 && m->message == Message::MOUSE_LBDOWN)
351 if (xpos < x && x <=xpos+20)
354 Message *newm=new Message();
356 newm->to=Command::getInstance();
357 newm->message=Message::UDP_BUTTON;
358 newm->parameter=Remote::LEFT;
359 Command::getInstance()->postMessage(newm);
365 for (i = max(selectedView-1,0);i < numViews && xpos+150+20 < (int)area.w; i++)
367 if (xpos < x && x <=xpos+150)
372 ViewMan::getInstance()->updateView(this);
379 if (xpos < x && x <=xpos+20)
382 Message *newm=new Message();
384 newm->to=Command::getInstance();
385 newm->message=Message::UDP_BUTTON;
386 newm->parameter=Remote::RIGHT;
387 Command::getInstance()->postMessage(newm);
396 views[selectedView]->processMessage(m);
404 for (int i = numViews-1; i >= 0; i--)
406 if (views[i] == m->to)
408 Log::getInstance()->log("VTabsViewMan", Log::DEBUG, "sending message from view %p to view %p %lu", m->from, m->to, m->message);
409 views[i]->processMessage(m);
418 Log::getInstance()->log("VTabsViewMan", Log::DEBUG, "it's for meeee!");
422 case Message::CLOSE_ME:
424 removeView((View*)m->from);
427 case Message::ADD_VIEW: // currently not used by anything but it might come in useful again
429 View* toAdd = (View*)m->parameter;
432 ViewMan::getInstance()->updateView(this);