From cca66b9ec4e494c1d919bff0f71a820d8afab1fa Mon Sep 17 00:00:00 2001 From: Daniel Baumann Date: Sun, 7 Apr 2024 20:24:48 +0200 Subject: Adding upstream version 1.2.2. Signed-off-by: Daniel Baumann --- src/ui/dialog/dialog-container.h | 130 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 src/ui/dialog/dialog-container.h (limited to 'src/ui/dialog/dialog-container.h') diff --git a/src/ui/dialog/dialog-container.h b/src/ui/dialog/dialog-container.h new file mode 100644 index 0000000..c6fa30a --- /dev/null +++ b/src/ui/dialog/dialog-container.h @@ -0,0 +1,130 @@ +// SPDX-License-Identifier: GPL-2.0-or-later + +#ifndef INKSCAPE_UI_DIALOG_CONTAINER_H +#define INKSCAPE_UI_DIALOG_CONTAINER_H + +/** @file + * @brief A widget that manages DialogNotebook's and other widgets inside a horizontal DialogMultipaned. + * + * 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 +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "dialog-manager.h" +#include "desktop.h" + +namespace Inkscape { +namespace UI { +namespace Dialog { + +class DialogBase; +class DialogNotebook; +class DialogMultipaned; +class DialogWindow; + +/** + * A widget that manages DialogNotebook's and other widgets inside a + * horizontal DialogMultipaned containing vertical DialogMultipaned's or other widgets. + */ +class DialogContainer : public Gtk::Box +{ + using parent_type = Gtk::Box; + +public: + DialogContainer(InkscapeWindow* inkscape_window); + ~DialogContainer() override; + + // Columns-related functions + DialogMultipaned *get_columns() { return columns; } + DialogMultipaned *create_column(); + + // Dialog-related functions + void new_dialog(const Glib::ustring& dialog_type); + + DialogWindow* new_floating_dialog(const Glib::ustring& dialog_type); + bool has_dialog_of_type(DialogBase *dialog); + DialogBase *get_dialog(const Glib::ustring& dialog_type); + void link_dialog(DialogBase *dialog); + void unlink_dialog(DialogBase *dialog); + const std::multimap *get_dialogs() { return &dialogs; }; + void toggle_dialogs(); + void update_dialogs(); // Update all linked dialogs + void set_inkscape_window(InkscapeWindow *inkscape_window); + InkscapeWindow* get_inkscape_window() { return _inkscape_window; } + + // State saving functionality + std::unique_ptr save_container_state(); + void load_container_state(Glib::KeyFile* keyfile, bool include_floating); + + void restore_window_position(DialogWindow* window); + void store_window_position(DialogWindow* window); + + // get this container's state; provide window position for container embedded in DialogWindow + std::shared_ptr get_container_state(const window_position_t* position) const; + void load_container_state(Glib::KeyFile& state, const std::string& window_id); + +private: + InkscapeWindow *_inkscape_window = nullptr; // Every container is attached to an InkscapeWindow. + DialogMultipaned *columns = nullptr; // The main widget inside which other children are kept. + std::vector target_entries; // What kind of object can be dropped. + + /** + * Due to the way Gtk handles dragging between notebooks, one can + * either allow multiple instances of the same dialog in a notebook + * or restrict dialogs to docks tied to a particular document + * window. (More explicitly, use one group name for all notebooks or + * use a unique group name for each document window with related + * floating docks.) For the moment we choose the former which + * requires a multimap here as we use the dialog type as a key. + */ + std::multimapdialogs; + + void new_dialog(const Glib::ustring& dialog_type, DialogNotebook* notebook); + DialogBase *dialog_factory(const Glib::ustring& dialog_type); + Gtk::Widget *create_notebook_tab(Glib::ustring label, Glib::ustring image, const Glib::ustring shortcut); + DialogWindow* create_new_floating_dialog(const Glib::ustring& dialog_type, bool blink); + + // Signal connections + std::vector connections; + + // Handlers + void on_unrealize() override; + DialogNotebook *prepare_drop(const Glib::RefPtr context); + void prepend_drop(const Glib::RefPtr context, DialogMultipaned *column); + void append_drop(const Glib::RefPtr context, DialogMultipaned *column); + void column_empty(DialogMultipaned *column); + DialogBase* find_existing_dialog(const Glib::ustring& dialog_type); + static bool recreate_dialogs_from_state(InkscapeWindow* inkscape_window, const Glib::KeyFile* keyfile); +}; + +} // namespace Dialog +} // namespace UI +} // namespace Inkscape + +#endif // INKSCAPE_UI_DIALOG_CONTAINER_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 : -- cgit v1.2.3