#include "gwenUserInterface.h" #include "gwenInternalData.h" #include "Gwen/Controls/ImagePanel.h" #include "Gwen/Controls/ColorPicker.h" //#include "Gwen/Controls/HSVColorPicker.h" class MyGraphWindow* graphWindow = 0; GwenUserInterface::GwenUserInterface() { m_data = new GwenInternalData(); m_data->m_toggleButtonCallback = 0; m_data->m_comboBoxCallback = 0; } class MyMenuItems : public Gwen::Controls::Base { public: b3FileOpenCallback m_fileOpenCallback; b3QuitCallback m_quitCallback; MyMenuItems() :Gwen::Controls::Base(0), m_fileOpenCallback(0) { } void myQuitApp(Gwen::Controls::Base* pControl) { if (m_quitCallback) { (*m_quitCallback)(); } } void fileOpen(Gwen::Controls::Base* pControl) { if (m_fileOpenCallback) { (*m_fileOpenCallback)(); } } }; struct MyTestMenuBar : public Gwen::Controls::MenuStrip { Gwen::Controls::MenuItem* m_fileMenu; Gwen::Controls::MenuItem* m_viewMenu; MyMenuItems* m_menuItems; MyTestMenuBar(Gwen::Controls::Base* pParent) :Gwen::Controls::MenuStrip(pParent) { // Gwen::Controls::MenuStrip* menu = new Gwen::Controls::MenuStrip( pParent ); { m_menuItems = new MyMenuItems(); m_menuItems->m_fileOpenCallback = 0; m_menuItems->m_quitCallback = 0; m_fileMenu = AddItem(L"File"); m_fileMenu->GetMenu()->AddItem(L"Open", m_menuItems, (Gwen::Event::Handler::Function)&MyMenuItems::fileOpen); m_fileMenu->GetMenu()->AddItem(L"Quit", m_menuItems, (Gwen::Event::Handler::Function)&MyMenuItems::myQuitApp); m_viewMenu = AddItem(L"View"); } } virtual ~MyTestMenuBar() { delete m_menuItems; } }; void GwenUserInterface::exit() { //m_data->m_menubar->RemoveAllChildren(); delete m_data->m_tab; delete m_data->m_windowRight; delete m_data->m_leftStatusBar; delete m_data->m_TextOutput; delete m_data->m_rightStatusBar; delete m_data->m_bar; delete m_data->m_menubar; m_data->m_menubar = 0; delete m_data->pCanvas; m_data->pCanvas = 0; } GwenUserInterface::~GwenUserInterface() { for (int i=0;im_handlers.size();i++) { delete m_data->m_handlers[i]; } m_data->m_handlers.clear(); delete m_data; } void GwenUserInterface::resize(int width, int height) { m_data->pCanvas->SetSize(width,height); } struct MyComboBoxHander :public Gwen::Event::Handler { GwenInternalData* m_data; int m_buttonId; MyComboBoxHander (GwenInternalData* data, int buttonId) :m_data(data), m_buttonId(buttonId) { } void onSelect( Gwen::Controls::Base* pControl ) { Gwen::Controls::ComboBox* but = (Gwen::Controls::ComboBox*) pControl; Gwen::String str = Gwen::Utility::UnicodeToString( but->GetSelectedItem()->GetText()); if (m_data->m_comboBoxCallback) (*m_data->m_comboBoxCallback)(m_buttonId,str.c_str()); } }; struct MyButtonHander :public Gwen::Event::Handler { GwenInternalData* m_data; int m_buttonId; MyButtonHander (GwenInternalData* data, int buttonId) :m_data(data), m_buttonId(buttonId) { } void onButtonA( Gwen::Controls::Base* pControl ) { Gwen::Controls::Button* but = (Gwen::Controls::Button*) pControl; // int dep = but->IsDepressed(); int tog = but->GetToggleState(); if (m_data->m_toggleButtonCallback) (*m_data->m_toggleButtonCallback)(m_buttonId,tog); } }; void GwenUserInterface::textOutput(const char* message) { Gwen::UnicodeString msg = Gwen::Utility::StringToUnicode(message); m_data->m_TextOutput->AddItem( msg ); m_data->m_TextOutput->Scroller()->ScrollToBottom(); } void GwenUserInterface::setExampleDescription(const char* message) { //Gwen apparently doesn't have text/word wrap, so do rudimentary brute-force implementation here. std::string wrapmessage=message; int startPos = 0; std::string lastFit = ""; bool hasSpace = false; std::string lastFitSpace = ""; int spacePos = 0; m_data->m_exampleInfoTextOutput->Clear(); int fixedWidth = m_data->m_exampleInfoTextOutput->GetBounds().w-25; int wrapLen = int(wrapmessage.length()); for (int endPos=0;endPos<=wrapLen;endPos++) { std::string sub = wrapmessage.substr(startPos,(endPos-startPos)); Gwen::Point pt = m_data->pRenderer->MeasureText(m_data->pCanvas->GetSkin()->GetDefaultFont(),sub); if (pt.x <= fixedWidth) { lastFit = sub; if (message[endPos]==' ' ||message[endPos]=='.' || message[endPos]==',' ) { hasSpace = true; lastFitSpace = sub; spacePos = endPos; } } else { //submit and if (hasSpace) { endPos = spacePos+1; hasSpace = false; lastFit = lastFitSpace; startPos = endPos; } else { startPos = endPos-1; } Gwen::UnicodeString msg = Gwen::Utility::StringToUnicode(lastFit); m_data->m_exampleInfoTextOutput->AddItem( msg ); m_data->m_exampleInfoTextOutput->Scroller()->ScrollToBottom(); } } if (lastFit.length()) { Gwen::UnicodeString msg = Gwen::Utility::StringToUnicode(lastFit); m_data->m_exampleInfoTextOutput->AddItem( msg ); m_data->m_exampleInfoTextOutput->Scroller()->ScrollToBottom(); } } void GwenUserInterface::setStatusBarMessage(const char* message, bool isLeft) { Gwen::UnicodeString msg = Gwen::Utility::StringToUnicode(message); if (isLeft) { m_data->m_leftStatusBar->SetText( msg); } else { m_data->m_rightStatusBar->SetText( msg); } } void GwenUserInterface::registerFileOpenCallback(b3FileOpenCallback callback) { m_data->m_menuItems->m_fileOpenCallback = callback; } void GwenUserInterface::registerQuitCallback(b3QuitCallback callback) { m_data->m_menuItems->m_quitCallback = callback; } void GwenUserInterface::init(int width, int height,Gwen::Renderer::Base* renderer,float retinaScale) { m_data->m_curYposition = 20; //m_data->m_primRenderer = new GLPrimitiveRenderer(width,height); m_data->pRenderer = renderer;//new GwenOpenGL3CoreRenderer(m_data->m_primRenderer,stash,width,height,retinaScale); m_data->skin.SetRender( m_data->pRenderer ); m_data->pCanvas= new Gwen::Controls::Canvas( &m_data->skin ); m_data->pCanvas->SetSize( width,height); m_data->pCanvas->SetDrawBackground( false); m_data->pCanvas->SetBackgroundColor( Gwen::Color( 150, 170, 170, 255 ) ); MyTestMenuBar* menubar = new MyTestMenuBar(m_data->pCanvas); m_data->m_viewMenu = menubar->m_viewMenu; m_data->m_menuItems = menubar->m_menuItems; m_data->m_menubar = menubar; Gwen::Controls::StatusBar* bar = new Gwen::Controls::StatusBar(m_data->pCanvas); m_data->m_bar = bar; m_data->m_rightStatusBar = new Gwen::Controls::Label( bar ); m_data->m_rightStatusBar->SetWidth(width/2); //m_data->m_rightStatusBar->SetText( L"Label Added to Right" ); bar->AddControl( m_data->m_rightStatusBar, true ); m_data->m_TextOutput = new Gwen::Controls::ListBox( m_data->pCanvas ); m_data->m_TextOutput->Dock( Gwen::Pos::Bottom ); m_data->m_TextOutput->SetHeight( 100 ); m_data->m_leftStatusBar = new Gwen::Controls::Label( bar ); //m_data->m_leftStatusBar->SetText( L"Label Added to Left" ); m_data->m_leftStatusBar->SetWidth(width/2); bar->AddControl( m_data->m_leftStatusBar,false); //Gwen::KeyboardFocus /*Gwen::Controls::GroupBox* box = new Gwen::Controls::GroupBox(m_data->pCanvas); box->SetText("text"); box->SetName("name"); box->SetHeight(500); */ Gwen::Controls::ScrollControl* windowRight= new Gwen::Controls::ScrollControl(m_data->pCanvas); windowRight->Dock(Gwen::Pos::Right); windowRight->SetWidth(250); windowRight->SetHeight(250); windowRight->SetScroll(false,true); m_data->m_windowRight = windowRight; //windowLeft->SetSkin( Gwen::Controls::TabControl* tab = new Gwen::Controls::TabControl(windowRight); m_data->m_tab = tab; //tab->SetHeight(300); tab->SetWidth(240); tab->SetHeight(1250); //tab->Dock(Gwen::Pos::Left); tab->Dock( Gwen::Pos::Fill ); //tab->SetMargin( Gwen::Margin( 2, 2, 2, 2 ) ); Gwen::UnicodeString str1(L"Params"); m_data->m_demoPage = tab->AddPage(str1); // Gwen::UnicodeString str2(L"OpenCL"); // tab->AddPage(str2); //Gwen::UnicodeString str3(L"page3"); // tab->AddPage(str3); //but->onPress.Add(handler, &MyHander::onButtonA); //box->Dock(Gwen::Pos::Left); /*Gwen::Controls::WindowControl* windowBottom = new Gwen::Controls::WindowControl(m_data->pCanvas); windowBottom->SetHeight(100); windowBottom->Dock(Gwen::Pos::Bottom); windowBottom->SetTitle("bottom"); */ // Gwen::Controls::Property::Text* prop = new Gwen::Controls::Property::Text(m_data->pCanvas); //prop->Dock(Gwen::Pos::Bottom); /*Gwen::Controls::SplitterBar* split = new Gwen::Controls::SplitterBar(m_data->pCanvas); split->Dock(Gwen::Pos::Center); split->SetHeight(300); split->SetWidth(300); */ /* */ Gwen::Controls::ScrollControl* windowLeft = new Gwen::Controls::ScrollControl(m_data->pCanvas); windowLeft->Dock(Gwen::Pos::Left); // windowLeft->SetTitle("title"); windowLeft->SetScroll(false, false); windowLeft->SetWidth(250); windowLeft->SetPos(50, 50); windowLeft->SetHeight(500); //windowLeft->SetClosable(false); // windowLeft->SetShouldDrawBackground(true); windowLeft->SetTabable(true); Gwen::Controls::TabControl* explorerTab = new Gwen::Controls::TabControl(windowLeft); //tab->SetHeight(300); // explorerTab->SetWidth(230); explorerTab->SetHeight(250); //tab->Dock(Gwen::Pos::Left); explorerTab->Dock(Gwen::Pos::Fill); //m_data->m_exampleInfoTextOutput->SetBounds(2, 10, 236, 400); //windowRight Gwen::UnicodeString explorerStr1(L"Explorer"); m_data->m_explorerPage = explorerTab->AddPage(explorerStr1); Gwen::UnicodeString shapesStr1(L"Test"); Gwen::Controls::TabButton* shapes = explorerTab->AddPage(shapesStr1); ///todo(erwincoumans) figure out why the HSV color picker is extremely slow //Gwen::Controls::HSVColorPicker* color = new Gwen::Controls::HSVColorPicker(shapes->GetPage()); Gwen::Controls::ColorPicker* color = new Gwen::Controls::ColorPicker(shapes->GetPage()); color->SetKeyboardInputEnabled(true); Gwen::Controls::TreeControl* ctrl = new Gwen::Controls::TreeControl(m_data->m_explorerPage->GetPage()); m_data->m_explorerTreeCtrl = ctrl; ctrl->SetKeyboardInputEnabled(true); ctrl->Focus(); ctrl->SetBounds(2, 10, 236, 300); m_data->m_exampleInfoGroupBox = new Gwen::Controls::Label( m_data->m_explorerPage->GetPage() ); m_data->m_exampleInfoGroupBox->SetPos(2, 314); m_data->m_exampleInfoGroupBox->SetHeight( 15 ); m_data->m_exampleInfoGroupBox->SetWidth(234); m_data->m_exampleInfoGroupBox->SetText("Example Description"); m_data->m_exampleInfoTextOutput = new Gwen::Controls::ListBox(m_data->m_explorerPage->GetPage()); //m_data->m_exampleInfoTextOutput->Dock( Gwen::Pos::Bottom ); m_data->m_exampleInfoTextOutput->SetPos(2, 332); m_data->m_exampleInfoTextOutput->SetHeight( 150 ); m_data->m_exampleInfoTextOutput->SetWidth(233); } void GwenUserInterface::forceUpdateScrollBars() { b3Assert(m_data); b3Assert(m_data->m_explorerTreeCtrl); if (m_data && m_data->m_explorerTreeCtrl) { m_data->m_explorerTreeCtrl->ForceUpdateScrollBars(); } } void GwenUserInterface::setFocus() { b3Assert(m_data); b3Assert(m_data->m_explorerTreeCtrl); if (m_data && m_data->m_explorerTreeCtrl) { m_data->m_explorerTreeCtrl->Focus(); } } b3ToggleButtonCallback GwenUserInterface::getToggleButtonCallback() { return m_data->m_toggleButtonCallback; } void GwenUserInterface::setToggleButtonCallback(b3ToggleButtonCallback callback) { m_data->m_toggleButtonCallback = callback; } void GwenUserInterface::registerToggleButton2(int buttonId, const char* name) { assert(m_data); assert(m_data->m_demoPage); Gwen::Controls::Button* but = new Gwen::Controls::Button(m_data->m_demoPage->GetPage()); ///some heuristic to find the button location int ypos = m_data->m_curYposition; but->SetPos(10, ypos ); but->SetWidth( 200 ); //but->SetBounds( 200, 30, 300, 200 ); MyButtonHander* handler = new MyButtonHander(m_data, buttonId); m_data->m_handlers.push_back(handler); m_data->m_curYposition+=22; but->onToggle.Add(handler, &MyButtonHander::onButtonA); but->SetIsToggle(true); but->SetToggleState(false); but->SetText(name); } void GwenUserInterface::setComboBoxCallback(b3ComboBoxCallback callback) { m_data->m_comboBoxCallback = callback; } b3ComboBoxCallback GwenUserInterface::getComboBoxCallback() { return m_data->m_comboBoxCallback; } void GwenUserInterface::registerComboBox2(int comboboxId, int numItems, const char** items, int startItem) { Gwen::Controls::ComboBox* combobox = new Gwen::Controls::ComboBox(m_data->m_demoPage->GetPage()); MyComboBoxHander* handler = new MyComboBoxHander(m_data, comboboxId); m_data->m_handlers.push_back(handler); combobox->onSelection.Add(handler,&MyComboBoxHander::onSelect); int ypos = m_data->m_curYposition; combobox->SetPos(10, ypos ); combobox->SetWidth( 100 ); //box->SetPos(120,130); for (int i=0;iAddItem(Gwen::Utility::StringToUnicode(items[i])); if (i==startItem) combobox->OnItemSelected(item); } m_data->m_curYposition+=22; } void GwenUserInterface::draw(int width, int height) { // printf("width = %d, height=%d\n", width,height); if (m_data->pCanvas) { m_data->pCanvas->SetSize(width,height); //m_data->m_primRenderer->setScreenSize(width,height); m_data->pRenderer->Resize(width,height); m_data->pCanvas->RenderCanvas(); //restoreOpenGLState(); } } bool GwenUserInterface::mouseMoveCallback( float x, float y) { bool handled = false; static int m_lastmousepos[2] = {0,0}; static bool isInitialized = false; if (m_data->pCanvas) { if (!isInitialized) { isInitialized = true; m_lastmousepos[0] = x+1; m_lastmousepos[1] = y+1; } handled = m_data->pCanvas->InputMouseMoved(x,y,m_lastmousepos[0],m_lastmousepos[1]); } return handled; } #include "../CommonInterfaces/CommonWindowInterface.h" bool GwenUserInterface::keyboardCallback(int bulletKey, int state) { int gwenKey = -1; if (m_data->pCanvas) { //convert 'Bullet' keys into 'Gwen' keys switch (bulletKey) { case B3G_RETURN: { gwenKey = Gwen::Key::Return; break; } case B3G_LEFT_ARROW: { gwenKey = Gwen::Key::Left; break; } case B3G_RIGHT_ARROW: { gwenKey = Gwen::Key::Right; break; } case B3G_UP_ARROW: { gwenKey = Gwen::Key::Up; break; } case B3G_DOWN_ARROW: { gwenKey = Gwen::Key::Down; break; } case B3G_BACKSPACE: { gwenKey = Gwen::Key::Backspace; break; } case B3G_DELETE: { gwenKey = Gwen::Key::Delete; break; } case B3G_HOME: { gwenKey = Gwen::Key::Home; break; } case B3G_END: { gwenKey = Gwen::Key::End; break; } case B3G_SHIFT: { gwenKey = Gwen::Key::Shift; break; } case B3G_CONTROL: { gwenKey = Gwen::Key::Control; break; } default: { } }; if (gwenKey>=0) { return m_data->pCanvas->InputKey(gwenKey,state==1); } else { if (bulletKey<256 && state) { Gwen::UnicodeChar c = ( Gwen::UnicodeChar ) bulletKey; return m_data->pCanvas->InputCharacter(c); } } } return false; } bool GwenUserInterface::mouseButtonCallback(int button, int state, float x, float y) { bool handled = false; if (m_data->pCanvas) { handled = m_data->pCanvas->InputMouseMoved(x,y,x, y); if (button>=0) { handled = m_data->pCanvas->InputMouseButton(button,(bool)state); if (handled) { //if (!state) // return false; } } } return handled; }