From 92245276fc6ed962760fda765bd3d0b0ea5b5385 Mon Sep 17 00:00:00 2001 From: samhandsome Date: Mon, 17 Feb 2025 14:40:34 +0800 Subject: [PATCH] =?UTF-8?q?[feature]=20=E6=96=B0=E5=A2=9Eavas=5Fwidget?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E6=8E=A7=E5=88=B6=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- data/database.db | Bin 28672 -> 28672 bytes .../__pycache__/db_manager.cpython-313.pyc | Bin 15324 -> 17048 bytes .../avas_controller.cpython-313.pyc | Bin 0 -> 5166 bytes .../__pycache__/avas_widget.cpython-313.pyc | Bin 17430 -> 18888 bytes widgets/avas_controller.py | 77 ++++++++++++++++++ widgets/avas_widget.py | 32 +++++++- 6 files changed, 107 insertions(+), 2 deletions(-) create mode 100644 widgets/__pycache__/avas_controller.cpython-313.pyc create mode 100644 widgets/avas_controller.py diff --git a/data/database.db b/data/database.db index 770824ae4250650b9d3cad5f4a7902334eb9782d..7250b6a8a02fa3ec9ef111a29ee9f823afd2eee8 100644 GIT binary patch delta 152 zcmZp8z}WDBae_3X&qNt#MxTudOZ6k8kt!cnNE(4Uk)_*7z6)R{!jcr k_@DFN=0C@OY_p)j27Z2aW?@F4q3mqTftNGdh^&%I9 diff --git a/database/__pycache__/db_manager.cpython-313.pyc b/database/__pycache__/db_manager.cpython-313.pyc index e502e4db6c3e0f183003a9c3ddecae262182d8f7..d296ef03297c4f51d1386902d8d19f4611035be1 100644 GIT binary patch delta 1157 zcmZ{je`phD7{}i?mrI(&q&b_|q|J{@IFg>0uF@uHO}Y`51SeXH*W$o3Nz*g5NUfJR zNB(IQ3L?(Zy*k(VhZ6>h6Rj3R|I+;Df2%OoEZf9?+9~+Q(H0yNVb6QH__2zW6`0KF=ECcs?1#lku$lTT- z`6b#Kupvn|gn^7ky+*dn6v4Gjp3H{*TX^I{l7U{4*Hw9xHG0@%B$b`r!A`O2+5d#!xuc3w#1Y5O@%7^8md{EnMDp#!fQrTj5BwLX8WGAwD zS?Q=>kSk`O_k~lCIgM1k&E&3d&Sg$`#0kG~p{v3ZyJOiNd}I%*NY|FaPg4C465tNt zw>}=giAo}K7s7Zaj#MI_E$jw2i8Y>Dmj>b zCykUIEI<>sCQHk)$ibA~qU~GE z$#$l^4Fi=hJy-}J2FO~^ZKHC51}>7zy}R)E;`82a+`EAq*w3-*u(R%~O)3Jj0P2BJ u1q=9+ioiVV(#(>y{{?+qqaf|^ugzDW9{r6AA#y$LZyaVZOj0TWME?gycr}Iq delta 138 zcmbQy%6O-o?=vqi7XuJ@%-fWnXF8GZ6QkK=Mn(xn*~wCjsX(%UaXqh0k!&b~En|_K z3WKKH<`kw?W;{jeKs`ljKtfY~a;5#I$)*nOjJBI=9ZVQ`zB6#JIx~I(lapULmT}Do aDq{rVVvWgJPV$1aEQ}y&Fjb@i6bAsYR3SzH diff --git a/widgets/__pycache__/avas_controller.cpython-313.pyc b/widgets/__pycache__/avas_controller.cpython-313.pyc new file mode 100644 index 0000000000000000000000000000000000000000..f11852d0324a6e7696821c90fa617ee37bcc53b0 GIT binary patch literal 5166 zcma)A>vtQ)6`z$>@=99UO04*q*z$uoN{Dg%$RSVgD^NReh}KTh#$;JbYq20p?(8Zd z^o!x}uz3{DNmD`&w1%d|?r9rSIFQ4u(7(XjI9+#7QfP}E{Hbc~9%%cecV;D77B*#$ zJ&!wg?#$kM=Xd97DL>zhpv=$yHnKY(p}&zqx;Rpur5JQBAOQ(X59($x(`~~xKN;J4 z?AE9nq9H2r}8jimJi-4Q+|A5ldg%#YC!e>!Dl#-uC;VGp6*5}h+A)PBAG6wQmoI)X` zdIc}u(2ouz*r|^OZj5nrmnpV`sU|bNdgD zvDdkZCE!J-6U$lx$9h94mmx%|TB_b(0rdhXCP>Mvt6)Z{D|E6yDLd9#6V2?hj?9cX zEIFhO=B@P8y>(WvaiX;A``0;9khoq>33_q}F#PsArgb2}X$0mdBiL4*f&aSfAaSak z^6mFqksh%J*hD1=njd?5;rZ9+-~GksAHA{o>gx-y{%+yoN4GA&ck7vV7DgXS5Yztk z$M0C}OQXF3&hlulqKYFDxUzUgQI)}{Y`UZJkY>?Lw<>GLQ}lc-9*IO{aWJ82@tBzh zQ+@Iynwf7cw`Rj8D-SDxXt)$MREg>RxEyMePc5h1W<`!iXHWXb%EzG^MV|$BUMZU@ zGXfoYpkwy7jxqKH*SKqztC{0?(lfZtI=9*2>UFMulD*=Zav9s&^=<95T*qf=jw+q2 zvN)!F@0Pt;X6)*LzbVJevE#Gc2@qs(59zvZp_#@dAr2gH>B{biR6;e5pz*(0bK& zf*C|JTXb%V!PV$o&BVUz+#OUOt5iTfh^pWfu=Qzl8gRLf>01*#_5rJOKcMxRvwaK^ z6(q89N*dKOmkb1bql`6_oR;DL=9O!}&dSP&^sG$|%mfeehu(TDbgEnIMUsgJJ2Q*_`Xg55~`~ zmesI78V^ZP^&oVtMY}+fN5 zj~~{Xf=1JT-ZWq|oz|O9&+%S^uhRLd36IX-Zt%@I-#p8==92g6{J!h_fn_J!(r~px z-`q8JWR5R0_-#7BZSv0Pp6LTKci%S?I5x`%Ve7^NW1U%2fs$Wt@U=Q$Yw$aCe#cF3 z`?B4ZUy$VJM5WGGUg!N^#}i_5iYEu5Lm+jnX9z`-g7pG)KjT6XCPJW;=x6@&6SrP` zD#zpJpL}carC)#k-m{;-|4uJND`I`T1FCEU#l&mO`W!2)=efJdYO)~!sHZq%hB>d# z@Yd?y+KC?B+nBT?zQOwH?3+Tqn11yo=&bwrA{;p-eZz~;y>PQ)Oh2<$h)Hw#(GkD^ z5Av_~wE1TIBO0xP16ayi7$04DWqe`${QL)_w=O-Aqu|~EYh5Yl87Z2ORntN5H)&)E z(j$5;OlRudoE^4GDWfPwqpPoj`ZY_e$4J~mCFTH26qg&t0lhe26gTR{jejg|8ap({ zZ+zkK_~9S+{=<$+n&F*ba1}aNVQ|$tSACtUrRFhRaE~El6P56)EQCY=YN_L3zYC~x zJx#7*tNzTRFah5?($a6wM6|oWm)XqdPDK2kg`IK=^?P80$Hf}6{Z<4`=ZaZtgPFLs zLOj{hO0*8ePi~8?8l9q9IHBYr3C<96oXW(cAl$axQbW!`Fg2%;T=Nvcd0P52nP~xP zwx#oHKdM54Bj#vxL~K?�SW_9`^QK&09TOXr`N_~OG4ttZgplh5D!@Hc&j66E6+ zfAsPfSFR)~*5sML{N@*L|NQSCTlM7)*Qy_#`k7PT5d%(GZRXHjtw}2NmEt>vomRRo478{&L)?+@n|Sxf-}u**Si6?9iVJH~pmk zv!Y6)rd6+Ly;jr;NuS}X*M0Sq9^Kbs`1b0)y@sz-_jP`JeAd@LS5h%oRQlD8!qO#V zbCuoTOAOxs2i`y7d!y{NvdMdA?i6PGPRyMA?zO(}%?PJvb`Q+*_unWg{cq9%?Eg_o zD0{rErfn!6E?rfGJJ zx02rNq}op^0@}EXR3vnmn;`MlBrv8ZX&P1_dyyd*H}g|zc}NDF5g`JU0W-~4?xvQ* zB)6s&M<$+y>Z_;FUrM%I44wbM4D0)oul!=m`NN|}lB~mV*Th{(1kKf*Uy^3I!0FhZ z^x7SbleI|%&2-%|X_D?DNA+YViJ+MdFOw#@-R{^m-9fl^UF{@XyO!Ooqb|wwjg&MInlwt~cN{3+_87C}DYb!!fNRj%7@+$I{$}l^N?-CDropBI5Pr z=cFy zQ^-0lO#`|8mgx`T5J&(FMe1!(CG8Bue2TW;M1h;=j!#kZr>OcS+Oy1dF-+NuC;o*< HOU3*TqQH!} literal 0 HcmV?d00001 diff --git a/widgets/__pycache__/avas_widget.cpython-313.pyc b/widgets/__pycache__/avas_widget.cpython-313.pyc index a3210e025de1d8ae275ef29641ef5f3f8ee4783d..34bdfaf5ca07fb1696bb08bc05569c9865a097dd 100644 GIT binary patch delta 3161 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 NaJb?#f&TIu{|AQwJa+&9 delta 1976 zcmZWqdu)?c6#s75c3+=+v~+!JYqzy*bz={=!3N#d(ZLupm>b)WA+=jS_h4(sZD9}~ z><=X~{-JmRCSXh^VxkEVZ6YxN4MvF%qM43hs)RxOL;o={H$`KD=X@P9;U@ik=W*{j z=bp#y=fF-*G2`zBgI2(`dhxx%=T{#$TG`d(#nY8mp-|`&?LwDkS6XcvZ4dXu1egUqW>C|N0kX2mm1pLj!|(6TZ(tM6bf@Q2>RN+H+aV1`7UA+BUDIG1H*Rd6M% zY*iUrO&ViTymvSfj!tYJj*m)w6$w>wqLZ4i6pQodK`G1|z?r==s|l4chT!5G5P2i? zWP8{!9L~PXTA|U@XQ?7_=R?~%;9XN`(*#NBwv)nKUcr>|nrP>($a+OyfgeucaQQsN zz*iI05>yjB4mR^TT`7@`1RW4Gm)Tp8lmqgo0&5;NnBvJC8@rM?m6OIGvs#309u<6K zHN)#36C7EoS9B|223ZQS)nL~H6gEq`r7QAv_49WyeP4>BFerzIBu(8PPlB# zV>Y;HYl2ToOwiOIsv}xVLlHDv?COZFThnQSkkVw(c8Oh@dWB24FM(I=o0$i0*mIV= zY2l6?y*n~s!ES=KrSBd`1}i2DFt=W(>`v=UG3On|lsH3QORa?qO*3?M%TbM*>5_t_ zW1DmJ%qttX+N{eM6uic*i!>a!U!COc#B;ePnA(FZ$Aaa1#T8scCTWH{6=n$Muk^1a zosXb_6#95{aBx%#j)x-BC|^e+Z73Y>igPJGFvM$Uqne~D9*SU99q>*5+UzwXu0!x< za=F0k!Qs59mZu>MH=H*0F;vFv@Q<@!bG_6zQ|g-)8xnh53C3Cz&cY6MbO<->ljA=5 z!B($|50FWYkksNV_6)~{`*99qBuGcWcIiO;k%@|v*1Eilmfz+oYGb<*aMIi**WL9q z?)q6*{giT6%=;dGEqWr=Nr^7^H7zR#Z^cHo4#q1g{qm(BTu~)oF{w(W$WK1g9C)S5?zYJ3^-vfg$dJ{nh2_{mAkfc&FM~DQEG% zi)VRgOyYjh(i|k&$iv1b;IHZubtSe)>@<8`R|4B=CQ|n}Ggp)5JVQs{BuFQqcP1%f zJ=@~aSPVVhTVu^VOPUAQ)21r;7D@e3T{n~};{lkiD`rjbMcqBLk57WCA9tL9s!S`~ zt8cBv#$#K(N`8vYJ?JMLItz~T=!i7%XuTxJ@f8}Mrr=$84C^B5;hZlQv-G9!wn9xF z_yu^ssSh0+{q?CxE&_}RK5TyUT)zqMz;1K>|G@W;k35yC*RWNUE zVJi3h7KKJtK5yw|sulBGVL;5!Mer$9Yvx6Zs+av)X;c;dCLqXvB(gDY0pxG`fqe{r zZ^|o`-+o#AwvgIFgPIh5W6|)wQK^yNM3x?%*iIN|^A|2C#~3SoxphIH@51i1ElOmI K7X|vt2L1(OL*gI+ diff --git a/widgets/avas_controller.py b/widgets/avas_controller.py new file mode 100644 index 0000000..2227cea --- /dev/null +++ b/widgets/avas_controller.py @@ -0,0 +1,77 @@ +from PySide6.QtCore import QObject, Signal +from PySide6.QtWidgets import QMessageBox +from database.db_manager import DatabaseManager +from database.models import ProjectData, ConfigData +from typing import Optional, List +from widgets.audio_filter_widget import AudioFilterWidget + +class AVASController(QObject): + # 定义信号 + channel_selected = Signal(int) # 通道选择信号 + panel_toggled = Signal(bool) # 面板切换信号 + + def __init__(self, db_manager: DatabaseManager, view: 'AVAS_WIDGET'): + super().__init__() + self.db_manager = db_manager + self.view = view + self.current_channel: Optional[int] = None + self.filter_windows: dict[int, AudioFilterWidget] = {} # 存储打开的滤波器窗口 + + def toggle_panel(self) -> None: + """切换左侧面板显示状态""" + self.view.is_panel_visible = not self.view.is_panel_visible + self.view.left_panel.setVisible(self.view.is_panel_visible) + # 更新切换按钮文本 + self.view.toggle_button.setText("▶" if self.view.is_panel_visible else "◀") + self.panel_toggled.emit(self.view.is_panel_visible) + + def select_channel(self, channel_num: int) -> None: + """选择通道""" + self.current_channel = channel_num + self.channel_selected.emit(channel_num) + + def show_filter_window(self, channel_num: int) -> None: + """显示滤波器窗口""" + # 如果窗口已存在且可见,则激活它 + if channel_num in self.filter_windows and self.filter_windows[channel_num].isVisible(): + self.filter_windows[channel_num].raise_() + self.filter_windows[channel_num].activateWindow() + else: + # 创建新窗口 + filter_window = AudioFilterWidget(channel_id=channel_num) + filter_window.setWindowTitle(f"Channel {channel_num} Filter Settings") + + # 存储窗口引用 + self.filter_windows[channel_num] = filter_window + + # 监听窗口关闭事件 + filter_window.destroyed.connect( + lambda: self._on_filter_window_closed(channel_num) + ) + + filter_window.show() + + def _on_filter_window_closed(self, channel_num: int) -> None: + """处理滤波器窗口关闭事件""" + if channel_num in self.filter_windows: + del self.filter_windows[channel_num] + + def close_all_filter_windows(self) -> None: + """关闭所有打开的滤波器窗口""" + for window in self.filter_windows.values(): + window.close() + self.filter_windows.clear() + + def load_channel_config(self, channel_num: int, config_id: int) -> bool: + """加载通道配置""" + try: + params, filters = self.db_manager.load_config(config_id) + if params and filters: + # 更新对应通道的滤波器窗口 + if channel_num in self.filter_windows: + self.filter_windows[channel_num].model.load_data(params, filters) + return True + return False + except Exception as e: + QMessageBox.critical(self.view, "错误", f"加载通道配置失败:{str(e)}") + return False \ No newline at end of file diff --git a/widgets/avas_widget.py b/widgets/avas_widget.py index dc74783..2581bf4 100644 --- a/widgets/avas_widget.py +++ b/widgets/avas_widget.py @@ -8,6 +8,7 @@ from widgets.audio_filter_widget import AudioFilterWidget from widgets.project_dialog import AddProjectDialog import sqlite3 from database.db_manager import DatabaseManager # 添加这行导入 +from widgets.avas_controller import AVASController class ChannelButton(QWidget): def __init__(self, channel_num): @@ -126,8 +127,11 @@ class AVAS_WIDGET(QWidget): # 初始化数据库管理器 self.db_manager = DatabaseManager() + # 初始化控制器 + self.controller = AVASController(self.db_manager, self) + self.setWindowTitle("AVAS") - self.is_panel_visible = True # 添加状态标记 + self.is_panel_visible = True self.setup_ui() self.setup_connections() @@ -142,7 +146,7 @@ class AVAS_WIDGET(QWidget): toggle_container = QVBoxLayout() self.toggle_button = QPushButton("◀") # 使用箭头符号 self.toggle_button.setFixedSize(20, 60) - self.toggle_button.clicked.connect(self.toggle_panel) + self.toggle_button.clicked.connect(self.controller.toggle_panel) self.toggle_button.setStyleSheet(""" QPushButton { background-color: #404040; @@ -347,6 +351,14 @@ class AVAS_WIDGET(QWidget): return frame def setup_connections(self): + """设置信号连接""" + # 连接控制器信号 + self.controller.channel_selected.connect(self.on_channel_selected) + self.controller.panel_toggled.connect(self.on_panel_toggled) + + # 连接切换按钮 + self.toggle_button.clicked.connect(self.controller.toggle_panel) + # 假设添加按钮的变量名是 add_btn self.add_btn.clicked.connect(self.add_project) @@ -390,3 +402,19 @@ class AVAS_WIDGET(QWidget): item.setToolTip(project.description) # 显示项目描述为提示 model.appendRow(item) + def on_channel_selected(self, channel_num: int): + """处理通道选择事件""" + # 更新UI显示 + pass + + def on_panel_toggled(self, is_visible: bool): + """处理面板切换事件""" + # 更新UI布局 + self.adjustSize() + + def closeEvent(self, event): + """窗口关闭事件""" + # 关闭所有打开的滤波器窗口 + self.controller.close_all_filter_windows() + super().closeEvent(event) +