changed: in plugin 'menu'

menu_dir_tab ezc functions can be nested now
         (not finished yet)
added:   'meta' winix function
         additional meta information for files and directories
         (not finished yet)



git-svn-id: svn://ttmath.org/publicrep/winix/trunk@775 e52654a7-88a9-db11-a3e9-0013d4bc506e
This commit is contained in:
2011-11-25 04:51:55 +00:00
parent 1e9ab2f805
commit 7902389ef1
41 changed files with 2461 additions and 1863 deletions

View File

@@ -14,6 +14,74 @@
#include "core/misc.h"
// !! temporarily
template<class Key, class Value>
class Stack
{
public:
typedef Key StackKey;
typedef Value StackValue;
struct Item
{
StackKey key;
StackValue value;
};
Stack()
{
added_new = false;
}
StackValue * Get(const StackKey & key)
{
for(size_t i=0 ; i<tab.size() ; ++i)
{
if( tab[i].key == key )
{
added_new = false;
return &tab[i].value;
}
}
// there is no such an element in our table
// so we add a new item
tab.push_back(Item());
tab.back().key = key;
added_new = true;
return &tab.back().value;
}
/*
returning true if Get() method has inserted a new Item
*/
bool AddedNew()
{
return added_new;
}
void Clear()
{
tab.clear();
}
private:
std::vector<Item> tab;
bool added_new;
};
namespace Menu
{
@@ -23,11 +91,25 @@ 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;
struct MenuDir
{
std::vector<Item> items;
size_t index;
std::wstring dir;
MenuDir()
{
index = 0;
}
};
static MenuDir * menu_dir = 0;
static DbItemQuery iq;
static Stack<std::wstring, MenuDir> menu_dir_stack;
static size_t req_id = 0;
// O(n^2) complexity
@@ -42,10 +124,10 @@ void menu_dir_skip_items(long parent_id)
for(size_t i=0 ; i<arg.size() ; ++i)
{
for(size_t x=0 ; x<menu_dir_items.size() ; )
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);
if( menu_dir->items[x].url == arg[i] )
menu_dir->items.erase(menu_dir->items.begin() + x);
else
x += 1;
}
@@ -55,10 +137,10 @@ void menu_dir_skip_items(long parent_id)
void menu_dir_skip_static_files()
{
for(size_t x=0 ; x<menu_dir_items.size() ; )
for(size_t x=0 ; x<menu_dir->items.size() ; )
{
if( menu_dir_items[x].type == Item::file && menu_dir_items[x].file_type != WINIX_ITEM_FILETYPE_NONE )
menu_dir_items.erase(menu_dir_items.begin() + x);
if( menu_dir->items[x].type == Item::file && menu_dir->items[x].file_type != WINIX_ITEM_FILETYPE_NONE )
menu_dir->items.erase(menu_dir->items.begin() + x);
else
x += 1;
}
@@ -68,17 +150,20 @@ void menu_dir_skip_static_files()
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.sel_type = true;
menu_dir_iq.sel_file = true;
menu_dir_iq.WhereParentId(parent_id);
iq.SetAll(false, false);
iq.sel_subject = true;
iq.sel_url = true;
iq.sel_sort_index = true;
iq.sel_type = true;
iq.sel_file = true;
iq.WhereParentId(parent_id);
db->GetItems(menu_dir->items, iq);
db->GetItems(menu_dir_items, menu_dir_iq);
menu_dir_skip_items(parent_id);
menu_dir_skip_static_files();
// !! temporarily for debug purposes
log << log1 << "Menu: db used" << logend;
}
@@ -86,25 +171,31 @@ void menu_dir_load_menu(long parent_id)
void menu_dir_init(const std::wstring & path)
{
if( cur->request->id != menu_dir_reqid || menu_dir_last_dir != path )
if( cur->request->id != req_id )
{
menu_dir_reqid = cur->request->id;
menu_dir_items.clear();
menu_dir_stack.Clear();
req_id = cur->request->id;
}
menu_dir = menu_dir_stack.Get(path);
if( !path.empty() && path[0] != '/' )
{
log << log1 << "Menu: path for menu should not be relative" << logend;
return;
}
if( menu_dir_stack.AddedNew() )
{
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;
system->dirs.MakePath(cur->request->dir_tab, menu_dir->dir);
}
else
{
menu_dir_last_dir = path;
menu_dir->dir = path;
Item * pdir = system->dirs.GetDir(path);
if( pdir )
@@ -119,25 +210,24 @@ void menu_dir_init(const std::wstring & path)
void menu_dir_tab(Info & i)
{
if( i.iter == 0 )
menu_dir_init(i.par);
menu_dir_init(i.par);
menu_dir_index = i.iter;
i.res = menu_dir_index < menu_dir_items.size();
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;
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;
if( menu_dir->index < menu_dir->items.size() )
i.out << menu_dir->items[menu_dir->index].url;
}
@@ -146,14 +236,14 @@ void menu_dir_tab_url(Info & i)
void menu_dir_tab_link(Info & i)
{
if( menu_dir_index < menu_dir_items.size() )
if( menu_dir->index < menu_dir->items.size() )
{
i.out << menu_dir_last_dir;
i.out << menu_dir->dir;
if( !IsLastSlash(menu_dir_last_dir) )
if( !IsLastSlash(menu_dir->dir) )
i.out << '/';
i.out << menu_dir_items[menu_dir_index].url;
i.out << menu_dir->items[menu_dir->index].url;
}
}
@@ -161,13 +251,51 @@ void menu_dir_tab_link(Info & i)
void menu_dir_tab_is_current(Info & i)
{
if( menu_dir_index < menu_dir_items.size() )
if( menu_dir->index < menu_dir->items.size() )
{
i.res = (menu_dir_items[menu_dir_index].id == cur->request->last_item->id);
i.res = (menu_dir->items[menu_dir->index].id == cur->request->last_item->id);
}
}
// returning true if the dir tab element is a first parent for current item
void menu_dir_tab_is_first_parent_for_current_item(Info & i)
{
if( menu_dir->index < menu_dir->items.size() )
i.res = (menu_dir->items[menu_dir->index].id == cur->request->last_item->parent_id);
}
// returning true if the dir tab element is a parent for current item
// (it don't have to be the first parent - it can be a descendant)
void menu_dir_tab_is_parent_for_current_item(Info & i)
{
if( menu_dir->index < menu_dir->items.size() )
{
size_t len = cur->request->dir_tab.size(); // at least one
if( !cur->request->is_item )
{
// the last item is a directory so we don't get it into account
len -= 1;
}
for(size_t a=0 ; a<len ; ++a)
{
if( menu_dir->items[menu_dir->index].id == cur->request->dir_tab[a]->id )
{
i.res = true;
break;
}
}
}
}
void AddEzcFunctions(PluginInfo & info)
{
using TemplatesFunctions::EzcFun;
@@ -178,6 +306,8 @@ void AddEzcFunctions(PluginInfo & info)
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);
fun->Insert("menu_dir_tab_is_first_parent_for_current_item", menu_dir_tab_is_first_parent_for_current_item);
fun->Insert("menu_dir_tab_is_parent_for_current_item", menu_dir_tab_is_parent_for_current_item);
}