diff Gtk/importFiebdc.py @ 23:65e7ae0d0e63

GTK2 to GTK3
author Miguel Ángel Bárcena Rodríguez <miguelangel@obraencurso.es>
date Thu, 02 May 2019 16:31:17 +0200
parents 7bd4ca56607d
children
line wrap: on
line diff
--- a/Gtk/importFiebdc.py	Tue Sep 30 17:16:50 2014 +0200
+++ b/Gtk/importFiebdc.py	Thu May 02 16:31:17 2019 +0200
@@ -3,7 +3,7 @@
 ## File importFiebdc.py
 ## This file is part of pyArq-Presupuestos.
 ##
-## Copyright (C) 2010-2014 Miguel Ángel Bárcena Rodríguez
+## Copyright (C) 2010-2019 Miguel Ángel Bárcena Rodríguez
 ##                         <miguelangel@obraencurso.es>
 ##
 ## pyArq-Presupuestos is free software: you can redistribute it and/or modify
@@ -20,344 +20,17 @@
 ## along with this program.  If not, see <http://www.gnu.org/licenses/>.
 
 # Modules
-import sys
-import time
-import os.path
-import pygtk
-pygtk.require('2.0')
-import gtk
-import gobject
-import threading
-gobject.threads_init()
 
-# pyArq-Presupuestos Modules
-from Generic import utils
-from Generic import globalVars
-#from Generic import durusdatabase
-import gui
-
-class FileSelectionWindow(object):
-    """importFiebdc.FileSelectionWindow:
-    
-    Description:
-        Class to show the selection file window
-    Constructor:
-        importFiebdc.FileSelectionWindow(mainWindow, readFileMethod, budget,
-            filename, cancelMethod, filetype)
-    Ancestry:
-    +-- object
-      +-- FileSelectionWindow
-    Atributes:
-        "__mainWindow": gui.MainWindow object
-        "__readFileMethod": Method to read the selected file
-        "__budget": Budget object
-        "__filename": "file"
-        "__filetype": "budget" ,"database" or "durus"
-        "__cancelMethod": Method to cancel the read method
-        "__file": The selected file
-        "__window": The selection file window
-    Methods:
-        __init__(self, mainWindow, readFileMethod, budget
-                 arg_List, cancelMethod)
-        _launchProgressWindow(self, _file)
-        _openFile(self, filename)
-    """
-
-    def __init__(self, mainWindow, readFileMethod, budget, filename,
-                 cancelMethod, filetype):
-        """def __init__(self, mainWindow, readFileMethod, budget,
-                        filename, cancelMethod, filetype)
-        
-        mainWindow: gui.MainWindow object
-        readFileMethod: Method to read the selected file
-        budget: base.Budget object
-        filename: "file"
-        cancelMethod: Method to cancel the read method
-        fileytpe: "budget", "database" or "durus".
-        Sets the init atributes, creates the file selection window
-        Connects the events:
-            * clicked ok button: _openFile
-            * clicked cancel button: destroy window
-            * destroy event: _destroy
-        """
-        # TODO: Add file filter
-        self.__mainWindow = mainWindow
-        self.__readFileMethod = readFileMethod
-        self.__budget = budget
-        self.__filename = filename
-        self.__filetype = filetype
-        self.__cancelMethod = cancelMethod
-        self.__file = None
-        self.__window = gtk.FileChooserDialog(title=_("Open File"),
-            action=gtk.FILE_CHOOSER_ACTION_OPEN,
-            buttons=(gtk.STOCK_CANCEL,gtk.RESPONSE_CANCEL,
-                     gtk.STOCK_OPEN,gtk.RESPONSE_OK))
-        self.__window.set_default_response(gtk.RESPONSE_OK)
-        #if self.__filetype == "budget" or self.__filetype == "database":
-        self.__window.set_current_folder(globalVars.getHomePath("BUDGET"))
-        #else: # "durus"
-        #    self.__window.set_current_folder(
-        #        globalVars.getHomePath("DURUS-DATABASE"))
-        if self.__window.run() == gtk.RESPONSE_OK:
-            self._openFile(self.__window.get_filename())
-        self.__window.destroy()
-
-    def _launchProgressWindow(self, file):
-        """def _launchProgressWindow(self, file)
-        
-        Launch the progress window
-        """
-        self.__filename = file
-        _emptyPage = gui.EmptyPage(self.__mainWindow, self.__readFileMethod,
-                                   self.__budget, self.__filename,
-                                   self.__cancelMethod, self.__filetype)
-        self.__mainWindow.appendEmptyPage(_emptyPage)
-        _emptyPage.run()
-
-    def _openFile(self, filename):
-        """def _openFile(self, filename)
-        
-        filename: the filename to open
-        If the selected file has a bc3 extension 
-        _launchProgressWindow is called
-        """
-        _file = filename
-        if sys.getfilesystemencoding():
-            _file = _file.decode(sys.getfilesystemencoding())
-            #-#
-            _file = _file.encode("utf-8")
-            #-#
-        self.__file = _file
-        _filename = os.path.basename(self.__file)
-        _filename_ext = _filename.split(".")[-1]
-        if (self.__filetype == "budget" or self.__filetype == "database") and \
-            _filename_ext != "bc3" and _filename_ext != "BC3":
-            print _("The file must have 'bc3' extension")
-        #elif self.__filetype == "durus" and _filename_ext != "durus":
-        #    print _("The file must have 'durus' extension")
-        else:
-            self.__window.destroy()
-            # TODO: the file exits? is it not binary?, can it be readed?
-            self._launchProgressWindow(self.__file)
-
-
-class ProgressWindow(object):
-    """importFiebdc.ProgressWindow:
-    
-    Description:
-        Class to show the progress window and launch a thread  to read
-        the database file
-    Constructor:
-        importFiebdc.ProgressWindow(mainWindow, readFileMethod, budget,
-                 filename, cancelMethod)
-    Ancestry:
-    +-- object
-      +-- ProgressWindow
-    Atributes:
-        "__mainWindow":
-        "__readFileMethod":
-        "__budget":
-        "__filename":
-        "__cancelMethod":
-        "__children": Thread instance
-        "__cancel": list with boolean values
-        "__window": progress window widget
-        "__progress_bar": probres bar widget
-        "__label": label widget
-    Methods:
-        closeWindow(self)
-        __init__(self, mainWindow, readFileMethod, budget
-                 filename, cancelMethod)
-        closeWindow(self)
-        main(self)
-        _autoClose(self)
-        _updateLabel(self, _time)
-        _updateProgressBar(self)
-        _launchTimeout(self)
-        _launchChildren(self, mainWindow, readFileMethod, budget
-                    filename, cancelMethod)
-        _cancelChildren(self,widget=None)
-        _destroy(self, widget)
-        _delete_event(self, widget, event)
+# python 2/3 compatibility
+from __future__ import absolute_import, division, print_function, unicode_literals
 
-    """
-    def __init__(self, mainWindow, readFileMethod, budget,
-                 filename, cancelMethod):
-        """def __init__(self, mainWindow, readFileMethod, budget
-                        filename, cancelMethod)
-        
-        mainWindow: gui.MainWindow object
-        readFileMethod: Method to read the selected file
-        budget: base.Budget object
-        filenamer: "file"
-        cancelMethod: Method to cancel the read method
-        Sets the init atributes, creates the progress window
-        Connects the events:
-            * destroy signal: self._destroy
-            * delete_event signal: self._delete_event
-            * clicked cancel button: self._cancelChildren
-        """
-        self.__mainWindow = mainWindow
-        self.__readFileMethod = readFileMethod
-        self.__filename = filename
-        self.__budget = budget
-        self.__cancelMethod = cancelMethod
-        self.__children = None
-        self.__cancel = [False, False]
-        self.__window = gtk.Window()
-        self.__window.set_title(_("Loading file ..."))
-        self.__window.connect("destroy", self._destroy)
-        self.__window.connect("delete_event", self._delete_event)
-        _Vbox1 = gtk.VBox(False, 0)
-        self.__window.add(_Vbox1)
-        _align = gtk.Alignment(0.5, 0.5, 0, 0)
-        _align.show()
-        _Vbox1.pack_start(_align, False, False, 5)
-        self.__progress_bar = gtk.ProgressBar()
-        self.__progress_bar.show()
-        _align.add(self.__progress_bar)
-        self.__label = gtk.Label()
-        self.__label.set_text(_("Time: 0s"))
-        self.__label.show()
-        _Vbox1.add(self.__label)
-        self.__throbber = gtk.Image()
-        self.__throbber.set_from_file(globalVars.getAppPath("THROBBER-ICON"))
-        _Vbox1.add(self.__throbber)
-        self.__throbber.show()
-        self.__animation = gtk.gdk.PixbufAnimation(globalVars.getAppPath("THROBBER-GIF"))
-        _pixbuf = self.__throbber.get_pixbuf()
-        self.__throbber.set_from_animation(self.__animation)
-        _Hbox1 = gtk.HBox(False, 0)
-        _Vbox1.add(_Hbox1)
-        _button1 = gtk.Button(_("Cancel"))
-        _button1.connect("clicked", self._cancelChildren)
-        _button1.show()
-        _Hbox1.pack_start(_button1, True, True, 0)
-        _Hbox1.show()
-        _Vbox1.show()
-        
-    def main(self):
-        """def main(self)
-        
-        Launch the thread
-        Launch the timeouts
-        Shows window and starts the GTK+ event processing loop.
-        """
-
-        self._launchChildren()
-        self._launchTimeout()
-        self.__window.show()
-        gtk.main()
-
-    def closeWindow(self):
-        """def closeWindow(self)
-        
-        Sets the __children atribute to None
-        This causes that the timiouts is ended and then the window is
-        closed.
-        This method is called from thread when it is finished
-        """
-        self.__children = None
+# gui
+import gi
+gi.require_version('Gtk', '3.0')
+from gi.repository import Gtk
+from gi.repository import GLib
 
