Example #1
0
    def __init__(self,
                 master,
                 text,
                 textFont,
                 textColor,
                 imagePath,
                 imageScale,
                 hoverEff: dict,
                 imgBgColor=None,
                 imgSize=50,
                 btnCommand=None,
                 **args):
        Frame.__init__(self, master, **args)
        Animatable.__init__(self)

        self.hover_theme = hoverEff
        # Create the icon
        self.icon = IconFrame(self, imagePath, imageScale, imgBgColor, imgSize)
        self.icon.pack(side=LEFT)
        # Create the label
        self.label = Label(self,
                           text=text,
                           font=textFont,
                           fg=textColor,
                           bg=self['bg'])
        self.label.pack(side=LEFT, padx=5)
        # Save the initial theme
        self.theme = {'bg': self['bg'], 'fg': textColor}
        # Bind click event
        if btnCommand != None:
            self.bind_click(btnCommand)
Example #2
0
    def __init__(self,
                 root,
                 title,
                 buttons: dict = None,
                 width=MODAL_WIDTH,
                 height=MODAL_HEIGHT,
                 **args):
        Window.__init__(self, root, title, width, height, **args)

        # Header
        self.frm_header = Frame(self, bg=white, padx=20, pady=20)
        self.frm_header.pack(side=TOP, fill=X)
        self.lbl_title = Label(self.frm_header,
                               text=title,
                               bg=white,
                               fg=black,
                               font='-size 20 -weight bold')
        self.lbl_title.pack(side=LEFT)
        self.btn_close = IconFrame(self.frm_header,
                                   'resources/icons/ui/cancel.png', 10, black,
                                   50, lambda e: self.destroy(), danger)
        self.btn_close.pack(side=RIGHT)
        self.frm_header.update()

        # Header Bottom Border
        self.frm_border_bottom = Frame(self,
                                       highlightthickness=1,
                                       highlightbackground=border)
        self.frm_border_bottom.pack(side=TOP, fill=X)

        # Body
        self.frm_body = Frame(self, bg=background, padx=30, pady=30)
        self.frm_body.pack(side=TOP, fill=BOTH)

        # Footer
        self.frm_footer = Frame(self, bg=silver, padx=15, pady=15)
        self.frm_footer.pack(side=BOTTOM, fill=X)

        if buttons != None:
            for button in buttons:
                btn = (DangerButton if button.get('mode', 'main') == 'danger'
                       else MainButton)(self.frm_footer,
                                        button.get('text', 'Text'),
                                        button.get('icon', 'error.png'),
                                        button.get('cmnd', None))
                btn.pack(side=RIGHT, padx=(10, 0))

        # Footer Bottom Border
        self.frm_border_top = Frame(self,
                                    highlightthickness=1,
                                    highlightbackground=border)
        self.frm_border_top.pack(side=BOTTOM, fill=X)

        self.grab_set_global()
        self.resizable(False, False)
