void WMenu::selectVisual(int index, bool changePath, bool showContents) { if (contentsStack_) previousStackIndex_ = contentsStack_->currentIndex(); WMenuItem *item = index >= 0 ? itemAt(index) : 0; if (changePath && internalPathEnabled_ && index != -1 && item->internalPathEnabled()) { WApplication *app = wApp; previousInternalPath_ = app->internalPath(); std::string newPath = basePath_ + item->pathComponent(); if (newPath != app->internalPath()) emitPathChange_ = true; // The change is emitted in select() app->setInternalPath(newPath); } for (int i = 0; i < count(); ++i) renderSelected(itemAt(i), (int)i == index); if (index == -1) return; if (showContents && contentsStack_) { WWidget *contents = item->contents(); if (contents) contentsStack_->setCurrentWidget(contents); } itemSelectRendered_.emit(item); }
void WMenu::select(int index, bool changePath) { int last = current_; setCurrent(index); selectVisual(current_, changePath, true); if (index != -1) { WMenuItem *item = itemAt(index); item->show(); item->loadContents(); DeletionTracker guard(this); if (changePath && emitPathChange_) { WApplication *app = wApp; app->internalPathChanged().emit(app->internalPath()); if (guard.deleted()) return; emitPathChange_ = false; } if (last != index) { item->triggered().emit(item); if (!guard.deleted()) { // item may have been deleted too if (ul()->indexOf(item) != -1) itemSelected_.emit(item); else select(-1); } } } }
void WMenu::setInternalPathEnabled(const std::string& basePath) { WApplication *app = WApplication::instance(); basePath_ = basePath.empty() ? app->internalPath() : basePath; basePath_ = Utils::append(Utils::prepend(basePath_, '/'), '/'); if (!internalPathEnabled_) { internalPathEnabled_ = true; app->internalPathChanged().connect(this, &WMenu::handleInternalPathChange); } previousInternalPath_ = app->internalPath(); internalPathChanged(app->internalPath()); updateItemsInternalPath(); }
void WMenu::itemPathChanged(WMenuItem *item) { if (internalPathEnabled_ && item->internalPathEnabled()) { WApplication *app = wApp; if (app->internalPathMatches(basePath_ + item->pathComponent())) item->setFromInternalPath(app->internalPath()); } }
void handlePathChange(const std::string& path) { WApplication *app = wApp; if (app->internalPathMatches(basePath_)) { dbo::Transaction t(session_); std::string path = app->internalPathNextPart(basePath_); items_->clear(); if (users_) { delete users_; users_ = 0; } if (path.empty()) showPosts(session_.find<Post> ("where state = ? " "order by date desc " "limit 10").bind(Post::Published), items_); else if (path == "author") { std::string author = app->internalPathNextPart(basePath_ + path + '/'); dbo::ptr<User> user = findUser(author); if (user) showPosts(user); else showError(tr("blog-no-author").arg(author)); } else if (path == "edituser") { editUser(app->internalPathNextPart(basePath_ + path + '/')); } else if (path == "all") { showArchive(items_); } else { std::string remainder = app->internalPath().substr(basePath_.length()); showPostsByDateTopic(remainder, items_); } t.commit(); } }
void WMenu::select(int index, bool changePath) { int last = current_; setCurrent(index); selectVisual(current_, changePath, true); if (index != -1) { WMenuItem *item = itemAt(index); item->show(); item->loadContents(); if (changePath && emitPathChange_) { WApplication *app = wApp; app->internalPathChanged().emit(app->internalPath()); emitPathChange_ = false; } if (last != index) { item->triggered().emit(item); itemSelected_.emit(item); } } }