summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/file.cpp20
-rw-r--r--src/inkscape-window.cpp87
-rw-r--r--src/inkscape-window.h7
-rw-r--r--src/ui/interface.cpp79
-rw-r--r--src/ui/interface.h7
5 files changed, 89 insertions, 111 deletions
diff --git a/src/file.cpp b/src/file.cpp
index bdcde3c0e..cce831827 100644
--- a/src/file.cpp
+++ b/src/file.cpp
@@ -35,6 +35,7 @@
#include <gtkmm.h>
#include "file.h"
+#include "inkscape-window.h"
#include "desktop.h"
#include "document-undo.h"
@@ -142,13 +143,8 @@ SPDesktop *sp_file_new(const std::string &templ)
if (olddesktop)
olddesktop->setWaitingCursor();
- SPViewWidget *dtw = sp_desktop_widget_new(sp_document_namedview(doc, nullptr)); // TODO this will trigger broken link warnings, etc.
- g_return_val_if_fail(dtw != nullptr, NULL);
- sp_create_window(dtw, TRUE);
- SPDesktop* desktop = static_cast<SPDesktop *>(dtw->view);
-
- sp_namedview_window_from_document(desktop);
- sp_namedview_update_layers_from_document(desktop);
+ InkscapeWindow* win = new InkscapeWindow(doc);
+ SPDesktop* desktop = win->get_desktop();
#ifdef WITH_DBUS
Inkscape::Extension::Dbus::dbus_init_desktop_interface(desktop);
@@ -246,10 +242,8 @@ bool sp_file_open(const Glib::ustring &uri,
doc->emitResizedSignal(doc->getWidth().value("px"), doc->getHeight().value("px"));
} else {
- // Create a whole new desktop and window
- SPViewWidget *dtw = sp_desktop_widget_new(sp_document_namedview(doc, nullptr)); // TODO this will trigger broken link warnings, etc.
- sp_create_window(dtw, TRUE);
- desktop = static_cast<SPDesktop*>(dtw->view);
+ InkscapeWindow* win = new InkscapeWindow(doc);
+ desktop = win->get_desktop();
}
doc->virgin = FALSE;
@@ -282,10 +276,6 @@ bool sp_file_open(const Glib::ustring &uri,
// ------------------ Window options ---------------
- // Resize the window to match the document properties
- sp_namedview_window_from_document(desktop);
- sp_namedview_update_layers_from_document(desktop);
-
// Lock Guides
SPNamedView *nv = desktop->namedview;
if (nv->lockguides) {
diff --git a/src/inkscape-window.cpp b/src/inkscape-window.cpp
index 6f1a5316c..be8737c8f 100644
--- a/src/inkscape-window.cpp
+++ b/src/inkscape-window.cpp
@@ -17,8 +17,13 @@
#include "inkscape-window.h"
#include "inkscape.h" // SP_ACTIVE_DESKTOP
+#include "enums.h" // PREFS_WINDOW_GEOMETRY_NONE
#include "shortcuts.h"
-#include "inkscape-application.h"
+
+#include "object/sp-namedview.h" // TODO Remove need for this!
+
+#include "ui/drag-and-drop.h" // Move to canvas?
+#include "ui/monitor.h" // get_monitor_geometry_at_point()
#include "ui/drag-and-drop.h"
@@ -32,6 +37,7 @@ InkscapeWindow::InkscapeWindow(SPDocument* document)
return;
}
+ // Register window with application.
Glib::RefPtr<Gio::Application> gio_app = Gio::Application::get_default();
Glib::RefPtr<Gtk::Application> app = Glib::RefPtr<Gtk::Application>::cast_dynamic(gio_app);
if (app) {
@@ -42,22 +48,79 @@ InkscapeWindow::InkscapeWindow(SPDocument* document)
set_resizable(true);
- // Set up drag-and-drop, probably should be moved to SPCanvas.
sp_ui_drag_setup(this);
- // Callbacks
+ // =============== Build interface ===============
+
+ // Main box
+ _mainbox = Gtk::manage(new Gtk::Box);
+ _mainbox->set_name("DesktopMainBox");
+ _mainbox->show();
+ add(*_mainbox);
+
+ // Menu bar
+
+ // Desktop widget (=> MultiPaned)
+ SPViewWidget* _vw = sp_desktop_widget_new(sp_document_namedview(document, nullptr));
+ _desktop_widget = reinterpret_cast<SPDesktopWidget*>(_vw);
+ gtk_container_add(GTK_CONTAINER(_mainbox->gobj()), GTK_WIDGET(_desktop_widget));
+ gtk_widget_show(GTK_WIDGET(_desktop_widget));
+ _desktop = _desktop_widget->desktop;
+
+ // Pallet
+
+ // Status bar
+
+ // ================== Callbacks ==================
signal_key_press_event().connect(sigc::mem_fun(*this, &InkscapeWindow::key_press));
- // Actions
-}
+ // =================== Actions ===================
+
+
+ // ============ Stuff to be cleaned up ===========
+
+ g_object_set_data(G_OBJECT(_desktop_widget), "window", this);
+ _desktop_widget->window = this;
+
+ set_data("desktop", _desktop);
+ set_data("desktopwidget", _desktop_widget);
+
+ signal_delete_event().connect( sigc::mem_fun(*_desktop, &SPDesktop::onDeleteUI));
+ signal_window_state_event().connect(sigc::mem_fun(*_desktop, &SPDesktop::onWindowStateEvent));
+ signal_focus_in_event().connect(sigc::mem_fun(*_desktop_widget, &SPDesktopWidget::onFocusInEvent));
+
+ Inkscape::Preferences *prefs = Inkscape::Preferences::get();
+ int window_geometry = prefs->getInt("/options/savewindowgeometry/value", PREFS_WINDOW_GEOMETRY_NONE);
+ if (window_geometry == PREFS_WINDOW_GEOMETRY_LAST) {
+ gint pw = prefs->getInt("/desktop/geometry/width", -1);
+ gint ph = prefs->getInt("/desktop/geometry/height", -1);
+ gint px = prefs->getInt("/desktop/geometry/x", -1);
+ gint py = prefs->getInt("/desktop/geometry/y", -1);
+ gint full = prefs->getBool("/desktop/geometry/fullscreen");
+ gint maxed = prefs->getBool("/desktop/geometry/maximized");
+ if (pw>0 && ph>0) {
+ Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_at_point(px, py);
+ pw = std::min(pw, monitor_geometry.get_width());
+ ph = std::min(ph, monitor_geometry.get_height());
+ _desktop->setWindowSize(pw, ph);
+ _desktop->setWindowPosition(Geom::Point(px, py));
+ }
+ if (maxed) {
+ maximize();
+ }
+ if (full) {
+ fullscreen();
+ }
+ }
+
+ // ================ Window Options ==============
+
+ show(); // Must show before resize!
+
+ // Resize the window to match the document properties
+ sp_namedview_window_from_document(_desktop);
+ sp_namedview_update_layers_from_document(_desktop);
-// TEMP: We should be creating the desktop widget and desktop in constructor.
-void
-InkscapeWindow::set_desktop_widget(SPDesktopWidget* desktop_widget)
-{
- gtk_container_add(GTK_CONTAINER(gobj()), GTK_WIDGET(desktop_widget));
- gtk_widget_show(GTK_WIDGET(desktop_widget));
- _desktop = desktop_widget->desktop;
}
bool
diff --git a/src/inkscape-window.h b/src/inkscape-window.h
index 1389a6f32..8aa19d508 100644
--- a/src/inkscape-window.h
+++ b/src/inkscape-window.h
@@ -36,11 +36,16 @@ class InkscapeWindow : public Gtk::ApplicationWindow {
public:
InkscapeWindow(SPDocument* document);
- void set_desktop_widget(SPDesktopWidget* desktop_widget); // Temp: We should be creating desktop in constructor!
+
+ SPDesktop* get_desktop() { return _desktop; }
+ SPDesktopWidget* get_desktop_widget() { return _desktop_widget; }
private:
SPDocument* _document;
SPDesktop* _desktop;
+ SPDesktopWidget* _desktop_widget;
+
+ Gtk::Box* _mainbox; // Remove after we don't need set_desktop_widget()
// Callbacks
bool key_press(GdkEventKey* event);
diff --git a/src/ui/interface.cpp b/src/ui/interface.cpp
index 3d5472f4b..496a03bae 100644
--- a/src/ui/interface.cpp
+++ b/src/ui/interface.cpp
@@ -92,65 +92,6 @@ static void sp_ui_menu_item_set_name(GtkWidget *data,
static void sp_recent_open(GtkRecentChooser *, gpointer);
void
-sp_create_window(SPViewWidget *vw, bool editable)
-{
- g_return_if_fail(vw != nullptr);
- g_return_if_fail(SP_IS_VIEW_WIDGET(vw));
-
- SPDesktopWidget *desktop_widget = reinterpret_cast<SPDesktopWidget*>(vw);
- SPDesktop* desktop = desktop_widget->desktop;
- SPDocument* document = desktop->getDocument();
-
- InkscapeWindow* win = new InkscapeWindow(document);
- win->set_desktop_widget(desktop_widget);
-
- if (editable) {
- g_object_set_data(G_OBJECT(vw), "window", win);
-
-
- desktop_widget->window = win;
-
- win->set_data("desktop", desktop);
- win->set_data("desktopwidget", desktop_widget);
-
- win->signal_delete_event().connect(sigc::mem_fun(*(SPDesktop*)vw->view, &SPDesktop::onDeleteUI));
- win->signal_window_state_event().connect(sigc::mem_fun(*desktop, &SPDesktop::onWindowStateEvent));
- win->signal_focus_in_event().connect(sigc::mem_fun(*desktop_widget, &SPDesktopWidget::onFocusInEvent));
-
- Inkscape::Preferences *prefs = Inkscape::Preferences::get();
- int window_geometry = prefs->getInt("/options/savewindowgeometry/value", PREFS_WINDOW_GEOMETRY_NONE);
- if (window_geometry == PREFS_WINDOW_GEOMETRY_LAST) {
- gint pw = prefs->getInt("/desktop/geometry/width", -1);
- gint ph = prefs->getInt("/desktop/geometry/height", -1);
- gint px = prefs->getInt("/desktop/geometry/x", -1);
- gint py = prefs->getInt("/desktop/geometry/y", -1);
- gint full = prefs->getBool("/desktop/geometry/fullscreen");
- gint maxed = prefs->getBool("/desktop/geometry/maximized");
- if (pw>0 && ph>0) {
- Gdk::Rectangle monitor_geometry = Inkscape::UI::get_monitor_geometry_at_point(px, py);
- pw = std::min(pw, monitor_geometry.get_width());
- ph = std::min(ph, monitor_geometry.get_height());
- desktop->setWindowSize(pw, ph);
- desktop->setWindowPosition(Geom::Point(px, py));
- }
- if (maxed) {
- win->maximize();
- }
- if (full) {
- win->fullscreen();
- }
- }
- }
-
- win->show();
-
- // needed because the first ACTIVATE_DESKTOP was sent when there was no window yet
- if ( SP_IS_DESKTOP_WIDGET(vw) ) {
- INKSCAPE.reactivate_desktop(SP_DESKTOP_WIDGET(vw)->desktop);
- }
-}
-
-void
sp_ui_new_view()
{
SPDocument *document;
@@ -159,12 +100,7 @@ sp_ui_new_view()
document = SP_ACTIVE_DOCUMENT;
if (!document) return;
- dtw = sp_desktop_widget_new(sp_document_namedview(document, nullptr));
- g_return_if_fail(dtw != nullptr);
-
- sp_create_window(dtw, TRUE);
- sp_namedview_window_from_document(static_cast<SPDesktop*>(dtw->view));
- sp_namedview_update_layers_from_document(static_cast<SPDesktop*>(dtw->view));
+ auto win = new InkscapeWindow(document);
}
void sp_ui_reload()
@@ -204,17 +140,8 @@ void sp_ui_reload()
continue;
}
- dtw = sp_desktop_widget_new(sp_document_namedview(document, nullptr));
- if (dtw == nullptr) {
- ++i;
- continue;
- }
- sp_create_window(dtw, TRUE);
- SPDesktop *desktop = static_cast<SPDesktop *>(dtw->view);
- if (desktop) {
- sp_namedview_window_from_document(desktop);
- sp_namedview_update_layers_from_document(desktop);
- }
+ auto win = new InkscapeWindow(document);
+
dt->destroyWidget();
i++;
}
diff --git a/src/ui/interface.h b/src/ui/interface.h
index 1b77fdab9..eb75fe7d6 100644
--- a/src/ui/interface.h
+++ b/src/ui/interface.h
@@ -20,8 +20,6 @@
#include <glibmm/ustring.h>
-class SPViewWidget;
-
typedef struct _GtkWidget GtkWidget;
namespace Inkscape {
@@ -35,11 +33,6 @@ class View;
} // namespace Inkscape
/**
- * Create a new document window.
- */
-void sp_create_window (SPViewWidget *vw, bool editable);
-
-/**
* \param widget unused
*/
void sp_ui_close_view (GtkWidget *widget);