texlive[57426] Master: List only binaries installed platforms;

commits+siepo at tug.org commits+siepo at tug.org
Fri Jan 15 18:04:30 CET 2021


Revision: 57426
          http://tug.org/svn/texlive?view=revision&revision=57426
Author:   siepo
Date:     2021-01-15 18:04:30 +0100 (Fri, 15 Jan 2021)
Log Message:
-----------
List only binaries installed platforms; revised marking logic; various cosmetic

Modified Paths:
--------------
    trunk/Master/texmf-dist/scripts/tlshell/tlshell.tcl
    trunk/Master/tlpkg/tltcl/tltcl.tcl

Modified: trunk/Master/texmf-dist/scripts/tlshell/tlshell.tcl
===================================================================
--- trunk/Master/texmf-dist/scripts/tlshell/tlshell.tcl	2021-01-15 02:59:25 UTC (rev 57425)
+++ trunk/Master/texmf-dist/scripts/tlshell/tlshell.tcl	2021-01-15 17:04:30 UTC (rev 57426)
@@ -683,11 +683,12 @@
 
 proc display_packages_info {} {
   # do_debug [get_stacktrace]
-  set curr [.pksearch.e get]
+  set curr [.pkfilter.search_e get]
   .pkglist delete [.pkglist children {}]
   dict for {nm pk} $::filtered {
     set do_show 0
     if {$curr eq ""} {
+      # empty search string
       set do_show 1
     } elseif {[search_nocase $curr $nm] >= 0} {
       set do_show 1
@@ -701,13 +702,29 @@
   }
 } ; # display_packages_info
 
-# (re)create ::filtered dictionary; disregard search string.
+proc for_other_platform {nm} {
+  set r [string last "." $nm]
+  if {$r < 0} {
+    return 0
+  } else {
+    set n [string range $nm 0 [expr {$r-1}]]
+    set p [string range $nm [expr {$r+1}] end]
+    # p a platform identifier of an installed platform?
+    if [dict exists $::platforms $p] {
+      return [expr {! [dict get $::platforms $p "cur"]}]
+    } else {
+      return 0
+    }
+  }
+}
+
+# (re)create ::filtered dictionary; disregard search string in selection
 # The value associated with each key/package is a list, not another dict.
 proc collect_filtered {} {
   do_debug \
       "collect_filtered for $::stat_opt and $::dtl_opt"
-  # test this beforehand
   if {$::stat_opt ne "inst" && ! $::have_remote} {
+    # have_remote should have been ensured when changing stat_opt from inst
     err_exit "collect_filtered should not have been invoked at this time"
   }
   foreach nm [dict keys $::filtered] {
@@ -714,6 +731,8 @@
     dict unset ::filtered $nm
   }
   foreach nm [lsort [dict keys $::pkgs]] {
+    # do not list packages for platforms which are not installed
+    if [for_other_platform $nm] continue
     set pk [dict get $::pkgs $nm]
     set do_show 1
     set mrk [mark_sym [dict get $pk marked]]
@@ -722,6 +741,8 @@
     set ct [dict get $pk category]
     if {$::stat_opt eq "inst" && $lr == 0} {
       set do_show 0
+    } elseif {$::stat_opt eq "notins" && $lr > 0} {
+      set do_show 0
     } elseif {$::stat_opt eq "upd" && ($lr == 0 || $rr == 0 || $rr <= $lr)} {
       set do_show 0
     }
@@ -740,7 +761,7 @@
     set v [dict get $pk localrev]
     set lv [dict get $pk lcatv]
     if {$v eq "0" || $v == 0} {
-      set v ""
+      set v "" ; # can this happen?
     } elseif {$lv != 0 && $lv ne ""} {
       set v "$v ($lv)"
     }
@@ -766,14 +787,16 @@
   # guarantee fresh start
   foreach k $::platforms {dict unset ::platforms $k}
   set ::platforms [dict create]
-  run_cmd_waiting "platform list"
-  foreach l $::out_log {
-    if [regexp {^\(i\)\s+(\S+)\s*$} $l dum plname] {
-      set pl [dict create "cur" 1 "fut" 1]
-      dict set ::platforms $plname $pl
-    } elseif [regexp {^\s+(\S+)\s*$} $l dum plname] {
-      set pl [dict create "cur" 0 "fut" 0]
-      dict set ::platforms $plname $pl
+  # find binary packages for pdftex; 'platform list' not available on windows
+  foreach k [dict keys $::pkgs {pdftex.*}] {
+    # {pdftex.*} is a glob pattern, not a regexp: '.' is a literal
+    set plname [string range $k 7 end]
+    if {[dict get $::pkgs $k localrev] > 0} {
+      dict set ::platforms $plname "cur" 1
+      #dict set ::platforms $plname "fut" 1
+    } else {
+      dict set ::platforms $plname "cur" 0
+      #dict set ::platforms $plname "fut" 0
     }
   }
 }
@@ -842,7 +865,7 @@
   wm title .loading [__ "Loading"]
 
   # wallpaper
-  pack [ttk::frame .loading.bg -padding 3] -fill both -expand 1
+  pack [ttk::frame .loading.bg -padding 3pt] -fill both -expand 1
 
   set lbl [__ \
        "If loading takes too long, press Abort and choose another repository."]
@@ -944,9 +967,7 @@
 ## update ::pkgs after installing packages without going online again.
 proc update_local_revnumbers {} {
   do_debug "update_local_revnumbers"
-  set catv "lcat-version"
-  if {[dict get $::pkgs texlive.infra localrev] < 56458} { set catv "cat-version" }
-  run_cmd_waiting "info --only-installed --data name,localrev,$catv"
+  run_cmd_waiting "info --only-installed --data name,localrev,lcat-version"
   set re {^([^,]+),([0-9]+),(.*)$}
   dict for {pk pk_dict} $::pkgs {
     do_debug "zeroing local data for $pk"
@@ -1150,8 +1171,12 @@
   foreach ch [winfo children $w] {destroy $ch}
   set nms [array names ::repos]
   set c [llength $nms]
-  grid [ttk::label $w.head -font TkHeadingFont] \
-      -row 0 -column 0 -columnspan 2 -sticky w
+  grid [ttk::frame $w.repoheadframe] \
+      -row 0 -column 0 -columnspan 3 -sticky w
+  pack [ttk::label $w.head -font hfont] \
+      -in $w.repoheadframe -side left
+  pack [ttk::label $w.load -text ""] \
+      -in $w.repoheadframe -side left -anchor sw
   if {$c <= 0} {
     $w.head configure -text [__ "No repositories"]
      return
@@ -1161,8 +1186,7 @@
     $w.head configure -text [__ "Multiple repositories"]
   }
   if {! $::have_remote} {
-    pgrid [ttk::label $w.load -text [__ "Not loaded"]] \
-        -sticky nw -row 0 -column 1
+    $w.load configure -text " ([__ "Not loaded"])"
   }
   set repodict [dict create]
   if $::have_remote {
@@ -1318,10 +1342,10 @@
   ### add/remove tlcontrib ###
   ttk::label .tlr.contribt -text [__ "tlcontrib additional repository"] \
       -font bfont
-  pack .tlr.contribt -in .tlr.bg -anchor w -padx 3 -pady [list 10 3]
-  pack [ttk::label .tlr.contribl] -in .tlr.bg -anchor w -padx 3 -pady 3
+  pack .tlr.contribt -in .tlr.bg -anchor w -padx 3pt -pady [list 10pt 3pt]
+  pack [ttk::label .tlr.contribl] -in .tlr.bg -anchor w -padx 3pt -pady 3pt
   ttk::checkbutton .tlr.contribb -variable ::toggle_contrib
-  pack .tlr.contribb -in .tlr.bg -anchor w -padx 3 -pady [list 3 10]
+  pack .tlr.contribb -in .tlr.bg -anchor w -padx 3pt -pady [list 3pt 10pt]
   set ::toggle_contrib 0
   set has_contrib 0
   foreach nm [array names ::repos] {
@@ -1340,7 +1364,7 @@
   }
 
   # two ways to close the dialog
-  pack [ttk::frame .tlr.closebuttons] -pady [list 10 0] -in .tlr.bg -fill x
+  pack [ttk::frame .tlr.closebuttons] -pady [list 10pt 0pt] -in .tlr.bg -fill x
   ttk::button .tlr.save -text [__ "Save and Load"] -command save_load_repo
   ppack .tlr.save -in .tlr.closebuttons -side right
   dis_enable_reposave
@@ -1356,123 +1380,133 @@
 
 ### platforms
 
-if {$::tcl_platform(platform) ne "windows"} {
+# ::platforms is a dictionary of dictionaries.
+# each element dictionary has keys cur and fut indicating
+# current and future status (i.e. being installed),
+# with values 0 meaning 'not installed' and 1 meaning 'installed'.
+# elsewhere, we shall only be interested in cur.
+# within the treeview list, we shall use the usual unicode mark symbols.
 
-  proc toggle_pl_marked {pl cl} {
-    # toggle_pl_marked is triggered by a mouse click only in column #1.
-    # 'fut'[ure] should get updated in ::platforms _and_ in .tlpl.pl.
+# for windows, there is no platforms menu entry,
+# and the platforms dialog returns immediately, i.e. is a no-op.
 
-    if {$cl ne "#1"} return
-    if {$pl eq $::our_platform} {
-      tk_messageBox -message \
-          [__ "Cannot remove own platform %s" $::our_platform] \
-          -parent .tlpl
-      return
+proc toggle_pl_marked {pl cl} {
+  # toggle_pl_marked is triggered by a mouse click only in column #1.
+  # 'fut'[ure] should get updated in ::platforms _and_ in .tlpl.pl.
+
+  if {$cl ne "#1"} return
+  if {$pl eq $::our_platform} {
+    tk_messageBox -message \
+        [__ "Cannot remove own platform %s" $::our_platform] -parent .tlpl
+    return
+  }
+  set m1 [expr {[dict get $::platforms $pl "fut"] ? 0 : 1}]
+  dict set ::platforms $pl "fut" $m1
+  set m0 [dict get $::platforms $pl "cur"]
+  if {$m0 == $m1} {
+    .tlpl.pl set $pl "stat" [mark_sym $m0]
+  } else {
+    .tlpl.pl set $pl "stat" "[mark_sym $m0] \u21d2 [mark_sym $m1]"
+  }
+  # any changes to apply?
+  .tlpl.do state disabled
+  dict for {pname pdict} $::platforms {
+    if {[dict get $pdict "fut"] ne [dict get $pdict "cur"]} {
+      .tlpl.do state !disabled
+      break
     }
-    # $mrk: negation of current value of marked for $pl
-    set m1 [expr {[dict get $::platforms $pl "fut"] ? 0 : 1}]
-    dict set ::platforms $pl "fut" $m1
-    set m0 [dict get $::platforms $pl "cur"]
-    if {$m0 == $m1} {
-      .tlpl.pl set $pl "sup" [mark_sym $m0]
-    } else {
-      .tlpl.pl set $pl "sup" "[mark_sym $m0] \u21d2 [mark_sym $m1]"
-    }
-    .tlpl.do state disabled
-    dict for {p mrks} $::platforms {
-      if {[dict get $mrks "fut"] ne [dict get $mrks "cur"]} {
-        .tlpl.do state !disabled
-        break
-      }
-    }
-  } ; # toggle_pl_marked
+  }
+} ; # toggle_pl_marked
 
-  proc platforms_commit {} {
-    set pl_add {}
-    set pl_remove {}
-    dict for {p pd} $::platforms {
-      if {[dict get $pd "cur"] ne [dict get $pd "fut"]} {
-        if {[dict get $pd "fut"]} {
-          lappend pl_add $p
-        } else {
-          lappend pl_remove $p
-        }
+proc platforms_commit {} {
+  set pl_add {}
+  set pl_remove {}
+  dict for {pname pdict} $::platforms {
+    if {[dict get $pdict "cur"] ne [dict get $pdict "fut"]} {
+      if {[dict get $pdict "fut"]} {
+        lappend pl_add $pname
+      } else {
+        lappend pl_remove $pname
       }
     }
-    if {[llength $pl_add] == 0 && [llength $pl_remove] == 0} return
-    set cmds {}
-    if {[llength $pl_add] > 0} {
-      set cmd "platform add "
-      append cmd [join $pl_add " "]
-      lappend cmds $cmd
-    }
-    if {[llength $pl_remove] > 0} {
-      set cmd "platform remove "
-      append cmd [join $pl_remove " "]
-      lappend cmds $cmd
-    }
-    run_cmds $cmds 1
-    vwait ::done_waiting
-    update_local_revnumbers
-    collect_and_display_filtered
+  }
+  if {[llength $pl_add] == 0 && [llength $pl_remove] == 0} return
+  set cmds {}
+  if {[llength $pl_add] > 0} {
+    set cmd "platform add "
+    append cmd [join $pl_add " "]
+    lappend cmds $cmd
+  }
+  if {[llength $pl_remove] > 0} {
+    set cmd "platform remove "
+    append cmd [join $pl_remove " "]
+    lappend cmds $cmd
+  }
+  run_cmds $cmds 1
+  vwait ::done_waiting
+  update_local_revnumbers
+  collect_and_display_filtered
 
-  } ; # platforms_do
+} ; # platforms_commit
 
   # the platforms dialog
-  proc platforms_select {} {
-    create_dlg .tlpl
-    wm title .tlpl [__ "Platforms"]
-    if $::plain_unix {wm attributes .tlpl -type dialog}
+proc platforms_select {} {
+  if {$::tcl_platform(platform) eq "windows"} return
 
-    # wallpaper frame
-    pack [ttk::frame .tlpl.bg] -expand 1 -fill both
+  create_dlg .tlpl
+  wm title .tlpl [__ "Platforms"]
+  if $::plain_unix {wm attributes .tlpl -type dialog}
 
-    # buttons
-    pack [ttk::frame .tlpl.but] -in .tlpl.bg -side bottom -fill x
-    ttk::button .tlpl.do -text [__ "Apply and close"] -command {
-      disable_dlg .tlpl
-      platforms_commit
-      end_dlg "" .tlpl
-    }
-    ttk::button .tlpl.dont -text [__ "Close"] -command \
-        {end_dlg "" .tlpl}
-    ppack .tlpl.do -in .tlpl.but -side right
-    #.tlpl.do state disabled
-    ppack .tlpl.dont -in .tlpl.but -side right
-    bind .tlpl <Escape> {.tlpl.dont invoke}
+  # wallpaper frame
+  pack [ttk::frame .tlpl.bg] -expand 1 -fill both
 
-    # platforms treeview; do we need a scrollbar?
-    pack [ttk::frame .tlpl.fpl] -in .tlpl.bg -fill both -expand 1
-    ttk::treeview .tlpl.pl -columns {sup plat} -show headings \
-        -height [dict size $::platforms] -yscrollcommand {.tlpl.plsb set}
-    ppack .tlpl.pl -in .tlpl.fpl -side left -fill both -expand 1
-    ttk::scrollbar .tlpl.plsb -orient vertical \
-        -command {.tlpl.pl yview}
-    ppack .tlpl.plsb -in .tlpl.fpl -side right -fill y -expand 1
-    #.tlpl.pl heading sup -text ""
-    .tlpl.pl column sup -width [expr {$::cw * 8}]
-    .tlpl.pl heading plat -text [__ "platform"] -anchor w
-    .tlpl.pl column plat -width [expr {$::cw * 20}]
-    dict for {p mks} $::platforms {
-      .tlpl.pl insert {} end -id $p -values \
-          [list [mark_sym [dict get $mks "cur"]] $p]
-    }
+  # buttons
+  pack [ttk::frame .tlpl.but] -in .tlpl.bg -side bottom -fill x
+  ttk::button .tlpl.do -text [__ "Apply and close"] -command {
+    disable_dlg .tlpl
+    platforms_commit
+    end_dlg "" .tlpl
+  }
+  ttk::button .tlpl.dont -text [__ "Close"] -command \
+      {end_dlg "" .tlpl}
+  ppack .tlpl.do -in .tlpl.but -side right
+  ppack .tlpl.dont -in .tlpl.but -side right
+  bind .tlpl <Escape> {.tlpl.dont invoke}
 
-    # "#2" refers to the second column, with editable mark symbols
-    bind .tlpl.pl <space> {toggle_pl_marked [.tlpl.pl focus] "#1"}
-    bind .tlpl.pl <Return> {toggle_pl_marked [.tlpl.pl focus] "#1"}
-    # only toggle when column is "sup" i.e. #1
-    bind .tlpl.pl <ButtonRelease-1> \
-        {toggle_pl_marked \
-             [.tlpl.pl identify item %x %y] \
-             [.tlpl.pl identify column %x %y]}
+  # platforms treeview; do we need a scrollbar?
+  pack [ttk::frame .tlpl.fpl] -in .tlpl.bg -fill both -expand 1
+  ttk::treeview .tlpl.pl -columns {stat plat} -show headings \
+      -height [dict size $::platforms] -yscrollcommand {.tlpl.plsb set}
+  ppack .tlpl.pl -in .tlpl.fpl -side left -fill both -expand 1
+  ttk::scrollbar .tlpl.plsb -orient vertical \
+      -command {.tlpl.pl yview}
+  ppack .tlpl.plsb -in .tlpl.fpl -side right -fill y -expand 1
+  .tlpl.pl column stat -width [expr {$::cw * 8}]
+  .tlpl.pl heading plat -text [__ "platform"] -anchor w
+  .tlpl.pl column plat -width [expr {$::cw * 20}]
+  dict for {pname pdict} $::platforms {
+    dict set ::platforms $pname "fut" [dict get $pdict "cur"]
+  }
+  foreach pname [lsort [dict keys $::platforms]] {
+    .tlpl.pl insert {} end -id $pname -values \
+        [list [mark_sym [dict get $::platforms $pname "cur"]] $pname]
+  }
 
-    wm resizable .tlpl 0 1
-    place_dlg .tlpl .
-  } ; # platforms_select
+  bind .tlpl.pl <space> {toggle_pl_marked [.tlpl.pl focus] "#1"}
+  bind .tlpl.pl <Return> {toggle_pl_marked [.tlpl.pl focus] "#1"}
+  # only toggle when column is #1
+  bind .tlpl.pl <ButtonRelease-1> \
+      {toggle_pl_marked \
+           [.tlpl.pl identify item %x %y] \
+           [.tlpl.pl identify column %x %y]}
 
-} ; # $::tcl_platform(platform) ne "windows"
+  # enable commit button only if changes are requested
+  .tlpl.do state disabled
+  wm resizable .tlpl 0 1
+  place_dlg .tlpl .
+} ; # platforms_select
 
+
 ##### restore from backup #####
 
 # This is currently rather dangerous.
@@ -1772,7 +1806,7 @@
     show_err_log
   }
   update_local_revnumbers
-  if {$sel_opt eq "marked"} {mark_all 0}
+  if {$sel_opt eq "marked"} unmark_all
   collect_and_display_filtered
 } ; # install_pkgs
 
@@ -1845,7 +1879,7 @@
     show_err_log
   }
   update_local_revnumbers
-  if {$sel_opt eq "marked"} {mark_all 0}
+  if {$sel_opt eq "marked"} unmark_all
   collect_and_display_filtered
 } ; # update_pkgs
 
@@ -1906,7 +1940,7 @@
     show_err_log
   }
   update_local_revnumbers
-  if {$sel_opt eq "marked"} {mark_all 0}
+  if {$sel_opt eq "marked"} unmark_all
   collect_and_display_filtered
 } ; # remove_pkgs
 
@@ -1934,6 +1968,8 @@
   # 'marked' should get updated in ::pkgs, ::filtered and in .pkglist.
 
   if {$cl ne "#1"} return
+  # clicking in the header:
+  if {$itm eq ""} return
   # $mrk: negation of current value of marked for $itm
   set mrk [expr {[dict get $::pkgs $itm "marked"] ? 0 : 1}]
   dict set ::pkgs $itm "marked" $mrk
@@ -1942,11 +1978,11 @@
   .pkglist set $itm mk $m
 } ; # toggle_marked_pkg
 
-proc mark_all {mrk} {
+proc unmark_all {} {
   foreach nm [dict keys $::pkgs] {
-    dict set ::pkgs $nm "marked" $mrk
+    dict set ::pkgs $nm "marked" 0
   }
-  set m [mark_sym $mrk]
+  set m [mark_sym 0]
   foreach nm [dict keys $::filtered] {
     dict set ::filtered $nm [lreplace [dict get $::filtered $nm] 0 0 $m]
   }
@@ -1953,9 +1989,17 @@
   foreach nm [.pkglist children {}] {
     .pkglist set $nm mk $m
   }
-  # alternatively: regenerate ::filtered and .pkglist from ::pkgs
-} ; # mark_all
+} ; # unmark_all
 
+proc mark_displayed {} {
+  set m [mark_sym 1]
+  foreach nm [.pkglist children {}] {
+    dict set ::pkgs $nm "marked" 1
+    dict set ::filtered $nm [lreplace [dict get $::filtered $nm] 0 0 $m]
+    .pkglist set $nm mk $m
+  }
+} ; # mark_displayed
+
 ##### package popup #####
 
 proc do_package_popup_menu {x y X Y} {
@@ -2110,7 +2154,7 @@
   menu .mn_empty
   .mn_empty add cascade -label [__ "File"] -menu .mn_empty.file -underline 0
   if $::plain_unix {
-    .mn_empty configure -borderwidth 1
+    .mn_empty configure -borderwidth 0
     .mn_empty configure -background $::default_bg
   menu .mn_empty.file
   }
@@ -2118,7 +2162,7 @@
   menu .mn
   . configure -menu .mn
   if $::plain_unix {
-    .mn configure -borderwidth 1
+    .mn configure -borderwidth 0
     .mn configure -background $::default_bg
 
     # plain_unix: avoid a possible RenderBadPicture error on quitting
@@ -2130,7 +2174,7 @@
     }
   }
 
-  # inx: keeping count to record indices where needed,
+  # inx: keeping count to record submenu indices where needed,
   # i.e. when an entry needs to be referenced.
   # not all submenus need this.
 
@@ -2230,11 +2274,11 @@
   # with the default ttk::frame color, which seems to work
   # everywhere.
   pack [ttk::frame .bg] -expand 1 -fill both
-  .bg configure -padding 5
+  .bg configure -padding 5pt
 
   # bottom of main window
   pack [ttk::frame .endbuttons] -in .bg -side bottom -fill x
-  ttk::label .busy -textvariable ::busy -font TkHeadingFont -anchor w
+  ttk::label .busy -textvariable ::busy -font hfont -anchor w
   ppack .busy -in .endbuttons -side left
   ppack [ttk::button .q -text [__ Quit] -command {destroy .}] \
       -in .endbuttons -side right
@@ -2256,20 +2300,20 @@
            [string range $::env(PATH) 0 59]]
   }
 
-  # left frame
+  # left info frame
   pack [ttk::frame .topfl] -in .topf -side left -anchor nw
 
   # subframe for repositories, to be filled by show_repos
   pack [ttk::frame .toprepo] -in .topfl -side top -anchor w
 
-  # various info, left frame
-  pack [ttk::frame .topfll] -in .topfl -side top -anchor nw -pady [list 6 0]
+  # various info (left frame)
+  pack [ttk::frame .topfll] -in .topfl -side top -anchor nw -pady {6pt 0pt}
   ttk::label .topfll.lluptodate -text [__ "TL Manager up to date?"] -anchor w
   pgrid .topfll.lluptodate -row 2 -column 0 -sticky w
   ttk::label .topfll.luptodate -text [__ "Unknown"] -anchor w
   pgrid .topfll.luptodate -row 2 -column 1 -sticky w
 
-  ttk::label .topfll.llcmd -text [__ "Last tlmgr command:"] -anchor w \
+  ttk::label .topfll.llcmd -text [__ "Last tlmgr command:"] -anchor w
 
   pgrid .topfll.llcmd -row 3 -column 0 -sticky w
   ttk::label .topfll.lcmd -textvariable ::last_cmd \
@@ -2276,7 +2320,7 @@
       -wraplength [expr {60*$::cw}] -justify left -anchor w
   pgrid .topfll.lcmd -row 3 -column 1 -sticky w
 
-  # various info, right frame
+  # right info frame
   ppack [ttk::frame .topfr] -in .topf -side right -anchor ne
   if {$::tcl_platform(platform) eq "windows"} {
     pack [ttk::label .topfr.ladmin] -side top -anchor e
@@ -2287,21 +2331,39 @@
   pack [ttk::label .topfr.lshell] -side top -anchor e
 
   pack [ttk::separator .sp -orient horizontal] \
-      -in .bg -side top -fill x -pady 6
+      -in .bg -side top -fill x -pady 3pt
 
-  # package list
-  ttk::label .lpack -text [__ "Package list"] -font TkHeadingFont -anchor w
-  pack .lpack -in .bg -side top -padx 3 -pady [list 15 3] -fill x
+  # controls frame, between info frame and package list
+  pack [ttk::frame .middle] -in .bg -side top -fill x
+  pack [ttk::frame .pkcontrol] \
+      -in .middle -side left -anchor nw -fill x
 
-  # controlling package list
-  ttk::frame .pkfilter
-  pack .pkfilter -in .bg -side top -fill x
-  grid columnconfigure .pkfilter 3 -weight 1
-  # column #3 is empty, but that is allright
+  # package list display options
+  ttk::label .lpack -text [string toupper [__ "Package list"]] \
+      -font hfont
+  pack .lpack -in .pkcontrol -side top -padx 3pt -pady {6pt 6pt} -anchor w
+
+  pack [ttk::frame .pkfilter -relief groove -borderwidth 2 -padding 3pt] \
+    -in .pkcontrol -side top -anchor nw
+  # on my current linux, groove works only with a dimensionless borderwidth
+
+  # separator columns
+  grid columnconfigure .pkfilter 1 -minsize 20pt
+  grid [ttk::separator .pkfilter.sep1 -orient vertical] \
+    -column 1 -row 0 -rowspan 5 -sticky ns
+  grid columnconfigure .pkfilter 3 -minsize 20pt
+  grid [ttk::separator .pkfilter.sep3 -orient vertical] \
+    -column 3 -row 0 -rowspan 5 -sticky ns
+
   # filter on status: inst, all, upd
-  ttk::label .pkfilter.lstat -font TkHeadingFont -text [__ "Status"]
+  ttk::label .pkfilter.lstat -font bfont -text [__ "Status"]
   ttk::radiobutton .pkfilter.inst -text [__ "Installed"] -value inst \
       -variable ::stat_opt -command collect_and_display_filtered
+  ttk::radiobutton .pkfilter.notins -text [__ "Not installed"] -value notins \
+      -variable ::stat_opt -command {
+        if {! $::have_remote} get_packages_info_remote
+        collect_and_display_filtered
+      }
   ttk::radiobutton .pkfilter.alls -text [__ "All"] -value all \
       -variable ::stat_opt -command {
         if {! $::have_remote} get_packages_info_remote
@@ -2312,13 +2374,14 @@
         if {! $::have_remote} get_packages_info_remote
         collect_and_display_filtered
       }
-  grid .pkfilter.lstat -column 0 -row 0 -sticky w -padx {3 50}
-  pgrid .pkfilter.inst -column 0 -row 1 -sticky w
-  pgrid .pkfilter.alls -column 0 -row 2 -sticky w
-  pgrid .pkfilter.upd -column 0 -row 3 -sticky w
+  grid  .pkfilter.lstat  -column 0 -row 0 -sticky w -padx {3pt 50pt}
+  pgrid .pkfilter.inst   -column 0 -row 1 -sticky w
+  pgrid .pkfilter.notins -column 0 -row 2 -sticky w
+  pgrid .pkfilter.alls   -column 0 -row 3 -sticky w
+  pgrid .pkfilter.upd    -column 0 -row 4 -sticky w
 
   # filter on detail level: all, coll, schm
-  ttk::label .pkfilter.ldtl -font TkHeadingFont -text [__ "Detail >> Global"]
+  ttk::label .pkfilter.ldtl -font bfont -text [__ "Detail >> Global"]
   ttk::radiobutton .pkfilter.alld -text [__ All] -value all \
       -variable ::dtl_opt -command collect_and_display_filtered
   ttk::radiobutton .pkfilter.coll -text [__ "Collections and schemes"] \
@@ -2325,57 +2388,60 @@
       -value coll -variable ::dtl_opt -command collect_and_display_filtered
   ttk::radiobutton .pkfilter.schm -text [__ "Only schemes"] -value schm \
       -variable ::dtl_opt -command collect_and_display_filtered
-  pgrid .pkfilter.ldtl -column 1 -row 0 -sticky w
-  pgrid .pkfilter.alld -column 1 -row 1 -sticky w
-  pgrid .pkfilter.coll -column 1 -row 2 -sticky w
-  pgrid .pkfilter.schm -column 1 -row 3 -sticky w
+  pgrid .pkfilter.ldtl -column 2 -row 0 -sticky w
+  pgrid .pkfilter.alld -column 2 -row 1 -sticky w
+  pgrid .pkfilter.coll -column 2 -row 2 -sticky w
+  pgrid .pkfilter.schm -column 2 -row 3 -sticky w
 
-  # marks
-  grid [ttk::button .mrk_all -text [__ "Mark all"] -command {mark_all 1}] \
-      -in .pkfilter -column 2 -row 1 -sticky w -padx {50 3} -pady 3
-  grid [ttk::button .mrk_none -text [__ "Mark none"] -command {mark_all 0}] \
-      -in .pkfilter -column 2 -row 2 -sticky w -padx {50 3} -pady 3
+  # search interface
+  ttk::label .pkfilter.search_l -font bfont -text [__ "Search"]
+  ttk::entry .pkfilter.search_e -width 30
+  ttk::radiobutton .pkfilter.search_n -variable ::search_desc \
+             -value 0 -text [__ "By name"]
+  ttk::radiobutton .pkfilter.search_d -variable ::search_desc \
+             -value 1 -text [__ "By name and description"]
+  pgrid .pkfilter.search_l -column 4 -row 0 -sticky w
+  pgrid .pkfilter.search_e -column 4 -row 1 -sticky w
+  pgrid .pkfilter.search_n -column 4 -row 2 -sticky w
+  pgrid .pkfilter.search_d -column 4 -row 3 -sticky w
 
+  bind .pkfilter.search_e <KeyRelease> display_packages_info
+  bind .pkfilter.search_n <ButtonRelease> \
+      {set ::search_desc 0; display_packages_info}
+  bind .pkfilter.search_d <ButtonRelease> \
+      {set ::search_desc 1; display_packages_info}
+
   # actions
-  set rw -1
-  incr rw
+  pack [ttk::frame .pkact] -in .middle -side right -anchor ne
   ttk::button .mrk_inst -text [__ "Install marked"] -command {
       install_pkgs "marked"}
-  pgrid .mrk_inst -in .pkfilter -column 4 -row $rw -sticky ew
-  incr rw
+  ppack .mrk_inst -in .pkact -side top -fill x
   ttk::button .mrk_upd -text [__ "Update marked"] -command {
     update_pkgs "marked"}
-  pgrid .mrk_upd -in .pkfilter -column 4 -row $rw -sticky ew
-  incr rw
+  ppack .mrk_upd -in .pkact -side top -fill x
   ttk::button .mrk_rem -text [__ "Remove marked"] -command {
     remove_pkgs "marked"}
-  pgrid .mrk_rem -in .pkfilter -column 4 -row $rw -sticky ew
+  ppack .mrk_rem -in .pkact -side top -fill x
   if $::do_restore {
-    incr rw
     ttk::button .mrk_rest -text "[__ "Restore from backup"] ..." -command \
         restore_backups_dialog
-    pgrid .mrk_rest -in .pkfilter -column 4 -row $rw -sticky ew
+    ppack .mrk_rest -in .pkact -side top -fill x
   }
-  incr rw
   ttk::button .upd_tlmgr -text [__ "Update tlmgr"] -command update_tlmgr
-  pgrid .upd_tlmgr -in .pkfilter -column 4 -row $rw -sticky ew
-  incr rw
+  ppack .upd_tlmgr -in .pkact -side top -fill x
   ttk::button .upd_all -text [__ "Update all"] -command update_all
-  pgrid .upd_all -in .pkfilter -column 4 -row $rw -sticky ew
+  ppack .upd_all -in .pkact -side top -fill x
 
-  # search interface; no new row
-  grid [ttk::frame .pksearch] -in .pkfilter -row $rw \
-      -column 0 -columnspan 4 -sticky w
-  ppack [ttk::label .pksearch.l \
-             -text [__ "Search"]] -side left
-  pack [ttk::entry .pksearch.e -width 30] -side left -padx {3 0} -pady 3
-  ppack [ttk::radiobutton .pksearch.n -variable ::search_desc \
-            -value 0 -text [__ "By name"]] -side left
-  ppack [ttk::radiobutton .pksearch.d -variable ::search_desc \
-             -value 1 -text [__ "By name and description"]] -side left
-  bind .pksearch.e <KeyRelease> display_packages_info
-  bind .pksearch.n <ButtonRelease> {set ::search_desc 0; display_packages_info}
-  bind .pksearch.d <ButtonRelease> {set ::search_desc 1; display_packages_info}
+  # marking all/none
+  pack [ttk::frame .pksel] \
+      -in .bg -pady 6pt -side top -fill x
+  pack [ttk::button .mrk_all -text [__ "Mark all displayed"] \
+       -command mark_displayed] -in .pksel -side left
+  pack [ttk::button .mrk_none -text [__ "Mark none"] -command unmark_all] \
+      -in .pksel -padx 6pt -side left
+  ttk::label .binwarn \
+    -text [__ "Only packages for installed platforms are displayed"]
+  pack .binwarn -in .pksel -padx 3pt -side right -anchor s
 
   # packages list itself
   pack [ttk::frame .fpkg] -in .bg -side top -fill both -expand 1
@@ -2423,7 +2489,7 @@
     .topfr.ladmin configure -text \
         [expr {$::multiuser ? [__ "Multi-user"] : [__ "Single-user"]}]
   }
-  # svns for  tlmgr and tlshell
+  # revision numbers for tlmgr and tlshell
   .topfr.linfra configure -text \
       "tlmgr: r[dict get $::pkgs texlive.infra localrev]"
   .topfr.lshell configure -text \
@@ -2433,7 +2499,7 @@
   display_updated_globals
 }
 