-    def _launchTimeout(self):
-        """def _launchTimeout(self)
-        
-        Launch the timeouts: 
-            1- update progress bar
-            2- update time labal
-            3- If the other timetouts are stoped the window is closed
-        """
-        gobject.timeout_add(100, self._updateProgressBar)
-        gobject.timeout_add(1000, self._updateLabel, time.time())
-        self.__cancel = [False, False]
-        gobject.timeout_add(1000, self._autoClose)
-
-    def _updateProgressBar(self):
-        """def _updateProgressBar(self)
-        
-        update progress bar in a timeout
-        If the thread end or is canceled the timeout is stoped
-        """
-        if  self.__children is None or self.__children.isCanceled() == True:
-            self.__cancel[0] = True
-            return False
-        else:
-            self.__progress_bar.pulse()
-            return True
-
-    def _updateLabel(self, _time):
-        """def _updateProgressBar(self)
-        
-        update time label in a timeout
-        If the thread end or is canceled the timeout is stoped
-        """
-        if  self.__children is None or self.__children.isCanceled() == True:
-            self.__cancel[1] = True
-            return False
-        else:
-            _time = time.time() - _time
-            self.__label.set_text(utils.mapping(_("Time: $1"),
-                ("%.0f" %_time,)))
-            return True
-
-    def _autoClose(self):
-        """def _updateProgressBar(self)
-        
-        If the time label and progress bar timeouts are stoped the window is 
-        closed and ist tiemeout is stoped
-        """
-        if self.__cancel == [ True, True ]:
-            self.__window.destroy()
-            return False
-        else:
-            return True
-
-    def _launchChildren(self):
-        """_launchChildren(self)
-        
-        Launch the thread to read the file
-        """
-        if self.__children is None:
-            self.__children =  Thread(self, self.__mainWindow,
-                self.__readFileMethod, self.__budget, self.__filename,
-                self.__cancelMethod)
-            self.__children.start()
-
-    def _cancelChildren(self,widget=None):
-        """_cancelChildren(self,widget=None)
-        
-        Method connected to "clicked" singal of cancel button
-        Stops the thread and close the window
-        """
-        if self.__children:
-            self.__children.cancel()
-        self.__window.destroy()
-
-    def _delete_event(self, widget, event):
-        """_delete_event(self, widget, event)
-        
-        widget: the widget where the event is emitted from
-        event: the "gtk.gdk.Event"
-        Method connected to "delete_event" signal of window widget
-        This signal is emitted when a user press the close titlebar button.
-        Stops the thread if exits.
-        Returns True so the signal "destroy" is emitted.
-        """
-        if self.__children:
-            self._cancelChildren()
-        return True
-
-    def _destroy(self, widget):
-        """_destroy(self, widget)
-        
-        widget: the widget where the event is emitted from
-        Method connected to "destroy" signal of window widget
-        This signal is emited when the method connected to "delete_event"
-        signal returns True or when the program call the destroy() method of
-        the gtk.Window widget.
-        The window is closed and the GTK+ event processing loop is ended.
-        """
-        gtk.main_quit()
+import threading
 
 class Thread(threading.Thread):
     """importFiebdc.Thread:
@@ -377,16 +50,14 @@
         "__budget
         "__filename": "file"
         "__cancelMethod": Method to cancel the read method
-        "__filetype": "budget", "database" or "durus"
+        "__filetype": "budget" or "database"
         "__cancel": Boolean value, True: the thread is stoped
     Methods:
-        __init__(self, page, mainWindow,
-                 readFileMethod, arg_tuple, cancelMethod)
-        run(self)
-        cancel(self)
-        isCanceled(self)
+        run()
+        cancel()
+        isCanceled()
+        clear()
     """
