mirror of
https://github.com/c9moser/sgbackup.git
synced 2026-01-19 19:40:13 +00:00
2025.02.19 10:10:55 (desktop)
This commit is contained in:
parent
fed28c8b23
commit
21d6a286c9
@ -104,14 +104,19 @@ class BackupSingleDialog(Gtk.Dialog):
|
|||||||
|
|
||||||
class BackupGameData(GObject.GObject):
|
class BackupGameData(GObject.GObject):
|
||||||
def __init__(self,game:Game):
|
def __init__(self,game:Game):
|
||||||
GObject.__init__(self)
|
GObject.GObject.__init__(self)
|
||||||
self.__progress = 0.0
|
self.__progress = 0.0
|
||||||
self.__game = game
|
self.__game = game
|
||||||
|
self.__finished = False
|
||||||
|
|
||||||
@GObject.Property
|
@GObject.Property
|
||||||
def game(self)->Game:
|
def game(self)->Game:
|
||||||
return self.__game
|
return self.__game
|
||||||
|
|
||||||
|
@GObject.Property(type=str)
|
||||||
|
def key(self)->str:
|
||||||
|
return self.__game.key
|
||||||
|
|
||||||
@GObject.Property(type=float)
|
@GObject.Property(type=float)
|
||||||
def progress(self)->float:
|
def progress(self)->float:
|
||||||
return self.__progress
|
return self.__progress
|
||||||
@ -124,6 +129,42 @@ class BackupGameData(GObject.GObject):
|
|||||||
fraction = 1.0
|
fraction = 1.0
|
||||||
|
|
||||||
self.__progress = fraction
|
self.__progress = fraction
|
||||||
|
|
||||||
|
@GObject.Property(type=bool,nick='finished',default=False)
|
||||||
|
def finished(self)->bool:
|
||||||
|
return self.__finished
|
||||||
|
|
||||||
|
@finished.setter
|
||||||
|
def finished(self,is_finished:bool):
|
||||||
|
self.__finished = is_finished
|
||||||
|
|
||||||
|
class BackupGameDataSorter(Gtk.Sorter):
|
||||||
|
def do_compare(self,item1,item2):
|
||||||
|
name1 = item1.game.name.lower()
|
||||||
|
name2 = item2.game.name.lower()
|
||||||
|
|
||||||
|
if item1.finsihed:
|
||||||
|
if not item2.finished:
|
||||||
|
return Gtk.Ordering.LARGER
|
||||||
|
elif name1 > name2:
|
||||||
|
return Gtk.Ordering.LARGER
|
||||||
|
elif name1 > name2:
|
||||||
|
return Gtk.Ordering.SMALLER
|
||||||
|
else:
|
||||||
|
return Gtk.Ordering.EQUAL
|
||||||
|
elif item2.finished:
|
||||||
|
return Gtk.Ordering.SMALLER
|
||||||
|
elif item1.progress > item2.progress:
|
||||||
|
return Gtk.Ordering.LARGER
|
||||||
|
elif item1.progress < item2.progress:
|
||||||
|
return Gtk.Ordering.SMALLER
|
||||||
|
elif name1 > name2:
|
||||||
|
return Gtk.Ordering.LARGER
|
||||||
|
elif name1 < name2:
|
||||||
|
return Gtk.Ordering.SMALLER
|
||||||
|
else:
|
||||||
|
return Gtk.Ordering.EQUAL
|
||||||
|
|
||||||
|
|
||||||
class BackupMultiDialog(Gtk.Dialog):
|
class BackupMultiDialog(Gtk.Dialog):
|
||||||
logger = logger.getChild('BackupMultiDialog')
|
logger = logger.getChild('BackupMultiDialog')
|
||||||
@ -131,14 +172,39 @@ class BackupMultiDialog(Gtk.Dialog):
|
|||||||
Gtk.Dialog.__init__(self)
|
Gtk.Dialog.__init__(self)
|
||||||
if parent:
|
if parent:
|
||||||
self.set_transient_for(parent)
|
self.set_transient_for(parent)
|
||||||
|
self.set_decorated(False)
|
||||||
|
self.set_modal(False)
|
||||||
|
|
||||||
self.__scrolled = Gtk.ScrolledWindow()
|
self.__scrolled = Gtk.ScrolledWindow()
|
||||||
self.__games_liststore = Gio.Liststore(BackupGameData)
|
self.__games_liststore = Gio.ListStore(BackupGameData)
|
||||||
|
self.__games_sortmodel = Gtk.SortListModel.new(self.__games_liststore,
|
||||||
|
BackupGameDataSorter())
|
||||||
|
name_factory = Gtk.SignalListItemFactory()
|
||||||
|
name_factory.connect('setup',self._on_column_name_setup)
|
||||||
|
name_factory.connect('bind',self._on_column_name_bind)
|
||||||
|
name_column = Gtk.ColumnViewColumn.new('Name',name_factory)
|
||||||
|
|
||||||
|
progress_factory = Gtk.SignalListItemFactory()
|
||||||
|
progress_factory.connect('setup',self._on_column_progress_setup)
|
||||||
|
progress_factory.connect('bind',self._on_column_progress_bind)
|
||||||
|
progress_column = Gtk.ColumnViewColumn.new('Progress',progress_factory)
|
||||||
|
progress_column.set_expand(True)
|
||||||
|
|
||||||
|
self.__games_columnview = Gtk.ColumnView.new(self.__games_sortmodel)
|
||||||
|
self.__games_columnview.append_column(name_column)
|
||||||
|
self.__games_columnview.append_column(progress_column)
|
||||||
|
|
||||||
|
self.__scrolled.set_child(self.__games_columnview)
|
||||||
|
self.get_content_area().append(self.__scrolled)
|
||||||
|
|
||||||
|
self.__progressbar = Gtk.ProgressBar()
|
||||||
|
self.__progressbar.set_hexpand(True)
|
||||||
|
self.__progressbar.set_show_text(False)
|
||||||
|
self.get_content_area().append(self.__progressbar)
|
||||||
|
|
||||||
self.__ok_button = self.add_button("Close",Gtk.ResponseType.OK)
|
self.__ok_button = self.add_button("Close",Gtk.ResponseType.OK)
|
||||||
|
|
||||||
self.games = games
|
self.games = games
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@GObject.Property
|
@GObject.Property
|
||||||
@ -151,11 +217,111 @@ class BackupMultiDialog(Gtk.Dialog):
|
|||||||
if games:
|
if games:
|
||||||
for g in games:
|
for g in games:
|
||||||
if not isinstance(g,Game):
|
if not isinstance(g,Game):
|
||||||
self.__games = []
|
self.__games = {}
|
||||||
raise TypeError("\"games\" is not an Iterable of \"Game\" instances!")
|
raise TypeError("\"games\" is not an Iterable of \"Game\" instances!")
|
||||||
if g.get_backup_files():
|
if g.get_backup_files():
|
||||||
self.__games.append(Game)
|
self.__games.append(g)
|
||||||
if self.__games:
|
if self.__games:
|
||||||
self.__ok_button.set_sensitive(False)
|
self.__ok_button.set_sensitive(False)
|
||||||
else:
|
else:
|
||||||
self.__ok_button.set_sensitive(True)
|
self.__ok_button.set_sensitive(True)
|
||||||
|
|
||||||
|
def do_response(self,response):
|
||||||
|
self.hide()
|
||||||
|
self.destroy()
|
||||||
|
|
||||||
|
def run(self):
|
||||||
|
def thread_func(self,games):
|
||||||
|
am = ArchiverManager.get_global()
|
||||||
|
am.backup_many(games)
|
||||||
|
return 0
|
||||||
|
|
||||||
|
def on_am_backup_game_progress(am,game,progress,message):
|
||||||
|
GLib.idle_add(self._on_backup_game_progress,game,progress)
|
||||||
|
|
||||||
|
def on_am_backup_game_finished(am,game):
|
||||||
|
GLib.idle_add(self._on_backup_game_finished,game)
|
||||||
|
|
||||||
|
def on_am_backup_progress(am,progress):
|
||||||
|
GLib.idle_add(self._on_backup_progress)
|
||||||
|
|
||||||
|
def on_am_backup_finished(am):
|
||||||
|
GLib.idle_add(self._on_backup_finished)
|
||||||
|
|
||||||
|
if not self.games:
|
||||||
|
self.response(Gtk.Response.OK)
|
||||||
|
return
|
||||||
|
|
||||||
|
self.present()
|
||||||
|
|
||||||
|
am = ArchiverManager.get_global()
|
||||||
|
am.connect('backup-progress',on_am_backup_progress)
|
||||||
|
am.connect('backup-finished',on_am_backup_finished)
|
||||||
|
am.connect('backup-game-progress',on_am_backup_game_progress)
|
||||||
|
am.connect('backup-game-finished',on_am_backup_game_finished)
|
||||||
|
|
||||||
|
thread = Thread(target=thread_func,args=(list(self.__games),),daemon=True)
|
||||||
|
thread.start()
|
||||||
|
|
||||||
|
def _on_column_name_setup(self,factory,item):
|
||||||
|
label = Gtk.Label()
|
||||||
|
label.set_xalign(0.0)
|
||||||
|
item.set_child(label)
|
||||||
|
|
||||||
|
def _on_column_name_bind(self,factory,item):
|
||||||
|
label = item.get_child()
|
||||||
|
data = item.get_item()
|
||||||
|
label.set_text(data.game.name)
|
||||||
|
|
||||||
|
def _on_column_progress_setup(self,factory,item):
|
||||||
|
progressbar = Gtk.ProgressBar()
|
||||||
|
progressbar.set_show_text(False)
|
||||||
|
progressbar.set_hexpand(True)
|
||||||
|
item.set_child(progressbar)
|
||||||
|
|
||||||
|
def _on_column_progress_bind(self,factory,item):
|
||||||
|
progressbar = item.get_child()
|
||||||
|
data = item.get_item()
|
||||||
|
|
||||||
|
if not hasattr(progressbar,'_property_progress_binding'):
|
||||||
|
progressbar._property_progress_binding = data.bind_property('progress',progressbar,'fraction',GObject.BindingFlags.SYNC_CREATE)
|
||||||
|
|
||||||
|
def _on_backup_game_progress(self,game:Game,progress:float):
|
||||||
|
for i in reversed(range(self.__games_liststore.get_n_items())):
|
||||||
|
gamedata = self.__games_liststore.get_item(i)
|
||||||
|
if gamedata.key == game.key:
|
||||||
|
gamedata.progress = progress
|
||||||
|
return
|
||||||
|
gamedata = BackupGameData(game)
|
||||||
|
gamedata.progress = progress
|
||||||
|
self.__games_liststore.append(gamedata)
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _on_backup_game_finished(self,game):
|
||||||
|
for i in reversed(range(self.__games_liststore.get_n_items())):
|
||||||
|
gamedata = self.__games_liststore.get_item(i)
|
||||||
|
if gamedata.key == game.key:
|
||||||
|
gamedata.progress = 1.0
|
||||||
|
gamedata.finished = True
|
||||||
|
return
|
||||||
|
gamedata = BackupGameData(game)
|
||||||
|
gamedata.progress = 1.0
|
||||||
|
gamedata.finished = True
|
||||||
|
self.__games_liststore.append(gamedata)
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _on_backup_progress(self,progress:float):
|
||||||
|
self.__progressbar.set_fraction(progress)
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
def _on_backup_finished(self):
|
||||||
|
self.__progressbar.set_fraction(1.0)
|
||||||
|
self.__ok_button.set_sensitive(True)
|
||||||
|
self.set_decorated(True)
|
||||||
|
|
||||||
|
return False
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user