-# to be invoked at initialization and after a font scaling change
+# to be invoked at initialization and after a font scaling- or language change
 proc rebuild_interface {} {
   foreach c [winfo children .] {catch {destroy $c}}
 

Modified: trunk/Master/tlpkg/tltcl/tltcl.tcl
===================================================================
--- trunk/Master/tlpkg/tltcl/tltcl.tcl	2021-01-15 02:59:25 UTC (rev 57425)
+++ trunk/Master/tlpkg/tltcl/tltcl.tcl	2021-01-15 17:04:30 UTC (rev 57426)
@@ -478,11 +478,11 @@
 # 'default' padding
 
 proc ppack {wdg args} { ; # pack command with padding
-  pack $wdg {*}$args -padx 3 -pady 3
+  pack $wdg {*}$args -padx 3pt -pady 3pt
 }
 
 proc pgrid {wdg args} { ; # grid command with padding
-  grid $wdg {*}$args -padx 3 -pady 3
+  grid $wdg {*}$args -padx 3pt -pady 3pt
 }
 
 # unicode symbols as fake checkboxes in ttk::treeview widgets
@@ -664,7 +664,7 @@
     wm title .browser [__ "Browse..."]
 
     # wallpaper
-    pack [ttk::frame .browser.bg -padding 3] -fill both -expand 1
+    pack [ttk::frame .browser.bg -padding 3pt] -fill both -expand 1
 
     # ok and cancel buttons
     pack [ttk::frame .browser.fr1] \



More information about the tex-live-commits mailing list.