Example #3
0
 def config_hBar(self):
     # Creation of elements
     # BOOKMARK_DONE: change user profile image
     self.clean_notifications()
     # username
     self.btn_username = IconButton(self.frm_hBar, SessionWindow.ACTIVE_USER.userName, '-size 15', biege, 'resources/icons/ui/face.png' if SessionWindow.ACTIVE_USER.image == None else SessionWindow.ACTIVE_USER.image, 6, None, biege, 40, lambda e: self.windowManager.run_tag('profile'), bg=white)
     # bell icon
     self.icn_notification = IconFrame(
         self.frm_hBar, 'resources/icons/ui/bell_outline.png', 0, None, 32,
         lambda e: self.show_popup(
             self.to_window_coords(e.x_root, e.y_root)[0] - 360,
             self.to_window_coords(e.x_root, e.y_root)[1] + 20,
             # BOOKMARK_DONE: notification data list
             Container.filter(Notification,Notification.recipient == SessionWindow.ACTIVE_USER, Notification.id.notin_(Container.filter(SeenNotification.notificationId.distinct(), SeenNotification.notificationId == Notification.id, Notification.type == NotificationType.INVITED.value))).all(), 
             self.configure_notif_listitem
         )
     )
     # discussion icon
     self.icn_discussion = IconFrame(
         self.frm_hBar, 'resources/icons/ui/discussion_outline.png', 0, None, 32,
         lambda e: self.show_popup(
             self.to_window_coords(e.x_root, e.y_root)[0] - 360, 
             self.to_window_coords(e.x_root, e.y_root)[1] + 20, 
             # BOOKMARK_DONE: discussion data list
             # Container.filter(Message,Message.sessionId == Collaboration.sessionId,or_(Collaboration.userId == SessionWindow.ACTIVE_USER.id, and_(Message.sessionId == Session.id, Session.ownerId == SessionWindow.ACTIVE_USER.id) ),Message.sentDate.in_(Container.filter(func.max(Message.sentDate)).group_by(Message.sessionId))).group_by(Message.sessionId).all(), 
             self.getLastMessages(),
             self.configure_msg_listitem
         )
     )
     # notification counter label
     self.lbl_notif_counter = Label(self.frm_hBar, fg=black, bg=white, text='0', font='-weight bold -size 9')
     self.lbl_discus_counter = Label(self.frm_hBar, fg=black, bg=white, text='0', font='-weight bold -size 9')
     # Positioning elements
     self.btn_username.pack(side=LEFT)
     self.lbl_notif_counter.pack(side=RIGHT)
     self.icn_notification.pack(side=RIGHT)
     self.lbl_discus_counter.pack(side=RIGHT)
     self.icn_discussion.pack(side=RIGHT, padx=(0, 5))
Example #4
0
    def __init__(self, master, iconPath, **args):
        Frame.__init__(self, master, **args)

        self.configure(bg=black, pady=3)

        self.icon = IconFrame(self, iconPath, 15, black, 40, bg=black)
        self.icon.pack(side=LEFT)

        self.entry = Entry(self,
                           relief=FLAT,
                           font='-size 12 -weight bold',
                           bd=5,
                           fg=black)
        self.entry.pack(side=LEFT, fill=BOTH, expand=1, padx=(0, 3))

        Animatable.__init__(self)
Example #5
0
    def __init__(self,
                 root,
                 title: str,
                 message: str,
                 messageType: str = 'error',
                 actions: dict = None,
                 **args):

        # Prepare modal buttons
        buttons = [{
            'text': 'Okay',
            'icon': 'yes.png',
            'cmnd': lambda e: self.destroy()
        }]

        if actions != None:
            buttons = [{
                'text': 'No',
                'icon': 'no.png',
                'cmnd': actions.get('no', lambda e: self.destroy()),
                'mode': 'danger'
            }, {
                'text': 'Yes',
                'icon': 'yes.png',
                'cmnd': actions.get('yes', None)
            }]

        Modal.__init__(self, root, title, buttons, self.MODAL_WIDTH, 345,
                       **args)

        color = black if messageType == self.PROMPT else (
            teal if messageType == self.INFO else danger)

        img_icon = IconFrame(self.frm_body,
                             'resources/icons/ui/' + messageType + '.png', 6,
                             color, 75)
        img_icon.pack(side=LEFT)

        lbl_message = Label(self.frm_body,
                            text=message,
                            bg=background,
                            fg=color,
                            font='-size 15 -weight bold',
                            justify=LEFT,
                            wraplength=self.MODAL_WIDTH - 150)
        lbl_message.pack(side=LEFT, padx=(10, 0))
Example #6
0
    def create(item):
        self = item

        # binding values
        username = '******' if self.bindings == None else self.bindings.get('username', '{username}')

        self.configure(padx=10, pady=10, relief=SOLID, highlightthickness=1, highlightbackground=border, bg=white)

        self.img_icon = IconFrame(self, self.bindings.get('image') if self.bindings.get('image') != None else 'resources/icons/ui/face.png', 0, black, 40, highlightbackground=border, highlightthickness=1)
        self.img_icon.pack(side=LEFT)

        self.lbl_username = Label(self, text=username, bg=white, font='-size 12 -weight bold', fg=black)
        self.lbl_username.pack(side=LEFT, fill=Y, padx=5)

        def correct(call, obj):
            return lambda e: call(obj)

        if self.buttonSettings != None:
            for s in self.buttonSettings:
                path = 'resources/icons/ui/' + s.get('icon', 'error.png')
                btn = IconButton(self, s.get('text', 'Button Text'), '-size 10 -weight bold', teal, path, 15, {'fg': white, 'bg': teal}, teal, 30, correct(s.get('cmd', None), self.dataObject), bg=white, highlightthickness=1, highlightbackground=border, padx=7, pady=5)
                btn.pack(side=RIGHT, padx=(0, 5))
                self.buttons.append(btn)
