topical media & game development

talk show tell print

lib-game-delta3d-sdk-examples-testWin-testwin.cpp / cpp



  /* -*-c++-*-
   * testWin - testwin (.h & .cpp) - Using 'The MIT License'
   *
   * Permission is hereby granted, free of charge, to any person obtaining a copy
   * of this software and associated documentation files (the "Software"), to deal
   * in the Software without restriction, including without limitation the rights
   * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
   * copies of the Software, and to permit persons to whom the Software is
   * furnished to do so, subject to the following conditions:
   *
   * The above copyright notice and this permission notice shall be included in
   * all copies or substantial portions of the Software.
   *
   * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
   * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
   * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
   * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
   * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
   * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
   * THE SOFTWARE.
   */
  
  include <testwin.h>
  
  include <dtGUI/scriptmodule.h>
  include <dtCore/globals.h>
  include <dtUtil/stringutils.h>
  include <dtCore/scene.h>
  include <dtUtil/log.h>
  
  include <sstream>
  
  using namespace dtCore;
  using namespace dtABC;
  using namespace dtGUI;
  using namespace dtUtil;
  
  TestWinApp::TestWinApp(const std::string& configFilename)
     : Application(configFilename)
     , mGUI(NULL)
     , mResolutionVec()
     , mScriptModule(new dtGUI::ScriptModule())
  {
  }
  
  TestWinApp::~TestWinApp()
  {
     mGUI->ShutdownGUI();
     delete mScriptModule;
  }
  
  void TestWinApp::Config()
  {
     dtABC::Application::Config();
  
     int x,y,w,h;
     GetWindow()->GetPosition(x, y, w, h);
     GetWindow()->ShowCursor(false);
  
     mGUI = new dtGUI::CEUIDrawable(GetWindow(),
                                    GetKeyboard(),
                                    GetMouse(),
                                    mScriptModule);
  
     dtGUI::ScriptModule::HandlerFunctor handler0(dtUtil::MakeFunctor( &TestWinApp::FullScreenToggleCB, this));
     mScriptModule->AddCallback("FullScreenToggleCB", handler0);
  
     dtGUI::ScriptModule::HandlerFunctor handler1(dtUtil::MakeFunctor( &TestWinApp::WindowPositionCB, this));
     mScriptModule->AddCallback("WindowPositionCB", handler1);
  
     dtGUI::ScriptModule::HandlerFunctor handler2(dtUtil::MakeFunctor( &TestWinApp::WindowTitleCB, this));
     mScriptModule->AddCallback("WindowTitleCB", handler2);
  
     dtGUI::ScriptModule::HandlerFunctor handler3(dtUtil::MakeFunctor(&TestWinApp::ChangeResolutionCB, this));
     mScriptModule->AddCallback("ChangeResolutionCB", handler3);
  
     // dump all valid resolutions into a vector
     mResolutionVec = DeltaWin::GetResolutions();
     DeltaWin::Resolution currRes = DeltaWin::GetCurrentResolution();
  
     //create the GUI and fill it out
     BuildGUI(mResolutionVec, currRes);
  
     GetScene()->AddDrawable(mGUI.get());
  }
  
  void TestWinApp::PostFrame(const double deltaFrameTime)
  {
     UpdateWidgets();
  }
  
  
