You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
155 lines
4.6 KiB
155 lines
4.6 KiB
#include "ToolbarModel.h" |
|
|
|
#include <fstream> |
|
|
|
#include "ToolbarData.h" |
|
#include "XojMsgBox.h" |
|
#include "filesystem.h" |
|
#include "i18n.h" |
|
|
|
using std::string; |
|
|
|
ToolbarModel::ToolbarModel() = default; |
|
|
|
ToolbarModel::~ToolbarModel() { |
|
for (ToolbarData* data: this->toolbars) { |
|
delete data; |
|
} |
|
this->toolbars.clear(); |
|
} |
|
|
|
auto ToolbarModel::getToolbars() -> std::vector<ToolbarData*>* { return &this->toolbars; } |
|
|
|
void ToolbarModel::parseGroup(GKeyFile* config, const char* group, bool predefined) { |
|
auto* data = new ToolbarData(predefined); |
|
|
|
data->name = (predefined ? "predef_" : "custom_"); |
|
data->id = group; |
|
|
|
data->load(config, group); |
|
|
|
add(data); |
|
} |
|
|
|
void ToolbarModel::remove(ToolbarData* data) { |
|
for (size_t i = 0; i < this->toolbars.size(); i++) { |
|
if (this->toolbars[i] == data) { |
|
this->toolbars.erase(this->toolbars.begin() + i); |
|
break; |
|
} |
|
} |
|
} |
|
|
|
void ToolbarModel::add(ToolbarData* data) { this->toolbars.push_back(data); } |
|
|
|
auto ToolbarModel::parse(fs::path const& filepath, bool predefined) -> bool { |
|
GKeyFile* config = g_key_file_new(); |
|
g_key_file_set_list_separator(config, ','); |
|
if (!g_key_file_load_from_file(config, filepath.u8string().c_str(), G_KEY_FILE_NONE, nullptr)) { |
|
g_key_file_free(config); |
|
return false; |
|
} |
|
|
|
gsize length = 0; |
|
gchar** groups = g_key_file_get_groups(config, &length); |
|
|
|
for (gsize i = 0; i < length; i++) { |
|
parseGroup(config, groups[i], predefined); |
|
} |
|
|
|
g_strfreev(groups); |
|
g_key_file_free(config); |
|
return true; |
|
} |
|
|
|
void ToolbarModel::initCopyNameId(ToolbarData* data) { |
|
for (int i = 0; i < 100; i++) { |
|
string id = data->getId() + " Copy"; |
|
|
|
if (i != 0) { |
|
id += " "; |
|
id += std::to_string(i); |
|
} |
|
|
|
if (!existsId(id)) { |
|
if (i != 0) { |
|
string filename = data->getName(); |
|
filename += " "; |
|
filename += _("Copy"); |
|
filename += " "; |
|
filename += std::to_string(i); |
|
|
|
data->setName(filename); |
|
} else { |
|
data->setName(data->getName() + " " + _("Copy")); |
|
} |
|
data->setId(id); |
|
break; |
|
} |
|
} |
|
} |
|
|
|
auto ToolbarModel::existsId(const string& id) -> bool { |
|
for (ToolbarData* data: this->toolbars) { |
|
if (data->getId() == id) { |
|
return true; |
|
} |
|
} |
|
return false; |
|
} |
|
|
|
|
|
const char* TOOLBAR_INI_HEADER = |
|
"# Xournal++ Toolbar configuration\n" |
|
"# Here you can customize the Toolbars\n" |
|
" Delete this file to generate a new config file with default values\n" |
|
"\n" |
|
" Available buttons:\n" |
|
" File: NEW,SAVE,OPEN,PRINT,SAVEPDF\n" |
|
"\n" |
|
" Edit: CUT,COPY,PASTE,SEARCH,UNDO,REDO,INSERT_NEW_PAGE\n" |
|
"\n" |
|
" Navigation: GOTO_FIRST,GOTO_BACK,GOTO_NEXT,GOTO_LAST,GOTO_NEXT_ANNOTATED_PAGE\n" |
|
"\n" |
|
" Zoom: ZOOM_OUT,ZOOM_IN,ZOOM_FIT,ZOOM_100,FULLSCREEN,PAIRED_PAGES\n" |
|
"\n" |
|
" Color: " |
|
"COLOR(0xffffff),COLOR(0xffff00),COLOR(0xff8000),COLOR(0xff00ff),COLOR(0x00ff00),COLOR(0x00c0ff),COLOR(" |
|
"0x808080),COLOR(0x008000),COLOR(0xff0000),COLOR(0x3333cc),COLOR(0x000000),COLOR_SELECT\n" |
|
" Notice: This are the default Xournal colors, each other color in HEX can also be used, eg COLOR(0x12ABCF);\n" |
|
"\n" |
|
" Tools: ERASER,PEN,HIGHLIGHTER,IMAGE,TEXT,IMAGE,SELECT,SELECT_REGION,SELECT_RECTANGLE,VERTICAL_SPACE,HAND\n" |
|
" Notice: ERASER also has a drop down menu to select the eraser type, SELECT are all selection tools, with " |
|
"drop down menu\n" |
|
"\n" |
|
" Tool settings: SHAPE_RECOGNIZER,RULER,FINE,MEDIUM,THICK,SELECT_FONT\n" |
|
"\n" |
|
" Components: PAGE_SPIN,ZOOM_SLIDER,LAYER\n" |
|
" PAGE_SPIN: The page spiner, incl. current page label\n" |
|
" ZOOM_SLIDER: The zoom slider\n" |
|
" LAYER: The layer dropdown menu\n" |
|
"\n"; |
|
|
|
void ToolbarModel::save(fs::path const& filepath) { |
|
GKeyFile* config = g_key_file_new(); |
|
g_key_file_set_list_separator(config, ','); |
|
|
|
g_key_file_set_comment(config, nullptr, nullptr, TOOLBAR_INI_HEADER, nullptr); |
|
|
|
for (ToolbarData* data: this->toolbars) { |
|
if (!data->isPredefined()) { |
|
data->saveToKeyFile(config); |
|
} |
|
} |
|
|
|
gsize len = 0; |
|
char* data = g_key_file_to_data(config, &len, nullptr); |
|
|
|
GError* error = nullptr; |
|
if (!g_file_set_contents(filepath.u8string().c_str(), data, len, &error)) { |
|
XojMsgBox::showErrorToUser(nullptr, error->message); |
|
g_error_free(error); |
|
} |
|
|
|
g_free(data); |
|
}
|
|
|