Esempio n. 1
0
 def main(self, filepath):
     """The Main method that kicks off the app loop."""
     try:
         self.store = StorageManager(filepath)
         self.cm = ContentManager(self.store)
         self.sm = ScreenManager()
         content = self.cm.render()
         self.sm.update_content(content)
         while True:
             self.sm.status_wnd.update_status(
                 self.mode_strs[self.mode],
                 self.cm.dirty)
             if self.mode == Modes.NORMAL:
                 self.normal_loop()
             elif self.mode == Modes.EDIT:
                 self.edit_loop()
             elif self.mode == Modes.MOVE:
                 self.move_loop()
     finally:
         curses.endwin()
         #TODO: Only use logging.exception if there is an actual exception.
         logging.exception(date.today())
         print('Exception in application')
         print('-'*50)
         print('-'*50)
Esempio n. 2
0
 def __init__(self):
     self.curses = CursesHelper()
     self.screenManager = ScreenManager()
     self.colorTracker = ColorTracker()
     self.curses.start()
     self.currentInput = ""
     self.layoutWidth = 0
     self.layoutHeight = 0
     self.outputWindow = 'main'
Esempio n. 3
0
 def _setUpScreen(self):
     self._screenmanager = ScreenManager(self._settings, self._logger)
     try:
         self._screenmanager.screenCreate()
     except Exception as e:
         print("RaspLed system error:")
         print("		Could not create user interface  " + str(e))
         print("		Contact system support.")
         self._logger.error("### Error: cant create screen.")
         sys.exit()
Esempio n. 4
0
def execution(type, count, item_type):
    sm = ScreenManager()
    rp = RechercheProcess()
    r = Item()

    sm.set_focus_by_window_name("Greenlamp")
    rp.search_multiple_item(type, count)

    items = r.generate_item_list(type)
    Excel(items, item_type)
 def initGame(self):
     self.window = Window(self)
     self.SCREEN_RESOLUTION = (self.window.width, self.window.height)
     initBatches()
     self.screenManager = ScreenManager()
     self.spriteManager = SpriteManager()
     self.musicManager = MusicManager()
     self.uiManager = UIManager.UIManager()
     pyglet.gl.glEnable(pyglet.gl.GL_BLEND)
     changeGameState(GAMESTATE_MENU)
    def build(self):
        Window.minimum_width = 650
        Window.minimum_height = 670

        Window.size = 700, 1000

        self.icon = 'Resources/icon.png'

        self.audio.play()

        return ScreenManager()
Esempio n. 7
0
 def __init__(self):
     self.soundManager = SoundManager()
     self.screenManager = ScreenManager(self)
     conf.pg.init()
     pg.display.set_caption(conf.TITLE)
     # Full-screen test stuff
     #user32 = conf.ctypes.windll.user32
     #screenSize =  user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)
     #print(screenSize)
     #size = (screenSize)
     #pg.display.set_mode((size) , pg.FULLSCREEN)
     #conf.WIDTH = screenSize[0]
     #conf.HEIGHT = screenSize[1]
     self.screen = conf.pg.display.set_mode((conf.WIDTH, conf.HEIGHT))
     #self.screen = conf.pg.display.set_mode((conf.WIDTH, conf.HEIGHT), pg.FULLSCREEN)
     self.clock = pg.time.Clock()
     pg.key.set_repeat(500, 100)
     self.load_data()
     pg.mouse.set_cursor(*pg.cursors.broken_x)
     self.map_progress = 0
     self.points = 0
     self.player_health = 0
     self.seed = conf.random.randint(42, 69)
