From 49397eb6b27147f8871ed3fd6163c80bf2a30608 Mon Sep 17 00:00:00 2001 From: Sam Date: Wed, 26 Feb 2025 14:57:42 +0800 Subject: [PATCH] =?UTF-8?q?[feature]=20=E4=BF=AE=E5=A4=8D=E5=AE=8C?= =?UTF-8?q?=E6=95=B4=E7=9A=84=E6=96=87=E4=BB=B6=E6=8C=81=E4=B9=85=E5=8C=96?= =?UTF-8?q?=E6=A8=A1=E5=9D=97=EF=BC=8C=E4=BF=AE=E5=A4=8Dadd/del=E7=9A=84bu?= =?UTF-8?q?g?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app.py | 8 +- .../__pycache__/__init__.cpython-313.pyc | Bin 157 -> 135 bytes .../application_controller.cpython-313.pyc | Bin 3925 -> 3903 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 283 -> 261 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 308 -> 286 bytes .../ui_widget_card.cpython-313.pyc | Bin 10500 -> 10478 bytes .../__pycache__/widget_card.cpython-313.pyc | Bin 36385 -> 36363 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 170 -> 148 bytes .../ui_widget_channel.cpython-313.pyc | Bin 109054 -> 109032 bytes .../widget_channel.cpython-313.pyc | Bin 6577 -> 6555 bytes .../__pycache__/Ui_widget.cpython-313.pyc | Bin 77779 -> 77757 bytes .../Ui_widget_origin.cpython-313.pyc | Bin 76785 -> 76763 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 169 -> 147 bytes .../audio_filter_componet.cpython-313.pyc | Bin 59280 -> 63340 bytes .../audio_filter_controller.cpython-313.pyc | Bin 28649 -> 35887 bytes .../audio_filter_model.cpython-313.pyc | Bin 12692 -> 12856 bytes .../checkbox_header.cpython-313.pyc | Bin 3367 -> 3345 bytes .../__pycache__/resources.cpython-313.pyc | Bin 2096 -> 2074 bytes .../widget_filter/audio_filter_componet.py | 150 ++++++-- .../widget_filter/audio_filter_config.py | 2 +- .../widget_filter/audio_filter_controller.py | 197 +++++++--- component/widget_filter/audio_filter_model.py | 11 +- .../__pycache__/log_handler.cpython-313.pyc | Bin 2437 -> 2415 bytes .../__pycache__/ui_widget_log.cpython-313.pyc | Bin 4212 -> 4190 bytes .../__pycache__/widget_log.cpython-313.pyc | Bin 5857 -> 5835 bytes .../__pycache__/Ui_widget.cpython-313.pyc | Bin 61912 -> 61890 bytes .../__pycache__/__init__.cpython-313.pyc | Bin 167 -> 145 bytes .../__pycache__/widget_main.cpython-313.pyc | Bin 1206 -> 1184 bytes data/projects/params/aaa_abc.csv | 358 +++++++++++++++--- data/projects/params/aaa_abcd.csv | 287 ++++++++++++-- database/models.py | 2 +- .../__pycache__/__init__.cpython-313.pyc | Bin 157 -> 135 bytes .../__pycache__/data_store.cpython-313.pyc | Bin 19043 -> 19346 bytes .../data_store_manager.cpython-313.pyc | Bin 8281 -> 8259 bytes .../data_store_origin.cpython-313.pyc | Bin 8828 -> 8806 bytes .../__pycache__/models.cpython-313.pyc | Bin 1990 -> 1967 bytes persistence/data_store.py | 24 +- persistence/models.py | 2 +- widgets/audio_filter_widget.py | 4 +- 39 files changed, 860 insertions(+), 185 deletions(-) diff --git a/app.py b/app.py index 84e52d4..e7f12a6 100644 --- a/app.py +++ b/app.py @@ -104,7 +104,11 @@ class MainWindow(QWidget): # 1. 获取当前选中的卡片数据 selected_param_name, selected_project_name = self.widget_card.get_selected_param_name() logger.info(f"selected_param_name: {selected_param_name}, selected_project_name: {selected_project_name}") - + + #to do: 后续需要封装接口 + self.data_manager._store.current_project = selected_project_name + self.data_manager._store.current_paramter_name = selected_param_name + if not selected_param_name or not selected_project_name: logger.warning("未选择参数或项目") return @@ -164,8 +168,6 @@ class MainWindow(QWidget): for project_name in projects: # 从数据管理器获取项目数据 project_data = self.data_manager.get_project(project_name) - #to do:目前支持一个项目 - self.data_manager._store.current_project = project_name if not project_data: logger.warning(f"无法加载项目: {project_name}") continue diff --git a/application/__pycache__/__init__.cpython-313.pyc b/application/__pycache__/__init__.cpython-313.pyc index cce8e1e0b6bb893aa329c6ca417ab7bbe3f22040..7d14cf3348aaa0715b46fc293ea6fc6b052eea63 100644 GIT binary patch delta 38 scmbQs*v`oPnU|M~0SL|?+&z)om|xAqD#o!au{b`svbZEQcVe;?0MnTa6951J delta 60 zcmZo?oXg1lnU|M~0SG3{+clBfSk=bGD#o!au{b`svbZEQHzu(tIU}?hw)(s~E?!#Nzni%HopL+?d3o)VHQyU diff --git a/component/widget_card/__pycache__/ui_widget_card.cpython-313.pyc b/component/widget_card/__pycache__/ui_widget_card.cpython-313.pyc index b7a290c0fe7d4d0b66debdc97da3b46f0c9fb67c..d702ce54346a613e7c0705d425f1672db86c8b77 100644 GIT binary patch delta 41 vcmZn(dKbw3nU|M~0SL|?+`W-|GZVj=hgFPYSz>W~aAk2xYVPL8Op0m%C*KZb delta 63 zcmaDC*b>D3nU|M~0SHpB?%l|}nMu{h#VW?JEU`E~xU#q;H8&=)C^;juBsICDv?x`# RpeQl9Br`d6^I0ZEH2}mL7Wx1H diff --git a/component/widget_card/__pycache__/widget_card.cpython-313.pyc b/component/widget_card/__pycache__/widget_card.cpython-313.pyc index 37edbc6380723234c739cca94bd87fd495001135..9ff3a3be350ce9c29b69bad65d39ccdefe30efa6 100644 GIT binary patch delta 43 xcmZ2DhpBrG6ZdCcUM>b8XiDCb8c<^NJM((++s-7-ZF^*-4#qq(F#U-h^F^NUV8JQ)i$t9&l Usk#M4iOD6I$*G&Svxam40P->zLjV8( diff --git a/component/widget_channel/__pycache__/__init__.cpython-313.pyc b/component/widget_channel/__pycache__/__init__.cpython-313.pyc index 01974309d5b7bfb2cd41f9a4e25aa7ebaff16fac..5afb7158ad691437f3b85283aa39f49333c07b30 100644 GIT binary patch delta 38 scmZ3*IE9h>GcPX}0}yCD-8_-onBUmLD#o!au{b`svbZEQcVeW~aAk2xYHmzoQF2CRNosOQ WX;G?fK~Z9INoI2Dc4c?Qqe%cFpcpIw diff --git a/component/widget_channel/__pycache__/widget_channel.cpython-313.pyc b/component/widget_channel/__pycache__/widget_channel.cpython-313.pyc index 2378d366435ea3884157fab67d9a4c27d10c80f4..54418c6924f635c90985bf4d19f46226daa01590 100644 GIT binary patch delta 40 ucmdmJJlmM-GcPX}0}w=P+Q=2n%5Ujm72{ZzSR5Z*SzMBuySa;1T?7E?mkbL4 delta 62 zcmbPjywRBJGcPX}0}$vR-^dlss_O4z72{ZzSR5Z*SzMBu8kY* delta 68 zcmdmcpXKs>7Ou~{yj%=GpntrPYbzJyR9;n27poY@vc%%};L75X)ZCcFqU4OslGNmq W(xOz|f}+IalFa1P?dy0M`IP`3(-(~Z diff --git a/component/widget_filter/__pycache__/Ui_widget_origin.cpython-313.pyc b/component/widget_filter/__pycache__/Ui_widget_origin.cpython-313.pyc index 9e7e582a8269b63dc26b7873d274eb2a8460e7d2..9d5cf9ad41e0218df6c321a69b5aebd1b1537020 100644 GIT binary patch delta 47 zcmex(o#pm*7Vgiyyj%=G@WF0NBllKrMoDgdD-Wv}$FjuY_~6RolGNPop4^Np6aas5 B4`KiS delta 69 zcmcb8o#o?o7Vgiyyj%=GpnrUCBllKrMoDhf02iwm$FjuY_~6RolGNOo#G>Sk%#zgP XlG377-GZXT6 diff --git a/component/widget_filter/__pycache__/__init__.cpython-313.pyc b/component/widget_filter/__pycache__/__init__.cpython-313.pyc index e4f88846ad71628aeba09af8ed9e8ad0cddaba74..a3637de9ae95e832af9b3feecaf7b91bd2d1b862 100644 GIT binary patch delta 38 scmZ3edm04oe z$|A97rA@T0w2O8N=O{?!9Okt>aP%c}jacl+LZv!EFBq2a;$p|*wXTrj+2|-j9-|P8 ze zgG1>s7V-)-4!Oc4daMwB6+J?tn*`iDVw^BAr&$uBnA<@TCl?~6Zsxh-{s}*BLNqxZ zHzEx{E7cN&Xp}ui{=kgAF%nCnpp!c2rCJiz1j8JIrV3`n zG$9@_T}Z&5iC6VZl6q!L4MK&w2SSsTEH%s*ERymRsg^0EqM!vrnnNk1J5+^oAw!~D ziGpLAFV(VyOysf&3lQys6){^fItzK^f=%Md5$s6M6|xcYgdB$kd*@0m`2!L&k>o<2 zL|Q0OuC_d1YAd*EM7*$2q8ADUjv^FVDAg7TMX0ElW&ml6B--MsTCr4HGF4k_&Y)E) z5td+wr9uhfGGQrVsjy5eYvoFrSf0*V%iw5+UjD=BP5)+wXkz~ZRb_jlMpz)+<#vj0 z*Dc-dtt0SenT?gg#bY{{SFV${_4jl@N_i!_1nuSdYy=LLry%~cJT)(f!dyxO3w;%0 zHWmY>w(U;Q)!BAqcaOVMq>8iGMM45ub7h(<{+iX!W0&bK5(^X>FS(JrNpXT*WY#&t!LB^9T2CvAg`K7ID^)^UCDWNiFwHUqI4iY6DAjk!)ngxGEz z*B6~jNq;QvXxwnYv7}MvOIheGXnIz7UN_eALfgr<@g!IhKCs!r<* zPOb`d-Zr6Maxt6Jn}d0th)R*Mbl6*EG`02hxApdSboR7$INeUGOteaq#Nd&tdiHbp zeU;O6PNVf}ihP=)2~F{&#xzvv(*WGp#K3Wv8MIOA=04@d=ui*jQErTxE>Fvx zk%yaMqhY#LkhjVN8Ev+CTmgy;(Q&6Kp?u7snregFH>JS#tqV+YL2+!s+ z9Mi?g1=gyXzLVfRL^UOOC0r~u!MPD@;w)?W)UE275u&zMH5?gDqQR+9osqS|`5zg~ z>#L`&x1ggpUI=+rm)aTzdzWX}zCF8cyVJcEq1ysmW@D6U(hC zWsh@r{|+}qpG-**-y)UwaJKNg(d$;s&>E8vfu1uT{B?OeMjKOYYED>tf1lgg-Pb7w)a_e4+iyY{fiUvJwr=XI zkOaHJP#MNTSYErt@Eh{PLkQ@InT7t$5?^MCAE34(BQEi<>X6EBviVFlziE-rv}n{d zRyl4e+rQ$yDAUmT;rQ{yLfHF)-R{#Zd`BPWO~@UM7_0Z?E%)Zudd+nc`ua(If?uEM z(`ODxjMn=Wluqc&z+0PdHx9**N2R}$V1H5=jUT(tmtQlUy?i{Ob}(#G8|T+%`LtP2 zE<8~-QZ}J2fk&E+%IMJ*6WTKPTWyoluUY(QCG#}bH7fXM9u7CGQHarKKm4uXh78e2 zQyoDNi{PUDxfzFQ2}QSXqy2(qaRK=)o4h!R9mAhU+E_g(99QTs!{FeE&qvwsdZU zZwe@P_V?_-)1ZoGrG{qZS}F^#rLum)Q1q=-c1bG5*U`MM(N}yeeXAx6i@%k=s*t`n zzFuF+we+o=FciZV*S|C`sA9Q4uHq(NwAy`Ww5VR0Tp3y+1CW7k-$Xszf!Sw_+u%fe>)x$%b zNzPoKCfBbi@o7pXG|MJ6+WYFhU+32(`!vaZ&HqcAC+^02)i>Sz#&k}sBopWENBC)P zZQ1tOi&W#+XZiG5!^IQ&f^W4cI#5IHS2fIbvMy|<;NY5evT0?DC-mRW$w=9XuUEG7 zTFRDA=!?JA$ncsjuKIdqyRW6JWJ13Pf_?Q_`6S?bG*CYD}msvp`n;~^s~dqqRTQqEIb$v zUdO|pNtZ^(YT(123mJG!w`B6{hn|YvzvtO8&w@R-F}5Fmd|MrR%Ja!>`HbBImVtES zUOrI9JaFegGqZcn4*Zcf|Kr0HCcj&&w9{|^((g#)3mBZLiiOR0M6>5S;vHd(@o>9a z&u`{o^XsXqIz}l{52bpota!FpUW1uK{fjUj674ks7)>JEUzI2*1wRv!iplDE5of zxrQ|VkDxK3>@R%!f>h05jl&4tcSjGrMLX;hRJD)05D_z2I27xTNcoS5lpwE-G+>66 zI{z{AQL{g##FtVsIB!yC8mb%DrA^v$PZW<7`)y@DTbbWh?Xy*n+m;VDoz*XxG?<6B zjvMAr+Vf7-jnw(=ODpjMfCq1Cr1KCTCpz8BrNp-*bV^F+rNkOW?W(R$ zx6|zw#gC{XkQ};(Uw!M0fmK6s%KNB!5Vj2sCrK-nP4!F&T6i=DKj=s|gh zQj`=vq>HE#dJjdjKY0cY@ycl0<8(2*^aVC=;x@_P{pRfZcg6F)GC1FC1IrpclR?6f z6ABr=1ftKa&4hEi^>BKJ&eVeGTkFiTE~ZfO78#{^uah$}7Je7T{skJ3btK@6O>A3#-}D=cd-rxsY;eQkz8rzqkEP+w;Nr0b8FQ22oMk=z z?am%o85W$qTRNO&0uJI5B<<%6-agixL4GB^Km@uihtj~)R7J1iTErKr*h(g6ieDlH(~Fmg zM2VRA5Wy+x_5uO5-x^B~2M~NzpK}kj(hHeL;Z8h5)x%VJnMy0DG&5L?F15$4YzVd= zPqJPa@i}5@Lzu~rrp8U@O<)0yn{~mt<71&Q4ya;Nk1Y1Z+QIVJ4eTY)-p8_7(F3Hd zl>`k@DV0jn5FV!LYXsFuo1SjcCcXsk4#z5=$F_hKl^8)gqGJakedOo&@6tikca2gq zU%VrBDzF=2;PGU6DO;<7oX6uMXTp0chm?IA^ziKCabVt|gL99IVLw2zP1Z2+Vd#G% zuJB6sCMQ#*`3iXzRc8)vOK836bPd=flTJNhh&w{73}`Xt#1T>ch;&~>`Y;=hutNNk zW{9rV-~VJhA5=r}lZ7nG)AQsx1v?Fm&vde*;Cbf8baMKD8smW!cg4?W=vUpIpMX+N zDFgV9Co?RCEHWX$(;lmmZUE8}7~wNd4Eu>E>{+=&CuOu6VvHo1N8H&b<4Vp_O`2y# zXj|_fWzu9Dsc9w&w$K+E>`rV5WJ`m6;AAZOgXgJ}1@gqJ*7Hk}BP}JVfZ#Lc^jC;< z4MW68YG@&F!Ln0p)1(1iQ9t$CAXzYFLNYvk%Ems2cTd?BX;~8*i)Y>onFLTuI&~lju!Fe2^OIs5GBS znFLohhvX?%xZ&j_rF3J7f!kj;m?hh#k<$E$%cwU6aWNZ4UryuqgbvBZW;Hy2CX6@A z;qNc63tKdo!hWiAO#ml z2TjeYuu#NzHOM_ne{JMVGYb`npqHlVP(&4-(EXeBOz`~THj^vi2d0z;)ee7t zD>33SN!w0P1IhkEcDJX+|L-#P1BiIrUM>YcN&OXPzB1Eu=l3gKuH<3o+iC2e=b^V3 zG6TIpga#pP2YO4lR>1jp%&pRbNyqfdG|(rIF%T(Tv8KwRE;qfHO z2vh_(W0v>kD=B)qo`#0^R;zy-n+UtSay>l!-li`1X!V$Gw0>l7kkcv>Pp6-Dy;9>{ z)8f5ugLln_SDUk&zNwTem*ruAecRw=h7LggNE~k5z4h*@bzwhzcEQSPc}V#% zwjmlB19GR>wKE`dZr>i-Qj(-!lemL4)sIq1irh5m0l8~y|1BbE2t>F$UGBCmJKXO6 zKG6zyewY)UgLLHLT(83OAATpI_+75M}>a!A%y=j*sHm F{{bT~AZY*q delta 5845 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 TWY1OKVkq+Y-URaIQ0o5yM%VfQ delta 4277 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 diff --git a/component/widget_filter/__pycache__/audio_filter_model.cpython-313.pyc b/component/widget_filter/__pycache__/audio_filter_model.cpython-313.pyc index 5414af263fb88320797e38200b4e5b9c960c85ed..c21dfb3b3a7339c185fa7e8e624975ead6f96171 100644 GIT binary patch delta 2024 zcmZ9NeN0nV6u^65Utd37KPZSGYC%Dy&;m*kluksD8APXa%&&s$+K0eeTJHl4nTu|2 ziDq%u9H-F?*DYBl*^Ia@6Jz3VSz@v+i_9%?O}4my+>Bd-!E9NwKX%Wp6y{6b@7;So z?>+Cl`%VWZLY5he#iU`^Pgig3|Kp0qCD^>1*ZG@<1L{8Ch&rf5pj&v2Ou#*%^Ds5~ zO@3L&to=HlX(fC5WWU*GX1B#}@ymXzM?kGd@>vTs{UWvbvwXJsnmK!)#$)hhp;ayO zz>C^_cACB4=*&);Tl>O;3f&%{fr$FR%9JU&rwl;bo!CB?8$UDf&$jnfFfi0x)t&UCbb z!D#@Ou4vIbfi@+oO1Ou*(8LXUbyZS68>-_F*S)&%u603tPrN-r66J{{x6PH~;#K*I z48Q6Y8m4WAEYq~ckj#}@h+{RnuR;ij8iwE4%`fVKgL<#LmQ7~U+|WNmO5k7p1;LpE zqXzG4zB+1PCMm5tNK@Lrfk7&vhaORf3ON`KsA@zR?2U$KBM@ULi9?xjSwl|Vk=A1^ zcf`EA1&$*v$I9Y0$K7{C$FykDnG(g*8ul2k;g1Q=q;}FbX}GrjF-oWNVc7VHR70<+ zOyU)&gfpfKOi(K~xZ5!E7DPK@D}z&@YjBLVD(G(gnIFzrO%)!QyLZDebH>tMrgMzAse92a?-gG?V1pq5WF-kILg$A zw&E1)l5g6KLqs(+TMy`P6g*|mO@3#6NF=^57krU5N*bWco+tC2@8K?R*j^}Swn+ED zn0+bff?IY6>45w8ugMy?l3ho3!-MRv3idIVloW`?lz|ZKVUyYN^un#2deZgjf}Ny- z8);+FSjy7Fzl07Y5*=1TG=vG!YwSr;Bk+3edJ;_D%4&p~Ez9}Uzt^$WvHj}F`x$^CKHTgKL>Mm<0*OMQVIY`+FCShBj+uQ#u zG}~bSzdOC;%jAmk5|TByEPgyv*j>>|zJWwVjov+#-h0R9Iq!`JF4teGKTFPer)-|v2G2j=+dN=(gY*XaEAWwf6ZsMT zbQh8nV5uxT97HjG%J?_HA4F3q#Jc+ciiZ)eAX*Sz2>ejeee^PpRK!69|I`oRNJ8-A zfag4p)67KW<}$u2lk-RI^@W{thiD)Q7>S@p0gG`)jr-sSViXyCA@7r)(1Z`xjA%4|@SfXsg(mO!&OP^> zbI(2JzS|k)jO?6uI_(DbYm0t6I(*&PXsjFT>4_ zLa{w#5YitAJ*27`ZPp@;h;msTHkTaVW}BNz*3O#zdU6E5E2#Ck%BK5{4c#@DWz05<{o<;O zfxWJ+=dYQTS<`HI*7kMhL)2zmP;UQ|_&^lh0^g4h+Qsw45BJ0kzNc}me#BP90E5R! zvA{fE4YyQNLu*md3Y#4jqy=_6A|wbij`^N#sO~^)N9;g6ix_0^5V`?hCK^K3VhuEG zOHD3lC;Z{8Bpbm|cyenO+HFR3Bd{X02eDWY+Ka&iHQMwA(8Dm%s#bn))t=5PfPqEMC2+UUXlj*crO^n6)R%T;CWo=bQUTMa7 z`Bltu)*#)iq$Uy`OSV#PqQyyEh3uz6NY-v5C(<`+?~|SRD2oC3sq6cGd91zZjpM#+8DQS+$j%gV5@~1n!_fu&$4M1k-hM;$na4Bt+_i!Y9l_ z^Rxb!!QMs-d{uwa!HZ><`|CxP_)G8Kw=tF0Z~2Iv2WI6gU?;C0%X*to>bb zHZ)fhxNQskbEhZ(*L@(oiv9}pH}#S`aH^@A9EWR7)i3WubvJ`9W)Dc0qOkLvKy?c7 zB7$Ed5tQ%)%bu`tlqg~f!S9EcP~sPl6(zprF_Zw&i#UsT4`E~Q(~Brt5SI{_5uYNi zBA!Hif%pUz)wHO2Yn-80Jj|qnI(`Fa(9`y#E91Vbi<- diff --git a/component/widget_filter/__pycache__/checkbox_header.cpython-313.pyc b/component/widget_filter/__pycache__/checkbox_header.cpython-313.pyc index d176b662f53ace1215544f7525f3771252c1f22d..b09ea10c92072287e34d456861abfde8cd596fef 100644 GIT binary patch delta 41 vcmZ23HBpNDGcPX}0}z~O*s_sZhne5f!z#wHEU`E~xU#q;HFt9i^Jz{1`A`h; delta 63 zcmbOzwOoq(GcPX}0}wnsymceD4zsGii&czcSz>W~aAk2xYHmzoQF2CRNosOQX;G?f RK~Z9INoI2DW;f>3oB)<^7B>I@ diff --git a/component/widget_filter/__pycache__/resources.cpython-313.pyc b/component/widget_filter/__pycache__/resources.cpython-313.pyc index 760073ee4b6aa3b01393283af466f50acdc622fd..835b1ae4fa7c5338080521d335e27c07911cd62c 100644 GIT binary patch delta 41 vcmdlWFiU{@GcPX}0}$*m+p>{cosHkv!z#wHEU`E~xU#q;HFtA3+f7CQ?&b`U delta 63 zcmbOwut9+PGcPX}0}wnsymceDI-9Dei&czcSz>W~aAk2xYHmzoQF2CRNosOQX;G?f RK~Z9INoI2DW=FQ0i~y9l7BK(- diff --git a/component/widget_filter/audio_filter_componet.py b/component/widget_filter/audio_filter_componet.py index 6789665..b8cc07d 100644 --- a/component/widget_filter/audio_filter_componet.py +++ b/component/widget_filter/audio_filter_componet.py @@ -17,11 +17,10 @@ sys.path.append(os.path.dirname(os.path.dirname(os.path.dirname(__file__)))) from typing import List, Dict, Optional, Any -from component.widget_filter.Ui_widget_origin import Ui_Widget +from component.widget_filter.Ui_widget import Ui_Widget from component.widget_filter.checkbox_header import SCheckBoxHeaderView from component.widget_filter.audio_filter_model import AudioFilterModel, FilterParams, FilterType # from component.widget_filter.Ui_widget_origin import Ui_Widget -from component.widget_filter.Ui_widget import Ui_Widget import component.widget_filter.resources # from Ui_widget import Ui_Widget @@ -163,6 +162,7 @@ class AudioFilterWidget(QWidget): filter_enabled_changed = Signal(int, bool) # (filter_index, enabled) send_params_clicked = Signal() # 发送参数按钮被点击 get_params_clicked = Signal() # 获取参数按钮被点击 + lineedit_changed = Signal() def __init__(self, parent=None): super().__init__(parent) @@ -395,7 +395,7 @@ class AudioFilterWidget(QWidget): if mix_left_key in params: self.ui.lineEdit_12.setText(str(params[mix_left_key])) - def _parse_filter_params(self, params: Dict[str, Any]) -> Dict[int, Dict[str, Any]]: + def _parse_filter_params_old(self, params: Dict[str, Any]) -> Dict[int, Dict[str, Any]]: """解析滤波器参数""" filter_params = {} for key in params: @@ -413,6 +413,35 @@ class AudioFilterWidget(QWidget): filter_params[filter_num][param_type] = params[key] return filter_params + def _parse_filter_params(self, params: Dict[str, Any]) -> Dict[int, Dict[str, Any]]: + """解析滤波器参数""" + filter_params = {} + for key in params: + # 检查是否是滤波器参数 + if any(key.startswith(prefix) for prefix in [ + f'fc{self.channel_id}_', + f'q{self.channel_id}_', + f'gain{self.channel_id}_', + f'slope{self.channel_id}_', + f'filterType{self.channel_id}_', + f'enable{self.channel_id}_', + f'name{self.channel_id}_' + ]): + filter_num = int(key.split('_')[-1]) + if filter_num not in filter_params: + filter_params[filter_num] = {} + + # 提取参数类型(移除channel_id和filter_num) + if f'enable{self.channel_id}_' in key: + filter_params[filter_num]['enable'] = params[key] + elif f'name{self.channel_id}_' in key: + filter_params[filter_num]['name'] = params[key] + else: + param_type = key.split('_')[0][:-len(str(self.channel_id))] + filter_params[filter_num][param_type] = params[key] + + return filter_params + def _adjust_table_rows(self, required_rows: int): """调整表格行数""" current_rows = self.ui.tableWidget.rowCount() @@ -424,7 +453,8 @@ class AudioFilterWidget(QWidget): # 添加需要的行 while current_rows < required_rows: - self._on_add_filter_clicked() + # self._on_add_filter_clicked() + self._on_add_filter_clicked_no_model_data() current_rows += 1 def _update_filter_params(self, filter_params: Dict[int, Dict[str, Any]]): @@ -436,10 +466,24 @@ class AudioFilterWidget(QWidget): if not self.ui.tableWidget.cellWidget(row, 0): self._create_checkbox(row) + # 更新复选框状态 + container = self.ui.tableWidget.cellWidget(row, 0) + if container and 'enable' in filter_data: + checkbox = container.layout().itemAt(0).widget() + if isinstance(checkbox, QCheckBox): + print(f"filter_data_enable:{filter_data['enable']}") + checkbox.setChecked(filter_data['enable']) + # 更新或创建下拉框 if not self.ui.tableWidget.cellWidget(row, 2): self._create_combobox(row) + # 更新滤波器名称 + if 'name' in filter_data: + name_item = QTableWidgetItem(str(filter_data['name'])) + name_item.setTextAlignment(Qt.AlignCenter) + self.ui.tableWidget.setItem(row, 1, name_item) + # 更新滤波器类型 if 'filterType' in filter_data: combo = self.ui.tableWidget.cellWidget(row, 2) @@ -513,17 +557,17 @@ class AudioFilterWidget(QWidget): ) # 参数输入框变化 - self.ui.lineEdit_11.textChanged.connect( - lambda v: self._on_param_changed('delay', v) + self.ui.lineEdit_11.editingFinished.connect( + lambda : self._on_param_changed('delay') ) - self.ui.lineEdit_10.textChanged.connect( - lambda v: self._on_param_changed('volume', v) + self.ui.lineEdit_10.editingFinished.connect( + lambda : self._on_param_changed('volume') ) - self.ui.lineEdit_13.textChanged.connect( - lambda v: self._on_param_changed('mix_right', v) + self.ui.lineEdit_13.editingFinished.connect( + lambda : self._on_param_changed('mix_right') ) - self.ui.lineEdit_12.textChanged.connect( - lambda v: self._on_param_changed('mix_left', v) + self.ui.lineEdit_12.editingFinished.connect( + lambda : self._on_param_changed('mix_left') ) # 按钮点击 @@ -541,10 +585,10 @@ class AudioFilterWidget(QWidget): """安全地断开所有UI信号连接""" # 断开参数输入框信号 try: - self.ui.lineEdit_11.textChanged.disconnect() - self.ui.lineEdit_10.textChanged.disconnect() - self.ui.lineEdit_13.textChanged.disconnect() - self.ui.lineEdit_12.textChanged.disconnect() + self.ui.lineEdit_11.editingFinished.disconnect() + self.ui.lineEdit_10.editingFinished.disconnect() + self.ui.lineEdit_13.editingFinished.disconnect() + self.ui.lineEdit_12.editingFinished.disconnect() except TypeError: # 信号可能未连接,忽略错误 pass @@ -576,17 +620,17 @@ class AudioFilterWidget(QWidget): def connect_param_signals(self): """重新连接所有UI信号""" # 连接参数输入框信号 - self.ui.lineEdit_11.textChanged.connect( - lambda v: self._on_param_changed('delay', v) + self.ui.lineEdit_11.editingFinished.connect( + lambda: self._on_param_changed('delay') ) - self.ui.lineEdit_10.textChanged.connect( - lambda v: self._on_param_changed('volume', v) + self.ui.lineEdit_10.editingFinished.connect( + lambda: self._on_param_changed('volume') ) - self.ui.lineEdit_13.textChanged.connect( - lambda v: self._on_param_changed('mix_right', v) + self.ui.lineEdit_13.editingFinished.connect( + lambda: self._on_param_changed('mix_right') ) - self.ui.lineEdit_12.textChanged.connect( - lambda v: self._on_param_changed('mix_left', v) + self.ui.lineEdit_12.editingFinished.connect( + lambda: self._on_param_changed('mix_left') ) # 连接滑块信号 @@ -679,7 +723,7 @@ class AudioFilterWidget(QWidget): self.model.update_filter(self.current_filter_index, filter_params) - def _on_param_changed(self, param: str, value: str): + def _on_param_changed(self, param: str): """处理参数值变化""" if hasattr(self, 'model'): try: @@ -687,15 +731,16 @@ class AudioFilterWidget(QWidget): # 更新model中的通道参数 channel_params = self.model.channel_params if param == 'delay': - channel_params.delay = value + channel_params.delay = self.ui.lineEdit_11.text() elif param == 'volume': - channel_params.volume = value + channel_params.volume = self.ui.lineEdit_10.text() elif param == 'mix_right': - channel_params.mix_right = value + channel_params.mix_right = self.ui.lineEdit_13.text() elif param == 'mix_left': - channel_params.mix_left = value + channel_params.mix_left = self.ui.lineEdit_12.text() self.model.set_channel_params(channel_params) + self.lineedit_changed.emit() except ValueError: pass @@ -791,6 +836,38 @@ class AudioFilterWidget(QWidget): self.ui.groupBox_4.setTitle("") self.current_filter_index = -1 + def _on_add_filter_clicked_no_model_data(self): + """处理添加滤波器按钮点击 + ****不更新model中的数据 + """ + # 增加行 + row = self.ui.tableWidget.rowCount() + self.ui.tableWidget.setRowCount(row + 1) + self.filter_count += 1 + + # 创建类型选择下拉框 + combo = QComboBox() + combo.addItems(self.filter_types) + combo.currentTextChanged.connect(lambda text: self._on_filter_type_changed(row, text)) + self.ui.tableWidget.setCellWidget(row, 2, combo) + + # 创建新的滤波器项,使用唯一的默认名称 + filter_data = { + 'filter_name': f"Filter_{row}", # 使用行号创建唯一名称 + 'filter_type': self.filter_types[0], + 'enable': True, + 'freq': 0, + 'q': 0, + 'gain': 0, + 'slope': 0 + } + + # 更新表格 + self._update_table_row(row, filter_data) + + # 发送信号 + # self.filter_added.emit(self.filter_types[0]) + def _on_add_filter_clicked(self): """处理添加滤波器按钮点击 同时更新model中的数据 @@ -810,7 +887,7 @@ class AudioFilterWidget(QWidget): filter_data = { 'filter_name': f"Filter_{row}", # 使用行号创建唯一名称 'filter_type': self.filter_types[0], - 'enabled': True, + 'enable': True, 'freq': 0, 'q': 0, 'gain': 0, @@ -828,12 +905,12 @@ class AudioFilterWidget(QWidget): q_value=float(filter_data['q']), gain=float(filter_data['gain']), slope=float(filter_data['slope']), - enabled=filter_data['enabled'] + enable=filter_data['enable'] ) self.model.add_filter(filter_params) print(f"_on_add_filter_clicked:{self.model.filters}") - + # 发送信号 self.filter_added.emit(self.filter_types[0]) @@ -851,10 +928,11 @@ class AudioFilterWidget(QWidget): def _on_delete_filter_clicked(self): """处理删除滤波器按钮点击""" if self.current_filter_index >= 0: + self.filter_deleted.emit(self.current_filter_index) self.ui.tableWidget.removeRow(self.current_filter_index) self.filter_count -= 1 - self.filter_deleted.emit(self.current_filter_index) - + + # 重置当前选择 if self.filter_count == 0: self.current_filter_index = -1 @@ -940,7 +1018,7 @@ class AudioFilterWidget(QWidget): if hasattr(self, 'model'): # 更新model中的滤波器启用状态 filter_params = self.model.filters[row] - filter_params.enabled = checked + filter_params.enable = checked self.model.update_filter(row, filter_params) self.filter_enabled_changed.emit(row, checked) @@ -973,7 +1051,7 @@ class AudioFilterWidget(QWidget): layout.setContentsMargins(0, 0, 0, 0) layout.setAlignment(Qt.AlignCenter) checkbox = QCheckBox() - checkbox.setChecked(data.get('enabled', True)) + checkbox.setChecked(data.get('enable', True)) # 添加复选框样式 checkbox_style = """ diff --git a/component/widget_filter/audio_filter_config.py b/component/widget_filter/audio_filter_config.py index 385c1cf..60cb84f 100644 --- a/component/widget_filter/audio_filter_config.py +++ b/component/widget_filter/audio_filter_config.py @@ -11,7 +11,7 @@ class FilterPreset: q: float gain: float slope: float - enabled: bool = True + enable: bool = True class AudioFilterConfig: def __init__(self, config_path: str = None): diff --git a/component/widget_filter/audio_filter_controller.py b/component/widget_filter/audio_filter_controller.py index 7994708..e932cdb 100644 --- a/component/widget_filter/audio_filter_controller.py +++ b/component/widget_filter/audio_filter_controller.py @@ -3,7 +3,7 @@ from PySide6.QtCore import QTimer from typing import Dict, Any, Optional from dataclasses import dataclass from enum import Enum, auto - +import csv import sys import time import os @@ -130,13 +130,15 @@ class AudioFilterController(QObject): # 如果是整数值 elif isinstance(filter_data['filterType'], int): filter_type = FilterType(filter_data['filterType']) - + filter_params = FilterParams( filter_type=filter_type, frequency=filter_data.get('frequency', 0.0) or filter_data.get('fc', 0.0), q_value=filter_data.get('q', 0.0), gain=filter_data.get('gain', 0.0), - slope=filter_data.get('slope', 0.0) + slope=filter_data.get('slope', 0.0), + enable = filter_data.get('enable', True), + name = filter_data.get('name', None) ) self.model.filters.append(filter_params) @@ -179,10 +181,11 @@ class AudioFilterController(QObject): # pass # to do:后续看情况调整是否需要单独下发调整的滤波器数据 self.widget.filter_changed.connect(self._on_widget_filter_changed) + self.widget.lineedit_changed.connect(self._on_lineedit_changed) # self.widget.param_changed.connect(self._on_widget_param_changed) - # self.widget.filter_added.connect(self._on_widget_filter_added) - # self.widget.filter_deleted.connect(self._on_widget_filter_deleted) - # self.widget.filter_enabled_changed.connect(self._on_widget_filter_enabled_changed) + self.widget.filter_added.connect(self._on_widget_filter_added) + self.widget.filter_deleted.connect(self._on_widget_filter_deleted) + self.widget.filter_enabled_changed.connect(self._on_widget_filter_enabled_changed) def _convert_struct_data_to_model(self, struct_data: Dict[str, Any]) -> Dict[str, Any]: @@ -332,27 +335,47 @@ class AudioFilterController(QObject): try: self.state = AudioControllerState.UPDATING params = self.model.get_all_data() - struct_params = self._convert_model_data_to_struct(params) # 准备所有参数 - channel_id = self.model.channel_id + channel_id = params['channel_id'] all_params = {} # 1. 添加基础参数 base_params = { f'tuning_parameters.mix_parameters[{channel_id}].ch_n': channel_id + 1, - f'tuning_parameters.mix_parameters[{channel_id}].mix_left_data': struct_params[f'tuning_parameters.mix_parameters[{channel_id}].mix_left_data'], - f'tuning_parameters.mix_parameters[{channel_id}].mix_right_data': struct_params[f'tuning_parameters.mix_parameters[{channel_id}].mix_right_data'], + f'tuning_parameters.mix_parameters[{channel_id}].mix_left_data': params['channel_params']['mix_left'], + f'tuning_parameters.mix_parameters[{channel_id}].mix_right_data': params['channel_params']['mix_right'], f'tuning_parameters.delay_parameters[{channel_id}].ch_n': channel_id + 1, - f'tuning_parameters.delay_parameters[{channel_id}].delay_data': struct_params[f'tuning_parameters.delay_parameters[{channel_id}].delay_data'], + f'tuning_parameters.delay_parameters[{channel_id}].delay_data': params['channel_params']['delay'], f'tuning_parameters.volume_parameters[{channel_id}].ch_n': channel_id + 1, - f'tuning_parameters.volume_parameters[{channel_id}].vol_data': struct_params[f'tuning_parameters.volume_parameters[{channel_id}].vol_data'] + f'tuning_parameters.volume_parameters[{channel_id}].vol_data': params['channel_params']['volume'] } all_params.update(base_params) - # 2. 添加所有滤波器参数 - filter_params = {k: v for k, v in struct_params.items() if 'eq_parameters' in k} - all_params.update(filter_params) + # 2. 添加所有滤波器参数(包括未使用的滤波器位置) + base_idx = channel_id * 20 + for i in range(20): # 每个通道固定20个滤波器位置 + idx = base_idx + i + + # 如果有滤波器数据且enable为True就使用,否则用默认值0 + if i < len(params['filters']) and params['filters'][i]['enable']: + filter_data = params['filters'][i] + all_params.update({ + f'tuning_parameters.eq_parameters[{idx}].fc': filter_data['frequency'], + f'tuning_parameters.eq_parameters[{idx}].q': filter_data['q_value'], + f'tuning_parameters.eq_parameters[{idx}].gain': filter_data['gain'], + f'tuning_parameters.eq_parameters[{idx}].slope': filter_data['slope'], + f'tuning_parameters.eq_parameters[{idx}].filterType': filter_data['filter_type'].value + }) + else: + # 未使用或禁用的滤波器位置填充默认值0 + all_params.update({ + f'tuning_parameters.eq_parameters[{idx}].fc': 0.0, + f'tuning_parameters.eq_parameters[{idx}].q': 0.0, + f'tuning_parameters.eq_parameters[{idx}].gain': 0.0, + f'tuning_parameters.eq_parameters[{idx}].slope': 0.0, + f'tuning_parameters.eq_parameters[{idx}].filterType': 0 + }) # 3. 一次性发送所有参数 ServiceManager.instance().params_service.set_params( @@ -454,6 +477,10 @@ class AudioFilterController(QObject): ######################################################################################### + #line Edit 信号处理器 + def _on_lineedit_changed(self): + self._sync_to_csv() + # Widget信号处理器 def _on_widget_filter_changed(self, index: int, param_name: str, value: float): """处理widget滤波器参数变化""" @@ -481,7 +508,6 @@ class AudioFilterController(QObject): current_project = data_store_manager.current_project current_param = data_store_manager.current_param - # 如果仍然没有当前项目或参数,则不进行同步 if not current_project or not current_param: return @@ -507,15 +533,90 @@ class AudioFilterController(QObject): 'q': filter_param['q_value'], 'gain': filter_param['gain'], 'slope': filter_param['slope'], - 'filterType': filter_param['filter_type'].value + 'filterType': filter_param['filter_type'].value, + 'enable': filter_param['enable'], + 'name': filter_param['name'] } channel_data[channel_id]['filters'].append(filter_data) - # 保存到CSV文件 - data_store_manager.save_param(current_project, current_param, channel_data) + # 保存到CSV文件 os.path.join(self.storage_dir, "params") + # storage_dir/"current_project"_"current_paramter_name".csv + current_paramter_name = data_store_manager._store.current_paramter_name + path = os.path.join(data_store_manager._store.storage_dir, "params") + csv_path = os.path.join(path, f"{current_project}_{current_paramter_name}.csv") + self.save_param_to_csv(csv_path, channel_data) + # data_store_manager.save_param(current_project, current_param, channel_data) except Exception as e: self.error_occurred.emit(f"同步到CSV文件时发生错误: {str(e)}") + + # to do:后续该接口需要放入data_store_manager中 + def save_param_to_csv(self, csv_path, channel_data): + """保存参数到CSV文件""" + try: + # 读取现有CSV数据 + param_data = {} + with open(csv_path, 'r', newline='') as csvfile: + reader = csv.DictReader(csvfile) + for row in reader: + param_data[row['parameter']] = row['value'] + + # 获取当前通道ID + channel_id = self.model.channel_id + + param_data[f'dataset.tuning_parameters.mix_parameters[{channel_id}].mix_left_data'] = str(channel_data[channel_id]['mix_left_data']) + param_data[f'dataset.tuning_parameters.mix_parameters[{channel_id}].mix_right_data'] = str(channel_data[channel_id]['mix_right_data']) + + param_data[f'dataset.tuning_parameters.delay_parameters[{channel_id}].delay_data'] = str(channel_data[channel_id]['delay_data']) + + param_data[f'dataset.tuning_parameters.volume_parameters[{channel_id}].vol_data'] = str(channel_data[channel_id]['vol_data']) + + base_idx = channel_id * 20 # 每个通道20个均衡器 + + # 如果没有滤波器数据,将所有20个滤波器位置都设置为0 + if not channel_data[channel_id]['filters']: + for i in range(20): + idx = base_idx + i + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].fc'] = '0' + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].q'] = '0' + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].gain'] = '0' + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].slope'] = '0' + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].filterType'] = '0' + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].enable'] = 'false' + else: + # 有滤波器数据时的原有逻辑 + for i, filter_data in enumerate(channel_data[channel_id]['filters']): + idx = base_idx + i + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].fc'] = str(filter_data['fc']) + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].q'] = str(filter_data['q']) + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].gain'] = str(filter_data['gain']) + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].slope'] = str(filter_data['slope']) + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].filterType'] = str(filter_data['filterType']) + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].enable'] = str(filter_data['enable']) + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].name'] = str(filter_data['name']) + + # 将剩余未使用的滤波器位置设置为0 + for i in range(len(channel_data[channel_id]['filters']), 20): + idx = base_idx + i + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].fc'] = '0' + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].q'] = '0' + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].gain'] = '0' + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].slope'] = '0' + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].filterType'] = '0' + param_data[f'dataset.tuning_parameters.eq_parameters[{idx}].enable'] = 'false' + + # 将更新后的数据写回CSV文件 + with open(csv_path, 'w', newline='') as csvfile: + writer = csv.DictWriter(csvfile, fieldnames=['parameter', 'value']) + writer.writeheader() + for parameter, value in param_data.items(): + writer.writerow({'parameter': parameter, 'value': value}) + + except Exception as e: + print(f"保存参数到CSV文件时发生错误: {str(e)}") + self.error_occurred.emit(f"保存参数到CSV文件时发生错误: {str(e)}") + + # def _on_widget_param_changed(self, param_name: str, value: float): # """处理widget通道参数变化""" @@ -527,36 +628,38 @@ class AudioFilterController(QObject): # except Exception as e: # self.error_occurred.emit(f"Error updating channel params: {str(e)}") - # def _on_widget_filter_added(self, filter_type: str): - # """处理widget添加滤波器""" - # try: - # filter_params = FilterParams( - # filter_type=FilterType[filter_type], - # frequency=0.0, - # q_value=0.0, - # gain=0.0, - # slope=0.0 - # ) - # self.model.add_filter(filter_params) - # except Exception as e: - # self.error_occurred.emit(f"Error adding filter: {str(e)}") + def _on_widget_filter_added(self, filter_type: str): + """处理widget添加滤波器""" + try: + filter_params = FilterParams( + filter_type=FilterType[filter_type], + frequency=0.0, + q_value=0.0, + gain=0.0, + slope=0.0 + ) + self.model.add_filter(filter_params) + except Exception as e: + self.error_occurred.emit(f"Error adding filter: {str(e)}") - # def _on_widget_filter_deleted(self, index: int): - # """处理widget删除滤波器""" - # try: - # self.model.remove_filter(index) - # except Exception as e: - # self.error_occurred.emit(f"Error removing filter: {str(e)}") + def _on_widget_filter_deleted(self, index: int): + """处理widget删除滤波器""" + try: + self.model.remove_filter(index) + self._sync_to_csv() + except Exception as e: + self.error_occurred.emit(f"Error removing filter: {str(e)}") - # def _on_widget_filter_enabled_changed(self, index: int, enabled: bool): - # """处理widget滤波器启用状态变化""" - # try: - # filter_params = self.model.get_filter(index) - # if filter_params: - # filter_params.enabled = enabled - # self.model.update_filter(index, filter_params) - # except Exception as e: - # self.error_occurred.emit(f"Error updating filter state: {str(e)}") + def _on_widget_filter_enabled_changed(self, index: int, enabled: bool): + """处理widget滤波器启用状态变化""" + try: + filter_params = self.model.get_filter(index) + if filter_params: + filter_params.enabled = enabled + self.model.update_filter(index, filter_params) + self._sync_to_csv() + except Exception as e: + self.error_occurred.emit(f"Error updating filter state: {str(e)}") ########################################################################################## diff --git a/component/widget_filter/audio_filter_model.py b/component/widget_filter/audio_filter_model.py index ca3a106..cb170c8 100644 --- a/component/widget_filter/audio_filter_model.py +++ b/component/widget_filter/audio_filter_model.py @@ -18,7 +18,8 @@ class FilterParams: q_value: float gain: float slope: float - enabled: bool = True + enable: bool = True + name: Optional[str] = None def to_dict(self, channel_id: int, filter_num: int) -> Dict[str, Any]: """转换为与组件兼容的字典格式""" @@ -27,7 +28,9 @@ class FilterParams: f'fc{channel_id}_{filter_num}': self.frequency, f'q{channel_id}_{filter_num}': self.q_value, f'gain{channel_id}_{filter_num}': self.gain, - f'slope{channel_id}_{filter_num}': self.slope + f'slope{channel_id}_{filter_num}': self.slope, + f'enable{channel_id}_{filter_num}': self.enable, + f'name{channel_id}_{filter_num}': self.name } @classmethod @@ -200,12 +203,12 @@ class AudioFilterModel(QObject): def is_filter_enabled(self, index: int) -> bool: """检查指定滤波器是否启用""" if 0 <= index < len(self.filters): - return self.filters[index].enabled + return self.filters[index].enable return False def get_enabled_filters(self) -> List[FilterParams]: """获取所有启用的滤波器""" - return [f for f in self.filters if f.enabled] + return [f for f in self.filters if f.enable] def get_widget_params(self) -> Dict[str, Any]: """获取用于widget的参数格式(与to_widget_params相同)""" diff --git a/component/widget_log/__pycache__/log_handler.cpython-313.pyc b/component/widget_log/__pycache__/log_handler.cpython-313.pyc index f87d8e4d18941c31e5f251ca6eb98bcfc2db5434..4242896023653d842a1c3daddaefcad6da6ab5f8 100644 GIT binary patch delta 41 vcmZn_elNuRnU|M~0SL|?+`W-|CnLX+hgFPYSz>W~aAk2xYVPKjjC0rl77Y$d delta 63 zcmaDa)GEyVnU|M~0SLCf-L;W>C!?x|i&czcSz>W~aAk2xYHmzoQF2CRNosOQX;G?f RK~Z9INoI2D=F5z8*a5p=7exR7 diff --git a/component/widget_log/__pycache__/ui_widget_log.cpython-313.pyc b/component/widget_log/__pycache__/ui_widget_log.cpython-313.pyc index 259fa81b2ab35989e263e73dd38f3b4f2dc7e81c..2bde4ef5c4e68e2a1f484cd4c00ecdd7c4fed0ad 100644 GIT binary patch delta 41 vcmeyOa8H5zGcPX}0}z})xO*eFDF?rahgFPYSz>W~aAk2xYVPJ#4t@>*8!HV! delta 63 zcmcbo@I`_9GcPX}0}$+dxoac0DTk_;i&czcSz>W~aAk2xYHmzoQF2CRNosOQX;G?f RK~Z9INoI2DW`7QT4gkMb7CHa` diff --git a/component/widget_log/__pycache__/widget_log.cpython-313.pyc b/component/widget_log/__pycache__/widget_log.cpython-313.pyc index 9bff25755a4633748e92e9ca1d5e0ec9c2a34901..7a43192ef7506d72eba5c13f81c08e314e8cbf83 100644 GIT binary patch delta 41 wcmaE;ds>(KGcPX}0}z})xO*e_88&`H533l*vc%%};L75X)ZEQ~*q-tO04ie-H~;_u delta 63 zcmX@D`%strGcPX}0}$+dziT7+88%gS7poY@vc%%};L75X)ZCcFqU4OslGNmq(xOz| Sf}+IalFa1P&Cl4L@&f?dIT$zq diff --git a/component/widget_main/__pycache__/Ui_widget.cpython-313.pyc b/component/widget_main/__pycache__/Ui_widget.cpython-313.pyc index 7fe80db50968ec345c8f866627d970f94bbaea02..61e8ef32b9032ba00c14fb8a64c2ace177eb6363 100644 GIT binary patch delta 42 xcmccdnEB9SX0Fe?yj%=Guxs5$F8gQvh8|Wij%A6(@xhhFC8@ca^PXjK0{~5&57__! delta 64 zcmX@~nEA$IX0Fe?yj%=GpnrTLm;EzUcNeP|$FjuY_~6RolGNOo#G>Sk%#zgPlG377 S-GZXT-v9sr delta 60 zcmbQpxSWyuGcPX}0}wnsymcbCv8tPkRg7aF2Moq`joqx*w>lylIGDBf;?7y1 zA+<kLer@T{7^PY=J$N!oqlvUe2b0l+#tvJXiW>VvN1q;#>Vx4I z^t6^>7p+@r16-w{{8;Wl+(2lu$F}M+PjX`X8NM#A9G@U}KJ~$ks zx`iM3{nW!J>Sl^uLtLy`9w%k&J^4ywIgY)6N-eon2LEGg9n!~X9p9<86+Ws$LKP&~IQaRX9#)jsMyl9TdA+2}_+j21BDaBR z9ZTo`q4?pGR2+7)fdW7AuvCFcYK@r!)tdhVh}Q$!*k?s&N;|Q9Qb+)F077iExMJTX zEH?wTa8Q-idUfMUJhPRr%mQJp!J$-gBzBBG#gBA_1C++#ir*~mB3(w2>jS56FL?KH zP>JariD~g+I8Gl>^Jxpqc%RAnh_FF7>+oqjFlKyp&1YbUF-~@EVaPeFN33h4u&=|KbVXbdg4m1l zs7Vf0@3D)4LZ7t!6K_Za(mBenFoBgaJnY5x{=HLBIjP2w)U&3=jjH02~J#0(=K>6mXci+nT4S z#@Ca|v#nY(`g~k7ZD~5DnR0eFDL>naV5i7LRi>0rrZtvKoAwbNIh+)NzKc_PJT;+F zwIu5!;S}M5Q@E6eMh8!5FVL5VEVLgyzk9YI z<7ruvC4WD;M&|Wvjn^x}=beis6|?0FCC!V0C+8+Jf$lE?{h2`jLSWamkxXDe=Tb5r z^;Sjid~`m1O}_5kdtO;A@xD3vd5OB%6r4MhY1+z(|JU64YX0q8sfG|2uN>X<@Au1Zj(St2#A zt+WsNA*V8(I-SoE$1Zjn;@zJ{2Cy#R^}_eLwK5}?Bz`@ zIKPF4*SPYS8t!4y)$#+_A96V_WIoI3zzw0e6!lzJdU#~9?x)F?jUX0(6@BuXe^sqH zn!bf6P};ak*}UmuuI-KFXDqZmDwjddR`%}p`}uJ!8Q?YcPH$bmP!K(XzQKW)|FOhL zQ;zDxv7xkT&v`+#1mVjWPN<`*Eq@=(Ay&{=M+~;U@2FzS#)XT$+E+so>~i0xDIGMW z05?E93J00C=ToUT-G)PGPd@wv~R#8g@0ik}}ytzLLZwwEG|A!eP?@ delta 2411 zcma)-YfKbZ6oBXM4zmj^xIA28S#UuX8G&UHq@aLB+_J%fRw~p=x|!|{u(%I;XTYjW zP?Hj)Y149Rv`J}L{NrazkAb9Zr(@T2qN zyXU^nJ@=e*&rBRe*Iz@K_cAilIQlKSe|F$>`v;lR2J|?&W~d^DHXCWlG^aYb0Zv3+ zB2P9L%gC5fbhT_;+t)fODgN%=iYiC?BpetFsd7La!E)6wmI7)hAd^pw&5ly4cprDA zplrsRcg4N>AU|VvT&eUxYuEDlTc{|TuF%tlB`if0e=vj<108TWaSm;87FjNoAS>A* zj3OKPOgLAb55smqAs~a|qyd8x?4)?Go18G!B0ITcs-hct^B=W&bXG_He|UF58O30i z$S3#Vayo#EKm$+Vq#w>9WvSJui1eg-kxhFe^%fG`uquxnPXE^W;7H5{>xgV|q8u`A z5zz|mltnbAdth-5z)fx}8DCll;u@v_uo}=v#;k=~)`GYW&_p4c7uwYdQ|y>#D(M#H zEq@>u?GFv$7CNMuDZps>sNuJ*ji^B@%X&A>(FJ=qQ;0}U>krA{U{s38N|%_9E6L4* zt@AFze9%fd95UKYPB~mCMlLxj1r`Y(F&7r2UTsyO!du|(3W6i)StpAdbANz=REmAv zteLZBA56tIa=*B{=nx$f6Y+stJctjKbvt>f#7_2?l;zIARARr7*sq-_xqy63K{_s@ z3ve>_1<)M<9sH0Ii|TwhCIxXlj50TZs<M0qXvUiJ zhN_=)JU2YGA9+7rHRYdPyX|6K&qYt~E1Qm6W^$|UcoCQFnDrsf>iEfAfNk35x=w^v zkjXW!UWlY_3WpSx)+1J8bh8`{D!W4JATxYnlEn*&ZcgNjqVxTsupG~{dF3R(zJk6W zZ~ZmoW$DJl5ttPwo?cj4TrI0>IGMWh6b?14L;-E0;eas#jJa~*m!GF`Ro*0|O{71L zvu&-Y8P;NU-x`n}zOQJU=gimP7$XHWE1ud7WSzGhoghK4B-mhgGx^SYFMTJ7697WK zdCcWwMnX-*M<{eYI1(Aw1xX2p0xErm*)Zb-uvB6(J4U-o3Pr*NFxyD#+g<1+>1*#Z z8nKm3wU?kUx!%5R48wFT0N!D|Btv|3{@GY8jMu{;7>?fpbO3yS!xVZ(+n^MU%Hg*7 zPwQov0Pn|(HuKDJ=uQG4#qnvt8NfNfS1jVpj}6doB=7qQY7T+OoRR}l`Wzr-mCK0Z z#<@ENK4r!6w!b*q+_h+b`<9{Qy(q8Hes0O1tUrql#N9EmjA;dh sVg?=sy(}q?kjovi{o!MEb5kT190|)U_!rW%sUj;VpiXp`V-2(JKM+I?NB{r; diff --git a/persistence/__pycache__/data_store_manager.cpython-313.pyc b/persistence/__pycache__/data_store_manager.cpython-313.pyc index e9eeb01eacd7df810a04ba9da581d3dbc6c656b7..8661650222835d7343a9172fe45f39ae9b00cc45 100644 GIT binary patch delta 41 vcmccVaM*$SGcPX}0}wPN@7u_2!oqLhVHM+8mRKAgTv=R_n!7oL<*PIR3xf@f delta 63 zcmX@?aMOYNGcPX}0}yPzyLThE35%+mi&czcSz>W~aAk2xYHmzoQF2CRNosOQX;G?f RK~Z9INoI2DWGcPX}0}$NYzAv43Bkuu5cDB^K#H5_m$yXU$_*FctVjRm7i{pbUi%U{- nC)Y8#vG54A`D{MHG=oJz@B;%Iqu^&|1}5$gOhDG;0`@Qfk{ub; delta 108 zcmZ3_e~h2^GcPX}0}!k`u{WJ>Bkuu54))Z%#H5_ml*v~ZTU4!FtYRF?5{u)5D~n4~ zb7K;Vk~1<(Qj<$ci&Aw9iV~AcGLus$r!%>+@Cvs1Zr;c=gGE5-0|OhQ&}U`_ChiYR KK-T0)_Amg%;3D4u diff --git a/persistence/data_store.py b/persistence/data_store.py index bcfb0cf..24ca0dd 100644 --- a/persistence/data_store.py +++ b/persistence/data_store.py @@ -11,6 +11,7 @@ class DataStore: self.storage_dir = storage_dir self.current_project: Optional[str] = None self.current_param: Optional[str] = None + self.current_paramter_name: Optional[str] = None self._ensure_storage_dir() def _ensure_storage_dir(self): @@ -256,7 +257,7 @@ class DataStore: channel_data = {} # 处理混音参数 - # to do:后续处理这个6 + # to do: 后续处理这个6 for i in range(6): # 假设最多6个通道 ch_key = f'dataset.tuning_parameters.mix_parameters[{i}].ch_n' if ch_key in param_data: @@ -265,17 +266,17 @@ class DataStore: if channel_id not in channel_data: channel_data[channel_id] = {'filters': []} - # 左混音 + left_key = f'dataset.tuning_parameters.mix_parameters[{i}].mix_left_data' if left_key in param_data: channel_data[channel_id]['mix_left_data'] = float(param_data[left_key]) - # 右混音 + right_key = f'dataset.tuning_parameters.mix_parameters[{i}].mix_right_data' if right_key in param_data: channel_data[channel_id]['mix_right_data'] = float(param_data[right_key]) - # 处理延迟参数 + for i in range(6): ch_key = f'dataset.tuning_parameters.delay_parameters[{i}].ch_n' if ch_key in param_data: @@ -288,7 +289,7 @@ class DataStore: if delay_key in param_data: channel_data[channel_id]['delay_data'] = float(param_data[delay_key]) - # 处理音量参数 + for i in range(6): ch_key = f'dataset.tuning_parameters.volume_parameters[{i}].ch_n' if ch_key in param_data: @@ -301,8 +302,8 @@ class DataStore: if vol_key in param_data: channel_data[channel_id]['vol_data'] = float(param_data[vol_key]) - # 处理滤波器参数 - for i in range(120): # 最多120个滤波器 + + for i in range(120): # 最多120个滤波器 fc_key = f'dataset.tuning_parameters.eq_parameters[{i}].fc' if fc_key in param_data: # 确定该滤波器属于哪个通道 @@ -337,6 +338,15 @@ class DataStore: if filter_type_key in param_data: # 先转为浮点数再转为整数 filter_data['filterType'] = int(float(param_data[filter_type_key])) + + # 添加enable和name参数 + enable_key = f'dataset.tuning_parameters.eq_parameters[{i}].enable' + if enable_key in param_data: + filter_data['enable'] = param_data[enable_key].lower() == 'true' + + name_key = f'dataset.tuning_parameters.eq_parameters[{i}].name' + if name_key in param_data: + filter_data['name'] = param_data[name_key] return channel_data diff --git a/persistence/models.py b/persistence/models.py index a08c90e..e5ce8f8 100644 --- a/persistence/models.py +++ b/persistence/models.py @@ -9,7 +9,7 @@ class FilterConfig: q: float gain: float slope: int - enabled: bool + enable: bool diff --git a/widgets/audio_filter_widget.py b/widgets/audio_filter_widget.py index 2807952..8045700 100644 --- a/widgets/audio_filter_widget.py +++ b/widgets/audio_filter_widget.py @@ -201,7 +201,7 @@ class AudioFilterController: position=len(self.model.filters), config_id=self.model.current_config_id, channel_id=self.model.current_channel_id, - enabled=True, + enable=True, id=None # 初始创建时 id 为 None ) @@ -283,7 +283,7 @@ class AudioFilterWidget(QWidget): # 创建带复选框的滤波器名称项 filter_item = QTableWidgetItem() filter_item.setFlags(filter_item.flags() | Qt.ItemFlag.ItemIsUserCheckable) - filter_item.setCheckState(Qt.CheckState.Checked if filter_data.enabled else Qt.CheckState.Unchecked) + filter_item.setCheckState(Qt.CheckState.Checked if filter_data.enable else Qt.CheckState.Unchecked) filter_item.setText(str(filter_data.filter_type)) # 设置文本,这样文本会和复选框一起显示 # 更新各列的值