Ejemplo n.º 1
0
class MainApp(App):
    def __init__(self, **kwargs):
        super().__init__(**kwargs)
        self.archive = DictProperty()
        self.manager = ObjectProperty()
        self.archive = {}
        # dummy archive
        # abc = [i for i in 'abcdefghifjklmnop']
        # for i, a in enumerate(abc):
        #     self.archive[str(i)] = str(a)
        self.date = StringProperty()
        self.date = str(datetime.date.today())

    def build(self):
        try:
            self.load_json()
        except:
            print('[APP-INFO] No Archive found.')
        sm = Manager()
        self.manager = sm
        sm.add_widget(HomeScreen(name='Home'))
        sm.add_widget(EditScreen(name='New', date=str(self.date)))
        for key in self.archive.keys():
            sm.add_widget(
                EditScreen(name=str(key), date=key, body=self.archive[key]))
        return sm

    def save_entry(self, date: str, text: str):
        assert isinstance(text, str)
        assert isinstance(date, str)
        print(date + ' ' + text)
        self.archive[date] = text
        if date not in self.manager.screen_names:
            self.manager.add_widget(
                EditScreen(name=str(date), date=date, body=text))
        self.save_json()

    def save_json(self):
        with open('journal_data.txt', 'w') as outfile:
            json.dump(self.archive, outfile)

    def load_json(self):
        with open('journal_data.txt', 'r') as json_file:
            self.archive = json.load(json_file)
Ejemplo n.º 2
0
class Dashboard(FloatLayout):
    # Flag for determining whether screen is locked or not
    locked = BooleanProperty(False)

    def __init__(self, *args, **kwargs):
        self.scrmgr = ObjectProperty(None)

        super().__init__()

        # Get our list of available plugins
        plugins = kwargs["plugins"]

        # We need a list to hold the names of the enabled screens
        self.availablescreens = []

        # and an index so we can loop through them
        self.index = 0

        # We want to handle failures gracefully so set up some variables
        # variable to hold the FailScreen object (if needed)
        self.failscreen = None

        # Empty lists to track varous failures
        dep_failure = []
        scr_failure = []

        # Create a reference to the screenmanager instance
        self.scrmgr = self.ids.iscreenmgr

        # Loop over plugins
        for p in plugins:

            # Set up a tuple to store list of unmet dependencies
            plugin_dep = (p["name"], [])

            # Until we hit a failure, there are no unmet dependencies
            unmet = False

            # Loop over dependencies and test if they exist
            for dep in p["dependencies"]:
                try:
                    imp.find_module(dep)
                except ImportError:
                    # We've got at least one unmet dependency for this screen
                    unmet = True
                    plugin_dep[1].append(dep)
                    Logger.error("Unmet dependencies "
                                 "for {} screen. Skipping..."
                                 .format(p["name"]))

            # Can we use the screen?
            if unmet:
                # Add the tupe to our list of unmet dependencies
                dep_failure.append(plugin_dep)

            # No unmet dependencies so let's try to load the screen
            else:
                try:
                    plugin = imp.load_module("screen", *p["info"])
                    screen = getattr(plugin, p["screen"])
                    self.scrmgr.add_widget(screen(name=p["name"],
                                                  master=self,
                                                  params=p["params"]))
                    Logger.info("Screen: {} loaded.".format(p["name"]))

                # Uh oh, something went wrong...
                except Exception as e:
                    # Add the screen name and error message to our list
                    Logger.error("Could not import "
                                 "{} screen. Skipping...".format(p["name"]))
                    scr_failure.append(p["name"], repr(e))

                else:
                    # We can add the screen to our list of available screens
                    self.availablescreens.append(p["name"])

        # If we've got any failure then let's notify the user
        if dep_failure or scr_failure:

            # Create the FailedScreen instance
            self.failscreen = FailedScreen(dep=dep_failure,
                                           failed=scr_failure,
                                           name="FAILEDSCREENS")

            # Add it to our screen manager and make sure it's the first screen
            # the user sees
            self.scrmgr.add_widget(self.failscreen)
            self.scrmgr.current = "FAILEDSCREENS"

    def toggle_lock(self, locked=None):
        if locked is None:
            self.locked = not self.locked
        else:
            self.locked = bool(locked)

    def reload_screen(self, screen):
        # Remove the old screen
        self.remove_screen(screen)

        # and add it again
        self.add_screen(screen)

    def add_screen(self, screenname):

        # Get the info we need to import this screen
        foundscreen = [p for p in getPlugins() if p["name"] == screenname]

        # Check we've found a screen and it's not already running
        if foundscreen and screenname not in self.availablescreens:

            # Get the details for the screen
            p = foundscreen[0]

            # Import it
            plugin = imp.load_module("screen", *p["info"])

            # Get the reference to the screen class
            screen = getattr(plugin, p["screen"])

            # Add the KV file to the builder
            Builder.load_file(p["kvpath"])

            # Add the screen
            self.scrmgr.add_widget(screen(name=p["name"],
                                          master=self,
                                          params=p["params"]))

            # Add to our list of available screens
            self.availablescreens.append(screenname)

            # Activate screen
            self.switch_to(screenname)

        elif screenname in self.availablescreens:

            # This shouldn't happen but we need this to prevent duplicates
            self.reload_screen(screenname)

    def remove_screen(self, screenname):

        # Get the list of screens
        foundscreen = [p for p in getPlugins(inactive=True)
                       if p["name"] == screenname]

        # Loop over list of available screens
        while screenname in self.availablescreens:

            # Remove screen from list of available screens
            self.availablescreens.remove(screenname)

            # Change the display to the next screen
            self.next_screen()

            # Find the screen in the screen manager
            c = self.scrmgr.get_screen(screenname)

            # Call its "unload" method:
            if hasattr(c, "unload"):
                c.unload()

            # Delete the screen
            self.scrmgr.remove_widget(c)
            del c

        try:
            # Remove the KV file from our builder
            Builder.unload_file(foundscreen[0]["kvpath"])
        except IndexError:
            pass

    def next_screen(self, rev=False):
        if not self.locked:
            if rev:
                self.scrmgr.transition.direction = "right"
                inc = -1
            else:
                self.scrmgr.transition.direction = "left"
                inc = 1

            self.index = (self.index + inc) % len(self.availablescreens)
            print("self.index: ", self.index)
            print("self.availablescreens: ", self.availablescreens[self.index])
            self.scrmgr.current = self.availablescreens[self.index]

    def switch_to(self, screen):

        if screen in self.availablescreens:

            # Activate the screen
            self.scrmgr.current = screen

            # Update the screen index
            self.index = self.availablescreens.index(screen)