diff options
| author | Nathan Lee <2431820-nathanal@users.noreply.gitlab.com> | 2019-07-24 07:02:23 +0000 |
|---|---|---|
| committer | Marc Jeanmougin <marc@jeanmougin.fr> | 2019-08-21 15:18:42 +0000 |
| commit | 65a21f56583073a5dbee67e1fea6fd080bdc0a18 (patch) | |
| tree | 106deeeab7205da6b2d1dacde684ea43423061de | |
| parent | Remove pixelart from menus (diff) | |
| download | inkscape-65a21f56583073a5dbee67e1fea6fd080bdc0a18.tar.gz inkscape-65a21f56583073a5dbee67e1fea6fd080bdc0a18.zip | |
Allow scaling down trace dialog
| -rw-r--r-- | share/ui/dialog-trace.glade | 4 | ||||
| -rw-r--r-- | src/ui/dialog/tracedialog.cpp | 37 |
2 files changed, 31 insertions, 10 deletions
diff --git a/share/ui/dialog-trace.glade b/share/ui/dialog-trace.glade index 82f99b86b..402a9e1f7 100644 --- a/share/ui/dialog-trace.glade +++ b/share/ui/dialog-trace.glade @@ -902,13 +902,11 @@ and on autotrace</property> <property name="can_focus">False</property> <property name="orientation">vertical</property> <child> - <object class="GtkImage" id="previewImage"> + <object class="GtkDrawingArea" id="previewArea"> <property name="width_request">200</property> <property name="height_request">200</property> <property name="visible">True</property> <property name="can_focus">False</property> - <property name="stock">gtk-missing-image</property> - <property name="icon_size">2</property> </object> <packing> <property name="expand">True</property> diff --git a/src/ui/dialog/tracedialog.cpp b/src/ui/dialog/tracedialog.cpp index 3d92c53c9..00c461def 100644 --- a/src/ui/dialog/tracedialog.cpp +++ b/src/ui/dialog/tracedialog.cpp @@ -51,6 +51,7 @@ class TraceDialogImpl2 : public TraceDialog { void abort(); void previewCallback(); + bool previewResize(const Cairo::RefPtr<Cairo::Context>&); void traceCallback(); void onSelectionModified(guint flags); void onSetDefaults(); @@ -76,7 +77,8 @@ class TraceDialogImpl2 : public TraceDialog { Gtk::Box *mainBox; Gtk::Stack *choice_scan; Gtk::Notebook *choice_tab; - Gtk::Image *previewImage; + Glib::RefPtr<Gdk::Pixbuf> scaledPreview; + Gtk::DrawingArea *previewArea; }; void TraceDialogImpl2::setDesktop(SPDesktop *desktop) @@ -181,15 +183,14 @@ void TraceDialogImpl2::traceProcess(bool do_i_trace) if (preview) { int width = preview->get_width(); int height = preview->get_height(); - const Gtk::Allocation &vboxAlloc = previewImage->get_allocation(); + const Gtk::Allocation &vboxAlloc = previewArea->get_allocation(); double scaleFX = vboxAlloc.get_width() / (double)width; double scaleFY = vboxAlloc.get_height() / (double)height; double scaleFactor = scaleFX > scaleFY ? scaleFY : scaleFX; int newWidth = (int)(((double)width) * scaleFactor); int newHeight = (int)(((double)height) * scaleFactor); - Glib::RefPtr<Gdk::Pixbuf> scaledPreview = preview->scale_simple(newWidth, newHeight, Gdk::INTERP_NEAREST); - // g_object_unref(preview); - previewImage->set(scaledPreview); + scaledPreview = preview->scale_simple(newWidth, newHeight, Gdk::INTERP_NEAREST); + previewArea->queue_draw(); } } if (do_i_trace){ @@ -209,6 +210,26 @@ void TraceDialogImpl2::traceProcess(bool do_i_trace) desktop->clearWaitingCursor(); } +bool TraceDialogImpl2::previewResize(const Cairo::RefPtr<Cairo::Context>& cr) +{ + if (!scaledPreview) return false; // return early + int width = scaledPreview->get_width(); + int height = scaledPreview->get_height(); + const Gtk::Allocation &vboxAlloc = previewArea->get_allocation(); + double scaleFX = vboxAlloc.get_width() / (double)width; + double scaleFY = vboxAlloc.get_height() / (double)height; + double scaleFactor = scaleFX > scaleFY ? scaleFY : scaleFX; + int newWidth = (int)(((double)width) * scaleFactor); + int newHeight = (int)(((double)height) * scaleFactor); + int offsetX = (vboxAlloc.get_width() - newWidth)/2; + int offsetY = (vboxAlloc.get_height() - newHeight)/2; + + Glib::RefPtr<Gdk::Pixbuf> temp = scaledPreview->scale_simple(newWidth, newHeight, Gdk::INTERP_NEAREST); + Gdk::Cairo::set_source_pixbuf(cr, temp, offsetX, offsetY); + cr->paint(); + return false; +} + void TraceDialogImpl2::abort() { SPDesktop *desktop = SP_ACTIVE_DESKTOP; @@ -263,7 +284,7 @@ TraceDialogImpl2::TraceDialogImpl2() "CB_MS_stack", "CB_MS_rb", "CB_speckles", "CB_smooth", "CB_optimize", /*"CB_live",*/ "CB_SIOX", "CBT_SS", "CBT_MS", "B_RESET", "B_STOP", "B_OK", "mainBox", "choice_tab", "choice_scan", - "previewImage" }; + "previewArea" }; Glib::ustring gladefile = get_filename(Inkscape::IO::Resource::UIS, "dialog-trace.glade"); try { builder = Gtk::Builder::create_from_file(gladefile); @@ -271,6 +292,7 @@ TraceDialogImpl2::TraceDialogImpl2() g_warning("Glade file loading failed for filter effect dialog"); return; } + Glib::RefPtr<Glib::Object> test; for (std::string w : req_widgets) { test = builder->get_object(w); @@ -320,7 +342,7 @@ TraceDialogImpl2::TraceDialogImpl2() GET_W(mainBox) GET_W(choice_tab) GET_W(choice_scan) - GET_W(previewImage) + GET_W(previewArea) #undef GET_W #undef GET_O _getContents()->add(*mainBox); @@ -332,6 +354,7 @@ TraceDialogImpl2::TraceDialogImpl2() B_OK->signal_clicked().connect(sigc::mem_fun(*this, &TraceDialogImpl2::traceCallback)); B_STOP->signal_clicked().connect(sigc::mem_fun(*this, &TraceDialogImpl2::abort)); B_RESET->signal_clicked().connect(sigc::mem_fun(*this, &TraceDialogImpl2::onSetDefaults)); + previewArea->signal_draw().connect(sigc::mem_fun(*this, &TraceDialogImpl2::previewResize)); } |
