/*
* GChemPaint selection plugin
* groupdlg.cc
*
* Copyright (C) 2004-2007 Jean Bréfort <jean.brefort@normalesup.org>
*
* 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., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301
* USA
*/
#include "gchempaint-config.h"
#include "groupdlg.h"
#include "selectiontool.h"
#include <lib/application.h>
#include <lib/document.h>
#include <lib/theme.h>
#include <lib/widgetdata.h>
static void on_align_toggled (gcpGroupDlg *dlg)
{
dlg->OnAlignToggled ();
}
static void on_space_toggled (gcpGroupDlg *dlg)
{
dlg->OnSpaceToggled ();
}
gcpGroupDlg::gcpGroupDlg (gcpDocument *Doc, gcpGroup *group):
Dialog (Doc->GetApplication (), GLADEDIR"/group.glade", "group", Doc)
{
if (!xml) {
delete this;
return;
}
m_Group = group;
m_Doc = Doc;
m_Data = (gcpWidgetData*) g_object_get_data (G_OBJECT (Doc->GetWidget ()), "data");
align_box = GTK_COMBO_BOX (glade_xml_get_widget (xml, "align_type"));
align_btn = GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "align_btn"));
group_btn = GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "group_btn"));
space_btn = GTK_TOGGLE_BUTTON (glade_xml_get_widget (xml, "space"));
padding_btn = GTK_SPIN_BUTTON (glade_xml_get_widget (xml, "padding"));
dist_lbl = glade_xml_get_widget (xml, "dist_lbl");
if (group) {
gtk_toggle_button_set_active (group_btn, true);
gcpAlignType type;
bool aligned = group->GetAlignType (type);
gtk_toggle_button_set_active (align_btn, aligned);
if (!aligned) {
gtk_widget_set_sensitive (GTK_WIDGET (align_box), false);
gtk_widget_set_sensitive (GTK_WIDGET (padding_btn), false);
gtk_toggle_button_set_active (space_btn, false);
} else {
SetAlignType (type);
double padding;
bool spaced = group->GetPadding (padding);
gtk_toggle_button_set_active (space_btn, spaced);
if (spaced)
gtk_spin_button_set_value (padding_btn, padding);
else
gtk_widget_set_sensitive (GTK_WIDGET (padding_btn), false);
}
} else {
gcpTheme *pTheme = Doc->GetTheme ();
gtk_combo_box_set_active (align_box, 0);
gtk_spin_button_set_value (padding_btn, pTheme->GetObjectPadding () / pTheme->GetZoomFactor ());
}
g_signal_connect_swapped (align_btn, "toggled", G_CALLBACK (on_align_toggled), this);
g_signal_connect_swapped (space_btn, "toggled", G_CALLBACK (on_space_toggled), this);
}
gcpGroupDlg::~gcpGroupDlg ()
{
}
void gcpGroupDlg::SetAlignType (gcpAlignType type)
{
gtk_combo_box_set_active (align_box, type);
}
bool gcpGroupDlg::Apply ()
{
std::list<Object*>::iterator i, end;
bool align = gtk_toggle_button_get_active (align_btn);
bool group = gtk_toggle_button_get_active (group_btn);
bool space = gtk_toggle_button_get_active (space_btn);
gcpAlignType align_type = (gcpAlignType) gtk_combo_box_get_active (align_box);
double padding = gtk_spin_button_get_value (padding_btn);
gcpOperation *pOp = m_Doc->GetNewOperation (GCP_MODIFY_OPERATION);
if (m_Group)
pOp->AddObject (m_Group, 0);
else {
end = m_Data->SelectedObjects.end ();
for (i = m_Data->SelectedObjects.begin (); i!= end; i++)
pOp->AddObject (*i, 0);
}
if (!m_Group) {
m_Group = new gcpGroup ();
m_Group->SetParent (m_Doc);
for (i = m_Data->SelectedObjects.begin (); i!= end; i++)
(*i)->SetParent (m_Group);
m_Data->UnselectAll ();
m_Data->SetSelected (m_Group);
}
// align objects now
if (align) {
m_Group->SetAligned (align_type);
if (space)
m_Group->SetPadding (padding);
m_Group->GetParent ()->EmitSignal (OnChangedSignal);
}
if (!group && m_Group) {
bool selected = m_Data->IsSelected (m_Group);
if (selected)
m_Data->Unselect (m_Group);
map< string, Object * >::iterator j;
Object *obj = m_Group->GetFirstChild (j);
while (obj) {
pOp->AddObject (obj, 1);
if (selected)
m_Data->SetSelected (obj);
obj = m_Group->GetNextChild (j);
}
obj = m_Group->GetParent();
delete m_Group;
obj->EmitSignal (OnChangedSignal);
m_Group = NULL;
}
if (m_Group)
pOp->AddObject (m_Group, 1);
m_Doc->FinishOperation ();
// Update clipboard stuff
gcpApplication *app = m_Doc->GetApplication ();
gcpSelectionTool *tool = (gcpSelectionTool*) app->GetTool ("Select");
if (tool)
tool->AddSelection (m_Data);
return true;
}
void gcpGroupDlg::OnAlignToggled ()
{
if (gtk_toggle_button_get_active (align_btn)) {
gtk_widget_set_sensitive (GTK_WIDGET (align_box), true);
gtk_widget_set_sensitive (GTK_WIDGET (space_btn), true);
gtk_widget_set_sensitive (GTK_WIDGET (padding_btn), true);
} else {
gtk_widget_set_sensitive (GTK_WIDGET (align_box), false);
gtk_toggle_button_set_active (space_btn, false);
gtk_widget_set_sensitive (GTK_WIDGET (space_btn), false);
}
}
void gcpGroupDlg::OnSpaceToggled ()
{
if (gtk_toggle_button_get_active (space_btn)) {
gtk_widget_set_sensitive (GTK_WIDGET (padding_btn), true);
gtk_widget_set_sensitive (dist_lbl, true);
} else {
gtk_widget_set_sensitive (GTK_WIDGET (padding_btn), false);
gtk_widget_set_sensitive (dist_lbl, false);
}
}
syntax highlighted by Code2HTML, v. 0.9.1