Esempio n. 8
0
class RaspLedApplication():
    def run(self):
        self._setUpSettings()
        self._setUpLogger()

        self._ledsManager = LedsManager(self._settings, self._logger)
        self._ledsManager.resetLeds()
        self._ledsManager.startLeds()

        self._setUpScreen()

        self._configureRunLoop()

        self._startScreen()

    def _startScreen(self):
        try:
            self._screenmanager.startScreen()
        except Exception as e:
            self._runLoop = False
            print("RaspLed system error:")
            print("		Could not start user interface  " + str(e))
            print("		Contact system support.")
            self._logger.error("### Error: cant start screen.")
            sys.exit()

    def _configureRunLoop(self):
        self._runLoop = True
        try:
            loopThreath = threading.Thread(target=self._mainLoop)
            loopThreath.setDaemon(True)
            loopThreath.start()
        except Exception as e:
            self._runLoop = False
            print("RaspLed system error:")
            print("		Could not create refresh loop  " + str(e))
            print("		Contact system support.")
            self._logger.error("### Error: cant create refresh lood.")
            sys.exit()

    def _setUpScreen(self):
        self._screenmanager = ScreenManager(self._settings, self._logger)
        try:
            self._screenmanager.screenCreate()
        except Exception as e:
            print("RaspLed system error:")
            print("		Could not create user interface  " + str(e))
            print("		Contact system support.")
            self._logger.error("### Error: cant create screen.")
            sys.exit()

    def _setUpSettings(self):
        try:
            self._settings = ConfigurationManager()
        except Exception as e:
            print("RaspLed system error:")
            print("		Could not load configuration file RaspLed.ini   " +
                  str(e))
            print("		Contact system support.")
            sys.exit()

    def _setUpLogger(self):
        # logging
        self._logger = logging.getLogger()
        handler = logging.handlers.RotatingFileHandler(
            self._settings.logFilename,
            mode='a',
            maxBytes=7340032,
            backupCount=3,
            encoding=None,
            delay=False)
        formatter = logging.Formatter(
            '%(asctime)s - %(levelname)s - %(message)s')
        handler.setFormatter(formatter)
        self._logger.addHandler(handler)
        self._logger.setLevel(self._settings.logLevel)
        self._logger.info(
            '************************************************************************'
        )
        self._logger.info(
            '*****************    RaspLed, starting script    *********************'
        )
        self._logger.info(
            '************************************************************************'
        )

    def _setupWebClient(self):
        self._webClient = WebClient(self._settings.comunication, self._logger)

    def _mainLoop(self):
        self._logger.info('### Main loop')

        self._setupWebClient()

        while self._runLoop:
            # self._logger.info('### Main loop again')
            try:
                siteState = self._webClient.updateSiteState()
                if isinstance(siteState, SiteState):
                    self._screenmanager.updateScreen(siteState)
                    self._ledsManager.updateLeds(siteState)

                    sleep(self._settings.comunication.refreshInterval)
                else:
                    self._logger.error(
                        '### Error: _mainLoop invalid site state')
                    sleep(self._settings.comunication.refreshInterval)

            except Exception as e:
                self._logger.error("### Error: exception in mail loop." +
                                   str(e),
                                   exc_info=True)
                self._logger.error(
                    "### Retrying in " +
                    str(self._settings.comunication.refreshInterval) +
                    " seconds.")
                sleep(self._settings.comunication.refreshInterval)
Esempio n. 9
0
from wnck import Window

import wnck

from screenManager import ScreenManager
from piWindow import PIWindow
if __name__ == '__main__':
    manager = ScreenManager()
    window = PIWindow(manager.get_active_window())
    print window.set_position(0,0)
    #print manager.get_screen_size()
    #window.set_geometry(5, 15, 1900, 24, 500, 500)
    #window.maximize()
    #print type(window.get_window().get_workspace())

    #print dir(wnck.Screen)
    
    print manager.get_screen_size()
    (usable_width,usable_height,xorigin, yorigin)=manager.get_usable_size()
    print (usable_width,usable_height,xorigin, yorigin)
    
    
    
Esempio n. 10
0
import pygtk
pygtk.require('2.0')
import gtk
import appindicator
import pynotify

from piWindow import PIWindow 
from screenManager import ScreenManager

