Blame synfig-studio/src/gui/workspacehandler.cpp

Rodolfo Ribeiro Gomes 4d2447
/* === S Y N F I G ========================================================= */
Rodolfo Ribeiro Gomes 4d2447
/*!	\file workspacehandler.cpp
Rodolfo Ribeiro Gomes 4d2447
**	\brief Handle with custom workspaces
Rodolfo Ribeiro Gomes 4d2447
**
Rodolfo Ribeiro Gomes 4d2447
**	$Id$
Rodolfo Ribeiro Gomes 4d2447
**
Rodolfo Ribeiro Gomes 4d2447
**	\legal
Rodolfo Ribeiro Gomes 4d2447
**	Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
Rodolfo Ribeiro Gomes 4d2447
**	Copyright (c) 2019 Rodolfo R Gomes
Rodolfo Ribeiro Gomes 4d2447
**
Rodolfo Ribeiro Gomes 4d2447
**	This package is free software; you can redistribute it and/or
Rodolfo Ribeiro Gomes 4d2447
**	modify it under the terms of the GNU General Public License as
Rodolfo Ribeiro Gomes 4d2447
**	published by the Free Software Foundation; either version 2 of
Rodolfo Ribeiro Gomes 4d2447
**	the License, or (at your option) any later version.
Rodolfo Ribeiro Gomes 4d2447
**
Rodolfo Ribeiro Gomes 4d2447
**	This package is distributed in the hope that it will be useful,
Rodolfo Ribeiro Gomes 4d2447
**	but WITHOUT ANY WARRANTY; without even the implied warranty of
Rodolfo Ribeiro Gomes 4d2447
**	MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
Rodolfo Ribeiro Gomes 4d2447
**	General Public License for more details.
Rodolfo Ribeiro Gomes 4d2447
**	\endlegal
Rodolfo Ribeiro Gomes 4d2447
*/
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
/* ========================================================================= */
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
#ifdef USING_PCH
Rodolfo Ribeiro Gomes 4d2447
#	include "pch.h"
Rodolfo Ribeiro Gomes 4d2447
#else
Rodolfo Ribeiro Gomes 4d2447
# ifdef HAVE_CONFIG_H
Rodolfo Ribeiro Gomes 4d2447
#  include <config.h></config.h>
Rodolfo Ribeiro Gomes 4d2447
# endif
Rodolfo Ribeiro Gomes 4d2447
# include "workspacehandler.h"
Rodolfo Ribeiro Gomes 4d2447
# include <algorithm></algorithm>
Rodolfo Ribeiro Gomes 4d2447
# include <fstream></fstream>
Rodolfo Ribeiro Gomes 4d2447
# include "synfig/general.h"
Rodolfo Ribeiro Gomes 4d2447
# include "gui/localization.h"
Rodolfo Ribeiro Gomes 4d2447
#endif
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
using namespace studio;
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 66fd47
WorkspaceHandler::WorkspaceHandler()
Rodolfo Ribeiro Gomes 4d2447
{
Rodolfo Ribeiro Gomes 4d2447
}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes cbe448
void
Rodolfo Ribeiro Gomes cbe448
WorkspaceHandler::trim_string(std::string &text)
Rodolfo Ribeiro Gomes 4d2447
{
Rodolfo Ribeiro Gomes 4d2447
	text.erase(text.begin(),
Rodolfo Ribeiro Gomes 4d2447
			   std::find_if(text.begin(), text.end(),
Rodolfo Ribeiro Gomes 4d2447
							[](int chr) { return !std::isspace(chr);})
Rodolfo Ribeiro Gomes 4d2447
			   );
Rodolfo Ribeiro Gomes 4d2447
	text.erase(std::find_if(text.rbegin(), text.rend(),
Rodolfo Ribeiro Gomes 4d2447
							[](int chr) { return !std::isspace(chr);}).base(),
Rodolfo Ribeiro Gomes 4d2447
			   text.end()
Rodolfo Ribeiro Gomes 4d2447
			   );
Rodolfo Ribeiro Gomes 4d2447
}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
bool
Rodolfo Ribeiro Gomes 4d2447
WorkspaceHandler::is_valid_name(const std::string& name)
Rodolfo Ribeiro Gomes 4d2447
{
Rodolfo Ribeiro Gomes 4d2447
	std::string valid_name = name;
Rodolfo Ribeiro Gomes 4d2447
	trim_string(valid_name);
Rodolfo Ribeiro Gomes 4d2447
	return !valid_name.empty() && valid_name.find("=") == std::string::npos;
Rodolfo Ribeiro Gomes 4d2447
}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
bool
Rodolfo Ribeiro Gomes 4d2447
WorkspaceHandler::has_workspace(const std::string& name) const
Rodolfo Ribeiro Gomes 4d2447
{
Rodolfo Ribeiro Gomes 4d2447
	return workspaces.find(name) != workspaces.end();
Rodolfo Ribeiro Gomes 4d2447
}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
bool
Rodolfo Ribeiro Gomes 4d2447
WorkspaceHandler::add_workspace(const std::string& name, const std::string& tpl)
Rodolfo Ribeiro Gomes 4d2447
{
Rodolfo Ribeiro Gomes 4d2447
	if (!is_valid_name(name) || tpl.empty())
Rodolfo Ribeiro Gomes 4d2447
		return false;
Rodolfo Ribeiro Gomes 4d2447
	std::string valid_name(name);
Rodolfo Ribeiro Gomes 4d2447
	trim_string(valid_name);
Rodolfo Ribeiro Gomes 4d2447
	if (has_workspace(valid_name))
Rodolfo Ribeiro Gomes 4d2447
		return false;
Rodolfo Ribeiro Gomes 4d2447
	workspaces[valid_name] = tpl;
Rodolfo Ribeiro Gomes fa2e08
	signal_list_changed_.emit();
Rodolfo Ribeiro Gomes 4d2447
	return true;
Rodolfo Ribeiro Gomes 4d2447
}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
void
Rodolfo Ribeiro Gomes 4d2447
WorkspaceHandler::remove_workspace(const std::string& name)
Rodolfo Ribeiro Gomes 4d2447
{
Rodolfo Ribeiro Gomes fa2e08
	size_t count = workspaces.erase(name);
Rodolfo Ribeiro Gomes fa2e08
	if (count > 0)
Rodolfo Ribeiro Gomes fa2e08
		signal_list_changed_.emit();
Rodolfo Ribeiro Gomes fa2e08
}
Rodolfo Ribeiro Gomes fa2e08
Rodolfo Ribeiro Gomes 66fd47
void WorkspaceHandler::clear()
Rodolfo Ribeiro Gomes 66fd47
{
Rodolfo Ribeiro Gomes fa2e08
	size_t previous_size = workspaces.size();
Rodolfo Ribeiro Gomes 66fd47
	workspaces.clear();
Rodolfo Ribeiro Gomes fa2e08
	if (previous_size > 0)
Rodolfo Ribeiro Gomes fa2e08
		signal_list_changed_.emit();
Rodolfo Ribeiro Gomes 4d2447
}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
bool
Rodolfo Ribeiro Gomes 4d2447
WorkspaceHandler::set_workspace(const std::string& name, const std::string& tpl)
Rodolfo Ribeiro Gomes 4d2447
{
Rodolfo Ribeiro Gomes 4d2447
	if (!is_valid_name(name) || tpl.empty())
Rodolfo Ribeiro Gomes 4d2447
		return false;
Rodolfo Ribeiro Gomes 4d2447
	std::string valid_name(name);
Rodolfo Ribeiro Gomes 4d2447
	trim_string(valid_name);
Rodolfo Ribeiro Gomes 4d2447
	if (!has_workspace(valid_name))
Rodolfo Ribeiro Gomes 4d2447
		return false;
Rodolfo Ribeiro Gomes 4d2447
	workspaces[valid_name] = tpl;
Rodolfo Ribeiro Gomes 4d2447
	return true;
Rodolfo Ribeiro Gomes 4d2447
}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
bool
Rodolfo Ribeiro Gomes 4d2447
WorkspaceHandler::get_workspace(const std::string& name, std::string& tpl) const
Rodolfo Ribeiro Gomes 4d2447
{
Rodolfo Ribeiro Gomes 4d2447
	auto it = workspaces.find(name);
Rodolfo Ribeiro Gomes 4d2447
	if (it == workspaces.end())
Rodolfo Ribeiro Gomes 4d2447
		return false;
Rodolfo Ribeiro Gomes 4d2447
	tpl = it->second;
Rodolfo Ribeiro Gomes 4d2447
	return true;
Rodolfo Ribeiro Gomes 4d2447
}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
void
Rodolfo Ribeiro Gomes 4d2447
WorkspaceHandler::get_name_list(std::vector<std::string>& list)</std::string>
Rodolfo Ribeiro Gomes 4d2447
{
Rodolfo Ribeiro Gomes ca9d76
	list.clear();
Rodolfo Ribeiro Gomes 4d2447
	for(auto it = workspaces.cbegin(); it != workspaces.cend(); ++it)
Rodolfo Ribeiro Gomes 4d2447
		list.push_back(it->first);
Rodolfo Ribeiro Gomes 4d2447
}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 66fd47
bool
Rodolfo Ribeiro Gomes 66fd47
WorkspaceHandler::save(const std::string& filename)
Rodolfo Ribeiro Gomes 4d2447
{
Rodolfo Ribeiro Gomes 4d2447
	std::ofstream ofs(filename);
Rodolfo Ribeiro Gomes 4d2447
	if (!ofs) {
Rodolfo Ribeiro Gomes 4d2447
		synfig::error(_("Can't save custom workspaces"));
Rodolfo Ribeiro Gomes 66fd47
		return false;
Rodolfo Ribeiro Gomes 4d2447
	}
Rodolfo Ribeiro Gomes 4d2447
	for (auto it = workspaces.begin(); it != workspaces.end(); ++it)
Rodolfo Ribeiro Gomes 4d2447
		ofs << it->first << "=" << it->second << std::endl;
Rodolfo Ribeiro Gomes 4d2447
	ofs.close();
Rodolfo Ribeiro Gomes 66fd47
	return true;
Rodolfo Ribeiro Gomes 4d2447
}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
void
Rodolfo Ribeiro Gomes 66fd47
WorkspaceHandler::load(const std::string& filename)
Rodolfo Ribeiro Gomes 4d2447
{
Rodolfo Ribeiro Gomes 4d2447
	std::ifstream ifs(filename);
Rodolfo Ribeiro Gomes 4d2447
	std::string line;
Rodolfo Ribeiro Gomes fa2e08
	int count = 0;
Rodolfo Ribeiro Gomes 4d2447
	while (ifs && !ifs.eof()) {
Rodolfo Ribeiro Gomes 4d2447
		getline(ifs, line);
Rodolfo Ribeiro Gomes 4d2447
		if (line.empty())
Rodolfo Ribeiro Gomes 4d2447
			continue;
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
		auto pos = line.find("=");
Rodolfo Ribeiro Gomes 4d2447
		if (pos == std::string::npos) {
Rodolfo Ribeiro Gomes 4d2447
			synfig::warning(_("ignoring malformed workspace line: %s"), line.c_str());
Rodolfo Ribeiro Gomes 4d2447
			continue;
Rodolfo Ribeiro Gomes 4d2447
		}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
		std::string name = line.substr(0, pos);
Rodolfo Ribeiro Gomes 4d2447
		if (has_workspace(name)) {
Rodolfo Ribeiro Gomes 4d2447
			synfig::warning(_("ignoring duplicated workspace name: %s"), name.c_str());
Rodolfo Ribeiro Gomes 4d2447
			continue;
Rodolfo Ribeiro Gomes 4d2447
		}
Rodolfo Ribeiro Gomes 4d2447
Rodolfo Ribeiro Gomes 4d2447
		std::string tpl = line.substr(pos+1);
Rodolfo Ribeiro Gomes 4d2447
		workspaces[name] = tpl;
Rodolfo Ribeiro Gomes fa2e08
		count++;
Rodolfo Ribeiro Gomes 4d2447
	}
Rodolfo Ribeiro Gomes fa2e08
	if (count > 0)
Rodolfo Ribeiro Gomes fa2e08
		signal_list_changed_.emit();
Rodolfo Ribeiro Gomes fa2e08
}
Rodolfo Ribeiro Gomes fa2e08
Rodolfo Ribeiro Gomes fa2e08
sigc::signal<void>& WorkspaceHandler::signal_list_changed()</void>
Rodolfo Ribeiro Gomes fa2e08
{
Rodolfo Ribeiro Gomes fa2e08
	return signal_list_changed_;
Rodolfo Ribeiro Gomes 4d2447
}