Setup the GUI with starting values.

  
  void TestWinApp::BuildGUI(DeltaWin::ResolutionVec &resolutions,
                            DeltaWin::Resolution &currentRes)
  {
     try
     {
        std::string schemeFileName = dtCore::FindFileInPathList("gui/schemes/WindowsLook.scheme");
  
        CEGUI::SchemeManager::getSingleton().loadScheme(schemeFileName);
        CEGUI::System::getSingleton().setDefaultMouseCursor("WindowsLook", "MouseArrow");
        CEGUI::System::getSingleton().setDefaultFont("DejaVuSans-10");
  
        CEGUI::WindowManager* wm = CEGUI::WindowManager::getSingletonPtr();
  
        CEGUI::Window* sheet = wm->loadWindowLayout("testWinLayout.xml");
        CEGUI::System::getSingleton().setGUISheet(sheet);
        sheet->setUserData( static_cast<TestWinApp*>(this) );
        CEGUI::MultiColumnList* list = static_cast<CEGUI::MultiColumnList*>(wm->getWindow("List"));
  
        int rowNum = 0;
        std::string str;
  
        for (DeltaWin::ResolutionVec::iterator itr = resolutions.begin();
             itr != resolutions.end();
             itr++)
        {
           rowNum = list->addRow();
  
           str = ToString<int>((*itr).width);
           CEGUI::ListboxTextItem* item = new CEGUI::ListboxTextItem(str);
           item->setTextColours(CEGUI::colour(0.f, 0.f, 0.f));
           item->setSelectionColours(CEGUI::colour(1.f, 0.f, 0.f));
           item->setSelectionBrushImage("WindowsLook", "Background");
           item->setUserData(static_cast<void*>(&(*itr)));
           list->setItem(item, 0, rowNum);
  
           str = ToString<int>((*itr).height);
           item = new CEGUI::ListboxTextItem(str);
           item->setTextColours(CEGUI::colour(0.f, 0.f, 0.f));
           item->setSelectionColours(CEGUI::colour(1.f, 0.f, 0.f));
           item->setSelectionBrushImage("WindowsLook", "Background");
           item->setUserData(static_cast<void*>(&(*itr)));
           list->setItem(item, 1, rowNum);
  
           str = ToString<int>((*itr).bitDepth);
           item = new CEGUI::ListboxTextItem(str);
           item->setTextColours(CEGUI::colour(0.f, 0.f, 0.f));
           item->setSelectionColours(CEGUI::colour(1.f, 0.f, 0.f));
           item->setSelectionBrushImage("WindowsLook", "Background");
           item->setUserData(static_cast<void*>(&(*itr)));
           list->setItem(item, 2, rowNum);
  
           str = ToString<int>((*itr).refresh);
           item = new CEGUI::ListboxTextItem(str);
           item->setTextColours(CEGUI::colour(0.f, 0.f, 0.f));
           item->setSelectionColours(CEGUI::colour(1.f, 0.f, 0.f));
           item->setSelectionBrushImage("WindowsLook", "Background");
           item->setUserData(static_cast<void*>(&(*itr)));
           list->setItem(item, 3, rowNum);
        }
  
        //use our current resolution to look up it's position in the available
        //resolution list.
        //Also select the GUI row which so happens to
        //correspond to the same index number
        int idx = DeltaWin::IsValidResolution(resolutions,
                                              currentRes.width, currentRes.height,
                                              currentRes.refresh, currentRes.bitDepth);
        if (idx > -1)
        {
           //todo also need to scroll the window to the correct row.
           //list->ensureItemIsVisible();
           list->setItemSelectState(CEGUI::MCLGridRef(idx, 0), true );
        }
  
        CEGUI::Checkbox* check = static_cast<CEGUI::Checkbox*>(wm->getWindow("FullscreenToggle"));
        check->setSelected( GetWindow()->GetFullScreenMode() );
  
        CEGUI::Editbox* title = static_cast<CEGUI::Editbox*>(wm->getWindow("WindowTitle"));
        title->setText( GetWindow()->GetWindowTitle() );
  
     }
     // catch to prevent exit (errors will be logged).
     catch (CEGUI::Exception &e)
     {
        Log::GetInstance().LogMessage(Log::LOG_WARNING, __FILE__,  "CEGUI::\%s", e.getMessage().c_str() );
     }
  }
  
  

called every frame


