Changeset 6386


Ignore:
Timestamp:
Nov 27, 2017, 5:14:15 PM (23 months ago)
Author:
Juanma
Message:

Changed API

Location:
n4dgtklogin/trunk/fuentes
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • n4dgtklogin/trunk/fuentes/README.md

    r6353 r6386  
    22This is a Lliurex specific login component for Gtk apps. 
    33### API 
     4###### set_allowed_groups(groups=[])
     5        Login only will be succesfull if user belongs to any of this groups.
    46###### set_mw_proportion_ratio(columns_left,columns_right) 
    57        Sets the portion of screen reserved to each component (info and login form). It works splitting the main window in (columns_left+columns_right) columns and asigning to each part the desired number of columns. By default the proportion is set to 2:1
     
    2224        Sets the information to show in the info box. 
    2325        It must have a title, a subtitle and a text as arguments and supports markup language.
     26###### hide_server_entry() 
     27        Hides the entry field of the login form
     28###### hide_info_box() 
     29        Hides the info box form
    2430###### get_action_area() 
    2531        Returns the info box so we can add any widget to it. 
    26 ###### render_screen() 
    27         Returns the rendered main box.
    2832###### after_validation_goto() 
    2933        Sets the function that the loginComponent will launch after a correct user's validation. User, password and server will be passed as arguments to that function.
     
    4347def start_gui(): 
    4448        mw=Gtk.Window() 
    45         box=Gtk.Box() 
    4649        loginComponent=N4dGtkLogin() #Init the login component 
    4750        loginComponent.set_info_text("<span foreground='black'>Title</span>","Subtitle","Text text text.\nText text text:\n<sub>* text with sub tag</sub>") 
     
    7073        ##- Function that will be launched after a succesfull validation
    7174        loginComponent.after_validation_goto(_signin) 
    72         ##- Render the form
    73         loginBox=loginComponent.render_form()
    7475        ##
    75         box.add(loginBox) 
    76         mw.add(box) 
     76        mw.add(loginComponent)
    7777        mw.connect("delete-event",Gtk.main_quit) 
    7878        mw.show_all() 
  • n4dgtklogin/trunk/fuentes/debian/changelog

    r6376 r6386  
     1python-n4dgtklogin (0.4) xenial; urgency=medium
     2
     3  * Change API
     4
     5 -- Juanma Navarro Mañez <juanma1980@gmail.com>  Mon, 27 Nov 2017 17:11:03 +0100
     6
    17python-n4dgtklogin (0.3.3) xenial; urgency=medium
    28
  • n4dgtklogin/trunk/fuentes/python-n4dgtklogin.install/edupals/ui/n4dgtklogin.py

    r6376 r6386  
    1 #!/usr/bin/env python
     1#!/usr/bin/env python3
    22###
    3 #This class returns a HBox whith a standarized login form
     3#This class returns a login_grid whith a standarized login form
    44###
    55import os,sys,socket
     
    1616except ImportError:
    1717        raise ImportError("xmlrpc not available. Disabling server queries")
    18 import ssl
    1918import time
    2019import gettext
    2120
    22 gettext.textdomain('nezumi.ui.common')
     21gettext.textdomain('edupals.ui.common')
    2322_ = gettext.gettext
    2423GObject.threads_init()
    2524
    26 class N4dGtkLogin(threading.Thread):
    27         def __init__(self):
    28                 threading.Thread.__init__(self)
     25class N4dGtkLogin(Gtk.Box):
     26        __gtype_name__='n4dgtklogin'
     27
     28        def __init__(self,*args,**kwds):
     29                        #               threading.Thread.__init__(self)
     30                super().__init__(*args,**kwds)
    2931                self.sw_n4d=True
    3032                if hasattr(sys,'last_value'):
    3133                #If there's any error at this point it only could be an ImportError caused by xmlrpc
    3234                        self.sw_n4d=False
     35                self.css_classes={}
     36                self.style_provider=Gtk.CssProvider()
     37                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
    3338                self.default_spacing=12
    3439                self.username_placeholder=_("Username")
    3540                self.server_placeholder=_("Server IP (Default value : server)")
    3641                self.login_banner_default="llx-avatar"
    37                 self.info_msg=''
    38                 self.info_background=''
    39                 self.mw_background=''
    40                 self.form_background=''
     42                self.info_banner=None
     43                self.allowed_groups=[]
     44                #internal boxes
     45                self.form_box=Gtk.Box(spacing=0,orientation=Gtk.Orientation.VERTICAL)
    4146                self.info_box=Gtk.Box(spacing=self.default_spacing,orientation=Gtk.Orientation.VERTICAL)
    42                 self.info_box.set_homogeneous(False)
    43                 self.txt_username=Gtk.Entry()
    44                 self.txt_server=Gtk.Entry()
    45                 self.login_banner=Gtk.Image()
    46                 if not self._lookup_user_face():
    47                         self.set_login_banner(self.login_banner_default)
    48                 self.login_banner.set_margin_bottom(self.default_spacing)
    49                 self.info_banner=None
    50                 self.sw_info=False
    51                 self.left_span=2
    52                 self.right_span=1
     47                self.main_grid=Gtk.Grid()
     48                self.render_form()
    5349        #def __init__
    5450
    55         def set_mw_proportion_ratio(self,left_span,right_span):
    56                 self.left_span=left_span
    57                 self.right_span=right_span
     51        def set_allowed_groups(self,groups):
     52                self.allowed_groups=groups
     53        #def set_allowed_groups
     54
     55        def set_mw_proportion_ratio(self,left_panel,right_panel):
     56                for child in self.main_grid.get_children():
     57                        self.main_grid.remove(child)
     58                self.main_grid.attach(self.info_box,0,0,left_panel,1)
     59                self.main_grid.attach(self.form_box,0+left_panel,0,right_panel,1)
     60        #def set_mw_proportion_ratio
    5861       
    5962        def set_mw_background(self,image=None,cover=False,from_color='#ffffff',to_color='silver',gradient='linear'):
    60                 self.mw_background=self._set_background(image,cover,from_color,to_color,gradient)
     63                mw_background=self._set_background(image,cover,from_color,to_color,gradient)
     64                self.css_classes['#mw']='{'+mw_background+';;}'
     65                self._set_css()
    6166        #def set_mw_background
    6267
    6368        def set_login_background(self,image=None,cover=False,from_color='#ffffff',to_color='@silver',gradient='linear'):
    64                 self.form_background=self._set_background(image,cover,from_color,to_color,gradient)
     69                form_background=self._set_background(image,cover,from_color,to_color,gradient)
     70                self.css_classes['#main']='{'+form_background+';;}'
     71                self._set_css()
    6572        #def set_login_background
    6673
    6774        def set_info_background(self,image=None,cover=False,from_color='#ffffff',to_color='@silver',gradient='linear'):
    68                 self.info_background=self._set_background(image,cover,from_color,to_color,gradient)
     75                info_background=self._set_background(image,cover,from_color,to_color,gradient)
     76                self.css_classes['#info']='{'+info_background+';;}'
     77                self._set_css()
    6978        #def set_info_background
     79
     80        def _set_css(self):
     81                css=''
     82                for css_class,style in self.css_classes.items():
     83                        css=css+css_class+' '+style
     84                css_style=eval('b"""'+css+'"""')
     85                self.style_provider.load_from_data(css_style)
     86        #def _set_css
    7087
    7188        def _set_background(self,image=None,cover=False,from_color='#ffffff',to_color='silver',gradient='linear'):
     
    84101                                icon=icon_theme.lookup_icon(image,max_size,0)
    85102                                icon_path=icon.get_filename()
    86 #                               img.set_from_pixbuf(pixbuf)
    87103                                bg='background-image:url("'+icon_path+'"); background-repeat:no-repeat; background-size:100% 100%'
     104
    88105                else:
    89106                        if gradient=='linear':
     
    92109                                bg='background-image:-gtk-gradient (radial, center center,0,center center,1, from ('+from_color+'),  to ('+to_color+'))'
    93110                return bg
     111        #def _set_background
    94112
    95113        def set_default_username(self,username):
     
    114132                        self.set_login_banner(os.path.expanduser('~/.face'))
    115133                return sw_ok
     134        #def _lookup_user_face
    116135
    117136        def set_login_banner(self,banner):
    118                 self.login_banner=self._get_image(banner)
     137                self.login_banner.set_from_pixbuf(self._get_image(banner))
    119138        #def set_banner
    120139
    121         def set_info_banner(self,image,x=72,y=72):
    122                 self.info_banner=self._get_image(image,x,y)
     140        def set_info_banner(self,banner,x=72,y=72):
     141                self.info_banner.set_from_pixbuf(self._get_image(banner))
    123142        #def set_info_banner
    124143
    125144        def _get_image(self,image,x=72,y=72):
    126145                icon_theme=Gtk.IconTheme.get_default()
    127                 img=Gtk.Image()
    128146                if icon_theme.has_icon(image):
    129                         img.set_from_icon_name(image,Gtk.IconSize.DIALOG)
     147                        pixbuf=icon_theme.load_icon(image,x,0)
    130148                else:
    131149                        if os.path.isfile(image):
    132150                                pixbuf=GdkPixbuf.Pixbuf.new_from_file_at_scale(image,x,y,True)
    133                                 img.set_from_pixbuf(pixbuf)
    134                 return img
     151                return pixbuf
     152        #def _get_image
    135153       
    136154        def set_info_text(self,title,subtitle,text):
    137155                sw_ok=True
     156                info_msg=''
     157                self.lbl_info_msg.set_width_chars(25)
     158                self.lbl_info_msg.set_max_width_chars(25)
    138159                try:
    139160                        msg="<b><big>"+title+"</big></b>"
    140                         self.info_msg=msg+'\n'+subtitle+'\n\n'+text
    141                         self.sw_info=True
     161                        info_msg=msg+'\n'+subtitle+'\n\n'+text
    142162                except Exception as e:
    143163                        sw_ok=False
    144164                        print(e)
     165                self.lbl_info_msg.set_markup(info_msg)
    145166                return sw_ok
    146167        #def set_info_text
    147168
     169        def hide_server_entry(self):
     170                self.txt_server.props.no_show_all=True
     171                self.txt_server.hide()
     172        #def hide_server_entry
     173
     174        def hide_info_box(self):
     175                self.info_box.props.no_show_all=True
     176                self.info_box.hide()
     177        #def hide_info_box
     178
    148179        def get_action_area(self):
    149                 self.sw_info=True
    150180                return self.info_box
    151 
    152         def render_form(self,show_server=True):
    153                 mw_box=Gtk.Box(spacing=0,orientation=Gtk.Orientation.HORIZONTAL)
    154                 (mw_bg,form_bg)=('','')
    155 
    156                 main_box=Gtk.Grid()
    157                 main_box.set_hexpand(True)
    158                 main_box.set_vexpand(True)
    159                 main_box.set_column_homogeneous(True)
    160                 main_box.set_row_homogeneous(True)
    161                 form_box=self._render_login_form(show_server)
    162                 if self.sw_info:
    163                         info_box=self._render_info_form()
    164                         main_box.attach(info_box,1,1,self.left_span,1)
    165                 main_box.attach(form_box,1+self.left_span,1,self.right_span,1)
    166                 mw_box.pack_start(main_box,True,True,0)
    167                 if self.mw_background:
    168                         mw_bg='#mw {'+self.mw_background+';;}'
    169                         mw_box.set_name("mw")
    170                 if self.form_background:
    171                         form_bg='#main {'+self.form_background+';;}'
    172                         form_box.set_name("main")
    173                 if mw_bg or form_bg:
    174                         css=eval('b"""'+mw_bg+form_bg+'"""')
    175                         style_provider=Gtk.CssProvider()
    176                         style_provider.load_from_data(css)
    177                         Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
    178                 return (mw_box)
     181        #def get_action_area
     182
     183        def render_form(self):
     184                self.main_grid.set_hexpand(True)
     185                self.main_grid.set_vexpand(True)
     186                self.main_grid.set_column_homogeneous(True)
     187                self.main_grid.set_row_homogeneous(True)
     188                self._render_login_form()
     189                self._render_info_form()
     190                self.main_grid.attach(self.info_box,1,1,2,1)
     191                self.main_grid.attach(self.form_box,3,1,1,1)
     192                self.pack_start(self.main_grid,True,True,0)
     193                self.set_name("mw")
     194                self.form_box.set_name("main")
    179195        #def render_form
    180196
    181         def _render_login_form(self,show_server):
    182                 form_box=Gtk.Box(spacing=0,orientation=Gtk.Orientation.VERTICAL)
     197        def _render_login_form(self):
     198                self.txt_username=Gtk.Entry()
     199                self.login_banner=Gtk.Image()
     200                if not self._lookup_user_face():
     201                        self.set_login_banner(self.login_banner_default)
     202                self.login_banner.set_margin_bottom(self.default_spacing)
    183203                self.set_default_username(self.username_placeholder)
    184204                self.txt_username.set_icon_from_icon_name(Gtk.EntryIconPosition.PRIMARY,"emblem-personal")
     
    194214               
    195215                self.frame.set_shadow_type(Gtk.ShadowType.OUT)   
    196                 hbox=Gtk.Grid()
    197                 hbox.set_margin_left(self.default_spacing)
    198                 hbox.set_margin_right(self.default_spacing)
    199                 hbox.set_margin_top(self.default_spacing)
    200                 hbox.set_margin_bottom(self.default_spacing)
     216                login_grid=Gtk.Grid()
     217                login_grid.set_margin_left(self.default_spacing)
     218                login_grid.set_margin_right(self.default_spacing)
     219                login_grid.set_margin_top(self.default_spacing)
     220                login_grid.set_margin_bottom(self.default_spacing)
    201221                self.spinner=Gtk.Spinner()
    202222                color=Gdk.Color(0,0,1)
    203223                self.spinner.modify_bg(Gtk.StateType.NORMAL,color)
    204                 hbox.attach(self.spinner,0,1,1,5)
    205                 hbox.attach(self.login_banner,0,0,1,1)
    206                 hbox.attach(self.txt_username,0,1,1,1)
     224                login_grid.attach(self.spinner,0,1,1,5)
     225                login_grid.attach(self.login_banner,0,0,1,1)
     226                login_grid.attach(self.txt_username,0,1,1,1)
    207227                self._set_widget_default_props(self.txt_username,_("Username"))
    208228                self.txt_username.connect('activate',self._validate)
    209                 hbox.attach(self.txt_password,0,2,1,1)
     229                login_grid.attach(self.txt_password,0,2,1,1)
    210230                self._set_widget_default_props(self.txt_password,_("Password"))
    211231                self.txt_password.set_visibility(False)
    212232                self.txt_password.props.caps_lock_warning=True
    213233                self.txt_password.connect('activate',self._validate)
    214                 if show_server:
    215                         hbox.attach(self.txt_server,0,3,1,1)
    216                         self._set_widget_default_props(self.txt_server,_("Master Server IP"))
    217                         self.txt_server.connect('activate',self._validate)
     234                login_grid.attach(self.txt_server,0,3,1,1)
     235                self._set_widget_default_props(self.txt_server,_("Master Server IP"))
     236                self.txt_server.connect('activate',self._validate)
    218237                self.btn_sign.set_margin_top(self.default_spacing)
    219                 hbox.attach(self.btn_sign,0,4,1,1)
    220 #               self.frame.add(hbox)
     238                login_grid.attach(self.btn_sign,0,4,1,1)
    221239                self.sta_info=Gtk.InfoBar()
    222240                self.sta_info.set_show_close_button(True)
     
    226244                self.sta_info.set_visible(False)
    227245                self.sta_info.set_no_show_all(True)
    228                 self.sta_info.connect('response',self._info_hide)
     246                self.sta_info.connect('response',self._status_info_hide)
    229247                self.sta_info.set_valign(True)
    230                 hbox.props.valign=Gtk.Align.CENTER
    231                 hbox.props.halign=Gtk.Align.CENTER
    232                 form_box.pack_start(self.sta_info,False,True,0)
    233                 form_box.pack_start(hbox,True,True,0)
    234                 return(form_box)
     248                login_grid.props.valign=Gtk.Align.CENTER
     249                login_grid.props.halign=Gtk.Align.CENTER
     250                self.form_box.pack_start(self.sta_info,False,True,0)
     251                self.form_box.pack_start(login_grid,True,True,0)
    235252        #def _render_login_form
    236253
    237254        def _render_info_form(self):
    238                 hbox=Gtk.Box(spacing=self.default_spacing,orientation=Gtk.Orientation.VERTICAL)
    239                 if self.info_banner:
    240                         hbox.pack_start(self.info_banner,False,False,0)
    241                 if self.info_msg:
    242                         lbl_msg=Gtk.Label()
    243                         lbl_msg.set_use_markup(True)
    244                         lbl_msg.set_line_wrap(True)
    245                         lbl_msg.set_width_chars(25)
    246                         lbl_msg.set_max_width_chars(25)
    247                         lbl_msg.set_markup(self.info_msg)
    248                         hbox.pack_start(lbl_msg,True,True,0)
    249                 lbl_bg='#label {background-color:rgba(200,200,200,0.5);;}'
    250                 lbl_msg.set_name("label")
    251                 css=eval('b"""#info {'+self.info_background+';;}'+lbl_bg+'"""')
    252                 style_provider=Gtk.CssProvider()
    253                 style_provider.load_from_data(css)
    254                 Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
     255                self.info_box.set_homogeneous(False)
     256                self.info_banner=Gtk.Image()
     257                info_detail_box=Gtk.Box(spacing=self.default_spacing,orientation=Gtk.Orientation.VERTICAL)
     258                info_detail_box.pack_start(self.info_banner,False,False,0)
     259                self.lbl_info_msg=Gtk.Label()
     260                self.lbl_info_msg.set_use_markup(True)
     261                self.lbl_info_msg.set_line_wrap(True)
     262                info_detail_box.pack_start(self.lbl_info_msg,True,True,0)
     263                self.css_classes['#label']='{background-color:rgba(200,200,200,0.8);;}'
     264                self.lbl_info_msg.set_name("label")
    255265                self.info_box.set_name("info")
    256                 hbox.props.valign=Gtk.Align.CENTER
    257                 hbox.props.halign=Gtk.Align.CENTER
    258                 self.info_box.pack_start(hbox,True,True,0)
    259                 return(self.info_box)
     266                info_detail_box.props.valign=Gtk.Align.CENTER
     267                info_detail_box.props.halign=Gtk.Align.CENTER
     268                self.info_box.pack_start(info_detail_box,True,True,0)
     269                self._set_css()
    260270        #def _render_info_form
    261271
     
    266276        #def _set_widget_default_props
    267277
    268         def _info_hide(self,widget,data):
     278        def _status_info_hide(self,widget,data):
    269279                self.sta_info.hide()
    270280                self.frame.set_sensitive(True)
     
    277287                if not server:
    278288                        server='server'
     289                        try:
     290                                socket.gethostbyname(server)
     291                        except:
     292                                server='localhost'
    279293                self.spinner.start()
    280294                self.frame.set_sensitive(False)
     
    298312                        self.sta_info.show()
    299313                        self.lbl_error.show()
    300                 if ret[0]:
     314                elif self.allowed_groups and not set(self.allowed_groups).intersection(ret[1]):
     315                        #Check user groups
     316                        self.lbl_error.set_text(_("User not allowed"))
     317                        self.sta_info.show()
     318                        self.lbl_error.show()
     319                else:
    301320                        GLib.idle_add(self.after_validate,user,pwd,server)
    302321                #local validation
     
    317336                                print(e)
    318337                                raise
    319                 c=n4d.ServerProxy("https://%s:9779"%server)
     338                c = n4d.ServerProxy("https://"+server+":9779")
    320339                return c
     340        #def _n4d_connect
  • n4dgtklogin/trunk/fuentes/python3-n4dgtklogin.install/edupals/ui/n4dgtklogin.py

    r6376 r6386  
    11#!/usr/bin/env python3
    22###
    3 #This class returns a HBox whith a standarized login form
     3#This class returns a login_grid whith a standarized login form
    44###
    55import os,sys,socket
     
    2020import gettext
    2121
    22 gettext.textdomain('nezumi.ui.common')
     22gettext.textdomain('edupals.ui.common')
    2323_ = gettext.gettext
    2424GObject.threads_init()
    2525
    26 class N4dGtkLogin(threading.Thread):
    27         def __init__(self):
    28                 threading.Thread.__init__(self)
     26class N4dGtkLogin(Gtk.Box):
     27        __gtype_name__='n4dgtklogin'
     28
     29        def __init__(self,*args,**kwds):
     30                        #               threading.Thread.__init__(self)
     31                super().__init__(*args,**kwds)
    2932                self.sw_n4d=True
    3033                if hasattr(sys,'last_value'):
    3134                #If there's any error at this point it only could be an ImportError caused by xmlrpc
    3235                        self.sw_n4d=False
     36                self.css_classes={}
     37                self.style_provider=Gtk.CssProvider()
     38                Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),self.style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
    3339                self.default_spacing=12
    3440                self.username_placeholder=_("Username")
    3541                self.server_placeholder=_("Server IP (Default value : server)")
    3642                self.login_banner_default="llx-avatar"
    37                 self.info_msg=''
    38                 self.info_background=''
    39                 self.mw_background=''
    40                 self.form_background=''
     43                self.info_banner=None
     44                self.allowed_groups=[]
     45                #internal boxes
     46                self.form_box=Gtk.Box(spacing=0,orientation=Gtk.Orientation.VERTICAL)
    4147                self.info_box=Gtk.Box(spacing=self.default_spacing,orientation=Gtk.Orientation.VERTICAL)
    42                 self.info_box.set_homogeneous(False)
    43                 self.txt_username=Gtk.Entry()
    44                 self.txt_server=Gtk.Entry()
    45                 self.login_banner=Gtk.Image()
    46                 if not self._lookup_user_face():
    47                         self.set_login_banner(self.login_banner_default)
    48                 self.login_banner.set_margin_bottom(self.default_spacing)
    49                 self.info_banner=None
    50                 self.sw_info=False
    51                 self.left_span=2
    52                 self.right_span=1
     48                self.main_grid=Gtk.Grid()
     49                self.render_form()
    5350        #def __init__
    5451
    55         def set_mw_proportion_ratio(self,left_span,right_span):
    56                 self.left_span=left_span
    57                 self.right_span=right_span
     52        def set_allowed_groups(self,groups):
     53                self.allowed_groups=groups
     54        #def set_allowed_groups
     55
     56        def set_mw_proportion_ratio(self,left_panel,right_panel):
     57                for child in self.main_grid.get_children():
     58                        self.main_grid.remove(child)
     59                self.main_grid.attach(self.info_box,0,0,left_panel,1)
     60                self.main_grid.attach(self.form_box,0+left_panel,0,right_panel,1)
     61        #def set_mw_proportion_ratio
    5862       
    5963        def set_mw_background(self,image=None,cover=False,from_color='#ffffff',to_color='silver',gradient='linear'):
    60                 self.mw_background=self._set_background(image,cover,from_color,to_color,gradient)
     64                mw_background=self._set_background(image,cover,from_color,to_color,gradient)
     65                self.css_classes['#mw']='{'+mw_background+';;}'
     66                self._set_css()
    6167        #def set_mw_background
    6268
    6369        def set_login_background(self,image=None,cover=False,from_color='#ffffff',to_color='@silver',gradient='linear'):
    64                 self.form_background=self._set_background(image,cover,from_color,to_color,gradient)
     70                form_background=self._set_background(image,cover,from_color,to_color,gradient)
     71                self.css_classes['#main']='{'+form_background+';;}'
     72                self._set_css()
    6573        #def set_login_background
    6674
    6775        def set_info_background(self,image=None,cover=False,from_color='#ffffff',to_color='@silver',gradient='linear'):
    68                 self.info_background=self._set_background(image,cover,from_color,to_color,gradient)
     76                info_background=self._set_background(image,cover,from_color,to_color,gradient)
     77                self.css_classes['#info']='{'+info_background+';;}'
     78                self._set_css()
    6979        #def set_info_background
     80
     81        def _set_css(self):
     82                css=''
     83                for css_class,style in self.css_classes.items():
     84                        css=css+css_class+' '+style
     85                css_style=eval('b"""'+css+'"""')
     86                self.style_provider.load_from_data(css_style)
     87        #def _set_css
    7088
    7189        def _set_background(self,image=None,cover=False,from_color='#ffffff',to_color='silver',gradient='linear'):
     
    84102                                icon=icon_theme.lookup_icon(image,max_size,0)
    85103                                icon_path=icon.get_filename()
    86 #                               img.set_from_pixbuf(pixbuf)
    87104                                bg='background-image:url("'+icon_path+'"); background-repeat:no-repeat; background-size:100% 100%'
    88105
     
    93110                                bg='background-image:-gtk-gradient (radial, center center,0,center center,1, from ('+from_color+'),  to ('+to_color+'))'
    94111                return bg
     112        #def _set_background
    95113
    96114        def set_default_username(self,username):
     
    115133                        self.set_login_banner(os.path.expanduser('~/.face'))
    116134                return sw_ok
     135        #def _lookup_user_face
    117136
    118137        def set_login_banner(self,banner):
    119                 self.login_banner=self._get_image(banner)
     138                self.login_banner.set_from_pixbuf(self._get_image(banner))
    120139        #def set_banner
    121140
    122         def set_info_banner(self,image,x=72,y=72):
    123                 self.info_banner=self._get_image(image,x,y)
     141        def set_info_banner(self,banner,x=72,y=72):
     142                self.info_banner.set_from_pixbuf(self._get_image(banner))
    124143        #def set_info_banner
    125144
    126145        def _get_image(self,image,x=72,y=72):
    127146                icon_theme=Gtk.IconTheme.get_default()
    128                 img=Gtk.Image()
    129147                if icon_theme.has_icon(image):
    130                         img.set_from_icon_name(image,Gtk.IconSize.DIALOG)
     148                        pixbuf=icon_theme.load_icon(image,x,0)
    131149                else:
    132150                        if os.path.isfile(image):
    133151                                pixbuf=GdkPixbuf.Pixbuf.new_from_file_at_scale(image,x,y,True)
    134                                 img.set_from_pixbuf(pixbuf)
    135                 return img
     152                return pixbuf
     153        #def _get_image
    136154       
    137155        def set_info_text(self,title,subtitle,text):
    138156                sw_ok=True
     157                info_msg=''
     158                self.lbl_info_msg.set_width_chars(25)
     159                self.lbl_info_msg.set_max_width_chars(25)
    139160                try:
    140161                        msg="<b><big>"+title+"</big></b>"
    141                         self.info_msg=msg+'\n'+subtitle+'\n\n'+text
    142                         self.sw_info=True
     162                        info_msg=msg+'\n'+subtitle+'\n\n'+text
    143163                except Exception as e:
    144164                        sw_ok=False
    145165                        print(e)
     166                self.lbl_info_msg.set_markup(info_msg)
    146167                return sw_ok
    147168        #def set_info_text
    148169
     170        def hide_server_entry(self):
     171                self.txt_server.props.no_show_all=True
     172                self.txt_server.hide()
     173        #def hide_server_entry
     174
     175        def hide_info_box(self):
     176                self.info_box.props.no_show_all=True
     177                self.info_box.hide()
     178        #def hide_info_box
     179
    149180        def get_action_area(self):
    150                 self.sw_info=True
    151181                return self.info_box
    152 
    153         def render_form(self,show_server=True):
    154                 mw_box=Gtk.Box(spacing=0,orientation=Gtk.Orientation.HORIZONTAL)
    155                 (mw_bg,form_bg)=('','')
    156 
    157                 main_box=Gtk.Grid()
    158                 main_box.set_hexpand(True)
    159                 main_box.set_vexpand(True)
    160                 main_box.set_column_homogeneous(True)
    161                 main_box.set_row_homogeneous(True)
    162                 form_box=self._render_login_form(show_server)
    163                 if self.sw_info:
    164                         info_box=self._render_info_form()
    165                         main_box.attach(info_box,1,1,self.left_span,1)
    166                 main_box.attach(form_box,1+self.left_span,1,self.right_span,1)
    167                 mw_box.pack_start(main_box,True,True,0)
    168                 if self.mw_background:
    169                         mw_bg='#mw {'+self.mw_background+';;}'
    170                         mw_box.set_name("mw")
    171                 if self.form_background:
    172                         form_bg='#main {'+self.form_background+';;}'
    173                         form_box.set_name("main")
    174                 if mw_bg or form_bg:
    175                         css=eval('b"""'+mw_bg+form_bg+'"""')
    176                         style_provider=Gtk.CssProvider()
    177                         style_provider.load_from_data(css)
    178                         Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
    179                 return (mw_box)
     182        #def get_action_area
     183
     184        def render_form(self):
     185                self.main_grid.set_hexpand(True)
     186                self.main_grid.set_vexpand(True)
     187                self.main_grid.set_column_homogeneous(True)
     188                self.main_grid.set_row_homogeneous(True)
     189                self._render_login_form()
     190                self._render_info_form()
     191                self.main_grid.attach(self.info_box,1,1,2,1)
     192                self.main_grid.attach(self.form_box,3,1,1,1)
     193                self.pack_start(self.main_grid,True,True,0)
     194                self.set_name("mw")
     195                self.form_box.set_name("main")
    180196        #def render_form
    181197
    182         def _render_login_form(self,show_server):
    183                 form_box=Gtk.Box(spacing=0,orientation=Gtk.Orientation.VERTICAL)
     198        def _render_login_form(self):
     199                self.txt_username=Gtk.Entry()
     200                self.login_banner=Gtk.Image()
     201                if not self._lookup_user_face():
     202                        self.set_login_banner(self.login_banner_default)
     203                self.login_banner.set_margin_bottom(self.default_spacing)
    184204                self.set_default_username(self.username_placeholder)
    185205                self.txt_username.set_icon_from_icon_name(Gtk.EntryIconPosition.PRIMARY,"emblem-personal")
     
    195215               
    196216                self.frame.set_shadow_type(Gtk.ShadowType.OUT)   
    197                 hbox=Gtk.Grid()
    198                 hbox.set_margin_left(self.default_spacing)
    199                 hbox.set_margin_right(self.default_spacing)
    200                 hbox.set_margin_top(self.default_spacing)
    201                 hbox.set_margin_bottom(self.default_spacing)
     217                login_grid=Gtk.Grid()
     218                login_grid.set_margin_left(self.default_spacing)
     219                login_grid.set_margin_right(self.default_spacing)
     220                login_grid.set_margin_top(self.default_spacing)
     221                login_grid.set_margin_bottom(self.default_spacing)
    202222                self.spinner=Gtk.Spinner()
    203223                color=Gdk.Color(0,0,1)
    204224                self.spinner.modify_bg(Gtk.StateType.NORMAL,color)
    205                 hbox.attach(self.spinner,0,1,1,5)
    206                 hbox.attach(self.login_banner,0,0,1,1)
    207                 hbox.attach(self.txt_username,0,1,1,1)
     225                login_grid.attach(self.spinner,0,1,1,5)
     226                login_grid.attach(self.login_banner,0,0,1,1)
     227                login_grid.attach(self.txt_username,0,1,1,1)
    208228                self._set_widget_default_props(self.txt_username,_("Username"))
    209229                self.txt_username.connect('activate',self._validate)
    210                 hbox.attach(self.txt_password,0,2,1,1)
     230                login_grid.attach(self.txt_password,0,2,1,1)
    211231                self._set_widget_default_props(self.txt_password,_("Password"))
    212232                self.txt_password.set_visibility(False)
    213233                self.txt_password.props.caps_lock_warning=True
    214234                self.txt_password.connect('activate',self._validate)
    215                 if show_server:
    216                         hbox.attach(self.txt_server,0,3,1,1)
    217                         self._set_widget_default_props(self.txt_server,_("Master Server IP"))
    218                         self.txt_server.connect('activate',self._validate)
     235                login_grid.attach(self.txt_server,0,3,1,1)
     236                self._set_widget_default_props(self.txt_server,_("Master Server IP"))
     237                self.txt_server.connect('activate',self._validate)
    219238                self.btn_sign.set_margin_top(self.default_spacing)
    220                 hbox.attach(self.btn_sign,0,4,1,1)
     239                login_grid.attach(self.btn_sign,0,4,1,1)
    221240                self.sta_info=Gtk.InfoBar()
    222241                self.sta_info.set_show_close_button(True)
     
    226245                self.sta_info.set_visible(False)
    227246                self.sta_info.set_no_show_all(True)
    228                 self.sta_info.connect('response',self._info_hide)
     247                self.sta_info.connect('response',self._status_info_hide)
    229248                self.sta_info.set_valign(True)
    230                 hbox.props.valign=Gtk.Align.CENTER
    231                 hbox.props.halign=Gtk.Align.CENTER
    232                 form_box.pack_start(self.sta_info,False,True,0)
    233                 form_box.pack_start(hbox,True,True,0)
    234                 return(form_box)
     249                login_grid.props.valign=Gtk.Align.CENTER
     250                login_grid.props.halign=Gtk.Align.CENTER
     251                self.form_box.pack_start(self.sta_info,False,True,0)
     252                self.form_box.pack_start(login_grid,True,True,0)
    235253        #def _render_login_form
    236254
    237255        def _render_info_form(self):
    238                 hbox=Gtk.Box(spacing=self.default_spacing,orientation=Gtk.Orientation.VERTICAL)
    239                 if self.info_banner:
    240                         hbox.pack_start(self.info_banner,False,False,0)
    241                 if self.info_msg:
    242                         lbl_msg=Gtk.Label()
    243                         lbl_msg.set_use_markup(True)
    244                         lbl_msg.set_line_wrap(True)
    245                         lbl_msg.set_width_chars(25)
    246                         lbl_msg.set_max_width_chars(25)
    247                         lbl_msg.set_markup(self.info_msg)
    248                         hbox.pack_start(lbl_msg,True,True,0)
    249                 lbl_bg='#label {background-color:rgba(200,200,200,0.8);;}'
    250                 lbl_msg.set_name("label")
    251                 css=eval('b"""#info {'+self.info_background+';;}'+lbl_bg+'"""')
    252                 style_provider=Gtk.CssProvider()
    253                 style_provider.load_from_data(css)
    254                 Gtk.StyleContext.add_provider_for_screen(Gdk.Screen.get_default(),style_provider,Gtk.STYLE_PROVIDER_PRIORITY_APPLICATION)
     256                self.info_box.set_homogeneous(False)
     257                self.info_banner=Gtk.Image()
     258                info_detail_box=Gtk.Box(spacing=self.default_spacing,orientation=Gtk.Orientation.VERTICAL)
     259                info_detail_box.pack_start(self.info_banner,False,False,0)
     260                self.lbl_info_msg=Gtk.Label()
     261                self.lbl_info_msg.set_use_markup(True)
     262                self.lbl_info_msg.set_line_wrap(True)
     263                info_detail_box.pack_start(self.lbl_info_msg,True,True,0)
     264                self.css_classes['#label']='{background-color:rgba(200,200,200,0.8);;}'
     265                self.lbl_info_msg.set_name("label")
    255266                self.info_box.set_name("info")
    256                 hbox.props.valign=Gtk.Align.CENTER
    257                 hbox.props.halign=Gtk.Align.CENTER
    258                 self.info_box.pack_start(hbox,True,True,0)
    259                 return(self.info_box)
     267                info_detail_box.props.valign=Gtk.Align.CENTER
     268                info_detail_box.props.halign=Gtk.Align.CENTER
     269                self.info_box.pack_start(info_detail_box,True,True,0)
     270                self._set_css()
    260271        #def _render_info_form
    261272
     
    266277        #def _set_widget_default_props
    267278
    268         def _info_hide(self,widget,data):
     279        def _status_info_hide(self,widget,data):
    269280                self.sta_info.hide()
    270281                self.frame.set_sensitive(True)
     
    302313                        self.sta_info.show()
    303314                        self.lbl_error.show()
    304                 if ret[0]:
     315                elif self.allowed_groups and not set(self.allowed_groups).intersection(ret[1]):
     316                        #Check user groups
     317                        self.lbl_error.set_text(_("User not allowed"))
     318                        self.sta_info.show()
     319                        self.lbl_error.show()
     320                else:
    305321                        GLib.idle_add(self.after_validate,user,pwd,server)
    306322                #local validation
     
    324340                c = n4d.ServerProxy("https://"+server+":9779",context=context,allow_none=True)
    325341                return c
     342        #def _n4d_connect
Note: See TracChangeset for help on using the changeset viewer.