winix/plugins/menu/templates.cpp

178 lines
3.5 KiB
C++
Executable File

/*
* 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<Item> 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 ; i<arg.size() ; ++i)
{
for(size_t x=0 ; x<menu_dir_items.size() ; )
{
if( menu_dir_items[x].url == arg[i] )
menu_dir_items.erase(menu_dir_items.begin() + x);
else
x += 1;
}
}
}
void menu_dir_load_menu(long parent_id)
{
menu_dir_iq.SetAll(false, false);
menu_dir_iq.sel_subject = true;
menu_dir_iq.sel_url = true;
menu_dir_iq.sel_sort_index = true;
menu_dir_iq.WhereParentId(parent_id);
// !! directories will not be read with WINIX_ITEM_FILETYPE_NONE
//menu_dir_iq.WhereFileType(WINIX_ITEM_FILETYPE_NONE);
db->GetItems(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<EzcFun*>(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