void FileSelector::SetFilters(const Vector<String>& filters, unsigned defaultIndex) { if (filters.Empty()) return; ignoreEvents_ = true; filters_ = filters; filterList_->RemoveAllItems(); for (unsigned i = 0; i < filters_.Size(); ++i) { Text* filterText = new Text(context_); filterList_->AddItem(filterText); filterText->SetText(filters_[i]); filterText->SetStyle("FileSelectorFilterText"); } if (defaultIndex > filters.Size()) defaultIndex = 0; filterList_->SetSelection(defaultIndex); ignoreEvents_ = false; if (GetFilter() != lastUsedFilter_) RefreshFiles(); }
static int lua_new_text (lua_State *L) { size_t st; const char* name = luaL_checklstring(L, 2, &st); double x = luaL_checknumber(L, 3); double y = luaL_checknumber(L, 4); double w = luaL_checknumber(L, 5); double h = luaL_checknumber(L, 6); Style* style = 0; if (lua_type(L, 7)!=LUA_TNIL){ style = lua_checklstyle(L, 7); } const char* text = luaL_checklstring(L, 8, &st); Box** c = (Box**)lua_newuserdata(L, sizeof(Box*)); luaL_getmetatable(L, "layout"); lua_setmetatable(L, -2); Text *e = new Text(name, x, y, w, h); if (style) e->SetStyle(style); e->text = text; *c = static_cast<Box*>(e); return 1; }
void Console::SetNumBufferedRows(unsigned rows) { if (rows < displayedRows_) return; rowContainer_->DisableLayoutUpdate(); int delta = rowContainer_->GetNumItems() - rows; if (delta > 0) { // We have more, remove oldest rows first for (int i = 0; i < delta; ++i) rowContainer_->RemoveItem((unsigned)0); } else { // We have less, add more rows at the top for (int i = 0; i > delta; --i) { Text* text = new Text(context_); // If style is already set, apply here to ensure proper height of the console when // amount of rows is changed if (background_->GetDefaultStyle()) text->SetStyle("ConsoleText"); rowContainer_->InsertItem(0, text); } } rowContainer_->EnsureItemVisibility(rowContainer_->GetItem(rowContainer_->GetNumItems() - 1)); rowContainer_->EnableLayoutUpdate(); rowContainer_->UpdateLayout(); UpdateElements(); }
void HelloGUI::CreateDraggableFish() { ResourceCache* cache = GetSubsystem<ResourceCache>(); Graphics* graphics = GetSubsystem<Graphics>(); // Create a draggable Fish button Button* draggableFish = new Button(context_); draggableFish->SetTexture(cache->GetResource<Texture2D>("Textures/UrhoDecal.dds")); // Set texture draggableFish->SetBlendMode(BLEND_ADD); draggableFish->SetSize(128, 128); draggableFish->SetPosition((graphics->GetWidth() - draggableFish->GetWidth()) / 2, 200); draggableFish->SetName("Fish"); uiRoot_->AddChild(draggableFish); // Add a tooltip to Fish button ToolTip* toolTip = new ToolTip(context_); draggableFish->AddChild(toolTip); toolTip->SetPosition(IntVector2(draggableFish->GetWidth() + 5, draggableFish->GetWidth() / 2)); // slightly offset from close button BorderImage* textHolder = new BorderImage(context_); toolTip->AddChild(textHolder); textHolder->SetStyle("ToolTipBorderImage"); Text* toolTipText = new Text(context_); textHolder->AddChild(toolTipText); toolTipText->SetStyle("ToolTipText"); toolTipText->SetText("Please drag me!"); // Subscribe draggableFish to Drag Events (in order to make it draggable) // See "Event list" in documentation's Main Page for reference on available Events and their eventData SubscribeToEvent(draggableFish, E_DRAGBEGIN, HANDLER(HelloGUI, HandleDragBegin)); SubscribeToEvent(draggableFish, E_DRAGMOVE, HANDLER(HelloGUI, HandleDragMove)); SubscribeToEvent(draggableFish, E_DRAGEND, HANDLER(HelloGUI, HandleDragEnd)); }
void FileSelector::RefreshFiles() { FileSystem* fileSystem = GetSubsystem<FileSystem>(); ignoreEvents_ = true; fileList_->RemoveAllItems(); fileEntries_.Clear(); Vector<String> directories; Vector<String> files; fileSystem->ScanDir(directories, path_, "*", SCAN_DIRS, false); fileSystem->ScanDir(files, path_, GetFilter(), SCAN_FILES, false); fileEntries_.Reserve(directories.Size() + files.Size()); for (unsigned i = 0; i < directories.Size(); ++i) { FileSelectorEntry newEntry; newEntry.name_ = directories[i]; newEntry.directory_ = true; fileEntries_.Push(newEntry); } for (unsigned i = 0; i < files.Size(); ++i) { FileSelectorEntry newEntry; newEntry.name_ = files[i]; newEntry.directory_ = false; fileEntries_.Push(newEntry); } // Sort and add to the list view // While items are being added, disable layout update for performance optimization Sort(fileEntries_.Begin(), fileEntries_.End(), CompareEntries); UIElement* listContent = fileList_->GetContentElement(); listContent->DisableLayoutUpdate(); for (unsigned i = 0; i < fileEntries_.Size(); ++i) { String displayName; if (fileEntries_[i].directory_) displayName = "<DIR> " + fileEntries_[i].name_; else displayName = fileEntries_[i].name_; Text* entryText = new Text(context_); fileList_->AddItem(entryText); entryText->SetText(displayName); entryText->SetStyle("FileSelectorListText"); } listContent->EnableLayoutUpdate(); listContent->UpdateLayout(); ignoreEvents_ = false; // Clear filename from the previous dir so that there is no confusion SetFileName(String::EMPTY); lastUsedFilter_ = GetFilter(); }
bool Console::PopulateInterpreter() { interpreters_->RemoveAllItems(); EventReceiverGroup* group = context_->GetEventReceivers(E_CONSOLECOMMAND); if (!group || group->receivers_.Empty()) return false; Vector<String> names; for (unsigned i = 0; i < group->receivers_.Size(); ++i) { Object* receiver = group->receivers_[i]; if (receiver) names.Push(receiver->GetTypeName()); } Sort(names.Begin(), names.End()); unsigned selection = M_MAX_UNSIGNED; for (unsigned i = 0; i < names.Size(); ++i) { const String& name = names[i]; if (name == commandInterpreter_) selection = i; Text* text = new Text(context_); text->SetStyle("ConsoleText"); text->SetText(name); interpreters_->AddItem(text); } const IntRect& border = interpreters_->GetPopup()->GetLayoutBorder(); interpreters_->SetMaxWidth(interpreters_->GetListView()->GetContentElement()->GetWidth() + border.left_ + border.right_); bool enabled = interpreters_->GetNumItems() > 1; interpreters_->SetEnabled(enabled); interpreters_->SetFocusMode(enabled ? FM_FOCUSABLE_DEFOCUSABLE : FM_NOTFOCUSABLE); if (selection == M_MAX_UNSIGNED) { selection = 0; commandInterpreter_ = names[selection]; } interpreters_->SetSelection(selection); return true; }
void Console::HandlePostUpdate(StringHash eventType, VariantMap& eventData) { if (!rowContainer_->GetNumChildren()) return; rowContainer_->DisableLayoutUpdate(); for (unsigned i = 0; i < pendingRows_.Size(); ++i) { rowContainer_->RemoveChildAtIndex(0); Text* text = rowContainer_->CreateChild<Text>(); text->SetText(pendingRows_[i].second_); // Make error message highlight text->SetStyle(pendingRows_[i].first_ == LOG_ERROR ? "ConsoleHighlightedText" : "ConsoleText"); } pendingRows_.Clear(); rowContainer_->EnableLayoutUpdate(); rowContainer_->UpdateLayout(); }
void Console::HandlePostUpdate(StringHash eventType, VariantMap& eventData) { // Ensure UI-elements are not detached if (!background_->GetParent()) { UI* ui = GetSubsystem<UI>(); UIElement* uiRoot = ui->GetRoot(); uiRoot->AddChild(background_); uiRoot->AddChild(closeButton_); } if (!rowContainer_->GetNumItems() || pendingRows_.Empty()) return; printing_ = true; rowContainer_->DisableLayoutUpdate(); Text* text = nullptr; for (unsigned i = 0; i < pendingRows_.Size(); ++i) { rowContainer_->RemoveItem((unsigned)0); text = new Text(context_); text->SetText(pendingRows_[i].second_); // Highlight console messages based on their type text->SetStyle(logStyles[pendingRows_[i].first_]); rowContainer_->AddItem(text); } pendingRows_.Clear(); rowContainer_->EnsureItemVisibility(text); rowContainer_->EnableLayoutUpdate(); rowContainer_->UpdateLayout(); UpdateElements(); // May need to readjust the height due to scrollbar visibility changes printing_ = false; }
void UIDrag::CreateGUI() { ResourceCache* cache = GetSubsystem<ResourceCache>(); UI* ui = GetSubsystem<UI>(); UIElement* root = ui->GetRoot(); // Load the style sheet from xml root->SetDefaultStyle(cache->GetResource<XMLFile>("UI/DefaultStyle.xml")); for (int i=0; i < 10; i++) { Button* b = new Button(context_); root->AddChild(b); // Reference a style from the style sheet loaded earlier: b->SetStyle("Button"); b->SetSize(300, 100); b->SetPosition(IntVector2(50*i, 50*i)); if (i % 2 == 0) b->AddTag("SomeTag"); SubscribeToEvent(b, E_DRAGMOVE, URHO3D_HANDLER(UIDrag, HandleDragMove)); SubscribeToEvent(b, E_DRAGBEGIN, URHO3D_HANDLER(UIDrag, HandleDragBegin)); SubscribeToEvent(b, E_DRAGCANCEL, URHO3D_HANDLER(UIDrag, HandleDragCancel)); SubscribeToEvent(b, E_DRAGEND, URHO3D_HANDLER(UIDrag, HandleDragEnd)); { Text* t = new Text(context_); b->AddChild(t); t->SetStyle("Text"); t->SetHorizontalAlignment(HA_CENTER); t->SetVerticalAlignment(VA_CENTER); t->SetName("Text"); } { Text* t = new Text(context_); b->AddChild(t); t->SetStyle("Text"); t->SetName("Event Touch"); t->SetHorizontalAlignment(HA_CENTER); t->SetVerticalAlignment(VA_BOTTOM); } { Text* t = new Text(context_); b->AddChild(t); t->SetStyle("Text"); t->SetName("Num Touch"); t->SetHorizontalAlignment(HA_CENTER); t->SetVerticalAlignment(VA_TOP); } } for (int i = 0; i < 10; i++) { Text* t = new Text(context_); root->AddChild(t); t->SetStyle("Text"); t->SetName("Touch "+ String(i)); t->SetVisible(false); } }