def __init__(self, buf):
        self.edit_only = buf.worksheet.edit_only

        if not self.edit_only:
            buf.worksheet.sig_chunk_inserted.connect( self.on_chunk_inserted )
            buf.worksheet.sig_chunk_changed.connect( self.on_chunk_changed )
            buf.worksheet.sig_chunk_status_changed.connect( self.on_chunk_status_changed )
            buf.worksheet.sig_chunk_deleted.connect( self.on_chunk_deleted )
            buf.worksheet.sig_state.connect( self.on_notify_state )

            # Track changes to update completion
            buf.connect_after('insert-text', self.on_after_insert_text)
            buf.connect_after('delete-range', self.on_after_delete_range)
            buf.connect_after('end-user-action', self.on_after_end_user_action)

            self.__inserted_in_user_action = False
            self.__deleted_in_user_action = False

        if not self.edit_only:
            self.sidebar = Sidebar()
        else:
            self.sidebar = None

        buf.connect('add-custom-result', self.on_add_custom_result)
        buf.connect('add-sidebar-results', self.on_add_sidebar_results)
        buf.connect('remove-sidebar-results', self.on_remove_sidebar_results)
        buf.connect('pair-location-changed', self.on_pair_location_changed)
            
        gtk.TextView.__init__(self, buf)
        if not self.edit_only:
            self.set_border_window_size(gtk.TEXT_WINDOW_LEFT, LEFT_MARGIN_WIDTH)
        self.set_left_margin(2)

        # Attach a "behavior object" to the view which, by ugly hacks, makes it
        # do simply and reasonable things for cut-and-paste and DND
        sanitize_textview_ipc.sanitize_view(self)

        self.add_events(gtk.gdk.LEAVE_NOTIFY_MASK)

        self.__completion_popup = CompletionPopup(self)
        self.__doc_popup = DocPopup()
        self.__mouse_over_object = None
        self.__mouse_over_timeout = None

        self.__mouse_over_start = buf.create_mark(None, buf.get_start_iter(), True)

        self.__arg_highlight_start = None
        self.__arg_highlight_end = None
        buf.connect('mark-set', self.on_mark_set)

        self.__cursor_chunk = None
        self.__scroll_to_result = False
        self.__scroll_to = buf.create_mark(None, buf.get_start_iter(), True)
        self.__scroll_idle = None

        self.__update_sidebar_positions_idle = 0
        self.__pixels_below_buffer = 0
        self.__last_chunk = None

        self.connect('destroy', self.on_destroy)
Exemple #2
0
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("destroy", self.on_quit)
        self.set_default_size(1000, 600)
        self.load_css()

        header_bar = Gtk.HeaderBar()
        header_bar.set_show_close_button(True)
        header_bar.props.title = "TVTracker"

        search_button = Gtk.ToggleButton()
        search_icon = Gtk.Image.new_from_icon_name("edit-find-symbolic", 4)

        search_button.add(search_icon)
        header_bar.pack_start(search_button)
        self.set_titlebar(header_bar)

        self.store = Store()

        box = Gtk.Box(Gtk.Orientation.HORIZONTAL)

        self.sidebar = Sidebar(self.store, search_button)
        self.sidebar.connect("notify::selected-show",
                             self.on_navigation_change)

        separator = Gtk.Separator()
        self.show_info = ShowInfo(self.store)
        self.show_info.connect("subscription_changed",
                               self.on_subscription_change)

        box.pack_start(self.sidebar, False, False, 0)
        box.pack_start(separator, False, False, 0)
        box.pack_start(self.show_info, True, True, 0)
        self.add(box)
Exemple #3
0
def build():
    ########sizes
    mergins = 20
    win_size = (800, 700)
    top_size = (win_size[0] - 2 * mergins, 30)
    side_size = (100, win_size[1] - top_size[1] - 2 * mergins)
    word_size = (win_size[0] - mergins * 2 - side_size[0], 80)

    #####coordinates
    top_cord = (mergins, mergins)
    side_cord = (mergins, mergins + top_size[1])
    word_cord = (side_size[0] + mergins, mergins + top_size[1])
    #####initializing
    pygame.init()
    screen = pygame.display.set_mode(win_size)
    #####
    buttons = [
        Button(text="Quit"),
        Button(text="Setup"),
        Button(text="Depth")
    ]
    side_bar = Sidebar(side_cord,
                       w=side_size[0],
                       h=side_size[1],
                       buttons=buttons)
    #####
    top_bar = topbar.topBar(top_size, pos=top_cord)
    #####
    word_bar = topbar.word(word_size, "word", pos=word_cord)
    clock = pygame.time.Clock()

    #####
    exit = False
    while not exit:
        e = pygame.event.wait()
        if e.type == pygame.QUIT:
            exit = True

        cntnr = pygame.Surface(
            (win_size[0] - 2 * mergins + 4, win_size[1] - 2 * mergins + 4))
        ####
        import random
        r = random.randint(23, 150)
        g = random.randint(23, 150)
        b = random.randint(23, 150)
        ####
        cntnr.fill((r, g, b))
        side_surf = side_bar.draw_buttons()
        screen.blit(cntnr, (mergins - 2, mergins - 2))
        screen.blit(top_bar, top_cord)
        screen.blit(side_surf, side_cord)
        screen.blit(word_bar, word_cord)
        pygame.display.update()
        clock.tick(40)

    pygame.quit()
Exemple #4
0
  def testLinks(self):
    """Make sure all the links are pointed to the correct paths."""
    sidebar = Sidebar(self.driver)

    home_link = sidebar.GetLink(sidebar.HOME_LINK)
    self.assertEquals(PATHS['landing_page_path'],
                      home_link.get_attribute('data-href'))

    users_link = sidebar.GetLink(sidebar.USERS_LINK)
    self.assertEquals(PATHS['user_page_path'],
                      users_link.get_attribute('data-href'))

    proxy_servers_link = sidebar.GetLink(sidebar.PROXY_SERVERS_LINK)
    self.assertEquals(PATHS['proxy_server_list'],
                      proxy_servers_link.get_attribute('data-href'))

    setup_link = sidebar.GetLink(sidebar.SETUP_LINK)
    self.assertEquals(PATHS['setup_oauth_path'],
                      setup_link.get_attribute('data-href'))

    sync_notifications_link = sidebar.GetLink(sidebar.SYNC_NOTIFICATIONS_LINK)
    self.assertEquals(PATHS['sync_top_level_path'],
                      sync_notifications_link.get_attribute('data-href'))

    logout_link = sidebar.GetLink(sidebar.LOGOUT_LINK)
    self.assertEquals(PATHS['logout'], logout_link.get_attribute('data-href'))
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.heading = tk.Label(self,
                                text="Products",
                                background="lightgrey",
                                pady="5")
        self.heading.pack(side="top", fill="x")
        self.sidebar = Sidebar(self, "Products")
        self.sidebar.pack(side="left", fill="y")
        self.main = tk.Frame(master=self)
        self.productsList = createListFrame(self.main, "Products",
                                            productModule.getAllProducts(),
                                            "No Products", "Change Product",
                                            self.changeProduct, [])

        self.productAdd = tk.Frame(master=self.main, padx=30, pady=100)
        self.productAddInit()
        self.switchMain("Product List")
Exemple #6
0
    def __init__(self):
        QPlainTextEdit.__init__(self)
        self.position_margin = QFontMetricsF(
            self.document().defaultFont()).width("#") * 80
        # Margin line
        self._margin = False
        # Sidebar
        self.sidebar = Sidebar(self)
        # Highlight current line
        self._color_current_line = QColor('lightblue')
        self._alpha_current_line = self._color_current_line.setAlpha(50)
        # Connection
        self.connect(self, SIGNAL("blockCountChanged(int)"),
                     self.sidebar.update_area_width)
        self.connect(self, SIGNAL("updateRequest(const QRect&, int)"),
                     self.sidebar.update_area)
        self.connect(self, SIGNAL("cursorPositionChanged()"),
                     self._highlight_current_line)

        self._highlight_current_line()
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.heading = tk.Label(self,
                                text="Invoices",
                                background="lightgrey",
                                pady="5")
        self.heading.pack(side="top", fill="x")
        self.sidebar = Sidebar(self, "Invoices")
        self.sidebar.pack(side="left", fill="y")
        self.main = tk.Frame(master=self)
        self.invoicesList = tk.Frame()
        self.updateList("unpaid")

        self.invoiceAdd = tk.Frame(master=self.main, padx=30, pady=30)
        self.invoiceAddInit()
        self.products = {}
        self.productList = tk.Frame(master=self.main, padx=30, pady=30)
        self.invoiceProductList()
        self.switchMain("Current Invoices")
Exemple #8
0
  async def create_html(resource: str) -> str:
    template_uri = HTML_PATH_MAPPINGS[resource]
    main_template_task = asyncio.create_task(fetch_file_txt(file=template_uri, metric=MAIN_SITE_METRIC, from_disk=True))
    sidebar_task = asyncio.create_task(Sidebar(template_uri=os.environ['SIDEBAR_URI']).get())
    main_injections = ASSET_REPLACEMENTS
    main_template = await main_template_task
    main_html = inject(main_template, main_injections)
    sidebar_html = await sidebar_task

    html = main_html.replace('{SIDEBAR_ITEMS}', sidebar_html)

    return html
Exemple #9
0
    def __init__(self, s):
        self.board_ = Board(s.boardsize_)

        self.robots_ = []
        for i in range(s.robots_):
            self.robots_.append(
                Robot(COLORS[i], rd(s.boardsize_), rd(s.boardsize_)))
        Robot.validate_positions(self.board_, self.robots_)

        self.target_ = Target(s.boardsize_, self.board_, self.robots_)

        if (s.test_rounds_ > 0):
            self.test_rounds_ = s.test_rounds_
        else:
            self.test_rounds_ = 0

        self.players_ = s.assign_players()

        self.graphics_ = GraphicalBoard(s.boardsize_)
        self.sidebar_ = Sidebar(self.graphics_, self.players_)
        self.games_to_win_ = 7
Exemple #10
0
	def __init__(self, image, master=None ):
		super().__init__(master)

		self.master = master	
		self.imagePath = image
		self.resize = True

		self.canvas_config()
		self.master.width = self.width
		self.master.height = self.height

		sidebar = Sidebar(self.master, self.canvas)
		self.keybinds()
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.heading = tk.Label(self,
                                text="Clients",
                                background="lightgrey",
                                pady="5")
        self.heading.pack(side="top", fill="x")
        self.sidebar = Sidebar(self, "Clients")
        self.sidebar.pack(side="left", fill="y")
        self.main = tk.Frame(master=self)

        self.clientList = createListFrame(self.main, "Clients",
                                          clientModule.get_all_clients(),
                                          "No Clients", "See Invoices",
                                          self.clientInvoiceView, [])

        self.clientAdd = tk.Frame(master=self.main, padx=30, pady=100)
        self.clientAddInit()

        self.clientView = tk.Frame(master=self.main)

        self.switchMain("Client List")
 def draw_initial_board(self,board):
     #clear any previous game state
     self.screen.fill(self.background)  
     
     #sidebar - check if already exists in case of board reset
     if hasattr(self, 'sidebar'):
         self.sidebar.__init__(self,board)
     else:
         self.sidebar=Sidebar(self,board)        
     
     #draw
     for i in range(board.gridsize):
         for j in range(board.gridsize):
             self.screen.blit(self.floor,
                         (self.wallsize+i*(self.tilesize+self.wallsize),
                          self.wallsize+j*(self.tilesize+self.wallsize)))
     
     #set walls
     for i in range(board.boardsize):
         for j in range(board.boardsize):
             if board.boardstate[i,j]==1:
                 #horizontal, vertical or gap?
                 if i%2==0:
                     if j%2==0:
                         #gap
                         self.screen.blit(self.wall_c,
                                          (getXYOffset(i,j,self)))
                     else:
                         self.screen.blit(self.wall_h,
                                          (getXYOffset(i,j,self)))
                 else:
                     self.screen.blit(self.wall_v,
                                      (getXYOffset(i,j,self)))
                     
     #draw flag
     self.redraw_flag(board)
             
     #draw robot(s) at their turn start positions, which should be same as current in all cases
     self.robot_rects={}
     for colour in board.robot_colours:
         self.screen.blit(self.robots[colour],getXYGridOffset(board.robots[colour].position[0],board.robots[colour].position[1],self))
         self.robot_rects[colour]=self.robots[colour].get_rect()
         self.robot_rects[colour]=self.robot_rects[colour].move(getXYGridOffset(board.robots[colour].position[0],board.robots[colour].position[1],self))
     
     pygame.display.flip()
Exemple #13
0
    def initUI(self):
        self.setWindowTitle('Chess')
        self.resize(700, 500)

        layout = QHBoxLayout()

        playingFiled = Board()
        playingFiled.setObjectName("boardPlayer")
        playingFiled.createBord()
        sidebar = Sidebar()

        layout.addWidget(playingFiled,
                         3)  # Takes 3 times more space than sidebar
        layout.addWidget(sidebar, 1)

        self.setCentralWidget(QWidget())
        self.centralWidget().setLayout(layout)

        playingFiled.playerChanged.connect(sidebar.TimePanel.boardSays)
        self.show()
Exemple #14
0
    def __init__(self):
        QPlainTextEdit.__init__(self)
        self.position_margin = QFontMetricsF(
            self.document().defaultFont()).width("#") * 80
        # Margin line
        self._margin = False
        # Sidebar
        self.sidebar = Sidebar(self)
        # Highlight current line
        self._color_current_line = QColor('lightblue')
        self._alpha_current_line = self._color_current_line.setAlpha(50)
        # Connection
        self.connect(self, SIGNAL("blockCountChanged(int)"),
                    self.sidebar.update_area_width)
        self.connect(self, SIGNAL("updateRequest(const QRect&, int)"),
                    self.sidebar.update_area)
        self.connect(self, SIGNAL("cursorPositionChanged()"),
                    self._highlight_current_line)

        self._highlight_current_line()
