From adaefdc01578cff435f4558ec2d3544377ed7d3a Mon Sep 17 00:00:00 2001 From: Krasilnikov Sergey Date: Tue, 17 Oct 2023 21:29:39 +0300 Subject: [PATCH 1/7] zoom to selection implementation --- qucs/bitmaps/viewmagsel.png | Bin 0 -> 36721 bytes qucs/qucs.cpp | 7 ++ qucs/qucs.h | 3 +- qucs/qucs.qrc | 1 + qucs/qucs_init.cpp | 8 ++ qucs/qucsdoc.h | 1 + qucs/schematic.cpp | 142 ++++++++++++++++++++++++++++++++++++ qucs/schematic.h | 3 + 8 files changed, 164 insertions(+), 1 deletion(-) create mode 100644 qucs/bitmaps/viewmagsel.png diff --git a/qucs/bitmaps/viewmagsel.png b/qucs/bitmaps/viewmagsel.png new file mode 100644 index 0000000000000000000000000000000000000000..b2916194dd3634e5a601fafb472f6098985a7fe3 GIT binary patch literal 36721 zcmY&fWmKC@uzmx!0Bf#U8^+>5&v_o6LODDEyT6fLg79g4d{Q{16Q$jx`p zxj*iY?B+e^P0q~h?94OI&VJTVlgGiNzytsQM^QmW3jjcfuOI*&6)_ome78YN7;Xv% zo&fNo|Gy6?mF)#30MG)8GLr9obB;Uxep)RDQQzjCR5x~1G~e*9^W{WRarSNNW6ORc zAhuT+!)KgMV&WxYoz}&J;17VoPQUS-us+dBgTV|K{R$EU!e4)azc8UCp~w?((7ae&JcQ|WNE%Q_TYdcq5b^V_&);WRLF7fV>#U!kEMqhdfYOuOi!3Bqp zy7)mhM(yh)ivfi&7_8`nXDa%8XCq9+3m6-Jk=&@Z%a79bB=LMtC(+Q*x*km(U$VE+ zmhyXTHXBxr2j!R9zo5cL7q(shz>2QCM$n;&0)d&zqno{IXKH1-vlV|_zRMF2nUd=? z4KXrK*rbkj#{oWZe@6yvkBI;`IwT-b_8U^@`@`2jNpS-%&^PVIeTGKxu^AuOe zfwI}#f|N2(umvls@)~akKDgk^KfaP0`lpA76=}|8Xb*8%asfLLvt(8osgJjJ{!fAk z;SaS$pO{=QPv3*SGm3G0pN*BkAG^=7Xv91Z#}no#Z=%U8ncG4gmupCM!K0={QwmMEObh3S+Zl;LMjieR;A>w~NK%@6n=^)#v4{)xd{M&Q;o0dF(u`By&d zIA9Z&A9NP`2E%BiOC# zn?uf*%z|Lz&prQZcDDWkcCa$O{*L|{29g{7PB*mk3^w<$vU0Z^&VE016dl2t-1X%+ z$GuOO8GsCI`+@U0&{(W^eoX|K4fmCFu@B~?Xi@xNWQ~cES4`+vOKRg?f84$gk;k8U#V&%1M3l5!(YK>+ljfdjWBI~N*qjJ!Y1554~-5i zL|V4&l%!oQFzr(F!P1lP#GA4zHPwFDLJT)RoTM60A4KM=N5y*Q26qVxy4jWT-FDw=E

0;NnHmg-XweKOX=3 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

