/* * This file is a part of Winix * and is not publicly distributed * * Copyright (c) 2011, Tomasz Sowa * All rights reserved. * */ #include "templates/templates.h" #include "core/plugin.h" #include "core/item.h" #include "core/log.h" #include "core/misc.h" namespace Menu { using namespace TemplatesFunctions; using TemplatesFunctions::system; extern int mount_par_menu_skip; static std::vector menu_dir_items; static size_t menu_dir_index; static size_t menu_dir_reqid = 0; static std::wstring menu_dir_last_dir; static DbItemQuery menu_dir_iq; // O(n^2) complexity void menu_dir_skip_items(long parent_id) { Mount * m = system->mounts.CalcMount(parent_id); if( !m || mount_par_menu_skip==-1 || !m->param[mount_par_menu_skip].defined ) return; const Mount::ParamRow::ParamArg & arg = m->param[mount_par_menu_skip].arg; for(size_t i=0 ; iGetItems(menu_dir_items, menu_dir_iq); menu_dir_skip_items(parent_id); log << log1 << "Menu: db used" << logend; } void menu_dir_init(const std::wstring & path) { if( cur->request->id != menu_dir_reqid || menu_dir_last_dir != path ) { menu_dir_reqid = cur->request->id; menu_dir_items.clear(); if( path.empty() ) { // current directory menu_dir_load_menu(cur->request->dir_tab.back()->id); system->dirs.MakePath(cur->request->dir_tab, menu_dir_last_dir); } else if( path[0] != '/' ) { log << log1 << "Menu: path for menu should not be relative" << logend; } else { menu_dir_last_dir = path; Item * pdir = system->dirs.GetDir(path); if( pdir ) menu_dir_load_menu(pdir->id); else log << log1 << "Menu: I cannot find a directory: " << path << logend; } } } void menu_dir_tab(Info & i) { if( i.iter == 0 ) menu_dir_init(i.par); menu_dir_index = i.iter; i.res = menu_dir_index < menu_dir_items.size(); } void menu_dir_tab_subject(Info & i) { if( menu_dir_index < menu_dir_items.size() ) i.out << menu_dir_items[menu_dir_index].subject; } void menu_dir_tab_url(Info & i) { if( menu_dir_index < menu_dir_items.size() ) i.out << menu_dir_items[menu_dir_index].url; } void menu_dir_tab_link(Info & i) { if( menu_dir_index < menu_dir_items.size() ) { i.out << menu_dir_last_dir; if( !IsLastSlash(menu_dir_last_dir) ) i.out << '/'; i.out << menu_dir_items[menu_dir_index].url; } } void menu_dir_tab_is_current(Info & i) { if( menu_dir_index < menu_dir_items.size() ) { i.res = (menu_dir_items[menu_dir_index].id == cur->request->last_item->id); } } void AddEzcFunctions(PluginInfo & info) { using TemplatesFunctions::EzcFun; EzcFun * fun = reinterpret_cast(info.p1); fun->Insert("menu_dir_tab", menu_dir_tab); fun->Insert("menu_dir_tab_subject", menu_dir_tab_subject); fun->Insert("menu_dir_tab_url", menu_dir_tab_url); fun->Insert("menu_dir_tab_link", menu_dir_tab_link); fun->Insert("menu_dir_tab_is_current", menu_dir_tab_is_current); } } // namespace