11from qtsymbols import *
22import functools , uuid , os , qtawesome , time
3- from datetime import datetime , timedelta
3+ from datetime import datetime , timedelta , date
4+ from datetime import time as dttime
45from traceback import print_exc
56import gobject , NativeUtils
67import copy
@@ -333,6 +334,7 @@ def selectexe(self, res):
333334
334335 def __init__ (self , parent , gameuid , keepindexobject = None ) -> None :
335336 super ().__init__ (parent )
337+ self .__quanju_wc = False
336338 self .keepindexobject = keepindexobject
337339 vbox = QVBoxLayout (self )
338340 self .lauchpath = None
@@ -636,14 +638,27 @@ def __refresh(self):
636638 cnt , savehook_new_data [self .gameuid ].get ("statistic_wordcount" , 0 )
637639 )
638640
641+ def chartwidget_ctxmenu (self , p ):
642+ menu = QMenu (self )
643+ quanju = LAction ("this" if self .__quanju_wc else "all" , menu )
644+ menu .addAction (quanju )
645+ action = menu .exec (self .cursor ().pos ())
646+ if action == quanju :
647+ self .__quanju_wc = not self .__quanju_wc
648+
639649 def getstatistic (self , formLayout : QVBoxLayout , gameuid ):
650+
640651 chart = chartwidget ()
641652 chart .xtext = lambda x : (
642653 "0" if x == 0 else str (datetime .fromtimestamp (x )).split (" " )[0 ]
643654 )
644655 chart .ytext = lambda y : self .formattime (y , False )
645656
646- self .chart = chart
657+ chart2 = chartwidget ()
658+ chart2 .xtext = chart .xtext
659+ chart2 .ytext = str
660+ chart2 .setContextMenuPolicy (Qt .ContextMenuPolicy .CustomContextMenu )
661+ chart2 .customContextMenuRequested .connect (self .chartwidget_ctxmenu )
647662 self ._timelabel = QLabel ()
648663 self ._wordlabel = QLabel ()
649664 self ._wordlabel .setSizePolicy (
@@ -652,34 +667,49 @@ def getstatistic(self, formLayout: QVBoxLayout, gameuid):
652667 self ._timelabel .setSizePolicy (
653668 QSizePolicy .Policy .Preferred , QSizePolicy .Policy .Fixed
654669 )
670+ stack = QStackedWidget ()
671+ stack .addWidget (chart )
672+ stack .addWidget (chart2 )
673+ wc = LPushButton ("文字计数" )
674+ tm = LPushButton ("游戏时间" )
675+ wc .setCheckable (True )
676+ tm .setCheckable (True )
677+
678+ def clicktm (b ):
679+ stack .setCurrentIndex (1 - b )
680+ globalconfig ["statisticvistm" ] = b
681+ wc .setChecked (not b )
682+
683+ def clickwc (b ):
684+ stack .setCurrentIndex (b )
685+ globalconfig ["statisticvistm" ] = not b
686+ tm .setChecked (not b )
687+
688+ tm .toggled .connect (clicktm )
689+ wc .toggled .connect (clickwc )
690+ if globalconfig .get ("statisticvistm" , True ):
691+ tm .setChecked (True )
692+ else :
693+ wc .setChecked (True )
655694 formLayout .addLayout (
656695 getboxlayout (
657696 [
658- "文字计数" ,
659- getboxlayout (
660- [self ._wordlabel , getIconButton (self .__refresh , "fa.refresh" )]
661- ),
662- ]
663- )
664- )
665-
666- t = QTimer (self )
667- formLayout .addLayout (
668- getboxlayout (
669- [
670- "游戏时间" ,
697+ wc ,
698+ self ._wordlabel ,
699+ "" ,
700+ tm ,
671701 self ._timelabel ,
672702 getIconButton (
673703 icon = "fa.edit" , callback = functools .partial (timelistediter , self )
674704 ),
705+ getIconButton (self .__refresh , "fa.refresh" ),
675706 ]
676707 )
677708 )
678-
679- formLayout .addWidget (chart )
709+ formLayout .addWidget (stack )
680710 t = QTimer (self )
681711 t .setInterval (1000 )
682- t .timeout .connect (self .refresh )
712+ t .timeout .connect (functools . partial ( self .refresh , chart , chart2 , gameuid ) )
683713 t .timeout .emit ()
684714 t .start ()
685715
@@ -718,14 +748,30 @@ def split_range_into_days(self, times):
718748 lists .append ((k , everyday [k ]))
719749 return lists
720750
721- def refresh (self ):
722- __ = gobject .base .somedatabase .querytraceplaytime (self . gameuid )
751+ def refresh (self , chart : chartwidget , chart2 : chartwidget , gameuid ):
752+ __ = gobject .base .somedatabase .querytraceplaytime (gameuid )
723753 _cnt = sum ([_ [1 ] - _ [0 ] for _ in __ ])
724754 self ._timelabel .setText (self .formattime (_cnt ))
725755 self ._wordlabel .setText (
726- str (savehook_new_data [self . gameuid ].get ("statistic_wordcount" , 0 ))
756+ str (savehook_new_data [gameuid ].get ("statistic_wordcount" , 0 ))
727757 )
728- self .chart .setdata (self .split_range_into_days (__ ))
758+ chart .setdata (self .split_range_into_days (__ ))
759+
760+ __ = gobject .base .somedatabase .querywordcount (
761+ None if self .__quanju_wc else gameuid
762+ )
763+ chart2 .setdata (self .wordcountbydate (__ ))
764+
765+ def wordcountbydate (self , l : tuple [tuple [float , int ]]):
766+ daily_sum : "dict[date, int]" = {}
767+ for timestamp , value in l :
768+ date = datetime .fromtimestamp (timestamp ).date ()
769+ daily_sum [date ] = daily_sum .get (date , 0 ) + value
770+ lists = []
771+ for k in sorted (daily_sum .keys ()):
772+ lists .append ((datetime .combine (k , dttime .min ).timestamp (), daily_sum [k ]))
773+
774+ return lists
729775
730776 def formattime (self , t , usingnotstart = True ):
731777 t = int (t )
0 commit comments