diff --git a/src/VirtualLeaf.cpp b/src/VirtualLeaf.cpp --- a/src/VirtualLeaf.cpp +++ b/src/VirtualLeaf.cpp @@ -147,6 +147,7 @@ void MainBase::Plot(int resize_stride) FitLeafToCanvas(); } } + mesh.LoopCells(DrawCell(),canvas,*this); if (ShowNodeNumbersP()) diff --git a/src/canvas.cpp b/src/canvas.cpp --- a/src/canvas.cpp +++ b/src/canvas.cpp @@ -211,7 +211,7 @@ void FigureEditor::mousePressEvent(QMous void FigureEditor::mouseMoveEvent(QMouseEvent* e) { - // User choose "rotation mode" and we can rotate the object around its center of mass + // User chooses "rotation mode" and we can rotate the object around its center of mass if (dynamic_cast
(parent())->RotationModeP()) { QPointF p = mapToScene(e->pos()); @@ -236,6 +236,8 @@ void FigureEditor::mouseMoveEvent(QMouse FullRedraw(); return; } + + if ( moving ) { QPointF p = mapToScene(e->pos()); @@ -786,7 +788,7 @@ int Main::readStateXML(const char *filen Cell::setOffset(0,0); FitLeafToCanvas(); - + currentFile = QString(filename); Plot(); @@ -1224,7 +1226,9 @@ void Main::FitLeafToCanvas(void) // cerr << ur << ", " << ll << endl; - editor->fitInView(bb, Qt::KeepAspectRatio); + // editor->fitInView(bb, Qt::KeepAspectRatio); + editor->ensureVisible(bb); + //editor->setTransform(viewport); } void Main::CleanMesh(void) @@ -1300,7 +1304,7 @@ void Main::XMLReadSettings(xmlNode *sett { MainBase::XMLReadSettings(settings); - + view->setItemChecked(com_id, showcentersp); view->setItemChecked(mesh_id, showmeshp); view->setItemChecked(border_id, showbordercellp); @@ -1315,6 +1319,8 @@ void Main::XMLReadSettings(xmlNode *sett options->setItemChecked(dyn_cells_id, dynamicscellsp); view->setItemChecked( cell_walls_id, showwallsp); view->setItemChecked( apoplasts_id, showapoplastsp); + + editor->setTransform(viewport); } xmlNode *Main::XMLSettingsTree(void) @@ -1335,7 +1341,10 @@ xmlNode *Main::XMLSettingsTree(void) showapoplastsp = view->isItemChecked( apoplasts_id); hidecellsp = view->isItemChecked( hide_cells_id); - return MainBase::XMLSettingsTree(); + xmlNode *settings = MainBase::XMLSettingsTree(); + QTransform viewport(editor->transform()); + xmlAddChild(settings, XMLViewportTree(viewport)); + return settings; } /* finis */ diff --git a/src/canvas.h b/src/canvas.h --- a/src/canvas.h +++ b/src/canvas.h @@ -173,6 +173,9 @@ class Main : public Q3MainWindow, public // Exit rotation mode if mouse is clicked connect(editor, SIGNAL(MousePressed()), this, SLOT(ExitRotationMode())); + + editor->setMouseTracking(true); + } } @@ -183,6 +186,8 @@ class Main : public Q3MainWindow, public options->setItemChecked(rotation_mode_id, false); if (editor) disconnect(editor, SIGNAL(MousePressed()), this, SLOT(ExitRotationMode())); + editor->setMouseTracking(false); + } virtual void UserMessage(QString message, int timeout=0); diff --git a/src/cellbase.h b/src/cellbase.h --- a/src/cellbase.h +++ b/src/cellbase.h @@ -64,9 +64,6 @@ class CellsStaticDatamembers { ncells = 0; nchem = 0; base_area = 0.; -#ifdef QDEBUG - qDebug() << "Constructor of CellsStaticDatamembers" << endl; -#endif } ~CellsStaticDatamembers() { #ifdef QDEBUG diff --git a/src/mainbase.cpp b/src/mainbase.cpp --- a/src/mainbase.cpp +++ b/src/mainbase.cpp @@ -28,8 +28,28 @@ #include #include +#include + static const std::string _module_id("$Id$"); +xmlNode *MainBase::XMLViewportTree(QTransform &transform) const { + + QLocale standardlocale(QLocale::C); + + + xmlNode *xmlviewport = xmlNewNode(NULL, BAD_CAST "viewport"); + { + xmlNewProp(xmlviewport, BAD_CAST "m11", BAD_CAST standardlocale.toString(transform.m11()).toStdString().c_str() ); + xmlNewProp(xmlviewport, BAD_CAST "m12", BAD_CAST standardlocale.toString(transform.m12()).toStdString().c_str() ); + xmlNewProp(xmlviewport, BAD_CAST "m21", BAD_CAST standardlocale.toString(transform.m21()).toStdString().c_str() ); + xmlNewProp(xmlviewport, BAD_CAST "m22", BAD_CAST standardlocale.toString(transform.m22()).toStdString().c_str() ); + xmlNewProp(xmlviewport, BAD_CAST "dx", BAD_CAST standardlocale.toString(transform.dx()).toStdString().c_str() ); + xmlNewProp(xmlviewport, BAD_CAST "dy", BAD_CAST standardlocale.toString(transform.dy()).toStdString().c_str() ); + } + + return xmlviewport; +} + xmlNode *MainBase::XMLSettingsTree(void) const { xmlNode *xmlsettings = xmlNewNode(NULL, BAD_CAST "settings"); @@ -134,6 +154,98 @@ xmlNode *MainBase::XMLSettingsTree(void) return xmlsettings; } +void MainBase::XMLReadViewport(xmlNode *settings) { + + if (settings == 0) { + return; + } + + qreal m11=25,m12=0,m21=0,m22=25,dx=0,dy=0; + QLocale standardlocale(QLocale::C); + xmlNode *cur = settings->xmlChildrenNode; + + while (cur!=NULL) { + + if (!xmlStrcmp(cur->name,(const xmlChar *)"viewport")) { + bool ok; + { + xmlChar *v_str = xmlGetProp(cur, BAD_CAST "m11"); + + if (v_str==0) { + MyWarning::unique_warning("Error reading viewport in mainbase.cpp"); + } + if (v_str != NULL) { + m11=standardlocale.toDouble((char *)v_str, &ok); + if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str); + xmlFree(v_str); + } + } + { + xmlChar *v_str = xmlGetProp(cur, BAD_CAST "m12"); + + if (v_str==0) { + MyWarning::unique_warning("Error reading viewport in mainbase.cpp"); + } + if (v_str != NULL) { + m12=standardlocale.toDouble((char *)v_str, &ok); + if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str); + xmlFree(v_str); + } + } + { + xmlChar *v_str = xmlGetProp(cur, BAD_CAST "m21"); + + if (v_str==0) { + MyWarning::unique_warning("Error reading viewport in mainbase.cpp"); + } + if (v_str != NULL) { + m21=standardlocale.toDouble((char *)v_str, &ok); + if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str); + xmlFree(v_str); + } + } + { + xmlChar *v_str = xmlGetProp(cur, BAD_CAST "m22"); + + if (v_str==0) { + MyWarning::unique_warning("Error reading viewport in mainbase.cpp"); + } + if (v_str != NULL) { + m22=standardlocale.toDouble((char *)v_str, &ok); + if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str); + xmlFree(v_str); + } + } + { + xmlChar *v_str = xmlGetProp(cur, BAD_CAST "dx"); + + if (v_str==0) { + MyWarning::unique_warning("Error reading viewport in mainbase.cpp"); + } + if (v_str != NULL) { + dx=standardlocale.toDouble((char *)v_str, &ok); + if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str); + xmlFree(v_str); + } + } + { + xmlChar *v_str = xmlGetProp(cur, BAD_CAST "dy"); + + if (v_str==0) { + MyWarning::unique_warning("Error reading viewport in mainbase.cpp"); + } + if (v_str != NULL) { + dy=standardlocale.toDouble((char *)v_str, &ok); + if (!ok) MyWarning::error("Could Not Convert \"%S\" To Double In XMLRead.",(char *)v_str); + xmlFree(v_str); + } + } + } + cur=cur->next; + } + viewport = QTransform(m11,m12,m21,m22,dx,dy); +} + void MainBase::XMLReadSettings(xmlNode *settings) { @@ -143,6 +255,7 @@ void MainBase::XMLReadSettings(xmlNode * return; } + XMLReadViewport(settings); xmlNode *cur = settings->xmlChildrenNode; while (cur!=NULL) { @@ -150,6 +263,7 @@ void MainBase::XMLReadSettings(xmlNode * if ((!xmlStrcmp(cur->name, (const xmlChar *)"setting"))){ xmlChar *name = xmlGetProp(cur, BAD_CAST "name"); + xmlChar *val = xmlGetProp(cur, BAD_CAST "val"); if (!xmlStrcmp(name, (const xmlChar *)"show_cell_centers")) { showcentersp = strtobool( (const char *)val ); @@ -193,7 +307,9 @@ void MainBase::XMLReadSettings(xmlNode * if (!xmlStrcmp(name,(const xmlChar *)"hide_cells")) { hidecellsp = strtobool( (const char *)val ); } - + + + xmlFree(name); xmlFree(val); } diff --git a/src/mainbase.h b/src/mainbase.h --- a/src/mainbase.h +++ b/src/mainbase.h @@ -92,6 +92,8 @@ class MainBase { } }; virtual void XMLReadSettings(xmlNode *settings); + virtual void XMLReadViewport(xmlNode *viewport); + virtual double getFluxArrowsize(void) { return 10.;} void Save(const char *fname, const char *format, int sizex=640, int sizey=480); @@ -104,11 +106,13 @@ class MainBase { cerr << message.toAscii().constData() << endl; } Mesh &mesh; + QTransform viewport; protected: QGraphicsScene &canvas; virtual xmlNode *XMLSettingsTree(void) const; - + virtual xmlNode *XMLViewportTree(QTransform &transform) const; + protected: bool showcentersp; bool showmeshp;