Code

Fix sculpting of nodes with non-degenerate handles.
[inkscape.git] / src / ui / uxmanager.cpp
index d5fa90406fbb437c3cf9083e2a4ee9a1907be7b6..a3ccb347176e7e65132568f064921617602d4d8f 100644 (file)
 #include <algorithm>
 
 #include "uxmanager.h"
+#include "desktop.h"
 #include "util/ege-tags.h"
 #include "widgets/toolbox.h"
 #include "widgets/desktop-widget.h"
+#include "preferences.h"
+#include "gdkmm/screen.h"
 
 #ifdef GDK_WINDOWING_X11
 #include <gdk/gdkx.h>
@@ -37,23 +40,72 @@ static vector<SPDesktopWidget*> dtws;
 static map<SPDesktop*, vector<GtkWidget*> > trackedBoxes;
 
 
+namespace {
+// 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 = 0;
 
+class UXManagerImpl : public UXManager
+{
+public:
+    UXManagerImpl();
+    virtual ~UXManagerImpl();
+
+    virtual void addTrack( SPDesktopWidget* dtw );
+    virtual void delTrack( SPDesktopWidget* dtw );
+
+    virtual void connectToDesktop( vector<GtkWidget *> const & toolboxes, SPDesktop *desktop );
+
+    virtual gint getDefaultTask( SPDesktop *desktop );
+    virtual void setTask(SPDesktop* dt, gint val);
+
+    virtual bool isFloatWindowProblem() const;
+    virtual bool isWidescreen() const;
+
+private:
+    bool _floatwindowIssues;
+    bool _widescreen;
+};
+
 UXManager* UXManager::getInstance()
 {
     if (!instance) {
-        instance = new UXManager();
+        instance = new UXManagerImpl();
     }
     return instance;
 }
 
 
-UXManager::UXManager() :
-    floatwindowIssues(false)
+UXManager::UXManager()
+{
+}
+
+UXManager::~UXManager()
+{
+}
+
+UXManagerImpl::UXManagerImpl() :
+    _floatwindowIssues(false),
+    _widescreen(false)
 {
     ege::TagSet tags;
     tags.setLang("en");
@@ -61,67 +113,106 @@ UXManager::UXManager() :
     tags.addTag(ege::Tag("General"));
     tags.addTag(ege::Tag("Icons"));
 
-#ifdef GDK_WINDOWING_X11
+#if defined(GDK_WINDOWING_X11)
     char const* wmName = gdk_x11_screen_get_window_manager_name( gdk_screen_get_default() );
     //g_message("Window manager is [%s]", wmName);
 
     //if (g_ascii_strcasecmp( wmName, UNKOWN_WINDOW_MANAGER_NAME ) == 0) {
     if (g_ascii_strcasecmp( wmName, KDE_WINDOW_MANAGER_NAME ) == 0) {
-        floatwindowIssues = true;
+        _floatwindowIssues = true;
     }
-#elif GDK_WINDOWING_WIN32
-    floatwindowIssues = true;
+#elif defined(GDK_WINDOWING_WIN32)
+    _floatwindowIssues = true;
 #endif // GDK_WINDOWING_WIN32
+
+
+    Glib::RefPtr<Gdk::Screen> defaultScreen = Gdk::Screen::get_default();
+    if (defaultScreen) {
+        int width = defaultScreen->get_width();
+        int height = defaultScreen->get_height();
+        gdouble aspect = static_cast<gdouble>(width) / static_cast<gdouble>(height);
+        if (aspect > 1.65) {
+            _widescreen = true;
+        }
+    }
 }
 
-UXManager::~UXManager()
+UXManagerImpl::~UXManagerImpl()
 {
 }
 
+bool UXManagerImpl::isFloatWindowProblem() const
+{
+    return _floatwindowIssues;
+}
 
-bool UXManager::isFloatWindowProblem() const
+bool UXManagerImpl::isWidescreen() const
 {
-    return floatwindowIssues;
+    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 UXManager::setTask(SPDesktop* dt, gint val)
+void UXManagerImpl::setTask(SPDesktop* dt, gint val)
 {
     for (vector<SPDesktopWidget*>::iterator it = dtws.begin(); it != dtws.end(); ++it) {
         SPDesktopWidget* dtw = *it;
+
+        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);
-                    //dtw->setToolboxPosition("AuxToolbar", GTK_POS_TOP);
-                    dtw->setToolboxPosition("SnapToolbar", 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_TOP);
-                    dtw->setToolboxPosition("CommandsToolbar", GTK_POS_LEFT);
-                    //dtw->setToolboxPosition("AuxToolbar", GTK_POS_TOP);
-                    dtw->setToolboxPosition("SnapToolbar", GTK_POS_RIGHT);
+                    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);
-                    //dtw->setToolboxPosition("AuxToolbar", 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 UXManager::addTrack( SPDesktopWidget* dtw )
+void UXManagerImpl::addTrack( SPDesktopWidget* dtw )
 {
     if (std::find(dtws.begin(), dtws.end(), dtw) == dtws.end()) {
         dtws.push_back(dtw);
     }
 }
 
-void UXManager::delTrack( SPDesktopWidget* dtw )
+void UXManagerImpl::delTrack( SPDesktopWidget* dtw )
 {
     vector<SPDesktopWidget*>::iterator iter = std::find(dtws.begin(), dtws.end(), dtw);
     if (iter != dtws.end()) {
@@ -129,9 +220,9 @@ void UXManager::delTrack( SPDesktopWidget* dtw )
     }
 }
 
-void UXManager::connectToDesktop( vector<GtkWidget *> const & toolboxes, SPDesktop *desktop )
+void UXManagerImpl::connectToDesktop( vector<GtkWidget *> const & toolboxes, SPDesktop *desktop )
 {
-//static map<SPDesktop*, vector<GtkWidget*> > trackedBoxes;
+    //static map<SPDesktop*, vector<GtkWidget*> > trackedBoxes;
 
     for (vector<GtkWidget*>::const_iterator it = toolboxes.begin(); it != toolboxes.end(); ++it ) {
         GtkWidget* toolbox = *it;
@@ -146,6 +237,11 @@ void UXManager::connectToDesktop( vector<GtkWidget *> const & toolboxes, SPDeskt
     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 );
 }