manager = ScreenManager()
window_handle = PIWindow(manager.get_active_window())	
(usable_width,usable_height,xorigin, yorigin)=manager.get_usable_size()

class PlaceItIndicator:
    
    def __init__(self):
        self.ind = appindicator.Indicator ("example-simple-client", "indicator-messages", appindicator.CATEGORY_APPLICATION_STATUS)
        self.ind.set_status (appindicator.STATUS_ACTIVE)
        self.ind.set_attention_icon ("indicator-messages-red")
        self.ind.set_icon("distributor-logo")
        
        self.menu = gtk.Menu()
        
        agr = gtk.AccelGroup()

	#Add menu items
	#First Batch	 Maximize,Minimize,Restore
        menuMaximize = gtk.MenuItem("Maximize")
        menuMaximize.connect("activate", self.win_maximize,"Maximize")
        
Esempio n. 11
0
import pygtk

pygtk.require('2.0')
import gtk
import appindicator
import pynotify

from piWindow import PIWindow
from screenManager import ScreenManager

manager = ScreenManager()
window_handle = PIWindow(manager.get_active_window())
(usable_width, usable_height, xorigin, yorigin) = manager.get_usable_size()


class PlaceItIndicator:
    def __init__(self):
        self.ind = appindicator.Indicator(
            "example-simple-client", "indicator-messages",
            appindicator.CATEGORY_APPLICATION_STATUS)
        self.ind.set_status(appindicator.STATUS_ACTIVE)
        self.ind.set_attention_icon("indicator-messages-red")
        self.ind.set_icon("distributor-logo")

        self.menu = gtk.Menu()

        agr = gtk.AccelGroup()

        #Add menu items
        #First Batch	 Maximize,Minimize,Restore
        menuMaximize = gtk.MenuItem("Maximize")