class ClientsView(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.heading = tk.Label(self,
                                text="Clients",
                                background="lightgrey",
                                pady="5")
        self.heading.pack(side="top", fill="x")
        self.sidebar = Sidebar(self, "Clients")
        self.sidebar.pack(side="left", fill="y")
        self.main = tk.Frame(master=self)

        self.clientList = createListFrame(self.main, "Clients",
                                          clientModule.get_all_clients(),
                                          "No Clients", "See Invoices",
                                          self.clientInvoiceView, [])

        self.clientAdd = tk.Frame(master=self.main, padx=30, pady=100)
        self.clientAddInit()

        self.clientView = tk.Frame(master=self.main)

        self.switchMain("Client List")

    #Creating a view of the invoices of clients
    def clientInvoiceView(self, client_id):
        client = clientModule.getClient(client_id)
        self.clientView = createListFrame(
            self.main, client["CustomerName"],
            invoiceModule.getInvoices(client_id), "No Invoices", "Pay Invoice",
            lambda: invoiceModule.payInvoice(client_id), ["ClientID"])
        self.switchMain("Client View")

    #creating a view of the form for adding clients
    def clientAddInit(self):
        lbl_name = tk.Label(master=self.clientAdd, text="Name")
        ent_name = tk.Entry(master=self.clientAdd)
        lbl_email = tk.Label(master=self.clientAdd, text="Email")
        ent_email = tk.Entry(master=self.clientAdd)
        lbl_address = tk.Label(master=self.clientAdd, text="Address")
        ent_address = tk.Entry(master=self.clientAdd)
        btn_submit = tk.Button(master=self.clientAdd,
                               text="Add Client",
                               height=3,
                               width=10,
                               command=lambda: buttonAction())
        lbl_name.pack()
        ent_name.pack()
        lbl_email.pack()
        ent_email.pack()
        lbl_address.pack()
        ent_address.pack()
        btn_submit.pack()

        def buttonAction():
            self.createClient(ent_name.get(), ent_email.get(),
                              ent_address.get())

            ent_name.delete(0, 100)
            ent_email.delete(0, 100)
            ent_address.delete(0, 100)

    def createClient(self, name, email, address):
        clientModule.createClient(name, email, address)
        self.switchMain("Client List")

    #Changing between the views.
    def switchMain(self, name):
        self.clientList.pack_forget()
        self.clientAdd.pack_forget()
        self.clientView.pack_forget()
        if name == "Client List":
            self.clientList = createListFrame(self.main, "Clients",
                                              clientModule.get_all_clients(),
                                              "No Clients", "See Invoices",
                                              self.clientInvoiceView, [])
            self.clientList.pack()
        elif name == "Add Client":
            self.clientAdd.pack()
        elif name == "Client View":
            self.clientView.pack()

        self.main.pack()
Exemple #16
0
  def __init__(self,screen,backend = {}):
    self.screen = screen;
    self.screen_lock = thread.allocate()
    self.draw_skeleton = True
    self.video_display = False
    self.dispInfo = pygame.display.Info()
    self.skeleton_to_depth_image = nui.SkeletonEngine.skeleton_to_depth_image
    self.control_words = ['pause','run','quit','repeat',"train",'test']
    self.paused = False;
    self.skeletons = None
    self.DEPTH_WINSIZE = 320,240
    self.VIDEO_WINSIZE = 640,480
    self.skeletal_map = []
    self.state = self.SETUP;
    self.mode = self.TRAINING;
    self.backend = backend;
    self.wordlist = CircularArray(backend['words'])
    self.word = "None"
    self.test_word = self.wordlist.roll()
    self.backend_wait = True;
    self.show_depth = False;
    ####
    if self.video_display:
      size = self.dispInfo.current_w-self.VIDEO_WINSIZE[0];
    else:
      size = self.dispInfo.current_w-self.DEPTH_WINSIZE[0];
    size = size + 100
    #self.clock_image = resize((size,size), ou_img="ui/images/_clock.gif");
    self.sent_data = False;
    self.use_speech = True;
    self.repeat = False
    self.camera_surf = pygame.Surface(self.DEPTH_WINSIZE)
    
    
    ##########
    self.counter = self.READY_COUNTER;
    self.action = Text(self.screen,w=100, h=50,pos=(485,0),text=self.test_word[0],color=THECOLORS['white']);
    self.count = Text(self.screen,w=100, h=100,pos=(485,55),text=str(self.counter),color=THECOLORS['white']);

    ####general state display paramters
    self.mergin_side = 20;
    self.mergin_top = 20;
    ###top bar
    self.top_bar_size = (self.dispInfo.current_w-2*self.mergin_side,70);
    self.topbar_pos = (self.mergin_side,self.mergin_side)
    self.topbar = bars.topBar(self.top_bar_size,pos=self.topbar_pos);
    ###side bar
    self.side_bar_w = 100;
    self.side_bar_h = self.dispInfo.current_h-self.mergin_top*2-self.top_bar_size[1];
    self.side_bar_pos = (self.mergin_side,self.top_bar_size[1]+self.mergin_top);
    ###word bar
    w = self.dispInfo.current_w-self.side_bar_w-2*self.mergin_side
    self.word_bar_size = (w,70);
    self.word_bar_pos = (self.mergin_side+self.side_bar_w,self.mergin_side+self.top_bar_size[1])
    
    ###camera feedback pos
    self.camera_feed_pos = (self.mergin_side+self.side_bar_w,self.word_bar_pos[1]+self.word_bar_size[1]);
    ####SETUP display parameters
    self.train_button_pos = (100,100);
    self.train_button = Button(pos=self.train_button_pos,text="TRAINING");
    #++++++++++
    self.user_button_pos = (100,210);
    #++++++++
    self.depth_button = Button(text="DEPTH")
    #++++++
    self.user_button = Button(pos=self.user_button_pos,text="USER");
    self.setup_sidebar = Sidebar(self.side_bar_pos,w=self.side_bar_w,h=self.side_bar_h,buttons=[self.train_button,self.user_button,self.depth_button])
    self.setup_sidebar_surf = self.setup_sidebar.draw_buttons()

    ###Text input
    self.text_in_h = 40;
    self.text_in_w = 100;
    self.text_in_pos = (self.camera_feed_pos[0]+self.DEPTH_WINSIZE[0]+10,self.camera_feed_pos[1])
    self.text_input = InputBox(self.text_in_pos[0], self.text_in_pos[1], self.text_in_w, self.text_in_h)
    ####READY display parameters
    self.quit_button = Button(text="QUIT");
    #++++++++++
    self.setup_button = Button(text="SETUP");
    #++++++
    self.puase_button = Button(text="PAUSE");
    #++++++

    self.sidar_bar = Sidebar(self.side_bar_pos,w=self.side_bar_w,h=self.side_bar_h,buttons=[self.quit_button,self.puase_button,self.setup_button,self.depth_button])
    self.sidebar_surf = self.sidar_bar.draw_buttons()
    #++++++
    #self.clock_pos = (self.camera_feed_pos[0]+self.DEPTH_WINSIZE[0]+10,self.camera_feed_pos[1]+self.text_in_h)
    self.clock_pos = (self.camera_feed_pos[0]+self.DEPTH_WINSIZE[0]+70,self.camera_feed_pos[1])
    self.clock = Clock(size=self.DEPTH_WINSIZE[1] + 30);
    ####RECODRING display parameters 
    

    ####FEEDBACK parameters
    self.feedback_bar_pos=(self.word_bar_pos[0], self.camera_feed_pos[1]+self.DEPTH_WINSIZE[1]+10);
    self.feedback_bar_size = self.word_bar_size;


    
   
    self.speech_thread = SpeechTrigger(self);
    self.listen = False;
    ###
    self.ctl_word_size = 40;
    self.ctl_pose = self.camera_feed_pos[0],self.camera_feed_pos[1]+self.DEPTH_WINSIZE[1]+30
    self.ctl_size = self.word_bar_size[0],300
    self.clt_words=ControlWords(self.WORDS,font_size=self.ctl_word_size,pose=self.ctl_pose,size=self.ctl_size)
    self.setup_clt_words=ControlWords(self.SETUP_WORDS,font_size=self.ctl_word_size,pose=self.ctl_pose,size=self.ctl_size)
    self.ctl_surf = self.clt_words.show()
    self.setup_ctl_surf=self.setup_clt_words.show()

    ### Feedback bars
    self.congrats_bar = bars.congrats(self.feedback_bar_size,pos = self.feedback_bar_pos);
    self.no_data_bar = bars.noData(self.feedback_bar_size,pos = self.feedback_bar_pos);
    self.processing_bar = bars.processing(self.feedback_bar_size,pos = self.feedback_bar_pos)
    self.gogo_bar = bars.gogo(size=(self.clock.size, self.clock.size),pos=self.clock_pos);
    self.correct_word_pos = (self.feedback_bar_pos[0],(self.feedback_bar_pos[1]+self.feedback_bar_size[1]))
    ####Test words
    self.train_bars = mappers.trainer_vocab_display_mapper(self);
    self.test_bars = mappers.test__vocab_display_mapper(self);
    self.sorry_bar_mapper = mappers.sorry_bar_mapper(self);
    self.correct_word_bar = mappers.correct__word_display_mapper(self);
Exemple #17
0
class PykinectInt:
  DEPTH_WINSIZE = 320,240
  VIDEO_WINSIZE = 640,480
  ###STATES
  SETUP = 0;
  RECORDING = 1;
  FEEDBACK = 2;
  READY = 3;
  WAIT = 4;
  ###modes
  USER = 0;
  TRAINING = 1;
  #### Limits
  READY_COUNTER=3;
  RECORDING_COUNTER=2;
  FEEDBACK_COUNTER = 4;
  WAIT_COUNTER=4;
  WORDS = {"pause: ":"to pause","run: ": "to unpause","quit: ":"to quit","repeat: ": "to repeat the last word"}
  SETUP_WORDS = {"train":"to start practice mode", "test": "To start test mode"}

  def __init__(self,screen,backend = {}):
    self.screen = screen;
    self.screen_lock = thread.allocate()
    self.draw_skeleton = True
    self.video_display = False
    self.dispInfo = pygame.display.Info()
    self.skeleton_to_depth_image = nui.SkeletonEngine.skeleton_to_depth_image
    self.control_words = ['pause','run','quit','repeat',"train",'test']
    self.paused = False;
    self.skeletons = None
    self.DEPTH_WINSIZE = 320,240
    self.VIDEO_WINSIZE = 640,480
    self.skeletal_map = []
    self.state = self.SETUP;
    self.mode = self.TRAINING;
    self.backend = backend;
    self.wordlist = CircularArray(backend['words'])
    self.word = "None"
    self.test_word = self.wordlist.roll()
    self.backend_wait = True;
    self.show_depth = False;
    ####
    if self.video_display:
      size = self.dispInfo.current_w-self.VIDEO_WINSIZE[0];
    else:
      size = self.dispInfo.current_w-self.DEPTH_WINSIZE[0];
    size = size + 100
    #self.clock_image = resize((size,size), ou_img="ui/images/_clock.gif");
    self.sent_data = False;
    self.use_speech = True;
    self.repeat = False
    self.camera_surf = pygame.Surface(self.DEPTH_WINSIZE)
    
    
    ##########
    self.counter = self.READY_COUNTER;
    self.action = Text(self.screen,w=100, h=50,pos=(485,0),text=self.test_word[0],color=THECOLORS['white']);
    self.count = Text(self.screen,w=100, h=100,pos=(485,55),text=str(self.counter),color=THECOLORS['white']);

    ####general state display paramters
    self.mergin_side = 20;
    self.mergin_top = 20;
    ###top bar
    self.top_bar_size = (self.dispInfo.current_w-2*self.mergin_side,70);
    self.topbar_pos = (self.mergin_side,self.mergin_side)
    self.topbar = bars.topBar(self.top_bar_size,pos=self.topbar_pos);
    ###side bar
    self.side_bar_w = 100;
    self.side_bar_h = self.dispInfo.current_h-self.mergin_top*2-self.top_bar_size[1];
    self.side_bar_pos = (self.mergin_side,self.top_bar_size[1]+self.mergin_top);
    ###word bar
    w = self.dispInfo.current_w-self.side_bar_w-2*self.mergin_side
    self.word_bar_size = (w,70);
    self.word_bar_pos = (self.mergin_side+self.side_bar_w,self.mergin_side+self.top_bar_size[1])
    
    ###camera feedback pos
    self.camera_feed_pos = (self.mergin_side+self.side_bar_w,self.word_bar_pos[1]+self.word_bar_size[1]);
    ####SETUP display parameters
    self.train_button_pos = (100,100);
    self.train_button = Button(pos=self.train_button_pos,text="TRAINING");
    #++++++++++
    self.user_button_pos = (100,210);
    #++++++++
    self.depth_button = Button(text="DEPTH")
    #++++++
    self.user_button = Button(pos=self.user_button_pos,text="USER");
    self.setup_sidebar = Sidebar(self.side_bar_pos,w=self.side_bar_w,h=self.side_bar_h,buttons=[self.train_button,self.user_button,self.depth_button])
    self.setup_sidebar_surf = self.setup_sidebar.draw_buttons()

    ###Text input
    self.text_in_h = 40;
    self.text_in_w = 100;
    self.text_in_pos = (self.camera_feed_pos[0]+self.DEPTH_WINSIZE[0]+10,self.camera_feed_pos[1])
    self.text_input = InputBox(self.text_in_pos[0], self.text_in_pos[1], self.text_in_w, self.text_in_h)
    ####READY display parameters
    self.quit_button = Button(text="QUIT");
    #++++++++++
    self.setup_button = Button(text="SETUP");
    #++++++
    self.puase_button = Button(text="PAUSE");
    #++++++

    self.sidar_bar = Sidebar(self.side_bar_pos,w=self.side_bar_w,h=self.side_bar_h,buttons=[self.quit_button,self.puase_button,self.setup_button,self.depth_button])
    self.sidebar_surf = self.sidar_bar.draw_buttons()
    #++++++
    #self.clock_pos = (self.camera_feed_pos[0]+self.DEPTH_WINSIZE[0]+10,self.camera_feed_pos[1]+self.text_in_h)
    self.clock_pos = (self.camera_feed_pos[0]+self.DEPTH_WINSIZE[0]+70,self.camera_feed_pos[1])
    self.clock = Clock(size=self.DEPTH_WINSIZE[1] + 30);
    ####RECODRING display parameters 
    

    ####FEEDBACK parameters
    self.feedback_bar_pos=(self.word_bar_pos[0], self.camera_feed_pos[1]+self.DEPTH_WINSIZE[1]+10);
    self.feedback_bar_size = self.word_bar_size;


    
   
    self.speech_thread = SpeechTrigger(self);
    self.listen = False;
    ###
    self.ctl_word_size = 40;
    self.ctl_pose = self.camera_feed_pos[0],self.camera_feed_pos[1]+self.DEPTH_WINSIZE[1]+30
    self.ctl_size = self.word_bar_size[0],300
    self.clt_words=ControlWords(self.WORDS,font_size=self.ctl_word_size,pose=self.ctl_pose,size=self.ctl_size)
    self.setup_clt_words=ControlWords(self.SETUP_WORDS,font_size=self.ctl_word_size,pose=self.ctl_pose,size=self.ctl_size)
    self.ctl_surf = self.clt_words.show()
    self.setup_ctl_surf=self.setup_clt_words.show()

    ### Feedback bars
    self.congrats_bar = bars.congrats(self.feedback_bar_size,pos = self.feedback_bar_pos);
    self.no_data_bar = bars.noData(self.feedback_bar_size,pos = self.feedback_bar_pos);
    self.processing_bar = bars.processing(self.feedback_bar_size,pos = self.feedback_bar_pos)
    self.gogo_bar = bars.gogo(size=(self.clock.size, self.clock.size),pos=self.clock_pos);
    self.correct_word_pos = (self.feedback_bar_pos[0],(self.feedback_bar_pos[1]+self.feedback_bar_size[1]))
    ####Test words
    self.train_bars = mappers.trainer_vocab_display_mapper(self);
    self.test_bars = mappers.test__vocab_display_mapper(self);
    self.sorry_bar_mapper = mappers.sorry_bar_mapper(self);
    self.correct_word_bar = mappers.correct__word_display_mapper(self);

  def surface_to_array(self,surface):
    buffer_interface = surface.get_buffer()
    address = ctypes.c_void_p()
    size = Py_ssize_t()
    _PyObject_AsWriteBuffer(buffer_interface,
                          ctypes.byref(address), ctypes.byref(size))
    bytes = (ctypes.c_byte * size.value).from_address(address.value)
    bytes.object = buffer_interface
    return bytes
  def pos_to_array(self,joint):
    #print "joint", joint
    return [joint.x,joint.y,joint.z]
  


  def map_skeleton(self,skeleton):
    skltl = Skeletal();
    skltl.head = self.pos_to_array(skeleton.SkeletonPositions[JointId.Head]);
      
    skltl.should_center = self.pos_to_array(skeleton.SkeletonPositions[JointId.ShoulderCenter]);
    skltl.shoulder_left = self.pos_to_array(skeleton.SkeletonPositions[JointId.ShoulderLeft]);
    skltl.shoulder_right = self.pos_to_array(skeleton.SkeletonPositions[JointId.ShoulderRight]);

    skltl.elbow_left = self.pos_to_array(skeleton.SkeletonPositions[JointId.ElbowLeft]);
    skltl.elbow_right = self.pos_to_array(skeleton.SkeletonPositions[JointId.ElbowRight]);

    skltl.wrist_left = self.pos_to_array(skeleton.SkeletonPositions[JointId.WristLeft]);
    skltl.wrist_right = self.pos_to_array(skeleton.SkeletonPositions[JointId.WristRight]);

    skltl.hand_left =self.pos_to_array(skeleton.SkeletonPositions[JointId.HandLeft]);
    skltl.hand_right =self.pos_to_array(skeleton.SkeletonPositions[JointId.HandRight]);

    skltl.hip_center =self.pos_to_array(skeleton.SkeletonPositions[JointId.HipCenter]);
    skltl.hip_left =self.pos_to_array(skeleton.SkeletonPositions[JointId.HipLeft]);
    skltl.hip_right =self.pos_to_array(skeleton.SkeletonPositions[JointId.HandRight]);

    skltl.ankle_left =self.pos_to_array(skeleton.SkeletonPositions[JointId.AnkleLeft]);
    skltl.ankle_right =self.pos_to_array(skeleton.SkeletonPositions[JointId.AnkleRight]);

    skltl.foot_left =self.pos_to_array(skeleton.SkeletonPositions[JointId.FootLeft]);
    skltl.foot_right =self.pos_to_array(skeleton.SkeletonPositions[JointId.FootRight]);

    skltl.knee_left =self.pos_to_array(skeleton.SkeletonPositions[JointId.KneeLeft]);
    skltl.knee_right =self.pos_to_array(skeleton.SkeletonPositions[JointId.KneeRight]);
    skltl.spine =self.pos_to_array(skeleton.SkeletonPositions[JointId.spine]);
    return skltl;
  def collect(self,skltns):
    sf = [];
    for index, sklton in enumerate(skltns):
      sk = self.map_skeleton(sklton)
      if sk.is_not_empty():
        sf.append(sk);
    if not sf==[]:
      self.skeletal_map.append(ScanFrame(sf));

  def draw_skeleton_data(self,pSkelton, index, positions, width = 4):
    start = pSkelton.SkeletonPositions[positions[0]]
       
    for position in itertools.islice(positions, 1, None):
      next = pSkelton.SkeletonPositions[position.value]
      if self.video_display:
        curstart = self.skeleton_to_depth_image(start, self.VIDEO_WINSIZE[0], self.VIDEO_WINSIZE[1]) 
        curend = self.skeleton_to_depth_image(next, self.VIDEO_WINSIZE[0], self.VIDEO_WINSIZE[1])
        if curstart[0]<self.VIDEO_WINSIZE[0] and curstart[1]<self.VIDEO_WINSIZE[1]:
          if curend[0]<self.VIDEO_WINSIZE[0] and curend[1]<self.VIDEO_WINSIZE[1]:
            # curstart = curstart[0]+self.camera_feed_pos[0],curstart[1]+self.camera_feed_pos[1];
            # curend = curend[0]+self.camera_feed_pos[0],curend[1]+self.camera_feed_pos[1]
            pygame.draw.line(self.camera_surf, SKELETON_COLORS[index], curstart, curend, width);
      else:
        curstart = self.skeleton_to_depth_image(start, self.DEPTH_WINSIZE[0], self.DEPTH_WINSIZE[1]) 
        curend = self.skeleton_to_depth_image(next, self.DEPTH_WINSIZE[0], self.DEPTH_WINSIZE[1])
        if curstart[0]<self.DEPTH_WINSIZE[0] and curstart[1]<self.DEPTH_WINSIZE[1]:
          if curend[0]<self.DEPTH_WINSIZE[0] and curend[1]<self.DEPTH_WINSIZE[1]:
            # curstart = curstart[0]+self.camera_feed_pos[0],curstart[1]+self.camera_feed_pos[1];
            # curend = curend[0]+self.camera_feed_pos[0],curend[1]+self.camera_feed_pos[1]
            pygame.draw.line(self.camera_surf, SKELETON_COLORS[index], curstart, curend, width);
      start = next
  def draw_skeletons(self,skeletons):
    if not self.show_depth:
      self.camera_surf.fill((0,0,0))
    for index, data in enumerate(skeletons):
      # draw the Head
      if self.video_display:
        HeadPos = self.skeleton_to_depth_image(data.SkeletonPositions[JointId.Head], self.VIDEO_WINSIZE[0], self.VIDEO_WINSIZE[1])
      else:
        HeadPos = self.skeleton_to_depth_image(data.SkeletonPositions[JointId.Head], self.DEPTH_WINSIZE[0], self.DEPTH_WINSIZE[1])
      self.draw_skeleton_data(data, index, SPINE, 10)
      pygame.draw.circle(self.camera_surf, SKELETON_COLORS[index], (int(HeadPos[0]), int(HeadPos[1])), 20, 0)
  
      # drawing the limbs
      self.draw_skeleton_data(data, index, LEFT_ARM)
      self.draw_skeleton_data(data, index, RIGHT_ARM)
      self.draw_skeleton_data(data, index, LEFT_LEG)
      self.draw_skeleton_data(data, index, RIGHT_LEG)
    self.screen.blit(self.camera_surf,self.camera_feed_pos)
    pygame.display.update()
  def word_trigger(self,_words):
    pygame.event.post(pygame.event.Event(SPEECHEVENT,words = _words));
  def depth_frame_ready(self,frame):
    if self.video_display:
      return
    #print "Adding depth........"
    depth_surface = pygame.Surface(self.DEPTH_WINSIZE);

    with self.screen_lock:
      if self.show_depth:
        address = self.surface_to_array(self.camera_surf)
        frame.image.copy_bits(address)
        del address
        self.screen.blit(self.camera_surf,self.camera_feed_pos)
      if self.skeletons is not None and self.draw_skeleton:
        self.draw_skeletons(self.skeletons)
        if self.state==self.RECORDING:
          self.collect(self.skeletons);

      
      disp(self)
      pygame.display.update()
      #print "deleted!"


  def video_frame_ready(self,frame):
    #print "video_display: ",self.video_display
    if not self.video_display:
      return
    #print "Adding......."
    vid_surface = pygame.Surface(self.VIDEO_WINSIZE);

    with self.screen_lock:
      if self.show_depth:
        address = self.surface_to_array(self.camera_surf)
        frame.image.copy_bits(address)
        del address
        self.screen.blit(self.camera_surf,self.camera_feed_pos);
      if self.skeletons is not None and self.draw_skeleton:
        self.draw_skeletons(self.skeletons)
        if self.state==self.RECORDING:
          self.collect(self.skeletons);
      disp(self)
      pygame.display.update()
  def loop(self):
    pygame.display.set_caption('Louder than words')
    self.screen.fill(THECOLORS["black"])
    if self.use_speech:
      self.listen = True;
      self.speech_thread.start()


    kinect = nui.Runtime()
    kinect.skeleton_engine.enabled = True
    def post_frame(frame):
        try:
          pygame.event.post(pygame.event.Event(KINECTEVENT, skeletons = frame.SkeletonData))
        except:
          pass
    kinect.skeleton_frame_ready += post_frame
    
    kinect.depth_frame_ready += self.depth_frame_ready    
    kinect.video_frame_ready += self.video_frame_ready    
    
    kinect.video_stream.open(nui.ImageStreamType.Video, 2, nui.ImageResolution.Resolution640x480, nui.ImageType.Color)
    kinect.depth_stream.open(nui.ImageStreamType.Depth, 2, nui.ImageResolution.Resolution320x240, nui.ImageType.Depth)

    print('Controls: ')
    print('     d - Switch to depth view')
    print('     v - Switch to video view')
    print('     s - Toggle displaing of the skeleton')
    print('     u - Increase elevation angle')
    print('     j - Decrease elevation angle')

    pygame.time.set_timer(RECORDEVENT, 1000);
    done = False
    skeleton_counter = 0
    clock  = pygame.time.Clock()
    while not done:
      #r = random.randint(0,34);
      #g = random.randint(0,34);
      #b = random.randint(0,34);
      #background_color = (r,g,b);
      background_color = (1, 0, 79)
      e = pygame.event.wait()
      self.dispInfo = pygame.display.Info()
      if e.type == pygame.QUIT:
        self.listen = False
        done = True
        break
      elif e.type == RECORDEVENT:
        transition_handle(self,background_color,skeleton_counter)
      elif e.type == KINECTEVENT:
          skeletons = e.skeletons
          #print "recieving skeletons"
          ###COLLECTING DATA
          if self.state==self.RECORDING:
            if not self.paused:
              skeleton_counter+=1;
              self.collect(skeletons);
          if self.draw_skeleton:
            #print "sending skeletons"
            
            self.draw_skeletons(skeletons)
            pygame.display.update()
      elif e.type == KEYDOWN:
        if e.key == K_ESCAPE:
          done = True
          break
        elif e.key == K_d:
          with self.screen_lock:
            self.video_display = False
        elif e.key == K_v:
          with self.screen_lock:
            self.screen = pygame.display.set_mode(self.VIDEO_WINSIZE,0,16)
            self.video_display = True
        elif e.key == K_s:
          self.draw_skeleton = not self.draw_skeleton
        elif e.key == K_u:
          kinect.camera.elevation_angle = kinect.camera.elevation_angle + 2
        elif e.key == K_j:
          kinect.camera.elevation_angle = kinect.camera.elevation_angle - 2
        elif e.key == K_x:
          kinect.camera.elevation_angle = 2

      ######
      ##Click response
      ###
      if e.type ==MOUSEBUTTONDOWN:
        done=mouse_handle(self,done);
      if e.type==SPEECHEVENT:
        while len(e.words)!=0:
          speech_word = e.words.pop(0)
          done = word_handle(self,speech_word,done)
        
      disp(self);
      pygame.display.update();
      clock.tick();
    
    self.backend['save_data']()
    pygame.quit()
class InvoicesView(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.heading = tk.Label(self,
                                text="Invoices",
                                background="lightgrey",
                                pady="5")
        self.heading.pack(side="top", fill="x")
        self.sidebar = Sidebar(self, "Invoices")
        self.sidebar.pack(side="left", fill="y")
        self.main = tk.Frame(master=self)
        self.invoicesList = tk.Frame()
        self.updateList("unpaid")

        self.invoiceAdd = tk.Frame(master=self.main, padx=30, pady=30)
        self.invoiceAddInit()
        self.products = {}
        self.productList = tk.Frame(master=self.main, padx=30, pady=30)
        self.invoiceProductList()
        self.switchMain("Current Invoices")

    #Creating a view of the list of invoices
    def updateList(self, type):
        if (type == "paid"):
            self.invoicesList = createListFrame(
                self.main, "Invoice History", invoiceModule.getPaidInvoices(),
                "Currently no paid invoices.", "Delete Invoice",
                self.payInvoice, ["ClientID"])
        elif (type == "unpaid"):
            self.invoicesList = createListFrame(
                self.main, "Unpaid Invoices",
                invoiceModule.getUnpaidInvoices(),
                "Currently no unpaid invoices.", "Pay Invoice",
                self.payInvoice, ["ClientID"])

    #creating a view of the form for creating invoices
    def invoiceAddInit(self):
        dropdownClients = {}
        dropdownClients[""] = ""  # Blank space for dropdownmenu
        for client in clientModule.get_all_clients():
            dropdownClients[client["_id"]] = client["CustomerName"]

        tkvar_client = tk.StringVar(master=self.invoiceAdd)
        lbl_client = tk.Label(master=self.invoiceAdd, text="Client")
        opt_client = ttk.OptionMenu(self.invoiceAdd, tkvar_client,
                                    *dropdownClients.values())
        opt_client["width"] = 18

        lbl_title = tk.Label(master=self.invoiceAdd, text="Title")
        ent_title = tk.Entry(master=self.invoiceAdd)
        lbl_description = tk.Label(master=self.invoiceAdd, text="Description")
        ent_description = tk.Entry(master=self.invoiceAdd)
        lbl_dueDate = tk.Label(master=self.invoiceAdd, text="Due Date")
        ent_dueDate = tk.Entry(master=self.invoiceAdd)
        btn_submit = tk.Button(
            master=self.invoiceAdd,
            text="Create Invoice",
            height=3,
            width=10,
            command=lambda: self.createInvoice(
                get_id(tkvar_client.get()), ent_title.get(),
                ent_description.get(), ent_dueDate.get(), self.products))

        lbl_client.pack(padx=5, pady=5, fill="x")
        opt_client.pack(padx=5, pady=5, fill="x")
        lbl_title.pack(padx=5, pady=5, fill="x")
        ent_title.pack(padx=5, pady=5, fill="x")
        lbl_description.pack(padx=5, pady=5, fill="x")
        ent_description.pack(padx=5, pady=5, fill="x")
        lbl_dueDate.pack(padx=5, pady=5, fill="x")
        ent_dueDate.pack(padx=5, pady=5, fill="x")
        btn_submit.pack(padx=5, pady=5, fill="x")

        def get_id(*args):  # on select function
            for i, j in dropdownClients.items():
                if j == tkvar_client.get():
                    return i

    #Creating view for adding products to the invoice
    def invoiceProductList(self):
        dropdownProducts = {}
        dropdownProducts[""] = ""  # Blank space for dropdownmenu
        for product in productModule.getAllProducts():
            dropdownProducts[product["_id"]] = product["ProductName"]

        lbl_products = tk.Label(master=self.productList, text="Products")
        tkvar_product = tk.StringVar(master=self.productList)
        opt_products = ttk.OptionMenu(self.productList, tkvar_product,
                                      *dropdownProducts.values())
        opt_products["width"] = 18

        btn_addProduct = tk.Button(
            master=self.productList,
            text="Add Product",
            padx=5,
            pady=3,
            command=lambda: self.addProduct(get_id(tkvar_product.get()),
                                            tkvar_product.get()))

        lbl_products.pack(padx=5, pady=5, fill="x")
        opt_products.pack(padx=5, pady=5, fill="x")
        btn_addProduct.pack(padx=5, pady=5, fill="x")

        def get_id(*args):  # on select function
            for i, j in dropdownProducts.items():
                if j == tkvar_product.get():
                    return i

    def addProduct(self, productID, product):
        if productID in self.products:
            self.products[productID] += 1
        else:
            self.products[productID] = 1
        self.label = tk.Label(master=self.productList, text=product)
        self.label.pack(padx=5, pady=5, fill="x")

        self.switchMain("Create Invoice")

    def payInvoice(self, id):
        invoiceModule.payInvoice(id)

    def createInvoice(self, client, title, description, dueDate, list):
        cost = 0
        for product in self.products:
            cost += int(productModule.getProduct(product)["Cost"])
        invoiceModule.createInvoice(client, title, description, dueDate, cost,
                                    list)

        self.switchMain("Invoice List")

    def switchMain(self, name):
        self.invoicesList.pack_forget()
        self.invoiceAdd.pack_forget()
        self.productList.pack_forget()
        if (name == "Current Invoices"):
            self.updateList("unpaid")
            self.invoicesList.pack()
        elif (name == "Invoice History"):
            self.updateList("paid")
            self.invoicesList.pack()
        elif (name == "Create Invoice"):
            self.invoiceAdd.pack(fill="both", side="left", expand=True)
            self.productList.pack(fill="both", side="right", expand=True)

        self.main.pack(fill="both")
Exemple #19
0
    def __init__(self, params, **kw):

        super(ViewForm, self).__init__(**kw)

        # save reference of params dictionary in requeste
        cherrypy.request.terp_params = params
        cherrypy.request.terp_fields = []

        editable = params.editable
        readonly = params.readonly

        if editable is None:
            editable = True

        if readonly is None:
            readonly = False

        self.screen = Screen(prefix='',
                             hastoolbar=True,
                             editable=editable,
                             readonly=readonly,
                             selectable=params.selectable or 2)

        self.sidebar = Sidebar(self.screen.model,
                               self.screen.toolbar,
                               self.screen.id,
                               self.screen.view_type,
                               context=self.screen.context)

        self.is_dashboard = getattr(cherrypy.request, '_terp_dashboard', False)

        self.search = None

        if params.view_type in ('tree', 'graph'):
            self.search = Search(model=params.model,
                                 domain=params.domain,
                                 context=params.context,
                                 values=params.search_data or {})

        if params.view_type == 'tree':
            self.screen.id = False

        if 'form' not in self.screen.view_mode:
            self.screen.widget.show_links = 0
            self.screen.widget.link = 0
            self.screen.editable = False
            self.screen.widget.editable = False

        # get the correct view title
        if params.context:
            self.screen.string = params.context.get('_terp_view_name',
                                                    self.screen.string)
        self.screen.string = self.screen.string

        # get the actual pager data
        self.limit = self.screen.limit
        self.offset = self.screen.offset
        self.count = self.screen.count

        self.search_domain = params.search_domain
        self.search_data = params.search_data

        if params.hidden_fields:
            self.hidden_fields = params.hidden_fields
Exemple #20
0
class Edistor(QPlainTextEdit):
    """ QPlainTextEdit implementation

        This class is the base of editor

        Highlight current line method:
            @color: string color
            @alpha: int
    """
    def __init__(self):
        QPlainTextEdit.__init__(self)
        self.position_margin = QFontMetricsF(
            self.document().defaultFont()).width("#") * 80
        # Margin line
        self._margin = False
        # Sidebar
        self.sidebar = Sidebar(self)
        # Highlight current line
        self._color_current_line = QColor('lightblue')
        self._alpha_current_line = self._color_current_line.setAlpha(50)
        # Connection
        self.connect(self, SIGNAL("blockCountChanged(int)"),
                     self.sidebar.update_area_width)
        self.connect(self, SIGNAL("updateRequest(const QRect&, int)"),
                     self.sidebar.update_area)
        self.connect(self, SIGNAL("cursorPositionChanged()"),
                     self._highlight_current_line)

        self._highlight_current_line()

    def margin(self, show=False):
        """ Set the margin line """
        if show:
            self._margin = Margin()

    def paintEvent(self, e):
        QPlainTextEdit.paintEvent(self, e)
        if self._margin:
            qp = QPainter()
            qp.begin(self.viewport())
            qp.setPen(self._margin.color)
            offset = self.contentOffset()
            qp.drawLine(self.position_margin + offset.x(), 0,
                        self.position_margin + offset.x(),
                        self.viewport().height())
            qp.end()

    def highlightCurrentLine(self, color, alpha):
        self._color_current_line = QColor(color)
        self._alpha_current_line = self._color_current_line.setAlpha(alpha)
        self._highlight_current_line()

    def _highlight_current_line(self):
        self.extra_selections = []
        selection = QTextEdit.ExtraSelection()
        selection.format.setBackground(self._color_current_line)
        selection.format.setProperty(QTextFormat.FullWidthSelection,
                                     QVariant(True))
        selection.cursor = self.textCursor()
        selection.cursor.clearSelection()
        self.extra_selections.append(selection)
        self.setExtraSelections(self.extra_selections)

    def resizeEvent(self, e):
        QPlainTextEdit.resizeEvent(self, e)
        cr = self.contentsRect()
        self.sidebar.setGeometry(
            QRect(cr.left(), cr.top(), self.sidebar.width(), cr.height()))
class ProductsView(tk.Frame):
    def __init__(self, parent, *args, **kwargs):
        tk.Frame.__init__(self, parent, *args, **kwargs)
        self.parent = parent
        self.heading = tk.Label(self,
                                text="Products",
                                background="lightgrey",
                                pady="5")
        self.heading.pack(side="top", fill="x")
        self.sidebar = Sidebar(self, "Products")
        self.sidebar.pack(side="left", fill="y")
        self.main = tk.Frame(master=self)
        self.productsList = createListFrame(self.main, "Products",
                                            productModule.getAllProducts(),
                                            "No Products", "Change Product",
                                            self.changeProduct, [])

        self.productAdd = tk.Frame(master=self.main, padx=30, pady=100)
        self.productAddInit()
        self.switchMain("Product List")

    def productAddInit(self):
        lbl_name = tk.Label(master=self.productAdd, text="Name")
        ent_name = tk.Entry(master=self.productAdd)
        lbl_description = tk.Label(master=self.productAdd, text="Description")
        ent_description = tk.Entry(master=self.productAdd)
        lbl_category = tk.Label(master=self.productAdd, text="Category")
        ent_category = tk.Entry(master=self.productAdd)
        lbl_cost = tk.Label(master=self.productAdd, text="Cost")
        ent_cost = tk.Entry(master=self.productAdd)
        lbl_inventory = tk.Label(master=self.productAdd, text="Inventory")
        ent_inventory = tk.Entry(master=self.productAdd)

        btn_submit = tk.Button(
            master=self.productAdd,
            text="Add Product",
            height=3,
            width=10,
            command=lambda: self.createProduct(ent_name.get(
            ), ent_description.get(), ent_category.get(), ent_cost.get(),
                                               ent_inventory.get()))
        lbl_name.pack()
        ent_name.pack()
        lbl_description.pack()
        ent_description.pack()
        lbl_category.pack()
        ent_category.pack()
        lbl_cost.pack()
        ent_cost.pack()
        lbl_inventory.pack()
        ent_inventory.pack()
        btn_submit.pack()

    def changeProduct(self, id):
        print("product Changed: " + str(id))

    def createProduct(self, name, description, category, cost, qty):
        productModule.createProduct(name, description, category, cost, qty)
        self.switchMain("Product List")

    def switchMain(self, name):
        self.productsList.pack_forget()
        self.productAdd.pack_forget()
        if (name == "Product List"):
            self.productsList = createListFrame(self.main, "Products",
                                                productModule.getAllProducts(),
                                                "No Products",
                                                "Change Product",
                                                self.changeProduct, [])
            self.productsList.pack()
        elif (name == "Add Product"):
            self.productAdd.pack()

        self.main.pack()
import dash
import dash_bootstrap_components as dbc
import dash_core_components as dcc
import dash_html_components as html

from navbar import Navbar
from sidebar import Sidebar
from dashboard import Dashboard

nav = Navbar()
side = Sidebar()
dashboard = Dashboard()

body = dbc.Container(
    [
        dbc.Row([
                    dbc.Col(html.Div(side), lg=2),
                    dbc.Col(html.Div(dashboard)),
        ])
    ],
    fluid=True
)


def Homepage():
    layout = html.Div([
    nav,
    body
    ])
    return layout
Exemple #23
0
class Application(Gtk.Window):
    def __init__(self):
        Gtk.Window.__init__(self)
        self.connect("destroy", self.on_quit)
        self.set_default_size(1000, 600)
        self.load_css()

        header_bar = Gtk.HeaderBar()
        header_bar.set_show_close_button(True)
        header_bar.props.title = "TVTracker"

        search_button = Gtk.ToggleButton()
        search_icon = Gtk.Image.new_from_icon_name("edit-find-symbolic", 4)

        search_button.add(search_icon)
        header_bar.pack_start(search_button)
        self.set_titlebar(header_bar)

        self.store = Store()

        box = Gtk.Box(Gtk.Orientation.HORIZONTAL)

        self.sidebar = Sidebar(self.store, search_button)
        self.sidebar.connect("notify::selected-show",
                             self.on_navigation_change)

        separator = Gtk.Separator()
        self.show_info = ShowInfo(self.store)
        self.show_info.connect("subscription_changed",
                               self.on_subscription_change)

        box.pack_start(self.sidebar, False, False, 0)
        box.pack_start(separator, False, False, 0)
        box.pack_start(self.show_info, True, True, 0)
        self.add(box)

    def on_quit(self, window=None):
        self.store.save_store()

        for filename in glob.glob("cache/temp_*.jpg"):
            os.remove(filename)

        Gtk.main_quit()

    def on_subscription_change(self, show_info_component, show_id,
                               is_subscribed):
        show = self.store.get_show_by_id(show_id)

        if is_subscribed == True:
            self.sidebar.add_item(show)
        else:
            self.sidebar.remove_item(show)

    def on_navigation_change(self, sidebar, selected_show_prop):

        selected_show_id = sidebar.get_property("selected_show")
        selected_show = self.store.get_show_by_id(selected_show_id)
        is_subscribed = self.store.is_show_subscribed(selected_show_id)

        self.show_info.set_id(selected_show["id"])
        self.show_info.set_name(selected_show["name"])
        self.show_info.set_status(selected_show["status"])
        self.show_info.set_rating(selected_show["rating"]["average"])
        self.show_info.set_summary(selected_show["summary"])
        self.show_info.set_genre(selected_show["genres"])
        self.show_info.set_episodes(selected_show["episodes"])
        self.show_info.set_subscribed(is_subscribed)

    def load_css(self):
        style_provider = Gtk.CssProvider()

        css = open('style.css', 'rb')
        data = css.read()
        css.close()

        style_provider.load_from_data(data)
        Gtk.StyleContext.add_provider_for_screen(
            Gdk.Screen.get_default(), style_provider,
            Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
Exemple #24
0
    def __init__(self, name, mem, email, top=None):
        '''This class configures and populates the toplevel window.
           top is the toplevel containing window.'''
        _bgcolor = '#d9d9d9'  # X11 color: 'gray85'
        _fgcolor = '#000000'  # X11 color: 'black'
        _compcolor = '#d9d9d9'  # X11 color: 'gray85'
        _ana1color = '#d9d9d9'  # X11 color: 'gray85'
        _ana2color = '#ececec'  # Closest X11 color: 'gray92'
        self.style = ttk.Style()
        if sys.platform == "win32":
            self.style.theme_use('winnative')
        self.style.configure('.', background=_bgcolor)
        self.style.configure('.', foreground=_fgcolor)
        self.style.configure('.', font="TkDefaultFont")
        self.style.map('.',
                       background=[('selected', _compcolor),
                                   ('active', _ana2color)])

        top.geometry("1280x686+297+168")
        top.minsize(120, 1)
        top.maxsize(3004, 1913)
        top.resizable(1, 1)
        top.title("New Toplevel")
        top.configure(background="#000040")
        top.configure(highlightbackground="#d9d9d9")
        top.configure(highlightcolor="#000000")

        top.resizable(False, False)
        img = ImageTk.PhotoImage(file="bg.png")
        self.Background = tk.Label(top, image=img)
        self.Background.place(relx=0, rely=0, height=1000, width=1500)
        self.Background = img

        self.menubar = tk.Menu(top,
                               font="TkMenuFont",
                               bg=_bgcolor,
                               fg=_fgcolor)
        top.configure(menu=self.menubar)

        ####################################################################Movies Slider###################################################################
        global d
        global to
        to = top
        img = ImageTk.PhotoImage(
            Image.open(d[0][0]).resize((560, 277), Image.ANTIALIAS))
        self.Movie_image = tk.Label(top, image=img)
        self.Movie_image.place(relx=0.202, rely=0.286, height=277, width=560)
        self.Movie_image = img

        self.Previous_b = tk.Button(top, command=lambda: self.bac(top))
        self.Previous_b.place(relx=0.172, rely=0.277, height=284, width=27)
        self.Previous_b.configure(activebackground="#000040")
        self.Previous_b.configure(activeforeground="white")
        self.Previous_b.configure(activeforeground="#ffffff")
        self.Previous_b.configure(background="#b3eaff")
        self.Previous_b.configure(disabledforeground="#a3a3a3")
        self.Previous_b.configure(
            font="-family {Segoe UI} -size 20 -weight bold")
        self.Previous_b.configure(foreground="#000000")
        self.Previous_b.configure(highlightbackground="#d9d9d9")
        self.Previous_b.configure(highlightcolor="black")
        self.Previous_b.configure(pady="0")
        self.Previous_b.configure(text='''<''')

        self.Next_b = tk.Button(top, command=lambda: self.ahead(top))
        self.Next_b.place(relx=0.648, rely=0.277, height=284, width=27)
        self.Next_b.configure(activebackground="#000040")
        self.Next_b.configure(activeforeground="white")
        self.Next_b.configure(activeforeground="#ffffff")
        self.Next_b.configure(background="#b3eaff")
        self.Next_b.configure(disabledforeground="#a3a3a3")
        self.Next_b.configure(font="-family {Segoe UI} -size 20 -weight bold")
        self.Next_b.configure(foreground="#000000")
        self.Next_b.configure(highlightbackground="#d9d9d9")
        self.Next_b.configure(highlightcolor="black")
        self.Next_b.configure(pady="0")
        self.Next_b.configure(text='''>''')

        #########################################################################################################################################

        ##########################################################Main##########################################################
        self.Label3 = tk.Label(top)
        self.Label3.place(relx=0.172, rely=0.131, height=48, width=193)
        self.Label3.configure(activebackground="#f9f9f9")
        self.Label3.configure(activeforeground="black")
        self.Label3.configure(background="#000040")
        self.Label3.configure(borderwidth="5")
        self.Label3.configure(disabledforeground="#a3a3a3")
        self.Label3.configure(font="-family {Segoe UI} -size 22")
        self.Label3.configure(foreground="#ffffff")
        self.Label3.configure(highlightbackground="#d9d9d9")
        self.Label3.configure(highlightcolor="black")
        self.Label3.configure(text='''Recommended!''')

        self.Movie_image = tk.Label(top)
        self.Movie_image.place(relx=0.202, rely=0.286, height=277, width=560)
        self.Movie_image.configure(activebackground="#f9f9f9")
        self.Movie_image.configure(activeforeground="black")
        self.Movie_image.configure(background="#d9d9d9")
        self.Movie_image.configure(disabledforeground="#a3a3a3")
        self.Movie_image.configure(foreground="#000000")
        self.Movie_image.configure(highlightbackground="#d9d9d9")
        self.Movie_image.configure(highlightcolor="black")

        self.Book_b = tk.Button(top)
        self.Book_b.place(relx=0.215, rely=0.752, height=54, width=177)
        self.Book_b.configure(activebackground="#000040")
        self.Book_b.configure(activeforeground="white")
        self.Book_b.configure(activeforeground="#ffffff")
        self.Book_b.configure(background="#b3eaff")
        self.Book_b.configure(disabledforeground="#a3a3a3")
        self.Book_b.configure(cursor="hand2")
        self.Book_b.configure(font="-family {Segoe UI} -size 14")
        self.Book_b.configure(foreground="#000000")
        self.Book_b.configure(highlightbackground="#d9d9d9")
        self.Book_b.configure(highlightcolor="black")
        self.Book_b.configure(pady="0")
        self.Book_b.configure(text='''Book Ticket!''')

        self.Description_f = tk.LabelFrame(top)
        self.Description_f.place(relx=0.357,
                                 rely=0.729,
                                 relheight=0.108,
                                 relwidth=0.287)
        self.Description_f.configure(relief='groove')
        self.Description_f.configure(foreground="black")
        self.Description_f.configure(background="#d9d9d9")
        #self.Description_f.configure(cursor="fleur")
        self.Description_f.configure(highlightbackground="#d9d9d9")
        self.Description_f.configure(highlightcolor="black")

        self.Description_l = tk.Label(self.Description_f)
        self.Description_l.place(relx=0.008,
                                 rely=0.041,
                                 height=72,
                                 width=360,
                                 bordermode='ignore')
        self.Description_l.configure(activebackground="#f9f9f9")
        self.Description_l.configure(activeforeground="black")
        self.Description_l.configure(anchor='nw')
        self.Description_l.configure(background="#000040")
        self.Description_l.configure(disabledforeground="#a3a3a3")
        self.Description_l.configure(font="-family {Segoe UI} -size 12")
        self.Description_l.configure(foreground="#ffffff")
        self.Description_l.configure(highlightbackground="#d9d9d9")
        self.Description_l.configure(highlightcolor="black")
        self.Description_l.configure(text='''Description''')

        self.Info_f = tk.LabelFrame(top)
        self.Info_f.place(relx=0.685,
                          rely=0.294,
                          relheight=0.389,
                          relwidth=0.122)
        self.Info_f.configure(relief='groove')
        self.Info_f.configure(foreground="black")
        self.Info_f.configure(background="#000040")
        self.Info_f.configure(highlightbackground="#d9d9d9")
        self.Info_f.configure(highlightcolor="black")

        self.Rating_l = tk.Label(self.Info_f)
        self.Rating_l.place(relx=0.045,
                            rely=0.026,
                            height=27,
                            width=146,
                            bordermode='ignore')
        self.Rating_l.configure(activebackground="#f9f9f9")
        self.Rating_l.configure(activeforeground="black")
        self.Rating_l.configure(background="#000040")
        self.Rating_l.configure(disabledforeground="#a3a3a3")
        self.Rating_l.configure(font="-family {Segoe UI} -size 14")
        self.Rating_l.configure(foreground="#ffffff")
        self.Rating_l.configure(highlightbackground="#d9d9d9")
        self.Rating_l.configure(highlightcolor="black")
        self.Rating_l.configure(text='''Rating''')

        self.TSeparator1 = ttk.Separator(self.Info_f)
        self.TSeparator1.place(relx=0.032,
                               rely=0.236,
                               relwidth=1.269,
                               bordermode='ignore')
        #####################################################Stars###########################################################

        self.Star1 = tk.Label(self.Info_f)
        self.Star1.place(relx=0.173,
                         rely=0.154,
                         height=14,
                         width=16,
                         bordermode='ignore')
        self.Star1.configure(activebackground="#f9f9f9")
        self.Star1.configure(activeforeground="black")
        self.Star1.configure(background="#000040")
        self.Star1.configure(disabledforeground="#a3a3a3")
        self.Star1.configure(foreground="#000000")
        self.Star1.configure(highlightbackground="#d9d9d9")
        self.Star1.configure(highlightcolor="black")

        self.Star2 = tk.Label(self.Info_f)
        self.Star2.place(relx=0.301,
                         rely=0.154,
                         height=14,
                         width=17,
                         bordermode='ignore')
        self.Star2.configure(activebackground="#f9f9f9")
        self.Star2.configure(activeforeground="black")
        self.Star2.configure(background="#000040")
        self.Star2.configure(disabledforeground="#a3a3a3")
        self.Star2.configure(foreground="#000000")
        self.Star2.configure(highlightbackground="#d9d9d9")
        self.Star2.configure(highlightcolor="black")

        self.Star3 = tk.Label(self.Info_f)
        self.Star3.place(relx=0.436,
                         rely=0.154,
                         height=14,
                         width=16,
                         bordermode='ignore')
        self.Star3.configure(activebackground="#f9f9f9")
        self.Star3.configure(activeforeground="black")
        self.Star3.configure(background="#000040")
        self.Star3.configure(disabledforeground="#a3a3a3")
        self.Star3.configure(foreground="#000000")
        self.Star3.configure(highlightbackground="#d9d9d9")
        self.Star3.configure(highlightcolor="black")

        self.Star4 = tk.Label(self.Info_f)
        self.Star4.place(relx=0.564,
                         rely=0.154,
                         height=14,
                         width=16,
                         bordermode='ignore')
        self.Star4.configure(activebackground="#f9f9f9")
        self.Star4.configure(activeforeground="black")
        self.Star4.configure(background="#000040")
        self.Star4.configure(disabledforeground="#a3a3a3")
        self.Star4.configure(foreground="#000000")
        self.Star4.configure(highlightbackground="#d9d9d9")
        self.Star4.configure(highlightcolor="black")

        self.Star5 = tk.Label(self.Info_f)
        self.Star5.place(relx=0.699,
                         rely=0.154,
                         height=14,
                         width=16,
                         bordermode='ignore')
        self.Star5.configure(activebackground="#f9f9f9")
        self.Star5.configure(activeforeground="black")
        self.Star5.configure(background="#000040")
        self.Star5.configure(disabledforeground="#a3a3a3")
        self.Star5.configure(foreground="#000000")
        self.Star5.configure(highlightbackground="#d9d9d9")
        self.Star5.configure(highlightcolor="black")

        #######################################################################################################################################

        self.Cast_l = tk.Label(self.Info_f)
        self.Cast_l.place(relx=0.045,
                          rely=0.558,
                          height=109,
                          width=145,
                          bordermode='ignore')
        self.Cast_l.configure(activebackground="#f9f9f9")
        self.Cast_l.configure(activeforeground="black")
        self.Cast_l.configure(anchor='nw')
        self.Cast_l.configure(background="#000040")
        self.Cast_l.configure(disabledforeground="#a3a3a3")
        self.Cast_l.configure(font="-family {Segoe UI} -size 12")
        self.Cast_l.configure(foreground="#ffffff")
        self.Cast_l.configure(highlightbackground="#d9d9d9")
        self.Cast_l.configure(highlightcolor="black")
        self.Cast_l.configure(text='''Cast''')

        self.Genre_l = tk.Label(self.Info_f)
        self.Genre_l.place(relx=0.045,
                           rely=0.277,
                           height=48,
                           width=145,
                           bordermode='ignore')
        self.Genre_l.configure(activebackground="#f9f9f9")
        self.Genre_l.configure(activeforeground="black")
        self.Genre_l.configure(background="#000040")
        self.Genre_l.configure(disabledforeground="#a3a3a3")
        self.Genre_l.configure(font="-family {Segoe UI} -size 13")
        self.Genre_l.configure(foreground="#ffffff")
        self.Genre_l.configure(highlightbackground="#d9d9d9")
        self.Genre_l.configure(highlightcolor="black")
        self.Genre_l.configure(text='''Genre''')

        self.TSeparator3 = ttk.Separator(top)
        self.TSeparator3.place(relx=0.165, rely=0.168, relheight=0.845)
        self.TSeparator3.configure(orient="vertical")

        self.Label8 = tk.Label(top)
        self.Label8.place(relx=0.172, rely=0.204, height=42, width=547)
        self.Label8.configure(activebackground="#f9f9f9")
        self.Label8.configure(activeforeground="black")
        self.Label8.configure(anchor='w')
        self.Label8.configure(background="#000040")
        self.Label8.configure(disabledforeground="#a3a3a3")
        self.Label8.configure(font="-family {Segoe UI} -size 20")
        self.Label8.configure(foreground="#ffffff")
        self.Label8.configure(highlightbackground="#d9d9d9")
        self.Label8.configure(highlightcolor="black")
        self.Label8.configure(text='''Title''')

        self.Label9 = tk.Label(top)
        self.Label9.place(relx=0.60, rely=0.204, height=42, width=547)
        self.Label9.configure(activebackground="#f9f9f9")
        self.Label9.configure(activeforeground="black")
        self.Label9.configure(anchor='w')
        self.Label9.configure(background="#000040")
        self.Label9.configure(disabledforeground="#a3a3a3")
        self.Label9.configure(font="-family {Segoe UI} -size 20")
        self.Label9.configure(foreground="#ffffff")
        self.Label9.configure(highlightbackground="#d9d9d9")
        self.Label9.configure(highlightcolor="black")
        self.Label9.configure(text='''UA/A''')

        Searchbar.__init__(self, top=None)
        Memberbar.__init__(self, mem, top=None)
        Homebar.__init__(self, name, mem, top=None)
        Sidebar.__init__(self, top=None)
Exemple #25
0
class App:
    def __init__(self, s):
        self.board_ = Board(s.boardsize_)

        self.robots_ = []
        for i in range(s.robots_):
            self.robots_.append(
                Robot(COLORS[i], rd(s.boardsize_), rd(s.boardsize_)))
        Robot.validate_positions(self.board_, self.robots_)

        self.target_ = Target(s.boardsize_, self.board_, self.robots_)

        if (s.test_rounds_ > 0):
            self.test_rounds_ = s.test_rounds_
        else:
            self.test_rounds_ = 0

        self.players_ = s.assign_players()

        self.graphics_ = GraphicalBoard(s.boardsize_)
        self.sidebar_ = Sidebar(self.graphics_, self.players_)
        self.games_to_win_ = 7

    def KeyToDir(self, key):
        if key == pygame.K_UP:
            return "NORTH"
        elif key == pygame.K_DOWN:
            return "SOUTH"
        elif key == pygame.K_RIGHT:
            return "EAST"
        elif key == pygame.K_LEFT:
            return "WEST"
        else:
            return "NOT SUPPORTED"

    def Run(self):
        self.graphics_.drawBoardState(self.board_, self.robots_, self.target_)
        self.sidebar_.drawScoreboard(self.players_)
        self.sidebar_.displayMessage(["Click a player name to select."])
        game_over = False

        while True:
            pygame.time.delay(100)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.display.quit()
                    pygame.quit()
                    exit()
                if event.type == pygame.MOUSEBUTTONDOWN and not game_over:
                    # get mouse input to determine player
                    current_player, other_player = self.sidebar_.DeterminePlayer(
                        event.pos)
                    if current_player == None:
                        break

                    # copy robot position for second player to try to find a better solution
                    robot_start_position = copy.deepcopy(self.robots_)

                    self.sidebar_.displayMessage(
                        ["Click a robot and move", " with arrow keys."])

                    # execute the moves of the current player
                    cp_move_count = current_player.execute_moves(
                        self, 10, "Manhattan Distance")
                    if cp_move_count == FAILURE or cp_move_count == TIME_CUTOFF or cp_move_count == DEPTH_CUTOFF:
                        print('{cp} was not able to reach the target. If {op} can find a solution, they win the round.'\
                            .format(cp=current_player.name_, op=other_player.name_))
                        cp_move_count = float("inf")
                    else:
                        print('{cp} was able to reach the target in {count} moves. {op} gets 1 minute to find a better solution.'\
                            .format(cp=current_player.name_, count=cp_move_count, op=other_player.name_))
                    pygame.time.delay(1000)

                    # reset board to the original, before any moves in the round
                    self.sidebar_.switchPlayer()
                    first_player_robots = self.robots_
                    self.robots_ = robot_start_position
                    self.graphics_.drawBoardState(self.board_, self.robots_,
                                                  self.target_)

                    # execute moves of the other player
                    op_move_count = other_player.execute_moves(
                        self, 10, "Manhattan Distance")
                    if op_move_count == FAILURE or op_move_count == TIME_CUTOFF or op_move_count == DEPTH_CUTOFF:
                        print('{op} was not able to reach the target.'\
                            .format(count=op_move_count, op=other_player.name_))
                        op_move_count = float("inf")
                    else:
                        print('{op} was able to reach the target in {count} moves.'\
                            .format(count=op_move_count, op=other_player.name_))
                    pygame.time.delay(1000)

                    # deselect all players, and calculate the score of the round
                    self.sidebar_.noPlayer()
                    if op_move_count < cp_move_count:
                        other_player.score_ += 1
                        print('{op} won the round.'.format(
                            op=other_player.name_))
                    elif cp_move_count == float(
                            "inf") and op_move_count == float("inf"):
                        self.robots = robot_start_position
                        self.sidebar_.displayMessage([
                            "Neither player found a",
                            "solution, no points awarded"
                        ])
                        pygame.time.delay(3000)
                    else:
                        current_player.score_ += 1
                        print('{cp} won the round.'.format(
                            cp=current_player.name_))
                        self.robots_ = first_player_robots

                    # reset move counters
                    for p in self.players_:
                        p.move_count_ = 0

                    # final messages of the round
                    self.sidebar_.displayMessage(
                        ["Round complete.", "Click a player name to select."])
                    self.sidebar_.drawScoreboard(self.players_)

                    # check if a player won
                    for p in self.players_:
                        if p.score_ == self.games_to_win_:
                            self.sidebar_.displayMessage(
                                ["{p} wins!".format(p=p.name_)])
                            game_over = True

                    # reset the target location
                    self.target_.set_target(self.board_, self.robots_)
                    self.graphics_.drawBoardState(self.board_, self.robots_,
                                                  self.target_)

    def Run_Test(self, limit=None, heuristic=None):
        self.graphics_.drawBoardState(self.board_, self.robots_, self.target_)

        test_csv_file = open('test_csvs/test.csv', mode='a+')
        csv_writer = csv.writer(test_csv_file, delimiter=';')

        csv_writer.writerow([])
        csv_writer.writerow([
            'AI', 'Board Size', 'Robots', 'Iteration', 'Outcome', 'Moves',
            'Nodes Expanded'
        ])

        successes = 0
        total_moves = 0
        total_nodes_expanded = 0

        for i in range(self.test_rounds_):
            pygame.time.delay(100)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    pygame.display.quit()
                    pygame.quit()
                    exit()

            current_player = self.players_[0]

            AI_name = current_player.name_
            if (heuristic != None):
                AI_name = current_player.name_ + " - " + str(heuristic)
            if (limit != 0 and limit != None):
                AI_name = current_player.name_ + " - " + str(limit)

            print("\n\nRunning test " + str(i + 1))

            cp_move_count = current_player.execute_moves(
                self, limit, heuristic)
            if (cp_move_count == FAILURE or cp_move_count == TIME_CUTOFF
                    or cp_move_count == DEPTH_CUTOFF):
                print('{cp} expanded {nodes} nodes.'.format(
                    cp=AI_name, nodes=current_player.nodes_expanded_))
                csv_writer.writerow([
                    AI_name, self.board_.boardsize_,
                    len(self.robots_), i + 1, cp_move_count
                ])
            else:
                successes += 1
                total_moves += cp_move_count
                total_nodes_expanded += current_player.nodes_expanded_
                print('{cp} was able to reach the target in {count} moves.'.
                      format(cp=AI_name, count=cp_move_count))
                print(
                    '{cp} expanded {nodes} nodes to find the solution.'.format(
                        cp=AI_name, nodes=current_player.nodes_expanded_))
                csv_writer.writerow([
                    AI_name, self.board_.boardsize_,
                    len(self.robots_), i + 1, 'SUCCESS', cp_move_count,
                    current_player.nodes_expanded_
                ])
            pygame.time.delay(1000)

            self.target_.set_target(self.board_, self.robots_)
            self.graphics_.drawBoardState(self.board_, self.robots_,
                                          self.target_)
        test_csv_file.close()
        print("Finished test")
        if (successes == 0):
            results = [
                AI_name,
                str(self.board_.boardsize_),
                str(len(self.robots_)),
                str(0)
            ]
        else:
            results = [
                AI_name,
                str(self.board_.boardsize_),
                str(len(self.robots_)),
                str(successes / self.test_rounds_),
                str(total_moves / successes),
                str(total_nodes_expanded / successes)
            ]
        return results
class Graphics(object):
    def load_graphics(self):
        #default floor tile
        self.floor = pygame.image.load("graphics/floor_small.png").convert()
        
        #vertical, horizontal and fill walls
        self.wall_v = pygame.image.load("graphics/wall_v_small.png").convert()
        self.wall_h = pygame.image.load("graphics/wall_h_small.png").convert()
        self.wall_c = pygame.image.load("graphics/wall_c.png").convert()
        
        #robots and flags
        self.robots={"yellow":pygame.image.load("graphics/robot_yellow_small.png").convert(),
                         "red":pygame.image.load("graphics/robot_red_small.png").convert(),
                         "green":pygame.image.load("graphics/robot_green_small.png").convert(),
                         "blue":pygame.image.load("graphics/robot_blue_small.png").convert(),
                         "silver":pygame.image.load("graphics/robot_silver_small.png").convert()}
                         
        self.flags={"yellow":pygame.image.load("graphics/flag_yellow_small.png").convert(),
                        "red":pygame.image.load("graphics/flag_red_small.png").convert(),
                        "green":pygame.image.load("graphics/flag_green_small.png").convert(),
                        "blue":pygame.image.load("graphics/flag_blue_small.png").convert(),
                        "rainbow":pygame.image.load("graphics/flag_rainbow_small.png").convert()}
            
        #sidebar
        #title
        self.title = pygame.image.load("graphics/title.png").convert()      
        
        #dimensions for drawing
        self.tilesize = self.floor.get_width()
        self.wallsize = self.wall_c.get_width()
        self.sidebar_width = self.title.get_width()
    
    def __init__(self, gridsize, boardsize):
        #initialise display for converting pixel format of images
        self.screen=pygame.display.set_mode()
        
        #load images and set dimensions
        self.load_graphics()
        
        self.screensize = width, height = gridsize*self.tilesize + (gridsize+1)*self.wallsize + self.sidebar_width,gridsize*self.tilesize+(gridsize+1)*self.wallsize
        self.sidebar_rect = pygame.Rect(width-self.sidebar_width,0,self.sidebar_width,height)
        self.speed = 2 #pixels per frame
        self.black=0,0,0
        self.background=200,200,200
        self.screen=pygame.display.set_mode(self.screensize)
        pygame.display.set_caption("Ricochet Robots")
    
    def redraw_flag(self,board):
        self.screen.blit(self.flags[board.flag_colour],getXYGridOffset(board.flagloc[0],board.flagloc[1],self))
        pygame.display.flip()
    
    def redraw_robots(self,board):    
        for colour in board.robot_colours:
            self.screen.blit(self.robots[colour],getXYGridOffset(board.robots[colour].position[0],board.robots[colour].position[1],self))        
        pygame.display.flip()
        
    
    def draw_initial_board(self,board):
        #clear any previous game state
        self.screen.fill(self.background)  
        
        #sidebar - check if already exists in case of board reset
        if hasattr(self, 'sidebar'):
            self.sidebar.__init__(self,board)
        else:
            self.sidebar=Sidebar(self,board)        
        
        #draw
        for i in range(board.gridsize):
            for j in range(board.gridsize):
                self.screen.blit(self.floor,
                            (self.wallsize+i*(self.tilesize+self.wallsize),
                             self.wallsize+j*(self.tilesize+self.wallsize)))
        
        #set walls
        for i in range(board.boardsize):
            for j in range(board.boardsize):
                if board.boardstate[i,j]==1:
                    #horizontal, vertical or gap?
                    if i%2==0:
                        if j%2==0:
                            #gap
                            self.screen.blit(self.wall_c,
                                             (getXYOffset(i,j,self)))
                        else:
                            self.screen.blit(self.wall_h,
                                             (getXYOffset(i,j,self)))
                    else:
                        self.screen.blit(self.wall_v,
                                         (getXYOffset(i,j,self)))
                        
        #draw flag
        self.redraw_flag(board)
                
        #draw robot(s) at their turn start positions, which should be same as current in all cases
        self.robot_rects={}
        for colour in board.robot_colours:
            self.screen.blit(self.robots[colour],getXYGridOffset(board.robots[colour].position[0],board.robots[colour].position[1],self))
            self.robot_rects[colour]=self.robots[colour].get_rect()
            self.robot_rects[colour]=self.robot_rects[colour].move(getXYGridOffset(board.robots[colour].position[0],board.robots[colour].position[1],self))
        
        pygame.display.flip()
        
    def animate(self,board,key):                
        #check for reset (pressed r)
        if key in (pygame.K_r,pygame.K_n,pygame.K_f,pygame.K_u):
            self.draw_initial_board(board)
            return
               
        #check for show flags (pressed s)
        if key==pygame.K_s:
            self.redraw_flag(board)
            return
            
        #check for victory state - only allows reset options unless still needs to do the final animation to reach that state
        if board.victory and ((self.robot_rects[board.active_robot].left,self.robot_rects[board.active_robot].top)==getXYGridOffset(board.flagloc[0],board.flagloc[1],self)):
            if key not in (pygame.K_r,pygame.K_n,pygame.K_f,pygame.K_u,pygame.K_s):
                return        
        
        #find active robot
        robot=board.robots[board.active_robot]
        #image
        robot_image=self.robots[board.active_robot]
        #copy of active rectangle - must update before returning
        robotrect=self.robot_rects[board.active_robot]
        #ensure info pane has correct info
        if key in (pygame.K_1,pygame.K_2,pygame.K_3,pygame.K_4,pygame.K_5,pygame.K_KP1,pygame.K_KP2,pygame.K_KP3,pygame.K_KP4,pygame.K_KP5):
            self.sidebar.update_active_text(board.active_robot) 
            
        #determine number of frames from speed and difference between new robot position and old
        xnew,ynew=getXYGridOffset(robot.position[0],
                                    robot.position[1],
                                    self)
                                    
        xold,yold=getXYGridOffset(robot.last_position[0],
                                    robot.last_position[1],
                                    self)
            
        nframes=get_n_frames(xold,yold,xnew,ynew,self.speed)
                
        #case when no movement - do nothing
        if nframes==0:
            return
        
        #check whether flag needs including in animation
        draw_flag=check_flag_between_grid_locations(board.flagloc,tuple(robot.position),tuple(robot.last_position))
        flagloc=getXYGridOffset(board.flagloc[0],board.flagloc[1],self)
        
        #set lag to slow movement
        frame_delay=4
        
        if key == pygame.K_LEFT:
            #print 'left pressed'
            velocity=(-self.speed,0)
            #animate
            for frame in range(nframes):
                #fill rectangle with background - rectangle skips edge walls
                animation_rect = (xnew,ynew,xold-xnew+self.tilesize,self.tilesize)
                self.screen.fill(self.background,animation_rect)
                #draw floor (and flag when necessary) then robot in new location
                for i in range(1+robot.last_position[1]-robot.position[1]):
                    #print robot.position, robot.last_position, i
                    self.screen.blit(self.floor,
                                (self.wallsize+(robot.position[1]+i-1)*(self.tilesize+self.wallsize),
                                 self.wallsize+(robot.position[0]-1)*(self.tilesize+self.wallsize)))
                if draw_flag:
                    self.screen.blit(self.flags[board.flag_colour],flagloc)
                robotrect=robotrect.move(velocity)
                self.screen.blit(robot_image,robotrect)
                #pygame.display.flip()
                pygame.display.update(animation_rect)
                #slow animation down
                pygame.time.wait(frame_delay)
                       
        elif key == pygame.K_RIGHT:
            velocity=(self.speed,0)
            #animate
            for frame in range(nframes):
                #fill rectangle with background - rectangle skips edge walls
                animation_rect = (xold,ynew,xnew-xold+self.tilesize,self.tilesize)
                self.screen.fill(self.background,animation_rect)
                #draw floor (and flag when necessary) then robot in new location
                for i in range(1+robot.position[1]-robot.last_position[1]):
                    #print robot.position, robot.last_position, i
                    self.screen.blit(self.floor,
                                (self.wallsize+(robot.last_position[1]+i-1)*(self.tilesize+self.wallsize),
                                 self.wallsize+(robot.last_position[0]-1)*(self.tilesize+self.wallsize)))
                if draw_flag:
                    self.screen.blit(self.flags[board.flag_colour],flagloc)
                robotrect=robotrect.move(velocity)
                self.screen.blit(robot_image,robotrect)
                #pygame.display.flip()
                pygame.display.update(animation_rect)
                #slow animation down
                pygame.time.wait(frame_delay)            
        elif key == pygame.K_UP:
            velocity=(0,-self.speed)
            #animate
            for frame in range(nframes):
                #fill rectangle with background - rectangle skips edge walls
                animation_rect = (xnew,ynew,self.tilesize,yold-ynew+self.tilesize)
                self.screen.fill(self.background,animation_rect)
                #draw floor (and flag when necessary) then robot in new location
                for i in range(1+robot.last_position[0]-robot.position[0]):
                    #print robot.position, robot.last_position, i
                    self.screen.blit(self.floor,
                                (self.wallsize+(robot.position[1]-1)*(self.tilesize+self.wallsize),
                                 self.wallsize+(robot.position[0]+i-1)*(self.tilesize+self.wallsize)))
                if draw_flag:
                    self.screen.blit(self.flags[board.flag_colour],flagloc)
                robotrect=robotrect.move(velocity)
                self.screen.blit(robot_image,robotrect)
                #pygame.display.flip()
                pygame.display.update(animation_rect)
                #slow animation down
                pygame.time.wait(frame_delay)            
        elif key == pygame.K_DOWN:
            velocity=(0,self.speed)
            #animate
            for frame in range(nframes):
                #fill rectangle with background - rectangle skips edge walls
                animation_rect = (xnew,yold,self.tilesize,ynew-yold+self.tilesize)
                self.screen.fill(self.background,animation_rect)
                #draw floor (and flag when necessary) then robot in new location
                for i in range(1+robot.position[0]-robot.last_position[0]):
                    #print robot.position, robot.last_position, i
                    self.screen.blit(self.floor,
                                (self.wallsize+(robot.last_position[1]-1)*(self.tilesize+self.wallsize),
                                 self.wallsize+(robot.last_position[0]+i-1)*(self.tilesize+self.wallsize)))
                if draw_flag:
                    self.screen.blit(self.flags[board.flag_colour],flagloc)
                robotrect=robotrect.move(velocity)
                self.screen.blit(robot_image,robotrect)
                #pygame.display.flip()
                pygame.display.update(animation_rect)
                #slow animation down
                pygame.time.wait(frame_delay)              
        else:
            return
        
        #update moves taken and final robot rectangle
        self.sidebar.update_moves_text(board.moves_taken)
        self.robot_rects[board.active_robot]=robotrect
                
        return
            

            
            
Exemple #27
0
    def __init__(self, view, model, res_id=False, domain=[], context={}, action=None, fields=None):
        super(ViewTree, self).__init__(name='view_tree', action=action)

        self.model = view['model']
        self.domain2 = domain or []
        self.context = context or {}
        self.domain = []
        
        fields_info = dict(fields)

        self.field_parent = view.get("field_parent") or None

        if self.field_parent:
            self.domain = domain

        self.view = view
        self.view_id = view['view_id']

        proxy = rpc.RPCProxy(self.model)

        ctx = dict(self.context,
                   **rpc.session.context)
                
        dom = xml.dom.minidom.parseString(view['arch'].encode('utf-8'))

        root = dom.childNodes[0]
        attrs = node_attributes(root)
        self.string = attrs.get('string', 'Unknown')
        self.toolbar = attrs.get('toolbar', False)

        ids = []
        id = res_id
        
        colors = {}
        for color_spec in attrs.get('colors', '').split(';'):
            if color_spec:
                colour, test = color_spec.split(':')
                colors[colour] = test
                
        if self.toolbar:
            ids = proxy.search(self.domain2, 0, 0, 0, ctx)
            self.toolbar = proxy.read(ids, ['name', 'icon'], ctx)

            if not id and ids:
                id = ids[0]

            if id:
                ids = proxy.read([id], [self.field_parent], ctx)[0][self.field_parent]
        elif not ids:
            ids = proxy.search(domain, 0, 0, 0, ctx)

        self.headers = []
        self.parse(root, fields)

        self.tree = treegrid.TreeGrid(name="tree_%d" % (id),
                                      model=self.model,
                                      headers=self.headers,
                                      url=url("/openerp/tree/data"),
                                      ids=ids,
                                      domain=self.domain,
                                      context=self.context,
                                      field_parent=self.field_parent,
                                      onselection="onSelection",
                                      fields_info=fields_info,
                                      colors=colors)
        self.id = id
        self.ids = ids

        toolbar = {}
        for item, value in view.get('toolbar', {}).items():
            if value: toolbar[item] = value
        if toolbar:
            self.sidebar = Sidebar(self.model, None, toolbar, context=self.context)

        # get the correct view title
        self.string = self.context.get('_terp_view_name', self.string) or self.string
    def __init__(self):
        wx.Frame.__init__(self, None, title='OpenVPN Connector')

        self.CreateStatusBar()
        #Create multi-panel UI
        self.mainpanel = wx.Panel(self)
        mainsizer = wx.BoxSizer(wx.VERTICAL)
        splitter = wx.SplitterWindow(self.mainpanel)  #horizontal
        subsplitter = wx.SplitterWindow(splitter)  #vertical
        self.subsplitter = subsplitter
        # top_sizer = wx.BoxSizer(wx.HORIZONTAL)
        # top_panel = wx.Panel(subsplitter)

        self.sidebar = Sidebar(subsplitter)
        sidebarMenu = [("Configs", Configs), ("Command Flags", Flags),
                       ("Preferences", Preferences)]

        self.subpanels = {}
        for name, pnl in sidebarMenu:
            panel = pnl(self.subsplitter)
            panel.Hide()
            # top_sizer.Add(panel, 2, wx.ALL|wx.EXPAND, 2)
            self.subpanels[name] = panel
        self.subpanels["Configs"].Show()
        # self.currentpanel = self.subpanels["Configs"]
        # top_panelthe.SetSizer(top_sizer)

        #the bottom_sizer contains buttons and controls
        bottom_sizer = wx.BoxSizer(wx.HORIZONTAL)
        bottom_panel = wx.Panel(splitter)

        txt = Output(bottom_panel)

        control_grid = wx.GridSizer(cols=3)
        for label in [
                "Clear", "Export", "Reconnect", "Disconnect", "Force Reconnect"
        ]:
            btn = wx.Button(bottom_panel, label=label)
            btn.Bind(wx.EVT_BUTTON, self.OnButton)
            control_grid.Add(btn, 0, wx.ALL | wx.EXPAND, 2)
        # self.text = wx.StaticText(bottom_panel,label="Connection: None")
        # bottom_sizer.Add(self.text, 5, wx.ALL|wx.EXPAND, 2)

        bottom_sizer.Add(txt, 2, wx.ALL | wx.EXPAND, 2)
        bottom_sizer.Add(control_grid, 1, wx.ALL | wx.EXPAND, 2)
        bottom_panel.SetSizer(bottom_sizer)

        # mainsizer.Add(top_panel, 3, wx.ALL|wx.EXPAND, 0)
        # mainsizer.Add(bottom_panel, 1, wx.ALL|wx.EXPAND, 0)

        subsplitter.SplitVertically(self.sidebar, self.subpanels["Configs"])
        subsplitter.SetSashGravity(0.3)
        splitter.SplitHorizontally(subsplitter, bottom_panel)
        splitter.SetSashGravity(0.7)

        # mainsizer.Add(subsplitter, 1, wx.ALL|wx.EXPAND, 0)
        mainsizer.Add(splitter, 1, wx.ALL | wx.EXPAND, 5)
        self.mainsizer = mainsizer
        self.mainpanel.SetSizer(mainsizer)
        self.mainsizer.Fit(self)
        self.SetMinSize(self.GetBestSize())
        self.Show()

        # if reconnect == "1":
        # self.on.Disable()
        # if lastconnection != "0":
        # print("connecting to last used connection")
        # SubCall(lastconnection)
        # else:
        # self.off.Disable()

        #pub-sub
        pub.subscribe(self.DoConnect, "DoConnect")
        pub.subscribe(self.PubSubChangeMainPanel, "PubSubChangeMainPanel")

        #Timers
        self.log_timer = wx.Timer(self)
        self.Bind(wx.EVT_TIMER, self.OnLogTimer, self.log_timer)
        self.log_read = 0
Exemple #29
0
class Edistor(QPlainTextEdit):
    """ QPlainTextEdit implementation

        This class is the base of editor

        Highlight current line method:
            @color: string color
            @alpha: int
    """

    def __init__(self):
        QPlainTextEdit.__init__(self)
        self.position_margin = QFontMetricsF(
            self.document().defaultFont()).width("#") * 80
        # Margin line
        self._margin = False
        # Sidebar
        self.sidebar = Sidebar(self)
        # Highlight current line
        self._color_current_line = QColor('lightblue')
        self._alpha_current_line = self._color_current_line.setAlpha(50)
        # Connection
        self.connect(self, SIGNAL("blockCountChanged(int)"),
                    self.sidebar.update_area_width)
        self.connect(self, SIGNAL("updateRequest(const QRect&, int)"),
                    self.sidebar.update_area)
        self.connect(self, SIGNAL("cursorPositionChanged()"),
                    self._highlight_current_line)

        self._highlight_current_line()

    def margin(self, show=False):
        """ Set the margin line """
        if show:
            self._margin = Margin()

    def paintEvent(self, e):
        QPlainTextEdit.paintEvent(self, e)
        if self._margin:
            qp = QPainter()
            qp.begin(self.viewport())
            qp.setPen(self._margin.color)
            offset = self.contentOffset()
            qp.drawLine(self.position_margin + offset.x(), 0,
                        self.position_margin + offset.x(),
                        self.viewport().height())
            qp.end()

    def highlightCurrentLine(self, color, alpha):
        self._color_current_line = QColor(color)
        self._alpha_current_line = self._color_current_line.setAlpha(alpha)
        self._highlight_current_line()

    def _highlight_current_line(self):
        self.extra_selections = []
        selection = QTextEdit.ExtraSelection()
        selection.format.setBackground(self._color_current_line)
        selection.format.setProperty(
            QTextFormat.FullWidthSelection, QVariant(True))
        selection.cursor = self.textCursor()
        selection.cursor.clearSelection()
        self.extra_selections.append(selection)
        self.setExtraSelections(self.extra_selections)

    def resizeEvent(self, e):
        QPlainTextEdit.resizeEvent(self, e)
        cr = self.contentsRect()
        self.sidebar.setGeometry(QRect(cr.left(), cr.top(),
                                self.sidebar.width(), cr.height()))
    def __init__(self, params, **kw):

        super(ViewForm, self).__init__(**kw)

        # save reference of params dictionary in requeste
        cherrypy.request.terp_params = params
        cherrypy.request.terp_fields = []
        self.notebook_tab = params.notebook_tab or 0
        self.context_menu = params.get('context_menu')
        editable = params.editable
        readonly = params.readonly

        if editable is None:
            editable = True

        if readonly is None:
            readonly = False

        self.is_dashboard = getattr(cherrypy.request, '_terp_dashboard', False)

        self.search = None
        search_param = params.search_domain or []
        params_domain = params.domain or []
        for element in params_domain:
            if element not in search_param:
                if not isinstance(element, tuple):
                    search_param.append(element)
                else:
                    key, op, value = element
                    search_param.append((key, op, value))

        cherrypy.request.custom_search_domain = []
        cherrypy.request.custom_filter_domain = []

        if params.view_type in ('tree', 'graph'):
            search_view_id = False
            if params and '_terp_search_view' in params:
                if not params.search_view and params.context:
                    search_view_id = params.context.get('search_view')

            self.search = Search(source=params.source,
                                 model=params.model,
                                 domain=search_param,
                                 context=params.context,
                                 values=params.search_data or {},
                                 filter_domain=params.filter_domain or [],
                                 search_view=params.search_view,
                                 group_by_ctx=params.group_by_ctx or [],
                                 **{
                                     'clear': params.get('_terp_clear'),
                                     'search_view_id': search_view_id
                                 })

            cherrypy.request.custom_search_domain = self.search.listof_domain or []
            cherrypy.request.custom_filter_domain = self.search.custom_filter_domain or []
            params.search_domain = self.search.listof_domain
            params.filter_domain = self.search.custom_filter_domain
            params.group_by_ctx = self.search.groupby

        self.screen = Screen(prefix='',
                             hastoolbar=True,
                             hassubmenu=True,
                             editable=editable,
                             readonly=readonly,
                             selectable=params.selectable or 2)

        if self.screen.widget and self.screen.view_type in ['form', 'tree']:
            self.logs = Logs()

        if self.screen.widget and hasattr(self.screen.widget, 'sidebar'):
            self.sidebar = self.screen.widget.sidebar
        else:
            if params.target != 'new' and not self.screen.is_dashboard and not self.screen.is_wizard and (
                    len(params.view_mode) > 1 or 'tree' in params.view_mode):
                self.sidebar = Sidebar(self.screen.model,
                                       self.screen.submenu,
                                       self.screen.toolbar,
                                       self.screen.id,
                                       self.screen.view_type,
                                       context=self.screen.context)

        if params.view_type == 'tree':
            self.screen.id = False

        if 'form' not in self.screen.view_mode and not isinstance(
                self.screen.widget, ListGroup):
            self.screen.widget.link = 0
            self.screen.editable = False
            self.screen.widget.editable = False

        # get the correct view title
        if params.context:
            self.screen.string = params.context.get('_terp_view_name',
                                                    self.screen.string)
        self.screen.string = self.screen.string

        # get the actual pager data
        self.limit = self.screen.limit
        self.offset = self.screen.offset
        self.count = self.screen.count

        self.search_domain = params.search_domain
        self.search_data = params.search_data
        self.filter_domain = params.filter_domain or []

        if params.hidden_fields:
            self.hidden_fields = params.hidden_fields
Exemple #31
0
    def __init__(self, top=None):
        '''This class configures and populates the toplevel window.
           top is the toplevel containing window.'''
        _bgcolor = '#d9d9d9'  # X11 color: 'gray85'
        _fgcolor = '#000000'  # X11 color: 'black'
        _compcolor = '#d9d9d9'  # X11 color: 'gray85'
        _ana1color = '#d9d9d9'  # X11 color: 'gray85'
        _ana2color = '#ececec'  # Closest X11 color: 'gray92'
        self.style = ttk.Style()
        if sys.platform == "win32":
            self.style.theme_use('winnative')
        self.style.configure('.', background=_bgcolor)
        self.style.configure('.', foreground=_fgcolor)
        self.style.configure('.', font="TkDefaultFont")
        self.style.map('.',
                       background=[('selected', _compcolor),
                                   ('active', _ana2color)])

        top.geometry("1280x686+212+135")
        top.minsize(120, 1)
        top.maxsize(3004, 1913)
        top.resizable(1, 1)
        top.title("New Toplevel")
        top.configure(background="#000040")
        top.configure(highlightbackground="#d9d9d9")
        top.configure(highlightcolor="#000000")

        top.resizable(False, False)
        global img
        img = ImageTk.PhotoImage(file="bg.png")
        self.Background = tk.Label(top, image=img)
        self.Background.place(relx=0, rely=0, height=900, width=1200)
        self.Background = img

        self.menubar = tk.Menu(top,
                               font="TkMenuFont",
                               bg=_bgcolor,
                               fg=_fgcolor)
        top.configure(menu=self.menubar)

        ################################################################Result instance############################################################
        self.Movie1 = tk.Frame(top)
        self.Movie1.place(relx=0.18,
                          rely=0.233,
                          relheight=0.138,
                          relwidth=0.621)

        self.Movie1.configure(relief='groove')
        self.Movie1.configure(borderwidth="2")
        self.Movie1.configure(relief="groove")
        self.Movie1.configure(background="#00002b")

        self.Image1 = tk.Label(self.Movie1)
        self.Image1.place(relx=0.025, rely=0.095, height=73, width=135)
        self.Image1.configure(background="#d9d9d9")
        self.Image1.configure(disabledforeground="#a3a3a3")
        self.Image1.configure(foreground="#000000")
        self.Image1.configure(text='''image''')

        self.Description1 = tk.Label(self.Movie1)
        self.Description1.place(relx=0.239, rely=0.095, height=73, width=573)
        self.Description1.configure(anchor='nw')
        self.Description1.configure(background="#00002b")
        self.Description1.configure(cursor="fleur")
        self.Description1.configure(disabledforeground="#a3a3a3")
        self.Description1.configure(font="-family {Segoe UI} -size 12")
        self.Description1.configure(foreground="#bcfbfe")
        self.Description1.configure(text='''description''')

        ##############################################################################################################################################

        ##################################################################scroller########################################################
        self.Previous = tk.Button(top)
        self.Previous.place(relx=0.383, rely=0.933, height=24, width=47)
        self.Previous.configure(activebackground="#ececec")
        self.Previous.configure(activeforeground="#000000")
        self.Previous.configure(background="#b4eafe")
        self.Previous.configure(disabledforeground="#a3a3a3")
        self.Previous.configure(font="-family {Segoe UI} -size 15")
        self.Previous.configure(foreground="#000000")
        self.Previous.configure(highlightbackground="#d9d9d9")
        self.Previous.configure(highlightcolor="black")
        self.Previous.configure(pady="0")
        self.Previous.configure(text='''<''')

        self.Next = tk.Button(top)
        self.Next.place(relx=0.57, rely=0.933, height=24, width=47)
        self.Next.configure(activebackground="#ececec")
        self.Next.configure(activeforeground="#000000")
        self.Next.configure(background="#b4eafe")
        self.Next.configure(disabledforeground="#a3a3a3")
        self.Next.configure(font="-family {Segoe UI} -size 15")
        self.Next.configure(foreground="#000000")
        self.Next.configure(highlightbackground="#d9d9d9")
        self.Next.configure(highlightcolor="black")
        self.Next.configure(pady="0")
        self.Next.configure(text='''>''')

        self.Page_list = tk.Label(top)
        self.Page_list.place(relx=0.43, rely=0.933, height=21, width=164)
        self.Page_list.configure(activebackground="#f0f0f0f0f0f0")
        self.Page_list.configure(background="#000040")
        self.Page_list.configure(disabledforeground="#a3a3a3")
        self.Page_list.configure(font="-family {Segoe UI} -size 12")
        self.Page_list.configure(foreground="#b4eafe")
        self.Page_list.configure(text='''1 of 4''')

        Searchbar.__init__(self, top=None)
        Memberbar.__init__(self, top=None)
        Homebar.__init__(self, top=None)
        Sidebar.__init__(self, top=None)
class ShellView(gtk.TextView):
    __gsignals__ = {}

    sidebar_open = gobject.property(type=bool, default=False)

    def __init__(self, buf):
        self.edit_only = buf.worksheet.edit_only

        if not self.edit_only:
            buf.worksheet.sig_chunk_inserted.connect( self.on_chunk_inserted )
            buf.worksheet.sig_chunk_changed.connect( self.on_chunk_changed )
            buf.worksheet.sig_chunk_status_changed.connect( self.on_chunk_status_changed )
            buf.worksheet.sig_chunk_deleted.connect( self.on_chunk_deleted )
            buf.worksheet.sig_state.connect( self.on_notify_state )

            # Track changes to update completion
            buf.connect_after('insert-text', self.on_after_insert_text)
            buf.connect_after('delete-range', self.on_after_delete_range)
            buf.connect_after('end-user-action', self.on_after_end_user_action)

            self.__inserted_in_user_action = False
            self.__deleted_in_user_action = False

        if not self.edit_only:
            self.sidebar = Sidebar()
        else:
            self.sidebar = None

        buf.connect('add-custom-result', self.on_add_custom_result)
        buf.connect('add-sidebar-results', self.on_add_sidebar_results)
        buf.connect('remove-sidebar-results', self.on_remove_sidebar_results)
        buf.connect('pair-location-changed', self.on_pair_location_changed)
            
        gtk.TextView.__init__(self, buf)
        if not self.edit_only:
            self.set_border_window_size(gtk.TEXT_WINDOW_LEFT, LEFT_MARGIN_WIDTH)
        self.set_left_margin(2)

        # Attach a "behavior object" to the view which, by ugly hacks, makes it
        # do simply and reasonable things for cut-and-paste and DND
        sanitize_textview_ipc.sanitize_view(self)

        self.add_events(gtk.gdk.LEAVE_NOTIFY_MASK)

        self.__completion_popup = CompletionPopup(self)
        self.__doc_popup = DocPopup()
        self.__mouse_over_object = None
        self.__mouse_over_timeout = None

        self.__mouse_over_start = buf.create_mark(None, buf.get_start_iter(), True)

        self.__arg_highlight_start = None
        self.__arg_highlight_end = None
        buf.connect('mark-set', self.on_mark_set)

        self.__cursor_chunk = None
        self.__scroll_to_result = False
        self.__scroll_to = buf.create_mark(None, buf.get_start_iter(), True)
        self.__scroll_idle = None

        self.__update_sidebar_positions_idle = 0
        self.__pixels_below_buffer = 0
        self.__last_chunk = None

        self.connect('destroy', self.on_destroy)

    def __get_worksheet_line_yrange(self, line):
        buffer_line = self.get_buffer().pos_to_iter(line)
        return self.get_line_yrange(buffer_line)

    def __get_chunk_yrange(self, chunk, include_padding=False, include_results=False):
        # include_padding: whether to include pixels_above/pixels_below
        # include_results: whether to include the results of the chunk

        y, _ = self.__get_worksheet_line_yrange(chunk.start)
        end_y, end_height = self.__get_worksheet_line_yrange(chunk.end - 1)
        height = end_y + end_height - y

        if isinstance(chunk, StatementChunk) and chunk.results_end_mark is not None:
            if include_results:
                buf = self.get_buffer()
                end_iter = buf.get_iter_at_mark(chunk.results_end_mark)
                end_line_y, end_line_height = self.get_line_yrange(end_iter)
                height = end_line_y + end_line_height - y

                if not include_padding:
                    y += chunk.pixels_above
                    height -= chunk.pixels_above + chunk.pixels_below
            else:
                # In this case, pixels_below is part of the results, which we don't include
                if not include_padding:
                    y += chunk.pixels_above
                    height -= chunk.pixels_above
        elif not include_padding:
            y += chunk.pixels_above
            height -= chunk.pixels_above + chunk.pixels_below

        return y, height

    def __get_worksheet_line_at_y(self, y, adjust):
        buf = self.get_buffer()
        (buffer_line, _) = self.get_line_at_y(y)
        return buf.iter_to_pos(buffer_line, adjust)[0]

    def paint_chunk(self, cr, area, chunk, fill_color, outline_color):
        buf = self.get_buffer()

        chunk_y, chunk_height = self.__get_chunk_yrange(chunk)

        _, window_y = self.buffer_to_window_coords(gtk.TEXT_WINDOW_LEFT, 0, chunk_y)
        cr.rectangle(area.x, window_y, area.width, chunk_height)
        cr.set_source_rgb(*fill_color)
        cr.fill()

        cr.rectangle(0.5, window_y + 0.5, LEFT_MARGIN_WIDTH - 1, chunk_height - 1)
        cr.set_source_rgb(*outline_color)
        cr.set_line_width(1)
        cr.stroke()

    def do_realize(self):
        gtk.TextView.do_realize(self)

        if not self.edit_only:
            self.get_window(gtk.TEXT_WINDOW_LEFT).set_background(self.style.white)

        # While the the worksheet is executing, we want to display a watch cursor
        # Trying to override the cursor setting of GtkTextView is really hard because
        # of things like hiding the cursor when typing, so we take the simple approach
        # of using an input-only "cover window" that we set the cursor on and
        # show on top of the GtkTextView's normal window.

        self.__watch_window = gtk.gdk.Window(self.window,
                                             self.allocation.width, self.allocation.height,
                                             gtk.gdk.WINDOW_CHILD,
                                             (gtk.gdk.SCROLL_MASK |
                                              gtk.gdk.BUTTON_PRESS_MASK |
                                              gtk.gdk.BUTTON_RELEASE_MASK |
                                              gtk.gdk.POINTER_MOTION_MASK |
                                              gtk.gdk.POINTER_MOTION_HINT_MASK),
                                             gtk.gdk.INPUT_ONLY,
                                             x=0, y=0)
        self.__watch_window.set_cursor(gtk.gdk.Cursor(gtk.gdk.WATCH))
        self.__watch_window.set_user_data(self)

        if self.get_buffer().worksheet.state == NotebookFile.EXECUTING:
            self.__watch_window.show()
            self.__watch_window.raise_()

    def on_destroy(self, obj):
        self.__completion_popup.destroy()
        self.__completion_popup = None
        self.__doc_popup.destroy()
        self.__doc_popup = None

        if self.__scroll_idle is not None:
            glib.source_remove(self.__scroll_idle)

    def do_unrealize(self):
        self.__watch_window.set_user_data(None)
        self.__watch_window.destroy()
        self.__watch_window = None

        gtk.TextView.do_unrealize(self)

    def do_size_allocate(self, allocation):
        gtk.TextView.do_size_allocate(self, allocation)
        if (self.flags() & gtk.REALIZED) != 0:
            self.__watch_window.resize(allocation.width, allocation.height)

    def __iterate_expose_chunks(self, event):
        _, start_y = self.window_to_buffer_coords(gtk.TEXT_WINDOW_LEFT, 0, event.area.y)
        start_line = self.__get_worksheet_line_at_y(start_y, adjust=ADJUST_AFTER)

        _, end_y = self.window_to_buffer_coords(gtk.TEXT_WINDOW_LEFT, 0, event.area.y + event.area.height - 1)
        end_line = self.__get_worksheet_line_at_y(end_y, adjust=ADJUST_BEFORE)

        return self.get_buffer().worksheet.iterate_chunks(start_line, end_line + 1)

    def __expose_window_left(self, event):
        cr = event.window.cairo_create()

        for chunk in self.__iterate_expose_chunks(event):
            if isinstance(chunk, StatementChunk):
                if chunk.executing:
                    self.paint_chunk(cr, event.area, chunk, (0, 1, 0), (0, 0.5, 0))
                elif chunk.error_message is not None:
                    self.paint_chunk(cr, event.area, chunk, (1, 0, 0), (0.5, 0, 0))
                elif chunk.needs_compile:
                    self.paint_chunk(cr, event.area, chunk, (1, 1, 0), (0.5, 0.5, 0))
                elif chunk.needs_execute:
                    self.paint_chunk(cr, event.area, chunk, (1, 0, 1), (0.5, 0, 0.5))
                else:
                    self.paint_chunk(cr, event.area, chunk, (0, 0, 1), (0, 0, 0.5))

    def __draw_rect_outline(self, event, rect):
        if (rect.y + rect.height <= event.area.y or rect.y >= event.area.y + event.area.height):
            return

        cr = event.window.cairo_create()
        cr.set_line_width(1.)
        cr.rectangle(rect.x + 0.5, rect.y + 0.5, rect.width - 1, rect.height - 1)
        cr.set_source_rgb(0.6, 0.6, 0.6)
        cr.stroke()

    def __expose_arg_highlight(self, event):
        buf = self.get_buffer()

        # We want a rectangle enclosing the range between arg_highlight_start and
        # arg_highlight_end; the method here isn't correct in the presence of
        # RTL text, but the necessary Pango functionality isn't exposed to
        # a GtkTextView user. RTL code is rare. We also don't handle multiple-line
        # highlight regions right. (Return ends the highlight, so you'd need to paste)
        rect = self.get_iter_location(buf.get_iter_at_mark (self.__arg_highlight_start))
        rect.x, rect.y = self.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT,
                                                      rect.x, rect.y)
        rect.width = 0
        end_rect = self.get_iter_location(buf.get_iter_at_mark (self.__arg_highlight_end))
        end_rect.x, end_rect.y = self.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT,
                                                              end_rect.x, end_rect.y)
        end_rect.width = 0

        rect = rect.union(end_rect)

        self.__draw_rect_outline(event, rect)

    def __expose_pair_location(self, event):
        pair_location = self.get_buffer().get_pair_location()
        if pair_location is None:
            return
        
        rect = self.get_iter_location(pair_location)

        rect.x, rect.y = self.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT, rect.x, rect.y)

        self.__draw_rect_outline(event, rect)

    def __line_boundary_in_selection(self, line):
        buf = self.get_buffer()

        try:
            line_iter = buf.pos_to_iter(line)
        except IndexError:
            return

        sel_start, sel_end = buf.get_selection_bounds()
        return sel_start.compare(line_iter) < 0 and sel_end.compare(line_iter) >= 0

    def __expose_padding_areas(self, event):
        buf = self.get_buffer()

        # This is a fixup for the padding areas we add to chunks when leaving
        # space for sidebar widgets - gtk.TextView draws these areas as part
        # of the chunk that is being padded (so partially selected when the
        # line is partially selected.) This just looks wrong, so we paint over
        # that so that padding areas are _between_ lines.

        cr = event.window.cairo_create()

        left_margin = self.get_property('left-margin')
        right_margin = self.get_property('right-margin')
        selection_left, _ = self.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT,
                                                         left_margin, 0)
        window_width, _ = event.window.get_size()
        # 1 here is gtktextview.c:SPACE_FOR_CURSOR - padding on the right for the cursor
        selection_width = window_width - left_margin - right_margin - 1

        for chunk in self.__iterate_expose_chunks(event):
            if chunk.pixels_above != 0 or chunk.pixels_below != 0:
                total_y, total_height = self.__get_chunk_yrange(chunk, include_padding=True, include_results=True)
                no_pad_y, no_pad_height = self.__get_chunk_yrange(chunk, include_padding=False, include_results=True)
                _, total_y = self.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT, 0, total_y)
                _, no_pad_y = self.buffer_to_window_coords(gtk.TEXT_WINDOW_TEXT, 0, no_pad_y)

                if chunk.pixels_above != 0:
                    cr.rectangle(selection_left, total_y,
                                 selection_width, no_pad_y - total_y)
                    if self.__line_boundary_in_selection(chunk.start):
                        cr.set_source_color(self.style.base[gtk.STATE_SELECTED])
                    else:
                        cr.set_source_color(self.style.base[self.state])
                    cr.fill()

                if chunk.pixels_below != 0:
                    cr.rectangle(selection_left, no_pad_y + no_pad_height,
                                 selection_width, total_y + total_height - (no_pad_y + no_pad_height))
                    if self.__line_boundary_in_selection(chunk.end):
                        cr.set_source_color(self.style.base[gtk.STATE_SELECTED])
                    else:
                        cr.set_source_color(self.style.base[self.state])
                    cr.fill()

    def __update_last_chunk(self, new_last_chunk):
        buf = self.get_buffer()

        if self.__last_chunk and self.__pixels_below_buffer != 0:
            buf.set_pixels_below(self.__last_chunk, 0)

        self.__last_chunk = new_last_chunk
        if self.__pixels_below_buffer != 0:
            buf.set_pixels_below(self.__last_chunk, self.__pixels_below_buffer)

    def __set_pixels_below_buffer(self, pixels_below):
        self.set_pixels_below_lines(pixels_below)
        self.get_buffer().set_pixels_below(self.__last_chunk, pixels_below)
        self.__pixels_below_buffer = pixels_below

    def __update_sidebar_positions(self):
        # Each StatementChunk with sidebar widgets has already been added as a "slot"
        # to the sidebar. For each of these slots we determine a vertical
        # range which includes the StatementChunk, and any preceding CommentChunk.
        #
        # We also handle adding space before slots with sidebar widgets and at the end
        # of the buffer so that previous sidebar widgets have enough room.
        #
        # Rather than trying to update things incrementally, we just run
        # through the chunks in the buffer twice and compute the positions from
        # scratch.

        self.__update_sidebar_positions_idle = 0
        buf = self.get_buffer()

        set_chunks = set()
        widget_end_y = None

        slots = self.sidebar.slots
        if len(slots) > 0:
            self.sidebar.freeze_positions()

            # Main position loop where we determine the slot positions
            #
            # The "slot_extra" here is the number of pixels inside the slot which were
            # added as chunk_above/chunk_below in previous runs of this code and will
            # be removed unless we add them again in this run.

            slot_index = 0
            for chunk in buf.worksheet.iterate_chunks(0, slots[-1].chunk.end):
                if chunk == slots[slot_index].chunk:
                    if slot_start_chunk is None:
                        slot_start_chunk = chunk
                        slot_extra = chunk.pixels_above + chunk.pixels_below
                    else:
                        slot_extra += chunk.pixels_above + chunk.pixels_below

                    slot_start_y, _ = self.__get_chunk_yrange(slot_start_chunk,
                                                              include_results=True, include_padding=True)

                    chunk_start_y, chunk_height =  self.__get_chunk_yrange(chunk,
                                                                           include_results=True, include_padding=True)
                    slot_height = chunk_start_y + chunk_height - slot_start_y - slot_extra

                    if widget_end_y is not None and widget_end_y > slot_start_y:
                        buf.set_pixels_above(slot_start_chunk, widget_end_y - slot_start_y)
                        set_chunks.add(slot_start_chunk)
                        slot_start_y = widget_end_y

                    slots[slot_index].set_position(slot_start_y, slot_height)

                    widget_end_y = slot_start_y + slots[slot_index].get_results_height()
                    slot_index += 1
                    slot_start_chunk = None
                else:
                    if isinstance(chunk, CommentChunk):
                        slot_start_chunk = chunk
                        slot_extra = chunk.pixels_above + chunk.pixels_below
                    elif isinstance(chunk, StatementChunk):
                        slot_start_chunk = None
                    elif slot_start_chunk is not None:
                        slot_extra += chunk.pixels_above + chunk.pixels_below

            self.sidebar.thaw_positions()

        # Any chunk we where didn't assign pixels_above needs to have pixels_above
        # set back to zero - it might have been set for some previous pass
        for chunk in buf.worksheet.iterate_chunks():
            if chunk.pixels_above != 0 and not chunk in set_chunks:
                buf.set_pixels_above(chunk, 0)

        # Finally, add space at the end of the buffer, if necessary

        pixels_below = 0
        if widget_end_y is not None:
            end_line_y, end_line_height = self.get_line_yrange(buf.get_end_iter())
            end_y = end_line_y + end_line_height - self.__pixels_below_buffer
            if widget_end_y > end_y:
                pixels_below = widget_end_y - end_y

        self.__set_pixels_below_buffer(pixels_below)

        return False

    def __queue_update_sidebar_positions(self, before_resize=False):

        # We want to position the sidebar results with respect to the buffer
        # contents, so position has to be done after validation finishes, but there
        # is no hook to figure that out for gtk.TextView(). So, what we do is
        # that we figure that if anything _interesting_ gets repositioned there
        # will be an expose event, and in the expose event, add an idle that
        # is low enough priority to run after validation finishes.
        #
        # Now, in the positioning process, we actually _modify_ the buffer
        # contents by adding space above chunks to give previoous sidebar
        # results enough room. This produces a quasi-circular dependency
        # and a loop - but since the addition of space modifies the layout
        # in a predictable way, we can just subtract that back out. What we
        # expect to happen is:
        #
        #  - Buffer modification
        #  - Expose event
        #  - Our idle runs, we compute positions, and add space
        #  - Expose event
        #  - Our idle runs, we compute positions, compensating for the added
        #    space; the new computation is the same, and nothing further happens.
        #
        # (If there is a bug in the compensation code, an infinite loop will
        # be triggered.)

        if len(self.sidebar.slots) == 0 and self.__pixels_below_buffer == 0:
            return

        if before_resize and self.__update_sidebar_positions_idle != 0:
            glib.source_remove(self.__update_sidebar_positions_idle)
            self.__update_sidebar_positions_idle = 0

        if self.__update_sidebar_positions_idle == 0:
            if before_resize:
                priority = PRIORITY_SIDEBAR_BEFORE_RESIZE
            else:
                priority = PRIORITY_SIDEBAR_AFTER_VALIDATE

            self.__update_sidebar_positions_idle = glib.idle_add(self.__update_sidebar_positions,
                                                                 priority=priority)

    def do_expose_event(self, event):
        buf = self.get_buffer()

        if not self.edit_only and event.window == self.get_window(gtk.TEXT_WINDOW_LEFT):
            self.__queue_update_sidebar_positions()
            self.__expose_window_left(event)
            return False

        gtk.TextView.do_expose_event(self, event)

        if event.window == self.get_window(gtk.TEXT_WINDOW_TEXT):
            if self.__arg_highlight_start:
                self.__expose_arg_highlight(event)
            else:
                self.__expose_pair_location(event)
            if buf.get_has_selection():
                self.__expose_padding_areas(event)

        return False

    # This is likely overengineered, since we're going to try as hard as possible not to
    # have tabs in our worksheets. We don't do the funky handling of \f.
    def __count_indent(self, text):
        indent = 0
        for c in text:
            if c == ' ':
                indent += 1
            elif c == '\t':
                indent += 8 - (indent % 8)
            else:
                break

        return indent

    def __find_outdent(self, iter):
        buf = self.get_buffer()
        line, _ = buf.iter_to_pos(iter)

        current_indent = self.__count_indent(buf.worksheet.get_line(line))

        while line > 0:
            line -= 1
            line_text = buf.worksheet.get_line(line)
            # Empty lines don't establish indentation
            if ALL_WHITESPACE_RE.match(line_text):
                continue

            indent = self.__count_indent(line_text)
            if indent < current_indent:
                return re.match(r"^[\t ]*", line_text).group(0)

        return ""

    def __find_default_indent(self, iter):
        buf = self.get_buffer()
        line, offset = buf.iter_to_pos(iter)

        while line > 0:
            line -= 1
            chunk = buf.worksheet.get_chunk(line)
            if isinstance(chunk, StatementChunk):
                return chunk.tokenized.get_next_line_indent(line - chunk.start)
            elif isinstance(chunk, CommentChunk) or isinstance(chunk, BlankChunk):
                return " " * self.__count_indent(buf.worksheet.get_line(line))

        return ""

    def __reindent_line(self, iter, indent_text):
        buf = self.get_buffer()
        insert_mark = buf.get_insert()

        line, pos = buf.iter_to_pos(iter, adjust=ADJUST_NONE)
        if line == None:
            return

        line_text = buf.worksheet.get_line(line)
        prefix = re.match(r"^[\t ]*", line_text).group(0)

        diff = self.__count_indent(indent_text) - self.__count_indent(prefix)
        if diff == 0:
            return 0

        common_len = 0
        for a, b in zip(prefix, indent_text):
            if a != b:
                break
            common_len += 1
    
        start = iter.copy()
        start.set_line_offset(common_len)
        end = iter.copy()
        end.set_line_offset(len(prefix))

        # Nitpicky-detail. If the selection starts at the start of the line, and we are
        # inserting white-space there, then the whitespace should be *inside* the selection
        mark_to_start = None
        if common_len == 0 and buf.get_has_selection():
            if buf.get_iter_at_mark(insert_mark).compare(start) == 0:
                mark_to_start = mark
                
            mark = buf.get_selection_bound()
            if buf.get_iter_at_mark(mark).compare(start) == 0:
                mark_to_start = mark
        
        buf.delete(start, end)
        buf.insert(end, indent_text[common_len:])

        if mark_to_start is not None:
            end.set_line_offset(0)
            buf.move_mark(mark_to_start, end)

        insert_iter = buf.get_iter_at_mark(insert_mark)
        insert_line, _ = buf.iter_to_pos(insert_iter, adjust=ADJUST_NONE)
        if insert_line == line:
            # We shifted the insertion cursor around behind gtk.TextView's back,
            # by inserting text on the same line; this will result in a wrong
            # virtual cursor position. Calling buf.place_cursor() will cause
            # the virtual cursor position to be reset to the proper value.
            buf.place_cursor(insert_iter)

        return diff

    def __reindent_selection(self, outdent):
        buf = self.get_buffer()

        bounds = buf.get_selection_bounds()
        if bounds == ():
            insert_mark = buf.get_insert()
            bounds = buf.get_iter_at_mark(insert_mark), buf.get_iter_at_mark(insert_mark)
        start, end = bounds

        line, _ = buf.iter_to_pos(start, adjust=ADJUST_AFTER)
        end_line, end_offset = buf.iter_to_pos(end, adjust=ADJUST_BEFORE)
        if end_offset == 0 and end_line > line:
            end_line -= 1

        iter = buf.pos_to_iter(line)

        if outdent:
            indent_text = self.__find_outdent(iter)
        else:
            indent_text = self.__find_default_indent(iter)

        diff = self.__reindent_line(iter, indent_text)

        if not buf.get_has_selection():
            iter = buf.get_iter_at_mark(buf.get_insert())
            if iter.get_line_offset() < len(indent_text):
                iter.set_line_offset(len(indent_text))
                buf.place_cursor(iter)

        while True:
            line += 1
            if line > end_line:
                return

            iter = buf.pos_to_iter(line)
            current_indent = self.__count_indent(buf.worksheet.get_line(line))
            self.__reindent_line(iter, max(0, " " * (current_indent + diff)))

    def __hide_completion(self):
        if self.__completion_popup.showing:
            self.__completion_popup.popdown()
            
    def do_focus_out_event(self, event):
        self.__hide_completion()
        self.__doc_popup.popdown()
        return gtk.TextView.do_focus_out_event(self, event)

    def __rewrite_window(self, event):
        # Mouse events on the "watch window" that covers the text view
        # during calculation need to be forwarded to the real text window
        # since it looks bad if keynav works, but you can't click on the
        # window to set the cursor, select text, and so forth

        if event.window == self.__watch_window:
            event.window = self.get_window(gtk.TEXT_WINDOW_TEXT)

        # Events on the left-margin window also get written so the user can
        # click there when starting a drag selection. We need to adjust the
        # X coordinate in that case
        if not self.edit_only and event.window == self.get_window(gtk.TEXT_WINDOW_LEFT):
            event.window = self.get_window(gtk.TEXT_WINDOW_TEXT)
            if event.type == gtk.gdk._3BUTTON_PRESS:
                # Workaround for http://bugzilla.gnome.org/show_bug.cgi?id=573664
                event.x = 50.
            else:
                event.x -= LEFT_MARGIN_WIDTH

    def do_button_press_event(self, event):
        self.__rewrite_window(event)

        self.__doc_popup.popdown()

        return gtk.TextView.do_button_press_event(self, event)

    def do_button_release_event(self, event):
        self.__rewrite_window(event)

        return gtk.TextView.do_button_release_event(self, event)

    def do_motion_notify_event(self, event):
        self.__rewrite_window(event)

        return gtk.TextView.do_motion_notify_event(self, event)

    def __remove_arg_highlight(self, cursor_to_end=True):
        buf = self.get_buffer()

        end = buf.get_iter_at_mark (self.__arg_highlight_end)

        buf.delete_mark(self.__arg_highlight_start)
        self.__arg_highlight_start = None
        buf.delete_mark(self.__arg_highlight_end)
        self.__arg_highlight_end = None

        if cursor_to_end:
            # If the arg_highlight ends at closing punctuation, skip over it
            tmp = end.copy()
            tmp.forward_char()
            text = buf.get_slice(end, tmp)

            if text in (")", "]", "}"):
                buf.place_cursor(tmp)
            else:
                buf.place_cursor(end)

    def do_key_press_event(self, event):
        buf = self.get_buffer()

        if self.__completion_popup.focused and self.__completion_popup.on_key_press_event(event):
            return True
        
        if self.__doc_popup.focused:
            self.__doc_popup.on_key_press_event(event)
            return True

        if not self.edit_only and event.keyval in (gtk.keysyms.F2, gtk.keysyms.KP_F2):
            self.__hide_completion()

            if self.__doc_popup.showing:
                self.__doc_popup.focus()
            else:
                self.show_doc_popup(focus_popup=True)

            return True

        if not self.__arg_highlight_start:
            self.__doc_popup.popdown()
        
        if event.keyval in (gtk.keysyms.KP_Enter, gtk.keysyms.Return):
            self.__hide_completion()

            if self.__arg_highlight_start:
                self.__remove_arg_highlight()
                self.__doc_popup.popdown()
                return True
            
            increase_indent = False
            insert = buf.get_iter_at_mark(buf.get_insert())
            line, pos = buf.iter_to_pos(insert, adjust=ADJUST_NONE)

            # Inserting return inside a ResultChunk would normally do nothing
            # but we want to make it insert a line after the chunk
            if line is None and not buf.get_has_selection():
                line, pos = buf.iter_to_pos(insert, adjust=ADJUST_BEFORE)
                iter = buf.pos_to_iter(line, -1)
                buf.place_cursor(iter)
                buf.insert_interactive(iter, "\n", True)
                
                return True

            buf.begin_user_action()
            
            gtk.TextView.do_key_press_event(self, event)
            # We need the chunks to be updated when computing the line indents
            buf.worksheet.rescan()

            insert = buf.get_iter_at_mark(buf.get_insert())
            
            self.__reindent_line(insert, self.__find_default_indent(insert))

            # If we have two comment lines in a row, assume a block comment
            if (line > 0 and
                isinstance(buf.worksheet.get_chunk(line), CommentChunk) and
                isinstance(buf.worksheet.get_chunk(line - 1), CommentChunk)):
                self.get_buffer().insert_interactive_at_cursor("# ", True)

            buf.end_user_action()
                
            return True
        elif event.keyval in (gtk.keysyms.Tab, gtk.keysyms.KP_Tab) and event.state & gtk.gdk.CONTROL_MASK == 0:
            buf.begin_user_action()
            self.__reindent_selection(outdent=False)
            buf.end_user_action()

            return True
        elif event.keyval == gtk.keysyms.ISO_Left_Tab and event.state & gtk.gdk.CONTROL_MASK == 0:
            buf.begin_user_action()
            self.__reindent_selection(outdent=True)
            buf.end_user_action()

            return True
        elif event.keyval == gtk.keysyms.space and event.state & gtk.gdk.CONTROL_MASK != 0:
            if self.__completion_popup.showing:
                if self.__completion_popup.spontaneous:
                    self.__completion_popup.popup(spontaneous=False)
                else:
                    self.__completion_popup.popdown()
            else:
                if self.__doc_popup.showing:
                    self.__doc_popup.popdown()
                self.__completion_popup.popup(spontaneous=False)
            return True
        elif event.keyval in (gtk.keysyms.z, gtk.keysyms.Z) and \
                (event.state & gtk.gdk.CONTROL_MASK) != 0 and \
                (event.state & gtk.gdk.SHIFT_MASK) == 0:
            buf.worksheet.undo()
            
            return True
        # This is the gedit/gtksourceview binding to cause your hands to fall off
        elif event.keyval in (gtk.keysyms.z, gtk.keysyms.Z) and \
                (event.state & gtk.gdk.CONTROL_MASK) != 0 and \
                (event.state & gtk.gdk.SHIFT_MASK) != 0:
            buf.worksheet.redo()
            
            return True
        # This is the familiar binding (Eclipse, etc). Firefox supports both
        elif event.keyval in (gtk.keysyms.y, gtk.keysyms.Y) and event.state & gtk.gdk.CONTROL_MASK != 0:
            buf.worksheet.redo()

            return True
        
        return gtk.TextView.do_key_press_event(self, event)

    def __show_mouse_over(self):
        self.__mouse_over_timeout = None
        
        if self.__completion_popup.showing:
            return
        
        self.__doc_popup.set_target(self.__mouse_over_object)
        location = self.get_buffer().get_iter_at_mark(self.__mouse_over_start)
        self.__doc_popup.position_at_location(self, location)
        self.__doc_popup.popup()

        return False
        
    def __stop_mouse_over(self):
        if self.__mouse_over_timeout:
            glib.source_remove(self.__mouse_over_timeout)
            self.__mouse_over_timeout = None
            
        self.__mouse_over_object = None
        
    def do_motion_notify_event(self, event):
        # Successful mousing-over depends on knowing the types of symbols so doing the
        # checks are pointless in edit-only mode
        if not self.edit_only and event.window == self.get_window(gtk.TEXT_WINDOW_TEXT) and not self.__doc_popup.focused:
            buf = self.get_buffer()
            
            x, y = self.window_to_buffer_coords(gtk.TEXT_WINDOW_TEXT, int(event.x), int(event.y))
            iter, _ = self.get_iter_at_position(x, y)
            line, offset = buf.iter_to_pos(iter, adjust=ADJUST_NONE)
            if line is not None:
                obj, start_line, start_offset, _,_ = buf.worksheet.get_object_at_location(line, offset)
            else:
                obj = None

            if not obj is self.__mouse_over_object:
                self.__stop_mouse_over()
                self.__doc_popup.popdown()
                if obj is not None:
                    start = buf.pos_to_iter(start_line, start_offset)
                    buf.move_mark(self.__mouse_over_start, start)

                    self.__mouse_over_object = obj
                    try:
                        timeout = self.get_settings().get_property('gtk-tooltip-timeout')
                    except TypeError: # GTK+ < 2.12
                        timeout = 500
                    self.__mouse_over_timeout = glib.timeout_add(timeout, self.__show_mouse_over)
                
        return gtk.TextView.do_motion_notify_event(self, event)

    def do_leave_notify_event(self, event):
        self.__stop_mouse_over()
        if not self.__doc_popup.focused:
            self.__doc_popup.popdown()
        return False

    def do_backspace(self):
        buf = self.get_buffer()
        
        if buf.get_has_selection():
            return gtk.TextView.do_backspace(self)

        insert = buf.get_iter_at_mark(buf.get_insert())
        line, offset = buf.iter_to_pos(insert)
        
        current_chunk = buf.worksheet.get_chunk(line)
        if isinstance(current_chunk, StatementChunk) or isinstance(current_chunk, BlankChunk):
            line_text = buf.worksheet.get_line(line)[0:offset]

            if re.match(r"^[\t ]+$", line_text) and not (line > 0 and self.is_continued(line - 1)):
                self.__reindent_selection(outdent=True)
                return
                       
        return gtk.TextView.do_backspace(self)

    def is_continued(self, line):
        """Determine if line causes a continuation."""
        buf = self.get_buffer()
        chunk = buf.worksheet.get_chunk(line)
        while not isinstance(chunk, StatementChunk) and line > 0:
            line -= 1
            chunk = buf.worksheet.get_chunk(line)
        return isinstance(chunk, StatementChunk) and chunk.tokenized.is_continued(line - chunk.start)

    def __invalidate_status(self, chunk):
        buf = self.get_buffer()
        
        chunk_y, chunk_height = self.__get_chunk_yrange(chunk, include_padding=True)

        _, window_y = self.buffer_to_window_coords(gtk.TEXT_WINDOW_LEFT, 0, chunk_y)

        if self.window:
            left_margin_window = self.get_window(gtk.TEXT_WINDOW_LEFT)
            left_margin_window.invalidate_rect((0, window_y, LEFT_MARGIN_WIDTH, chunk_height),
                                               False)

    def on_chunk_inserted(self, worksheet, chunk):
        buf = self.get_buffer()

        self.__invalidate_status(chunk)
        if chunk.end == buf.worksheet.get_line_count():
            self.__update_last_chunk(chunk)

    def on_chunk_changed(self, worksheet, chunk, changed_lines):
        self.__invalidate_status(chunk)

    def on_chunk_status_changed(self, worksheet, chunk):
        self.__invalidate_status(chunk)
        
        if self.__cursor_chunk == chunk and not chunk.executing:
            # This is the chunk with the cursor and it's done executing
            self.__scroll_idle = glib.idle_add(self.scroll_result_onscreen,
                                               priority=PRIORITY_SCROLL_RESULT_ONSCREEN)

    def scroll_result_onscreen(self):
        """Scroll so that both the insertion cursor and the following result
        are onscreen.  If we cannot get both, get as much of the result while
        still getting the insertion cursor."""

        buf = self.get_buffer()
        if self.__scroll_to_result:
            if self.__cursor_chunk.sidebar_results:
                # We assume that we don't have both sidebar and normal results
                for slot in self.sidebar.slots:
                    if slot.chunk == self.__cursor_chunk:
                        self.sidebar.scroll_to_slot_results(slot)
                        break
            else:
                try:
                    iter = buf.pos_to_iter(self.__cursor_chunk.end) # Start of next chunk
                except IndexError:
                    iter = buf.get_end_iter()
                else:
                    iter.backward_line() # Move to line before start of next chunk

                buf.move_mark(self.__scroll_to, iter)
                self.scroll_mark_onscreen(self.__scroll_to)

        self.scroll_mark_onscreen(buf.get_insert())

        self.__cursor_chunk = None
        self.__scroll_idle = None
        return False

    def on_chunk_deleted(self, worksheet, chunk):
        buf = self.get_buffer()

        if self.__cursor_chunk == chunk:
            self.__cursor_chunk = None
            if self.__scroll_idle is not None:
                glib.source_remove(self.__scroll_idle)
            self.__scroll_idle = None

        if self.__last_chunk == chunk:
            self.__last_chunk = None

            new_last_chunk = buf.worksheet.get_chunk(buf.worksheet.get_line_count() - 1)
            # We might find a newly created chunk that hasn't been "inserted" yet -
            # in that case, we wait until we get 'chunk_inserted'
            if hasattr(new_last_chunk, 'pixels_above'):
                self.__update_last_chunk(new_last_chunk)

    def on_notify_state(self, worksheet, param_spec):
        if (self.flags() & gtk.REALIZED) != 0:
            if worksheet.state == NotebookFile.EXECUTING:
                self.__watch_window.show()
                self.__watch_window.raise_()
            else:
                self.__watch_window.hide()

        self.set_cursor_visible(worksheet.state != NotebookFile.EXECUTING)

    def on_after_insert_text(self, buf, location, text, len):
        if buf.worksheet.in_user_action() and not buf.in_modification():
            self.__inserted_in_user_action = True

    def on_after_delete_range(self, buf, start, end):
        if buf.worksheet.in_user_action() and not buf.in_modification():
            self.__deleted_in_user_action = True

    def on_after_end_user_action(self, buf):
        if not buf.worksheet.in_user_action():
            if self.__completion_popup.showing:
                if self.__inserted_in_user_action or self.__deleted_in_user_action:
                    self.__completion_popup.update()
            else:
                if self.__inserted_in_user_action and global_settings.autocomplete:
                    self.__completion_popup.popup(spontaneous=True)
            self.__inserted_in_user_action = False
            self.__deleted_in_user_action = False

    def on_add_custom_result(self, buf, result, anchor):
        widget = result.create_widget()
        widget.show()
        self.add_child_at_anchor(widget, anchor)

    def on_add_sidebar_results(self, buf, chunk):
        if len(self.sidebar.slots) == 0:
            self.sidebar_open = True

        widgets = []
        for result in chunk.sidebar_results:
            widget = result.create_widget()
            widget.show()
            widgets.append(widget)

        self.sidebar.add_slot(chunk, widgets)

        # The final sidebar position calculation aren't be done until
        # we've finished revalidating the text view, but we need
        # to get some approproximate guess done before we allocate
        # the sidebar, or we'll get flashing
        self.__queue_update_sidebar_positions(before_resize=True)

    def on_remove_sidebar_results(self, buf, chunk):
        if len(self.sidebar.slots) == 1:
            self.__queue_update_sidebar_positions()
            self.sidebar_open = False

        self.sidebar.remove_slot(chunk)

    def on_mark_set(self, buffer, iter, mark):
        if self.__arg_highlight_start:
            # See if the user moved the cursor out of the highlight regionb
            buf = self.get_buffer()
            if mark != buf.get_insert():
                return

            if (iter.compare(buf.get_iter_at_mark(self.__arg_highlight_start)) < 0 or
                iter.compare(buf.get_iter_at_mark(self.__arg_highlight_end)) > 0):
                self.__remove_arg_highlight(cursor_to_end=False)

    def __invalidate_char_position(self, iter):
        y, height = self.get_line_yrange(iter)
        if self.window:
            text_window = self.get_window(gtk.TEXT_WINDOW_TEXT)
            width, _ = text_window.get_size()
            text_window.invalidate_rect((0, y, width, height), False)
        
    def on_pair_location_changed(self, buf, old_position, new_position):
        if old_position:
            self.__invalidate_char_position(old_position)
        if new_position:
            self.__invalidate_char_position(new_position)

    #######################################################
    # Public API
    #######################################################

    def calculate(self, end_at_insert=False):
        buf = self.get_buffer()
        line, _ = buf.iter_to_pos(buf.get_iter_at_mark(buf.get_insert()), ADJUST_BEFORE)

        if end_at_insert:
            end_line = line + 1 # +1 to include line with cursor
        else:
            end_line = None

        buf.worksheet.calculate(end_line=end_line)

        # If the cursor is in a StatementChunk or we are executing up to
        # the cursor, we will scroll the result into view.  Otherwise,
        # we will just scroll the cursor into view.  If there is no
        # StatementChunk between the cursor and the beginning of the
        # worksheet, or if the StatementChunk has already been executed,
        # there is no need to scroll at all.
        statement_line = line
        in_statement = True
        while line >= 0:
            chunk = buf.worksheet.get_chunk(statement_line)
            if isinstance(chunk, StatementChunk):
                if chunk.needs_compile or chunk.needs_execute:
                    self.__cursor_chunk = chunk
                    self.__scroll_to_result = end_at_insert or in_statement
                return
            statement_line -= 1
            in_statement = False

    def copy_as_doctests(self):
        buf = self.get_buffer()

        bounds = buf.get_selection_bounds()
        if bounds == ():
            start, end = buf.get_iter_at_mark(buf.get_insert())
        else:
            start, end = bounds

        start_line, start_offset = buf.iter_to_pos(start, adjust=ADJUST_BEFORE)
        end_line, end_offset = buf.iter_to_pos(end, adjust=ADJUST_BEFORE)

        doctests = buf.worksheet.get_doctests(start_line, end_line + 1)
        self.get_clipboard(gtk.gdk.SELECTION_CLIPBOARD).set_text(doctests)

    def show_doc_popup(self, focus_popup=False):
        """Pop up the doc popup for the symbol at the insertion point, if any

        @param focus_popup: if True, the popup will be given keyboard focus

        """

        buf = self.get_buffer()

        insert = buf.get_iter_at_mark(buf.get_insert())
        line, offset = buf.iter_to_pos(insert, adjust=ADJUST_NONE)
        if line is not None:
            obj, start_line, start_offset, _, _ = buf.worksheet.get_object_at_location(line, offset, include_adjacent=True)
        else:
            obj = None

        if obj is not None:
            start = buf.pos_to_iter(start_line, start_offset)
            self.__stop_mouse_over()
            self.__doc_popup.set_target(obj)
            self.__doc_popup.position_at_location(self, start)
            if focus_popup:
                self.__doc_popup.popup_focused()
            else:
                self.__doc_popup.popup()

    def highlight_arg_region(self, start, end):
        """Highlight the region between start and end for argument insertion.
        A box will be drawn around the region as long as the cursor is inside
        the region. If the user hits return, the cursor will be moved to the
        end (and past a single closing punctuation at the end, if any.)

        @param start iter at the start of the highlight region
        @param end iter at the end of the highlight region

        """

        buf = self.get_buffer()

        self.__arg_highlight_start = buf.create_mark(None, start, left_gravity=True)
        self.__arg_highlight_end = buf.create_mark(None, end, left_gravity=False)