summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog/dialog-base.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/dialog/dialog-base.h')
-rw-r--r--src/ui/dialog/dialog-base.h135
1 files changed, 135 insertions, 0 deletions
diff --git a/src/ui/dialog/dialog-base.h b/src/ui/dialog/dialog-base.h
new file mode 100644
index 0000000..4e3f7e4
--- /dev/null
+++ b/src/ui/dialog/dialog-base.h
@@ -0,0 +1,135 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+
+#ifndef INK_DIALOG_BASE_H
+#define INK_DIALOG_BASE_H
+
+/** @file
+ * @brief A base class for all dialogs.
+ *
+ * Authors: see git history
+ * Tavmjong Bah
+ *
+ * Copyright (c) 2018 Tavmjong Bah, Authors
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include <glibmm/ustring.h>
+#include <gtkmm/box.h>
+
+#include "inkscape-application.h"
+
+class SPDesktop;
+
+namespace Inkscape {
+namespace UI {
+namespace Dialog {
+
+/**
+ * DialogBase is the base class for the dialog system.
+ *
+ * Each dialog has a reference to the application, in order to update it's inner focus
+ * (be it of the active desktop, document, selection, etc.) in the update() method.
+ *
+ * DialogsBase derived classes' instances live in DialogNotebook classes and are managed by
+ * DialogContainer classes. DialogContainer instances can have at most one type of dialog,
+ * differentiated by the associated type.
+ */
+class DialogBase : public Gtk::Box
+{
+ using parent_type = Gtk::Box;
+
+public:
+ DialogBase(gchar const *prefs_path = nullptr, Glib::ustring dialog_type = "");
+ ~DialogBase() override;
+
+ /**
+ * The update() method is essential to Gtk state management. DialogBase implementations get updated whenever
+ * a new focus event happens if they are in a DialogWindow or if they are in the currently focused window.
+ *
+ * DO NOT use update to keep SPDesktop, SPDocument or Selection states, use the virtual functions below.
+ */
+ virtual void update() {}
+
+ // Public for future use, say if the desktop is smartly set when docking dialogs.
+ void setDesktop(SPDesktop *new_desktop);
+
+ void on_map() override;
+
+ /*
+ * Often the dialog won't request the right size until the window has
+ * been pushed to resize all it's children. We do this on dialog creation
+ * and destruction.
+ */
+ void ensure_size();
+
+ // Getters and setters
+ Glib::ustring get_name() { return _name; };
+ const Glib::ustring& getPrefsPath() const { return _prefs_path; }
+ Glib::ustring const &get_type() const { return _dialog_type; }
+
+ void blink();
+ // find focusable widget to grab focus
+ void focus_dialog();
+ // return focus back to canvas
+ void defocus_dialog();
+ bool getShowing() { return _showing; }
+ // fix children scrolled windows to send outer scroll when his own reach limits
+ void fix_inner_scroll(Gtk::Widget *child);
+ // Too many dialogs have unprotected calls to ask for this data
+ SPDesktop *getDesktop() const { return desktop; }
+protected:
+ InkscapeApplication *getApp() const { return _app; }
+ SPDocument *getDocument() const { return document; }
+ Selection *getSelection() const { return selection; }
+ friend class DialogNotebook;
+ void setShowing(bool showing);
+ Glib::ustring _name; // Gtk widget name (must be set!)
+ Glib::ustring const _prefs_path; // Stores characteristic path for loading/saving the dialog position.
+ Glib::ustring const _dialog_type; // Type of dialog (we could just use _pref_path?).
+private:
+ bool blink_off(); // timer callback
+ bool on_key_press_event(GdkEventKey* key_event) override;
+ // return if dialog is on visible tab
+ bool _showing = true;
+ void unsetDesktop();
+ void desktopDestroyed(SPDesktop* old_desktop);
+ void setDocument(SPDocument *new_document);
+ /**
+ * Called when the desktop has certainly changed. It may have changed to nullptr
+ * when destructing the dialog, so the override should expect nullptr too.
+ */
+ virtual void desktopReplaced() {}
+ virtual void documentReplaced() {}
+ void selectionChanged_impl(Inkscape::Selection *selection);
+ void selectionModified_impl(Inkscape::Selection *selection, guint flags);
+ virtual void selectionChanged(Inkscape::Selection *selection) {};
+ virtual void selectionModified(Inkscape::Selection *selection, guint flags) {};
+
+ sigc::connection _desktop_destroyed;
+ sigc::connection _doc_replaced;
+ sigc::connection _select_changed;
+ sigc::connection _select_modified;
+
+ InkscapeApplication *_app; // Used for state management
+ SPDesktop *desktop;
+ SPDocument *document;
+ Selection *selection;
+};
+
+} // namespace Dialog
+} // namespace UI
+} // namespace Inkscape
+
+#endif // INK_DIALOG_BASE_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 :