Esempio n. 12
0
class Game:
    def __init__(self):
        self.soundManager = SoundManager()
        self.screenManager = ScreenManager(self)
        conf.pg.init()
        pg.display.set_caption(conf.TITLE)
        # Full-screen test stuff
        #user32 = conf.ctypes.windll.user32
        #screenSize =  user32.GetSystemMetrics(0), user32.GetSystemMetrics(1)
        #print(screenSize)
        #size = (screenSize)
        #pg.display.set_mode((size) , pg.FULLSCREEN)
        #conf.WIDTH = screenSize[0]
        #conf.HEIGHT = screenSize[1]
        self.screen = conf.pg.display.set_mode((conf.WIDTH, conf.HEIGHT))
        #self.screen = conf.pg.display.set_mode((conf.WIDTH, conf.HEIGHT), pg.FULLSCREEN)
        self.clock = pg.time.Clock()
        pg.key.set_repeat(500, 100)
        self.load_data()
        pg.mouse.set_cursor(*pg.cursors.broken_x)
        self.map_progress = 0
        self.points = 0
        self.player_health = 0
        self.seed = conf.random.randint(42, 69)

    def load_data(self):
        game_folder = path.dirname('__file__')
        img_folder = path.join(game_folder, 'img')
        snd_folder = path.join(game_folder, 'snd')
        music_folder = path.join(game_folder, 'music')
        map_folder = path.join(game_folder, 'maps')
        self.asset_folder = path.join(game_folder, 'assets')

        self.title_font = path.join(game_folder, conf.FONT)
        self.background_image = utils.load_images_in_folder(conf.BACKGROUND_IMAGE, img_folder)
        self.dim_screen_img = pg.Surface(self.screen.get_size()).convert_alpha()
        self.dim_screen_img.fill((0, 0, 0, 120))

        self.maps = utils.load_maps(map_folder)
        self.player_imgs = utils.load_images_in_folder(conf.PLAYER_IMGS, img_folder)
        for i in range(0, len(self.player_imgs)):
            self.player_imgs[i] = pg.transform.scale(self.player_imgs[i], (conf.TILESIZE, conf.TILESIZE))
        self.wall_img = utils.load_images_in_folder(conf.WALL_IMG, img_folder)
        self.bullet_imgs = utils.load_images_in_folder(conf.BULLET_IMGS, img_folder)
        self.noise_imgs = utils.load_images_in_folder(conf.NOISE_IMGS, img_folder)
        self.flash_imgs = utils.load_images_in_folder(conf.BULLET_FLASH_IMGS, img_folder)
        self.item_imgs = utils.load_images_in_folder(conf.ITEM_IMGS, img_folder)
        self.splat_imgs = utils.load_images_in_folder(conf.SPLAT_IMGS, img_folder)
        # Sound
        pg.mixer.music.load(path.join(music_folder, conf.BG_MUSIC))
        self.effect_sounds = utils.load_sounds_in_folder(conf.EFFECTS_SOUNDS, snd_folder)
        self.weapon_sounds = utils.load_sounds_in_folder(conf.WEAPON_SOUNDS, snd_folder)
        self.enemy_sounds = utils.load_sounds_in_folder(conf.ENEMY_SOUNDS, snd_folder)
        for s in self.enemy_sounds:
            s.set_volume(.2)
        self.player_hit_sounds = utils.load_sounds_in_folder(conf.PLAYER_HIT_SOUNDS, snd_folder)
        # TODO - Find other sound for this
        self.enemy_hit_sounds = utils.load_sounds_in_folder(conf.ENEMY_SOUNDS, snd_folder)
        for s in self.enemy_hit_sounds:
            s.set_volume(.2)

    def new(self):
        # initialize all variables and do all the setup for a new game
        conf.random.seed(self.seed)
        self.all_sprites = pg.sprite.LayeredUpdates()
        self.walls = pg.sprite.Group()
        self.mobs = pg.sprite.Group()
        self.bullets = pg.sprite.Group()
        self.items = pg.sprite.Group()
        for row, tiles in enumerate(self.maps[self.map_progress].data):
            for col, tile in enumerate(tiles):
                if tile == conf.WALL_TILE:
                    Wall(self, conf.vec(col, row))
                elif tile == conf.PLAYER_TILE:
                    self.player = Player(self, conf.vec(col, row))
                    if (self.player_health != 0):
                        self.player.health = self.player_health
                elif tile == conf.HEALTH_TILE:
                    Item(self, conf.vec(col, row), 'health')
                elif tile == conf.MG_TILE:
                    Item(self, conf.vec(col, row), 'machinegun')
                elif tile == conf.SW_TILE:
                    Item(self, conf.vec(col, row), 'shockwave')
                elif tile == conf.SG_TILE:
                    Item(self, conf.vec(col, row), 'shotgun')
        for row, tiles in enumerate(self.maps[self.map_progress].data):
            for col, tile in enumerate(tiles):
                if tile == conf.MOB_TILE:
                    Mob(self, conf.vec(col, row))

        self.paused = False

        self.camera = Camera(self, self.maps[self.map_progress].width, self.maps[self.map_progress].height)
        self.background = Background(self, conf.vec(
            self.maps[self.map_progress].width / 4, self.maps[self.map_progress].height / 4))
        self.soundManager.play_sound_effect(self.effect_sounds['level_start'])

    def run(self):
        # game loop - set self.playing = False to end the game
        self.playing = True
        self.soundManager.play_music()

        while self.playing:
            self.dt = self.clock.tick(conf.FPS) / 1000.0
            self.events()
            if not self.paused:
                self.update()
            self.screenManager.draw_info(
                conf.BGCOLOR,
                self.title_font,
                self.player.health,
                self.clock.get_fps(),
                self.points + self.player.points_current_level,
                self.player.secondary_weapon_bullets,
                self.player.secondary_weapon
                )

    def quit(self):
        pg.quit()
        #TODO sys.exit()??

    def update(self):
        # update portion of the game loop
        self.all_sprites.update()
        self.camera.update(self.player)

    def events(self):
        # catch all events here
        for event in pg.event.get():
            if event.type == pg.QUIT:
                self.quit()
            if event.type == pg.KEYDOWN:
                if event.key == pg.K_ESCAPE:
                    self.quit()
            elif event.type == pg.KEYUP:
                if event.key == pg.K_m:
                    self.soundManager.toggle_mute()
                if event.key == pg.K_r:
                    self.new()
                    self.run()
                if event.key == pg.K_p:
                    self.paused = not self.paused
                if event.key == pg.K_SPACE and len(self.mobs) == 0:
                    self.add_points(self.player.points_current_level)
                    self.player_health = self.player.health
                    if self.map_progress < len(self.maps) - 1:
                        self.map_progress += 1
                    else:
                        self.map_progress = 0
                    self.new()
                    self.run()

    def show_start_screen(self):
        pass

    def show_go_screen(self):
        pass

    def add_points(self, pointsToAdd):
        self.points += pointsToAdd