-
     def __init__(self, page, mainWindow, readFileMethod, budget,
                  filename, cancelMethod, filetype):
         """def __init__(page, mainWindow, readFileMethod, budget,
@@ -398,7 +69,8 @@
         budget: base.Budget object
         filename: "file"
         cancelMethod: Method to cancel the read method
-        filetype: "budget", "database" or "durus"
+        filetype: "budget" or "database"
+        
         Sets the instance atributes.
         """
         super(Thread, self).__init__()
@@ -412,37 +84,19 @@
         self.__cancel = False
 
     def run(self):
-        """run(self)
+        """run()
         
         
         """
-        _budget = self.__readFileMethod(self.__budget, self.__filename,
-                                        self.__page)
-        if _budget is None:
-            self.__page.threadCanceled()
+        self.__readFileMethod(self.__budget, self.__filename, self.__page)
+        if not self.__page.endSuccessfully:
+            GLib.idle_add(self.__page.threadCanceled)
         else:
-            _mainWindow = self.__mainWindow
-            self.__page.threadFinishedSignal(_budget)
-            #if self.__filetype == "database":
-            #    self.saveDurusDatabase()
+            GLib.idle_add(self.__page.threadFinishedSignal, self.__budget)
         self.clear()
-        
-    #def saveDurusDatabase(self):
-    #    _path = globalVars.getHomePath("DURUS-DATABASE")
-    #    _file_whit_path_bc3 = self.__budget.filename
-    #    _filename_bc3 = _file_whit_path_bc3.split("/")[-1]
-    #    _filename = _filename_bc3.split(".")[-2]
-    #    _file = _path + _filename + ".durus"
-    #    print utils.mapping(_("Saving file: $1"), (_file,))
-    #    _time = time.time()
-    #    _durus_file = durusdatabase.DurusFile(_file,True)
-    #    _durus_file.setBudget(self.__budget)
-    #    _durus_file.close()
-    #    print utils.mapping(_("Saving time: $1 seconds"),
-    #          (("%.2f" %(time.time()-_time) ),))
 
     def cancel(self):
-        """cancel(self)
+        """cancel()
         
         Sets the "__cancel" atribute to True and call "__cancelMethod" to stop
         read the file
@@ -451,7 +105,7 @@
         self.__cancelMethod()
 
     def isCanceled(self):
-        """isCanceled(self)
+        """isCanceled()
         
         Return True if the thread has been canceled
         """
@@ -464,4 +118,4 @@
         del self.__budget
         del self.__filename
         del self.__cancelMethod
-        del self.__cancel
+        #del self.__cancel