b@CNVG 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≶DrrA!$sm;sH-(%h&&?GY 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 N002ovPDHLkV1lJHam)Y! literal 0 HcmV?d00001 diff --git a/qucs/qucs.cpp b/qucs/qucs.cpp index 16d127d63..6ea695bcb 100644 --- a/qucs/qucs.cpp +++ b/qucs/qucs.cpp @@ -2241,6 +2241,13 @@ void QucsApp::slotShowAll() getDoc()->showAll(); } +// -------------------------------------------------------------- +void QucsApp::slotZoomToSelection() +{ + slotHideEdit(); // disable text edit of component property + getDoc()->zoomToSelection(); +} + // ----------------------------------------------------------- // Sets the scale factor to 1. void QucsApp::slotShowOne() diff --git a/qucs/qucs.h b/qucs/qucs.h index 90889a70d..6918964c7 100644 --- a/qucs/qucs.h +++ b/qucs/qucs.h @@ -140,6 +140,7 @@ public slots: void slotPopHierarchy(); void slotShowAll(); + void slotZoomToSelection(); void slotShowOne(); void slotZoomOut(); // Zoom out by 2 @@ -220,7 +221,7 @@ private slots: QAction *fileNew, *textNew, *fileNewDpl, *fileOpen, *fileSave, *fileSaveAs, *fileSaveAll, *fileClose, *fileExamples, *fileSettings, *filePrint, *fileQuit, *projNew, *projOpen, *projDel, *projClose, *applSettings, *refreshSchPath, - *editCut, *editCopy, *magAll, *magOne, *magMinus, *filePrintFit, *tune, + *editCut, *editCopy, *magAll, *magSel, *magOne, *magMinus, *filePrintFit, *tune, *symEdit, *intoH, *popH, *simulate, *save_netlist, *dpl_sch, *undo, *redo, *dcbias; QAction *exportAsImage; diff --git a/qucs/qucs.qrc b/qucs/qucs.qrc index 0555244e8..425f5f2eb 100644 --- a/qucs/qucs.qrc +++ b/qucs/qucs.qrc @@ -201,6 +201,7 @@ bitmaps/viewmag+.png bitmaps/viewmag1.png bitmaps/viewmagfit.png + bitmaps/viewmagsel.png bitmaps/vprobe.png bitmaps/vpulse.png bitmaps/vrect.png diff --git a/qucs/qucs_init.cpp b/qucs/qucs_init.cpp index 9d85b619f..9e6c8939d 100644 --- a/qucs/qucs_init.cpp +++ b/qucs/qucs_init.cpp @@ -364,6 +364,12 @@ void QucsApp::initActions() magAll->setWhatsThis(tr("View All\n\nShows the whole page content")); connect(magAll, SIGNAL(triggered()), SLOT(slotShowAll())); + magSel = new QAction(QIcon((":/bitmaps/viewmagsel.png")), tr("Zoom to selection"), this); + magSel->setShortcut(tr("Z")); + magSel->setStatusTip(tr("Zoom to selected components")); + magSel->setWhatsThis(tr("Zoom to selection\n\nZoom to selected components")); + connect(magSel, SIGNAL(triggered()), SLOT(slotZoomToSelection())); + magOne = new QAction(QIcon((":/bitmaps/viewmag1.png")), tr("View 1:1"), this); magOne->setShortcut(Qt::Key_1); magOne->setStatusTip(tr("Views without magnification")); @@ -778,6 +784,7 @@ void QucsApp::initMenuBar() viewMenu = new QMenu(tr("&View")); // menuBar entry viewMenu viewMenu->addAction(magAll); + viewMenu->addAction(magSel); viewMenu->addAction(magOne); viewMenu->addAction(magPlus); viewMenu->addAction(magMinus); @@ -904,6 +911,7 @@ void QucsApp::initToolBar() viewToolbar = new QToolBar(tr("View")); this->addToolBar(viewToolbar); viewToolbar->addAction(magAll); + viewToolbar->addAction(magSel); viewToolbar->addAction(magOne); viewToolbar->addAction(magPlus); viewToolbar->addAction(magMinus); diff --git a/qucs/qucsdoc.h b/qucs/qucsdoc.h index 602e7b5f7..ad0cab953 100644 --- a/qucs/qucsdoc.h +++ b/qucs/qucsdoc.h @@ -37,6 +37,7 @@ class QucsDoc { virtual void becomeCurrent(bool) {}; virtual float zoomBy(float) { return 1.0; }; virtual void showAll() {}; + virtual void zoomToSelection() {}; virtual void showNoZoom() {}; static QString fileSuffix (const QString&); diff --git a/qucs/schematic.cpp b/qucs/schematic.cpp index 0b7838a84..ce4c2d4cf 100644 --- a/qucs/schematic.cpp +++ b/qucs/schematic.cpp @@ -794,6 +794,30 @@ void Schematic::showAll() zoom(xScale); } +// ------------------------------------------------------ +void Schematic::zoomToSelection() +{ + sizeOfSelection(UsedX1, UsedY1, UsedX2, UsedY2); + if(UsedX1 == 0) + if(UsedX2 == 0) + if(UsedY1 == 0) + if(UsedY2 == 0) { + showAll(); + return; + } + + float xScale = float(visibleWidth()) / float(UsedX2-UsedX1+80); + float yScale = float(visibleHeight()) / float(UsedY2-UsedY1+80); + if(xScale > yScale) xScale = yScale; + xScale /= Scale; + + ViewX1 = UsedX1 - 40; + ViewY1 = UsedY1 - 40; + ViewX2 = UsedX2 + 40; + ViewY2 = UsedY2 + 40; + zoom(xScale); +} + // --------------------------------------------------- void Schematic::showNoZoom() { @@ -1018,6 +1042,124 @@ void Schematic::sizeOfAll(int& xmin, int& ymin, int& xmax, int& ymax) } } +void Schematic::sizeOfSelection(int& xmin, int& ymin, int& xmax, int& ymax) +{ + xmin=INT_MAX; + ymin=INT_MAX; + xmax=INT_MIN; + ymax=INT_MIN; + Component *pc; + Diagram *pd; + Wire *pw; + WireLabel *pl; + Painting *pp; + + bool isAnySelected = false; + + if(Components->isEmpty()) + if(Wires->isEmpty()) + if(Diagrams->isEmpty()) + if(Paintings->isEmpty()) { + xmin = xmax = 0; + ymin = ymax = 0; + return; + } + + + float Corr = textCorr(); + int x1, y1, x2, y2; + // find boundings of all components + for(pc = Components->first(); pc != 0; pc = Components->next()) { + if (!pc->isSelected) { + continue; + } + isAnySelected = true; + pc->entireBounds(x1, y1, x2, y2, Corr); + if(x1 < xmin) xmin = x1; + if(x2 > xmax) xmax = x2; + if(y1 < ymin) ymin = y1; + if(y2 > ymax) ymax = y2; + } + + // find boundings of all wires + for(pw = Wires->first(); pw != 0; pw = Wires->next()) { + if (!pw->isSelected) { + continue; + } + isAnySelected = true; + if(pw->x1 < xmin) xmin = pw->x1; + if(pw->x2 > xmax) xmax = pw->x2; + if(pw->y1 < ymin) ymin = pw->y1; + if(pw->y2 > ymax) ymax = pw->y2; + + pl = pw->Label; + if(pl) { // check position of wire label + pl->getLabelBounding(x1,y1,x2,y2); + if(x1 < xmin) xmin = x1; + if(x2 > xmax) xmax = x2; + if(y1 < ymin) ymin = y1; + if(y2 > ymax) ymax = y2; + } + } + + // find boundings of all node labels + for(Node *pn = Nodes->first(); pn != 0; pn = Nodes->next()) { + if (!pn->isSelected) { + continue; + } + isAnySelected = true; + pl = pn->Label; + if(pl) { // check position of node label + pl->getLabelBounding(x1,y1,x2,y2); + if(x1 < xmin) xmin = x1; + if(x2 > xmax) xmax = x2; + if(y1 < ymin) ymin = y1; + if(y2 > ymax) ymax = y2; + } + } + + // find boundings of all diagrams + for(pd = Diagrams->first(); pd != 0; pd = Diagrams->next()) { + if (!pd->isSelected) { + continue; + } + isAnySelected = true; + pd->Bounding(x1, y1, x2, y2); + if(x1 < xmin) xmin = x1; + if(x2 > xmax) xmax = x2; + if(y1 < ymin) ymin = y1; + if(y2 > ymax) ymax = y2; + + for (Graph *pg : pd->Graphs) + // test all markers of diagram + for (Marker *pm : pg->Markers) { + pm->Bounding(x1, y1, x2, y2); + if(x1 < xmin) xmin = x1; + if(x2 > xmax) xmax = x2; + if(y1 < ymin) ymin = y1; + if(y2 > ymax) ymax = y2; + } + } + + // find boundings of all Paintings + for(pp = Paintings->first(); pp != nullptr; pp = Paintings->next()) { + if (!pp->isSelected) { + continue; + } + isAnySelected = true; + pp->Bounding(x1, y1, x2, y2); + if(x1 < xmin) xmin = x1; + if(x2 > xmax) xmax = x2; + if(y1 < ymin) ymin = y1; + if(y2 > ymax) ymax = y2; + } + + if (!isAnySelected) { + xmin = xmax = 0; + ymin = ymax = 0; + } +} + // --------------------------------------------------- // Rotates all selected components around their midpoint. bool Schematic::rotateElements() diff --git a/qucs/schematic.h b/qucs/schematic.h index 328b8d31f..bdcd4c624 100644 --- a/qucs/schematic.h +++ b/qucs/schematic.h @@ -93,6 +93,7 @@ class Schematic : public Q3ScrollView, public QucsDoc { float textCorr(); bool sizeOfFrame(int&, int&); void sizeOfAll(int&, int&, int&, int&); + void sizeOfSelection(int&, int&, int&, int&); bool rotateElements(); bool mirrorXComponents(); bool mirrorYComponents(); @@ -102,6 +103,7 @@ class Schematic : public Q3ScrollView, public QucsDoc { float zoom(float); float zoomBy(float); void showAll(); + void zoomToSelection(); void showNoZoom(); void enlargeView(int, int, int, int); void switchPaintMode(); @@ -325,6 +327,7 @@ protected slots: bool isAnalog; bool isVerilog; bool creatingLib; + }; #endif From 1f33f787a409d7297edc2fa83795ed1d522d32aa Mon Sep 17 00:00:00 2001 From: Krasilnikov Sergey Date: Thu, 19 Oct 2023 10:29:54 +0300 Subject: [PATCH 2/7] merge current --- qucs/bitmaps/svg/viewmagsel.svg | 1 + qucs/bitmaps/viewmagsel.png | Bin 36721 -> 0 bytes qucs/qucs.qrc | 1 + qucs/qucs_init.cpp | 3 +-- 4 files changed, 3 insertions(+), 2 deletions(-) create mode 100644 qucs/bitmaps/svg/viewmagsel.svg delete mode 100644 qucs/bitmaps/viewmagsel.png diff --git a/qucs/bitmaps/svg/viewmagsel.svg b/qucs/bitmaps/svg/viewmagsel.svg new file mode 100644 index 000000000..865913e83 --- /dev/null +++ b/qucs/bitmaps/svg/viewmagsel.svg @@ -0,0 +1 @@ +S \ No newline at end of file diff --git a/qucs/bitmaps/viewmagsel.png b/qucs/bitmaps/viewmagsel.png deleted file mode 100644 index b2916194dd3634e5a601fafb472f6098985a7fe3..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 36721 zcmY&fWmKC@uzmx!0Bf#U8^+>5&v_o6LODDEyT6fLg79g4d{Q{16Q$jx`p zxj*iY?B+e^P0q~h?94OI&VJTVlgGiNzytsQM^QmW3jjcfuOI*&6)_ome78YN7;Xv% zo&fNo|Gy6?mF)#30MG)8GLr9obB;Uxep)RDQQzjCR5x~1G~e*9^W{WRarSNNW6ORc zAhuT+!)KgMV&WxYoz}&J;17VoPQUS-us+dBgTV|K{R$EU!e4)azc8UCp~w?((7ae&JcQ|WNE%Q_TYdcq5b^V_&);WRLF7fV>#U!kEMqhdfYOuOi!3Bqp zy7)mhM(yh)ivfi&7_8`nXDa%8XCq9+3m6-Jk=&@Z%a79bB=LMtC(+Q*x*km(U$VE+ zmhyXTHXBxr2j!R9zo5cL7q(shz>2QCM$n;&0)d&zqno{IXKH1-vlV|_zRMF2nUd=? z4KXrK*rbkj#{oWZe@6yvkBI;`IwT-b_8U^@`@`2jNpS-%&^PVIeTGKxu^AuOe zfwI}#f|N2(umvls@)~akKDgk^KfaP0`lpA76=}|8Xb*8%asfLLvt(8osgJjJ{!fAk z;SaS$pO{=QPv3*SGm3G0pN*BkAG^=7Xv91Z#}no#Z=%U8ncG4gmupCM!K0={QwmMEObh3S+Zl;LMjieR;A>w~NK%@6n=^)#v4{)xd{M&Q;o0dF(u`By&d zIA9Z&A9NP`2E%BiOC# zn?uf*%z|Lz&prQZcDDWkcCa$O{*L|{29g{7PB*mk3^w<$vU0Z^&VE016dl2t-1X%+ z$GuOO8GsCI`+@U0&{(W^eoX|K4fmCFu@B~?Xi@xNWQ~cES4`+vOKRg?f84$gk;k8U#V&%1M3l5!(YK>+ljfdjWBI~N*qjJ!Y1554~-5i zL|V4&l%!oQFzr(F!P1lP#GA4zHPwFDLJT)RoTM60A4KM=N5y*Q26qVxy4jWT-FDw=E

