summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog/align-and-distribute.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/dialog/align-and-distribute.h')
-rw-r--r--src/ui/dialog/align-and-distribute.h223
1 files changed, 223 insertions, 0 deletions
diff --git a/src/ui/dialog/align-and-distribute.h b/src/ui/dialog/align-and-distribute.h
new file mode 100644
index 0000000..175ebdc
--- /dev/null
+++ b/src/ui/dialog/align-and-distribute.h
@@ -0,0 +1,223 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/** @file
+ * @brief Align and Distribute dialog
+ */
+/* Authors:
+ * Bryce W. Harrington <bryce@bryceharrington.org>
+ * Aubanel MONNIER <aubi@libertysurf.fr>
+ * Frank Felfe <innerspace@iname.com>
+ * Lauris Kaplinski <lauris@kaplinski.com>
+ *
+ * Copyright (C) 1999-2004, 2005 Authors
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#ifndef INKSCAPE_UI_DIALOG_ALIGN_AND_DISTRIBUTE_H
+#define INKSCAPE_UI_DIALOG_ALIGN_AND_DISTRIBUTE_H
+
+#include <list>
+#include "ui/widget/panel.h"
+#include "ui/widget/frame.h"
+
+#include <gtkmm/frame.h>
+#include <gtkmm/comboboxtext.h>
+#include <gtkmm/label.h>
+#include <gtkmm/checkbutton.h>
+#include <gtkmm/grid.h>
+
+#include "2geom/rect.h"
+#include "ui/dialog/desktop-tracker.h"
+
+class SPItem;
+
+namespace Inkscape {
+namespace UI {
+namespace Tools{
+class NodeTool;
+}
+namespace Dialog {
+
+class Action;
+
+
+class AlignAndDistribute : public Widget::Panel {
+public:
+ AlignAndDistribute();
+ ~AlignAndDistribute() override;
+
+ static AlignAndDistribute &getInstance() { return *new AlignAndDistribute(); }
+
+ Gtk::Grid &align_table(){return _alignTable;}
+ Gtk::Grid &distribute_table(){return _distributeTable;}
+ Gtk::Grid &rearrange_table(){return _rearrangeTable;}
+ Gtk::Grid &removeOverlap_table(){return _removeOverlapTable;}
+ Gtk::Grid &nodes_table(){return _nodesTable;}
+
+ void setMode(bool nodeEdit);
+
+ Geom::OptRect randomize_bbox;
+
+protected:
+
+ void on_ref_change();
+ void on_node_ref_change();
+ void on_selgrp_toggled();
+ void on_oncanvas_toggled();
+ void addDistributeButton(const Glib::ustring &id, const Glib::ustring tiptext,
+ guint row, guint col, bool onInterSpace,
+ Geom::Dim2 orientation, float kBegin, float kEnd);
+ void addAlignButton(const Glib::ustring &id, const Glib::ustring tiptext,
+ guint row, guint col);
+ void addNodeButton(const Glib::ustring &id, const Glib::ustring tiptext,
+ guint col, Geom::Dim2 orientation, bool distribute);
+ void addRemoveOverlapsButton(const Glib::ustring &id,
+ const Glib::ustring tiptext,
+ guint row, guint col);
+ void addGraphLayoutButton(const Glib::ustring &id,
+ const Glib::ustring tiptext,
+ guint row, guint col);
+ void addExchangePositionsButton(const Glib::ustring &id,
+ const Glib::ustring tiptext,
+ guint row, guint col);
+ void addExchangePositionsByZOrderButton(const Glib::ustring &id,
+ const Glib::ustring tiptext,
+ guint row, guint col);
+ void addExchangePositionsClockwiseButton(const Glib::ustring &id,
+ const Glib::ustring tiptext,
+ guint row, guint col);
+ void addUnclumpButton(const Glib::ustring &id, const Glib::ustring tiptext,
+ guint row, guint col);
+ void addRandomizeButton(const Glib::ustring &id, const Glib::ustring tiptext,
+ guint row, guint col);
+ void addBaselineButton(const Glib::ustring &id, const Glib::ustring tiptext,
+ guint row, guint col, Gtk::Grid &table, Geom::Dim2 orientation, bool distribute);
+ void setTargetDesktop(SPDesktop *desktop);
+
+ std::list<Action *> _actionList;
+ UI::Widget::Frame _alignFrame, _distributeFrame, _rearrangeFrame, _removeOverlapFrame, _nodesFrame;
+ Gtk::Grid _alignTable, _distributeTable, _rearrangeTable, _removeOverlapTable, _nodesTable;
+ Gtk::HBox _anchorBox;
+ Gtk::HBox _selgrpBox;
+ Gtk::VBox _alignBox;
+ Gtk::VBox _alignBoxNode;
+ Gtk::HBox _alignTableBox;
+ Gtk::HBox _distributeTableBox;
+ Gtk::HBox _rearrangeTableBox;
+ Gtk::HBox _removeOverlapTableBox;
+ Gtk::HBox _nodesTableBox;
+ Gtk::Label _anchorLabel;
+ Gtk::Label _anchorLabelNode;
+ Gtk::ToggleButton _selgrp;
+ Gtk::ToggleButton _oncanvas;
+ Gtk::ComboBoxText _combo;
+ Gtk::HBox _anchorBoxNode;
+ Gtk::ComboBoxText _comboNode;
+
+ SPDesktop *_desktop;
+ DesktopTracker _deskTrack;
+ sigc::connection _desktopChangeConn;
+ sigc::connection _toolChangeConn;
+ sigc::connection _selChangeConn;
+private:
+ AlignAndDistribute(AlignAndDistribute const &d) = delete;
+ AlignAndDistribute& operator=(AlignAndDistribute const &d) = delete;
+};
+
+
+struct BBoxSort
+{
+ SPItem *item;
+ float anchor;
+ Geom::Rect bbox;
+ BBoxSort(SPItem *pItem, Geom::Rect const &bounds, Geom::Dim2 orientation, double kBegin, double kEnd);
+ BBoxSort(const BBoxSort &rhs);
+};
+bool operator< (const BBoxSort &a, const BBoxSort &b);
+
+
+class Action {
+public :
+
+ enum AlignTarget { LAST=0, FIRST, BIGGEST, SMALLEST, PAGE, DRAWING, SELECTION };
+ enum AlignTargetNode { LAST_NODE=0, FIRST_NODE, MID_NODE, MIN_NODE, MAX_NODE };
+ Action(Glib::ustring id,
+ const Glib::ustring &tiptext,
+ guint row, guint column,
+ Gtk::Grid &parent,
+ AlignAndDistribute &dialog);
+
+ virtual ~Action()= default;
+
+ AlignAndDistribute &_dialog;
+
+private :
+ virtual void on_button_click(){}
+
+ Glib::ustring _id;
+ Gtk::Grid &_parent;
+};
+
+
+class ActionAlign : public Action {
+public :
+ struct Coeffs {
+ double mx0, mx1, my0, my1;
+ double sx0, sx1, sy0, sy1;
+ int verb_id;
+ };
+ ActionAlign(const Glib::ustring &id,
+ const Glib::ustring &tiptext,
+ guint row, guint column,
+ AlignAndDistribute &dialog,
+ guint coeffIndex):
+ Action(id, tiptext, row, column,
+ dialog.align_table(), dialog),
+ _index(coeffIndex),
+ _dialog(dialog)
+ {}
+
+ /*
+ * Static function called to align from a keyboard shortcut
+ */
+ static void do_verb_action(SPDesktop *desktop, int verb);
+ static int verb_to_coeff(int verb);
+
+private :
+
+
+ void on_button_click() override {
+ //Retrieve selected objects
+ SPDesktop *desktop = _dialog.getDesktop();
+ if (!desktop) return;
+
+ do_action(desktop, _index);
+ }
+
+ static void do_action(SPDesktop *desktop, int index);
+ static void do_node_action(Inkscape::UI::Tools::NodeTool *nt, int index);
+
+ guint _index;
+ AlignAndDistribute &_dialog;
+
+ static const Coeffs _allCoeffs[19];
+
+};
+
+
+} // namespace Dialog
+} // namespace UI
+} // namespace Inkscape
+
+#endif // INKSCAPE_UI_DIALOG_ALIGN_AND_DISTRIBUTE_H
+
+/*
+ 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:fileencoding=utf-8:textwidth=99 :