home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Hackers Magazine 57
/
CdHackersMagazineNr57.iso
/
Software
/
Multimedia
/
k3d-setup-0.7.11.0.exe
/
include
/
k3d
/
k3dsdk
/
watched_path_property.h
< prev
next >
Wrap
C/C++ Source or Header
|
2009-02-16
|
4KB
|
131 lines
#ifndef K3DSDK_WATCHED_PATH_PROPERTY_H
#define K3DSDK_WATCHED_PATH_PROPERTY_H
// K-3D
// Copyright (c) 1995-2008, Timothy M. Shead
//
// Contact: tshead@k-3d.com
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public
// License as published by the Free Software Foundation; either
// version 2 of the License, or (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
// General Public License for more details.
//
// You should have received a copy of the GNU General Public
// License along with this program; if not, write to the Free Software
// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
/** \file watched_path_property.h
\author Bart Janssens (bart.janssens@lid.kviv.be)
\created Feb 6, 2009
*/
#include "data.h"
#include "hints.h"
#include "ihint.h"
#include "iuser_interface.h"
#include "iwatched_path_property.h"
#include "path.h"
#include "types.h"
namespace k3d
{
template<typename value_t, class name_policy_t>
class watched_path_property :
public iwatched_path_property,
public path_property<value_t, name_policy_t>
{
typedef path_property<value_t, name_policy_t> base;
public:
void watch(const bool_t Watch)
{
m_watched = Watch;
base::changed_signal().emit(0);
}
const bool_t is_watched() const
{
return m_watched;
}
protected:
template<typename init_t>
watched_path_property(const init_t& Init) : base(Init), m_watched(true), m_watch_id(0)
{
base::changed_signal().connect(hint::converter<
hint::convert<hint::any, hint::unchanged> >(sigc::mem_fun(*this, &watched_path_property::on_path_changed)));
}
~watched_path_property()
{
user_interface().unwatch_path(m_watch_id);
}
private:
void on_path_changed(ihint* Hint)
{
if(dynamic_cast<hint::file_changed*>(Hint))
{
return;
}
user_interface().unwatch_path(m_watch_id);
m_watch_id = 0;
const filesystem::path path = base::pipeline_value();
if(path.empty() || !m_watched)
{
return;
}
m_watch_id = k3d::user_interface().watch_path(path, sigc::mem_fun(*this, &watched_path_property::on_file_changed));
}
void on_file_changed()
{
base::changed_signal().emit(hint::file_changed::instance());
}
bool_t m_watched;
uint_t m_watch_id;
};
/// Serialization policy for filesystem path data that handles external filesystem resources
template<typename value_t, class property_policy_t>
class watched_path_serialization :
public path_serialization<value_t, property_policy_t>
{
// This policy only works for data stored by-value
BOOST_STATIC_ASSERT((!boost::is_pointer<value_t>::value));
typedef path_serialization<value_t, property_policy_t> base;
public:
void save(xml::element& Element, const ipersistent::save_context& Context)
{
xml::element& xml_storage = save_external_resource(Element, Context, property_policy_t::name(), property_policy_t::property_path_reference(), property_policy_t::internal_value());
xml_storage.append(xml::attribute("watched", property_policy_t::is_watched()));
}
void load(xml::element& Element, const ipersistent::load_context& Context)
{
base::load(Element, Context);
property_policy_t::watch(xml::attribute_value<bool_t>(Element, "watched", false));
}
protected:
template<typename init_t>
watched_path_serialization(const init_t& Init) : base(Init) {}
};
} // namespace k3d
#endif // !K3DSDK_WATCHED_PATH_PROPERTY_H