0;NnHmg-XweKOX=3 zmkrI6E}sPf*ZyMI(b6B=#l)m9F>d#lDWA2RgZ(e6654#SiNKb_698tB}vCOE6dA|u>8l?1UPP7T{wzGj}|zs zg#)}5GcWG>N9B0%{wxIk7&3MjPVBhMYUw$0=Jz41AFB^9l0EUO)>SSvpIJTdit_Kr zw=7?f+S}WsBk~JWuD`Cd{9rV&SS*`rXUDFl%@GfwE?3JRH1Wyp`=MQ4mKVm(=ns2m zOjk=^VB3ol$*wG7c0Z~YJn{!EZ39A};gT=LT zWCr*5cXPu#J~{ai0*5%ALBT?dF!zXjc{?1BB11Dw=^8zvihhVcDz4}`(0aEK;QoBt z?tXWF^$Hz1>8sW(4Yop>wY(^>r2$3_f9`=l*T8Q=VC5kX<(ogxQPb$pP2v`%fj@0e zNyvu4!=dy+()OpOxnNVqfsHWCCv*7zFrK0<;O5Rr?MHfWo!70 zm2kOUf%EBV&s#Es&WeX|<)29IEi^UK#>Vej@=5Ep_(yjj145Flu{$wj{0vnHPr6(4 z6l^_vesrH&N7(DihwdD?#NbPhd8p_Zh>92}CAt(HN>&%U7wNv7dR~S)yO_^t*J5LI z#abRqEZr9U7N6@$M=GOMDn}kBeo*dG>skkQ(jE5dVd=okOc1>zUl)Qh>BE6 z)^vI39RJl@+r4NB`M?8w^+$1a=n!2OM@PE6ZSIa=3xOm1o>#fbI$ERHrxnc}6b&

ZO*g=4h-}GapG}C>mRuyi@zrM{oPjUEFzHMAHODSy%m0_Ti1S^U) zwj>@sdf=SH8@sBD{^mT$t{LpLY2bydam)FqR^L{6)6;xsPz^DOPZeUJ6Dy7?^d;>BAVy>(^I>q*tmXGxn(UCRCf7yJ=WORqO+H~ulH!?

J`czdx2f;T9;gqRIO>%c_8;7zI@l8oU93Lw%1NgPi{;qD>z||HhTsH$e|`kK-{ao zZyz*Ol8d-|IYG2v?6nd)Sl!omgA!)__uPBp=ep9PB!os&U;Q2oO@a`1>0;jamrUi^ zaS~s`#7+Y=xbscVCx6)9KIGqm5Vr&k=ZK_pM{TKU5kw2o+$-ZFx-TwRt8lMehY9 z@rp=>6n+tz!4A!KTA_J;kyxZ|79lvF?Z2HFW2rjqWX87jlTr(^vAyZ6n@&`E{Xyb0 z2St5dFvsoOa)7#W`ab|~9?4`cNv2UE;R<R0>C+ke+?^nH zTcV}p>g4o0xVxq-;Ug=OtNz++kiNom^Sggr;$XlLCcIlaBHl9;Ddt`kWk|Jqcq>2+ zKh(R(Jqtuj=QQapeYWrL{mtDDTR!z#ocH-`<|>!uZgYD_i2qN;Qw;|?w#)WPRMKI1=YzVawx1M@jRlAYgQ0P>q_gf>m`QiyFsyhV({iJ|NO@kd-~!~Nmgzo zXQ6UAH_UCU0Uo}CSm(AL9@=m2?wV1Yky=I*C4@yDj-t{c9l>DGnKS8y=Yjz9bR z01pD0iR9LVz#Mz7rp&kzIAhPlgVa>ij!c-G)>6^+Gff0F`$f0}*)|q&B(-7`tF{)t z_<4`8Jjd;OvVeM1TttS|*>G6=nkZHgZHZez?XZnyX~sVB)WtuG|F)l*Z#H%B7U%1`GA7xTm#|x= zG+$$ObpOIgo|K#W5*rnH?g*zrZ#9$$frnP&s=9BG8W!}On>S$)qm3EZWqQ|jV4C#+ zFO~1^t}X`Tn-g3f5vt@v&e1~77eS#{b>G;rLYYFyz<)Ar^AAK}*RxgWrfpVv%N5^( zry)Mokv1#l%(5Z^t&674Eb0H!B!I+H6cBkk*-cbF-=s>_yoRJPu6oT-KT|i8D6mu- z%O)(>OPX=_IsiCr9sQ(HiBghp^$J_8Nb(Id?w(3$c-p@4XiY&e(!8G-=?EX4?jQFA zW^w$FOH@-ufpH@NR2j$klM`pg5j+dB4_;n45rBcf0*4*|n0tBMphe)t5`-&vgt`4f zG3UGwIUWjm>K1Q!vb@XH67YhPTOwdPIuea~;1R~9;FK7tX@@WVl(XOnTVK=0>9}E_ zxk~WSsbF>?65x0Pq9qa4$V)E^$KTD#;J#&iqOEyD->|}iUnLYU+bZDB(e!BD>(6fq zi{u(_oV26ESoyYf>dwn$^RtW%U6ymCO9rH#kw{ok`l^+Vx9IJy)F$5Kn{8twI+hZo z-Eq58dpvXoGSaIKP-r4n0Gr*H%;;44SHUIB&whoZJ{921-^V~Lac?av`LFl-%{N(HJT|0Ho?@>XF2TjY zTdb3r)3mfXj%wJIm#8Uarn*F}M>yPa7=V)xw!@81Jw^Pun-DF`l;)FXgCU28QaSRM zQ7N~xpt~RdBB<X?Gv*Md?SA@Y9WfDk8jboa*Ed-!g&QIF;c*xTCY#r&z|q#_xZ5p?sTmW^ho~nNMnHz zO0b|bV3QPFrOT$0RPx7f7KpN^({9fSU9}!#y7H^Y;xKCDVr5SRuzjPSp`Vc_-69nk$Ny1pbi~ zX3*i{`|;O0j8@KJ=`Kjs16VpJ)AFD`{iyAiSkc=B6byR^+;dvu#~^?3_z_7aE<{Jh zfmtPNE2k)1DFcZDuWz%UFwKwhiJ!${bucP6?u7cCqWmYVe|7kfR!QX)`FJX z#^p~@g_5=8=oAA$!_e$66M$x zY9v_=s*}JQUG{q8!UjHVBL#!>;gYf1!o0{Ni4!+j#jICgk$I=)vu709Qin3X@UEhp$q7WNp$|5?|Nw^ikBm_Ftw=Fgat?lD_wI#4P2{$UNYi71yn z+gm61X>m@VvRYIuOnM;mrI#^mHB`sQ5;c6>K;kta$vi_N$)x~bWk2~b>r!SG+u)Gc zpa&>eeOY$`>w&Pa#?8gyq5EW9^xbh^-p-1BY&V&85*QJo31-&K;=qoA{XnOB&X)v9 zEl-BrV8OQtQ)bu@!g%K`96+o4Y2@i)k z!h&6QFZbDe{VT(4tMPKn$=x}+Ukz6d(J?SuMevI$WmA`C(-ETBR+zKTwh|SQyo#It&2s!`!5t%IMuChWC6o3CuZvqz z++y7#%`4hKV0#|^)#Na7H}3ME~dRd#4@@bVvts} zc{EVdaf#V=ql7bMOy|!}g}->2K7tD@oHXyDz1W3){UFkb1e^P9Rk~f{FX{H%Nf6aS z4BPl}mFs-+1}`n*jbtR#J^e9M?p8~YeHp_Rqp*QCg#?gb;h@;i7abjHqt}Rf1@1If z##=!Kir+IjSQO2CLN~*c!}y8*FHF9H$KP09BaWGJ`qk=D+!vN>u#lcESb_`(e1)o5 zfzDJ$^}_g_MwzA=-O}fz9#sz4Qg!YY#M=}R~Y|Gu-Pd6jsI?wqr!hyU zD(w~K-aFO!bZhfP>Zr=J>j-Vv%DkAoe8SrjFM|3r1^$I&Fc3%Rp4PwyVpdI`Kuz|V@_k{8-@f8_&*hCCs_lzc>D!+Vx-kF6}l5yhndEQDQVXf!0!sWG)M_ z)5e>W6TOZT|FLRjA7w5nQT#hS?@SSozJX_j7?i1u3Mg9Ck0)xX(r)D>OTKy>v~!UK zA~cGL@$(?FM&JC-jD!?tv5Pf7v3$Xc=;0@-4UcM|PGAh&`zC+-yt3GJ`!7cW5&h8@ zMdBN?{}Ce2O5R!i^!hWNiKd<}d==)0wv1=)>grlPe05`5Bcl4S9Atc{J^2M}5_QuyKuTMQWkO71R5DDzHomH~aKG=*n!kqbGh=x?U zr~S14FfeZ_K#H3@iXH^CHyo+D<_ML1l56{|crQwFq-rJ~ACuD>5T4g<%h!H%I&nPL zit}=w0R^xS8()WUoyJ!K5Pt?I{K28A3~g&{Oq`-v<0Sg2^Hf_LUEM5&q>`%{Wm39Q z89Y>-=1>Gj8?rT?$%o53Xo%1*7;$7Il(Xk`fU+jpVu}kf3|Vn#?A>;2;VfPIcVh-8 zh0j3vjrF>zkm5LE=n?!$Y>n8|#W-=%EWaRXe~U{gQ)&ffREx9udqLO+?Ao%vxoDbHX1rppf17L=H#R)3 zr;+?86kyqoUk(<$xp6mx)e`O|hU8YV742yX?`M8@aW|PGc0~v1GXi}U^~sEVsjeNv z)##6$Su!r1b{`o1X|7eFTH5=X}#> z$>z8x|C1i5go_IsY-DnHSt_ zr+h#ytLy6Of{*h}iE3-oHXIXlNV~1Wtt?GKELAd~evjJ-int{yw(}3aD&gkcLclub zi#Fu{XaNKl7~V@3muyS87}AN~#5?KZO*p@<`rc=b#t-4c9QS8!0em7MQ#RfRi(tl? ze7G}Q?l~X!q4;NNwOCc@tVwh@45q#+5bLsDtXvBMhCS!Oz@{aGlp?}4;so%4y-cSi zSg!`-z;}K8!oN$_c(DiyX$to^co2&A>bjR&tYe~0y)U>-9>4>CSlY0A1=P+^U@-tW zZ<`DCrha~PQjkE&$0Xi&dKwoNyAAVThteJ@_(Ne3Z;U9s&;Ay!O z(f0w7)4H@L#Kvev?BMZN_kT<(3qF#PwZj38u}d%@n&1VZt-fE4`#R=r(N_!FWdJ*(c&=Fd6#+LiMuV1u+Y3w6XXLla!%%hC?<0p zOPkQfzere?$`$#S^!jHs>+XbN=4sNEeRA|f8Y~#b`hkcI>$%7ePcF!nj*f}-kOJ|H z1&@>-GK0rGX7T&tJZNL%f+QZ8`qc?|%oy@A?C26OK0=%ipP%<71O`q&8@pY%b&egd zL^eJ*b$2`6SAO*waU~2&dy=G$vOdBEq>dVC@uVN$)kH@^>s<0G%b<0f6Z`g4P_Zd! z=k)iO(UOLUDGy@9o%SOjQKQK=eP8cB*yD%ongzz*X+0S++bzs+g7Pj(CB}8po*Cnz zmExwUt!u|AL9wyo-*Mw1HCCkz0942nJdK;+|GVm5SIs69NVZ4WI}p;E`kfC-7Z zd^VstZ9^)eDA}%r>YRc)_m9;Yw?vJMJr#z|s}Q1uGc(V(8F{XyP3bK4SaAXJPU<6~ z__d}0Hwg$}xx|KVYO^Aa(U7F<-jb=Qn}IqJnbXwzkSD;N`sd!umu#-P|d5V4H2;pU?XG6MeN0#t>^UAci3*kWk zcW~3KuzL3|2BZb7f1|&ob8X0rSg?~UkXU0gyRCfc5F#2=F$1X!aKik5{f{N=Bty^O zk;B8ohXQd(k0kD6fS3(dF#G-bI`rG7fYs54A;OXb^fl3`77?mHK@h`<*|bm{nTFv~ zf$I4tGR0rRM3Yo!UFi~C!&pG53T1wp4Ulw)F6OppgnLt%lMEar>wEk{u!1hj)<_if`{(OTEtepV0M2~y_Tn(X^51}r{^|Jw?u z$!pGUBv3lA$ohJIZG9GVlW)3K_YBcQlq~(@hM7;0LNv(U(haqj+{;G;@21?NR2CB% zedS&cl~Z@6KNx*ocn0&g2VOx7o>SKN?uX1;wz}YoNg7S?XE}eDfdn8F+!1XE;ZfM{ z!po$$y!7!DOaI(gl9BcIbi++F$gsGpc^Q+UXnGB#MuMr&W&XG#f&G9iqZ!9u8OW$D z`k#Q_ouQE;T<)vp-vE`=_H`GmDldpIqW^(Xlc@8kg)pHiB&7PrXGC3$%d7q2=fEY! zjad3qbv9PquWfH(70fgRF@+N9f9ZGSBnw|43Rz*4mhFt}v7xathwR_pu1?(Wx4V8m z<>br1c~W`9n}1_!^Wi8mY^}Lw-PngPevY#;Pp|0P3LZj_=JFUrPy^sO*bC~?^C)*qzjbILb!hmEa>C7>B%`Le-Oy0(>rW_VOUgv#C-x=J*3 z6Q;fn?=iD|p)}g!-*u~iJ)lPlNz%sMxhkpxfa(^Njt&h%%$UhUS3^P+q z44wE?q0g3)XnBPID_A!PCwhKRl)RLLPo@=op21bot zyFQX6CL3t>o009~9@bkmya$zsOb3;P@`z^T_UCw)U?340u(Rt6m>G@|kk9i{WwX&* z7V>JMlg)bL52@YOjCya8nmK;_g1%n&D05vh#fATI>C`fD7`rFKXx$iB5

b@CNVG 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≶DrrA!$sm;sH-(%h&&?GY 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 N002ovPDHLkV1lJHam)Y! diff --git a/qucs/qucs.qrc b/qucs/qucs.qrc index bde552fc0..0bbc1fa9c 100644 --- a/qucs/qucs.qrc +++ b/qucs/qucs.qrc @@ -431,6 +431,7 @@ bitmaps/svg/editredo.svg bitmaps/svg/editundo.svg bitmaps/svg/viewmagfit.svg + bitmaps/svg/viewmagsel.svg bitmaps/svg/viewmag1.svg bitmaps/svg/viewmag+.svg bitmaps/svg/viewmag-.svg diff --git a/qucs/qucs_init.cpp b/qucs/qucs_init.cpp index ab9615eca..bbe7980ab 100644 --- a/qucs/qucs_init.cpp +++ b/qucs/qucs_init.cpp @@ -364,13 +364,12 @@ void QucsApp::initActions() magAll->setWhatsThis(tr("View All\n\nShows the whole page content")); connect(magAll, SIGNAL(triggered()), SLOT(slotShowAll())); - magSel = new QAction(QIcon((":/bitmaps/viewmagsel.png")), tr("Zoom to selection"), this); + magSel = new QAction(QIcon((":/bitmaps/svg/viewmagsel.svg")), tr("Zoom to selection"), this); magSel->setShortcut(tr("Z")); magSel->setStatusTip(tr("Zoom to selected components")); magSel->setWhatsThis(tr("Zoom to selection\n\nZoom to selected components")); connect(magSel, SIGNAL(triggered()), SLOT(slotZoomToSelection())); - magOne = new QAction(QIcon((":/bitmaps/viewmag1.png")), tr("View 1:1"), this); magOne = new QAction(QIcon((":/bitmaps/svg/viewmag1.svg")), tr("View 1:1"), this); magOne->setShortcut(Qt::Key_1); magOne->setStatusTip(tr("Views without magnification")); From 2c7ea4ef8a8810cbbbf118fc83c281a985b41de1 Mon Sep 17 00:00:00 2001 From: Krasilnikov Sergey Date: Thu, 19 Oct 2023 14:06:24 +0300 Subject: [PATCH 3/7] wip --- qucs/schematic.cpp | 47 +++++++++++++++++++++++++++++----------------- qucs/schematic.h | 1 + 2 files changed, 31 insertions(+), 17 deletions(-) diff --git a/qucs/schematic.cpp b/qucs/schematic.cpp index ce4c2d4cf..0884af08b 100644 --- a/qucs/schematic.cpp +++ b/qucs/schematic.cpp @@ -75,6 +75,7 @@ Schematic::Schematic(QucsApp *App_, const QString& Name_) ViewX2=ViewY2=800; UsedX1 = UsedY1 = INT_MAX; UsedX2 = UsedY2 = INT_MIN; + zx1 = zx2 = zy1 = zy2 = 0; tmpPosX = tmpPosY = -100; tmpUsedX1 = tmpUsedY1 = tmpViewX1 = tmpViewY1 = -200; @@ -797,25 +798,37 @@ void Schematic::showAll() // ------------------------------------------------------ void Schematic::zoomToSelection() { - sizeOfSelection(UsedX1, UsedY1, UsedX2, UsedY2); - if(UsedX1 == 0) - if(UsedX2 == 0) - if(UsedY1 == 0) - if(UsedY2 == 0) { - showAll(); - return; - } + int x1, x2, y1, y2 = 0; + sizeOfSelection(x1, y1, x2, y2); + if (x1 == 0 && x2 == 0 && y1 == 0 && y2 == 0) { + showAll(); + return; + } + + if (x1 == zx1 && x2 == zx2 && y1 == zy1 && y2 == zy2) { + return; + } + + zx1 = x1; + zy1 = y1; + zx2 = x2; + zy2 = y2; + + float xScale = float(visibleWidth()) / float(x2 - x1 + 80); + float yScale = float(visibleHeight()) / float(y2 - y1 + 80); + float scale = qMin(xScale, yScale); + + ViewX1 = x1 - 40; + ViewY1 = y1 - 40; + ViewX2 = x2 + 40; + ViewY2 = y2 + 40; - float xScale = float(visibleWidth()) / float(UsedX2-UsedX1+80); - float yScale = float(visibleHeight()) / float(UsedY2-UsedY1+80); - if(xScale > yScale) xScale = yScale; - xScale /= Scale; + scale = zoom(scale / Scale); - ViewX1 = UsedX1 - 40; - ViewY1 = UsedY1 - 40; - ViewX2 = UsedX2 + 40; - ViewY2 = UsedY2 + 40; - zoom(xScale); +// float xShift = scale * (x2 - 0.5 * (x2 - x1)) - (0.5 * visibleWidth() + contentsX()); +// float yShift = scale * (y2 - 0.5 * (y2 - y1)) - (0.5 * visibleHeight() + contentsY()); +// +// scrollBy(xShift, yShift); } // --------------------------------------------------- diff --git a/qucs/schematic.h b/qucs/schematic.h index bdcd4c624..03606813e 100644 --- a/qucs/schematic.h +++ b/qucs/schematic.h @@ -147,6 +147,7 @@ class Schematic : public Q3ScrollView, public QucsDoc { int GridX, GridY; int ViewX1, ViewY1, ViewX2, ViewY2; // size of the document area int UsedX1, UsedY1, UsedX2, UsedY2; // document area used by elements + int zx1, zy1, zx2, zy2; // cache for zoom to selection int showFrame; QString Frame_Text0, Frame_Text1, Frame_Text2, Frame_Text3; From b54d54a1cc4599c055afafc9c5aecddef9ad0924 Mon Sep 17 00:00:00 2001 From: Krasilnikov Sergey Date: Thu, 19 Oct 2023 15:53:15 +0300 Subject: [PATCH 4/7] working solution --- qucs/schematic.cpp | 41 ++++++++++++++++++++++++++++------------- 1 file changed, 28 insertions(+), 13 deletions(-) diff --git a/qucs/schematic.cpp b/qucs/schematic.cpp index 0884af08b..67a615c5f 100644 --- a/qucs/schematic.cpp +++ b/qucs/schematic.cpp @@ -814,21 +814,36 @@ void Schematic::zoomToSelection() zx2 = x2; zy2 = y2; - float xScale = float(visibleWidth()) / float(x2 - x1 + 80); - float yScale = float(visibleHeight()) / float(y2 - y1 + 80); - float scale = qMin(xScale, yScale); - - ViewX1 = x1 - 40; - ViewY1 = y1 - 40; - ViewX2 = x2 + 40; - ViewY2 = y2 + 40; + float initialScale = Scale; + float scale = 1; + float xShift = 0; + float yShift = 0; + + float ax1 = (x2 - ViewX1) * initialScale; + float ay1 = (y2 - ViewY1) * initialScale; + float DX = float(x2 - x1); + float DY = float(y2 - y1); + + if((Scale * DX) < 6.0) { + // a simple click zooms by constant factor + scale = zoom(1.5)/initialScale; + + xShift = scale * x2; + yShift = scale * x2; + } else { + float xScale = float(visibleWidth()) / std::abs(DX); + float yScale = float(visibleHeight()) / std::abs(DY); + scale = qMin(xScale, yScale)/initialScale; + scale = zoom(scale)/initialScale; - scale = zoom(scale / Scale); + xShift = scale * (ax1 - 0.5*DX); + yShift = scale * (ay1 - 0.5*DY); + } + xShift -= (0.5*visibleWidth() + contentsX()); + yShift -= (0.5*visibleHeight() + contentsY()); + scrollBy(xShift, yShift); -// float xShift = scale * (x2 - 0.5 * (x2 - x1)) - (0.5 * visibleWidth() + contentsX()); -// float yShift = scale * (y2 - 0.5 * (y2 - y1)) - (0.5 * visibleHeight() + contentsY()); -// -// scrollBy(xShift, yShift); + releaseKeyboard(); // allow keyboard inputs again } // --------------------------------------------------- From 580329ec9c36021b79a0d8726be9f53f0846b76d Mon Sep 17 00:00:00 2001 From: Krasilnikov Sergey Date: Thu, 19 Oct 2023 16:41:47 +0300 Subject: [PATCH 5/7] revert unneeded check --- qucs/schematic.cpp | 10 ---------- qucs/schematic.h | 1 - 2 files changed, 11 deletions(-) diff --git a/qucs/schematic.cpp b/qucs/schematic.cpp index 67a615c5f..81e4c2e02 100644 --- a/qucs/schematic.cpp +++ b/qucs/schematic.cpp @@ -75,7 +75,6 @@ Schematic::Schematic(QucsApp *App_, const QString& Name_) ViewX2=ViewY2=800; UsedX1 = UsedY1 = INT_MAX; UsedX2 = UsedY2 = INT_MIN; - zx1 = zx2 = zy1 = zy2 = 0; tmpPosX = tmpPosY = -100; tmpUsedX1 = tmpUsedY1 = tmpViewX1 = tmpViewY1 = -200; @@ -805,15 +804,6 @@ void Schematic::zoomToSelection() return; } - if (x1 == zx1 && x2 == zx2 && y1 == zy1 && y2 == zy2) { - return; - } - - zx1 = x1; - zy1 = y1; - zx2 = x2; - zy2 = y2; - float initialScale = Scale; float scale = 1; float xShift = 0; diff --git a/qucs/schematic.h b/qucs/schematic.h index 03606813e..bdcd4c624 100644 --- a/qucs/schematic.h +++ b/qucs/schematic.h @@ -147,7 +147,6 @@ class Schematic : public Q3ScrollView, public QucsDoc { int GridX, GridY; int ViewX1, ViewY1, ViewX2, ViewY2; // size of the document area int UsedX1, UsedY1, UsedX2, UsedY2; // document area used by elements - int zx1, zy1, zx2, zy2; // cache for zoom to selection int showFrame; QString Frame_Text0, Frame_Text1, Frame_Text2, Frame_Text3; From 51ace3a3113656d25f777e279a9928ea6466de12 Mon Sep 17 00:00:00 2001 From: Krasilnikov Sergey Date: Fri, 20 Oct 2023 00:33:01 +0300 Subject: [PATCH 6/7] fix right button rotate --- qucs/mouseactions.cpp | 157 +++++++++++++++++++++--------------------- 1 file changed, 78 insertions(+), 79 deletions(-) diff --git a/qucs/mouseactions.cpp b/qucs/mouseactions.cpp index 4fde200d3..26be53162 100644 --- a/qucs/mouseactions.cpp +++ b/qucs/mouseactions.cpp @@ -1242,98 +1242,97 @@ void MouseActions::MPressRotate(Schematic *Doc, QMouseEvent*, float fX, float fY // ----------------------------------------------------------- // insert component, diagram, painting into schematic ?! -void MouseActions::MPressElement(Schematic *Doc, QMouseEvent *Event, float, float) -{ - if(selElem == 0) return; - //QPainter painter(Doc->viewport()); - //setPainter(Doc, &painter); +void MouseActions::MPressElement(Schematic *Doc, QMouseEvent *Event, float, float) { + if (selElem == 0) return; + //QPainter painter(Doc->viewport()); + //setPainter(Doc, &painter); - int x1, y1, x2, y2, rot; - if(selElem->Type & isComponent) { - Component *Comp = (Component*)selElem; + int x1, y1, x2, y2, rot; + if (selElem->Type & isComponent) { + Component *Comp = (Component *) selElem; // qDebug() << "+-+ got to switch:" << Comp->Name; - QString entryName = Comp->Name; - - switch(Event->button()) { - case Qt::LeftButton : - // left mouse button inserts component into the schematic - // give the component a pointer to the schematic it's a - // part of - Comp->setSchematic (Doc); - Comp->textSize(x1, y1); - Doc->insertComponent(Comp); - Comp->textSize(x2, y2); - if(Comp->tx < Comp->x1) Comp->tx -= x2 - x1; - - // Note: insertCopmponents does increment name1 -> name2 + QString entryName = Comp->Name; + + switch (Event->button()) { + case Qt::LeftButton : + // left mouse button inserts component into the schematic + // give the component a pointer to the schematic it's a + // part of + Comp->setSchematic(Doc); + Comp->textSize(x1, y1); + Doc->insertComponent(Comp); + Comp->textSize(x2, y2); + if (Comp->tx < Comp->x1) Comp->tx -= x2 - x1; + + // Note: insertCopmponents does increment name1 -> name2 // qDebug() << " +-+ got to insert:" << Comp->Name; - // enlarge viewarea if component lies outside the view - Comp->entireBounds(x1,y1,x2,y2, Doc->textCorr()); - Doc->enlargeView(x1, y1, x2, y2); + // enlarge viewarea if component lies outside the view + Comp->entireBounds(x1, y1, x2, y2, Doc->textCorr()); + Doc->enlargeView(x1, y1, x2, y2); - drawn = false; - Doc->viewport()->update(); - Doc->setChanged(true, true); - rot = Comp->rotated; + drawn = false; + Doc->viewport()->update(); + Doc->setChanged(true, true); + rot = Comp->rotated; - // handle static and dynamic components + // handle static and dynamic components // QucsApp::CompChoose; - if (Module::vaComponents.contains(entryName)){ - QString filename = Module::vaComponents[entryName]; + if (Module::vaComponents.contains(entryName)) { + QString filename = Module::vaComponents[entryName]; // qDebug() << " ===+ recast"; - Comp = dynamic_cast(Comp)->newOne(filename); //va component - qDebug() << " => recast = Comp;" << Comp->Name << "filename: " << filename; - } - else { - Comp = Comp->newOne(); // static component is used, so create a new one - } - rot -= Comp->rotated; - rot &= 3; - while(rot--) Comp->rotate(); // keep last rotation for single component - break; - - case Qt::RightButton : // right mouse button rotates the component - if(Comp->Ports.count() == 0) - break; // do not rotate components without ports - Comp->paintScheme(Doc); // erase old component scheme - Comp->rotate(); - Comp->paintScheme(Doc); // paint new component scheme - break; - - default: ; // avoids compiler warnings - } + Comp = dynamic_cast(Comp)->newOne(filename); //va component + qDebug() << " => recast = Comp;" << Comp->Name << "filename: " << filename; + } else { + Comp = Comp->newOne(); // static component is used, so create a new one + } + rot -= Comp->rotated; + rot &= 3; + while (rot--) Comp->rotate(); // keep last rotation for single component + break; + + case Qt::RightButton : // right mouse button rotates the component + if (Comp->Ports.count() == 0) + break; // do not rotate components without ports + Comp->paintScheme(Doc); // erase old component scheme + Doc->viewport()->repaint(); + Comp->rotate(); + Comp->paintScheme(Doc); // paint new component scheme + break; + + default:; // avoids compiler warnings + } // qDebug() << " => selElem = Comp;" << Comp->Name; - // comp it getting empty - selElem = Comp; - return; - - } // of "if(isComponent)" - else if(selElem->Type == isDiagram) { - if(Event->button() != Qt::LeftButton) return; + // comp it getting empty + selElem = Comp; + return; - Diagram *Diag = (Diagram*)selElem; - QFileInfo Info(Doc->DocName); - // dialog is Qt::WDestructiveClose !!! - DiagramDialog *dia = - new DiagramDialog(Diag, Doc); - if(dia->exec() == QDialog::Rejected) { // don't insert if dialog canceled - Doc->viewport()->update(); - drawn = false; - return; - } + } // of "if(isComponent)" + else if (selElem->Type == isDiagram) { + if (Event->button() != Qt::LeftButton) return; + + Diagram *Diag = (Diagram *) selElem; + QFileInfo Info(Doc->DocName); + // dialog is Qt::WDestructiveClose !!! + DiagramDialog *dia = + new DiagramDialog(Diag, Doc); + if (dia->exec() == QDialog::Rejected) { // don't insert if dialog canceled + Doc->viewport()->update(); + drawn = false; + return; + } - Doc->Diagrams->append(Diag); - Doc->enlargeView(Diag->cx, Diag->cy-Diag->y2, Diag->cx+Diag->x2, Diag->cy); - Doc->setChanged(true, true); // document has been changed + Doc->Diagrams->append(Diag); + Doc->enlargeView(Diag->cx, Diag->cy - Diag->y2, Diag->cx + Diag->x2, Diag->cy); + Doc->setChanged(true, true); // document has been changed - Doc->viewport()->repaint(); - Diag = Diag->newOne(); // the component is used, so create a new one - Diag->paintScheme(Doc); - selElem = Diag; - return; - } // of "if(isDiagram)" + Doc->viewport()->repaint(); + Diag = Diag->newOne(); // the component is used, so create a new one + Diag->paintScheme(Doc); + selElem = Diag; + return; + } // of "if(isDiagram)" // *********** it is a painting !!! From 77f50c262bd4637a55e6df3316a0d74088b6b4ec Mon Sep 17 00:00:00 2001 From: Krasilnikov Sergey Date: Fri, 20 Oct 2023 01:00:46 +0300 Subject: [PATCH 7/7] fix zooming --- qucs/schematic.cpp | 55 +++++++++++++++++++++------------------------- qucs/schematic.h | 1 + 2 files changed, 26 insertions(+), 30 deletions(-) diff --git a/qucs/schematic.cpp b/qucs/schematic.cpp index 81e4c2e02..af7cbc36a 100644 --- a/qucs/schematic.cpp +++ b/qucs/schematic.cpp @@ -76,6 +76,8 @@ Schematic::Schematic(QucsApp *App_, const QString& Name_) UsedX1 = UsedY1 = INT_MAX; UsedX2 = UsedY2 = INT_MIN; + zx1 = zy1 = zx2 = zy2 = dx = dy = 0; + tmpPosX = tmpPosY = -100; tmpUsedX1 = tmpUsedY1 = tmpViewX1 = tmpViewY1 = -200; tmpUsedX2 = tmpUsedY2 = tmpViewX2 = tmpViewY2 = 200; @@ -795,45 +797,39 @@ void Schematic::showAll() } // ------------------------------------------------------ -void Schematic::zoomToSelection() -{ +void Schematic::zoomToSelection() { int x1, x2, y1, y2 = 0; sizeOfSelection(x1, y1, x2, y2); if (x1 == 0 && x2 == 0 && y1 == 0 && y2 == 0) { showAll(); return; } + // + if (zx1 == contentsX() && zx2 == contentsWidth() && + zy1 == contentsY() && zy2 == contentsHeight() && + dx == x2 - x1 && + dy == y2 - y1) { + return; + } - float initialScale = Scale; - float scale = 1; - float xShift = 0; - float yShift = 0; - - float ax1 = (x2 - ViewX1) * initialScale; - float ay1 = (y2 - ViewY1) * initialScale; - float DX = float(x2 - x1); - float DY = float(y2 - y1); - - if((Scale * DX) < 6.0) { - // a simple click zooms by constant factor - scale = zoom(1.5)/initialScale; + dx = x2 - x1; + dy = y2 - y1; - xShift = scale * x2; - yShift = scale * x2; - } else { - float xScale = float(visibleWidth()) / std::abs(DX); - float yScale = float(visibleHeight()) / std::abs(DY); - scale = qMin(xScale, yScale)/initialScale; - scale = zoom(scale)/initialScale; + float xScale = float(visibleWidth()) / std::abs(dx + 80); + float yScale = float(visibleHeight()) / std::abs(dy + 80); + float scale = qMin(xScale, yScale) / Scale; + zoom(scale); - xShift = scale * (ax1 - 0.5*DX); - yShift = scale * (ay1 - 0.5*DY); - } - xShift -= (0.5*visibleWidth() + contentsX()); - yShift -= (0.5*visibleHeight() + contentsY()); - scrollBy(xShift, yShift); + ViewX1 = x1 - 40; + ViewY1 = y1 - 40; + ViewX2 = x2 + 40; + ViewY2 = y2 + 40; + zx1 = contentsX(); + zy1 = contentsY(); + zx2 = contentsWidth(); + zy2 = contentsHeight(); - releaseKeyboard(); // allow keyboard inputs again + //releaseKeyboard(); // allow keyboard inputs again } // --------------------------------------------------- @@ -2071,7 +2067,6 @@ void Schematic::contentsWheelEvent(QWheelEvent *Event) viewport()->update(); // because QScrollView thinks nothing has changed App->view->drawn = false; } - Event->accept(); // QScrollView must not handle this event } diff --git a/qucs/schematic.h b/qucs/schematic.h index bdcd4c624..01ce20cac 100644 --- a/qucs/schematic.h +++ b/qucs/schematic.h @@ -147,6 +147,7 @@ class Schematic : public Q3ScrollView, public QucsDoc { int GridX, GridY; int ViewX1, ViewY1, ViewX2, ViewY2; // size of the document area int UsedX1, UsedY1, UsedX2, UsedY2; // document area used by elements + int zx1, zy1, zx2, zy2, dx, dy = 0; int showFrame; QString Frame_Text0, Frame_Text1, Frame_Text2, Frame_Text3;