/* === S Y N F I G ========================================================= */
/*! \file dialogs/dialog_template.cpp
** \brief Dialog design list and panel template Implementation
**
** $Id$
**
** \legal
** Copyright (c) 2002-2005 Robert B. Quattlebaum Jr., Adrian Bentley
** Copyright (c) 2016 Jerome Blanchi
**
** This package 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 package 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.
** \endlegal
*/
/* ========================================================================= */
/* === H E A D E R S ======================================================= */
#ifdef USING_PCH
# include "pch.h"
#else
#ifdef HAVE_CONFIG_H
# include <config.h>
#endif
#include "dialog_template.h"
#include <gtkmm/eventbox.h>
#include <gui/localization.h>
#endif
/* === U S I N G =========================================================== */
using namespace synfig;
using namespace std;
using namespace studio;
/* === M A C R O S ========================================================= */
// TODO Group All HARDCODED user interface information somewhere "global"
// TODO All UI info from .rc
#define DIALOG_TEMPLATE_UI_INIT_GRID(grid) \
grid->set_orientation(Gtk::ORIENTATION_HORIZONTAL); \
grid->set_row_spacing(6); \
grid->set_column_spacing(12); \
grid->set_border_width(8); \
grid->set_column_homogeneous(false);
/* === G L O B A L S ======================================================= */
/* === P R O C E D U R E S ================================================= */
/* === M E T H O D S ======================================================= */
Dialog_Template::Dialog_Template(Gtk::Window& parent, synfig::String dialog_title):
Dialog(dialog_title.c_str(),parent,true),
page_index(0)
{
// Setup the buttons
Gtk::Button *restore_button(manage(new class Gtk::Button(_("Restore Defaults"))));
restore_button->show();
add_action_widget(*restore_button,1);
restore_button->signal_clicked().connect(sigc::mem_fun(*this, &Dialog_Template::on_restore_pressed));
Gtk::Button *cancel_button(manage(new class Gtk::Button(Gtk::StockID("gtk-cancel"))));
cancel_button->show();
add_action_widget(*cancel_button,0);
cancel_button->signal_clicked().connect(sigc::mem_fun(*this, &Dialog_Template::hide));
Gtk::Button *ok_button(manage(new class Gtk::Button(Gtk::StockID("gtk-ok"))));
ok_button->show();
add_action_widget(*ok_button,2);
ok_button->signal_clicked().connect(sigc::mem_fun(*this, &Dialog_Template::on_ok_pressed));
//! TODO Make global this design to being used else where in other dialogs
//! TODO UI design information to .rc
// Style for title and section
Pango::AttrInt attr = Pango::Attribute::create_attr_weight(Pango::WEIGHT_BOLD);
//! Nota section_attrlist also use for BOLDING " X " string in document page
section_attrlist.insert(attr);
title_attrlist.insert(attr);
Pango::AttrInt pango_size(Pango::Attribute::create_attr_size(Pango::SCALE*26));
title_attrlist.change(pango_size);
// create negative foreground/background attributes
Gdk::RGBA colorcontext(get_style_context()->get_color());
Gdk::RGBA bgcolorcontext(get_style_context()->get_background_color());
Pango::AttrColor bgcolor = Pango::Attribute::create_attr_background(colorcontext.get_red_u(),
colorcontext.get_green_u(),
colorcontext.get_blue_u()
);
title_attrlist.change(bgcolor);
Pango::AttrColor color = Pango::Attribute::create_attr_foreground(bgcolorcontext.get_red_u(),
bgcolorcontext.get_green_u(),
bgcolorcontext.get_blue_u()
);
title_attrlist.change(color);
// Notebook
notebook=manage(new class Gtk::Notebook());
// Main preferences notebook
notebook->set_show_tabs (false);
notebook->set_show_border (false);
{
// WARNING FIXED ORDER : the page added to notebook same has treeview (see create_xxxx_page() upper)
categories_reftreemodel = Gtk::TreeStore::create(categories);
categories_treeview.set_model(categories_reftreemodel);
categories_treeview.set_headers_visible(false);
categories_treeview.append_column(_("Category"), categories.category_name);
categories_treeview.get_selection()->signal_changed().connect(
sigc::mem_fun(*this, &Dialog_Template::on_treeviewselection_changed));
categories_scrolledwindow.add(categories_treeview);
categories_scrolledwindow.set_size_request(-1, 80);
categories_scrolledwindow.set_policy(Gtk::POLICY_NEVER, Gtk::POLICY_AUTOMATIC);
}
main_grid.attach(categories_scrolledwindow, 0, 0, 1 ,1);
notebook->show_all();
main_grid.attach(*notebook, 1, 0, 1, 1);
main_grid.set_border_width(6);
//! TODO create a warning zone to push message on rare events (like no brush path, zero fps ...)
//! this warning zone could also hold normal message like : "x change to come" (and a link to "Changes summary" page)
get_vbox()->pack_start(main_grid);
get_vbox()->set_border_width(12);
show_all_children();
}
Dialog_Template::~Dialog_Template()
{
}
void
Dialog_Template::on_ok_pressed()
{
on_apply_pressed();
hide();
}
void
Dialog_Template::on_treeviewselection_changed()
{
if(const Gtk::TreeModel::iterator iter = categories_treeview.get_selection()->get_selected())
{
notebook->set_current_page((int) ((*iter)[categories.category_id]));
}
}
void
Dialog_Template::attach_label(Gtk::Grid *grid, synfig::String str, guint row)
{
Gtk::Label* label(manage(new Gtk::Label((str + ":").c_str())));
label->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
label->set_margin_start(10);
grid->attach(*label, 0, row, 1, 1);
}
void
Dialog_Template::attach_label_section(Gtk::Grid *grid, synfig::String str, guint row)
{
Gtk::Label* label(manage(new Gtk::Label(str)));
label->set_attributes(section_attrlist);
label->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
grid->attach(*label, 0, row, 1, 1);
}
void
Dialog_Template::attach_label_title(Gtk::Grid *grid, synfig::String str)
{
Gtk::Label* label(manage(new Gtk::Label(str)));
label->set_attributes(title_attrlist);
label->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
label->set_margin_start(20);
Gtk::EventBox* box(manage(new Gtk::EventBox()));
box->add(*label);
box->override_background_color(get_style_context()->get_color());
grid->attach(*box, 0, 0, 1, 1);
}
Gtk::Label*
Dialog_Template::attach_label(Gtk::Grid *grid, synfig::String str, guint row, guint col, bool endstring)
{
str = endstring?str+":":str;
Gtk::Label* label(manage(new Gtk::Label(str)));
label->set_alignment(Gtk::ALIGN_START, Gtk::ALIGN_CENTER);
grid->attach(*label, col, row, 1, 1);
return label;
}
Dialog_Template::PageInfo
Dialog_Template::add_page(synfig::String page_title)
{
Dialog_Template::PageInfo pageinfo;
pageinfo.grid=manage(new Gtk::Grid());
Gtk::Grid *page_grid=manage(new Gtk::Grid());
DIALOG_TEMPLATE_UI_INIT_GRID(pageinfo.grid);
notebook->append_page(*page_grid,page_title);
attach_label_title(page_grid,page_title);
page_grid->attach(*(pageinfo.grid), 0,1,1,1);
pageinfo.row = *(categories_reftreemodel->append());
pageinfo.row[categories.category_id] = page_index++;
pageinfo.row[categories.category_name] = page_title;
return pageinfo;
}
Dialog_Template::PageInfo
Dialog_Template::add_child_page(synfig::String page_title, Gtk::TreeRow parentrow)
{
Dialog_Template::PageInfo pageinfo;
pageinfo.grid=manage(new Gtk::Grid());
Gtk::Grid *page_grid=manage(new Gtk::Grid());
DIALOG_TEMPLATE_UI_INIT_GRID(pageinfo.grid);
notebook->append_page(*page_grid,page_title);
attach_label_title(page_grid,page_title);
page_grid->attach(*(pageinfo.grid), 0,1,1,1);
pageinfo.row = *(categories_reftreemodel->append(parentrow.children()));
pageinfo.row[categories.category_id] = page_index++;
pageinfo.row[categories.category_name] = page_title;
categories_treeview.expand_all();
return pageinfo;
}