summaryrefslogtreecommitdiffstats
path: root/src/ui/dialog
diff options
context:
space:
mode:
authorLiam P. White <inkscapebronyat-signgmaildotcom>2014-03-30 00:42:24 +0000
committerLiam P. White <inkscapebronyat-signgmaildotcom>2014-03-30 00:42:24 +0000
commit189ec94a227498b9d1e3f720bddd4099e9de8652 (patch)
tree89278142aafd94d61b00109c316e8e2a82ab1d4c /src/ui/dialog
parentMinor fixes (diff)
parentRemoved obsolete header file. (diff)
downloadinkscape-189ec94a227498b9d1e3f720bddd4099e9de8652.tar.gz
inkscape-189ec94a227498b9d1e3f720bddd4099e9de8652.zip
Update to trunk
(bzr r13090.1.38)
Diffstat (limited to 'src/ui/dialog')
-rw-r--r--src/ui/dialog/dialog.cpp4
-rw-r--r--src/ui/dialog/guides.cpp43
-rw-r--r--src/ui/dialog/guides.h2
-rw-r--r--src/ui/dialog/pixelartdialog.cpp152
4 files changed, 134 insertions, 67 deletions
diff --git a/src/ui/dialog/dialog.cpp b/src/ui/dialog/dialog.cpp
index 3cc3f3d88..645294bb5 100644
--- a/src/ui/dialog/dialog.cpp
+++ b/src/ui/dialog/dialog.cpp
@@ -26,11 +26,11 @@
#include "ui/tools/tool-base.h"
#include "desktop.h"
#include "desktop-handles.h"
-#include "modifier-fns.h"
#include "shortcuts.h"
#include "preferences.h"
#include "interface.h"
#include "verbs.h"
+#include "ui/tool/event-utils.h"
#include <gtk/gtk.h>
@@ -279,7 +279,7 @@ bool Dialog::_onEvent(GdkEvent *event)
case GDK_KEY_F4:
case GDK_KEY_w:
case GDK_KEY_W: {
- if (mod_ctrl_only(event->key.state)) {
+ if (Inkscape::UI::held_only_control(event->key)) {
_close();
ret = true;
}
diff --git a/src/ui/dialog/guides.cpp b/src/ui/dialog/guides.cpp
index e84f25733..80740113c 100644
--- a/src/ui/dialog/guides.cpp
+++ b/src/ui/dialog/guides.cpp
@@ -68,20 +68,6 @@ void GuidelinePropertiesDialog::showDialog(SPGuide *guide, SPDesktop *desktop) {
dialog.run();
}
-void GuidelinePropertiesDialog::_colorChanged()
-{
-#if WITH_GTKMM_3_0
- const Gdk::RGBA c = _color.get_rgba();
- unsigned r = c.get_red_u()/257, g = c.get_green_u()/257, b = c.get_blue_u()/257;
-#else
- const Gdk::Color c = _color.get_color();
- unsigned r = c.get_red()/257, g = c.get_green()/257, b = c.get_blue()/257;
-#endif
- //TODO: why 257? verify this!
-
- sp_guide_set_color(*_guide, r, g, b, true);
-}
-
void GuidelinePropertiesDialog::_modeChanged()
{
_mode = !_relative_toggle.get_active();
@@ -100,7 +86,7 @@ void GuidelinePropertiesDialog::_modeChanged()
}
}
-void GuidelinePropertiesDialog::_onApply()
+void GuidelinePropertiesDialog::_onOK()
{
double deg_angle = _spin_angle.getValue(DEG);
if (!_mode)
@@ -124,18 +110,26 @@ void GuidelinePropertiesDialog::_onApply()
sp_guide_moveto(*_guide, newpos, true);
- const gchar* name = _label_entry.getEntry()->get_text().c_str();
+ const gchar* name = g_strdup( _label_entry.getEntry()->get_text().c_str() );
+
sp_guide_set_label(*_guide, name, true);
+ g_free((gpointer) name);
+
+#if WITH_GTKMM_3_0
+ const Gdk::RGBA c = _color.get_rgba();
+ unsigned r = c.get_red_u()/257, g = c.get_green_u()/257, b = c.get_blue_u()/257;
+#else
+ const Gdk::Color c = _color.get_color();
+ unsigned r = c.get_red()/257, g = c.get_green()/257, b = c.get_blue()/257;
+#endif
+ //TODO: why 257? verify this!
+
+ sp_guide_set_color(*_guide, r, g, b, true);
DocumentUndo::done(_guide->document, SP_VERB_NONE,
_("Set guide properties"));
}
-void GuidelinePropertiesDialog::_onOK()
-{
- _onApply();
-}
-
void GuidelinePropertiesDialog::_onDelete()
{
SPDocument *doc = _guide->document;
@@ -157,10 +151,6 @@ void GuidelinePropertiesDialog::_response(gint response)
break;
case Gtk::RESPONSE_DELETE_EVENT:
break;
-/* case GTK_RESPONSE_APPLY:
- _onApply();
- break;
-*/
default:
g_assert_not_reached();
}
@@ -222,9 +212,6 @@ void GuidelinePropertiesDialog::_setup() {
1, 3, 3, 4, Gtk::EXPAND | Gtk::FILL, Gtk::FILL);
#endif
- _color.signal_color_set().connect(sigc::mem_fun(*this, &GuidelinePropertiesDialog::_colorChanged));
-
-
// unitmenus
/* fixme: We should allow percents here too, as percents of the canvas size */
_unit_menu.setUnitType(UNIT_TYPE_LINEAR);
diff --git a/src/ui/dialog/guides.h b/src/ui/dialog/guides.h
index 422fed7fe..22bf5097a 100644
--- a/src/ui/dialog/guides.h
+++ b/src/ui/dialog/guides.h
@@ -62,13 +62,11 @@ public:
protected:
void _setup();
- void _onApply();
void _onOK();
void _onDelete();
void _response(gint response);
void _modeChanged();
- void _colorChanged();
private:
GuidelinePropertiesDialog(GuidelinePropertiesDialog const &); // no copy
diff --git a/src/ui/dialog/pixelartdialog.cpp b/src/ui/dialog/pixelartdialog.cpp
index ce5b6584d..31449d4e7 100644
--- a/src/ui/dialog/pixelartdialog.cpp
+++ b/src/ui/dialog/pixelartdialog.cpp
@@ -16,6 +16,16 @@
# include <config.h>
#endif
+#ifdef GLIBMM_DISABLE_DEPRECATED
+# undef GLIBMM_DISABLE_DEPRECATED
+# include <glibmm/thread.h>
+# include <glibmm/dispatcher.h>
+# define GLIBMM_DISABLE_DEPRECATED 1
+#else // GLIBMM_DISABLE_DEPRECATED
+# include <glibmm/thread.h>
+# include <glibmm/dispatcher.h>
+#endif // GLIBMM_DISABLE_DEPRECATED
+
#include "pixelartdialog.h"
#include <gtkmm/radiobutton.h>
#include <gtkmm/stock.h>
@@ -54,18 +64,6 @@ namespace Inkscape {
namespace UI {
namespace Dialog {
-template<class T>
-T move(T &obj)
-{
-#ifdef LIBDEPIXELIZE_ENABLE_CPP11
- return std::move(obj);
-#else
- T ret;
- std::swap(obj, ret);
- return ret;
-#endif // LIBDEPIXELIZE_ENABLE_CPP11
-}
-
/**
* A dialog for adjusting pixel art -> vector tracing parameters
*/
@@ -77,6 +75,23 @@ public:
~PixelArtDialogImpl();
private:
+ struct Input
+ {
+ Glib::RefPtr<Gdk::Pixbuf> pixbuf;
+ SVGLength x;
+ SVGLength y;
+ };
+ struct Output
+ {
+ Output(Tracer::Splines splines, SVGLength x, SVGLength y) :
+ splines(splines), x(x), y(y)
+ {}
+
+ Tracer::Splines splines;
+ SVGLength x;
+ SVGLength y;
+ };
+
void setDesktop(SPDesktop *desktop);
void setTargetDesktop(SPDesktop *desktop);
@@ -89,7 +104,8 @@ private:
Tracer::Kopf2011::Options options();
void vectorize();
- void processLibdepixelize(SPImage *img);
+ void processLibdepixelize(const Input &image);
+ void importOutput(const Output &out);
void setDefaults();
void updatePreview();
@@ -133,9 +149,21 @@ private:
Gtk::RadioButton optimizeRadioButton;
#endif // LIBDEPIXELIZE_INKSCAPE_ENABLE_SMOOTH
+ //############ UI Logic data
+
SPDesktop *desktop;
DesktopTracker deskTrack;
sigc::connection desktopChangeConn;
+
+ //############ Threads
+ void workerThread();
+ void onWorkerThreadFinished();
+ Glib::Thread *thread;
+ volatile gint abortThread; // C++11's atomic stuff is sooo much nicer
+ Glib::Dispatcher dispatcher;
+ std::vector<Input> queue;
+ std::vector<Output> output;
+ Tracer::Kopf2011::Options lastOptions;
};
void PixelArtDialogImpl::setDesktop(SPDesktop *desktop)
@@ -288,6 +316,9 @@ PixelArtDialogImpl::PixelArtDialogImpl() :
deskTrack.connect(GTK_WIDGET(gobj()));
signalResponse().connect(sigc::mem_fun(*this, &PixelArtDialogImpl::responseCallback));
+
+ dispatcher.connect(
+ sigc::mem_fun(*this, &PixelArtDialogImpl::onWorkerThreadFinished) );
}
void PixelArtDialogImpl::responseCallback(int response_id)
@@ -295,7 +326,8 @@ void PixelArtDialogImpl::responseCallback(int response_id)
if (response_id == GTK_RESPONSE_OK) {
vectorize();
} else if (response_id == GTK_RESPONSE_CANCEL) {
- // TODO
+ // libdepixelize's interface need to be extended to allow aborts
+ g_atomic_int_set(&abortThread, true);
} else if (response_id == GTK_RESPONSE_HELP) {
setDefaults();
} else {
@@ -340,39 +372,53 @@ void PixelArtDialogImpl::vectorize()
return;
}
- bool found = false;
-
for ( GSList const *list = desktop->selection->itemList() ; list
; list = list->next ) {
if ( !SP_IS_IMAGE(list->data) )
continue;
- found = true;
+ SPImage *img = SP_IMAGE(list->data);
+ Input input;
+ input.pixbuf = Glib::wrap(img->pixbuf->getPixbufRaw(), true);
+ input.x = img->x;
+ input.y = img->y;
+
+ if ( input.pixbuf->get_width() > 256
+ || input.pixbuf->get_height() > 256 ) {
+ char *msg = _("Image looks too big. Process may take a while and is"
+ " wise to save your document before continue."
+ "\n\nContinue the procedure (without saving)?");
+ Gtk::MessageDialog dialog(msg, false, Gtk::MESSAGE_WARNING,
+ Gtk::BUTTONS_OK_CANCEL, true);
+
+ if ( dialog.run() != Gtk::RESPONSE_OK )
+ continue;
+ }
- processLibdepixelize(SP_IMAGE(list->data));
+ queue.push_back(input);
}
- if ( !found ) {
+ if ( !queue.size() ) {
char *msg = _("Select an <b>image</b> to trace");
msgStack->flash(Inkscape::ERROR_MESSAGE, msg);
return;
}
- DocumentUndo::done(desktop->doc(), SP_VERB_SELECTION_PIXEL_ART,
- _("Trace pixel art"));
+ mainCancelButton->set_sensitive(true);
+ mainOkButton->set_sensitive(false);
- // Flush pending updates
- desktop->doc()->ensureUpToDate();
+ lastOptions = options();
+
+ g_atomic_int_set(&abortThread, false);
+ thread = Glib::Thread::create(
+ sigc::mem_fun(*this, &PixelArtDialogImpl::workerThread) );
}
-void PixelArtDialogImpl::processLibdepixelize(SPImage *img)
+void PixelArtDialogImpl::processLibdepixelize(const Input &input)
{
Tracer::Splines out;
- Glib::RefPtr<Gdk::Pixbuf> pixbuf
- = Glib::wrap(img->pixbuf->getPixbufRaw(), true);
-
- if ( pixbuf->get_width() > 256 || pixbuf->get_height() > 256 ) {
+ if ( input.pixbuf->get_width() > 256 || input.pixbuf->get_height() > 256 ) {
char *msg = _("Image looks too big. Process may take a while and it is"
" wise to save your document before continuing."
"\n\nContinue the procedure (without saving)?");
@@ -384,16 +430,23 @@ void PixelArtDialogImpl::processLibdepixelize(SPImage *img)
}
if ( voronoiRadioButton.get_active() ) {
- out = Tracer::Kopf2011::to_voronoi(pixbuf, options());
+ output.push_back(Output(Tracer::Kopf2011::to_voronoi(input.pixbuf,
+ lastOptions),
+ input.x, input.y));
} else {
- out = Tracer::Kopf2011::to_splines(pixbuf, options());
+ output.push_back(Output(Tracer::Kopf2011::to_splines(input.pixbuf,
+ lastOptions),
+ input.x, input.y));
}
+}
+void PixelArtDialogImpl::importOutput(const Output &output)
+{
Inkscape::XML::Document *xml_doc = desktop->doc()->getReprDoc();
Inkscape::XML::Node *group = xml_doc->createElement("svg:g");
- for ( Tracer::Splines::iterator it = out.begin(), end = out.end()
- ; it != end ; ++it ) {
+ for ( Tracer::Splines::const_iterator it = output.splines.begin(),
+ end = output.splines.end() ; it != end ; ++it ) {
Inkscape::XML::Node *repr = xml_doc->createElement("svg:path");
{
@@ -421,7 +474,7 @@ void PixelArtDialogImpl::processLibdepixelize(SPImage *img)
sp_repr_css_attr_unref(css);
}
- gchar *str = sp_svg_write_path(Dialog::move(it->pathVector));
+ gchar *str = sp_svg_write_path(it->pathVector);
repr->setAttribute("d", str);
g_free(str);
@@ -433,14 +486,20 @@ void PixelArtDialogImpl::processLibdepixelize(SPImage *img)
{
group->setAttribute("transform",
(std::string("translate(")
- + sp_svg_length_write_with_units(img->x)
- + ' ' + sp_svg_length_write_with_units(img->y)
+ + sp_svg_length_write_with_units(output.x)
+ + ' ' + sp_svg_length_write_with_units(output.y)
+ ')').c_str());
}
desktop->currentLayer()->appendChildRepr(group);
Inkscape::GC::release(group);
+
+ DocumentUndo::done(desktop->doc(), SP_VERB_SELECTION_PIXEL_ART,
+ _("Trace pixel art"));
+
+ // Flush pending updates
+ desktop->doc()->ensureUpToDate();
}
void PixelArtDialogImpl::setDefaults()
@@ -481,6 +540,29 @@ void PixelArtDialogImpl::updatePreview()
pendingPreview = false;
}
+void PixelArtDialogImpl::workerThread()
+{
+ for ( std::vector<Input>::iterator it = queue.begin(), end = queue.end()
+ ; it != end && !g_atomic_int_get(&abortThread) ; ++it ) {
+ processLibdepixelize(*it);
+ }
+ queue.clear();
+ dispatcher();
+}
+
+void PixelArtDialogImpl::onWorkerThreadFinished()
+{
+ thread->join();
+ thread = NULL;
+ for ( std::vector<Output>::const_iterator it = output.begin(),
+ end = output.end() ; it != end ; ++it ) {
+ importOutput(*it);
+ }
+ output.clear();
+ mainCancelButton->set_sensitive(false);
+ mainOkButton->set_sensitive(true);
+}
+
/**
* Factory method. Use this to create a new PixelArtDialog
*/