Esempio n. 13
0
from wnck import Window

import wnck

from screenManager import ScreenManager
from piWindow import PIWindow
if __name__ == '__main__':
    manager = ScreenManager()
    window = PIWindow(manager.get_active_window())
    #print window.set_position(0,0)
    #print manager.get_screen_size()
    #window.set_geometry(5, 15, 1900, 24, 500, 500)
    #window.maximize()
    #print type(window.get_window().get_workspace())

    manager.get_usable_size()
    #print dir(wnck.Screen)
Esempio n. 14
0
def main():

    logging.basicConfig(format='%(asctime)s %(message)s',
                        datefmt='%d/%m/%Y %H:%M:%S',
                        filename='logs/error.log',
                        level=logging.ERROR)

    ui = UI()

    ui.print_message("-- Passphrase for encryption database")
    cm = ConstantsManager(ui.get_user_entry("Enter passphrase: "))
    constants.VIEW_ID = cm.getConstantValue(constants.STR_VIEW_ID)
    constants.TELEGRAM_BOT_TOKEN = cm.getConstantValue(
        constants.STR_TELEGRAM_BOT_TOKEN)
    constants.TELEGRAM_GROUP_ID = cm.getConstantValue(
        constants.STR_TELEGRAM_GROUP_ID)

    from infoFactory import InfoFactory
    from screenManager import ScreenManager
    from telegramBotManager import TelegramBotManager
    from info import Info

    screen_manager = ScreenManager()

    info_factory = InfoFactory()
    id_info_max = info_factory.get_number_of_info()
    id_info = 2

    #Id de l'info qui provoque l'erreur courante
    #Si elle est à 0, il n'y a pas d'erreur
    id_info_error = 0

    screen_manager.lcd_init()
    screen_manager.light_off_alert_led()

    while True:
        #On repart à la première info si on a affiché la dernière info
        #sinon on passe à la suivante
        if id_info == id_info_max:
            id_info = 1
        else:
            id_info = id_info + 1

        info = Info()
        #On récupère l'info à afficher
        info = info_factory.generate_info(id_info)

        #On affiche l'info
        screen_manager.print_first_line(info.get_first_line())
        screen_manager.print_second_line(info.get_second_line())

        if (info.get_level() == "ERROR"):
            screen_manager.light_on_alert_led()
            id_info_error = info.get_id()
            try:
                tbm = TelegramBotManager()
                tbm.send_message_to_group(constants.TELEGRAM_GROUP_ID,
                                          info.get_telegram_message())
            except:
                logging.error(
                    "Erreur lors de l'envoi de message par le Bot Telegram")
        else:
            if (id_info_error == info.get_id()):
                screen_manager.light_off_alert_led()
                #On signale qu'il n'y a plus d'erreur
                id_info_error = 0
                try:
                    tbm = TelegramBotManager()
                    tbm.send_message_to_group(constants.TELEGRAM_GROUP_ID,
                                              info.get_telegram_message())
                except:
                    logging.error(
                        "Erreur lors de l'envoi de message par le Bot Telegram"
                    )

        time.sleep(10)

        #On efface le contenu de l'écran
        screen_manager.lcd_init()