Example #7
0
    def create_list_item(self, item: ListItem, liType: int = PROJECT_LI):
        item.configure (highlightthickness=1, highlightbackground=border, bg=white)
        comps = []

        img_size = 205
        img_thumb = Frame(item, height=img_size, bg=white)
        img_thumb.pack_propagate(0)

        # adding image label
        item.lbl_image = Label(img_thumb,bg='white')
        item.lbl_image.pack(fill=BOTH,expand=1)
        comps.append(item.lbl_image)

        border_bottom = Frame(item, bg=border)
        frm_info = Frame(item, bg=silver, padx=10, pady=10)
        frm_details = Frame(frm_info, bg=silver)
        
        lbl_title = Label(frm_info, text=item.bindings.get('title', '{title}'), bg=silver, fg=black, font='-size 18')
        lbl_title.pack(side=TOP, fill=X, pady=(0, 10))
        comps.append(lbl_title)

        panel_settings = [
            {
                'label': translate('Created In:'),
                'text': item.bindings.get('creationDate').strftime('%a, %d %b') if 'creationDate' in item.bindings else '{creationDate}'
            },
            {
                'label': translate('Edited In:'),
                'text':  item.bindings.get('lastEdited').strftime('%a, %d %b') if 'lastEdited' in item.bindings else '{lastEdited}'
            }
        ]

        if liType == HomeWindow.SESSION_LI:
            panel_settings.append({
                'label': translate('Members:'),
                'text': item.bindings.get('memberCount', '{memberCount}')
            })

        for i in panel_settings:
            frm = Frame(frm_details, bg=silver)
            frm.pack(side=LEFT, fill=X, expand=1)
            comps.append(frm)
            lbl_label = Label(frm, text=i.get('label'), fg=teal, bg=silver, font='-size 8')
            lbl_label.pack(fill=X)
            comps.append(lbl_label)
            lbl_text = Label(frm, text=i.get('text'), fg=gray, bg=silver, font='-size 9')
            lbl_text.pack(fill=X)
            comps.append(lbl_text)
        
        img_thumb.pack(fill=X, side=TOP)
        comps.append(img_thumb)
        border_bottom.pack(fill=X, side=TOP)
        frm_info.pack(fill=X, side=TOP)
        comps.append(frm_info)
        frm_details.pack(fill=X, side=TOP)
        comps.append(frm_details)

        # BOOKMARK_DONE: project item's menu
        def options_menu(e):
            # convert screen mouse position
            win_coords = self.to_window_coords(e.x_root, e.y_root)
            menu_buttons = [
                {
                    'text': translate('Open'),
                    'icon': 'open.png',
                    'cmnd': lambda e: self.windowManager.run(ProjectWindow(self, item.dataObject)) if liType == HomeWindow.PROJECT_LI else self.windowManager.run(CollaborationWindow(self, item.dataObject))
                },
                {
                    'text': translate('Edit'),
                    'icon': 'edit.png',
                    'cmnd': lambda e: self.windowManager.run_tag('editor', item.dataObject)
                },
                {
                    'text': translate('Share'),
                    'icon': 'share.png',
                    'cmnd': lambda e: (self.windowManager.get_module('ShareModal'))(self, lambda modal: self.generate_share_link(item.dataObject, modal))
                },
                {
                    'text': translate('Delete'),
                    'icon': 'delete.png',
                    'fg': danger,
                    'cmnd': lambda e: self.delete_project(item.dataObject) if liType == self.PROJECT_LI else self.delete_session(item.dataObject) 
                },
                {
                    'text': translate('Leave'),
                    'icon': 'logout.png',
                    'fg': danger,
                    'cmnd': lambda e: self.quit_session(item.dataObject)
                }
            ]
            # pop unwanted buttons
            if liType == self.SESSION_LI: 
                # remove share button
                menu_buttons.pop(2)
                # remove delete or leave
                menu_buttons.pop(2 if item.dataObject.owner != HomeWindow.ACTIVE_USER else 3)
            else:
                # remove leave
                menu_buttons.pop()
            # show menu
            self.show_menu(x=win_coords[0], y=win_coords[1], width=150, height=200, options=menu_buttons)
        # options icon
        IconFrame(item, 'resources/icons/ui/menu.png', 10, teal, 32, options_menu, bg=white).place(relx=1-0.03, rely=0.02, anchor=N+E)

        for c in comps:
            c.bind('<Double-Button-1>', lambda e: self.windowManager.run(ProjectWindow(self, item.dataObject)) if liType == HomeWindow.PROJECT_LI else self.windowManager.run(CollaborationWindow(self, item.dataObject)))
    def design(self):
        # Session items section
        self.frm_body.config(padx=0, pady=0)

        frm_sessions = Frame(self.frm_body, bg=background, width=300)
        frm_border = Frame(self.frm_body,
                           highlightthickness=1,
                           highlightbackground=border)
        frm_discussion = Frame(self.frm_body, bg=background)

        frm_sessions.pack_propagate(0)

        self.lv_sessions = Scrollable(frm_sessions, bg=silver)
        self.lv_sessions.pack(fill=BOTH, expand=1)

        frm_sessions.pack(side=LEFT, fill=Y)
        frm_border.pack(side=LEFT, fill=Y)
        frm_discussion.pack(side=LEFT, fill=BOTH, expand=1)

        # Discussion Section
        frm_head = Frame(frm_discussion, bg=white, pady=20, padx=20)
        frm_head.pack(side=TOP, fill=X)

        frm_border_bottom = Frame(frm_discussion,
                                  highlightthickness=1,
                                  highlightbackground=border)
        frm_border_bottom.pack(fill=X, side=TOP)

        frm_group = Frame(frm_head, bg=white)
        frm_group.pack(side=LEFT, fill=X)

        self.lbl_sessionName = Label(frm_group,
                                     bg=white,
                                     fg=teal,
                                     text=translate('Session\'s Title'),
                                     font='-size 18 -weight bold')
        self.lbl_sessionName.pack(anchor=N + W)

        self.lbl_memberCount = Label(frm_group,
                                     bg=white,
                                     fg=black,
                                     text='X members')
        self.lbl_memberCount.pack(anchor=N + W)

        self.btn_open_session = MainButton(
            frm_head,
            translate('Open Session'),
            'open.png',
            btnCmd=lambda event: self.open_session(event))
        self.btn_open_session.config(pady=5)
        self.btn_open_session.pack(side=RIGHT)

        frm_scrollable_container = Frame(frm_discussion, bg=black)
        frm_scrollable_container.pack_propagate(0)
        frm_scrollable_container.pack(side=TOP, fill=BOTH, expand=1)

        self.lv_messages = Scrollable(frm_scrollable_container,
                                      bg=background,
                                      padx=15,
                                      pady=15)
        self.lv_messages.pack(expand=1, fill=BOTH)

        frm_footer = Frame(frm_discussion, bg=white, pady=20, padx=20)
        frm_footer.pack(side=BOTTOM, fill=X)

        self.is_hint_deleted = False
        self.txt_message = Entry(frm_footer,
                                 highlightthickness=0,
                                 relief=FLAT,
                                 font='-size 12',
                                 fg=black)
        self.txt_message.insert(0, translate('Type your message here...'))
        self.txt_message.pack(side=LEFT, fill=BOTH, expand=1)

        def txt_message_focus(e):
            self.is_hint_deleted = True
            self.txt_message.delete(0, len(self.txt_message.get()))

        self.txt_message.bind('<FocusIn>', txt_message_focus)

        IconFrame(frm_footer,
                  'resources/icons/ui/send.png',
                  25,
                  teal,
                  command=lambda event: self.send_message(
                      event, self.currentItem)).pack(side=RIGHT)

        frm_border_top = Frame(frm_discussion,
                               highlightthickness=1,
                               highlightbackground=border)
        frm_border_top.pack(side=BOTTOM, fill=X)

        self.frm_veil = Frame(frm_discussion, bg=background)
        self.frm_veil.place(relwidth=1, relheight=1, x=0, y=0)