ToolBox(IrrlichtDevice* device) : GameEntity(device) { //IGUIElement* root = env->getRootGUIElement(); //Grab the pointer to the toolbox element if it exists (ID = 5000); search children as well. IGUIElement* e = env->getRootGUIElement()->getElementFromId(5000, true); //Remove tool box if already there if (e) e->remove(); //Create the toolbox window (ID = 5000) IGUIWindow* wnd = env->addWindow(rect<s32>(600,25,800,480), false, L"Tool BoX", 0, 5000); //Create tab control IGUITabControl* tab = env->addTabControl(rect<s32>(2,20,800-602,480-7), wnd, true, true); //Add "Scale" Tab IGUITab* t1 = tab->addTab(L"Scale"); //Add some edit boxes env->addEditBox(L"1.0", rect<s32>(40,50,130,70), true, t1, 901); env->addEditBox(L"1.0", rect<s32>(40,80,130,100), true, t1, 902); env->addEditBox(L"1.0", rect<s32>(40,110,130,130), true, t1, 903); //Add a "Set" button to "Scale" tab env->addButton(core::rect<s32>(10,150,100,190), t1, 1101, L"set"); // bring irrlicht engine logo to front, because it // now may be below the newly created toolbox //root->bringToFront(root->getElementFromId(666, true)); }
/* Finally, the third function creates a toolbox window. In this simple mesh viewer, this toolbox only contains a tab control with three edit boxes for changing the scale of the displayed model. */ void createToolBox() { // remove tool box if already there IGUIEnvironment* env = Device->getGUIEnvironment(); IGUIElement* root = env->getRootGUIElement(); IGUIElement* e = root->getElementFromId(GUI_ID_DIALOG_ROOT_WINDOW, true); if (e) e->remove(); // create the toolbox window IGUIWindow* wnd = env->addWindow(core::rect<s32>(600,45,800,480), false, L"Toolset", 0, GUI_ID_DIALOG_ROOT_WINDOW); // create tab control and tabs IGUITabControl* tab = env->addTabControl( core::rect<s32>(2,20,800-602,480-7), wnd, true, true); IGUITab* t1 = tab->addTab(L"Config"); // add some edit boxes and a button to tab one env->addStaticText(L"Scale:", core::rect<s32>(10,20,60,45), false, false, t1); env->addStaticText(L"X:", core::rect<s32>(22,48,40,66), false, false, t1); env->addEditBox(L"1.0", core::rect<s32>(40,46,130,66), true, t1, GUI_ID_X_SCALE); env->addStaticText(L"Y:", core::rect<s32>(22,82,40,96), false, false, t1); env->addEditBox(L"1.0", core::rect<s32>(40,76,130,96), true, t1, GUI_ID_Y_SCALE); env->addStaticText(L"Z:", core::rect<s32>(22,108,40,126), false, false, t1); env->addEditBox(L"1.0", core::rect<s32>(40,106,130,126), true, t1, GUI_ID_Z_SCALE); env->addButton(core::rect<s32>(10,134,85,165), t1, GUI_ID_BUTTON_SET_SCALE, L"Set"); // quick scale buttons env->addButton(core::rect<s32>(65,20,95,40), t1, GUI_ID_BUTTON_SCALE_MUL10, L"* 10"); env->addButton(core::rect<s32>(100,20,130,40), t1, GUI_ID_BUTTON_SCALE_DIV10, L"* 0.1"); updateScaleInfo(Model); // add transparency control env->addStaticText(L"GUI Transparency Control:", core::rect<s32>(10,200,150,225), true, false, t1); IGUIScrollBar* scrollbar = env->addScrollBar(true, core::rect<s32>(10,225,150,240), t1, GUI_ID_SKIN_TRANSPARENCY); scrollbar->setMax(255); scrollbar->setPos(255); // add framerate control env->addStaticText(L":", core::rect<s32>(10,240,150,265), true, false, t1); env->addStaticText(L"Framerate:", core::rect<s32>(12,240,75,265), false, false, t1); // current frame info env->addStaticText(L"", core::rect<s32>(75,240,200,265), false, false, t1, GUI_ID_ANIMATION_INFO); scrollbar = env->addScrollBar(true, core::rect<s32>(10,265,150,280), t1, GUI_ID_SKIN_ANIMATION_FPS); scrollbar->setMax(MAX_FRAMERATE); scrollbar->setMin(-MAX_FRAMERATE); scrollbar->setPos(DEFAULT_FRAMERATE); scrollbar->setSmallStep(1); }
// ----------------------------------------------------------------------------- void DynamicRibbonWidget::buildInternalStructure() { //printf("****DynamicRibbonWidget::buildInternalStructure()****\n"); // ---- Clean-up what was previously there for (unsigned int i=0; i<m_children.size(); i++) { IGUIElement* elem = m_children[i].m_element; if (elem != NULL && m_children[i].m_type == WTYPE_RIBBON) { elem->remove(); m_children.erase(i); i--; } } m_rows.clearWithoutDeleting(); // rows already deleted above, don't double-delete m_left_widget->m_element->setVisible(true); assert( m_left_widget->ok() ); assert( m_right_widget->ok() ); // ---- determine column amount const float row_height = (float)(m_h - m_label_height)/(float)m_row_amount; float ratio_zoom = (float)row_height / (float)(m_child_height - m_label_height); m_col_amount = (int)roundf( m_w / ( m_child_width*ratio_zoom ) ); // ajust column amount to not add more item slots than we actually need const int item_count = (int) m_items.size(); //Log::info("DynamicRibbonWidget", "%d items; %d cells", item_count, row_amount * m_col_amount); if (m_row_amount*m_col_amount > item_count) { m_col_amount = (int)ceil((float)item_count/(float)m_row_amount); //Log::info("DynamicRibbonWidget", "Adjusting m_col_amount to be %d", m_col_amount); } assert( m_left_widget->ok() ); assert( m_right_widget->ok() ); // Hide arrows when everything is visible if (item_count <= m_row_amount*m_col_amount) { m_scrolling_enabled = false; m_left_widget->m_element->setVisible(false); m_right_widget->m_element->setVisible(false); } else { m_scrolling_enabled = true; m_left_widget->m_element->setVisible(true); m_right_widget->m_element->setVisible(true); } // ---- add rows int added_item_count = 0; for (int n=0; n<m_row_amount; n++) { RibbonWidget* ribbon; if (m_combo) { ribbon = new RibbonWidget(RIBBON_COMBO); } else { ribbon = new RibbonWidget(RIBBON_TOOLBAR); } ribbon->setListener(this); ribbon->m_reserved_id = m_ids[n]; ribbon->m_x = m_x + (m_scrolling_enabled ? m_arrows_w : 0); ribbon->m_y = m_y + (int)(n*row_height); ribbon->m_w = m_w - (m_scrolling_enabled ? m_arrows_w*2 : 0); ribbon->m_h = (int)(row_height); ribbon->m_type = WTYPE_RIBBON; std::stringstream name; name << this->m_properties[PROP_ID] << "_row" << n; ribbon->m_properties[PROP_ID] = name.str(); ribbon->m_event_handler = this; // calculate font size if (m_col_amount > 0) { m_font->setScale(GUIEngine::getFont()->getScale() * getFontScale((ribbon->m_w / m_col_amount) - 30)); } // add columns for (int i=0; i<m_col_amount; i++) { // stretch the *texture* within the widget (and the widget has the right aspect ratio) // (Yeah, that's complicated, but screenshots are saved compressed horizontally so it's hard to be clean) IconButtonWidget* icon = new IconButtonWidget(IconButtonWidget::SCALE_MODE_STRETCH, false, true); icon->m_properties[PROP_ICON]="textures/transparence.png"; // set size to get proper ratio (as most textures are saved scaled down to 256x256) icon->m_properties[PROP_WIDTH] = m_properties[PROP_CHILD_WIDTH]; icon->m_properties[PROP_HEIGHT] = m_properties[PROP_CHILD_HEIGHT]; icon->m_w = atoi(icon->m_properties[PROP_WIDTH].c_str()); icon->m_h = atoi(icon->m_properties[PROP_HEIGHT].c_str()); icon->setLabelFont(m_font); // If we want each icon to have its own label, we must make it non-empty, otherwise // it will assume there is no label and none will be created (FIXME: that's ugly) if (m_properties[PROP_LABELS_LOCATION] == "each") icon->m_text = " "; //Log::info("DynamicRibbonWidget", "Ribbon text = %s", m_properties[PROP_TEXT].c_str()); ribbon->m_children.push_back( icon ); added_item_count++; // stop adding columns when we have enough items if (added_item_count == item_count) { assert(!m_scrolling_enabled); // we can see all items, so scrolling must be off break; } else if (added_item_count > item_count) { assert(false); break; } } m_children.push_back( ribbon ); m_rows.push_back( ribbon ); ribbon->add(); // stop filling rows when we have enough items if (added_item_count == item_count) { assert(!m_scrolling_enabled); // we can see all items, so scrolling must be off break; } } #ifdef DEBUG if (!m_scrolling_enabled) { // debug checks int childrenCount = 0; for (unsigned int n=0; n<m_rows.size(); n++) { childrenCount += m_rows[n].m_children.size(); } assert(childrenCount == (int)m_items.size()); } #endif }