Esempio n. 15
0
class Interface(object):
    def __init__(self):
        self.curses = CursesHelper()
        self.screenManager = ScreenManager()
        self.colorTracker = ColorTracker()
        self.curses.start()
        self.currentInput = ""
        self.layoutWidth = 0
        self.layoutHeight = 0
        self.outputWindow = 'main'

    def getColorTracker(self):
        return self.colorTracker

    def getWindow(self, name):
        return self.screenManager.getWindow(name)

    def createWindow(self, name, position, size=False):
        self.screenManager.registerWindow(name, position, size)

    def setLayoutSize(self, width, height):
        self.layoutWidth = width
        self.layoutHeight = height

    def build(self):
        mainScreen = self.curses.getMainScreen()
        size = self.curses.getSize()
        self.screenManager.buildScreens(mainScreen, size,
                                        (self.layoutWidth, self.layoutHeight))

    def stop(self):
        self.curses.stop()

    def getch(self):
        return self.curses.getch()

    def setInput(self, string):
        if string != self.currentInput:
            self.screenManager.getWindow('input').clear()
            self.screenManager.getWindow('input').printString(string)
            self.currentInput = string

    def checkResize(self):
        if self.curses.isResized():
            self.build()

    def setOutputWindow(self, name):
        self.outputWindow = name

    def getOutputWindow(self):
        return self.outputWindow

    def step(self, action):
        if action[0] == "print":
            self.screenManager.getWindow(self.outputWindow).printString(
                action[1], self.colorTracker.getColor())
        elif action[0] == "color":
            self.colorTracker.updateColor(action[1])

    def refresh(self):
        if self.screenManager.refresh():
            self.curses.refresh()
