|
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 |
}
|