/* settingwnd.cpp Copyright (C) 2007 Acekard, www.acekard.com Copyright (C) 2009 somebody Copyright (C) 2009 yellow wood goblin 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 3 of the License, 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 this program. If not, see . */ #include "settingwnd.h" #include "systemfilenames.h" #include "msgbox.h" #include "windowmanager.h" #include "globalsettings.h" #include "uisettings.h" #include "language.h" #define TOP_MARGIN 4 using namespace akui; cSettingWnd::cSettingWnd(s32 x,s32 y,u32 w,u32 h,cWindow* parent,const std::string& text): cForm(x,y,w,h,parent,text),_tabSwitcher(0,0,w,18,this,"spin"), _buttonOK(0,0,46,18,this,"\x01 OK"),_buttonCancel(0,0,48,18,this,"\x02 Cancel"), _buttonY(0,0,76,18,this,"\x04 Common") { _tabSwitcher.loadAppearance(""); _tabSwitcher.changed.connect(this,&cSettingWnd::onItemChanged); addChildWindow(&_tabSwitcher); _tabSwitcher.insertItem(_text,0); _tabSwitcher.selectItem(0); _tabSwitcher.hide(); _tabSwitcher.disableFocus(); s16 buttonY=size().y-_buttonCancel.size().y-4; _buttonCancel.setStyle(cButton::press); _buttonCancel.setText("\x02 "+LANG("setting window","cancel")); _buttonCancel.setTextColor(uis().buttonTextColor); _buttonCancel.loadAppearance(SFN_BUTTON3); _buttonCancel.clicked.connect(this,&cSettingWnd::onCancel); addChildWindow(&_buttonCancel); _buttonOK.setStyle(cButton::press); _buttonOK.setText("\x01 "+LANG("setting window","ok")); _buttonOK.setTextColor(uis().buttonTextColor); _buttonOK.loadAppearance(SFN_BUTTON3); _buttonOK.clicked.connect(this,&cSettingWnd::onOK); addChildWindow(&_buttonOK); _buttonY.setStyle(cButton::press); _buttonY.setTextColor(uis().buttonTextColor); _buttonY.loadAppearance(SFN_BUTTON4); addChildWindow(&_buttonY); _buttonY.hide(); _buttonY.disableFocus(); s16 nextButtonX=size().x; s16 buttonPitch=_buttonCancel.size().x+8; nextButtonX-=buttonPitch; _buttonCancel.setRelativePosition(cPoint(nextButtonX,buttonY)); buttonPitch=_buttonOK.size().x+8; nextButtonX-=buttonPitch; _buttonOK.setRelativePosition(cPoint(nextButtonX,buttonY)); buttonPitch=_buttonY.size().x+8; nextButtonX-=buttonPitch; _buttonY.setRelativePosition(cPoint(nextButtonX,buttonY)); loadAppearance(""); arrangeChildren(); _tabs.push_back(sSetingTab(new std::vector,text)); _currentTab=0; _maxLabelLength=0; CIniFile ini(SFN_UI_SETTINGS); _spinBoxWidth=ini.GetInt("setting window","spinBoxWidth",108); _simpleTabs=ini.GetInt("setting window","simpleTabs",0);; _maxTabSize=0; _confirmMessage=LANG("setting window","confirm text"); } void cSettingWnd::setConfirmMessage(const std::string& text) { _confirmMessage=text; } cSettingWnd::~cSettingWnd() { for(size_t ii=0;ii<_tabs.size();ii++) { for(size_t jj=0;jjcMessage::keyMessageStart&&msg.id()cMessage::touchMessageStart&&msg.id(),text)); _tabSwitcher.show(); } void cSettingWnd::addSettingItem(const std::string& text,const std::vector& itemTexts,size_t defaultValue) { if(0==itemTexts.size()) return; if(defaultValue>=itemTexts.size()) defaultValue=0; if(_maxLabelLengthinsertItem(itemTexts[ii],ii); } item->loadAppearance(""); item->setSize(cSize(_spinBoxWidth,18)); item->setRelativePosition(cPoint(_size.x-_spinBoxWidth-4,itemY)); item->hide(); addChildWindow(item); item->selectItem(defaultValue); cStaticText* label=new cStaticText(0,0,_maxLabelLength*6,gs().fontHeight,this,text); itemY+=(item->windowRectangle().height()-label->windowRectangle().height())/2; label->setRelativePosition(cPoint(itemX,itemY)); label->setTextColor(uis().formTextColor); label->setSize(cSize(_size.x/2+8,12)); label->hide(); addChildWindow(label); items(lastTab).push_back(sSetingItem(label,item)); // recompute button position s16 buttonY=size().y-_buttonCancel.size().y-4; _buttonCancel.setRelativePosition(cPoint(_buttonCancel.relativePosition().x,buttonY)); _buttonOK.setRelativePosition(cPoint(_buttonOK.relativePosition().x,buttonY)); _buttonY.setRelativePosition(cPoint(_buttonY.relativePosition().x,buttonY)); arrangeChildren(); } void cSettingWnd::onShow(void) { ShowTab(_currentTab); } void cSettingWnd::onUIKeyUP(void) { ssize_t focusItem=focusedItemId(); if(--focusItem<0) focusItem=items(_currentTab).size()-1; windowManager().setFocusedWindow(items(_currentTab)[focusItem]._item); } void cSettingWnd::onUIKeyDOWN(void) { ssize_t focusItem=focusedItemId(); if(++focusItem>=(ssize_t)items(_currentTab).size()) focusItem=0; windowManager().setFocusedWindow(items(_currentTab)[focusItem]._item); } void cSettingWnd::onUIKeyLEFT(void) { cSpinBox* item=focusedItem(); if(item) item->selectPrev(); } void cSettingWnd::onUIKeyRIGHT(void) { cSpinBox* item=focusedItem(); if(item) item->selectNext(); } void cSettingWnd::onUIKeyL(void) { _tabSwitcher.selectPrev(); } void cSettingWnd::onUIKeyR(void) { _tabSwitcher.selectNext(); } ssize_t cSettingWnd::getItemSelection(size_t tabId,size_t itemId) { if(tabId>=_tabs.size()) return -1; if(itemId>=items(tabId).size()) return -1; return items(tabId)[itemId]._item->selectedItemId(); } /* 0.. - item focused -1 - something else focused */ ssize_t cSettingWnd::focusedItemId(void) { ssize_t focusItem=-1; for(size_t ii=0;iiisActive()) { focusItem=ii; break; } } return focusItem; } cSpinBox* cSettingWnd::focusedItem(void) { ssize_t focusItem=focusedItemId(); if(focusItem>=0) return items(_currentTab)[focusItem]._item; return NULL; } void cSettingWnd::HideTab(size_t index) { if(index>=_tabs.size()) return; for(size_t ii=0;iihide(); items(index)[ii]._item->hide(); } } void cSettingWnd::ShowTab(size_t index) { if(index>=_tabs.size()) return; for(size_t ii=0;iishow(); items(index)[ii]._item->show(); } if(items(index).size()) windowManager().setFocusedWindow(items(index)[0]._item); } void cSettingWnd::SwitchTab(size_t oldIndex,size_t newIndex) { HideTab(oldIndex); ShowTab(newIndex); } void cSettingWnd::onItemChanged(akui::cSpinBox* item) { size_t newTab=item->selectedItemId(); SwitchTab(_currentTab,newTab); _currentTab=newTab; }