/*Julien LERAY (julien.leray@ecl2010.ec-lyon.fr), interface for the spray tool*/ #ifdef HAVE_CONFIG_H # include #endif #include #include "desktop-handles.h" #include "unclump.h" #include "document.h" #include "enums.h" #include "graphlayout/graphlayout.h" #include "inkscape.h" #include "macros.h" #include "node-context.h" #include "preferences.h" #include "removeoverlap/removeoverlap.h" #include "selection.h" #include "shape-editor.h" #include "sp-flowtext.h" #include "sp-item-transform.h" #include "sp-text.h" #include "text-editing.h" #include "tools-switch.h" #include "ui/icon-names.h" #include "util/glib-list-iterators.h" #include "verbs.h" #include "widgets/icon.h" #include "spray-option.h" namespace Inkscape { namespace UI { namespace Dialog { //Classes qui permettent de créer les environnements Gaussienne, Witdh... class Action { public: Action(const Glib::ustring &id, const Glib::ustring &/*tiptext*/, guint /*row*/, guint /*column*/, Gtk::Table &parent, Gtk::Tooltips &/*tooltips*/, SprayOptionClass &dialog): _dialog(dialog), _id(id), _parent(parent) {} virtual ~Action(){} virtual void on_button_click(){} SprayOptionClass &_dialog; private : Glib::ustring _id; Gtk::Table &_parent; }; class ActionE : public Action { private: Gtk::Label _Label; Gtk::SpinButton _Gap; guint _min, _max; Glib::ustring _pref_path; public: ActionE(const Glib::ustring &id, const Glib::ustring &tiptext, guint row, guint column, SprayOptionClass &dialog, guint min, guint max, Glib::ustring const &pref_path ): Action(id, tiptext, row, column, dialog._Table(), dialog.tooltips(), dialog), _min(min), _max(max), _pref_path(pref_path) { dialog._Table().set_col_spacings(3); double increm = ((double)_max - (double)_min)/10; double val_ini = ((double)_max + (double)_min)/2; _Gap.set_digits(1); _Gap.set_size_request(60, -1); _Gap.set_increments(increm , 0); _Gap.set_range(_min, _max); _Gap.set_value(val_ini); dialog.tooltips().set_tip(_Gap, tiptext); _Gap.signal_changed().connect(sigc::mem_fun(*this, &ActionE::on_button_click)); //rajout douteux _Label.set_label(id); dialog._Table().attach(_Label, column, column+1, row, row+1, Gtk::FILL, Gtk::FILL); dialog._Table().attach(_Gap, column+1, column+2, row, row+1, Gtk::EXPAND, Gtk::EXPAND); } virtual void on_button_click(){ if (!_dialog.getDesktop()) return; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); prefs->setDouble(_pref_path, SP_VERB_CONTEXT_SPRAY); double const Gap = _Gap.get_value(); prefs->setDouble(_pref_path, Gap); sp_document_done(sp_desktop_document(_dialog.getDesktop()), SP_VERB_CONTEXT_SPRAY, _("Remove overlaps")); } }; class ActionF : public Action { private: Gtk::Label _Label; Gtk::Label _Label1; Gtk::Label _Label2; Gtk::SpinButton _Gap1; Gtk::SpinButton _Gap2; Glib::ustring _pref1_path; Glib::ustring _pref2_path; public: ActionF(const Glib::ustring &id, const Glib::ustring &tiptext, guint row, guint column, SprayOptionClass &dialog, Glib::ustring const &pref1_path, Glib::ustring const &pref2_path ): Action(id, tiptext, row, column, dialog._Table(), dialog.tooltips(), dialog), _pref1_path(pref1_path), _pref2_path(pref2_path) { dialog.F_Table().set_col_spacings(3); _Label.set_label(id); _Gap1.set_digits(1); _Gap1.set_size_request(60, -1); _Gap1.set_increments(0.1, 0); _Gap1.set_range(0, 10); _Gap1.set_value(1); dialog.tooltips().set_tip(_Gap1, _("Minimum")); _Label1.set_label(Q_("Min")); _Gap2.set_digits(1); _Gap2.set_size_request(60, -1); _Gap2.set_increments(0.1, 0); _Gap2.set_range(0, 10); _Gap2.set_value(1); dialog.tooltips().set_tip(_Gap2, _("Maximum")); _Label2.set_label(_("Max:")); _Gap1.signal_changed().connect(sigc::mem_fun(*this, &ActionF::on_button_click)); _Gap2.signal_changed().connect(sigc::mem_fun(*this, &ActionF::on_button_click)); dialog.F_Table().attach(_Label, column, column+1, row, row+1, Gtk::FILL, Gtk::FILL); dialog.F_Table().attach(_Label1, column+1, column+2, row, row+1, Gtk::FILL, Gtk::FILL); dialog.F_Table().attach(_Gap1, column+2, column+3, row, row+1, Gtk::EXPAND, Gtk::EXPAND); dialog.F_Table().attach(_Label2, column+3, column+4, row, row+1, Gtk::FILL, Gtk::FILL); dialog.F_Table().attach(_Gap2, column+4, column+5, row, row+1, Gtk::EXPAND, Gtk::EXPAND); } virtual void on_button_click(){ if (!_dialog.getDesktop()) return; Inkscape::Preferences *prefs = Inkscape::Preferences::get(); prefs->setDouble(_pref1_path, SP_VERB_CONTEXT_SPRAY); prefs->setDouble(_pref2_path, SP_VERB_CONTEXT_SPRAY); double const Gap1 = _Gap1.get_value(); double const Gap2 = _Gap2.get_value(); prefs->setDouble(_pref1_path, Gap1); prefs->setDouble(_pref2_path, Gap2); sp_document_done(sp_desktop_document(_dialog.getDesktop()), SP_VERB_CONTEXT_SPRAY, _("Remove overlaps")); } }; void SprayOptionClass::combo_action() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); cout<<"combo.get_active_row_number = "<<_combo.get_active_row_number()<setInt("/tools/spray/distribution", distrib); sp_document_done(sp_desktop_document(this->getDesktop()), SP_VERB_CONTEXT_SPRAY, _("Remove overlaps")); } void SprayOptionClass::action() { for (list::iterator it = _actionList.begin(); it != _actionList.end(); ++it) { (*it)->on_button_click(); } combo_action(); } void on_selection_changed(Inkscape::Application */*inkscape*/, Inkscape::Selection */*selection*/, SprayOptionClass *daad) { daad->randomize_bbox = Geom::OptRect(); } ///////////////////////////////////////////////////////// //Construction de l'interface ///////////////////////////////////////////////////////// SprayOptionClass::SprayOptionClass() : UI::Widget::Panel ("", "/dialogs/spray", SP_VERB_DIALOG_SPRAY_OPTION), _actionList(), _distributionFrame(Q_("sprayOptions|Distribution")), _Frame(Q_("sprayOptions|Cursor Options")), _FFrame(Q_("sprayOptions|Random Options")), _distributionTable(), _gaussianTable(1, 5, false), _ETable(3,2,false), _FTable(2,5,false), _anchorBox(), _unifBox(), _gaussianBox(), _HBox(), _FHBox(), _BoutonBox(), _distributionBox(), _VBox(), _FVBox(), _ActionBox(), _anchorLabel(Q_("sprayOptions|Distribution:")), _unifLabel(Q_("sprayOptions|Uniform")), _gaussLabel(Q_("sprayOptions|Gaussian")), _Label(), _FLabel(), _unif(), _gauss(), _combo(), _tooltips() { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); //ComboBoxText _combo.append_text(Q_("sprayOptions|Uniform")); _combo.append_text(Q_("sprayOptions|Gaussian")); _combo.set_active(prefs->getInt("/tools/spray/distribution", 1)); _combo.signal_changed().connect(sigc::mem_fun(*this, &SprayOptionClass::combo_action)); _anchorBox.pack_start(_anchorLabel); _anchorBox.pack_start(_combo); _gaussianBox.pack_start(_anchorBox); _distributionBox.pack_start(_gaussianBox); _distributionFrame.add(_distributionBox); //Hbox Random addFButton(Q_("sprayOptions|Scale:") ,_("Apply a scale factor"), 0, 0, "/tools/spray/scale_min","/tools/spray/scale_max"); addFButton(Q_("sprayOptions|Rotation:") ,_("Apply rotation"), 1, 0, "/tools/spray/rot_min","/tools/spray/rot_max"); _FHBox.pack_start(_FLabel); _FHBox.pack_start(_FTable); //Implementation dans la Vbox Cursor _FVBox.pack_start(_FHBox); _FFrame.add(_FVBox); //Hbox Cursor addEButton(Q_("sprayOptions|Ratio:") ,_("Eccentricity of the ellipse"), 0, 0, 0, 1,"/tools/spray/ratio"); addEButton(Q_("sprayOptions|Angle:") ,_("Angle of the ellipse"), 1, 0, 0, 5,"/tools/spray/tilt"); addEButton(Q_("sprayOptions|Width:") ,_("Size of the ellipse"), 2, 0, 0, 1,"/tools/spray/width"); _HBox.pack_start(_Label); _HBox.pack_start(_ETable); //Implementation dans la Vbox Cursor _VBox.pack_start(_HBox); _Frame.add(_VBox); Gtk::Box *contents = _getContents(); contents->set_spacing(4); // Crée dans l'ordre suivant les différentes Frames (cadres de réglages) contents->pack_start(_distributionFrame, true, true); contents->pack_start(_FFrame, true, true); contents->pack_start(_Frame, true, true); // Connect to the global selection change, to invalidate cached randomize_bbox g_signal_connect (G_OBJECT (INKSCAPE), "change_selection", G_CALLBACK (on_selection_changed), this); randomize_bbox = Geom::OptRect(); show_all_children(); } SprayOptionClass::~SprayOptionClass() { sp_signal_disconnect_by_data (G_OBJECT (INKSCAPE), this); for (std::list::iterator it = _actionList.begin(); it != _actionList.end(); it ++) delete *it; } //Fonctions qui lient la demande d'ajout d'une interface graphique à l'action correspondante void SprayOptionClass::addEButton(const Glib::ustring &id, const Glib::ustring &tiptext, guint row, guint column, guint min, guint max, Glib::ustring const &pref_path) { _actionList.push_back( new ActionE(id, tiptext,row, column,*this,min ,max, pref_path )); } void SprayOptionClass::addFButton(const Glib::ustring &id, const Glib::ustring &tiptext, guint row, guint column, Glib::ustring const &pref1_path, Glib::ustring const &pref2_path) { _actionList.push_back( new ActionF(id, tiptext,row, column,*this,pref1_path, pref2_path )); } SprayOptionClass &SprayOptionClass::get_SprayOptionClass() { return *this; } } // namespace Dialog } // namespace UI } // namespace Inkscape /* Local Variables: mode:c++ c-file-style:"stroustrup" c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +)) indent-tabs-mode:nil fill-column:99 End: */ // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :