summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog/tracedialog.cpp
diff options
context:
space:
mode:
authorJohn Smith <john.smith7545@yahoo.com>2012-09-30 05:01:21 +0000
committerJohn Smith <john.smith7545@yahoo.com>2012-09-30 05:01:21 +0000
commit51a9de94671f1f7ee1cf2a57ef5dfde94b4a802b (patch)
tree2b13433eacbdb557f1ca8f4782b832453d1a0165 /src/ui/dialog/tracedialog.cpp
parentmemleak fix (part of bug #1043571) (diff)
downloadinkscape-51a9de94671f1f7ee1cf2a57ef5dfde94b4a802b.tar.gz
inkscape-51a9de94671f1f7ee1cf2a57ef5dfde94b4a802b.zip
Fix for 1058470 : Trace Bitmap Live Preview
(bzr r11716)
Diffstat (limited to 'src/ui/dialog/tracedialog.cpp')
-rw-r--r--src/ui/dialog/tracedialog.cpp158
1 files changed, 146 insertions, 12 deletions
diff --git a/src/ui/dialog/tracedialog.cpp b/src/ui/dialog/tracedialog.cpp
index a752ade21..1ad827a56 100644
--- a/src/ui/dialog/tracedialog.cpp
+++ b/src/ui/dialog/tracedialog.cpp
@@ -26,6 +26,8 @@
#include <glibmm/i18n.h>
#include "desktop.h"
+#include "desktop-tracker.h"
+#include "selection.h"
#include "trace/potrace/inkscape-potrace.h"
#include "inkscape.h"
@@ -83,6 +85,13 @@ class TraceDialogImpl : public TraceDialog
void abort();
void previewCallback();
+ void previewLiveCallback();
+ void onSettingsChange();
+ void onSelectionModified( guint flags );
+ void onSetDefaults();
+
+ void setDesktop(SPDesktop *desktop);
+ void setTargetDesktop(SPDesktop *desktop);
//############ General items
@@ -90,6 +99,7 @@ class TraceDialogImpl : public TraceDialog
Gtk::Button *mainOkButton;
Gtk::Button *mainCancelButton;
+ Gtk::Button *mainResetButton;
//######## Left pannel
@@ -194,11 +204,40 @@ class TraceDialogImpl : public TraceDialog
UI::Widget::Frame previewFrame;
Gtk::VBox previewVBox;
Gtk::Button previewButton;
+ Gtk::CheckButton previewLiveButton;
+ gboolean previewLive;
Gtk::Image previewImage;
+ SPDesktop *desktop;
+ DesktopTracker deskTrack;
+ sigc::connection desktopChangeConn;
+ sigc::connection selectChangedConn;
+ sigc::connection selectModifiedConn;
+
};
+void TraceDialogImpl::setDesktop(SPDesktop *desktop)
+{
+ Panel::setDesktop(desktop);
+ deskTrack.setBase(desktop);
+}
+void TraceDialogImpl::setTargetDesktop(SPDesktop *desktop)
+{
+ if (this->desktop != desktop) {
+ if (this->desktop) {
+ selectChangedConn.disconnect();
+ selectModifiedConn.disconnect();
+ }
+ this->desktop = desktop;
+ if (desktop && desktop->selection) {
+ selectChangedConn = desktop->selection->connectChanged(sigc::hide(sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange)));
+ selectModifiedConn = desktop->selection->connectModified(sigc::hide<0>(sigc::mem_fun(*this, &TraceDialogImpl::onSelectionModified)));
+
+ }
+ onSettingsChange();
+ }
+}
//#########################################################################
//## E V E N T S
@@ -352,6 +391,58 @@ void TraceDialogImpl::abort()
//#########################################################################
/**
+ * Callback for when any setting changes
+ */
+void TraceDialogImpl::onSettingsChange()
+{
+ if (previewLive) {
+ previewCallback();
+ }
+}
+
+void TraceDialogImpl::onSelectionModified( guint flags )
+{
+ if (flags & ( SP_OBJECT_MODIFIED_FLAG |
+ SP_OBJECT_PARENT_MODIFIED_FLAG |
+ SP_OBJECT_STYLE_MODIFIED_FLAG) ) {
+ onSettingsChange();
+ }
+}
+
+/**
+ * Callback for when users resets defaults
+ */
+void TraceDialogImpl::onSetDefaults()
+{
+
+ // temporarily disable live update
+ gboolean wasLive = previewLive;
+ previewLive = false;
+
+ modeBrightnessRadioButton.set_active(true);
+ modeBrightnessSpinner.set_value(0.45);
+ modeCannyHiSpinner.set_value(0.65);
+ modeMultiScanNrColorSpinner.set_value(8.0);
+ modeMultiScanNrColorSpinner.set_value(8.0);
+ optionsSpecklesSizeSpinner.set_value(2);
+ optionsCornersThresholdSpinner.set_value(1.0);
+ optionsOptimToleranceSpinner.set_value(0.2);
+
+ modeInvertButton.set_active(false);
+ modeMultiScanSmoothButton.set_active(true);
+ modeMultiScanStackButton.set_active(true);
+ modeMultiScanBackgroundButton.set_active(false);
+ optionsSpecklesButton.set_active(true);
+ optionsCornersButton.set_active(true);
+ optionsOptimButton.set_active(true);
+ sioxButton.set_active(false);
+
+ previewLive = wasLive;
+ onSettingsChange();
+
+}
+
+/**
* Callback from the Preview button. Can be called from elsewhere.
*/
void TraceDialogImpl::previewCallback()
@@ -360,24 +451,31 @@ void TraceDialogImpl::previewCallback()
}
/**
+ * Callback from the Preview Live button.
+ */
+void TraceDialogImpl::previewLiveCallback()
+{
+ previewLive = previewLiveButton.get_active();
+ previewButton.set_sensitive(!previewLive);
+ onSettingsChange();
+}
+
+/**
* Default response from the dialog. Let's intercept it
*/
void TraceDialogImpl::responseCallback(int response_id)
{
- if (response_id == GTK_RESPONSE_OK)
- {
- // for now, we assume potrace, as it's the only one we have
- potraceProcess(true);
- }
- else if (response_id == GTK_RESPONSE_CANCEL)
- {
+ if (response_id == GTK_RESPONSE_OK) {
+ // for now, we assume potrace, as it's the only one we have
+ potraceProcess(true);
+ } else if (response_id == GTK_RESPONSE_CANCEL) {
abort();
- }
- else
- {
+ } else if (response_id == GTK_RESPONSE_HELP) {
+ onSetDefaults();
+ } else {
hide();
return;
- }
+ }
}
@@ -418,6 +516,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeBrightnessSpinner.set_value(0.45);
modeBrightnessBox.pack_end(modeBrightnessSpinner, false, false, MARGIN);
modeBrightnessSpinner.set_tooltip_text(_("Brightness cutoff for black/white"));
+ modeBrightnessSpinner.get_adjustment()->signal_value_changed().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
modeBrightnessSpinnerLabel.set_label(_("_Threshold:"));
modeBrightnessSpinnerLabel.set_use_underline(true);
@@ -436,6 +535,8 @@ TraceDialogImpl::TraceDialogImpl() :
modeCannyRadioButton.set_use_underline(true);
modeCannyBox.pack_start(modeCannyRadioButton, false, false, MARGIN);
modeCannyRadioButton.set_tooltip_text(_("Trace with optimal edge detection by J. Canny's algorithm"));
+ modeCannyRadioButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
+
/*
modeCannyBox.pack_start(modeCannySeparator);
modeCannyLoSpinnerLabel.set_label(_("Low"));
@@ -452,6 +553,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeCannyHiSpinner.set_value(0.65);
modeCannyBox.pack_end(modeCannyHiSpinner, false, false, MARGIN);
modeCannyHiSpinner.set_tooltip_text(_("Brightness cutoff for adjacent pixels (determines edge thickness)"));
+ modeCannyHiSpinner.get_adjustment()->signal_value_changed().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
modeCannyHiSpinnerLabel.set_label(_("T_hreshold:"));
modeCannyHiSpinnerLabel.set_use_underline(true);
@@ -470,6 +572,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeQuantRadioButton.set_use_underline(true);
modeQuantBox.pack_start(modeQuantRadioButton, false, false, MARGIN);
modeQuantRadioButton.set_tooltip_text(_("Trace along the boundaries of reduced colors"));
+ modeQuantRadioButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
modeQuantNrColorSpinner.set_digits(0);
modeQuantNrColorSpinner.set_increments(1.0, 0);
@@ -477,6 +580,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeQuantNrColorSpinner.set_value(8.0);
modeQuantBox.pack_end(modeQuantNrColorSpinner, false, false, MARGIN);
modeQuantNrColorSpinner.set_tooltip_text(_("The number of reduced colors"));
+ modeQuantNrColorSpinner.get_adjustment()->signal_value_changed().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
modeQuantNrColorLabel.set_label(_("_Colors:"));
modeQuantNrColorLabel.set_mnemonic_widget(modeQuantNrColorSpinner);
@@ -492,6 +596,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeInvertBox.pack_start(modeInvertButton, false, false, MARGIN);
modeBrightnessVBox.pack_start(modeInvertBox, false, false, MARGIN);
modeInvertButton.set_tooltip_text(_("Invert black and white regions"));
+ modeInvertButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
modeBrightnessFrame.add(modeBrightnessVBox);
modePageBox.pack_start(modeBrightnessFrame, false, false, 0);
@@ -505,6 +610,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeMultiScanBrightnessRadioButton.set_use_underline(true);
modeMultiScanHBox1.pack_start(modeMultiScanBrightnessRadioButton, false, false, MARGIN);
modeMultiScanBrightnessRadioButton.set_tooltip_text(_("Trace the given number of brightness levels"));
+ modeMultiScanBrightnessRadioButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
modeMultiScanNrColorSpinner.set_digits(0);
modeMultiScanNrColorSpinner.set_increments(1.0, 0);
@@ -516,6 +622,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeMultiScanNrColorLabel.set_mnemonic_widget(modeMultiScanNrColorSpinner);
modeMultiScanHBox1.pack_end(modeMultiScanNrColorLabel, false, false, MARGIN);
modeMultiScanNrColorSpinner.set_tooltip_text(_("The desired number of scans"));
+ modeMultiScanNrColorSpinner.get_adjustment()->signal_value_changed().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
modeMultiScanVBox.pack_start(modeMultiScanHBox1, false, false, MARGIN);
@@ -524,6 +631,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeMultiScanColorRadioButton.set_use_underline(true);
modeMultiScanHBox2.pack_start(modeMultiScanColorRadioButton, false, false, MARGIN);
modeMultiScanColorRadioButton.set_tooltip_text(_("Trace the given number of reduced colors"));
+ modeMultiScanColorRadioButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
modeMultiScanVBox.pack_start(modeMultiScanHBox2, false, false, MARGIN);
@@ -532,6 +640,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeMultiScanMonoRadioButton.set_use_underline(true);
modeMultiScanHBox3.pack_start(modeMultiScanMonoRadioButton, false, false, MARGIN);
modeMultiScanMonoRadioButton.set_tooltip_text(_("Same as Colors, but the result is converted to grayscale"));
+ modeMultiScanMonoRadioButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
modeMultiScanVBox.pack_start(modeMultiScanHBox3, false, false, MARGIN);
@@ -541,6 +650,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeMultiScanSmoothButton.set_active(true);
modeMultiScanHBox4.pack_start(modeMultiScanSmoothButton, false, false, MARGIN);
modeMultiScanSmoothButton.set_tooltip_text(_("Apply Gaussian blur to the bitmap before tracing"));
+ modeMultiScanSmoothButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
// TRANSLATORS: "Stack" is a verb here
modeMultiScanStackButton.set_label(_("Stac_k scans"));
@@ -548,6 +658,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeMultiScanStackButton.set_active(true);
modeMultiScanHBox4.pack_start(modeMultiScanStackButton, false, false, MARGIN);
modeMultiScanStackButton.set_tooltip_text(_("Stack scans on top of one another (no gaps) instead of tiling (usually with gaps)"));
+ modeMultiScanStackButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
modeMultiScanBackgroundButton.set_label(_("Remo_ve background"));
@@ -556,6 +667,7 @@ TraceDialogImpl::TraceDialogImpl() :
modeMultiScanHBox4.pack_start(modeMultiScanBackgroundButton, false, false, MARGIN);
// TRANSLATORS: "Layer" refers to one of the stacked paths in the multiscan
modeMultiScanBackgroundButton.set_tooltip_text(_("Remove bottom (background) layer when done"));
+ modeMultiScanBackgroundButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
modeMultiScanVBox.pack_start(modeMultiScanHBox4, false, false, MARGIN);
@@ -578,12 +690,14 @@ TraceDialogImpl::TraceDialogImpl() :
optionsSpecklesButton.set_use_underline(true);
optionsSpecklesButton.set_tooltip_text(_("Ignore small spots (speckles) in the bitmap"));
optionsSpecklesButton.set_active(true);
+ optionsSpecklesButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
optionsSpecklesBox.pack_start(optionsSpecklesButton, false, false, MARGIN);
optionsSpecklesSizeSpinner.set_digits(0);
optionsSpecklesSizeSpinner.set_increments(1, 0);
optionsSpecklesSizeSpinner.set_range(0, 1000);
optionsSpecklesSizeSpinner.set_value(2);
optionsSpecklesSizeSpinner.set_tooltip_text(_("Speckles of up to this many pixels will be suppressed"));
+ optionsSpecklesSizeSpinner.get_adjustment()->signal_value_changed().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
optionsSpecklesBox.pack_end(optionsSpecklesSizeSpinner, false, false, MARGIN);
optionsSpecklesSizeLabel.set_label(_("S_ize:"));
optionsSpecklesSizeLabel.set_use_underline(true);
@@ -594,6 +708,7 @@ TraceDialogImpl::TraceDialogImpl() :
optionsCornersButton.set_use_underline(true);
optionsCornersButton.set_tooltip_text(_("Smooth out sharp corners of the trace"));
optionsCornersButton.set_active(true);
+ optionsCornersButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
optionsCornersBox.pack_start(optionsCornersButton, false, false, MARGIN);
optionsCornersThresholdSpinner.set_digits(2);
optionsCornersThresholdSpinner.set_increments(0.01, 0);
@@ -601,6 +716,7 @@ TraceDialogImpl::TraceDialogImpl() :
optionsCornersThresholdSpinner.set_value(1.0);
optionsCornersBox.pack_end(optionsCornersThresholdSpinner, false, false, MARGIN);
optionsCornersThresholdSpinner.set_tooltip_text(_("Increase this to smooth corners more"));
+ optionsCornersThresholdSpinner.get_adjustment()->signal_value_changed().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
optionsCornersThresholdLabel.set_label(_("_Threshold:"));
optionsCornersThresholdLabel.set_use_underline(true);
optionsCornersThresholdLabel.set_mnemonic_widget(optionsCornersThresholdSpinner);
@@ -610,6 +726,7 @@ TraceDialogImpl::TraceDialogImpl() :
optionsOptimButton.set_use_underline(true);
optionsOptimButton.set_active(true);
optionsOptimButton.set_tooltip_text(_("Try to optimize paths by joining adjacent Bezier curve segments"));
+ optionsOptimButton.signal_clicked().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
optionsOptimBox.pack_start(optionsOptimButton, false, false, MARGIN);
optionsOptimToleranceSpinner.set_digits(2);
optionsOptimToleranceSpinner.set_increments(0.05, 0);
@@ -617,6 +734,7 @@ TraceDialogImpl::TraceDialogImpl() :
optionsOptimToleranceSpinner.set_value(0.2);
optionsOptimBox.pack_end(optionsOptimToleranceSpinner, false, false, MARGIN);
optionsOptimToleranceSpinner.set_tooltip_text(_("Increase this to reduce the number of nodes in the trace by more aggressive optimization"));
+ optionsOptimToleranceSpinner.get_adjustment()->signal_value_changed().connect( sigc::mem_fun(*this, &TraceDialogImpl::onSettingsChange) );
optionsOptimToleranceLabel.set_label(_("To_lerance:"));
optionsOptimToleranceLabel.set_use_underline(true);
optionsOptimToleranceLabel.set_mnemonic_widget(optionsOptimToleranceSpinner);
@@ -659,12 +777,20 @@ TraceDialogImpl::TraceDialogImpl() :
rightVBox.pack_start(sioxBox, false, false, 0);
//## preview
+ Gtk::HBox *previewButtonHBox = manage(new Gtk::HBox(false, MARGIN ));
+ previewLiveButton.set_label(_("Live Preview"));
+ previewLiveButton.set_use_underline(true);
+ previewLiveCallback();
+ previewLiveButton.signal_clicked().connect(
+ sigc::mem_fun(*this, &TraceDialogImpl::previewLiveCallback) );
previewButton.set_label(_("_Update"));
previewButton.set_use_underline(true);
previewButton.signal_clicked().connect(
sigc::mem_fun(*this, &TraceDialogImpl::previewCallback) );
- previewVBox.pack_end(previewButton, false, false, 0);
+ previewButtonHBox->pack_start(previewLiveButton, false, false, 0);
+ previewButtonHBox->pack_end(previewButton, true, true, 0);
+ previewVBox.pack_end(*previewButtonHBox, false, false, 0);
// I guess it's correct to call the "intermediate bitmap" a preview of the trace
previewButton.set_tooltip_text(_("Preview the intermediate bitmap with the current settings, without actual tracing"));
previewImage.set_size_request(200,200);
@@ -683,6 +809,8 @@ TraceDialogImpl::TraceDialogImpl() :
//#### Global stuff
contents->pack_start(mainHBox);
+ mainResetButton = addResponseButton(_("Reset"), GTK_RESPONSE_HELP, true);
+ mainResetButton ->set_tooltip_text(_("Reset all settings to defaults"));
//## The OK button
mainCancelButton = addResponseButton(Gtk::Stock::STOP, GTK_RESPONSE_CANCEL);
@@ -695,6 +823,9 @@ TraceDialogImpl::TraceDialogImpl() :
show_all_children();
+ desktopChangeConn = deskTrack.connectDesktopChanged( sigc::mem_fun(*this, &TraceDialogImpl::setTargetDesktop) );
+ deskTrack.connect(GTK_WIDGET(gobj()));
+
//## Connect the signal
signalResponse().connect(
sigc::mem_fun(*this, &TraceDialogImpl::responseCallback));
@@ -715,6 +846,9 @@ TraceDialog &TraceDialog::getInstance()
*/
TraceDialogImpl::~TraceDialogImpl()
{
+ selectChangedConn.disconnect();
+ selectModifiedConn.disconnect();
+ desktopChangeConn.disconnect();
}