void TestWinApp::UpdateWidgets() { CEGUI::WindowManager* wm = CEGUI::WindowManager::getSingletonPtr(); static int lastX, lastY, lastW, lastH; int x, y, w, h; GetWindow()->GetPosition(x, y, w, h); if (lastX != x || lastY != y || lastW != w || lastH != h) { // if something is different, update the widgets lastX = x; lastY =y; lastW = w; lastH = h; CEGUI::Editbox* wBox = static_cast<CEGUI::Editbox*>(wm->getWindow("WindowWidth")); wBox->setText(ToString(w).c_str()); CEGUI::Editbox* hBox = static_cast<CEGUI::Editbox*>(wm->getWindow("WindowHeight")); hBox->setText(ToString(h).c_str()); CEGUI::Editbox* xBox = static_cast<CEGUI::Editbox*>(wm->getWindow("WindowPosX")); xBox->setText(ToString(x).c_str()); CEGUI::Editbox* yBox = static_cast<CEGUI::Editbox*>(wm->getWindow("WindowPosY")); yBox->setText(ToString(y).c_str()); } } bool TestWinApp::FullScreenToggleCB(const CEGUI::EventArgs& e) { TestWinApp* app = static_cast<TestWinApp*>(CEGUI::System::getSingleton().getGUISheet()->getUserData()); CEGUI::Checkbox* check = static_cast<CEGUI::Checkbox*>(CEGUI::WindowManager::getSingleton().getWindow("FullscreenToggle")); app->GetWindow()->SetFullScreenMode( check->isSelected() ); return true; } bool TestWinApp::WindowPositionCB(const CEGUI::EventArgs& e) { CEGUI::WindowManager* wm = CEGUI::WindowManager::getSingletonPtr(); TestWinApp* app = static_cast<TestWinApp*>(CEGUI::System::getSingleton().getGUISheet()->getUserData()); int x, y, w, h; CEGUI::Editbox* wBox = static_cast<CEGUI::Editbox*>(wm->getWindow("WindowWidth")); w = atoi(wBox->getText().c_str()); CEGUI::Editbox* hBox = static_cast<CEGUI::Editbox*>(wm->getWindow("WindowHeight")); h = atoi(hBox->getText().c_str()); CEGUI::Editbox* xBox = static_cast<CEGUI::Editbox*>(wm->getWindow("WindowPosX")); x = atoi(xBox->getText().c_str()); CEGUI::Editbox* yBox = static_cast<CEGUI::Editbox*>(wm->getWindow("WindowPosY")); y = atoi(yBox->getText().c_str()); app->GetWindow()->SetPosition(x, y, w, h ); return true; } bool TestWinApp::WindowTitleCB( const CEGUI::EventArgs& e) { TestWinApp* app = static_cast<TestWinApp*>(CEGUI::System::getSingleton().getGUISheet()->getUserData()); CEGUI::Editbox* box = static_cast<CEGUI::Editbox*>(CEGUI::WindowManager::getSingleton().getWindow("WindowTitle")); app->GetWindow()->SetWindowTitle(box->getText().c_str()); return true; } bool TestWinApp::ChangeResolutionCB(const CEGUI::EventArgs& e) { CEGUI::MultiColumnList* list = static_cast<CEGUI::MultiColumnList*>(CEGUI::WindowManager::getSingleton().getWindow("List")); CEGUI::ListboxItem* item = list->getFirstSelectedItem(); DeltaWin::Resolution* res = static_cast<DeltaWin::Resolution*>( item->getUserData() ); DeltaWin::ChangeScreenResolution(*res); return true; } int main(int argc, char** argv) { std::string dataPath = dtCore::GetDeltaDataPathList(); dtCore::SetDataFilePathList(dataPath + ";" + dtCore::GetDeltaRootPath() + "/examples/data" + ";" + dtCore::GetDeltaRootPath() + "/examples/data/gui/imagesets;" + dtCore::GetDeltaRootPath() + "/examples/data/gui/schemes;" + dtCore::GetDeltaRootPath() + "/examples/data/gui/fonts;" + dtCore::GetDeltaRootPath() + "/examples/data/gui/looknfeel;" + dtCore::GetDeltaRootPath() + "/examples/testWin"); RefPtr<TestWinApp> app = new TestWinApp("config.xml"); app->Config(); app->Run(); return 0; }


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.