summaryrefslogtreecommitdiffstats
path: root/src/ui/uxmanager.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/ui/uxmanager.cpp')
-rw-r--r--src/ui/uxmanager.cpp246
1 files changed, 246 insertions, 0 deletions
diff --git a/src/ui/uxmanager.cpp b/src/ui/uxmanager.cpp
new file mode 100644
index 0000000..1f62ece
--- /dev/null
+++ b/src/ui/uxmanager.cpp
@@ -0,0 +1,246 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/** \file
+ * Desktop widget implementation.
+ */
+/* Authors:
+ * Jon A. Cruz <jon@joncruz.org>
+ *
+ * Copyright (C) 2010 Jon A. Cruz
+ *
+ * Released under GNU GPL v2+, read the file 'COPYING' for more information.
+ */
+
+#include <vector>
+#include "widgets/desktop-widget.h"
+
+#include "uxmanager.h"
+#include "desktop.h"
+#include "ui/monitor.h"
+#include "util/ege-tags.h"
+#include "widgets/toolbox.h"
+
+class TrackItem
+{
+public:
+ TrackItem() :
+ destroyConn(),
+ boxes()
+ {}
+
+ sigc::connection destroyConn;
+ std::vector<GtkWidget*> boxes;
+};
+
+static std::vector<SPDesktop*> desktops;
+static std::vector<SPDesktopWidget*> dtws;
+static std::map<SPDesktop*, TrackItem> trackedBoxes;
+
+
+namespace {
+
+void desktopDestructHandler(SPDesktop *desktop)
+{
+ std::map<SPDesktop*, TrackItem>::iterator it = trackedBoxes.find(desktop);
+ if (it != trackedBoxes.end())
+ {
+ trackedBoxes.erase(it);
+ }
+}
+
+
+// TODO unify this later:
+static Glib::ustring getLayoutPrefPath( Inkscape::UI::View::View *view )
+{
+ Glib::ustring prefPath;
+
+ if (reinterpret_cast<SPDesktop*>(view)->is_focusMode()) {
+ prefPath = "/focus/";
+ } else if (reinterpret_cast<SPDesktop*>(view)->is_fullscreen()) {
+ prefPath = "/fullscreen/";
+ } else {
+ prefPath = "/window/";
+ }
+
+ return prefPath;
+}
+
+}
+
+namespace Inkscape {
+namespace UI {
+
+UXManager* instance = nullptr;
+
+class UXManagerImpl : public UXManager
+{
+public:
+ UXManagerImpl();
+ ~UXManagerImpl() override;
+
+ void addTrack( SPDesktopWidget* dtw ) override;
+ void delTrack( SPDesktopWidget* dtw ) override;
+
+ void connectToDesktop( std::vector<GtkWidget *> const & toolboxes, SPDesktop *desktop ) override;
+
+ gint getDefaultTask( SPDesktop *desktop ) override;
+ void setTask(SPDesktop* dt, gint val) override;
+
+ bool isWidescreen() const override;
+
+private:
+ bool _widescreen;
+};
+
+UXManager* UXManager::getInstance()
+{
+ if (!instance) {
+ instance = new UXManagerImpl();
+ }
+ return instance;
+}
+
+
+UXManager::UXManager()
+= default;
+
+UXManager::~UXManager()
+= default;
+
+UXManagerImpl::UXManagerImpl() :
+ _widescreen(false)
+{
+ ege::TagSet tags;
+ tags.setLang("en");
+
+ tags.addTag(ege::Tag("General"));
+ tags.addTag(ege::Tag("Icons"));
+
+ // Figure out if we're on a widescreen display
+ Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_primary();
+ int const width = monitor_geometry.get_width();
+ int const height = monitor_geometry.get_height();
+
+ if (width && height) {
+ gdouble aspect = static_cast<gdouble>(width) / static_cast<gdouble>(height);
+ if (aspect > 1.65) {
+ _widescreen = true;
+ }
+ }
+}
+
+UXManagerImpl::~UXManagerImpl()
+= default;
+
+bool UXManagerImpl::isWidescreen() const
+{
+ return _widescreen;
+}
+
+gint UXManagerImpl::getDefaultTask( SPDesktop *desktop )
+{
+ gint taskNum = isWidescreen() ? 2 : 0;
+
+ Glib::ustring prefPath = getLayoutPrefPath( desktop );
+ taskNum = Inkscape::Preferences::get()->getInt( prefPath + "task/taskset", taskNum );
+ taskNum = (taskNum < 0) ? 0 : (taskNum > 2) ? 2 : taskNum;
+
+ return taskNum;
+}
+
+void UXManagerImpl::setTask(SPDesktop* dt, gint val)
+{
+ for (auto dtw : dtws) {
+ gboolean notDone = Inkscape::Preferences::get()->getBool("/options/workarounds/dynamicnotdone", false);
+
+ if (dtw->desktop == dt) {
+ int taskNum = val;
+ switch (val) {
+ default:
+ case 0:
+ dtw->setToolboxPosition("ToolToolbar", GTK_POS_LEFT);
+ dtw->setToolboxPosition("CommandsToolbar", GTK_POS_TOP);
+ if (notDone) {
+ dtw->setToolboxPosition("AuxToolbar", GTK_POS_TOP);
+ }
+ dtw->setToolboxPosition("SnapToolbar", GTK_POS_RIGHT);
+ taskNum = val; // in case it was out of range
+ break;
+ case 1:
+ dtw->setToolboxPosition("ToolToolbar", GTK_POS_LEFT);
+ dtw->setToolboxPosition("CommandsToolbar", GTK_POS_TOP);
+ if (notDone) {
+ dtw->setToolboxPosition("AuxToolbar", GTK_POS_TOP);
+ }
+ dtw->setToolboxPosition("SnapToolbar", GTK_POS_TOP);
+ break;
+ case 2:
+ dtw->setToolboxPosition("ToolToolbar", GTK_POS_LEFT);
+ dtw->setToolboxPosition("CommandsToolbar", GTK_POS_RIGHT);
+ dtw->setToolboxPosition("SnapToolbar", GTK_POS_RIGHT);
+ if (notDone) {
+ dtw->setToolboxPosition("AuxToolbar", GTK_POS_RIGHT);
+ }
+ }
+ Glib::ustring prefPath = getLayoutPrefPath( dtw->desktop );
+ Inkscape::Preferences::get()->setInt( prefPath + "task/taskset", taskNum );
+ }
+ }
+}
+
+
+void UXManagerImpl::addTrack( SPDesktopWidget* dtw )
+{
+ if (std::find(dtws.begin(), dtws.end(), dtw) == dtws.end()) {
+ dtws.push_back(dtw);
+ }
+}
+
+void UXManagerImpl::delTrack( SPDesktopWidget* dtw )
+{
+ std::vector<SPDesktopWidget*>::iterator iter = std::find(dtws.begin(), dtws.end(), dtw);
+ if (iter != dtws.end()) {
+ dtws.erase(iter);
+ }
+}
+
+void UXManagerImpl::connectToDesktop( std::vector<GtkWidget *> const & toolboxes, SPDesktop *desktop )
+{
+ if (!desktop)
+ {
+ return;
+ }
+ TrackItem &tracker = trackedBoxes[desktop];
+ std::vector<GtkWidget*>& tracked = tracker.boxes;
+ tracker.destroyConn = desktop->connectDestroy(&desktopDestructHandler);
+
+ for (auto toolbox : toolboxes) {
+ ToolboxFactory::setToolboxDesktop( toolbox, desktop );
+ if (find(tracked.begin(), tracked.end(), toolbox) == tracked.end()) {
+ tracked.push_back(toolbox);
+ }
+ }
+
+ if (std::find(desktops.begin(), desktops.end(), desktop) == desktops.end()) {
+ desktops.push_back(desktop);
+ }
+
+ gint taskNum = getDefaultTask( desktop );
+
+ // note: this will change once more options are in the task set support:
+ Inkscape::UI::UXManager::getInstance()->setTask( desktop, taskNum );
+}
+
+
+} // 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 :