Esempio n. 16
0
class ListMaker:
    def __init__(self):
        self.store = None
        self.cm = None
        self.sm = None
        self.mode = Modes.NORMAL
        self.state = dict()
        self.mode_strs = {
            Modes.EDIT:'Edit Mode',
            Modes.NORMAL:'Normal Mode',
            Modes.MOVE:'Move Mode'}
        os.environ.setdefault('ESCDELAY', '25')
        logging.basicConfig(filename='app.log', level=logging.DEBUG)

    def main(self, filepath):
        """The Main method that kicks off the app loop."""
        try:
            self.store = StorageManager(filepath)
            self.cm = ContentManager(self.store)
            self.sm = ScreenManager()
            content = self.cm.render()
            self.sm.update_content(content)
            while True:
                self.sm.status_wnd.update_status(
                    self.mode_strs[self.mode],
                    self.cm.dirty)
                if self.mode == Modes.NORMAL:
                    self.normal_loop()
                elif self.mode == Modes.EDIT:
                    self.edit_loop()
                elif self.mode == Modes.MOVE:
                    self.move_loop()
        finally:
            curses.endwin()
            #TODO: Only use logging.exception if there is an actual exception.
            logging.exception(date.today())
            print('Exception in application')
            print('-'*50)
            print('-'*50)


    def normal_loop(self):
        """This method handles the main-loop while app is in Normal mode."""
        sm = self.sm
        cm = self.cm
        key = self.process_input()
        if key in('KEY_DOWN', 'j'):
            sm.anno_wnd.update_selected(cm.traverse_down(), 'normal')
        elif key in('KEY_UP', 'k'):
            sm.anno_wnd.update_selected(cm.traverse_up(), 'normal')
        elif key == 'c':
            content = self.cm.add_child()
            self.sm.update_content(content)
            self.start_edit()
        elif key == 'w':
            self.store.write(self.cm.root)
            self.cm.dirty = False
        elif key == 'q':
            sys.exit()
        elif key == 'e':
            self.start_edit()
        elif key == 'm':
            self.start_move()
        elif key in ('Enter', 'b'):
            content = self.cm.add_sibling()
            self.sm.update_content(content)
            self.start_edit()
        elif key == 'd':
            content = self.cm.delete_node()
            self.sm.update_content(content)
        elif key in ('[', '<'):
            content = self.cm.promote_node()
            self.sm.update_content(content)
        elif key in (']', '>'):
            content = self.cm.demote_node()
            self.sm.update_content(content)


    def edit_loop(self):
        """This method handles the main-loop while app is in Edit mode."""
        key = self.process_input()
        if key == 'KEY_LEFT':
            target = self.cm.traverse_left()
            self.sm.show_cursor(target)
        elif key == 'KEY_RIGHT':
            target = self.cm.traverse_right()
            self.sm.show_cursor(target)
        elif key == 'Escape':
            self.end_edit()
        elif key == 'KEY_BACKSPACE':
            target = self.cm.backspace()
            self.sm.update_line(target)
            self.sm.show_cursor(target)
        elif key == 'KEY_DC':
            target = self.cm.del_char()
            self.sm.update_line(target)
            self.sm.show_cursor(target)
        elif key == 'Enter':
            self.end_edit()
            self.sm.update_content(self.cm.add_sibling())
            self.start_edit()
        elif key in string.printable:
            target = self.cm.insert(key)
            self.sm.update_line(target)
            self.sm.show_cursor(target)


    def start_edit(self):
        self.mode = Modes.EDIT
        edit_target = self.cm.get_selected_row()
        self.sm.status_wnd.update_status('Edit Mode', self.cm.dirty)
        self.sm.anno_wnd.update_selected(self.cm.selected_row, 'edit')
        self.sm.show_cursor(edit_target)


    def end_edit(self):
        self.mode = Modes.NORMAL
        self.sm.status_wnd.update_status('Normal Mode', self.cm.dirty)
        self.sm.anno_wnd.update_selected(self.cm.selected_row, 'normal')
        self.sm.hide_cursor()


    def move_loop(self):
        """This method handles the main-loop while app is in move mode."""
        sm = self.sm
        cm = self.cm
        key = self.process_input()
        if key in('KEY_DOWN', 'j'):
            sm.anno_wnd.update_selected(cm.traverse_down(), 'normal')
        elif key in('KEY_UP', 'k'):
            sm.anno_wnd.update_selected(cm.traverse_up(), 'normal')
        elif key == 'Escape':
            self.end_move(execute=False)
        elif key == 'Enter':
            self.end_move(execute=True)


    def start_move(self):
        """This method puts the application in Move Mode.

        This involved painting the starting item's annotation,
        updating object mode state, updating status line.
        """
        self.mode = Modes.MOVE
        self.sm.status_wnd.update_status('Move Mode', self.cm.dirty)
        self.sm.anno_wnd.update_move_item(self.cm.selected_row)
        self.state['move_row'] = self.cm.selected_row


    def end_move(self, execute: bool = False):
        """This method ends the move and goes back to normal mode.

        Arguments:
            execute -- If True, the move command will be executed. If
                       False, the move will be canceled and the content
                       tree will not be changed.
        """
        if execute:
            content = self.cm.move_node(self.state.pop('move_row'))
            self.sm.update_content(content)
        self.mode = Modes.NORMAL
        self.sm.status_wnd.update_status('Normal Mode', self.cm.dirty)
        self.sm.anno_wnd.clear_move()


    def process_input(self):
        ch = self.sm.getch()
        result = self.process_ch(ch)
        if result == None:
            result = self.sm.getkey()
        return result


    def process_ch(self, ch) -> str:
        if ch == 27:
            # Escape key
            return 'Escape'
        elif ch == 8:
            # Backspace key
            return 'Backspace'
        elif ch == 10:
            # Enter key
            return 'Enter'
        else:
            curses.ungetch(ch)
        return None