Changeset 7983


Ignore:
Timestamp:
Aug 24, 2018, 12:03:16 PM (12 months ago)
Author:
mabarracus
Message:

New capabilities to set desktop,background,plank items
Todo: Translate strings
Todo: Need check compatibility with old profiles

Location:
syncer-plank/trunk/fuentes
Files:
1 added
3 edited

Legend:

Unmodified
Added
Removed
  • syncer-plank/trunk/fuentes/debian/changelog

    r7007 r7983  
     1syncer-plank (0.3.8.3) unreleased; urgency=medium
     2
     3  * New capabilities to set desktop,background,plank items
     4  * Todo: Translate strings
     5  * Todo: Need check compatibility with old profiles
     6
     7 -- M.Angel Juan <m.angel.juan@gmail.com>  Fri, 24 Aug 2018 11:57:05 +0200
     8
    19syncer-plank (0.3.8.2) xenial; urgency=medium
    210
  • syncer-plank/trunk/fuentes/debian/control

    r4808 r7983  
    1111Package: syncer-plank
    1212Architecture: all
    13 Depends: ${shlibs:Depends}, ${misc:Depends}, python3, syncer, syncer-plank-client
     13Depends: ${shlibs:Depends}, ${misc:Depends}, python3, syncer (> 1.3), syncer-plank-client (> 0.2.1)
    1414Description: Plank synchronizer gui
    1515 User interface for plank synchronizer
  • syncer-plank/trunk/fuentes/syncer-plank.install/usr/bin/syncer-plank-gui

    r4452 r7983  
    8888#
    8989def dbg(*args,**kwargs):
    90     enable=False
     90    enable=True
    9191    if enable:
    9292        for x in args:
     
    135135import xmlrpc.client as x
    136136import ssl
     137import subprocess
     138import tempfile
     139import base64
     140import shutil
    137141
    138142gi.require_version('Gtk','3.0')
     
    301305    ##############################
    302306    #
     307    # Search desktop elements into user desktop
     308    #
     309    ##############################
     310    def get_desktop_folder(self,*args,**kwargs):
     311        name = None
     312        try:
     313            name = subprocess.check_output(['xdg-user-dir','DESKTOP']).decode().strip()
     314        except Exception as e:
     315            dbg('{} getting desktop folder from xdg'.format(str(e), filename))
     316        return name
     317
     318    ##############################
     319    #
     320    # Search desktop elements into user desktop
     321    #
     322    ##############################
     323    def search_local_desktops(self, *args, **kwargs):
     324        check_args('files_cache', **kwargs)
     325        files_cache = kwargs['files_cache']
     326
     327        list_apps = []
     328        theme = 'Vibrancy-Colors'
     329
     330        desktop_folder = self.get_desktop_folder()
     331
     332        try:
     333            file_names = [filename for filename in
     334                          glob.iglob(desktop_folder+'/*.desktop',
     335                                     recursive=True)]
     336        except Exception as e:
     337            return list_apps
     338
     339        for filename in file_names:
     340            try:
     341                basename = os.path.splitext(os.path.basename(filename))[0]
     342                if basename == 'desktop':
     343                    icon_file = 'preferences-desktop-wallpaper.png'
     344                    complete_filename = [filename for filename in
     345                                         glob.iglob('/usr/share/icons/' + theme + '/**/' + icon_file,
     346                                                    recursive=True)][0]
     347                    name = 'Show desktop'
     348                    if complete_filename:
     349                        list_apps.append((complete_filename, basename, basename, filename, name))
     350                elif basename == 'matecc':
     351                    icon_file = 'preferences-desktop.png'
     352                    complete_filename = [filename for filename in
     353                                         glob.iglob('/usr/share/icons/' + theme + '/**/' + icon_file,
     354                                                    recursive=True)][0]
     355                    name = 'Control center'
     356                    if complete_filename:
     357                        list_apps.append((complete_filename, basename, basename, filename, name))
     358                else:
     359                    result = self.scan_desktop_file(filename=filename, files_cache=files_cache)
     360                    if result:
     361                        list_apps.append(result)
     362            except Exception as e:
     363                dbg('{} processing local filename \'{}\''.format(str(e), filename))
     364
     365        return list_apps
     366
     367    ##############################
     368    #
    303369    # Search location of icon appname
    304370    #
     
    394460        except:
    395461            return []
    396 
     462        # LIMIT
     463        #file_names = file_names[1:50]
    397464        outlist=[]
    398465        procesed_items=0
     
    574641    #
    575642    ##############################
    576     def n4d_rename_profile(self,*args,**kwargs):
    577         check_args('user','pwd','old','new',**kwargs)
    578         d = {'args': (kwargs['user'],kwargs['pwd']), 'oldname': kwargs['old'], 'newname': kwargs['new'],'action':'profile_is_renamed'}
    579         #rename_profile = lambda x: x.update({'result': self.n4d.rename_profile(x.get('args'), 'PlankSync', x.get('oldname'), x.get('newname'))})
    580         def rename_profile(x):
    581             try:
    582                 self.n4d_sepaphore.acquire()
    583                 x.update({'result': self.n4d.rename_profile(x.get('args'), 'PlankSync', x.get('oldname'), x.get('newname'))})
    584                 self.n4d_sepaphore.release()
    585             except Exception as e:
    586                 raise Exception(e)
    587         return self.do_call(rename_profile, d, self.ctl.process)
     643    # def n4d_rename_profile(self,*args,**kwargs):
     644    #     check_args('user','pwd','old','new',**kwargs)
     645    #     d = {'args': (kwargs['user'],kwargs['pwd']), 'oldname': kwargs['old'], 'newname': kwargs['new'],'action':'profile_is_renamed'}
     646    #     #rename_profile = lambda x: x.update({'result': self.n4d.rename_profile(x.get('args'), 'PlankSync', x.get('oldname'), x.get('newname'))})
     647    #     def rename_profile(x):
     648    #         try:
     649    #             self.n4d_sepaphore.acquire()
     650    #             x.update({'result': self.n4d.rename_profile(x.get('args'), 'PlankSync', x.get('oldname'), x.get('newname'))})
     651    #             self.n4d_sepaphore.release()
     652    #         except Exception as e:
     653    #             raise Exception(e)
     654    #     return self.do_call(rename_profile, d, self.ctl.process)
    588655
    589656    ##############################
     
    593660    ##############################
    594661    def n4d_update_profile(self,*args,**kwargs):
    595         check_args('user','pwd','name','grouplist','applist',**kwargs)
    596         d = {'args': (kwargs['user'],kwargs['pwd']), 'name': kwargs['name'], 'group': kwargs['grouplist'], 'applist': kwargs['applist'], 'action':'profile_is_updated'}
     662        check_args('user','pwd','name','newname','grouplist','applist',**kwargs)
     663        d = {'args': (kwargs['user'],kwargs['pwd']), 'name': kwargs['name'], 'newname': kwargs['newname'], 'group': kwargs['grouplist'], 'applist': kwargs['applist'], 'action':'profile_is_updated'}
    597664        try:
    598665            check_args('status_bar',**kwargs)
     
    604671            try:
    605672                self.n4d_sepaphore.acquire()
    606                 x.update({'result': self.n4d.update_profile(x.get('args'), 'PlankSync', x.get('name'), x.get('group'),
     673                x.update({'result': self.n4d.update_profile(x.get('args'), 'PlankSync', x.get('name'), x.get('newname'), x.get('group'),
    607674                                                            x.get('applist'))})
    608675                self.n4d_sepaphore.release()
     
    620687        return self.do_call(update_profile, d, callback)
    621688
     689    def n4d_update_profile_groups(self,*args,**kwargs):
     690        check_args('user','pwd','name','grouplist',**kwargs)
     691        d = {'args': (kwargs['user'],kwargs['pwd']), 'name': kwargs['name'], 'group': kwargs['grouplist'], 'action':'profile_is_updated'}
     692        try:
     693            check_args('status_bar',**kwargs)
     694            d.update({'status_bar':kwargs['status_bar']})
     695        except:
     696            pass
     697        #update_profile = lambda x: x.update({'result': self.n4d.update_profile(x.get('args'), 'PlankSync', x.get('name'), x.get('group'),x.get('applist'))})
     698        def update_profile_groups(x):
     699            try:
     700                self.n4d_sepaphore.acquire()
     701                x.update({'result': self.n4d.update_profile_groups(x.get('args'), 'PlankSync', x.get('name'), x.get('group'))})
     702                self.n4d_sepaphore.release()
     703            except Exception as e:
     704                raise Exception(e)
     705        #
     706        # Multiple callback is possible if not needed to do normal processing using 'noprocess' parameter
     707        #
     708        try:
     709            check_args('noprocess', **kwargs)
     710            new_callback_func = kwargs['noprocess']
     711            callback = new_callback_func
     712        except:
     713            callback = self.ctl.process
     714        return self.do_call(update_profile_groups, d, callback)
     715
     716    def prepare_workspace(self,*args,**kwargs):
     717        check_args('profile',**kwargs)
     718        profile = kwargs['profile']
     719        workspace = []
     720        try:
     721            tempdir = tempfile.mkdtemp()
     722            for list_item in profile:
     723                type_item = list_item[0]
     724                content_item = list_item[1]
     725                if type_item == 'users':
     726                    workspace.append(['users',content_item])
     727                elif type_item == 'file':
     728                    if content_item[0] == 'encoded':
     729                        fp = tempfile.NamedTemporaryFile(mode='wb',delete=False, dir=tempdir)
     730                        the_file = fp.name
     731                        fp.write(base64.b64decode(content_item[2]))
     732                        if not os.path.exists(tempdir+'/'+os.path.basename(content_item[1])):
     733                            shutil.move(the_file,tempdir+'/'+os.path.basename(content_item[1]))
     734                            the_file = tempdir+'/'+os.path.basename(content_item[1])
     735                        workspace.append(['file',the_file])
     736                elif type_item == 'comm':
     737                    workspace.append('comm')
     738                elif type_item == 'dconf':
     739                    workspace.append('dconf')
     740                elif type_item in ['desktop','plank']:
     741                    if content_item[0] == 'addcontent':
     742                        workspace.append(type_item)
     743            to_remove=[]
     744            for i in range(len(workspace)-1,-1,-1):
     745                try:
     746                    if workspace[i-1] == 'comm' and workspace[i-2][0] == 'file':
     747                        workspace[i]=[workspace[i],workspace[i-2][1]]
     748                        to_remove.append(i-1)
     749                        to_remove.append(i-2)
     750                except:
     751                    pass
     752            for i in to_remove:
     753                del workspace[i]
     754            for i in range(len(workspace)):
     755                if workspace[i][0] in ['desktop','plank']:
     756                    content = self.scan_desktop_file(filename=workspace[i][1], files_cache=self.ctl.files_cache)
     757                    workspace[i].extend(list(content))
     758            return workspace
     759        except Exception as e:
     760            return None
     761
    622762##############################
    623763#
     
    641781        # build stack components for the window
    642782        #
    643         self.boxes_main = ['box_login','box_loading','box_main_btn','box_profiles','box_dialog','box_pselector','box_group_edit','box_warning']
     783        self.boxes_main = ['box_login','box_loading','box_main_btn','box_profiles2','box_dialog','box_pselector','box_group_edit','box_warning','box_edit_elements']
    644784        self.boxes_bottom = ['box_lvl','box_status']
    645785        self.stack_main = {'obj': self.build_stack(boxes=self.boxes_main),'stack':[]}
    646786        self.stack_bottom = { 'obj': self.build_stack(boxes=self.boxes_bottom), 'stack':[]}
    647 
     787        self.dialog_filechooser = self.ctl.getobj('filechooser')
    648788        #
    649789        # get place to put stack
     
    9251065        return
    9261066
     1067    def show_edit_mode(self,*args,**kwargs):
     1068        if 'hide' in args:
     1069            self.ctl.getobj('rbtn_move').hide()
     1070            self.ctl.getobj('rbtn_copy').hide()
     1071        elif 'show' in args:
     1072            self.ctl.getobj('rbtn_move').show()
     1073            self.ctl.getobj('rbtn_copy').show()
     1074        else:
     1075            self.ctl.getobj('rbtn_move').show()
     1076            self.ctl.getobj('rbtn_copy').show()
     1077
    9271078##############################
    9281079#
     
    9801131        self.ctl.process(action='refilter_elements')
    9811132
     1133    def put_current_items(self,*args,**kwargs):
     1134        self.ctl.process(action='put_current_items')
     1135
    9821136    def swap(self,*args,**kwargs):
    9831137        id=self.get_selected_rowid(selected_obj=args[0],type='apps')
     
    9851139
    9861140    def swap_local_elements(self,*args,**kwargs):
    987         self.ctl.process(action='swap_locals')
     1141        pass
     1142        # deprecated since v3
     1143        #self.ctl.process(action='swap_locals')
    9881144
    9891145    def go_to_ask_remove_profile(self,*args,**kwargs):
     
    10071163    def go_to_main_window(self,*args,**kwargs):
    10081164        self.ctl.process(action='goto',to='main_window')
     1165
     1166    def cancel_profile(self,*args,**kwargs):
     1167        self.ctl.process(action='cancel_profile')
    10091168
    10101169    def combo_changed(self,*args,**kwargs):
     
    10201179            selected = model[iter][1]
    10211180            self.ctl.process(action='change_relations',group=textlabel,profile=selected)
     1181
     1182    def go_to_filechooser(self,*args,**kwargs):
     1183        self.ctl.process(action='goto', to='filechooser')
     1184
     1185    def close_btn_filechooser(self,*args,**kwargs):
     1186        self.ctl.process(action='close_filechooser')
     1187
     1188    def selection_changed(self,*args,**kwargs):
     1189        print('use file direct'+self.ctl.resource_previewed)
     1190        self.ctl.process(action='selected_resource')
     1191
     1192    def select_file(self,*args,**kwargs):
     1193        print('use file '+self.ctl.resource_previewed)
     1194        self.ctl.process(action='selected_resource')
     1195
     1196    def selection_preview(self,*args,**kwargs):
     1197        filechooser = args[0].get_preview_file()
     1198        if filechooser:
     1199            file = filechooser.get_path()
     1200            ext = file.split('.')
     1201            if ext[-1].lower() in ['png','jpg']:
     1202                print('previewed '+file)
     1203                self.ctl.process(action='selection_changed',file=file)
     1204
     1205    def profile_accepted(self,*args,**kwargs):
     1206        self.ctl.process(action='profile_accepted')
     1207
     1208    def go_edit_plank_items(self, *args, **kwargs):
     1209        self.ctl.process(action='edit_plank_items')
     1210
     1211    def go_edit_desktop_items(self, *args, **kwargs):
     1212        self.ctl.process(action='edit_desktop_items')
     1213
     1214    def cancel_edit_elements(self, *args, **kwargs):
     1215        self.ctl.process(action='cancel_edit_elements')
     1216
     1217    def accept_edit_elements(self, *args, **kwargs):
     1218        self.ctl.process(action='accept_edit_items')
     1219
     1220    def remove_background(self, *args, **kwargs):
     1221        self.ctl.process(action='remove_selected_background')
     1222
     1223    def preview_background(self, *args, **kwargs):
     1224        self.ctl.process(action='preview_background')
     1225
     1226    def close_preview_window(self, *args, **kwargs):
     1227        self.ctl.process(action='close_preview')
     1228
     1229    def change_edit_mode(self,*args,**kwargs):
     1230        name=[r for r in args[0].get_group() if r.get_active()][0].get_name()
     1231        self.ctl.process(action='change_edit_mode',name=name)
     1232
    10221233
    10231234##############################
     
    10331244    NAME = 4
    10341245    DESCRIPTION = 5
    1035     SELECTED = 6
    1036     BASENAME = 7
    1037     FULLPATH = 8
     1246    SELECTED_DESKTOP = 6
     1247    SELECTED_PLANK = 7
     1248    BASENAME = 8
     1249    FULLPATH = 9
    10381250
    10391251class PROFCOL():
     
    10661278        self.store_elements = self.ctl.getobj('liststore_elements')
    10671279        self.store_profiles = self.ctl.getobj('liststore_profiles')
     1280
    10681281        self.n_selected = 0
    10691282        self.current_relations = {}
    10701283
    1071         self.init_sorted_filtering()
     1284        self.init_sorted_filtering(type='all')
    10721285        pass
    10731286
     
    10801293        self.clear_liststore(type=typearg)
    10811294        if typearg == 'apps':
    1082             for t in ['local','system']:
     1295            for t in ['local','system','desktop']:
    10831296                self.add_to_liststore(list=self.cache_lists[t], type=t)
    10841297        if 'profiles' == typearg:
     
    10911304    #
    10921305    ##############################
    1093     def init_sorted_filtering(self,*args,**kwargs):
    1094         for objname in ['elements','selected']:
    1095             obj=self.ctl.getobj('sort_'+objname)
    1096             # Init sorting
    1097             sort_column_in_model=APPCOL.NAME
    1098             obj.set_sort_column_id(sort_column_in_model,Gtk.SortType.ASCENDING)
    1099             model_filter=self.ctl.getobj('filter_'+objname)
    1100             # Init filters
    1101             if objname == 'selected':
    1102                 model_filter.set_visible_func(self.filter_func_selected)
    1103             else:
    1104                 model_filter.set_visible_func(self.filter_func_apps)
    1105 
     1306    def init_sorted_filtering(self, *args,**kwargs):
     1307        if 'type' not in kwargs:
     1308            type == 'all'
     1309        else:
     1310            type = kwargs['type']
     1311        if type not in ['elements','selected_plank','selected_desktop','all']:
     1312            return False
     1313        all = ['elements','selected_plank','selected_desktop']
     1314        if type == 'all':
     1315            for t in all:
     1316                self.init_sorted_filtering(type=t)
     1317            return
     1318        obj=self.ctl.getobj('sort_'+type)
     1319        # Init sorting
     1320        sort_column_in_model=APPCOL.NAME
     1321        obj.set_sort_column_id(sort_column_in_model,Gtk.SortType.ASCENDING)
     1322        model_filter=self.ctl.getobj('filter_'+type)
     1323        # Init filters
     1324        if type == 'selected_desktop':
     1325            model_filter.set_visible_func(self.filter_func_selected_desktop)
     1326        if type == 'selected_plank':
     1327            model_filter.set_visible_func(self.filter_func_selected_plank)
     1328        if type == 'elements':
     1329            model_filter.set_visible_func(self.filter_func_apps)
    11061330
    11071331    ##############################
     
    11251349    def set_liststore_selections(self,*args,**kwargs):
    11261350        check_args('list','type', **kwargs)
     1351        if kwargs['type'] not in ['desktop','plank']:
     1352            return None
    11271353        store = kwargs['type']
    1128         app_list = kwargs['list']
    1129         app_list = [name.lower() for name in app_list]
     1354        app_list = list(kwargs['list'])
    11301355        current_store = None
    11311356        id_element_selection = None
    11321357        id_element_name = None
    11331358
    1134         if store == 'apps':
     1359        if store == 'desktop':
    11351360            current_store = self.store_elements
    1136             id_element_selection = APPCOL.SELECTED
     1361            id_element_selection = APPCOL.SELECTED_DESKTOP
     1362            id_element_name = APPCOL.BASENAME
     1363        if store == 'plank':
     1364            current_store = self.store_elements
     1365            id_element_selection = APPCOL.SELECTED_PLANK
    11371366            id_element_name = APPCOL.BASENAME
    11381367        if 'profiles' == store:
     
    11471376            elif x[id_element_selection]:
    11481377                x[id_element_selection] = False
    1149             if len(app_list) == 0:
    1150                 break
    11511378        return
     1379
     1380    def put_current_items(self, *args, **kwargs):
     1381        current_desktop = self.get_liststore_selections(type='desktop')
     1382        current_plank = self.get_liststore_selections(type='plank')
     1383        for x in self.store_elements:
     1384            if x[APPCOL.TYPE] == 'system':
     1385                continue
     1386            if x[APPCOL.TYPE] == 'desktop':
     1387                if x[APPCOL.BASENAME].lower() not in current_desktop:
     1388                    x[APPCOL.SELECTED_DESKTOP] = True
     1389            if x[APPCOL.TYPE] == 'local':
     1390                if x[APPCOL.BASENAME].lower() not in current_plank:
     1391                    x[APPCOL.SELECTED_PLANK] = True
    11521392
    11531393    ##############################
     
    11611401
    11621402        current_store = None
    1163         if store == 'apps':
     1403        if store == 'desktop':
    11641404            current_store = self.store_elements
    1165             id_element_selection = APPCOL.SELECTED
     1405            id_element_selection = APPCOL.SELECTED_DESKTOP
     1406            id_element_target = APPCOL.BASENAME
     1407        if store == 'plank':
     1408            current_store = self.store_elements
     1409            id_element_selection = APPCOL.SELECTED_PLANK
    11661410            id_element_target = APPCOL.BASENAME
    11671411        if store == 'profiles':
     
    12001444        lapps=kwargs['list']
    12011445        typearg=kwargs['type']
    1202         if typearg == 'local' or typearg == 'system':
     1446        if typearg in ['local','system','desktop']:
    12031447            if typearg == 'local':
    12041448                i = 1
     1449            elif typearg == 'desktop':
     1450                i = 1000
    12051451            else:
    1206                 i = 1000
     1452                i = 10000
    12071453            for item in lapps:
    12081454                #
     
    12101456                # [0]icon_path(string), [1]name(string), [2]desktop_basename(string), [3]path_to_desktop_or_dockitem(string), [4]description(string)
    12111457                # Liststore:
    1212                 # [0]visible(bool), [1]type(string), [2]id(int(1<local<1000<system)), [3]icon(GdkPixbuf), [4]name(string), [5]description(string), [6]selected(bool), [7]desktop_basename(string) [8]full_path(string)
     1458                # [0]visible(bool), [1]type(string), [2]id(int(1<local<1000<system)), [3]icon(GdkPixbuf), [4]name(string), [5]description(string), [6]selected_desktop(bool), [7]selected_plank(bool), [8]desktop_basename(string) [9]full_path(string)
    12131459                #
    12141460
     
    12281474                else:
    12291475                    desc = item[4]
    1230                 self.store_elements.append([True,typearg,i,pix,item[1],desc,False,item[2],item[3]])
     1476                self.store_elements.append([True,typearg,i,pix,item[1],desc,False,False,item[2],item[3]])
    12311477                i += 1
    12321478        elif typearg == 'profiles':
     
    12461492        # [0]icon_path(string), [1]name(string), [2]desktop_basename(string), [3]path_to_desktop_or_dockitem(string), [4]description(string)
    12471493        FILTER_COL=1
    1248         for type in ['system','local']:
     1494        for type in ['system','local','desktop']:
    12491495            l = []
    12501496            for i in self.cache_lists[type]:
     
    12571503    ##############################
    12581504    #
    1259     # Visible function 4 selected treeview
    1260     #
    1261     ##############################
    1262     def filter_func_selected(self,*args,**kwargs):
     1505    # Visible functions 4 selected treeview
     1506    #
     1507    ##############################
     1508    def filter_func_selected_desktop(self,*args,**kwargs):
    12631509        model=args[0]
    12641510        iter=args[1]
    1265         is_selected = model.get_value(iter,APPCOL.SELECTED)
     1511        is_selected = model.get_value(iter,APPCOL.SELECTED_DESKTOP)
    12661512        if is_selected:
    12671513            return True
    12681514        return False
     1515
     1516    def filter_func_selected_plank(self,*args,**kwargs):
     1517        model=args[0]
     1518        iter=args[1]
     1519        is_selected = model.get_value(iter,APPCOL.SELECTED_PLANK)
     1520        if is_selected:
     1521            return True
     1522        return False
     1523
    12691524    ##############################
    12701525    #
     
    12761531        iter = args[1]
    12771532
    1278         selected = model.get_value(iter, APPCOL.SELECTED)
     1533        if model.get_value(iter,APPCOL.TYPE) != 'system':
     1534            return False
     1535        selected = None
     1536        if self.ctl.current_selection == 'desktop':
     1537            selected = model.get_value(iter, APPCOL.SELECTED_DESKTOP)
     1538        if self.ctl.current_selection == 'plank':
     1539            selected = model.get_value(iter, APPCOL.SELECTED_PLANK)
    12791540        if selected:
    12801541            return False
     
    12831544        description = model.get_value(iter,APPCOL.DESCRIPTION)
    12841545
    1285         entry_text=self.ctl.window.get_entry('entry_filter')
     1546        entry_text=self.ctl.window.get_entry('entry_filter_elements')
    12861547        entry_text=entry_text[0].lower().strip()
    12871548        if entry_text == '':
     
    13051566        if type_refilter == 'elements':
    13061567            return
    1307         model_filter_selected=self.ctl.getobj('filter_selected')
    1308         model_filter_selected.refilter()
     1568        if type_refilter == 'selected_plank' or type_refilter == 'all':
     1569            model_filter_selected=self.ctl.getobj('filter_selected_plank')
     1570            model_filter_selected.refilter()
     1571        if type_refilter == 'selected_desktop' or type_refilter == 'all':
     1572            model_filter_selected = self.ctl.getobj('filter_selected_desktop')
     1573            model_filter_selected.refilter()
    13091574        return
    13101575
     
    13151580    ##############################
    13161581    def count_selected(self,*args,**kwargs):
     1582        check_args('type',**kwargs)
     1583        type = kwargs['type']
    13171584        i=0
     1585        j=0
     1586        col = None
     1587        if type == 'plank':
     1588            col = APPCOL.SELECTED_PLANK
     1589        if type == 'desktop':
     1590            col = APPCOL.SELECTED_DESKTOP
    13181591        for a in self.store_elements:
    1319            if a[APPCOL.SELECTED]:
    1320                i+=1
    1321         self.n_selected=i
    1322         return i
     1592            if type == 'all':
     1593                if a[APPCOL.SELECTED_DESKTOP]:
     1594                    i+=1
     1595                if a[APPCOL.SELECTED_PLANK]:
     1596                    j+=1
     1597            else:
     1598                if a[col]:
     1599                    i+=1
     1600        if type == 'all':
     1601            self.n_selected=i
     1602            self.n_selected2 = j
     1603            return (i,j)
     1604        else:
     1605            self.n_selected = i
     1606            return i
    13231607
    13241608    ##############################
     
    13281612    ##############################
    13291613    def load_profile_into_liststore(self,*args,**kwargs):
    1330         check_args('apps_selected',**kwargs)
    1331         apps_selected=kwargs['apps_selected']
     1614        check_args('workspace',**kwargs)
     1615        workspace=kwargs['workspace']
     1616        desktops=[]
     1617        planks=[]
     1618        background=[]
     1619        for x in workspace:
     1620            if x[0] == 'desktop':
     1621                desktops.append(x[4])
     1622                pass
     1623            elif x[0]== 'plank':
     1624                planks.append(x[4])
     1625                pass
     1626            elif x[0] == 'dconf':
     1627                self.ctl.resource_previewed = x[1]
     1628                background.append(x[1])
     1629                self.ctl.process(action='selected_resource')
     1630                pass
    13321631
    13331632        # Clear selections is done when setting selections
    1334         self.set_liststore_selections(list=apps_selected,type='apps')
    1335         return
     1633        self.set_liststore_selections(list=desktops,type='desktop')
     1634        self.set_liststore_selections(list=planks, type='plank')
     1635        return {'desktop': desktops, 'plank': planks, 'background': background}
    13361636
    13371637    ##############################
     
    13711671    def sort_profiles(self,*args,**kwargs):
    13721672        self.profile_list.sort(key=lambda x: x[0])
     1673
     1674    def change_model_selected(self,*args,**kwargs):
     1675        check_args('type',**kwargs)
     1676        type = kwargs['type']
     1677        tv= self.ctl.getobj('treeview_selected_elements')
     1678
     1679        if type == 'desktop':
     1680            model = self.ctl.getobj('sort_selected_desktop')
     1681            tv.set_model(model)
     1682        if type == 'plank':
     1683            model = self.ctl.getobj('sort_selected_plank')
     1684            tv.set_model(model)
     1685        return
    13731686
    13741687##############################
     
    13811694        self.aborting_all_operations = False
    13821695        self.builder=self.load_glade(**kwargs)
    1383 
     1696        #self.test = None
    13841697        #
    13851698        # Main objects
     
    13971710        self.building_view = False
    13981711
     1712        self.files_cache = None
    13991713        #
    14001714        # Remember what user are doing
     
    14021716        self.last_window = None
    14031717        # new_profile or the profile_name what is currently being modified
    1404         self.user_is_editing=None
    1405         self.initial_liststore=None
    1406         self.initial_profile_name=''
     1718        self.user_is_editing = None
     1719        self.initial_liststore = {}
     1720        self.initial_profile_name = ''
    14071721        # Flags to remember what changed into window
    14081722        self.profile_name_changed = None
    14091723        self.applist_changed = None
    1410 
     1724        self.current_selection = None
     1725        # Current file selected
     1726        self.resource_previewed = None
     1727        self.edit_mode = None
     1728        # Backup data selections
     1729        self.backup_selections = {}
    14111730        #
    14121731        # Init actions
     
    14351754        self.profile_name_changed = False
    14361755        self.applist_changed = False
    1437         self.initial_liststore = None
     1756        self.initial_liststore = {}
    14381757        self.initial_profile_name = ''
     1758        self.edit_mode = 'move'
     1759        self.resource_previewed = None
    14391760    #
    14401761    # Load glade file
     
    14421763    def load_glade(self,*args,**kwargs):
    14431764        if kwargs['localpath']:
    1444             gladefile = kwargs['localpath']+'/'+"gui_v2b.glade"
     1765            gladefile = kwargs['localpath']+'/'+"gui_v3.glade"
    14451766        builder = Gtk.Builder()
    14461767        dbg('Loading '+gladefile)
     
    14631784        #
    14641785        self.model.cache_info['msg']=_('Building file cache...')
    1465         files_cache = glob.glob('/usr/share/icons/**/*.png', recursive=True)
     1786        self.files_cache = glob.glob('/usr/share/icons/**/*.png', recursive=True)
    14661787        #
    14671788        # Get current user Plank elements
     
    14691790        self.model.cache_info['msg']=_("Searching local apps...")
    14701791        try:
    1471             self.model.cache_lists['local'] = self.helper.search_local_plank(files_cache=files_cache)
     1792            self.model.cache_lists['local'] = self.helper.search_local_plank(files_cache=self.files_cache)
    14721793        except:
    14731794            dbg('Error building local cache list')
     
    14781799        self.model.cache_info['msg'] = _("Searching system apps...")
    14791800        try:
    1480             self.model.cache_lists['system']=self.helper.search_in_applications(cache_info=self.model.cache_info,files_cache=files_cache)
     1801            self.model.cache_lists['system'] = self.helper.search_in_applications(cache_info=self.model.cache_info,files_cache=self.files_cache)
    14811802        except:
    14821803            dbg('Error building system cache list')
    14831804            self.model.cache_lists['system'] = []
     1805
     1806        #
     1807        # Get data from user desktop
     1808        #
     1809        self.model.cache_info['msg'] = _("Searching desktop apps...")
     1810        try:
     1811            self.model.cache_lists['desktop'] = self.helper.search_local_desktops(files_cache=self.files_cache)
     1812        except:
     1813            dbg('Error building desktops cache list')
     1814            self.model.cache_lists['desktop'] = []
     1815
    14841816        #
    14851817        # Purge possible duplicated entries
     
    14921824        #
    14931825        if len(self.model.cache_lists['system']) > 0:
    1494             self.window.set_txt_status_bars('', '', '{} {}({}) {}({})'.format(_('Detected apps:'), _('Plank'),
     1826            self.window.set_txt_status_bars('', '', '{} {}({}) {}({}) {}({})'.format(_('Detected apps:'), _('Plank'),
    14951827                                                                              len(self.model.cache_lists['local']),
    14961828                                                                              _('System'),
    1497                                                                               len(self.model.cache_lists['system'])))
     1829                                                                              len(self.model.cache_lists['system']),
     1830                                                                              _('Desktops'),
     1831                                                                              len(self.model.cache_lists['desktop'])))
    14981832            self.helper.clean_status_bar(2)
    14991833            self.model.cache_info['msg'] = _('Ready!')
     
    15061840        self.window.change_stack('next',stack='bottom')
    15071841
     1842    def debug_model(self,model):
     1843        for i in model:
     1844            li = list(i)
     1845            print('{}'.format(li))
     1846
     1847    def check_profile_changes(self,*args,**kwargs):
     1848        let_continue = True
     1849        # def same_elements(la, lb):
     1850        #     for x in la:
     1851        #         if x not in lb:
     1852        #             return False
     1853        #     for x in lb:
     1854        #         if x not in la:
     1855        #             return False
     1856        #     return True
     1857        #
     1858        changes = []
     1859        # for x in self.initial_liststore:
     1860        #     if x in ['desktop', 'plank']:
     1861        #         ltest = self.model.get_liststore_selections(type=x)
     1862        #         if not same_elements(ltest, self.initial_liststore[x]):
     1863        #             changes.append('changed_'+x)
     1864        #         if len(ltest) == 0:
     1865        #             changes.append('empty_'+x)
     1866        #     elif x == 'background':
     1867        #         bg = self.window.get_entry('entry_desktop_background')[0]
     1868        #         bg = bg.strip()
     1869        #         if bg != self.initial_liststore[x][0]:
     1870        #             changes.append('changed_'+x)
     1871        #         if bg == '':
     1872        #             changes.append('empty_'+x)
     1873        pname = self.window.get_entry('profile_name_entry')[0]
     1874        pname = pname.strip()
     1875        if pname == '':
     1876            changes.append('empty_pname')
     1877        if pname != self.initial_profile_name:
     1878            changes.append('changed_pname')
     1879        if self.user_is_editing == '_____new_profile_____':
     1880            changes.append('new_profile')
     1881        else:
     1882            changes.append('editing_profile')
     1883        #
     1884        if 'empty_name' in changes:
     1885            return False
     1886        if 'new_profile' in changes:
     1887            if 'changed_pname' in changes:
     1888                if not self.model.check_profile_name(name=pname, type='available'):
     1889                    self.window.set_entry({'lbl_msg_warning': _('Profile name not valid')})
     1890                    self.window.change_stack('box_warning')
     1891                    let_continue = False
     1892        elif 'editing_profile' in changes:
     1893            if 'changed_pname' in changes:
     1894                if not self.model.check_profile_name(name=pname, type='available'):
     1895                    self.window.set_entry({'lbl_msg_warning': _('Profile name not valid')})
     1896                    self.window.change_stack('box_warning')
     1897                    let_continue = False
     1898        #         else:
     1899        #             changes.append('need_remove')
     1900        #
     1901        # if 'changed_desktop' in changes:
     1902        #     desktops = self.model.get_liststore_selections(type='desktop')
     1903        # else:
     1904        #     desktops = self.initial_liststore['desktop']
     1905        # if 'changed_plank' in changes:
     1906        #     planks = self.model.get_liststore_selections(type='plank')
     1907        # else:
     1908        #     planks = self.initial_liststore['plank']
     1909        # if 'changed_background' in changes:
     1910        #     bg = self.window.get_entry('entry_desktop_background')[0]
     1911        # else:
     1912        #     bg = self.initial_liststore['background'][0]
     1913
     1914        #pname = self.window.get_entry('profile_name_entry')[0]
     1915        #pname = pname.strip()
     1916        if let_continue:
     1917            desktops = self.model.get_liststore_selections(type='desktop')
     1918            planks = self.model.get_liststore_selections(type='plank')
     1919            bg = self.window.get_entry('entry_desktop_background')[0]
     1920
     1921            desktop_pack = []
     1922            plank_pack = []
     1923            bg_pack = []
     1924            for x in desktops:
     1925                for info in self.model.store_elements:
     1926                    if x == info[APPCOL.BASENAME]:
     1927                        content = None
     1928                        try:
     1929                            with open(info[APPCOL.FULLPATH],'rb') as fp:
     1930                                content = base64.b64encode(fp.read())
     1931                        except Exception as e:
     1932                            continue
     1933                        desktop_pack.append([info[APPCOL.FULLPATH],info[APPCOL.BASENAME],content.decode()])
     1934                        break
     1935            for x in planks:
     1936                for info in self.model.store_elements:
     1937                    if x == info[APPCOL.BASENAME]:
     1938                        content = None
     1939                        try:
     1940                            with open(info[APPCOL.FULLPATH], 'rb') as fp:
     1941                                content = base64.b64encode(fp.read())
     1942                        except Exception as e:
     1943                            continue
     1944                        plank_pack.append([info[APPCOL.FULLPATH], info[APPCOL.BASENAME],content.decode()])
     1945                        break
     1946            content = None
     1947            try:
     1948                with open(bg, 'rb') as fp:
     1949                    content = base64.b64encode(fp.read())
     1950                bg_pack = [bg,content.decode()]
     1951            except:
     1952                pass
     1953
     1954
     1955            grp = self.model.get_group_from_profile(nameprofile=pname)
     1956            #     applist = self.model.get_liststore_selections(type='apps')
     1957            #     grp = self.model.get_group_from_profile(nameprofile=profile_name)
     1958            glist = []
     1959            if grp != None:
     1960                glist.append(grp)
     1961            #
     1962            if self.edit_mode == 'copy':
     1963                self.user_is_editing = '_copy_mode_'
     1964            elif self.edit_mode == 'move':
     1965                pass
     1966            else:
     1967                raise Exception('Error edit mode not set!')
     1968            self.helper.n4d_update_profile(user=self.model.user,pwd=self.model.pwd,name=self.user_is_editing,newname=pname,grouplist=glist,applist={'desktop':desktop_pack,'plank':plank_pack,'background':bg_pack})
     1969            #if 'need_remove' in changes:
     1970            #    self.helper.n4d_remove_profile(user=self.model.user,pwd=self.model.pwd,name=self.user_is_editing)
     1971
     1972        return let_continue
     1973        #
     1974        #   OLD CODE FROM GOTO(BACK)
     1975        #
     1976        # #
     1977        # # Check if need to save something
     1978        # #
     1979        # changes_made = False
     1980        # if self.last_window == 'box_profiles2':
     1981        #     if self.user_is_editing == 'new_profile':
     1982        #         if self.profile_name_changed or self.applist_changed:
     1983        #             pname = self.window.get_entry('profile_name_entry')[0]
     1984        #             # If modified and no changes are done really skip warning msg
     1985        #             if pname.strip() != self.initial_profile_name:  # initial_profile_name always must be '' when is a new_profile
     1986        #                 if not self.model.check_profile_name(name=pname, type='available'):
     1987        #                     self.window.set_entry({'lbl_msg_warning': _('Profile name not valid')})
     1988        #                     self.window.change_stack('box_warning')
     1989        #                     changes_made = True
     1990        #                 else:
     1991        #                     # Store new profile (with valid name)
     1992        #                     # Not allowed empty applist
     1993        #                     applist = self.model.get_liststore_selections(type='desktop')
     1994        #                     # if len(applist) > 0:
     1995        #                     self.update_current_profile()
     1996        #                     changes_made = True
     1997        #     elif self.user_is_editing != '':
     1998        #         # User is editing existent profile
     1999        #         if self.applist_changed and not self.profile_name_changed:
     2000        #             # Update current profile (self.user_is_editing)
     2001        #             applist = self.model.get_liststore_selections(type='apps')
     2002        #             if len(applist) > 0:
     2003        #                 list_initial = self.initial_liststore
     2004        #                 # check if anything has changed
     2005        #                 applist_copy = list(applist)
     2006        #                 for app in applist_copy:
     2007        #                     if app in list_initial:
     2008        #                         applist.remove(app)
     2009        #                         list_initial.remove(app)
     2010        #                 # skip update if modified list is the same initially created
     2011        #                 if len(applist) > 0 or len(list_initial) > 0:
     2012        #                     self.update_current_profile()
     2013        #                     changes_made = True
     2014        #
     2015        #         if not self.applist_changed and self.profile_name_changed:
     2016        #             # Rename current profile (self.user_is_editing)
     2017        #             newname = self.window.get_entry('entry_profile_name')[0]
     2018        #             # Skip if modified name is the same as initially created
     2019        #             if newname.strip() != self.initial_profile_name:
     2020        #                 if not self.model.check_profile_name(name=newname, type='available'):
     2021        #                     self.window.set_entry({'lbl_msg_warning': _('Profile name not valid')})
     2022        #                     self.window.change_stack('box_warning')
     2023        #                     changes_made = True
     2024        #                 else:
     2025        #                     self.helper.n4d_rename_profile(user=self.model.user, pwd=self.model.pwd,
     2026        #                                                    old=self.user_is_editing, new=newname)
     2027        #                     changes_made = True
     2028        #
     2029        #         if self.applist_changed and self.profile_name_changed:
     2030        #             # create new profile & remove old profile (self.user_is_editing)
     2031        #             applist = self.model.get_liststore_selections(type='apps')
     2032        #             if len(applist) > 0:
     2033        #                 list_initial = self.initial_liststore
     2034        #                 # check if anything has changed
     2035        #                 applist_copy = list(applist)
     2036        #                 for app in applist_copy:
     2037        #                     if app in list_initial:
     2038        #                         applist.remove(app)
     2039        #                         list_initial.remove(app)
     2040        #                 # skip update if modified list is the same initially created
     2041        #                 if len(applist) > 0 or len(list_initial) > 0:
     2042        #                     newname = self.window.get_entry('entry_profile_name')[0]
     2043        #                     if newname.strip() != self.initial_profile_name:
     2044        #                         if not self.model.check_profile_name(name=newname, type='available'):
     2045        #                             self.window.set_entry({'lbl_msg_warning': _('Profile name not valid')})
     2046        #                             self.window.change_stack('box_warning')
     2047        #                         else:
     2048        #                             self.helper.n4d_rename_profile(user=self.model.user, pwd=self.model.pwd,
     2049        #                                                            old=self.user_is_editing, new=newname)
     2050        #                             changes_made = True
     2051        #                     else:
     2052        #                         #
     2053        #                         # -Uncomment if it's desired to remove old profile when modifications of name and apps are done
     2054        #                         # -If commented, new profile it's created making a copy of the current profile with other name
     2055        #                         # and remove profile only it's possible from the remove menu, doing more explicitly the remove action
     2056        #                         #
     2057        #                         # self.helper.n4d_remove_profile(user=self.model.user,pwd=self.model.pwd,name=self.user_is_editing)
     2058        #                         self.update_current_profile()
     2059        #                         changes_made = True
     2060        #
     2061        #     if changes_made:
     2062        #         return
    15082063    #
    15092064    # Receives events from handler
     
    15742129                    #
    15752130                    self.goto(*args,**kwargs)
     2131
     2132                elif action == 'edit_plank_items':
     2133                    self.current_selection = 'plank'
     2134                    self.model.refilter(type='all')
     2135                    self.backup_selections['plank'] = self.model.get_liststore_selections(type='plank')
     2136                    self.goto(to='edit_plank_items')
     2137                elif action == 'edit_desktop_items':
     2138                    self.current_selection = 'desktop'
     2139                    self.model.refilter(type='all')
     2140                    self.backup_selections['desktop'] = self.model.get_liststore_selections(type='desktop')
     2141                    self.goto(to='edit_desktop_items')
     2142                elif action == 'cancel_edit_elements':
     2143                    self.model.set_liststore_selections(type=self.current_selection,list=self.backup_selections[self.current_selection])
     2144                    self.current_selection = None
     2145                    self.goto(to='back')
     2146                elif action == 'accept_edit_items':
     2147                    self.current_selection = None
     2148                    self.goto(to='back')
     2149                elif action == 'cancel_profile':
     2150                    self.model.build_liststore(type='apps')
     2151                    self.resource_previewed = None
     2152                    self.window.set_entry({'entry_desktop_background': ''})
     2153                    self.window.set_entry({'profile_name_entry':''})
     2154                    self.reset_memories()
     2155                    self.goto(to='main_window')
     2156                elif action == 'profile_accepted':
     2157                    if self.check_profile_changes():
     2158                        self.goto(to='main_window')
     2159                elif action == 'put_current_items':
     2160                    self.model.put_current_items()
     2161                    self.model.refilter(type='all')
     2162                elif action == 'preview_background':
     2163                    file_preview = self.window.get_entry('entry_desktop_background')[0]
     2164                    if os.path.isfile(file_preview):
     2165                        w = self.getobj('window_preview')
     2166                        w.add(Gtk.Image.new_from_pixbuf(GdkPixbuf.Pixbuf.new_from_file_at_scale(file_preview, 640, 480, True)))
     2167                        w.show_all()
     2168                    else:
     2169                        self.window.set_txt_status_bars('Unable to preview image {}'.format(file_preview))
     2170                        self.helper.clean_status_bar(0)
     2171                elif action == 'change_edit_mode':
     2172                    name = kwargs.get('name')
     2173                    if name == 'm':
     2174                        self.edit_mode = 'move'
     2175                    if name == 'c':
     2176                        self.edit_mode = 'copy'
     2177                    pass
     2178                elif action == 'close_preview':
     2179                    w = self.getobj('window_preview')
     2180                    w.hide()
     2181
     2182                elif action == 'close_filechooser':
     2183                    #
     2184                    # Cancel Filechooser from button
     2185                    #
     2186                    self.window.dialog_filechooser.hide()
     2187
     2188                elif action == 'selected_resource':
     2189                    #
     2190                    # Resource previewed is selected (button accept or double click)
     2191                    #
     2192                    self.window.dialog_filechooser.hide()
     2193                    self.window.set_entry({'entry_desktop_background': self.resource_previewed})
     2194
     2195                elif action == 'selection_changed':
     2196                    #
     2197                    # Selected image to preview
     2198                    #
     2199                    resource = kwargs['file']
     2200                    i=self.builder.get_object('image1')
     2201                    p=GdkPixbuf.Pixbuf.new_from_file_at_scale(resource,200,200,True)
     2202                    i.set_from_pixbuf(p)
     2203                    self.resource_previewed = resource
     2204
     2205                elif action == 'remove_selected_background':
     2206                    self.resource_previewed = None
     2207                    self.window.set_entry({'entry_desktop_background': ''})
     2208
    15762209                elif action == 'refilter_elements':
    15772210                    ##############################
     
    15892222                    check_args('id',**kwargs)
    15902223                    id=kwargs['id']
    1591                     self.applist_changed = True
     2224                    #self.applist_changed = True
     2225                    col = None
     2226                    if self.current_selection == 'desktop':
     2227                        col = APPCOL.SELECTED_DESKTOP
     2228                    if self.current_selection == 'plank':
     2229                        col = APPCOL.SELECTED_PLANK
    15922230                    for e in self.model.store_elements:
    15932231                        if e[APPCOL.ID]==id:
    1594                             e[APPCOL.SELECTED] = not e[APPCOL.SELECTED]
     2232                            e[col] = not e[col]
    15952233                            break
    15962234                    self.model.refilter(type='all')
    1597                     i=self.model.count_selected()
    1598                     self.window.set_txt_status_bars('{} {}'.format(i,_('apps selected')))
    1599                 elif action == 'swap_locals':
    1600                     ##############################
    1601                     #
    1602                     # change model for local elements
    1603                     #
    1604                     ##############################
    1605                     self.applist_changed = True
    1606                     for e in self.model.store_elements:
    1607                         if e[APPCOL.TYPE]=='local':
    1608                             e[APPCOL.SELECTED] = True
    1609                     self.model.refilter(type='all')
    1610                     i=self.model.count_selected()
    1611                     self.window.set_txt_status_bars('{} {}'.format(i,_('apps selected')))
     2235                    i,j=self.model.count_selected(type='all')
     2236                    self.window.set_txt_status_bars('({},{}) {}'.format(i,j,_('apps selected')))
     2237                # elif action == 'swap_locals':
     2238                #     ##############################
     2239                #     #
     2240                #     # change model for local elements
     2241                #     #
     2242                #     ##############################
     2243                #     self.applist_changed = True
     2244                #     for e in self.model.store_elements:
     2245                #         if e[APPCOL.TYPE]=='local':
     2246                #             e[APPCOL.SELECTED] = True
     2247                #     self.model.refilter(type='all')
     2248                #     i,j=self.model.count_selected(type='all')
     2249                #     self.window.set_txt_status_bars('({},{}) {}'.format(i,j,_('apps selected')))
    16122250                elif action == 'set_groups':
    16132251                    ##############################
     
    16742312                    # If this is a (single) callback from edit profiles
    16752313                    if self.last_window != 'box_group_edit':
     2314                        check_args('newname', **kwargs)
     2315                        newname = kwargs['newname']
    16762316                        self.reset_memories()
    1677                         self.window.set_txt_status_bars(name + _(' updated!'))
     2317                        #self.window.set_txt_status_bars(name + _(' updated!'))
     2318                        self.window.set_txt_status_bars(newname + _(' updated!'))
    16782319                        self.helper.clean_status_bar(0)
    16792320                        self.window.change_stack('box_main_btn')
     
    16922333
    16932334
    1694                 elif action == 'profile_is_renamed':
    1695                     ##############################
    1696                     #
    1697                     # Callback from n4d_rename_profile
    1698                     #
    1699                     ##############################
    1700 
    1701                     # Update information about existent profiles
    1702                     self.model.clear_liststore(type='profiles')
    1703                     self.window.profiles_need_refresh = True
    1704                     self.helper.n4d_get_profiles_stored(user=self.model.user, pwd=self.model.pwd)
    1705                     # Force redo liststore from combobox from profile window, next time will rebuild the view
    1706                     for boxname in self.window.group_profile_boxes:
    1707                         self.window.group_profile_boxes[boxname][0].destroy()
    1708                         self.window.group_profile_boxes[boxname][1].destroy()
    1709                     self.window.group_profile_boxes = {}
    1710                     self.reset_memories()
    1711                     # Show msg into status bar
    1712                     check_args('oldname', 'newname', **kwargs)
    1713                     oldname = kwargs['oldname']
    1714                     newname = kwargs['newname']
    1715                     self.window.set_txt_status_bars(_('Updated profile from ')+oldname+_(' to ')+newname)
    1716                     self.helper.clean_status_bar(0)
    1717                     # Change user's view
    1718                     self.window.change_stack('box_main_btn')
     2335                # elif action == 'profile_is_renamed':
     2336                #     ##############################
     2337                #     #
     2338                #     # Callback from n4d_rename_profile
     2339                #     #
     2340                #     ##############################
     2341                #
     2342                #     # Update information about existent profiles
     2343                #     self.model.clear_liststore(type='profiles')
     2344                #     self.window.profiles_need_refresh = True
     2345                #     self.helper.n4d_get_profiles_stored(user=self.model.user, pwd=self.model.pwd)
     2346                #     # Force redo liststore from combobox from profile window, next time will rebuild the view
     2347                #     for boxname in self.window.group_profile_boxes:
     2348                #         self.window.group_profile_boxes[boxname][0].destroy()
     2349                #         self.window.group_profile_boxes[boxname][1].destroy()
     2350                #     self.window.group_profile_boxes = {}
     2351                #     self.reset_memories()
     2352                #     # Show msg into status bar
     2353                #     check_args('oldname', 'newname', **kwargs)
     2354                #     oldname = kwargs['oldname']
     2355                #     newname = kwargs['newname']
     2356                #     self.window.set_txt_status_bars(_('Updated profile from ')+oldname+_(' to ')+newname)
     2357                #     self.helper.clean_status_bar(0)
     2358                #     # Change user's view
     2359                #     self.window.change_stack('box_main_btn')
    17192360
    17202361                elif action == 'load_profile_into_liststore':
     
    17252366                    ##############################
    17262367                    check_args('name','result',**kwargs)
    1727                     apps_selected=kwargs['result']
    1728                     if not apps_selected:
     2368                    profile_readed = kwargs['result']
     2369                    workspace = self.helper.prepare_workspace(profile=profile_readed)
     2370                    if not workspace:
    17292371                        self.window.set_txt_status_bars('{}'.format(_('Error reading profile')))
    17302372                    else:
     2373                        self.reset_memories()
    17312374                        self.model.build_liststore(type='apps')
    1732                         self.model.load_profile_into_liststore(name=kwargs['name'], apps_selected=apps_selected)
    1733                         i = self.model.count_selected()
    1734                         self.window.set_txt_status_bars('{} {}'.format(i,_('apps selected')))
    1735                         self.window.set_entry({'entry_profile_name':kwargs['name']})
    1736                         self.reset_memories()
    1737                         self.initial_profile_name=kwargs['name']
    1738                         self.initial_liststore=apps_selected
    1739                         self.user_is_editing=kwargs['name']
    1740                         self.window.change_stack('box_profiles')
     2375                        self.initial_liststore = self.model.load_profile_into_liststore(name=kwargs['name'], workspace=workspace)
     2376                        i,j = self.model.count_selected(type='all')
     2377                        self.window.set_txt_status_bars('({},{}) {}'.format(i,j,_('apps selected')))
     2378                        self.window.set_entry({'profile_name_entry':kwargs['name']})
     2379                        self.initial_profile_name = kwargs['name']
     2380                        self.user_is_editing = kwargs['name']
     2381                        self.edit_mode = 'move'
     2382                        self.window.change_stack('box_profiles2')
    17412383
    17422384                elif action == 'change_relations':
     
    17522394                    if self.check_sanity(group=group,profile=profile):
    17532395                        self.update_profile_relations(group=group, profile=profile, oldrelation=oldrelation)
    1754 
    17552396
    17562397            return
     
    18102451            self.window.change_stack('box_main_btn')
    18112452        if to == 'new_profile':
    1812             self.window.set_entry({'entry_profile_name':''})
     2453            self.window.set_entry({'profile_name_entry':'','entry_desktop_background':''})
     2454            # TODO: Chango to reset memories
     2455            self.resource_previewed = None
    18132456            self.initial_profile_name = ''
    1814             self.initial_liststore=None
     2457            self.initial_liststore = {}
    18152458            self.model.build_liststore(type='apps')
    1816             self.user_is_editing='new_profile'
    1817             self.window.change_stack('box_profiles')
     2459            self.user_is_editing = '_____new_profile_____'
     2460            self.window.show_edit_mode('hide')
     2461            self.edit_mode = 'copy'
     2462            self.window.change_stack('box_profiles2')
     2463        if to == 'filechooser':
     2464            self.window.dialog_filechooser.set_current_folder('/usr/share/backgrounds')
     2465            self.window.dialog_filechooser.show_all()
    18182466        if to == 'edit_profile':
    18192467            self.model.build_liststore(type='profiles')
     2468            self.window.show_edit_mode('show')
    18202469            self.window.change_stack('box_pselector')
     2470        if to == 'edit_plank_items':
     2471            self.model.change_model_selected(type='plank')
     2472            self.window.change_stack('box_edit_elements')
     2473        if to == 'edit_desktop_items':
     2474            self.model.change_model_selected(type='desktop')
     2475            self.window.change_stack('box_edit_elements')
    18212476        if to == 'group_mapping':
    18222477            #prevent trigger combo actions
     
    18432498            self.helper.n4d_remove_profile(user=self.model.user,pwd=self.model.pwd,name=name_profile)
    18442499        if to == 'back':
    1845             #
    1846             # Check if need to save something
    1847             #
    1848             changes_made = False
    1849             if self.last_window == 'box_profiles':
    1850                 if self.user_is_editing == 'new_profile':
    1851                     if self.profile_name_changed or self.applist_changed:
    1852                         pname = self.window.get_entry('entry_profile_name')[0]
    1853                         # If modified and no changes are done really skip warning msg
    1854                         if pname.strip() != self.initial_profile_name: # initial_profile_name always must be '' when is a new_profile
    1855                             if not self.model.check_profile_name(name=pname,type='available'):
    1856                                 self.window.set_entry({'lbl_msg_warning': _('Profile name not valid')})
    1857                                 self.window.change_stack('box_warning')
    1858                                 changes_made=True
    1859                             else:
    1860                                 # Store new profile (with valid name)
    1861                                 # Not allowed empty applist
    1862                                 applist = self.model.get_liststore_selections(type='apps')
    1863                                 if len(applist) > 0:
    1864                                     self.update_current_profile()
    1865                                     changes_made = True
    1866                 elif self.user_is_editing != '':
    1867                     # User is editing existent profile
    1868                     if self.applist_changed and not self.profile_name_changed:
    1869                         # Update current profile (self.user_is_editing)
    1870                         applist=self.model.get_liststore_selections(type='apps')
    1871                         if len(applist) > 0:
    1872                             list_initial=self.initial_liststore
    1873                             #check if anything has changed
    1874                             applist_copy=list(applist)
    1875                             for app in applist_copy:
    1876                                 if app in list_initial:
    1877                                     applist.remove(app)
    1878                                     list_initial.remove(app)
    1879                             # skip update if modified list is the same initially created
    1880                             if len(applist) > 0 or len(list_initial) > 0:
    1881                                 self.update_current_profile()
    1882                                 changes_made = True
    1883 
    1884                     if not self.applist_changed and self.profile_name_changed:
    1885                         # Rename current profile (self.user_is_editing)
    1886                         newname=self.window.get_entry('entry_profile_name')[0]
    1887                         # Skip if modified name is the same as initially created
    1888                         if newname.strip() != self.initial_profile_name:
    1889                             if not self.model.check_profile_name(name=newname,type='available'):
    1890                                 self.window.set_entry({'lbl_msg_warning': _('Profile name not valid')})
    1891                                 self.window.change_stack('box_warning')
    1892                                 changes_made = True
    1893                             else:
    1894                                 self.helper.n4d_rename_profile(user=self.model.user,pwd=self.model.pwd,old=self.user_is_editing,new=newname)
    1895                                 changes_made = True
    1896 
    1897                     if self.applist_changed and self.profile_name_changed:
    1898                         # create new profile & remove old profile (self.user_is_editing)
    1899                         applist = self.model.get_liststore_selections(type='apps')
    1900                         if len(applist) > 0:
    1901                             list_initial = self.initial_liststore
    1902                             # check if anything has changed
    1903                             applist_copy = list(applist)
    1904                             for app in applist_copy:
    1905                                 if app in list_initial:
    1906                                     applist.remove(app)
    1907                                     list_initial.remove(app)
    1908                             # skip update if modified list is the same initially created
    1909                             if len(applist) > 0 or len(list_initial) > 0:
    1910                                 newname = self.window.get_entry('entry_profile_name')[0]
    1911                                 if newname.strip() != self.initial_profile_name:
    1912                                     if not self.model.check_profile_name(name=newname, type='available'):
    1913                                         self.window.set_entry({'lbl_msg_warning': _('Profile name not valid')})
    1914                                         self.window.change_stack('box_warning')
    1915                                     else:
    1916                                         self.helper.n4d_rename_profile(user=self.model.user, pwd=self.model.pwd,
    1917                                                                        old=self.user_is_editing, new=newname)
    1918                                         changes_made = True
    1919                                 else:
    1920                                     #
    1921                                     # -Uncomment if it's desired to remove old profile when modifications of name and apps are done
    1922                                     # -If commented, new profile it's created making a copy of the current profile with other name
    1923                                     # and remove profile only it's possible from the remove menu, doing more explicitly the remove action
    1924                                     #
    1925                                     # self.helper.n4d_remove_profile(user=self.model.user,pwd=self.model.pwd,name=self.user_is_editing)
    1926                                     self.update_current_profile()
    1927                                     changes_made = True
    1928 
    1929                 if changes_made:
    1930                    return
    1931 
    19322500            # if nothing is saved do normal go back
    19332501            self.model.n_selected = 0
     
    19362504        return
    19372505
    1938     ##############################
    1939     #
    1940     # Read store & create or update a profile
    1941     #
    1942     ##############################
    1943     def update_current_profile(self,*args,**kwargs):
    1944         profile_name = self.window.get_entry('entry_profile_name')[0]
    1945         #if self.user_is_editing == 'new_profile' and not self.model.check_profile_name(name=profile_name,type='available'):
    1946         #    self.window.set_entry({'lbl_msg_warning':_('Profile name not valid')})
    1947         #    self.window.change_stack('box_warning')
    1948         #    self.reset_memories()
    1949         #    return
    1950         applist = self.model.get_liststore_selections(type='apps')
    1951         grp = self.model.get_group_from_profile(nameprofile=profile_name)
    1952         glist = []
    1953         if grp != None:
    1954             glist.append(grp)
    1955 
    1956         self.helper.n4d_update_profile(user=self.model.user,pwd=self.model.pwd,name=profile_name,grouplist=glist,applist=applist)
    1957         return
     2506    # ##############################
     2507    # #
     2508    # # Read store & create or update a profile
     2509    # #
     2510    # ##############################
     2511    # def update_current_profile(self,*args,**kwargs):
     2512    #     profile_name = self.window.get_entry('entry_profile_name')[0]
     2513    #     #if self.user_is_editing == 'new_profile' and not self.model.check_profile_name(name=profile_name,type='available'):
     2514    #     #    self.window.set_entry({'lbl_msg_warning':_('Profile name not valid')})
     2515    #     #    self.window.change_stack('box_warning')
     2516    #     #    self.reset_memories()
     2517    #     #    return
     2518    #     applist = self.model.get_liststore_selections(type='apps')
     2519    #     grp = self.model.get_group_from_profile(nameprofile=profile_name)
     2520    #     glist = []
     2521    #     if grp != None:
     2522    #         glist.append(grp)
     2523    #
     2524    #     self.helper.n4d_update_profile(user=self.model.user,pwd=self.model.pwd,name=profile_name,grouplist=glist,applist=applist)
     2525    #     return
    19582526
    19592527    ##############################
     
    20122580            #
    20132581            check_args('grouplist','result','name','status_bar',**kwargs)
    2014             applist = kwargs['result']
     2582            profile_readed = kwargs['result']
     2583            workspace = self.helper.prepare_workspace(profile=profile_readed)
    20152584            grouplist = kwargs['grouplist']
    20162585            name = kwargs['name']
    20172586            status_bar = kwargs['status_bar']
    20182587
    2019             self.helper.n4d_update_profile(user=self.model.user,pwd=self.model.pwd,applist=applist,name=name, grouplist=grouplist, status_bar=status_bar)
     2588            self.helper.n4d_update_profile_groups(user=self.model.user,pwd=self.model.pwd,name=name,grouplist=grouplist, status_bar=status_bar)
    20202589            # After this call return to normal callback and will update profile list with new relations
    20212590        return
     
    20632632
    20642633GObject.threads_init()
     2634
    20652635if __name__ == "__main__":
    2066     #ctl = Controller(localpath=os.path.dirname(os.path.realpath(__file__)))
    2067     ctl = Controller(localpath='/usr/lib/syncer-plank')
     2636    ctl = Controller(localpath=os.path.dirname(os.path.realpath(__file__))+'/../lib/syncer-plank')
     2637    #ctl = Controller(localpath='/usr/lib/syncer-plank')
    20682638    sys.exit(Gtk.main())
    2069 
Note: See TracChangeset for help on using the changeset viewer.