From d3fe030dee922e805ab5188ae903c14215346f41 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Fri, 26 Jun 2020 00:24:50 +0100 Subject: [PATCH 1/5] First pass at Gtkmm toolboxes (Crashes on start) --- src/ui/toolbar/arc-toolbar.cpp | 5 +- src/ui/toolbar/arc-toolbar.h | 2 +- src/ui/toolbar/box3d-toolbar.cpp | 5 +- src/ui/toolbar/box3d-toolbar.h | 2 +- src/ui/toolbar/calligraphy-toolbar.cpp | 5 +- src/ui/toolbar/calligraphy-toolbar.h | 2 +- src/ui/toolbar/connector-toolbar.cpp | 7 +- src/ui/toolbar/connector-toolbar.h | 2 +- src/ui/toolbar/dropper-toolbar.cpp | 5 +- src/ui/toolbar/dropper-toolbar.h | 2 +- src/ui/toolbar/eraser-toolbar.cpp | 5 +- src/ui/toolbar/eraser-toolbar.h | 2 +- src/ui/toolbar/gradient-toolbar.cpp | 5 +- src/ui/toolbar/gradient-toolbar.h | 2 +- src/ui/toolbar/lpe-toolbar.cpp | 5 +- src/ui/toolbar/lpe-toolbar.h | 2 +- src/ui/toolbar/measure-toolbar.cpp | 7 +- src/ui/toolbar/measure-toolbar.h | 2 +- src/ui/toolbar/mesh-toolbar.cpp | 5 +- src/ui/toolbar/mesh-toolbar.h | 2 +- src/ui/toolbar/node-toolbar.cpp | 7 +- src/ui/toolbar/node-toolbar.h | 2 +- src/ui/toolbar/paintbucket-toolbar.cpp | 5 +- src/ui/toolbar/paintbucket-toolbar.h | 2 +- src/ui/toolbar/pencil-toolbar.cpp | 10 +- src/ui/toolbar/pencil-toolbar.h | 4 +- src/ui/toolbar/rect-toolbar.cpp | 5 +- src/ui/toolbar/rect-toolbar.h | 2 +- src/ui/toolbar/select-toolbar.cpp | 5 +- src/ui/toolbar/select-toolbar.h | 2 +- src/ui/toolbar/snap-toolbar.cpp | 5 +- src/ui/toolbar/snap-toolbar.h | 2 +- src/ui/toolbar/spiral-toolbar.cpp | 5 +- src/ui/toolbar/spiral-toolbar.h | 2 +- src/ui/toolbar/spray-toolbar.cpp | 5 +- src/ui/toolbar/spray-toolbar.h | 2 +- src/ui/toolbar/star-toolbar.cpp | 5 +- src/ui/toolbar/star-toolbar.h | 2 +- src/ui/toolbar/text-toolbar.cpp | 5 +- src/ui/toolbar/text-toolbar.h | 2 +- src/ui/toolbar/toolbar.cpp | 5 +- src/ui/toolbar/toolbar.h | 2 +- src/ui/toolbar/tweak-toolbar.cpp | 5 +- src/ui/toolbar/tweak-toolbar.h | 2 +- src/ui/toolbar/zoom-toolbar.cpp | 5 +- src/ui/toolbar/zoom-toolbar.h | 2 +- src/ui/uxmanager.cpp | 18 +- src/ui/uxmanager.h | 6 +- src/widgets/desktop-widget.cpp | 76 +++--- src/widgets/desktop-widget.h | 8 +- src/widgets/toolbox.cpp | 350 +++++++++++-------------- src/widgets/toolbox.h | 21 +- 52 files changed, 308 insertions(+), 345 deletions(-) diff --git a/src/ui/toolbar/arc-toolbar.cpp b/src/ui/toolbar/arc-toolbar.cpp index fc5d48ec82..ddda3172e8 100644 --- a/src/ui/toolbar/arc-toolbar.cpp +++ b/src/ui/toolbar/arc-toolbar.cpp @@ -221,11 +221,10 @@ ArcToolbar::~ArcToolbar() } } -GtkWidget * +Toolbar * ArcToolbar::create(SPDesktop *desktop) { - auto toolbar = new ArcToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new ArcToolbar(desktop); } void diff --git a/src/ui/toolbar/arc-toolbar.h b/src/ui/toolbar/arc-toolbar.h index b0b04500b9..9bd0d14d17 100644 --- a/src/ui/toolbar/arc-toolbar.h +++ b/src/ui/toolbar/arc-toolbar.h @@ -100,7 +100,7 @@ protected: ~ArcToolbar() override; public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); static void event_attr_changed(Inkscape::XML::Node *repr, gchar const *name, gchar const *old_value, diff --git a/src/ui/toolbar/box3d-toolbar.cpp b/src/ui/toolbar/box3d-toolbar.cpp index fe6201748a..73b9cc579d 100644 --- a/src/ui/toolbar/box3d-toolbar.cpp +++ b/src/ui/toolbar/box3d-toolbar.cpp @@ -173,11 +173,10 @@ Box3DToolbar::Box3DToolbar(SPDesktop *desktop) show_all(); } -GtkWidget * +Toolbar * Box3DToolbar::create(SPDesktop *desktop) { - auto toolbar = new Box3DToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new Box3DToolbar(desktop); } void diff --git a/src/ui/toolbar/box3d-toolbar.h b/src/ui/toolbar/box3d-toolbar.h index 8ba7872d91..52f8ee2f94 100644 --- a/src/ui/toolbar/box3d-toolbar.h +++ b/src/ui/toolbar/box3d-toolbar.h @@ -93,7 +93,7 @@ protected: ~Box3DToolbar() override; public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); static void event_attr_changed(Inkscape::XML::Node *repr, gchar const *name, gchar const *old_value, diff --git a/src/ui/toolbar/calligraphy-toolbar.cpp b/src/ui/toolbar/calligraphy-toolbar.cpp index 5f0ecfcb22..3b535587f2 100644 --- a/src/ui/toolbar/calligraphy-toolbar.cpp +++ b/src/ui/toolbar/calligraphy-toolbar.cpp @@ -267,11 +267,10 @@ CalligraphyToolbar::CalligraphyToolbar(SPDesktop *desktop) show_all(); } -GtkWidget * +Toolbar * CalligraphyToolbar::create(SPDesktop *desktop) { - auto toolbar = new CalligraphyToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new CalligraphyToolbar(desktop); } void diff --git a/src/ui/toolbar/calligraphy-toolbar.h b/src/ui/toolbar/calligraphy-toolbar.h index d2168888c3..a3141ce2d1 100644 --- a/src/ui/toolbar/calligraphy-toolbar.h +++ b/src/ui/toolbar/calligraphy-toolbar.h @@ -93,7 +93,7 @@ protected: CalligraphyToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } diff --git a/src/ui/toolbar/connector-toolbar.cpp b/src/ui/toolbar/connector-toolbar.cpp index 5a964f2867..228aa7871d 100644 --- a/src/ui/toolbar/connector-toolbar.cpp +++ b/src/ui/toolbar/connector-toolbar.cpp @@ -183,12 +183,11 @@ ConnectorToolbar::ConnectorToolbar(SPDesktop *desktop) show_all(); } -GtkWidget * +Toolbar * ConnectorToolbar::create( SPDesktop *desktop) { - auto toolbar = new ConnectorToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); -} // end of ConnectorToolbar::prep() + return new ConnectorToolbar(desktop); +} // end of ConnectorToolbar::create() void ConnectorToolbar::path_set_avoid() diff --git a/src/ui/toolbar/connector-toolbar.h b/src/ui/toolbar/connector-toolbar.h index 66df79ee93..0cbe30a560 100644 --- a/src/ui/toolbar/connector-toolbar.h +++ b/src/ui/toolbar/connector-toolbar.h @@ -76,7 +76,7 @@ protected: ConnectorToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); static void event_attr_changed(Inkscape::XML::Node *repr, gchar const *name, diff --git a/src/ui/toolbar/dropper-toolbar.cpp b/src/ui/toolbar/dropper-toolbar.cpp index 83a18c37a2..bb765e87f3 100644 --- a/src/ui/toolbar/dropper-toolbar.cpp +++ b/src/ui/toolbar/dropper-toolbar.cpp @@ -95,11 +95,10 @@ DropperToolbar::DropperToolbar(SPDesktop *desktop) show_all(); } -GtkWidget * +Toolbar * DropperToolbar::create(SPDesktop *desktop) { - auto toolbar = Gtk::manage(new DropperToolbar(desktop)); - return GTK_WIDGET(toolbar->gobj()); + return new DropperToolbar(desktop); } } } diff --git a/src/ui/toolbar/dropper-toolbar.h b/src/ui/toolbar/dropper-toolbar.h index c8aa42f309..dfebe27717 100644 --- a/src/ui/toolbar/dropper-toolbar.h +++ b/src/ui/toolbar/dropper-toolbar.h @@ -51,7 +51,7 @@ protected: DropperToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } } diff --git a/src/ui/toolbar/eraser-toolbar.cpp b/src/ui/toolbar/eraser-toolbar.cpp index 5b8dc2004b..ab17e618fa 100644 --- a/src/ui/toolbar/eraser-toolbar.cpp +++ b/src/ui/toolbar/eraser-toolbar.cpp @@ -215,11 +215,10 @@ EraserToolbar::EraserToolbar(SPDesktop *desktop) set_eraser_mode_visibility(eraser_mode); } -GtkWidget * +Toolbar * EraserToolbar::create(SPDesktop *desktop) { - auto toolbar = new EraserToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new EraserToolbar(desktop); } void diff --git a/src/ui/toolbar/eraser-toolbar.h b/src/ui/toolbar/eraser-toolbar.h index 4ab94b7730..c0e9ad417d 100644 --- a/src/ui/toolbar/eraser-toolbar.h +++ b/src/ui/toolbar/eraser-toolbar.h @@ -85,7 +85,7 @@ protected: EraserToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } diff --git a/src/ui/toolbar/gradient-toolbar.cpp b/src/ui/toolbar/gradient-toolbar.cpp index 677ae06876..46f9613455 100644 --- a/src/ui/toolbar/gradient-toolbar.cpp +++ b/src/ui/toolbar/gradient-toolbar.cpp @@ -549,11 +549,10 @@ GradientToolbar::GradientToolbar(SPDesktop *desktop) * Gradient auxiliary toolbar construction and setup. * */ -GtkWidget * +Toolbar * GradientToolbar::create(SPDesktop * desktop) { - auto toolbar = new GradientToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new GradientToolbar(desktop); } void diff --git a/src/ui/toolbar/gradient-toolbar.h b/src/ui/toolbar/gradient-toolbar.h index 96beb0f08b..e0c31da23f 100644 --- a/src/ui/toolbar/gradient-toolbar.h +++ b/src/ui/toolbar/gradient-toolbar.h @@ -95,7 +95,7 @@ protected: GradientToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } diff --git a/src/ui/toolbar/lpe-toolbar.cpp b/src/ui/toolbar/lpe-toolbar.cpp index ad08f6a15b..15b322197f 100644 --- a/src/ui/toolbar/lpe-toolbar.cpp +++ b/src/ui/toolbar/lpe-toolbar.cpp @@ -190,11 +190,10 @@ LPEToolbar::set_mode(int mode) _mode_buttons[mode]->set_active(); } -GtkWidget * +Toolbar * LPEToolbar::create(SPDesktop *desktop) { - auto toolbar = new LPEToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new LPEToolbar(desktop); } // this is called when the mode is changed via the toolbar (i.e., one of the subtool buttons is pressed) diff --git a/src/ui/toolbar/lpe-toolbar.h b/src/ui/toolbar/lpe-toolbar.h index 903d9daf92..2f7e8ddd26 100644 --- a/src/ui/toolbar/lpe-toolbar.h +++ b/src/ui/toolbar/lpe-toolbar.h @@ -90,7 +90,7 @@ protected: LPEToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); void set_mode(int mode); }; diff --git a/src/ui/toolbar/measure-toolbar.cpp b/src/ui/toolbar/measure-toolbar.cpp index 4418025a7a..b25f4884c1 100644 --- a/src/ui/toolbar/measure-toolbar.cpp +++ b/src/ui/toolbar/measure-toolbar.cpp @@ -224,12 +224,11 @@ MeasureToolbar::MeasureToolbar(SPDesktop *desktop) show_all(); } -GtkWidget * +Toolbar * MeasureToolbar::create(SPDesktop * desktop) { - auto toolbar = new MeasureToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); -} // MeasureToolbar::prep() + return new MeasureToolbar(desktop); +} // MeasureToolbar::create() void MeasureToolbar::fontsize_value_changed() diff --git a/src/ui/toolbar/measure-toolbar.h b/src/ui/toolbar/measure-toolbar.h index a922fa15e0..22f66d90b5 100644 --- a/src/ui/toolbar/measure-toolbar.h +++ b/src/ui/toolbar/measure-toolbar.h @@ -81,7 +81,7 @@ protected: MeasureToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } diff --git a/src/ui/toolbar/mesh-toolbar.cpp b/src/ui/toolbar/mesh-toolbar.cpp index d5915215d0..054f705f09 100644 --- a/src/ui/toolbar/mesh-toolbar.cpp +++ b/src/ui/toolbar/mesh-toolbar.cpp @@ -350,11 +350,10 @@ MeshToolbar::MeshToolbar(SPDesktop *desktop) * Don't forget to add to XML in widgets/toolbox.cpp! * */ -GtkWidget * +Toolbar * MeshToolbar::create(SPDesktop * desktop) { - auto toolbar = new MeshToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new MeshToolbar(desktop); } void diff --git a/src/ui/toolbar/mesh-toolbar.h b/src/ui/toolbar/mesh-toolbar.h index 2df441135d..0f8b3fcfb1 100644 --- a/src/ui/toolbar/mesh-toolbar.h +++ b/src/ui/toolbar/mesh-toolbar.h @@ -87,7 +87,7 @@ protected: MeshToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } diff --git a/src/ui/toolbar/node-toolbar.cpp b/src/ui/toolbar/node-toolbar.cpp index a9b193dea4..e6d05a8951 100644 --- a/src/ui/toolbar/node-toolbar.cpp +++ b/src/ui/toolbar/node-toolbar.cpp @@ -356,12 +356,11 @@ NodeToolbar::NodeToolbar(SPDesktop *desktop) show_all(); } -GtkWidget * +Toolbar * NodeToolbar::create(SPDesktop *desktop) { - auto holder = new NodeToolbar(desktop); - return GTK_WIDGET(holder->gobj()); -} // NodeToolbar::prep() + return new NodeToolbar(desktop); +} // NodeToolbar::create() void NodeToolbar::value_changed(Geom::Dim2 d) diff --git a/src/ui/toolbar/node-toolbar.h b/src/ui/toolbar/node-toolbar.h index fc603cbf50..f6c82e113c 100644 --- a/src/ui/toolbar/node-toolbar.h +++ b/src/ui/toolbar/node-toolbar.h @@ -107,7 +107,7 @@ protected: NodeToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } } diff --git a/src/ui/toolbar/paintbucket-toolbar.cpp b/src/ui/toolbar/paintbucket-toolbar.cpp index ad0f9fbde4..ae00908a78 100644 --- a/src/ui/toolbar/paintbucket-toolbar.cpp +++ b/src/ui/toolbar/paintbucket-toolbar.cpp @@ -154,11 +154,10 @@ PaintbucketToolbar::PaintbucketToolbar(SPDesktop *desktop) show_all(); } -GtkWidget * +Toolbar * PaintbucketToolbar::create(SPDesktop *desktop) { - auto toolbar = new PaintbucketToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new PaintbucketToolbar(desktop); } void diff --git a/src/ui/toolbar/paintbucket-toolbar.h b/src/ui/toolbar/paintbucket-toolbar.h index d1b1a775e8..c8e8f441bd 100644 --- a/src/ui/toolbar/paintbucket-toolbar.h +++ b/src/ui/toolbar/paintbucket-toolbar.h @@ -62,7 +62,7 @@ protected: PaintbucketToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } diff --git a/src/ui/toolbar/pencil-toolbar.cpp b/src/ui/toolbar/pencil-toolbar.cpp index 3c2f6216a1..794bd6ab90 100644 --- a/src/ui/toolbar/pencil-toolbar.cpp +++ b/src/ui/toolbar/pencil-toolbar.cpp @@ -168,11 +168,10 @@ PencilToolbar::PencilToolbar(SPDesktop *desktop, } } -GtkWidget * +Toolbar * PencilToolbar::create_pencil(SPDesktop *desktop) { - auto toolbar = new PencilToolbar(desktop, true); - return GTK_WIDGET(toolbar->gobj()); + return new PencilToolbar(desktop, true); } PencilToolbar::~PencilToolbar() @@ -507,11 +506,10 @@ PencilToolbar::flatten_spiro_bspline() } } -GtkWidget * +Toolbar * PencilToolbar::create_pen(SPDesktop *desktop) { - auto toolbar = new PencilToolbar(desktop, false); - return GTK_WIDGET(toolbar->gobj()); + return new PencilToolbar(desktop, false); } void diff --git a/src/ui/toolbar/pencil-toolbar.h b/src/ui/toolbar/pencil-toolbar.h index 631b3dfc98..9da9ebd537 100644 --- a/src/ui/toolbar/pencil-toolbar.h +++ b/src/ui/toolbar/pencil-toolbar.h @@ -96,8 +96,8 @@ protected: ~PencilToolbar() override; public: - static GtkWidget * create_pencil(SPDesktop *desktop); - static GtkWidget * create_pen(SPDesktop *desktop); + static Toolbar * create_pencil(SPDesktop *desktop); + static Toolbar * create_pen(SPDesktop *desktop); }; } } diff --git a/src/ui/toolbar/rect-toolbar.cpp b/src/ui/toolbar/rect-toolbar.cpp index 461935a7f7..d24d6b4bd5 100644 --- a/src/ui/toolbar/rect-toolbar.cpp +++ b/src/ui/toolbar/rect-toolbar.cpp @@ -196,11 +196,10 @@ RectToolbar::~RectToolbar() } } -GtkWidget * +Toolbar * RectToolbar::create(SPDesktop *desktop) { - auto toolbar = new RectToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new RectToolbar(desktop); } void diff --git a/src/ui/toolbar/rect-toolbar.h b/src/ui/toolbar/rect-toolbar.h index 58d4b2c1c6..c8d9f39947 100644 --- a/src/ui/toolbar/rect-toolbar.h +++ b/src/ui/toolbar/rect-toolbar.h @@ -95,7 +95,7 @@ protected: ~RectToolbar() override; public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); static void event_attr_changed(Inkscape::XML::Node *repr, gchar const *name, diff --git a/src/ui/toolbar/select-toolbar.cpp b/src/ui/toolbar/select-toolbar.cpp index 7330ebf3db..d44f22e08e 100644 --- a/src/ui/toolbar/select-toolbar.cpp +++ b/src/ui/toolbar/select-toolbar.cpp @@ -233,11 +233,10 @@ void SelectToolbar::on_unrealize() parent_type::on_unrealize(); } -GtkWidget * +Toolbar * SelectToolbar::create(SPDesktop *desktop) { - auto toolbar = new SelectToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new SelectToolbar(desktop); } void diff --git a/src/ui/toolbar/select-toolbar.h b/src/ui/toolbar/select-toolbar.h index b86405f8e2..0eb89034a3 100644 --- a/src/ui/toolbar/select-toolbar.h +++ b/src/ui/toolbar/select-toolbar.h @@ -68,7 +68,7 @@ protected: void on_unrealize() override; public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } diff --git a/src/ui/toolbar/snap-toolbar.cpp b/src/ui/toolbar/snap-toolbar.cpp index 63347f2219..3726c33bd2 100644 --- a/src/ui/toolbar/snap-toolbar.cpp +++ b/src/ui/toolbar/snap-toolbar.cpp @@ -196,11 +196,10 @@ SnapToolbar::SnapToolbar(SPDesktop *desktop) show_all(); } -GtkWidget * +Toolbar * SnapToolbar::create(SPDesktop *desktop) { - auto tb = Gtk::manage(new SnapToolbar(desktop)); - return GTK_WIDGET(tb->gobj()); + return new SnapToolbar(desktop); } void diff --git a/src/ui/toolbar/snap-toolbar.h b/src/ui/toolbar/snap-toolbar.h index 9d948a11b6..b870903f8b 100644 --- a/src/ui/toolbar/snap-toolbar.h +++ b/src/ui/toolbar/snap-toolbar.h @@ -49,7 +49,7 @@ protected: SnapToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); static void update(SnapToolbar *tb); }; diff --git a/src/ui/toolbar/spiral-toolbar.cpp b/src/ui/toolbar/spiral-toolbar.cpp index 05ce654242..9b921dcf79 100644 --- a/src/ui/toolbar/spiral-toolbar.cpp +++ b/src/ui/toolbar/spiral-toolbar.cpp @@ -150,11 +150,10 @@ SpiralToolbar::~SpiralToolbar() } } -GtkWidget * +Toolbar * SpiralToolbar::create(SPDesktop *desktop) { - auto toolbar = new SpiralToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new SpiralToolbar(desktop); } void diff --git a/src/ui/toolbar/spiral-toolbar.h b/src/ui/toolbar/spiral-toolbar.h index 9c27eb560a..6211481025 100644 --- a/src/ui/toolbar/spiral-toolbar.h +++ b/src/ui/toolbar/spiral-toolbar.h @@ -82,7 +82,7 @@ protected: ~SpiralToolbar() override; public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); static void event_attr_changed(Inkscape::XML::Node *repr, gchar const *name, diff --git a/src/ui/toolbar/spray-toolbar.cpp b/src/ui/toolbar/spray-toolbar.cpp index b55ba875d0..0f983fefe1 100644 --- a/src/ui/toolbar/spray-toolbar.cpp +++ b/src/ui/toolbar/spray-toolbar.cpp @@ -359,11 +359,10 @@ SprayToolbar::SprayToolbar(SPDesktop *desktop) : init(); } -GtkWidget * +Toolbar * SprayToolbar::create(SPDesktop *desktop) { - auto toolbar = new SprayToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new SprayToolbar(desktop); } void diff --git a/src/ui/toolbar/spray-toolbar.h b/src/ui/toolbar/spray-toolbar.h index 4587cf0339..6c248e6a08 100644 --- a/src/ui/toolbar/spray-toolbar.h +++ b/src/ui/toolbar/spray-toolbar.h @@ -96,7 +96,7 @@ protected: SprayToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); void set_mode(int mode); }; diff --git a/src/ui/toolbar/star-toolbar.cpp b/src/ui/toolbar/star-toolbar.cpp index d9b09ff591..35761c4e7d 100644 --- a/src/ui/toolbar/star-toolbar.cpp +++ b/src/ui/toolbar/star-toolbar.cpp @@ -201,11 +201,10 @@ StarToolbar::~StarToolbar() } } -GtkWidget * +Toolbar * StarToolbar::create(SPDesktop *desktop) { - auto toolbar = new StarToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new StarToolbar(desktop); } void diff --git a/src/ui/toolbar/star-toolbar.h b/src/ui/toolbar/star-toolbar.h index c44caab225..93184578d3 100644 --- a/src/ui/toolbar/star-toolbar.h +++ b/src/ui/toolbar/star-toolbar.h @@ -91,7 +91,7 @@ protected: ~StarToolbar() override; public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); static void event_attr_changed(Inkscape::XML::Node *repr, gchar const *name, diff --git a/src/ui/toolbar/text-toolbar.cpp b/src/ui/toolbar/text-toolbar.cpp index 3b02a39efb..6a68689f34 100644 --- a/src/ui/toolbar/text-toolbar.cpp +++ b/src/ui/toolbar/text-toolbar.cpp @@ -745,11 +745,10 @@ TextToolbar::fontfamily_value_changed() #endif } -GtkWidget * +Toolbar * TextToolbar::create(SPDesktop *desktop) { - auto tb = Gtk::manage(new TextToolbar(desktop)); - return GTK_WIDGET(tb->gobj()); + return new TextToolbar(desktop); } void diff --git a/src/ui/toolbar/text-toolbar.h b/src/ui/toolbar/text-toolbar.h index 6108dd60f2..3993e454e2 100644 --- a/src/ui/toolbar/text-toolbar.h +++ b/src/ui/toolbar/text-toolbar.h @@ -140,7 +140,7 @@ private: TextToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } } diff --git a/src/ui/toolbar/toolbar.cpp b/src/ui/toolbar/toolbar.cpp index 445f5b7e83..8414d4c047 100644 --- a/src/ui/toolbar/toolbar.cpp +++ b/src/ui/toolbar/toolbar.cpp @@ -81,11 +81,10 @@ Toolbar::add_separator() add(* Gtk::manage(new Gtk::SeparatorToolItem())); } -GtkWidget * +Toolbar * Toolbar::create(SPDesktop *desktop) { - auto toolbar = Gtk::manage(new Toolbar(desktop)); - return GTK_WIDGET(toolbar->gobj()); + return new Toolbar(desktop); } } } diff --git a/src/ui/toolbar/toolbar.h b/src/ui/toolbar/toolbar.h index 18c0510b12..e254ede5ba 100644 --- a/src/ui/toolbar/toolbar.h +++ b/src/ui/toolbar/toolbar.h @@ -48,7 +48,7 @@ protected: void add_separator(); protected: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } } diff --git a/src/ui/toolbar/tweak-toolbar.cpp b/src/ui/toolbar/tweak-toolbar.cpp index eefdd7a51d..07973440e1 100644 --- a/src/ui/toolbar/tweak-toolbar.cpp +++ b/src/ui/toolbar/tweak-toolbar.cpp @@ -250,11 +250,10 @@ TweakToolbar::set_mode(int mode) _mode_buttons[mode]->set_active(); } -GtkWidget * +Toolbar * TweakToolbar::create(SPDesktop *desktop) { - auto toolbar = new TweakToolbar(desktop); - return GTK_WIDGET(toolbar->gobj()); + return new TweakToolbar(desktop); } void diff --git a/src/ui/toolbar/tweak-toolbar.h b/src/ui/toolbar/tweak-toolbar.h index cd1c7d048f..9f968a0cc7 100644 --- a/src/ui/toolbar/tweak-toolbar.h +++ b/src/ui/toolbar/tweak-toolbar.h @@ -78,7 +78,7 @@ protected: TweakToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); void set_mode(int mode); }; diff --git a/src/ui/toolbar/zoom-toolbar.cpp b/src/ui/toolbar/zoom-toolbar.cpp index 3b4d3d6bc3..c6a227b7e3 100644 --- a/src/ui/toolbar/zoom-toolbar.cpp +++ b/src/ui/toolbar/zoom-toolbar.cpp @@ -63,11 +63,10 @@ ZoomToolbar::ZoomToolbar(SPDesktop *desktop) show_all(); } -GtkWidget * +Toolbar * ZoomToolbar::create(SPDesktop *desktop) { - auto toolbar = Gtk::manage(new ZoomToolbar(desktop)); - return GTK_WIDGET(toolbar->gobj()); + return new ZoomToolbar(desktop); } } } diff --git a/src/ui/toolbar/zoom-toolbar.h b/src/ui/toolbar/zoom-toolbar.h index b5d34de40b..5e81e234bf 100644 --- a/src/ui/toolbar/zoom-toolbar.h +++ b/src/ui/toolbar/zoom-toolbar.h @@ -42,7 +42,7 @@ protected: ZoomToolbar(SPDesktop *desktop); public: - static GtkWidget * create(SPDesktop *desktop); + static Toolbar * create(SPDesktop *desktop); }; } } diff --git a/src/ui/uxmanager.cpp b/src/ui/uxmanager.cpp index 08ee66c2ce..45861958ed 100644 --- a/src/ui/uxmanager.cpp +++ b/src/ui/uxmanager.cpp @@ -10,10 +10,13 @@ * Released under GNU GPL v2+, read the file 'COPYING' for more information. */ +#include "uxmanager.h" + #include -#include "widgets/desktop-widget.h" -#include "uxmanager.h" +#include + +#include "widgets/desktop-widget.h" #include "desktop.h" #include "ui/monitor.h" #include "widgets/toolbox.h" @@ -27,7 +30,7 @@ public: {} sigc::connection destroyConn; - std::vector boxes; + std::vector boxes; }; static std::vector desktops; @@ -79,7 +82,7 @@ public: void addTrack( SPDesktopWidget* dtw ) override; void delTrack( SPDesktopWidget* dtw ) override; - void connectToDesktop( std::vector const & toolboxes, SPDesktop *desktop ) override; + void connectToDesktop( std::vector const & toolboxes, SPDesktop *desktop ) override; gint getDefaultTask( SPDesktop *desktop ) override; void setTask(SPDesktop* dt, gint val) override; @@ -196,17 +199,20 @@ void UXManagerImpl::delTrack( SPDesktopWidget* dtw ) } } -void UXManagerImpl::connectToDesktop( std::vector const & toolboxes, SPDesktop *desktop ) +void UXManagerImpl::connectToDesktop( std::vector const & toolboxes, SPDesktop *desktop ) { if (!desktop) { return; } TrackItem &tracker = trackedBoxes[desktop]; - std::vector& tracked = tracker.boxes; + auto & tracked = tracker.boxes; tracker.destroyConn = desktop->connectDestroy(&desktopDestructHandler); for (auto toolbox : toolboxes) { + if(!toolbox) { + g_warning("Can't get toolbox in connectToDesktop"); + } ToolboxFactory::setToolboxDesktop( toolbox, desktop ); if (find(tracked.begin(), tracked.end(), toolbox) == tracked.end()) { tracked.push_back(toolbox); diff --git a/src/ui/uxmanager.h b/src/ui/uxmanager.h index 5cb799ce99..cfcdea85a4 100644 --- a/src/ui/uxmanager.h +++ b/src/ui/uxmanager.h @@ -19,6 +19,10 @@ extern "C" typedef struct _GtkWidget GtkWidget; class SPDesktop; struct SPDesktopWidget; +namespace Gtk { +class EventBox; +} + namespace Inkscape { namespace UI { @@ -31,7 +35,7 @@ public: virtual void addTrack( SPDesktopWidget* dtw ) = 0; virtual void delTrack( SPDesktopWidget* dtw ) = 0; - virtual void connectToDesktop( std::vector const & toolboxes, SPDesktop *desktop ) = 0; + virtual void connectToDesktop(std::vector const & toolboxes, SPDesktop *desktop) = 0; virtual gint getDefaultTask( SPDesktop *desktop ) = 0; virtual void setTask( SPDesktop* dt, gint val ) = 0; diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index 36635094dc..8cb5476d93 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -251,18 +251,18 @@ SPDesktopWidget::SPDesktopWidget() /* Toolboxes */ dtw->aux_toolbox = ToolboxFactory::createAuxToolbox(); - dtw->_vbox->pack_end(*Glib::wrap(dtw->aux_toolbox), false, true); + dtw->_vbox->pack_end(*dtw->aux_toolbox, false, true); dtw->snap_toolbox = ToolboxFactory::createSnapToolbox(); - ToolboxFactory::setOrientation( dtw->snap_toolbox, GTK_ORIENTATION_VERTICAL ); - dtw->_hbox->pack_end(*Glib::wrap(dtw->snap_toolbox), false, true); + ToolboxFactory::setOrientation(dtw->snap_toolbox, Gtk::ORIENTATION_VERTICAL); + dtw->_hbox->pack_end(*dtw->snap_toolbox, false, true); dtw->commands_toolbox = ToolboxFactory::createCommandsToolbox(); - dtw->_vbox->pack_end(*Glib::wrap(dtw->commands_toolbox), false, true); + dtw->_vbox->pack_end(*dtw->commands_toolbox, false, true); dtw->tool_toolbox = ToolboxFactory::createToolToolbox(); - ToolboxFactory::setOrientation( dtw->tool_toolbox, GTK_ORIENTATION_VERTICAL ); - dtw->_hbox->pack_start(*Glib::wrap(dtw->tool_toolbox), false, true); + ToolboxFactory::setOrientation(dtw->tool_toolbox, Gtk::ORIENTATION_VERTICAL); + dtw->_hbox->pack_start(*dtw->tool_toolbox, false, true); /* Canvas Grid (canvas, rulers, scrollbars, etc.) */ dtw->_canvas_grid = Gtk::manage(new Inkscape::UI::Widget::CanvasGrid(this)); @@ -1229,19 +1229,19 @@ void SPDesktopWidget::layoutWidgets() } if (!prefs->getBool(pref_root + "commands/state", true)) { - gtk_widget_hide (dtw->commands_toolbox); + dtw->commands_toolbox->hide(); } else { - gtk_widget_show_all (dtw->commands_toolbox); + dtw->commands_toolbox->show_all(); } if (!prefs->getBool(pref_root + "snaptoolbox/state", true)) { - gtk_widget_hide (dtw->snap_toolbox); + dtw->snap_toolbox->hide(); } else { - gtk_widget_show_all (dtw->snap_toolbox); + dtw->snap_toolbox->show_all(); } if (!prefs->getBool(pref_root + "toppanel/state", true)) { - gtk_widget_hide (dtw->aux_toolbox); + dtw->aux_toolbox->hide(); } else { // we cannot just show_all because that will show all tools' panels; // this is a function from toolbox.cpp that shows only the current tool's panel @@ -1249,9 +1249,9 @@ void SPDesktopWidget::layoutWidgets() } if (!prefs->getBool(pref_root + "toolbox/state", true)) { - gtk_widget_hide (dtw->tool_toolbox); + dtw->tool_toolbox->hide(); } else { - gtk_widget_show_all (dtw->tool_toolbox); + dtw->tool_toolbox->show_all(); } if (!prefs->getBool(pref_root + "statusbar/state", true)) { @@ -1275,7 +1275,7 @@ SPDesktopWidget::get_toolbar_by_name(const Glib::ustring& name) { // The name is actually attached to the GtkGrid that contains // the toolbar, so we need to get the grid first - auto widget = sp_search_by_name_recursive(Glib::wrap(aux_toolbox), name); + auto widget = sp_search_by_name_recursive(aux_toolbox, name); auto grid = dynamic_cast(widget); if (!grid) return nullptr; @@ -1290,11 +1290,11 @@ void SPDesktopWidget::setToolboxFocusTo (const gchar* label) { // First try looking for a named widget - auto hb = sp_search_by_name_recursive(Glib::wrap(aux_toolbox), label); + auto hb = sp_search_by_name_recursive(aux_toolbox, label); // Fallback to looking for a named data member (deprecated) if (!hb) { - hb = Glib::wrap(GTK_WIDGET(sp_search_by_data_recursive(aux_toolbox, (gpointer) label))); + hb = Glib::wrap(GTK_WIDGET(sp_search_by_data_recursive(GTK_WIDGET(aux_toolbox->gobj()), (gpointer) label))); } if (hb) @@ -1307,11 +1307,11 @@ void SPDesktopWidget::setToolboxAdjustmentValue (gchar const *id, double value) { // First try looking for a named widget - auto hb = sp_search_by_name_recursive(Glib::wrap(aux_toolbox), id); + auto hb = sp_search_by_name_recursive(aux_toolbox, id); // Fallback to looking for a named data member (deprecated) if (!hb) { - hb = Glib::wrap(GTK_WIDGET(sp_search_by_data_recursive(aux_toolbox, (gpointer)id))); + hb = Glib::wrap(GTK_WIDGET(sp_search_by_data_recursive(GTK_WIDGET(aux_toolbox->gobj()), (gpointer)id))); } if (hb) { @@ -1329,7 +1329,7 @@ bool SPDesktopWidget::isToolboxButtonActive (const gchar* id) { bool isActive = false; - gpointer thing = sp_search_by_data_recursive(aux_toolbox, (gpointer) id); + gpointer thing = sp_search_by_data_recursive(GTK_WIDGET(aux_toolbox->gobj()), (gpointer) id); if ( !thing ) { //g_message( "Unable to locate item for {%s}", id ); } else if ( GTK_IS_TOGGLE_BUTTON(thing) ) { @@ -1351,7 +1351,7 @@ SPDesktopWidget::isToolboxButtonActive (const gchar* id) void SPDesktopWidget::setToolboxPosition(Glib::ustring const& id, GtkPositionType pos) { // Note - later on these won't be individual member variables. - GtkWidget* toolbox = nullptr; + Gtk::EventBox *toolbox = nullptr; if (id == "ToolToolbar") { toolbox = tool_toolbox; } else if (id == "AuxToolbar") { @@ -1367,33 +1367,33 @@ void SPDesktopWidget::setToolboxPosition(Glib::ustring const& id, GtkPositionTyp switch(pos) { case GTK_POS_TOP: case GTK_POS_BOTTOM: - if ( gtk_widget_is_ancestor(toolbox, GTK_WIDGET(_hbox->gobj())) ) { + if (toolbox->is_ancestor(*_hbox)) { // Removing a widget can reduce ref count to zero - g_object_ref(G_OBJECT(toolbox)); - _hbox->remove(*Glib::wrap(toolbox)); - _vbox->add(*Glib::wrap(toolbox)); - g_object_unref(G_OBJECT(toolbox)); + // g_object_ref(G_OBJECT(toolbox)); + _hbox->remove(*toolbox); + _vbox->add(*toolbox); + // g_object_unref(G_OBJECT(toolbox)); // Function doesn't seem to be in Gtkmm wrapper yet - gtk_box_set_child_packing(_vbox->gobj(), toolbox, FALSE, TRUE, 0, GTK_PACK_START); + gtk_box_set_child_packing(_vbox->gobj(), GTK_WIDGET(toolbox->gobj()), FALSE, TRUE, 0, GTK_PACK_START); } - ToolboxFactory::setOrientation(toolbox, GTK_ORIENTATION_HORIZONTAL); + ToolboxFactory::setOrientation(toolbox, Gtk::ORIENTATION_HORIZONTAL); break; case GTK_POS_LEFT: case GTK_POS_RIGHT: - if ( !gtk_widget_is_ancestor(toolbox, GTK_WIDGET(_hbox->gobj())) ) { - g_object_ref(G_OBJECT(toolbox)); - _vbox->remove(*Glib::wrap(toolbox)); - _hbox->add(*Glib::wrap(toolbox)); - g_object_unref(G_OBJECT(toolbox)); + if (!toolbox->is_ancestor(*_hbox)) { + // g_object_ref(G_OBJECT(toolbox)); + _vbox->remove(*toolbox); + _hbox->add(*toolbox); + // g_object_unref(G_OBJECT(toolbox)); // Function doesn't seem to be in Gtkmm wrapper yet - gtk_box_set_child_packing(_hbox->gobj(), toolbox, FALSE, TRUE, 0, GTK_PACK_START); + gtk_box_set_child_packing(_hbox->gobj(), GTK_WIDGET(toolbox->gobj()), FALSE, TRUE, 0, GTK_PACK_START); if (pos == GTK_POS_LEFT) { - _hbox->reorder_child(*Glib::wrap(toolbox), 0 ); + _hbox->reorder_child(*toolbox, 0); } } - ToolboxFactory::setOrientation(toolbox, GTK_ORIENTATION_VERTICAL); + ToolboxFactory::setOrientation(toolbox, Gtk::ORIENTATION_VERTICAL); break; } } @@ -1440,10 +1440,14 @@ SPDesktopWidget::SPDesktopWidget(SPDocument *document) dtw->layoutWidgets(); - std::vector toolboxes; + std::vector toolboxes; + if(!tool_toolbox) g_warning("Can't get tool_toolbox"); toolboxes.push_back(dtw->tool_toolbox); + if(!aux_toolbox) g_warning("Can't get aux_toolbox"); toolboxes.push_back(dtw->aux_toolbox); + if(!commands_toolbox) g_warning("Can't get commands_toolbox"); toolboxes.push_back(dtw->commands_toolbox); + if(!snap_toolbox) g_warning("Can't get snap_toolbox"); toolboxes.push_back(dtw->snap_toolbox); dtw->_panels->setDesktop( dtw->desktop ); diff --git a/src/widgets/desktop-widget.h b/src/widgets/desktop-widget.h index 600576ee47..8b0956c9d2 100644 --- a/src/widgets/desktop-widget.h +++ b/src/widgets/desktop-widget.h @@ -212,10 +212,10 @@ public: void sticky_zoom_toggled(); private: - GtkWidget *tool_toolbox; - GtkWidget *aux_toolbox; - GtkWidget *commands_toolbox; - GtkWidget *snap_toolbox; + Gtk::EventBox *tool_toolbox = nullptr; + Gtk::EventBox *aux_toolbox = nullptr; + Gtk::EventBox *commands_toolbox = nullptr; + Gtk::EventBox *snap_toolbox = nullptr; void namedviewModified(SPObject *obj, guint flags); int zoom_input(double *new_val); diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index bc1ef63a2c..a9856c7491 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -102,8 +102,8 @@ using Inkscape::UI::Tools::ToolBase; using Inkscape::IO::Resource::get_filename; using Inkscape::IO::Resource::UIS; -typedef void (*SetupFunction)(GtkWidget *toolbox, SPDesktop *desktop); -typedef void (*UpdateFunction)(SPDesktop *desktop, ToolBase *eventcontext, GtkWidget *toolbox); +typedef void (*SetupFunction)(Gtk::Bin *toolbox, SPDesktop *desktop); +typedef void (*UpdateFunction)(SPDesktop *desktop, ToolBase *eventcontext, Gtk::Bin *toolbox); enum BarId { BAR_TOOL = 0, @@ -170,7 +170,7 @@ static struct { static struct { gchar const *type_name; gchar const *data_name; - GtkWidget *(*create_func)(SPDesktop *desktop); + Inkscape::UI::Toolbar::Toolbar *(*create_func)(SPDesktop *desktop); gchar const *ui_name; gint swatch_verb_id; gchar const *swatch_tool; @@ -229,16 +229,16 @@ static struct { static Glib::RefPtr create_or_fetch_actions( SPDesktop* desktop ); -static void setup_snap_toolbox(GtkWidget *toolbox, SPDesktop *desktop); +static void setup_snap_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop); -static void setup_tool_toolbox(GtkWidget *toolbox, SPDesktop *desktop); -static void update_tool_toolbox(SPDesktop *desktop, ToolBase *eventcontext, GtkWidget *toolbox); +static void setup_tool_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop); +static void update_tool_toolbox(SPDesktop *desktop, ToolBase *eventcontext, Gtk::Bin *toolbox); -static void setup_aux_toolbox(GtkWidget *toolbox, SPDesktop *desktop); -static void update_aux_toolbox(SPDesktop *desktop, ToolBase *eventcontext, GtkWidget *toolbox); +static void setup_aux_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop); +static void update_aux_toolbox(SPDesktop *desktop, ToolBase *eventcontext, Gtk::Bin *toolbox); -static void setup_commands_toolbox(GtkWidget *toolbox, SPDesktop *desktop); -static void update_commands_toolbox(SPDesktop *desktop, ToolBase *eventcontext, GtkWidget *toolbox); +static void setup_commands_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop); +static void update_commands_toolbox(SPDesktop *desktop, ToolBase *eventcontext, Gtk::Bin *toolbox); static void trigger_sp_action( GtkAction* /*act*/, gpointer user_data ) { @@ -379,73 +379,72 @@ static Glib::RefPtr create_or_fetch_actions( SPDesktop* deskto } -static GtkWidget* toolboxNewCommon( GtkWidget* tb, BarId id, GtkPositionType /*handlePos*/ ) +static Gtk::EventBox * toolboxNewCommon(Gtk::Box * tb, BarId id, Gtk::PositionType /*handlePos*/) { - g_object_set_data(G_OBJECT(tb), "desktop", nullptr); + tb->set_data("desktop", nullptr); - gtk_widget_set_sensitive(tb, FALSE); + tb->set_sensitive(false); - GtkWidget *hb = gtk_event_box_new(); // A simple, neutral container. - gtk_widget_set_name(hb, "ToolboxCommon"); + auto hb = Gtk::make_managed(); // A simple, neutral container. + hb->set_name("ToolboxCommon"); - gtk_container_add(GTK_CONTAINER(hb), tb); - gtk_widget_show(GTK_WIDGET(tb)); + hb->add(*tb); + tb->show(); sigc::connection* conn = new sigc::connection; - g_object_set_data(G_OBJECT(hb), "event_context_connection", conn); + hb->set_data("event_context_connection", conn); gpointer val = GINT_TO_POINTER(id); - g_object_set_data(G_OBJECT(hb), BAR_ID_KEY, val); + hb->set_data(BAR_ID_KEY, val); return hb; } -GtkWidget *ToolboxFactory::createToolToolbox() +Gtk::EventBox * ToolboxFactory::createToolToolbox() { - auto tb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_set_name(tb, "ToolToolbox"); - gtk_box_set_homogeneous(GTK_BOX(tb), FALSE); + auto tb = Gtk::make_managed(Gtk::ORIENTATION_VERTICAL, 0); + tb->set_name("ToolToolbox"); + tb->set_homogeneous(false); - return toolboxNewCommon( tb, BAR_TOOL, GTK_POS_TOP ); + return toolboxNewCommon(tb, BAR_TOOL, Gtk::POS_TOP); } -GtkWidget *ToolboxFactory::createAuxToolbox() +Gtk::EventBox * ToolboxFactory::createAuxToolbox() { - auto tb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_set_name(tb, "AuxToolbox"); - gtk_box_set_homogeneous(GTK_BOX(tb), FALSE); + auto tb = Gtk::make_managed(Gtk::ORIENTATION_VERTICAL, 0); + tb->set_name("AuxToolbox"); + tb->set_homogeneous(false); - return toolboxNewCommon( tb, BAR_AUX, GTK_POS_LEFT ); + return toolboxNewCommon(tb, BAR_AUX, Gtk::POS_LEFT); } //#################################### //# Commands Bar //#################################### -GtkWidget *ToolboxFactory::createCommandsToolbox() +Gtk::EventBox * ToolboxFactory::createCommandsToolbox() { - auto tb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_set_name(tb, "CommandsToolbox"); - gtk_box_set_homogeneous(GTK_BOX(tb), FALSE); + auto tb = Gtk::make_managed(Gtk::ORIENTATION_VERTICAL, 0); + tb->set_name("CommandsToolbox"); + tb->set_homogeneous(false); - return toolboxNewCommon( tb, BAR_COMMANDS, GTK_POS_LEFT ); + return toolboxNewCommon(tb, BAR_COMMANDS, Gtk::POS_LEFT); } -GtkWidget *ToolboxFactory::createSnapToolbox() +Gtk::EventBox * ToolboxFactory::createSnapToolbox() { - auto tb = gtk_box_new(GTK_ORIENTATION_VERTICAL, 0); - gtk_widget_set_name(tb, "SnapToolbox"); - gtk_box_set_homogeneous(GTK_BOX(tb), FALSE); + auto tb = Gtk::make_managed(Gtk::ORIENTATION_VERTICAL, 0); + tb->set_name("SnapToolbox"); + tb->set_homogeneous(false); - return toolboxNewCommon( tb, BAR_SNAP, GTK_POS_LEFT ); + return toolboxNewCommon(tb, BAR_SNAP, Gtk::POS_LEFT); } -void ToolboxFactory::setToolboxDesktop(GtkWidget *toolbox, SPDesktop *desktop) +void ToolboxFactory::setToolboxDesktop(Gtk::Bin *toolbox, SPDesktop *desktop) { - sigc::connection *conn = static_cast(g_object_get_data(G_OBJECT(toolbox), - "event_context_connection")); + auto conn = static_cast(toolbox->get_data("event_context_connection")); - BarId id = static_cast( GPOINTER_TO_INT(g_object_get_data(G_OBJECT(toolbox), BAR_ID_KEY)) ); + BarId id = static_cast(GPOINTER_TO_INT(toolbox->get_data(BAR_ID_KEY))); SetupFunction setup_func = nullptr; UpdateFunction update_func = nullptr; @@ -457,7 +456,7 @@ void ToolboxFactory::setToolboxDesktop(GtkWidget *toolbox, SPDesktop *desktop) break; case BAR_AUX: - toolbox = gtk_bin_get_child(GTK_BIN(toolbox)); + toolbox = dynamic_cast(toolbox->get_child()); setup_func = setup_aux_toolbox; update_func = update_aux_toolbox; break; @@ -475,169 +474,141 @@ void ToolboxFactory::setToolboxDesktop(GtkWidget *toolbox, SPDesktop *desktop) g_warning("Unexpected toolbox id encountered."); } - gpointer ptr = g_object_get_data(G_OBJECT(toolbox), "desktop"); + gpointer ptr = toolbox->get_data("desktop"); SPDesktop *old_desktop = static_cast(ptr); if (old_desktop) { - std::vector children = Glib::wrap(GTK_CONTAINER(toolbox))->get_children(); + auto children = toolbox->get_children(); for ( auto i:children ) { - gtk_container_remove( GTK_CONTAINER(toolbox), i->gobj() ); + gtk_container_remove(GTK_CONTAINER(toolbox->gobj()), i->gobj()); } } - g_object_set_data(G_OBJECT(toolbox), "desktop", (gpointer)desktop); + toolbox->set_data("desktop", (gpointer)desktop); if (desktop && setup_func && update_func) { - gtk_widget_set_sensitive(toolbox, TRUE); + toolbox->set_sensitive(true); setup_func(toolbox, desktop); update_func(desktop, desktop->event_context, toolbox); - *conn = desktop->connectEventContextChanged(sigc::bind (sigc::ptr_fun(update_func), toolbox)); + *conn = desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(update_func), toolbox)); } else { - gtk_widget_set_sensitive(toolbox, FALSE); + toolbox->set_sensitive(false); } } // end of sp_toolbox_set_desktop() -static void setupToolboxCommon( GtkWidget *toolbox, +static void setupToolboxCommon( Gtk::Bin *toolbox, SPDesktop *desktop, gchar const *ui_file, gchar const* toolbarName, gchar const* sizePref ) { - Glib::RefPtr mainActions = create_or_fetch_actions( desktop ); - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - - GtkUIManager* mgr = gtk_ui_manager_new(); - GError* err = nullptr; - - GtkOrientation orientation = GTK_ORIENTATION_HORIZONTAL; + auto mainActions = create_or_fetch_actions(desktop); + auto prefs = Inkscape::Preferences::get(); + auto mgr = Gtk::UIManager::create(); + auto orientation = Gtk::ORIENTATION_HORIZONTAL; - gtk_ui_manager_insert_action_group( mgr, mainActions->gobj(), 0 ); + mgr->insert_action_group(mainActions, 0); - Glib::ustring filename = get_filename(UIS, ui_file); - gtk_ui_manager_add_ui_from_file( mgr, filename.c_str(), &err ); - if(err) { - g_warning("Failed to load %s: %s", filename.c_str(), err->message); - g_error_free(err); + auto filename = get_filename(UIS, ui_file); + try { + mgr->add_ui_from_file(filename); + } catch (Glib::Error &err) { + g_warning("Failed to load %s: %s", filename.c_str(), err.what().c_str()); return; } - GtkWidget* toolBar = gtk_ui_manager_get_widget( mgr, toolbarName ); + auto toolBar = dynamic_cast(mgr->get_widget(toolbarName)); if ( prefs->getBool("/toolbox/icononly", true) ) { - gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS ); + toolBar->set_toolbar_style(Gtk::TOOLBAR_ICONS); } - GtkIconSize toolboxSize = ToolboxFactory::prefToSize(sizePref); - gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), static_cast(toolboxSize) ); + auto toolboxSize = ToolboxFactory::prefToSize(sizePref); + toolBar->set_icon_size(static_cast(toolboxSize)); - GtkPositionType pos = static_cast(GPOINTER_TO_INT(g_object_get_data( G_OBJECT(toolbox), HANDLE_POS_MARK ))); - orientation = ((pos == GTK_POS_LEFT) || (pos == GTK_POS_RIGHT)) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL; - gtk_orientable_set_orientation (GTK_ORIENTABLE(toolBar), orientation); - gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolBar), TRUE); + auto pos = static_cast(GPOINTER_TO_INT(toolbox->get_data(HANDLE_POS_MARK))); + orientation = ((pos == Gtk::POS_LEFT) || (pos == Gtk::POS_RIGHT)) ? Gtk::ORIENTATION_HORIZONTAL : Gtk::ORIENTATION_VERTICAL; + gtk_orientable_set_orientation(GTK_ORIENTABLE(toolBar->gobj()), static_cast(orientation)); + toolBar->set_show_arrow(true); - g_object_set_data(G_OBJECT(toolBar), "desktop", nullptr); + toolBar->set_data("desktop", nullptr); - GtkWidget* child = gtk_bin_get_child(GTK_BIN(toolbox)); - if ( child ) { - gtk_container_remove( GTK_CONTAINER(toolbox), child ); + auto child = toolbox->get_child(); + if (child) { + gtk_container_remove(GTK_CONTAINER(toolbox->gobj()), child->gobj()); } - gtk_container_add( GTK_CONTAINER(toolbox), toolBar ); + toolbox->add(*toolBar); } #define noDUMP_DETAILS 1 -void ToolboxFactory::setOrientation(GtkWidget* toolbox, GtkOrientation orientation) +void ToolboxFactory::setOrientation(Gtk::EventBox *toolbox, Gtk::Orientation orientation) { -#if DUMP_DETAILS - g_message("Set orientation for %p to be %d", toolbox, orientation); - GType type = G_OBJECT_TYPE(toolbox); - g_message(" [%s]", g_type_name(type)); - g_message(" %p", g_object_get_data(G_OBJECT(toolbox), BAR_ID_KEY)); -#endif - - GtkPositionType pos = (orientation == GTK_ORIENTATION_HORIZONTAL) ? GTK_POS_LEFT : GTK_POS_TOP; - - if (GTK_IS_BIN(toolbox)) { -#if DUMP_DETAILS - g_message(" is a BIN"); -#endif // DUMP_DETAILS - GtkWidget* child = gtk_bin_get_child(GTK_BIN(toolbox)); - if (child) { -#if DUMP_DETAILS - GType type2 = G_OBJECT_TYPE(child); - g_message(" child [%s]", g_type_name(type2)); -#endif // DUMP_DETAILS - - if (GTK_IS_BOX(child)) { -#if DUMP_DETAILS - g_message(" is a BOX"); -#endif // DUMP_DETAILS - - std::vector children = Glib::wrap(GTK_CONTAINER(child))->get_children(); - if (!children.empty()) { - for (auto curr:children) { - GtkWidget* child2 = curr->gobj(); -#if DUMP_DETAILS - GType type3 = G_OBJECT_TYPE(child2); - g_message(" child2 [%s]", g_type_name(type3)); -#endif // DUMP_DETAILS - - if (GTK_IS_CONTAINER(child2)) { - std::vector children2 = Glib::wrap(GTK_CONTAINER(child2))->get_children(); - if (!children2.empty()) { - for (auto curr2:children2) { - GtkWidget* child3 = curr2->gobj(); -#if DUMP_DETAILS - GType type4 = G_OBJECT_TYPE(child3); - g_message(" child3 [%s]", g_type_name(type4)); -#endif // DUMP_DETAILS - if (GTK_IS_TOOLBAR(child3)) { - GtkToolbar* childBar = GTK_TOOLBAR(child3); - gtk_orientable_set_orientation(GTK_ORIENTABLE(childBar), orientation); - } + auto pos = (orientation == Gtk::ORIENTATION_HORIZONTAL) ? Gtk::POS_LEFT : Gtk::POS_TOP; + + auto child = toolbox->get_child(); + if (child) { + auto child_box = dynamic_cast(child); + auto child_toolbar = dynamic_cast(child); + + if (child_box) { + auto children = child_box->get_children(); + if (!children.empty()) { + for (auto child2:children) { + auto child2_container = dynamic_cast(child2); + + if (child2_container) { + auto children2 = child2_container->get_children(); + if (!children2.empty()) { + for (auto child3:children2) { + auto child3_toolbar = dynamic_cast(child3); + if (child3_toolbar) { + gtk_orientable_set_orientation(GTK_ORIENTABLE(child3_toolbar->gobj()), + static_cast(orientation)); } } } + } + auto child2_toolbar = dynamic_cast(child2); - if (GTK_IS_TOOLBAR(child2)) { - GtkToolbar* childBar = GTK_TOOLBAR(child2); - gtk_orientable_set_orientation(GTK_ORIENTABLE(childBar), orientation); - } else { - g_message("need to add dynamic switch"); - } + if (child2_toolbar) { + gtk_orientable_set_orientation(GTK_ORIENTABLE(child2_toolbar->gobj()), + static_cast(orientation)); + } else { + g_message("need to add dynamic switch"); } - } else { - // The call is being made before the toolbox proper has been setup. - g_object_set_data(G_OBJECT(toolbox), HANDLE_POS_MARK, GINT_TO_POINTER(pos)); } - } else if (GTK_IS_TOOLBAR(child)) { - GtkToolbar* toolbar = GTK_TOOLBAR(child); - gtk_orientable_set_orientation( GTK_ORIENTABLE(toolbar), orientation ); + } else { + // The call is being made before the toolbox proper has been setup. + toolbox->set_data(HANDLE_POS_MARK, GINT_TO_POINTER(pos)); } + } else if (child_toolbar) { + gtk_orientable_set_orientation(GTK_ORIENTABLE(child_toolbar->gobj()), + static_cast(orientation)); } } } -void setup_tool_toolbox(GtkWidget *toolbox, SPDesktop *desktop) +void setup_tool_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop) { setupToolboxCommon(toolbox, desktop, "toolbar-tool.ui", "/ui/ToolToolbar", "/toolbox/tools/small"); } -void update_tool_toolbox( SPDesktop *desktop, ToolBase *eventcontext, GtkWidget * /*toolbox*/ ) +void update_tool_toolbox( SPDesktop *desktop, ToolBase *eventcontext, Gtk::Bin * /*toolbox*/ ) { gchar const *const tname = ( eventcontext ? eventcontext->getPrefsPath().c_str() //g_type_name(G_OBJECT_TYPE(eventcontext)) : nullptr ); - Glib::RefPtr mainActions = create_or_fetch_actions( desktop ); + auto mainActions = create_or_fetch_actions( desktop ); for (int i = 0 ; tools[i].type_name ; i++ ) { - Glib::RefPtr act = mainActions->get_action( Inkscape::Verb::get(tools[i].verb)->get_id() ); + auto act = mainActions->get_action( Inkscape::Verb::get(tools[i].verb)->get_id() ); if ( act ) { bool setActive = tname && !strcmp(tname, tools[i].type_name); - Glib::RefPtr verbAct = Glib::RefPtr::cast_dynamic(act); + auto verbAct = Glib::RefPtr::cast_dynamic(act); if ( verbAct ) { verbAct->set_active(setActive); } @@ -655,7 +626,7 @@ void update_tool_toolbox( SPDesktop *desktop, ToolBase *eventcontext, GtkWidget * The actual method used for each toolbar is specified in the * "aux_toolboxes" array, defined above. */ -void setup_aux_toolbox(GtkWidget *toolbox, SPDesktop *desktop) +void setup_aux_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop) { Inkscape::Preferences *prefs = Inkscape::Preferences::get(); @@ -663,20 +634,20 @@ void setup_aux_toolbox(GtkWidget *toolbox, SPDesktop *desktop) // their "create" methods. for (int i = 0 ; aux_toolboxes[i].type_name ; i++ ) { if (aux_toolboxes[i].create_func) { - GtkWidget *sub_toolbox = aux_toolboxes[i].create_func(desktop); - gtk_widget_set_name( sub_toolbox, "SubToolBox" ); + auto sub_toolbox = aux_toolboxes[i].create_func(desktop); + sub_toolbox->set_name("SubToolBox"); - auto holder = gtk_grid_new(); - gtk_grid_attach(GTK_GRID(holder), sub_toolbox, 0, 0, 1, 1); + auto holder = Gtk::make_managed(); + holder->attach(*sub_toolbox, 0, 0, 1, 1); // This part is just for styling if ( prefs->getBool( "/toolbox/icononly", true) ) { - gtk_toolbar_set_style( GTK_TOOLBAR(sub_toolbox), GTK_TOOLBAR_ICONS ); + sub_toolbox->set_toolbar_style(Gtk::TOOLBAR_ICONS); } - GtkIconSize toolboxSize = ToolboxFactory::prefToSize("/toolbox/small"); - gtk_toolbar_set_icon_size( GTK_TOOLBAR(sub_toolbox), static_cast(toolboxSize) ); - gtk_widget_set_hexpand(sub_toolbox, TRUE); + auto toolboxSize = ToolboxFactory::prefToSize("/toolbox/small"); + sub_toolbox->set_icon_size(static_cast(toolboxSize)); + sub_toolbox->set_hexpand(true); // Add a swatch widget if one was specified if ( aux_toolboxes[i].swatch_verb_id != SP_VERB_INVALID ) { @@ -689,85 +660,82 @@ void setup_aux_toolbox(GtkWidget *toolbox, SPDesktop *desktop) swatch->set_margin_top(AUX_SPACING); swatch->set_margin_bottom(AUX_SPACING); - auto swatch_ = GTK_WIDGET( swatch->gobj() ); - gtk_grid_attach( GTK_GRID(holder), swatch_, 1, 0, 1, 1); + holder->attach(*swatch, 1, 0, 1, 1); } // Add the new toolbar into the toolbox (i.e., make it the visible toolbar) // and also store a pointer to it inside the toolbox. This allows the // active toolbar to be changed. - gtk_container_add(GTK_CONTAINER(toolbox), holder); - gtk_widget_set_name( holder, aux_toolboxes[i].ui_name ); + toolbox->add(*holder); + holder->set_name(aux_toolboxes[i].ui_name); // TODO: We could make the toolbox a custom subclass of GtkEventBox // so that we can store a list of toolbars, rather than using // GObject data - g_object_set_data(G_OBJECT(toolbox), aux_toolboxes[i].data_name, holder); - gtk_widget_show(sub_toolbox); - gtk_widget_show(holder); + toolbox->set_data(aux_toolboxes[i].data_name, holder); + sub_toolbox->show(); + holder->show(); } else if (aux_toolboxes[i].swatch_verb_id != SP_VERB_NONE) { g_warning("Could not create toolbox %s", aux_toolboxes[i].ui_name); } } } -void update_aux_toolbox(SPDesktop * /*desktop*/, ToolBase *eventcontext, GtkWidget *toolbox) +void update_aux_toolbox(SPDesktop * /*desktop*/, ToolBase *eventcontext, Gtk::Bin *toolbox) { gchar const *tname = ( eventcontext ? eventcontext->getPrefsPath().c_str() //g_type_name(G_OBJECT_TYPE(eventcontext)) : nullptr ); for (int i = 0 ; aux_toolboxes[i].type_name ; i++ ) { - GtkWidget *sub_toolbox = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbox), aux_toolboxes[i].data_name)); + auto sub_toolbox = reinterpret_cast(toolbox->get_data(aux_toolboxes[i].data_name)); if (tname && !strcmp(tname, aux_toolboxes[i].type_name)) { - gtk_widget_show_now(sub_toolbox); - g_object_set_data(G_OBJECT(toolbox), "shows", sub_toolbox); + sub_toolbox->show_now(); + toolbox->set_data("shows", sub_toolbox); } else { - gtk_widget_hide(sub_toolbox); + toolbox->hide(); } //FIX issue #Inkscape686 - GtkAllocation allocation; - gtk_widget_get_allocation(sub_toolbox, &allocation); - gtk_widget_size_allocate(sub_toolbox, &allocation); + auto allocation = sub_toolbox->get_allocation(); + sub_toolbox->size_allocate(allocation); } //FIX issue #Inkscape125 - GtkAllocation allocation; - gtk_widget_get_allocation(toolbox, &allocation); - gtk_widget_size_allocate(toolbox, &allocation); + auto allocation = toolbox->get_allocation(); + toolbox->size_allocate(allocation); } -void setup_commands_toolbox(GtkWidget *toolbox, SPDesktop *desktop) +void setup_commands_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop) { setupToolboxCommon(toolbox, desktop, "toolbar-commands.ui", "/ui/CommandsToolbar", "/toolbox/small"); } -void update_commands_toolbox(SPDesktop * /*desktop*/, ToolBase * /*eventcontext*/, GtkWidget * /*toolbox*/) +void update_commands_toolbox(SPDesktop * /*desktop*/, ToolBase * /*eventcontext*/, Gtk::Bin * /*toolbox*/) { } -void setup_snap_toolbox(GtkWidget *toolbox, SPDesktop *desktop) +void setup_snap_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop) { Glib::ustring sizePref("/toolbox/secondary"); auto toolBar = Inkscape::UI::Toolbar::SnapToolbar::create(desktop); auto prefs = Inkscape::Preferences::get(); if ( prefs->getBool("/toolbox/icononly", true) ) { - gtk_toolbar_set_style( GTK_TOOLBAR(toolBar), GTK_TOOLBAR_ICONS ); + toolBar->set_toolbar_style(Gtk::TOOLBAR_ICONS); } - GtkIconSize toolboxSize = ToolboxFactory::prefToSize(sizePref.c_str()); - gtk_toolbar_set_icon_size( GTK_TOOLBAR(toolBar), static_cast(toolboxSize) ); + auto toolboxSize = ToolboxFactory::prefToSize(sizePref.c_str()); + toolBar->set_icon_size(static_cast(toolboxSize)); - GtkPositionType pos = static_cast(GPOINTER_TO_INT(g_object_get_data( G_OBJECT(toolbox), HANDLE_POS_MARK ))); - auto orientation = ((pos == GTK_POS_LEFT) || (pos == GTK_POS_RIGHT)) ? GTK_ORIENTATION_HORIZONTAL : GTK_ORIENTATION_VERTICAL; - gtk_orientable_set_orientation (GTK_ORIENTABLE(toolBar), orientation); - gtk_toolbar_set_show_arrow(GTK_TOOLBAR(toolBar), TRUE); + auto pos = static_cast(GPOINTER_TO_INT(toolbox->get_data(HANDLE_POS_MARK))); + auto orientation = ((pos == Gtk::POS_LEFT) || (pos == Gtk::POS_RIGHT)) ? Gtk::ORIENTATION_HORIZONTAL : Gtk::ORIENTATION_VERTICAL; + gtk_orientable_set_orientation(GTK_ORIENTABLE(toolBar->gobj()), static_cast(orientation)); + toolBar->set_show_arrow(true); - GtkWidget* child = gtk_bin_get_child(GTK_BIN(toolbox)); - if ( child ) { - gtk_container_remove( GTK_CONTAINER(toolbox), child ); + auto child = toolbox->get_child(); + if (child) { + gtk_container_remove(GTK_CONTAINER(toolbox->gobj()), child->gobj()); } - gtk_container_add( GTK_CONTAINER(toolbox), toolBar ); + toolbox->add(*toolBar); } Glib::ustring ToolboxFactory::getToolboxName(GtkWidget* toolbox) @@ -792,9 +760,9 @@ Glib::ustring ToolboxFactory::getToolboxName(GtkWidget* toolbox) return name; } -void ToolboxFactory::updateSnapToolbox(SPDesktop *desktop, ToolBase * /*eventcontext*/, GtkWidget *toolbox) +void ToolboxFactory::updateSnapToolbox(SPDesktop *desktop, ToolBase * /*eventcontext*/, Gtk::Bin *toolbox) { - auto tb = dynamic_cast(Glib::wrap(GTK_TOOLBAR(gtk_bin_get_child(GTK_BIN(toolbox))))); + auto tb = dynamic_cast(toolbox->get_child()); if (!tb) { std::cerr << "Can't get snap toolbar" << std::endl; @@ -804,16 +772,16 @@ void ToolboxFactory::updateSnapToolbox(SPDesktop *desktop, ToolBase * /*eventcon Inkscape::UI::Toolbar::SnapToolbar::update(tb); } -void ToolboxFactory::showAuxToolbox(GtkWidget *toolbox_toplevel) +void ToolboxFactory::showAuxToolbox(Gtk::Bin *toolbox_toplevel) { - gtk_widget_show(toolbox_toplevel); - GtkWidget *toolbox = gtk_bin_get_child(GTK_BIN(toolbox_toplevel)); + toolbox_toplevel->show(); + auto toolbox = toolbox_toplevel->get_child(); - GtkWidget *shown_toolbox = GTK_WIDGET(g_object_get_data(G_OBJECT(toolbox), "shows")); + auto shown_toolbox = reinterpret_cast(toolbox->get_data("shows")); if (!shown_toolbox) { return; } - gtk_widget_show(toolbox); + toolbox->show(); } #define MODE_LABEL_WIDTH 70 diff --git a/src/widgets/toolbox.h b/src/widgets/toolbox.h index f3ec74dca1..2599fc8043 100644 --- a/src/widgets/toolbox.h +++ b/src/widgets/toolbox.h @@ -24,6 +24,11 @@ class SPDesktop; +namespace Gtk { +class Bin; +class EventBox; +} + namespace Inkscape { namespace UI { namespace Tools { @@ -47,19 +52,19 @@ namespace Widget { class ToolboxFactory { public: - static void setToolboxDesktop(GtkWidget *toolbox, SPDesktop *desktop); - static void setOrientation(GtkWidget* toolbox, GtkOrientation orientation); - static void showAuxToolbox(GtkWidget* toolbox); + static void setToolboxDesktop(Gtk::Bin *toolbox, SPDesktop *desktop); + static void setOrientation(Gtk::EventBox *toolbox, Gtk::Orientation orientation); + static void showAuxToolbox(Gtk::Bin *toolbox); - static GtkWidget *createToolToolbox(); - static GtkWidget *createAuxToolbox(); - static GtkWidget *createCommandsToolbox(); - static GtkWidget *createSnapToolbox(); + static Gtk::EventBox * createToolToolbox(); + static Gtk::EventBox * createAuxToolbox(); + static Gtk::EventBox * createCommandsToolbox(); + static Gtk::EventBox * createSnapToolbox(); static Glib::ustring getToolboxName(GtkWidget* toolbox); - static void updateSnapToolbox(SPDesktop *desktop, Inkscape::UI::Tools::ToolBase *eventcontext, GtkWidget *toolbox); + static void updateSnapToolbox(SPDesktop *desktop, Inkscape::UI::Tools::ToolBase *eventcontext, Gtk::Bin *toolbox); static GtkIconSize prefToSize(Glib::ustring const &path, int base = 0 ); static Gtk::IconSize prefToSize_mm(Glib::ustring const &path, int base = 0); -- GitLab From 659bbd9fe73ad08f6e4dc9f1bcf2940efa258819 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Fri, 26 Jun 2020 10:35:31 +0100 Subject: [PATCH 2/5] Fix crash on start (no Aux toolbar yet + crashes on close) --- src/widgets/toolbox.cpp | 28 ++++++++++++++++------------ 1 file changed, 16 insertions(+), 12 deletions(-) diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index a9856c7491..7b1119499b 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -274,7 +274,7 @@ static std::map > groups; static void desktopDestructHandler(SPDesktop *desktop) { - std::map >::iterator it = groups.find(desktop); + auto it = groups.find(desktop); if (it != groups.end()) { groups.erase(it); @@ -474,8 +474,11 @@ void ToolboxFactory::setToolboxDesktop(Gtk::Bin *toolbox, SPDesktop *desktop) g_warning("Unexpected toolbox id encountered."); } - gpointer ptr = toolbox->get_data("desktop"); - SPDesktop *old_desktop = static_cast(ptr); + SPDesktop *old_desktop = nullptr; + + if (toolbox) { + old_desktop = static_cast(toolbox->get_data("desktop")); + } if (old_desktop) { auto children = toolbox->get_children(); @@ -484,17 +487,18 @@ void ToolboxFactory::setToolboxDesktop(Gtk::Bin *toolbox, SPDesktop *desktop) } } - toolbox->set_data("desktop", (gpointer)desktop); + if (toolbox) { + toolbox->set_data("desktop", (gpointer)desktop); - if (desktop && setup_func && update_func) { - toolbox->set_sensitive(true); - setup_func(toolbox, desktop); - update_func(desktop, desktop->event_context, toolbox); - *conn = desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(update_func), toolbox)); - } else { - toolbox->set_sensitive(false); + if (desktop && setup_func && update_func) { + toolbox->set_sensitive(true); + setup_func(toolbox, desktop); + update_func(desktop, desktop->event_context, toolbox); + *conn = desktop->connectEventContextChanged(sigc::bind(sigc::ptr_fun(update_func), toolbox)); + } else { + toolbox->set_sensitive(false); + } } - } // end of sp_toolbox_set_desktop() -- GitLab From b16badf3b40acc1b96fb7cc1f899b3dabc6aa930 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Sun, 28 Jun 2020 19:02:32 +0100 Subject: [PATCH 3/5] Display Aux toolbar (still crashes on exit) --- src/widgets/desktop-widget.cpp | 4 +- src/widgets/desktop-widget.h | 4 +- src/widgets/toolbox.cpp | 335 ++++++++++++++++----------------- src/widgets/toolbox.h | 44 ++++- 4 files changed, 207 insertions(+), 180 deletions(-) diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index 8cb5476d93..f70c95cfc1 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -250,7 +250,7 @@ SPDesktopWidget::SPDesktopWidget() dtw->_vbox->pack_end(*dtw->_hbox, true, true); /* Toolboxes */ - dtw->aux_toolbox = ToolboxFactory::createAuxToolbox(); + dtw->aux_toolbox = Gtk::make_managed(); dtw->_vbox->pack_end(*dtw->aux_toolbox, false, true); dtw->snap_toolbox = ToolboxFactory::createSnapToolbox(); @@ -1245,7 +1245,7 @@ void SPDesktopWidget::layoutWidgets() } else { // we cannot just show_all because that will show all tools' panels; // this is a function from toolbox.cpp that shows only the current tool's panel - ToolboxFactory::showAuxToolbox(dtw->aux_toolbox); + dtw->aux_toolbox->show_aux_toolbox(); } if (!prefs->getBool(pref_root + "toolbox/state", true)) { diff --git a/src/widgets/desktop-widget.h b/src/widgets/desktop-widget.h index 8b0956c9d2..054223398e 100644 --- a/src/widgets/desktop-widget.h +++ b/src/widgets/desktop-widget.h @@ -39,6 +39,8 @@ class SPObject; namespace Inkscape { namespace UI { +class AuxToolbox; + namespace Dialog { class SwatchesPanel; } // namespace Dialog @@ -213,7 +215,7 @@ public: private: Gtk::EventBox *tool_toolbox = nullptr; - Gtk::EventBox *aux_toolbox = nullptr; + Inkscape::UI::AuxToolbox *aux_toolbox = nullptr; Gtk::EventBox *commands_toolbox = nullptr; Gtk::EventBox *snap_toolbox = nullptr; diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 7b1119499b..03c667ba10 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -107,7 +107,6 @@ typedef void (*UpdateFunction)(SPDesktop *desktop, ToolBase *eventcontext, Gtk:: enum BarId { BAR_TOOL = 0, - BAR_AUX, BAR_COMMANDS, BAR_SNAP, }; @@ -234,9 +233,6 @@ static void setup_snap_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop); static void setup_tool_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop); static void update_tool_toolbox(SPDesktop *desktop, ToolBase *eventcontext, Gtk::Bin *toolbox); -static void setup_aux_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop); -static void update_aux_toolbox(SPDesktop *desktop, ToolBase *eventcontext, Gtk::Bin *toolbox); - static void setup_commands_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop); static void update_commands_toolbox(SPDesktop *desktop, ToolBase *eventcontext, Gtk::Bin *toolbox); @@ -409,15 +405,138 @@ Gtk::EventBox * ToolboxFactory::createToolToolbox() return toolboxNewCommon(tb, BAR_TOOL, Gtk::POS_TOP); } -Gtk::EventBox * ToolboxFactory::createAuxToolbox() + +namespace Inkscape { +namespace UI { +AuxToolbox::AuxToolbox() { - auto tb = Gtk::make_managed(Gtk::ORIENTATION_VERTICAL, 0); - tb->set_name("AuxToolbox"); - tb->set_homogeneous(false); + set_name("AuxToolbox"); + + _box = Gtk::make_managed(Gtk::ORIENTATION_VERTICAL, 0); + _box->set_homogeneous(false); + add(*_box); + set_sensitive(false); + show_all(); +} + +void +AuxToolbox::setup(SPDesktop *desktop) +{ + _desktop = desktop; + auto prefs = Inkscape::Preferences::get(); + + // Loop through all the toolbars that can be shown here, create them and + // store each one in a different cell of the main box + for (int i = 0 ; aux_toolboxes[i].type_name ; i++ ) { + if (aux_toolboxes[i].create_func) { + auto sub_toolbox = aux_toolboxes[i].create_func(desktop); + + // We use a Gtk::Grid here so that we can show a tool-specific + // swatch next to the toolbar + auto holder = Gtk::make_managed(); + holder->attach(*sub_toolbox, 0, 0, 1, 1); + + // This part is just for styling + if ( prefs->getBool( "/toolbox/icononly", true) ) { + sub_toolbox->set_toolbar_style(Gtk::TOOLBAR_ICONS); + } + + auto toolboxSize = ToolboxFactory::prefToSize("/toolbox/small"); + sub_toolbox->set_icon_size(static_cast(toolboxSize)); + sub_toolbox->set_hexpand(true); + + // Add a swatch widget if one was specified + if ( aux_toolboxes[i].swatch_verb_id != SP_VERB_INVALID ) { + auto swatch = Gtk::make_managed(nullptr, _(aux_toolboxes[i].swatch_tip)); + swatch->setDesktop(desktop); + swatch->setClickVerb(aux_toolboxes[i].swatch_verb_id); + swatch->setWatchedTool(aux_toolboxes[i].swatch_tool, true); + swatch->set_margin_start(AUX_BETWEEN_BUTTON_GROUPS); + swatch->set_margin_end(AUX_BETWEEN_BUTTON_GROUPS); + swatch->set_margin_top(AUX_SPACING); + swatch->set_margin_bottom(AUX_SPACING); + + holder->attach(*swatch, 1, 0, 1, 1); + } + + // Add the new toolbar into the toolbox + // and also store a pointer to it inside the toolbox. This allows the + // active toolbar to be changed. + _box->add(*holder); + holder->set_name(aux_toolboxes[i].ui_name); + _toolbar_map[aux_toolboxes[i].data_name] = holder; + sub_toolbox->show(); + holder->show_all(); + } else if (aux_toolboxes[i].swatch_verb_id != SP_VERB_NONE) { + g_warning("Could not create toolbox %s", aux_toolboxes[i].ui_name); + } + } +} + +void +AuxToolbox::update(SPDesktop * /*desktop*/, ToolBase *eventcontext) +{ + gchar const *tname = ( eventcontext + ? eventcontext->getPrefsPath().c_str() //g_type_name(G_OBJECT_TYPE(eventcontext)) + : nullptr ); + for (int i = 0 ; aux_toolboxes[i].type_name ; i++ ) { + auto sub_toolbox = _toolbar_map[aux_toolboxes[i].data_name]; + if (tname && !strcmp(tname, aux_toolboxes[i].type_name)) { + sub_toolbox->show_all(); + _shows = sub_toolbox; + } else { + sub_toolbox->hide(); + } + //FIX issue #Inkscape686 + auto allocation = sub_toolbox->get_allocation(); + sub_toolbox->size_allocate(allocation); + } + //FIX issue #Inkscape125 + auto allocation = get_allocation(); + size_allocate(allocation); +} + +void +AuxToolbox::set_desktop(decltype(_desktop) desktop) +{ + auto old_desktop = _desktop; + + // purge all existing toolbars + if (old_desktop) { + auto children = get_children(); + for (auto i:children) { + gtk_container_remove(GTK_CONTAINER(gobj()), i->gobj()); + } + } + + _desktop = desktop; - return toolboxNewCommon(tb, BAR_AUX, Gtk::POS_LEFT); + if (desktop) { + set_sensitive(true); + setup(desktop); + update(desktop, desktop->event_context); + _event_context_connection = desktop->connectEventContextChanged(sigc::mem_fun(*this, &AuxToolbox::update)); + } else { + set_sensitive(false); + } } +/** + * Shows the currently selected tool-specific toolbar + */ +void +AuxToolbox::show_aux_toolbox() +{ + show(); + + if (_shows) { + _shows->show_all(); + } +} + +} // namespace UI +} // namespace Inkscape + //#################################### //# Commands Bar //#################################### @@ -440,54 +559,50 @@ Gtk::EventBox * ToolboxFactory::createSnapToolbox() return toolboxNewCommon(tb, BAR_SNAP, Gtk::POS_LEFT); } -void ToolboxFactory::setToolboxDesktop(Gtk::Bin *toolbox, SPDesktop *desktop) +void ToolboxFactory::setToolboxDesktop(Gtk::EventBox *toolbox, SPDesktop *desktop) { - auto conn = static_cast(toolbox->get_data("event_context_connection")); - - BarId id = static_cast(GPOINTER_TO_INT(toolbox->get_data(BAR_ID_KEY))); - - SetupFunction setup_func = nullptr; - UpdateFunction update_func = nullptr; - - switch (id) { - case BAR_TOOL: - setup_func = setup_tool_toolbox; - update_func = update_tool_toolbox; - break; - - case BAR_AUX: - toolbox = dynamic_cast(toolbox->get_child()); - setup_func = setup_aux_toolbox; - update_func = update_aux_toolbox; - break; - - case BAR_COMMANDS: - setup_func = setup_commands_toolbox; - update_func = update_commands_toolbox; - break; - - case BAR_SNAP: - setup_func = setup_snap_toolbox; - update_func = updateSnapToolbox; - break; - default: - g_warning("Unexpected toolbox id encountered."); + auto aux_toolbox = dynamic_cast(toolbox); + + if (aux_toolbox) { + aux_toolbox->set_desktop(desktop); } + else { + auto conn = static_cast(toolbox->get_data("event_context_connection")); - SPDesktop *old_desktop = nullptr; + BarId id = static_cast(GPOINTER_TO_INT(toolbox->get_data(BAR_ID_KEY))); - if (toolbox) { - old_desktop = static_cast(toolbox->get_data("desktop")); - } + SetupFunction setup_func = nullptr; + UpdateFunction update_func = nullptr; - if (old_desktop) { - auto children = toolbox->get_children(); - for ( auto i:children ) { - gtk_container_remove(GTK_CONTAINER(toolbox->gobj()), i->gobj()); + switch (id) { + case BAR_TOOL: + setup_func = setup_tool_toolbox; + update_func = update_tool_toolbox; + break; + + case BAR_COMMANDS: + setup_func = setup_commands_toolbox; + update_func = update_commands_toolbox; + break; + + case BAR_SNAP: + setup_func = setup_snap_toolbox; + update_func = updateSnapToolbox; + break; + + default: + g_warning("Unexpected toolbox id encountered."); + } + + SPDesktop *old_desktop = static_cast(toolbox->get_data("desktop")); + + if (old_desktop) { + auto children = toolbox->get_children(); + for ( auto i:children ) { + gtk_container_remove(GTK_CONTAINER(toolbox->gobj()), i->gobj()); + } } - } - if (toolbox) { toolbox->set_data("desktop", (gpointer)desktop); if (desktop && setup_func && update_func) { @@ -620,92 +735,6 @@ void update_tool_toolbox( SPDesktop *desktop, ToolBase *eventcontext, Gtk::Bin * } } -/** - * \brief Generate the auxiliary toolbox - * - * \details This is the one that appears below the main menu, and contains - * tool-specific toolbars. Each toolbar is created here, using - * its "create" method. - * - * The actual method used for each toolbar is specified in the - * "aux_toolboxes" array, defined above. - */ -void setup_aux_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop) -{ - Inkscape::Preferences *prefs = Inkscape::Preferences::get(); - - // Loop through all the toolboxes and create them using either - // their "create" methods. - for (int i = 0 ; aux_toolboxes[i].type_name ; i++ ) { - if (aux_toolboxes[i].create_func) { - auto sub_toolbox = aux_toolboxes[i].create_func(desktop); - sub_toolbox->set_name("SubToolBox"); - - auto holder = Gtk::make_managed(); - holder->attach(*sub_toolbox, 0, 0, 1, 1); - - // This part is just for styling - if ( prefs->getBool( "/toolbox/icononly", true) ) { - sub_toolbox->set_toolbar_style(Gtk::TOOLBAR_ICONS); - } - - auto toolboxSize = ToolboxFactory::prefToSize("/toolbox/small"); - sub_toolbox->set_icon_size(static_cast(toolboxSize)); - sub_toolbox->set_hexpand(true); - - // Add a swatch widget if one was specified - if ( aux_toolboxes[i].swatch_verb_id != SP_VERB_INVALID ) { - auto swatch = new Inkscape::UI::Widget::StyleSwatch( nullptr, _(aux_toolboxes[i].swatch_tip) ); - swatch->setDesktop( desktop ); - swatch->setClickVerb( aux_toolboxes[i].swatch_verb_id ); - swatch->setWatchedTool( aux_toolboxes[i].swatch_tool, true ); - swatch->set_margin_start(AUX_BETWEEN_BUTTON_GROUPS); - swatch->set_margin_end(AUX_BETWEEN_BUTTON_GROUPS); - swatch->set_margin_top(AUX_SPACING); - swatch->set_margin_bottom(AUX_SPACING); - - holder->attach(*swatch, 1, 0, 1, 1); - } - - // Add the new toolbar into the toolbox (i.e., make it the visible toolbar) - // and also store a pointer to it inside the toolbox. This allows the - // active toolbar to be changed. - toolbox->add(*holder); - holder->set_name(aux_toolboxes[i].ui_name); - - // TODO: We could make the toolbox a custom subclass of GtkEventBox - // so that we can store a list of toolbars, rather than using - // GObject data - toolbox->set_data(aux_toolboxes[i].data_name, holder); - sub_toolbox->show(); - holder->show(); - } else if (aux_toolboxes[i].swatch_verb_id != SP_VERB_NONE) { - g_warning("Could not create toolbox %s", aux_toolboxes[i].ui_name); - } - } -} - -void update_aux_toolbox(SPDesktop * /*desktop*/, ToolBase *eventcontext, Gtk::Bin *toolbox) -{ - gchar const *tname = ( eventcontext - ? eventcontext->getPrefsPath().c_str() //g_type_name(G_OBJECT_TYPE(eventcontext)) - : nullptr ); - for (int i = 0 ; aux_toolboxes[i].type_name ; i++ ) { - auto sub_toolbox = reinterpret_cast(toolbox->get_data(aux_toolboxes[i].data_name)); - if (tname && !strcmp(tname, aux_toolboxes[i].type_name)) { - sub_toolbox->show_now(); - toolbox->set_data("shows", sub_toolbox); - } else { - toolbox->hide(); - } - //FIX issue #Inkscape686 - auto allocation = sub_toolbox->get_allocation(); - sub_toolbox->size_allocate(allocation); - } - //FIX issue #Inkscape125 - auto allocation = toolbox->get_allocation(); - toolbox->size_allocate(allocation); -} void setup_commands_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop) { @@ -742,51 +771,17 @@ void setup_snap_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop) toolbox->add(*toolBar); } -Glib::ustring ToolboxFactory::getToolboxName(GtkWidget* toolbox) -{ - Glib::ustring name; - BarId id = static_cast( GPOINTER_TO_INT(g_object_get_data(G_OBJECT(toolbox), BAR_ID_KEY)) ); - switch(id) { - case BAR_TOOL: - name = "ToolToolbar"; - break; - case BAR_AUX: - name = "AuxToolbar"; - break; - case BAR_COMMANDS: - name = "CommandsToolbar"; - break; - case BAR_SNAP: - name = "SnapToolbar"; - break; - } - - return name; -} - void ToolboxFactory::updateSnapToolbox(SPDesktop *desktop, ToolBase * /*eventcontext*/, Gtk::Bin *toolbox) { auto tb = dynamic_cast(toolbox->get_child()); if (!tb) { - std::cerr << "Can't get snap toolbar" << std::endl; return; } Inkscape::UI::Toolbar::SnapToolbar::update(tb); } -void ToolboxFactory::showAuxToolbox(Gtk::Bin *toolbox_toplevel) -{ - toolbox_toplevel->show(); - auto toolbox = toolbox_toplevel->get_child(); - - auto shown_toolbox = reinterpret_cast(toolbox->get_data("shows")); - if (!shown_toolbox) { - return; - } - toolbox->show(); -} #define MODE_LABEL_WIDTH 70 diff --git a/src/widgets/toolbox.h b/src/widgets/toolbox.h index 2599fc8043..29e4f6eb4f 100644 --- a/src/widgets/toolbox.h +++ b/src/widgets/toolbox.h @@ -15,7 +15,8 @@ */ #include -#include + +#include #include #include "preferences.h" @@ -26,7 +27,9 @@ class SPDesktop; namespace Gtk { class Bin; +class Box; class EventBox; +class Grid; } namespace Inkscape { @@ -52,18 +55,13 @@ namespace Widget { class ToolboxFactory { public: - static void setToolboxDesktop(Gtk::Bin *toolbox, SPDesktop *desktop); + static void setToolboxDesktop(Gtk::EventBox *toolbox, SPDesktop *desktop); static void setOrientation(Gtk::EventBox *toolbox, Gtk::Orientation orientation); - static void showAuxToolbox(Gtk::Bin *toolbox); static Gtk::EventBox * createToolToolbox(); - static Gtk::EventBox * createAuxToolbox(); static Gtk::EventBox * createCommandsToolbox(); static Gtk::EventBox * createSnapToolbox(); - - static Glib::ustring getToolboxName(GtkWidget* toolbox); - static void updateSnapToolbox(SPDesktop *desktop, Inkscape::UI::Tools::ToolBase *eventcontext, Gtk::Bin *toolbox); static GtkIconSize prefToSize(Glib::ustring const &path, int base = 0 ); @@ -72,6 +70,38 @@ public: ToolboxFactory() = delete; }; +/** + * A toolbox that can hold tool-specific widgets and swatches. + * This is the bar that normally appears directly below the main menu. + * + * The contents depends on the currently-selected tool. + */ +class AuxToolbox : public Gtk::EventBox { +private: + SPDesktop *_desktop = nullptr; + sigc::connection _event_context_connection; + + /** + * This box stores each possible toolbar that could be displayed within + * a different cell. Only one of them should be shown at a time. + */ + Gtk::Box *_box = nullptr; + + /// A map of all the toolbars that can be shown here + std::map _toolbar_map; + + /// The toolbar that is currently being shown + Gtk::Grid *_shows = nullptr; + + void update(SPDesktop *desktop, Tools::ToolBase *eventcontext); + void setup(SPDesktop *desktop); + +public: + AuxToolbox(); + + void show_aux_toolbox(); + void set_desktop(decltype(_desktop) desktop); +}; } // namespace UI -- GitLab From 8d6fe8eb52179cb4b7300d076cbb3f23801a5ab1 Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Sun, 28 Jun 2020 19:51:51 +0100 Subject: [PATCH 4/5] Split AuxToolbox into new files --- po/POTFILES.src.in | 1 + src/ui/CMakeLists.txt | 2 + src/ui/toolbar/aux-toolbox.cpp | 252 +++++++++++++++++++++++++++++++++ src/ui/toolbar/aux-toolbox.h | 80 +++++++++++ src/widgets/desktop-widget.cpp | 5 +- src/widgets/desktop-widget.h | 7 +- src/widgets/toolbox.cpp | 217 +--------------------------- src/widgets/toolbox.h | 37 ----- 8 files changed, 346 insertions(+), 255 deletions(-) create mode 100644 src/ui/toolbar/aux-toolbox.cpp create mode 100644 src/ui/toolbar/aux-toolbox.h diff --git a/po/POTFILES.src.in b/po/POTFILES.src.in index 1357a8ee5a..bc6aeb358a 100644 --- a/po/POTFILES.src.in +++ b/po/POTFILES.src.in @@ -296,6 +296,7 @@ ../src/ui/tool/path-manipulator.cpp ../src/ui/tool/transform-handle-set.cpp ../src/ui/toolbar/arc-toolbar.cpp +../src/ui/toolbar/aux-toolbox.cpp ../src/ui/toolbar/box3d-toolbar.cpp ../src/ui/toolbar/calligraphy-toolbar.cpp ../src/ui/toolbar/connector-toolbar.cpp diff --git a/src/ui/CMakeLists.txt b/src/ui/CMakeLists.txt index 82760efe95..4bf29e88bc 100644 --- a/src/ui/CMakeLists.txt +++ b/src/ui/CMakeLists.txt @@ -38,6 +38,7 @@ set(ui_SRC tool/transform-handle-set.cpp toolbar/arc-toolbar.cpp + toolbar/aux-toolbox.cpp toolbar/box3d-toolbar.cpp toolbar/calligraphy-toolbar.cpp toolbar/connector-toolbar.cpp @@ -341,6 +342,7 @@ set(ui_SRC tool/transform-handle-set.h toolbar/arc-toolbar.h + toolbar/aux-toolbox.h toolbar/box3d-toolbar.h toolbar/calligraphy-toolbar.h toolbar/connector-toolbar.h diff --git a/src/ui/toolbar/aux-toolbox.cpp b/src/ui/toolbar/aux-toolbox.cpp new file mode 100644 index 0000000000..d16cf8a677 --- /dev/null +++ b/src/ui/toolbar/aux-toolbox.cpp @@ -0,0 +1,252 @@ +/** + * @file + * Inkscape Auxilliary toolbar + * Each tool should have its own xxx-toolbar implementation file + * + * @authors Inkscape Authors + * Copyright (C) 1999-2010 Authors + * + * Released under GNU GPL v2+, read the file 'COPYING' for more information. + */ + +#include "aux-toolbox.h" + +#include + +#include +#include + +#include "ui/toolbar/arc-toolbar.h" +#include "ui/toolbar/box3d-toolbar.h" +#include "ui/toolbar/calligraphy-toolbar.h" +#include "ui/toolbar/connector-toolbar.h" +#include "ui/toolbar/dropper-toolbar.h" +#include "ui/toolbar/eraser-toolbar.h" +#include "ui/toolbar/gradient-toolbar.h" +#include "ui/toolbar/lpe-toolbar.h" +#include "ui/toolbar/mesh-toolbar.h" +#include "ui/toolbar/measure-toolbar.h" +#include "ui/toolbar/node-toolbar.h" +#include "ui/toolbar/rect-toolbar.h" +#include "ui/toolbar/paintbucket-toolbar.h" +#include "ui/toolbar/pencil-toolbar.h" +#include "ui/toolbar/select-toolbar.h" +#include "ui/toolbar/spray-toolbar.h" +#include "ui/toolbar/spiral-toolbar.h" +#include "ui/toolbar/star-toolbar.h" +#include "ui/toolbar/tweak-toolbar.h" +#include "ui/toolbar/text-toolbar.h" +#include "ui/toolbar/zoom-toolbar.h" + +#include "ui/tools/tool-base.h" + +#include "ui/widget/style-swatch.h" + +#include "widgets/toolbox.h" +#include "widgets/widget-sizes.h" + +#include "verbs.h" + +static struct { + gchar const *type_name; + gchar const *data_name; + Inkscape::UI::Toolbar::Toolbar *(*create_func)(SPDesktop *desktop); + gchar const *ui_name; + gint swatch_verb_id; + gchar const *swatch_tool; + gchar const *swatch_tip; +} const aux_toolboxes[] = { + { "/tools/select", "select_toolbox", Inkscape::UI::Toolbar::SelectToolbar::create, "SelectToolbar", + SP_VERB_INVALID, nullptr, nullptr}, + { "/tools/nodes", "node_toolbox", Inkscape::UI::Toolbar::NodeToolbar::create, "NodeToolbar", + SP_VERB_INVALID, nullptr, nullptr}, + { "/tools/tweak", "tweak_toolbox", Inkscape::UI::Toolbar::TweakToolbar::create, "TweakToolbar", + SP_VERB_CONTEXT_TWEAK_PREFS, "/tools/tweak", N_("Color/opacity used for color tweaking")}, + { "/tools/spray", "spray_toolbox", Inkscape::UI::Toolbar::SprayToolbar::create, "SprayToolbar", + SP_VERB_INVALID, nullptr, nullptr}, + { "/tools/zoom", "zoom_toolbox", Inkscape::UI::Toolbar::ZoomToolbar::create, "ZoomToolbar", + SP_VERB_INVALID, nullptr, nullptr}, + // If you change MeasureToolbar here, change it also in desktop-widget.cpp + { "/tools/measure", "measure_toolbox", Inkscape::UI::Toolbar::MeasureToolbar::create, "MeasureToolbar", + SP_VERB_INVALID, nullptr, nullptr}, + { "/tools/shapes/star", "star_toolbox", Inkscape::UI::Toolbar::StarToolbar::create, "StarToolbar", + SP_VERB_CONTEXT_STAR_PREFS, "/tools/shapes/star", N_("Style of new stars")}, + { "/tools/shapes/rect", "rect_toolbox", Inkscape::UI::Toolbar::RectToolbar::create, "RectToolbar", + SP_VERB_CONTEXT_RECT_PREFS, "/tools/shapes/rect", N_("Style of new rectangles")}, + { "/tools/shapes/3dbox", "3dbox_toolbox", Inkscape::UI::Toolbar::Box3DToolbar::create, "3DBoxToolbar", + SP_VERB_CONTEXT_3DBOX_PREFS, "/tools/shapes/3dbox", N_("Style of new 3D boxes")}, + { "/tools/shapes/arc", "arc_toolbox", Inkscape::UI::Toolbar::ArcToolbar::create, "ArcToolbar", + SP_VERB_CONTEXT_ARC_PREFS, "/tools/shapes/arc", N_("Style of new ellipses")}, + { "/tools/shapes/spiral", "spiral_toolbox", Inkscape::UI::Toolbar::SpiralToolbar::create, "SpiralToolbar", + SP_VERB_CONTEXT_SPIRAL_PREFS, "/tools/shapes/spiral", N_("Style of new spirals")}, + { "/tools/freehand/pencil", "pencil_toolbox", Inkscape::UI::Toolbar::PencilToolbar::create_pencil, "PencilToolbar", + SP_VERB_CONTEXT_PENCIL_PREFS, "/tools/freehand/pencil", N_("Style of new paths created by Pencil")}, + { "/tools/freehand/pen", "pen_toolbox", Inkscape::UI::Toolbar::PencilToolbar::create_pen, "PenToolbar", + SP_VERB_CONTEXT_PEN_PREFS, "/tools/freehand/pen", N_("Style of new paths created by Pen")}, + { "/tools/calligraphic", "calligraphy_toolbox", Inkscape::UI::Toolbar::CalligraphyToolbar::create, "CalligraphyToolbar", + SP_VERB_CONTEXT_CALLIGRAPHIC_PREFS, "/tools/calligraphic", N_("Style of new calligraphic strokes")}, + { "/tools/eraser", "eraser_toolbox", Inkscape::UI::Toolbar::EraserToolbar::create, "EraserToolbar", + SP_VERB_CONTEXT_ERASER_PREFS, "/tools/eraser", _("TBD")}, + { "/tools/lpetool", "lpetool_toolbox", Inkscape::UI::Toolbar::LPEToolbar::create, "LPEToolToolbar", + SP_VERB_CONTEXT_LPETOOL_PREFS, "/tools/lpetool", _("TBD")}, + // If you change TextToolbar here, change it also in desktop-widget.cpp + { "/tools/text", "text_toolbox", Inkscape::UI::Toolbar::TextToolbar::create, "TextToolbar", + SP_VERB_INVALID, nullptr, nullptr}, + { "/tools/dropper", "dropper_toolbox", Inkscape::UI::Toolbar::DropperToolbar::create, "DropperToolbar", + SP_VERB_INVALID, nullptr, nullptr}, + { "/tools/connector", "connector_toolbox", Inkscape::UI::Toolbar::ConnectorToolbar::create, "ConnectorToolbar", + SP_VERB_INVALID, nullptr, nullptr}, + { "/tools/gradient", "gradient_toolbox", Inkscape::UI::Toolbar::GradientToolbar::create, "GradientToolbar", + SP_VERB_INVALID, nullptr, nullptr}, + { "/tools/mesh", "mesh_toolbox", Inkscape::UI::Toolbar::MeshToolbar::create, "MeshToolbar", + SP_VERB_INVALID, nullptr, nullptr}, + { "/tools/paintbucket", "paintbucket_toolbox", Inkscape::UI::Toolbar::PaintbucketToolbar::create, "PaintbucketToolbar", + SP_VERB_CONTEXT_PAINTBUCKET_PREFS, "/tools/paintbucket", N_("Style of Paint Bucket fill objects")}, + { nullptr, nullptr, nullptr, nullptr, + SP_VERB_INVALID, nullptr, nullptr } +}; + +namespace Inkscape { +namespace UI { +namespace Toolbar { + +AuxToolbox::AuxToolbox() +{ + set_name("AuxToolbox"); + + _box = Gtk::make_managed(Gtk::ORIENTATION_VERTICAL, 0); + _box->set_homogeneous(false); + add(*_box); + set_sensitive(false); + show_all(); +} + +void +AuxToolbox::setup(SPDesktop *desktop) +{ + _desktop = desktop; + auto prefs = Inkscape::Preferences::get(); + + // Loop through all the toolbars that can be shown here, create them and + // store each one in a different cell of the main box + for (int i = 0 ; aux_toolboxes[i].type_name ; i++ ) { + if (aux_toolboxes[i].create_func) { + auto sub_toolbox = aux_toolboxes[i].create_func(desktop); + + // We use a Gtk::Grid here so that we can show a tool-specific + // swatch next to the toolbar + auto holder = Gtk::make_managed(); + holder->attach(*sub_toolbox, 0, 0, 1, 1); + + // This part is just for styling + if ( prefs->getBool( "/toolbox/icononly", true) ) { + sub_toolbox->set_toolbar_style(Gtk::TOOLBAR_ICONS); + } + + auto toolboxSize = ToolboxFactory::prefToSize("/toolbox/small"); + sub_toolbox->set_icon_size(static_cast(toolboxSize)); + sub_toolbox->set_hexpand(true); + + // Add a swatch widget if one was specified + if ( aux_toolboxes[i].swatch_verb_id != SP_VERB_INVALID ) { + auto swatch = Gtk::make_managed(nullptr, _(aux_toolboxes[i].swatch_tip)); + swatch->setDesktop(desktop); + swatch->setClickVerb(aux_toolboxes[i].swatch_verb_id); + swatch->setWatchedTool(aux_toolboxes[i].swatch_tool, true); + swatch->set_margin_start(AUX_BETWEEN_BUTTON_GROUPS); + swatch->set_margin_end(AUX_BETWEEN_BUTTON_GROUPS); + swatch->set_margin_top(AUX_SPACING); + swatch->set_margin_bottom(AUX_SPACING); + + holder->attach(*swatch, 1, 0, 1, 1); + } + + // Add the new toolbar into the toolbox + // and also store a pointer to it inside the toolbox. This allows the + // active toolbar to be changed. + _box->add(*holder); + holder->set_name(aux_toolboxes[i].ui_name); + _toolbar_map[aux_toolboxes[i].data_name] = holder; + sub_toolbox->show(); + holder->show_all(); + } else if (aux_toolboxes[i].swatch_verb_id != SP_VERB_NONE) { + g_warning("Could not create toolbox %s", aux_toolboxes[i].ui_name); + } + } +} + +void +AuxToolbox::update(SPDesktop * /*desktop*/, Tools::ToolBase *eventcontext) +{ + gchar const *tname = ( eventcontext + ? eventcontext->getPrefsPath().c_str() //g_type_name(G_OBJECT_TYPE(eventcontext)) + : nullptr ); + for (int i = 0 ; aux_toolboxes[i].type_name ; i++ ) { + auto sub_toolbox = _toolbar_map[aux_toolboxes[i].data_name]; + if (tname && !strcmp(tname, aux_toolboxes[i].type_name)) { + sub_toolbox->show_all(); + _shows = sub_toolbox; + } else { + sub_toolbox->hide(); + } + //FIX issue #Inkscape686 + auto allocation = sub_toolbox->get_allocation(); + sub_toolbox->size_allocate(allocation); + } + //FIX issue #Inkscape125 + auto allocation = get_allocation(); + size_allocate(allocation); +} + +void +AuxToolbox::set_desktop(decltype(_desktop) desktop) +{ + auto old_desktop = _desktop; + + // purge all existing toolbars + if (old_desktop) { + auto children = get_children(); + for (auto i:children) { + gtk_container_remove(GTK_CONTAINER(gobj()), i->gobj()); + } + } + + _desktop = desktop; + + if (desktop) { + set_sensitive(true); + setup(desktop); + update(desktop, desktop->event_context); + _event_context_connection = desktop->connectEventContextChanged(sigc::mem_fun(*this, &AuxToolbox::update)); + } else { + set_sensitive(false); + } +} + +/** + * Shows the currently selected tool-specific toolbar + */ +void +AuxToolbox::show_aux_toolbox() +{ + show(); + + if (_shows) { + _shows->show_all(); + } +} + +} // namespace Toolbar +} // 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:fileencoding=utf-8:textwidth=99 : diff --git a/src/ui/toolbar/aux-toolbox.h b/src/ui/toolbar/aux-toolbox.h new file mode 100644 index 0000000000..cf0e78dd11 --- /dev/null +++ b/src/ui/toolbar/aux-toolbox.h @@ -0,0 +1,80 @@ +// SPDX-License-Identifier: GPL-2.0-or-later +#ifndef SEEN_AUX_TOOLBOX_H +#define SEEN_AUX_TOOLBOX_H + +/** + * @file + * Inkscape auxilliary toolbar + * + * @authors Inkscape Authors + * Copyright (C) 1999-2020 authors + * + * Released under GNU GPL v2+, read the file 'COPYING' for more information. + */ + +#include + +class SPDesktop; + +namespace Gtk { + class Box; + class Grid; +} + +namespace Inkscape { +namespace UI { +namespace Tools { + class ToolBase; +} + +namespace Toolbar { + +/** + * A toolbox that can hold tool-specific widgets and swatches. + * This is the bar that normally appears directly below the main menu. + * + * The contents depends on the currently-selected tool. + */ +class AuxToolbox : public Gtk::EventBox { +private: + SPDesktop *_desktop = nullptr; + sigc::connection _event_context_connection; + + /** + * This box stores each possible toolbar that could be displayed within + * a different cell. Only one of them should be shown at a time. + */ + Gtk::Box *_box = nullptr; + + /// A map of all the toolbars that can be shown here + std::map _toolbar_map; + + /// The toolbar that is currently being shown + Gtk::Grid *_shows = nullptr; + + void update(SPDesktop *desktop, Tools::ToolBase *eventcontext); + void setup(SPDesktop *desktop); + +public: + AuxToolbox(); + + void show_aux_toolbox(); + void set_desktop(decltype(_desktop) desktop); +}; + +} // namespace Toolbar +} // namespace UI +} // namespace Inkscape + +#endif /* !SEEN_AUX_TOOLBOX_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 : diff --git a/src/widgets/desktop-widget.cpp b/src/widgets/desktop-widget.cpp index f70c95cfc1..6679826b75 100644 --- a/src/widgets/desktop-widget.cpp +++ b/src/widgets/desktop-widget.cpp @@ -57,6 +57,9 @@ #include "ui/icon-names.h" #include "ui/tools/box3d-tool.h" #include "ui/uxmanager.h" + +#include "ui/toolbar/aux-toolbox.h" + #include "ui/widget/button.h" #include "ui/widget/canvas.h" #include "ui/widget/canvas-grid.h" @@ -250,7 +253,7 @@ SPDesktopWidget::SPDesktopWidget() dtw->_vbox->pack_end(*dtw->_hbox, true, true); /* Toolboxes */ - dtw->aux_toolbox = Gtk::make_managed(); + dtw->aux_toolbox = Gtk::make_managed(); dtw->_vbox->pack_end(*dtw->aux_toolbox, false, true); dtw->snap_toolbox = ToolboxFactory::createSnapToolbox(); diff --git a/src/widgets/desktop-widget.h b/src/widgets/desktop-widget.h index 054223398e..4aa327eb59 100644 --- a/src/widgets/desktop-widget.h +++ b/src/widgets/desktop-widget.h @@ -39,12 +39,15 @@ class SPObject; namespace Inkscape { namespace UI { -class AuxToolbox; namespace Dialog { class SwatchesPanel; } // namespace Dialog +namespace Toolbar { +class AuxToolbox; +} // namespace Toolbar + namespace Widget { class Button; class Canvas; @@ -215,7 +218,7 @@ public: private: Gtk::EventBox *tool_toolbox = nullptr; - Inkscape::UI::AuxToolbox *aux_toolbox = nullptr; + Inkscape::UI::Toolbar::AuxToolbox *aux_toolbox = nullptr; Gtk::EventBox *commands_toolbox = nullptr; Gtk::EventBox *snap_toolbox = nullptr; diff --git a/src/widgets/toolbox.cpp b/src/widgets/toolbox.cpp index 03c667ba10..d3fb4f12d3 100644 --- a/src/widgets/toolbox.cpp +++ b/src/widgets/toolbox.cpp @@ -56,7 +56,6 @@ #include "ui/uxmanager.h" #include "ui/widget/button.h" #include "ui/widget/spinbutton.h" -#include "ui/widget/style-swatch.h" #include "ui/widget/unit-tracker.h" #include "widgets/spw-utilities.h" @@ -65,28 +64,8 @@ #include "xml/attribute-record.h" #include "xml/node-event-vector.h" -#include "ui/toolbar/arc-toolbar.h" -#include "ui/toolbar/box3d-toolbar.h" -#include "ui/toolbar/calligraphy-toolbar.h" -#include "ui/toolbar/connector-toolbar.h" -#include "ui/toolbar/dropper-toolbar.h" -#include "ui/toolbar/eraser-toolbar.h" -#include "ui/toolbar/gradient-toolbar.h" -#include "ui/toolbar/lpe-toolbar.h" -#include "ui/toolbar/mesh-toolbar.h" -#include "ui/toolbar/measure-toolbar.h" -#include "ui/toolbar/node-toolbar.h" -#include "ui/toolbar/rect-toolbar.h" -#include "ui/toolbar/paintbucket-toolbar.h" -#include "ui/toolbar/pencil-toolbar.h" -#include "ui/toolbar/select-toolbar.h" +#include "ui/toolbar/aux-toolbox.h" #include "ui/toolbar/snap-toolbar.h" -#include "ui/toolbar/spray-toolbar.h" -#include "ui/toolbar/spiral-toolbar.h" -#include "ui/toolbar/star-toolbar.h" -#include "ui/toolbar/tweak-toolbar.h" -#include "ui/toolbar/text-toolbar.h" -#include "ui/toolbar/zoom-toolbar.h" #include "toolbox.h" @@ -166,66 +145,6 @@ static struct { { nullptr, nullptr, 0, 0 } }; -static struct { - gchar const *type_name; - gchar const *data_name; - Inkscape::UI::Toolbar::Toolbar *(*create_func)(SPDesktop *desktop); - gchar const *ui_name; - gint swatch_verb_id; - gchar const *swatch_tool; - gchar const *swatch_tip; -} const aux_toolboxes[] = { - { "/tools/select", "select_toolbox", Inkscape::UI::Toolbar::SelectToolbar::create, "SelectToolbar", - SP_VERB_INVALID, nullptr, nullptr}, - { "/tools/nodes", "node_toolbox", Inkscape::UI::Toolbar::NodeToolbar::create, "NodeToolbar", - SP_VERB_INVALID, nullptr, nullptr}, - { "/tools/tweak", "tweak_toolbox", Inkscape::UI::Toolbar::TweakToolbar::create, "TweakToolbar", - SP_VERB_CONTEXT_TWEAK_PREFS, "/tools/tweak", N_("Color/opacity used for color tweaking")}, - { "/tools/spray", "spray_toolbox", Inkscape::UI::Toolbar::SprayToolbar::create, "SprayToolbar", - SP_VERB_INVALID, nullptr, nullptr}, - { "/tools/zoom", "zoom_toolbox", Inkscape::UI::Toolbar::ZoomToolbar::create, "ZoomToolbar", - SP_VERB_INVALID, nullptr, nullptr}, - // If you change MeasureToolbar here, change it also in desktop-widget.cpp - { "/tools/measure", "measure_toolbox", Inkscape::UI::Toolbar::MeasureToolbar::create, "MeasureToolbar", - SP_VERB_INVALID, nullptr, nullptr}, - { "/tools/shapes/star", "star_toolbox", Inkscape::UI::Toolbar::StarToolbar::create, "StarToolbar", - SP_VERB_CONTEXT_STAR_PREFS, "/tools/shapes/star", N_("Style of new stars")}, - { "/tools/shapes/rect", "rect_toolbox", Inkscape::UI::Toolbar::RectToolbar::create, "RectToolbar", - SP_VERB_CONTEXT_RECT_PREFS, "/tools/shapes/rect", N_("Style of new rectangles")}, - { "/tools/shapes/3dbox", "3dbox_toolbox", Inkscape::UI::Toolbar::Box3DToolbar::create, "3DBoxToolbar", - SP_VERB_CONTEXT_3DBOX_PREFS, "/tools/shapes/3dbox", N_("Style of new 3D boxes")}, - { "/tools/shapes/arc", "arc_toolbox", Inkscape::UI::Toolbar::ArcToolbar::create, "ArcToolbar", - SP_VERB_CONTEXT_ARC_PREFS, "/tools/shapes/arc", N_("Style of new ellipses")}, - { "/tools/shapes/spiral", "spiral_toolbox", Inkscape::UI::Toolbar::SpiralToolbar::create, "SpiralToolbar", - SP_VERB_CONTEXT_SPIRAL_PREFS, "/tools/shapes/spiral", N_("Style of new spirals")}, - { "/tools/freehand/pencil", "pencil_toolbox", Inkscape::UI::Toolbar::PencilToolbar::create_pencil, "PencilToolbar", - SP_VERB_CONTEXT_PENCIL_PREFS, "/tools/freehand/pencil", N_("Style of new paths created by Pencil")}, - { "/tools/freehand/pen", "pen_toolbox", Inkscape::UI::Toolbar::PencilToolbar::create_pen, "PenToolbar", - SP_VERB_CONTEXT_PEN_PREFS, "/tools/freehand/pen", N_("Style of new paths created by Pen")}, - { "/tools/calligraphic", "calligraphy_toolbox", Inkscape::UI::Toolbar::CalligraphyToolbar::create, "CalligraphyToolbar", - SP_VERB_CONTEXT_CALLIGRAPHIC_PREFS, "/tools/calligraphic", N_("Style of new calligraphic strokes")}, - { "/tools/eraser", "eraser_toolbox", Inkscape::UI::Toolbar::EraserToolbar::create, "EraserToolbar", - SP_VERB_CONTEXT_ERASER_PREFS, "/tools/eraser", _("TBD")}, - { "/tools/lpetool", "lpetool_toolbox", Inkscape::UI::Toolbar::LPEToolbar::create, "LPEToolToolbar", - SP_VERB_CONTEXT_LPETOOL_PREFS, "/tools/lpetool", _("TBD")}, - // If you change TextToolbar here, change it also in desktop-widget.cpp - { "/tools/text", "text_toolbox", Inkscape::UI::Toolbar::TextToolbar::create, "TextToolbar", - SP_VERB_INVALID, nullptr, nullptr}, - { "/tools/dropper", "dropper_toolbox", Inkscape::UI::Toolbar::DropperToolbar::create, "DropperToolbar", - SP_VERB_INVALID, nullptr, nullptr}, - { "/tools/connector", "connector_toolbox", Inkscape::UI::Toolbar::ConnectorToolbar::create, "ConnectorToolbar", - SP_VERB_INVALID, nullptr, nullptr}, - { "/tools/gradient", "gradient_toolbox", Inkscape::UI::Toolbar::GradientToolbar::create, "GradientToolbar", - SP_VERB_INVALID, nullptr, nullptr}, - { "/tools/mesh", "mesh_toolbox", Inkscape::UI::Toolbar::MeshToolbar::create, "MeshToolbar", - SP_VERB_INVALID, nullptr, nullptr}, - { "/tools/paintbucket", "paintbucket_toolbox", Inkscape::UI::Toolbar::PaintbucketToolbar::create, "PaintbucketToolbar", - SP_VERB_CONTEXT_PAINTBUCKET_PREFS, "/tools/paintbucket", N_("Style of Paint Bucket fill objects")}, - { nullptr, nullptr, nullptr, nullptr, - SP_VERB_INVALID, nullptr, nullptr } -}; - - static Glib::RefPtr create_or_fetch_actions( SPDesktop* desktop ); static void setup_snap_toolbox(Gtk::Bin *toolbox, SPDesktop *desktop); @@ -405,138 +324,6 @@ Gtk::EventBox * ToolboxFactory::createToolToolbox() return toolboxNewCommon(tb, BAR_TOOL, Gtk::POS_TOP); } - -namespace Inkscape { -namespace UI { -AuxToolbox::AuxToolbox() -{ - set_name("AuxToolbox"); - - _box = Gtk::make_managed(Gtk::ORIENTATION_VERTICAL, 0); - _box->set_homogeneous(false); - add(*_box); - set_sensitive(false); - show_all(); -} - -void -AuxToolbox::setup(SPDesktop *desktop) -{ - _desktop = desktop; - auto prefs = Inkscape::Preferences::get(); - - // Loop through all the toolbars that can be shown here, create them and - // store each one in a different cell of the main box - for (int i = 0 ; aux_toolboxes[i].type_name ; i++ ) { - if (aux_toolboxes[i].create_func) { - auto sub_toolbox = aux_toolboxes[i].create_func(desktop); - - // We use a Gtk::Grid here so that we can show a tool-specific - // swatch next to the toolbar - auto holder = Gtk::make_managed(); - holder->attach(*sub_toolbox, 0, 0, 1, 1); - - // This part is just for styling - if ( prefs->getBool( "/toolbox/icononly", true) ) { - sub_toolbox->set_toolbar_style(Gtk::TOOLBAR_ICONS); - } - - auto toolboxSize = ToolboxFactory::prefToSize("/toolbox/small"); - sub_toolbox->set_icon_size(static_cast(toolboxSize)); - sub_toolbox->set_hexpand(true); - - // Add a swatch widget if one was specified - if ( aux_toolboxes[i].swatch_verb_id != SP_VERB_INVALID ) { - auto swatch = Gtk::make_managed(nullptr, _(aux_toolboxes[i].swatch_tip)); - swatch->setDesktop(desktop); - swatch->setClickVerb(aux_toolboxes[i].swatch_verb_id); - swatch->setWatchedTool(aux_toolboxes[i].swatch_tool, true); - swatch->set_margin_start(AUX_BETWEEN_BUTTON_GROUPS); - swatch->set_margin_end(AUX_BETWEEN_BUTTON_GROUPS); - swatch->set_margin_top(AUX_SPACING); - swatch->set_margin_bottom(AUX_SPACING); - - holder->attach(*swatch, 1, 0, 1, 1); - } - - // Add the new toolbar into the toolbox - // and also store a pointer to it inside the toolbox. This allows the - // active toolbar to be changed. - _box->add(*holder); - holder->set_name(aux_toolboxes[i].ui_name); - _toolbar_map[aux_toolboxes[i].data_name] = holder; - sub_toolbox->show(); - holder->show_all(); - } else if (aux_toolboxes[i].swatch_verb_id != SP_VERB_NONE) { - g_warning("Could not create toolbox %s", aux_toolboxes[i].ui_name); - } - } -} - -void -AuxToolbox::update(SPDesktop * /*desktop*/, ToolBase *eventcontext) -{ - gchar const *tname = ( eventcontext - ? eventcontext->getPrefsPath().c_str() //g_type_name(G_OBJECT_TYPE(eventcontext)) - : nullptr ); - for (int i = 0 ; aux_toolboxes[i].type_name ; i++ ) { - auto sub_toolbox = _toolbar_map[aux_toolboxes[i].data_name]; - if (tname && !strcmp(tname, aux_toolboxes[i].type_name)) { - sub_toolbox->show_all(); - _shows = sub_toolbox; - } else { - sub_toolbox->hide(); - } - //FIX issue #Inkscape686 - auto allocation = sub_toolbox->get_allocation(); - sub_toolbox->size_allocate(allocation); - } - //FIX issue #Inkscape125 - auto allocation = get_allocation(); - size_allocate(allocation); -} - -void -AuxToolbox::set_desktop(decltype(_desktop) desktop) -{ - auto old_desktop = _desktop; - - // purge all existing toolbars - if (old_desktop) { - auto children = get_children(); - for (auto i:children) { - gtk_container_remove(GTK_CONTAINER(gobj()), i->gobj()); - } - } - - _desktop = desktop; - - if (desktop) { - set_sensitive(true); - setup(desktop); - update(desktop, desktop->event_context); - _event_context_connection = desktop->connectEventContextChanged(sigc::mem_fun(*this, &AuxToolbox::update)); - } else { - set_sensitive(false); - } -} - -/** - * Shows the currently selected tool-specific toolbar - */ -void -AuxToolbox::show_aux_toolbox() -{ - show(); - - if (_shows) { - _shows->show_all(); - } -} - -} // namespace UI -} // namespace Inkscape - //#################################### //# Commands Bar //#################################### @@ -561,7 +348,7 @@ Gtk::EventBox * ToolboxFactory::createSnapToolbox() void ToolboxFactory::setToolboxDesktop(Gtk::EventBox *toolbox, SPDesktop *desktop) { - auto aux_toolbox = dynamic_cast(toolbox); + auto aux_toolbox = dynamic_cast(toolbox); if (aux_toolbox) { aux_toolbox->set_desktop(desktop); diff --git a/src/widgets/toolbox.h b/src/widgets/toolbox.h index 29e4f6eb4f..2cf9deae3e 100644 --- a/src/widgets/toolbox.h +++ b/src/widgets/toolbox.h @@ -16,7 +16,6 @@ #include -#include #include #include "preferences.h" @@ -27,9 +26,7 @@ class SPDesktop; namespace Gtk { class Bin; -class Box; class EventBox; -class Grid; } namespace Inkscape { @@ -70,40 +67,6 @@ public: ToolboxFactory() = delete; }; -/** - * A toolbox that can hold tool-specific widgets and swatches. - * This is the bar that normally appears directly below the main menu. - * - * The contents depends on the currently-selected tool. - */ -class AuxToolbox : public Gtk::EventBox { -private: - SPDesktop *_desktop = nullptr; - sigc::connection _event_context_connection; - - /** - * This box stores each possible toolbar that could be displayed within - * a different cell. Only one of them should be shown at a time. - */ - Gtk::Box *_box = nullptr; - - /// A map of all the toolbars that can be shown here - std::map _toolbar_map; - - /// The toolbar that is currently being shown - Gtk::Grid *_shows = nullptr; - - void update(SPDesktop *desktop, Tools::ToolBase *eventcontext); - void setup(SPDesktop *desktop); - -public: - AuxToolbox(); - - void show_aux_toolbox(); - void set_desktop(decltype(_desktop) desktop); -}; - - } // namespace UI } // namespace Inkscape -- GitLab From d99ff571896c291b37c3d816c460dac4821a205c Mon Sep 17 00:00:00 2001 From: Alex Valavanis Date: Sun, 28 Jun 2020 21:13:28 +0100 Subject: [PATCH 5/5] Fix license header --- src/ui/toolbar/aux-toolbox.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/src/ui/toolbar/aux-toolbox.cpp b/src/ui/toolbar/aux-toolbox.cpp index d16cf8a677..86c9fbc94a 100644 --- a/src/ui/toolbar/aux-toolbox.cpp +++ b/src/ui/toolbar/aux-toolbox.cpp @@ -1,3 +1,4 @@ +// SPDX-License-Identifier: GPL-2.0-or-later /** * @file * Inkscape Auxilliary toolbar -- GitLab