Merge pull request #449 from andreasb242/master

Crash fixed if tex image is not created
presentation
andreasb242 7 years ago committed by GitHub
commit 84a53ac032
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
  1. 42
      src/control/LatexController.cpp
  2. 2
      src/control/LatexController.h
  3. 21
      src/gui/dialog/LatexDialog.cpp
  4. 12
      src/gui/dialog/LatexDialog.h

@ -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)

@ -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

@ -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()

@ -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;
};

Loading…
Cancel
Save