diff --git a/src/control/LatexController.cpp b/src/control/LatexController.cpp index 39ac3503..12a1b0ee 100644 --- a/src/control/LatexController.cpp +++ b/src/control/LatexController.cpp @@ -30,7 +30,9 @@ LatexController::LatexController(Control* control) // .png will be appended automatically => tex.png texImage(Util::getConfigFile("tex").string()), selectedTexImage(NULL), - selectedText(NULL) + selectedText(NULL), + dlg(NULL), + temporaryRender(NULL) { XOJ_INIT_TYPE(LatexController); } @@ -185,13 +187,21 @@ void LatexController::showTexEditDialog() XOJ_CHECK_TYPE(LatexController); dlg = new LatexDialog(control->getGladeSearchPath()); - //For 'real time' LaTex rendering in the dialog - g_signal_connect(dlg->getTexBox(), "changed", G_CALLBACK(this->handleTexChanged), gpointer(this)); + + // For 'real time' LaTex rendering in the dialog + g_signal_connect(dlg->getTexBox(), "changed", G_CALLBACK(handleTexChanged), this); dlg->setTex(initalTex); - //The controller owns the tempRender because, on signal changed, he has to handle the old/new renders + + // The controller owns the tempRender because, on signal changed, he has to handle the old/new renders insertTexImage(true); - dlg->setTempRender(temporaryRender->getImage()); + + if (temporaryRender != NULL) + { + dlg->setTempRender(temporaryRender->getImage()); + } + dlg->show(GTK_WINDOW(control->getWindow()->getWindow())); + deletePreviousRender(); currentTex = dlg->getTex(); currentTex += " "; @@ -199,25 +209,26 @@ void LatexController::showTexEditDialog() delete dlg; } -/* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * +/** * Text-changed handler: when the Entry in the dialog changes, * this handler updates currentTex, removes the previous existing render and creates * a new one. We need to do it through 'thisContr' because signal handlers * cannot directly access non-static methods and non-static fields such as * 'dlg' so we need to wrap all the dlg method inside small methods in 'thisContr' - * */ -void LatexController::handleTexChanged(GtkWidget *widget, gpointer data) +void LatexController::handleTexChanged(GtkWidget* widget, LatexController* self) { - XOJ_CHECK_TYPE_OBJ(data, LatexController); + XOJ_CHECK_TYPE_OBJ(self, LatexController); - LatexController* thisContr = ((LatexController *)data); + self->setCurrentTex(gtk_entry_get_text(GTK_ENTRY(widget))); + self->deletePreviousRender(); + self->runCommand(); + self->insertTexImage(true); - thisContr->setCurrentTex(gtk_entry_get_text(GTK_ENTRY(widget))); - thisContr->deletePreviousRender(); - thisContr->runCommand(); - thisContr->insertTexImage(true); - thisContr->setImageInDialog(thisContr->getTemporaryRender()->getImage()); + if (self->getTemporaryRender() != NULL) + { + self->setImageInDialog(self->getTemporaryRender()->getImage()); + } } TexImage* LatexController::getTemporaryRender() @@ -236,6 +247,7 @@ void LatexController::deletePreviousRender() { XOJ_CHECK_TYPE(LatexController); delete temporaryRender; + temporaryRender = NULL; } void LatexController::setCurrentTex(string currentTex) diff --git a/src/control/LatexController.h b/src/control/LatexController.h index 4f13adc8..83c04dbb 100644 --- a/src/control/LatexController.h +++ b/src/control/LatexController.h @@ -67,7 +67,7 @@ private: /** * Signal handler, updates the rendered image when the text in the editor changes */ - static void handleTexChanged(GtkWidget* widget, gpointer data); + static void handleTexChanged(GtkWidget* widget, LatexController* self); /*******/ //Wrappers for signal handler who can't access non-static fields diff --git a/src/gui/dialog/LatexDialog.cpp b/src/gui/dialog/LatexDialog.cpp index c73d75b7..6bc840bb 100644 --- a/src/gui/dialog/LatexDialog.cpp +++ b/src/gui/dialog/LatexDialog.cpp @@ -1,7 +1,7 @@ #include "LatexDialog.h" LatexDialog::LatexDialog(GladeSearchpath *gladeSearchPath) - : GladeGui(gladeSearchPath, "texdialog.glade", "texDialog") + : GladeGui(gladeSearchPath, "texdialog.glade", "texDialog") { XOJ_INIT_TYPE(LatexDialog); @@ -11,8 +11,8 @@ LatexDialog::LatexDialog(GladeSearchpath *gladeSearchPath) // increase the maximum length to something reasonable. gtk_entry_set_max_length(GTK_ENTRY(this->texBox), 500); - //Background color for the temporary render, default is white because - //on dark themed DE the LaTex is hard to read + // Background color for the temporary render, default is white because + // on dark themed DE the LaTex is hard to read GtkCssProvider* cssProvider = gtk_css_provider_new(); gtk_css_provider_load_from_data(cssProvider, "*{background-color:white;padding:10px;}", -1, NULL); gtk_style_context_add_provider(gtk_widget_get_style_context(this->texTempRender), GTK_STYLE_PROVIDER(cssProvider), GTK_STYLE_PROVIDER_PRIORITY_APPLICATION); @@ -35,19 +35,12 @@ string LatexDialog::getTex() return this->theLatex; } -void LatexDialog::setTempRender(cairo_surface_t *cairoTexTempRender) +void LatexDialog::setTempRender(cairo_surface_t* cairoTexTempRender) { XOJ_CHECK_TYPE(LatexDialog); - this->cairoTexTempRender = cairoTexTempRender; - //Every time the controller updates the temporary render, we update - //our corresponding GtkWidget - gtk_image_set_from_surface(GTK_IMAGE(this->texTempRender), this->cairoTexTempRender); -} - -cairo_surface_t* LatexDialog::getTempRender() -{ - XOJ_CHECK_TYPE(LatexDialog); - return this->cairoTexTempRender; + // Every time the controller updates the temporary render, we update + // our corresponding GtkWidget + gtk_image_set_from_surface(GTK_IMAGE(this->texTempRender), cairoTexTempRender); } GtkWidget* LatexDialog::getTexBox() diff --git a/src/gui/dialog/LatexDialog.h b/src/gui/dialog/LatexDialog.h index 2877eeb9..20cf6701 100644 --- a/src/gui/dialog/LatexDialog.h +++ b/src/gui/dialog/LatexDialog.h @@ -30,26 +30,24 @@ class LatexDialog : public GladeGui void save(); void load(); - //Set and retrieve text from text box + // Set and retrieve text from text box void setTex(string texString); string getTex(); //Set and retrieve temporary Tex render void setTempRender(cairo_surface_t* cairoTexTempRender); - cairo_surface_t* getTempRender(); - //Necessary for the controller in order to connect the 'text-changed' - //signal handler + // Necessary for the controller in order to connect the 'text-changed' + // signal handler GtkWidget* getTexBox(); private: XOJ_TYPE_ATTRIB; - //Temporary render + // Temporary render GtkWidget* texTempRender; - cairo_surface_t* cairoTexTempRender; - //Text field + // Text field GtkWidget* texBox; string theLatex; };