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);
254 // viewman->updateView(this); // CJT // this line makes it flash twice, unneccessary?
260 case Remote::DF_LEFT:
263 selectedView=max(0,selectedView-1);
265 viewman->updateView(this);
268 case Remote::DF_RIGHT:
271 selectedView=min(numViews-1,selectedView+1);
273 viewman->updateView(this);
279 else if (command != Remote::NA_NONE)
281 // handle command return values
282 // 0 - drop through to next view //this means me
283 // 1 - dont drop to next view, but not handled
284 // 2 - handled - stop command here
285 // 4 - handled - delete this view //delete me too
288 if (selectedView < numViews)
290 retVal = views[selectedView]->handleCommand(command);
293 // not handled but don't give to any more views
301 else if (retVal == 4)
303 // Log::getInstance()->log("ViewMan", Log::DEBUG, "Return 4: i=%i, views[i]=%p", i, views[i]);
306 } else if (retVal == 0) {
307 tabHasControl = true;
308 draw(); // I have control
309 viewman->updateView(this);
317 // fake the return code
325 void VTabsViewMan::processMessage(Message* m)
327 /* Handle mouse events*/
328 // They come in with m->to = ViewMan and just need to be delivered to selectedView?
329 if ((numViews > 0) && ((m->message == Message::MOUSE_MOVE) || (m->message == Message::MOUSE_LBDOWN)))
331 //TODO, add Tab bar interaction
332 int x=(m->parameter>>16)-getScreenX();
333 int y=(m->parameter&0xFFFF)-getScreenY();
334 if (x<0 || y <0 || x>getWidth() || y>getHeight())
336 if (m->message == Message::MOUSE_LBDOWN)
338 Message *newm=new Message();
340 newm->to=Command::getInstance();
341 newm->message=Message::UDP_BUTTON;
342 newm->parameter=Remote::BACK;
343 Command::getInstance()->postMessage(newm);
348 if (y >= 30 && m->message == Message::MOUSE_LBDOWN)
353 if (xpos < x && x <=xpos+20)
356 Message *newm=new Message();
358 newm->to=Command::getInstance();
359 newm->message=Message::UDP_BUTTON;
360 newm->parameter=Remote::LEFT;
361 Command::getInstance()->postMessage(newm);
367 for (i = max(selectedView-1,0);i < numViews && xpos+150+20 < (int)area.w; i++)
369 if (xpos < x && x <=xpos+150)
374 ViewMan::getInstance()->updateView(this);
381 if (xpos < x && x <=xpos+20)
384 Message *newm=new Message();
386 newm->to=Command::getInstance();
387 newm->message=Message::UDP_BUTTON;
388 newm->parameter=Remote::RIGHT;
389 Command::getInstance()->postMessage(newm);
398 views[selectedView]->processMessage(m);
406 for (int i = numViews-1; i >= 0; i--)
408 if (views[i] == m->to)
410 Log::getInstance()->log("VTabsViewMan", Log::DEBUG, "sending message from view %p to view %p %lu", m->from, m->to, m->message);
411 views[i]->processMessage(m);
420 Log::getInstance()->log("VTabsViewMan", Log::DEBUG, "it's for meeee!");
424 case Message::CLOSE_ME:
426 removeView((View*)m->from);
429 case Message::ADD_VIEW: // currently not used by anything but it might come in useful again
431 View* toAdd = (View*)m->parameter;
434 ViewMan::getInstance()->updateView(this);