Changeset f100c57d


Ignore:
Timestamp:
06/23/14 13:35:23 (13 months ago)
Author:
Ken Moore <ken@…>
Branches:
master, enter/10, releng/10.0.3, releng/10.1, releng/10.1.1, releng/10.1.2
Children:
060b819
Parents:
603a75a (diff), d2b5358 (diff)
Note: this is a merge changeset, the changes displayed below correspond to the merge itself.
Use the (diff) links above to see all the changes relative to each parent.
Message:

Merge branch 'master' of github.com:pcbsd/pcbsd

Files:
1 added
3 deleted
5 edited

Legend:

Unmodified
Added
Removed
  • src-sh/warden/bin/warden

    rcca8f57 rd2b5358  
    6464         type - Set the jail type (pluginjail|portjail|standard) 
    6565     template - Manage jail templates 
    66     zfsmksnap - Create a ZFS snapshot of a jail  
    67  zfslistclone - List clones of jail snapshots 
    68   zfslistsnap - List snapshots of a jail 
    69  zfsclonesnap - Clone a jail snapshot 
    70   zfscronsnap - Schedule snapshot creation via cron 
    71 zfsrevertsnap - Revert jail to a snapshot 
    72    zfsrmclone - Remove a clone directory 
    73     zfsrmsnap - Remove snapshot of a jail 
     66         snap - Jail snapshot management 
     67        clone - Clone an existing jail to a new jail 
     68         cron - Schedule snapshot creation via cron 
    7469__EOF__ 
    7570}; 
     
    170165}; 
    171166 
    172 help_zfslistclone() 
    173 { 
    174  title 
    175  echo "Help zfslistclone 
    176  
    177 List ZFS clones of a jail 
    178  
    179 Usage: 
    180  
    181   warden zfslistclone <Jail> 
    182  
    183 Example: 
    184  
    185   warden zfslistclone myjail 
    186 " 
    187 }; 
    188  
    189 help_zfslistsnap() 
    190 { 
    191  title 
    192  echo "Help zfslistsnap 
    193  
    194 List ZFS snapshots of a jail 
    195  
    196 Usage: 
    197  
    198   warden zfslistsnap <Jail> 
    199  
    200 Example: 
    201  
    202   warden zfslistsnap myjail 
    203 " 
    204 }; 
    205  
    206 help_zfsclonesnap() 
    207 { 
    208  title 
    209  echo "Help zfsclonesnap 
    210  
    211 Clone a ZFS jail snapshot 
    212  
    213 Usage: 
    214  
    215   warden zfsclonesnap <Jail> <SNAP> 
    216  
    217 Example: 
    218  
    219   warden zfsclonesnap myjail 20120505-140510 
    220 " 
    221 }; 
    222  
    223 help_zfscronsnap() 
    224 { 
    225  title 
    226  echo "Help zfscronsnap 
    227  
    228 Schedule a ZFS jail snapshot 
    229  
    230 Usage: 
    231  
    232   warden zfscronsnap <Jail> <action> <frequency> <daysToKeep> 
     167help_snap() 
     168{ 
     169 title 
     170 echo "Help snap 
     171 
     172Perform Snapshot operations on a jail 
     173 
     174Available Sub-Commands: list make remove revert 
     175 
     176list: 
     177 
     178  warden snap list <jail> 
     179 
     180make: 
     181 
     182  warden snap make <jail> <Optional Comment> 
     183 
     184remove: 
     185 
     186  warden snap remove <jail> <snapshot> 
     187 
     188revert: 
     189 
     190  warden snap revert <jail> <snapshot> 
     191 
     192" 
     193}; 
     194 
     195help_clone() 
     196{ 
     197 title 
     198 echo "Help clone 
     199 
     200Clone an existing jail into a new jail with (optional) new IP address 
     201 
     202Usage: 
     203 
     204  warden clone <Jail> <NewJail> 
     205 
     206Example: 
     207 
     208  warden clone myjail newjail --ipv4=127.0.0.4/24 
     209" 
     210}; 
     211 
     212help_cronsnap() 
     213{ 
     214 title 
     215 echo "Help cronsnap 
     216 
     217Schedule a jail snapshot 
     218 
     219Usage: 
     220 
     221  warden cronsnap <Jail> <action> <frequency> <daysToKeep> 
    233222   
    234223  action = start / stop 
     
    238227Example: 
    239228 
    240   warden zfscronsnap myjail start daily 10 
     229  warden cronsnap myjail start daily 10 
    241230 
    242231  or 
    243232 
    244   warden zfscronsnap myjail stop 
    245 " 
    246 }; 
    247  
    248 help_zfsrevertsnap() 
    249 { 
    250  title 
    251  echo "Help zfsrevertsnap 
    252  
    253 Revert ZFS snapshot of a jail 
    254  
    255 Usage: 
    256  
    257   warden zfsrevertsnap <Jail> <SNAP> 
    258  
    259 Example: 
    260  
    261   warden zfsrevertsnap myjail 20120505-140510 
    262 " 
    263 }; 
    264  
    265 help_zfsrmclone() 
    266 { 
    267  title 
    268  echo "Help zfsrmclone 
    269  
    270 Remove ZFS clone of a jail 
    271  
    272 Usage: 
    273  
    274   warden zfsrmclone <Jail> <CLONE> 
    275  
    276 Example: 
    277  
    278   warden zfsrmclone myjail 20120505-140510 
    279 " 
    280 }; 
    281  
    282 help_zfsrmsnap() 
    283 { 
    284  title 
    285  echo "Help zfsrmsnap 
    286  
    287 Remove ZFS snapshot of a jail 
    288  
    289 Usage: 
    290  
    291   warden zfsrmsnap <Jail> <SNAP> 
    292  
    293 Example: 
    294  
    295   warden zfsrmsnap myjail 20120505-140510 
    296 " 
    297 }; 
    298  
    299  
    300 help_zfsmksnap() 
    301 { 
    302  title 
    303  echo "Help zfsmksnap 
    304  
    305 Create a new ZFS snapshot of a jail, with an optional comment 
    306  
    307 Usage: 
    308  
    309   warden zfsmksnap <Jail> <comment> 
    310  
    311 Example: 
    312  
    313   warden zfsmksnap myjail 
     233  warden cronsnap myjail stop 
    314234" 
    315235}; 
     
    679599           get) help_get ;; 
    680600           set) help_set ;; 
    681            zfsmksnap) help_zfsmksnap ;; 
    682            zfslistsnap) help_zfslistsnap ;; 
    683            zfslistclone) help_zfslistclone ;; 
    684            zfsrevertsnap) help_zfsrevertsnap ;; 
    685            zfsclonesnap) help_zfsclonesnap ;; 
    686            zfscronsnap) help_zfscronsnap ;; 
    687            zfsrmsnap) help_zfsrmsnap ;; 
    688            zfsrmclone) help_zfsrmclone ;; 
     601           snap) help_snap ;; 
     602           cronsnap) help_cronsnap ;; 
     603           clone) help_clone ;; 
    689604           *) help_main ;; 
    690605         esac  ;; 
     
    975890         HOST=`basename "${IFILE}" | sed 's|\.wdn$||'` 
    976891 
    977          IP4="OFF" 
    978          IP6="OFF" 
    979          HOST="OFF" 
    980          for i in "$@" 
    981          do 
    982            # Check if we have a new IPv4 address for this import 
    983            echo "${i}" | grep '\-\-ipv4=' >/dev/null 2>/dev/null 
    984            if [ "$?" = "0" ] 
    985            then 
    986               tmp="`echo ${i} | cut -d '=' -f 2`" 
    987               IP4="`echo ${tmp} | cut -d '/' -f 1 -s`" 
    988               MASK4="`echo ${tmp} | cut -d '/' -f 2 -s`" 
    989  
    990               #Sanity check on the IP 
    991               if ! is_ipv4 "${IP4}" ; then 
    992                  exit_err "Invalid IPv4 address: $IP4" 
    993               fi 
    994  
    995               for i in `ls -d ${JDIR}/.*.meta 2>/dev/null` 
    996               do 
    997                 if [ "`cat ${i}/ipv4 2>/dev/null`" = "${IP4}/${MASK4}" ] ; then 
    998                   exit_err "A jail with this IPv4 address already exists!" 
    999                 fi  
    1000               done  
    1001            fi 
    1002  
    1003            # Check if we have a new IPv6 address for this import 
    1004            echo "${i}" | grep '\-\-ipv6=' >/dev/null 2>/dev/null 
    1005            if [ "$?" = "0" ] 
    1006            then 
    1007               tmp="`echo ${i} | cut -d '=' -f 2`" 
    1008               IP6="`echo ${tmp} | cut -d '/' -f 1 -s`" 
    1009               MASK6="`echo ${tmp} | cut -d '/' -f 2 -s`" 
    1010  
    1011               #Sanity check on the IP 
    1012               if ! is_ipv6 "${IP6}" ; then 
    1013                  exit_err "Invalid IPv6 address!" 
    1014               fi 
    1015  
    1016               for i in `ls -d ${JDIR}/.*.meta 2>/dev/null` 
    1017               do 
    1018                 _ipv6=`cat ${i}/ipv6 2>/dev/null | tr a-z A-Z` 
    1019                 _nipv6="`echo ${IP6}|tr a-z A-Z`/${MASK6}" 
    1020                  
    1021                 if [ "${_ipv6}" = "${_nipv6}" ] ; then 
    1022                   exit_err "A jail with this IPv6 address already exists!" 
    1023                 fi  
    1024               done  
    1025            fi 
    1026    
    1027            # Check if we have a new hostname for this jail 
    1028            echo ${i} | grep '\-\-host=' >/dev/null 2>/dev/null 
    1029            if [ "$?" = "0" ] 
    1030            then 
    1031               HOST="`echo ${i} | cut -d '=' -f 2`" 
    1032            fi 
    1033  
    1034          done 
     892         get_ip_host_flags "$@" 
    1035893 
    1036894         if [ "${IP4}" != "OFF" ] ; then 
     
    1071929         ;; 
    1072930 
    1073  zfsmksnap) require_root 
     931 snap) require_root 
     932         JAILNAME="$3" 
     933         if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
     934         if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
     935         set_warden_metadir 
     936 
     937         # Get the sub-command here 
     938         case $2 in 
     939            list) ${PROGDIR}/scripts/backend/zfslistsnap.sh "${JAILNAME}" ;; 
     940            make) ${PROGDIR}/scripts/backend/zfsmksnap.sh "${JAILNAME}" "$4" ;; 
     941          remove) ${PROGDIR}/scripts/backend/zfsrmsnap.sh "${JAILNAME}" "$4" ;; 
     942          revert) ${PROGDIR}/scripts/backend/zfsrevertsnap.sh "${JAILNAME}" "$4" ;; 
     943                *) help_snap ; exit 1 ;; 
     944         esac 
     945         ;; 
     946 
     947 clone) require_root 
    1074948         JAILNAME="$2" 
    1075949         if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1076950         if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1077951         set_warden_metadir 
    1078          ${PROGDIR}/scripts/backend/zfsmksnap.sh "${JAILNAME}" "$3" 
    1079          ;; 
    1080  
    1081  zfslistclone) require_root 
    1082          JAILNAME="$2" 
    1083          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1084          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1085          set_warden_metadir 
    1086          ${PROGDIR}/scripts/backend/zfslistclone.sh "${JAILNAME}" 
    1087          ;; 
    1088  
    1089  zfslistsnap) require_root 
    1090          JAILNAME="$2" 
    1091          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1092          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1093          set_warden_metadir 
    1094          ${PROGDIR}/scripts/backend/zfslistsnap.sh "${JAILNAME}" 
    1095          ;; 
    1096  
    1097  zfsclonesnap) require_root 
    1098          JAILNAME="$2" 
    1099          SNAP="$3" 
    1100          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1101          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1102          set_warden_metadir 
    1103          ${PROGDIR}/scripts/backend/zfsclonesnap.sh "${JAILNAME}" "${SNAP}" 
    1104          ;; 
    1105  
    1106  zfscronsnap) require_root 
     952 
     953         get_ip_host_flags "$@" 
     954 
     955         if [ "${IP4}" != "OFF" ] ; then 
     956            IP4="${IP4}/${MASK4}" 
     957         fi 
     958         if [ "${IP6}" != "OFF" ] ; then 
     959            IP6="${IP6}/${MASK6}" 
     960         fi 
     961 
     962         ${PROGDIR}/scripts/backend/zfsclone.sh "${JAILNAME}" "$3" "$IP4" "$IP6" 
     963         ;; 
     964 
     965 cronsnap) require_root 
    1107966         JAILNAME="$2" 
    1108967         if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
     
    1112971         ;; 
    1113972 
    1114  
    1115  zfsrevertsnap) require_root 
    1116          JAILNAME="$2" 
    1117          SNAP="$3" 
    1118          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1119          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1120          set_warden_metadir 
    1121          ${PROGDIR}/scripts/backend/zfsrevertsnap.sh "${JAILNAME}" "$SNAP" 
    1122          ;; 
    1123  
    1124  zfsrmclone) require_root 
    1125          JAILNAME="$2" 
    1126          CLONE="$3" 
    1127          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1128          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1129          set_warden_metadir 
    1130          ${PROGDIR}/scripts/backend/zfsrmclone.sh "${JAILNAME}" "${CLONE}" 
    1131          ;; 
    1132  
    1133  zfsrmsnap) require_root 
    1134          JAILNAME="$2" 
    1135          SNAP="$3" 
    1136          if [ -z "${JAILNAME}" ]; then exit_err "No jail specified!"; fi 
    1137          if [ ! -e "${JDIR}/${JAILNAME}" ]; then exit_err "No such jail!"; fi 
    1138          set_warden_metadir 
    1139          ${PROGDIR}/scripts/backend/zfsrmsnap.sh "${JAILNAME}" "${SNAP}" 
    1140          ;; 
    1141973 
    1142974 create) require_root 
  • src-sh/warden/scripts/backend/functions.sh

    rde73897 rd2b5358  
    4545 
    4646# Warden Version 
    47 WARDENVER="1.3" 
     47WARDENVER="1.4" 
    4848export WARDENVER 
    4949 
     
    439439} 
    440440 
    441 cloneZFSSnap() { 
     441cloneZFSDir() { 
    442442  isDirZFS "${1}" "1" 
    443443  if [ $? -ne 0 ] ; then printerror "Not a ZFS volume: ${1}" ; fi 
     444 
    444445  tank=`getZFSTank "$1"` 
    445446  rp=`getZFSRelativePath "$1"` 
    446   cdir=`getZFSRelativePath "${CDIR}"` 
    447  
    448   # Make sure this is a valid snapshot 
    449   zfs list -t snapshot | grep -w "^${tank}${rp}" | cut -d '@' -f 2 | awk '{print $1}' | grep -q ${2} 
    450   if [ $? -ne 0 ] ; then printerror "Invalid ZFS snapshot!" ; fi 
    451  
    452   if [ -d "${CDIR}/${3}-${2}" ] ; then 
    453      printerror "This snapshot is already cloned and mounted at: ${CDIR}/${3}-${2}" 
    454   fi 
     447  newrp=`getZFSRelativePath "$2"` 
     448 
     449  zdate=`date +%Y-%m-%d-%H-%M-%S` 
     450  snapName="preClone-$zdate" 
     451 
     452  # Create a temp snapshot we can clone 
     453  zfs snapshot $tank${rp}@${snapName} 
     454  if [ $? -ne 0 ] ; then printerror "Failed creating snapshot!" ; fi 
    455455 
    456456  # Clone the snapshot 
    457   zfs clone -p ${tank}${rp}@$2 ${tank}${cdir}/${3}-${2} 
    458  
    459   echo "Snapshot cloned and mounted to: ${CDIR}/${3}-${2}" 
     457  zfs clone -p ${tank}${rp}@${snapName} ${tank}${newrp} 
     458  if [ $? -ne 0 ] ; then printerror "Failed cloning snapshot!" ; fi 
     459 
     460  return 0 
    460461} 
    461462 
     
    11651166   exit 0 
    11661167} 
     1168 
     1169get_ip_host_flags() 
     1170{ 
     1171         IP4="OFF" 
     1172         IP6="OFF" 
     1173         HOST="OFF" 
     1174         for i in "$@" 
     1175         do 
     1176           # Check if we have a new IPv4 address for this import 
     1177           echo "${i}" | grep '\-\-ipv4=' >/dev/null 2>/dev/null 
     1178           if [ "$?" = "0" ]; then 
     1179              tmp="`echo ${i} | cut -d '=' -f 2`" 
     1180              IP4="`echo ${tmp} | cut -d '/' -f 1 -s`" 
     1181              MASK4="`echo ${tmp} | cut -d '/' -f 2 -s`" 
     1182 
     1183              #Sanity check on the IP 
     1184              if ! is_ipv4 "${IP4}" ; then 
     1185                 exit_err "Invalid IPv4 address: $IP4" 
     1186              fi 
     1187 
     1188              for i in `ls -d ${JDIR}/.*.meta 2>/dev/null` 
     1189              do 
     1190                if [ "`cat ${i}/ipv4 2>/dev/null`" = "${IP4}/${MASK4}" ] ; then 
     1191                  exit_err "A jail with this IPv4 address already exists!" 
     1192                fi 
     1193              done 
     1194           fi 
     1195 
     1196           # Check if we have a new IPv6 address for this import 
     1197           echo "${i}" | grep '\-\-ipv6=' >/dev/null 2>/dev/null 
     1198           if [ "$?" = "0" ]; then 
     1199              tmp="`echo ${i} | cut -d '=' -f 2`" 
     1200              IP6="`echo ${tmp} | cut -d '/' -f 1 -s`" 
     1201              MASK6="`echo ${tmp} | cut -d '/' -f 2 -s`" 
     1202 
     1203              #Sanity check on the IP 
     1204              if ! is_ipv6 "${IP6}" ; then 
     1205                 exit_err "Invalid IPv6 address!" 
     1206              fi 
     1207 
     1208              for i in `ls -d ${JDIR}/.*.meta 2>/dev/null` 
     1209              do 
     1210                _ipv6=`cat ${i}/ipv6 2>/dev/null | tr a-z A-Z` 
     1211                _nipv6="`echo ${IP6}|tr a-z A-Z`/${MASK6}" 
     1212 
     1213                if [ "${_ipv6}" = "${_nipv6}" ] ; then 
     1214                  exit_err "A jail with this IPv6 address already exists!" 
     1215                fi 
     1216              done 
     1217           fi 
     1218 
     1219           # Check if we have a new hostname for this jail 
     1220           echo ${i} | grep '\-\-host=' >/dev/null 2>/dev/null 
     1221           if [ "$?" = "0" ]; then 
     1222              HOST="`echo ${i} | cut -d '=' -f 2`" 
     1223           fi 
     1224 
     1225         done 
     1226 
     1227} 
  • lumina/lumina-fm/MainUI.cpp

    rad7e6ca r603a75a  
    2929    ui->tree_dir_view->sortByColumn(0,Qt::AscendingOrder); 
    3030    ui->tree_dir_view->setContextMenuPolicy(Qt::CustomContextMenu); 
     31  dirCompleter = new QCompleter(fsmod, this); 
     32    currentDir->setCompleter(dirCompleter); 
    3133  snapmod = new QFileSystemModel(this); 
    3234    ui->tree_zfs_dir->setModel(snapmod); 
    3335    ui->tree_zfs_dir->sortByColumn(0, Qt::AscendingOrder); 
    3436  contextMenu = new QMenu(this); 
     37  //Setup any specialty keyboard shortcuts 
     38  nextTabLShort = new QShortcut( QKeySequence(tr("Shift+Left")), this); 
     39  nextTabRShort = new QShortcut( QKeySequence(tr("Shift+Right")), this); 
     40  closeTabShort = new QShortcut( QKeySequence(tr("Ctrl+W")), this); 
     41  //Finish loading the interface 
    3542  setupIcons(); 
    3643  setupConnections(); 
     
    6370         
    6471  //Setup all the icons using libLumina 
    65   ui->actionClose->setIcon( LXDG::findIcon("application-close","") ); 
     72  ui->actionClose->setIcon( LXDG::findIcon("application-exit","") ); 
    6673  ui->actionNew_Tab->setIcon( LXDG::findIcon("tab-new-background","") ); 
    6774  ui->action_Preferences->setIcon( LXDG::findIcon("configure","") ); 
     
    93100 
    94101void MainUI::setupConnections(){ 
     102  connect(QApplication::instance(), SIGNAL(focusChanged(QWidget*, QWidget*)), this, SLOT(startEditDir(QWidget*, QWidget*)) ); 
    95103  connect(tabBar, SIGNAL(currentChanged(int)), this, SLOT(tabChanged(int)) ); 
    96104  connect(tabBar, SIGNAL(tabCloseRequested(int)), this, SLOT(tabClosed(int)) ); 
    97105  connect(ui->tree_dir_view, SIGNAL(customContextMenuRequested(const QPoint&)), this, SLOT(OpenContextMenu(const QPoint&)) ); 
    98106  connect(ui->menuBookmarks, SIGNAL(triggered(QAction*)), this, SLOT(goToBookmark(QAction*)) ); 
     107  connect(currentDir, SIGNAL(returnPressed()), this, SLOT(goToDirectory())); 
     108         
    99109  //Tree Widget interaction 
    100   connect(ui->tree_dir_view, SIGNAL(doubleClicked(const QModelIndex &)), this, SLOT(ItemRun(const QModelIndex &)) ); 
     110  connect(ui->tree_dir_view, SIGNAL(activated(const QModelIndex &)), this, SLOT(ItemRun(const QModelIndex &)) ); 
     111  connect(fsmod, SIGNAL(directoryLoaded(QString)), this, SLOT(directoryLoaded()) ); 
    101112         
    102113  //Page Switching 
     
    114125         
    115126  //ZFS Restore page 
     127  connect(snapmod, SIGNAL(directoryLoaded(QString)), this, SLOT(snapshotLoaded()) ); 
    116128  connect(ui->slider_zfs_snapshot, SIGNAL(valueChanged(int)), this, SLOT(showSnapshot()) ); 
    117129  connect(ui->tool_zfs_nextSnap, SIGNAL(clicked()), this, SLOT(nextSnapshot()) ); 
    118130  connect(ui->tool_zfs_prevSnap, SIGNAL(clicked()), this, SLOT(prevSnapshot()) ); 
    119131  connect(ui->tool_zfs_restoreItem, SIGNAL(clicked()), this, SLOT(restoreItems()) ); 
     132   
     133  //Special Keyboard Shortcuts 
     134  connect(nextTabLShort, SIGNAL(activated()), this, SLOT( prevTab() ) ); 
     135  connect(nextTabRShort, SIGNAL(activated()), this, SLOT( nextTab() ) ); 
     136  connect(closeTabShort, SIGNAL(activated()), this, SLOT( tabClosed() ) ); 
    120137} 
    121138 
     
    160177 
    161178QString MainUI::getCurrentDir(){ 
    162   QString dir = currentDir->text(); 
    163         dir.replace("~/", QDir::homePath()+"/"); 
    164   return dir; 
     179  return currentDir->whatsThis(); 
    165180} 
    166181 
    167182void MainUI::setCurrentDir(QString dir){ 
    168   if(dir.isEmpty() || !QFile::exists(dir)){  
     183  if(dir.isEmpty()){ return; } 
     184  QFileInfo info(dir); 
     185  if(!info.isDir() || !info.exists() ){  
    169186    qDebug() << "Invalid Directory:" << dir; 
    170187    return;  
    171188  } //do nothing 
    172189  //qDebug() << "Show Directory:" << dir; 
     190  isUserWritable = info.isWritable(); 
    173191  if(dir.endsWith("/") && dir!="/" ){ dir.chop(1); } 
     192  currentDir->setWhatsThis(dir); //save the full path internally 
    174193  QString rawdir = dir; 
    175194  //Update the directory viewer and update the line edit 
     
    207226  //Check for ZFS snapshots not implemented yet! 
    208227  snapDirs.clear(); //clear the internal variable 
     228  if(!isUserWritable){ return; } //cannot restore files into a non-writable directory 
    209229  //Now recursively try to find snapshots of this directory 
    210230  QString cdir = getCurrentDir(); 
     
    337357} 
    338358 
     359void MainUI::on_actionClose_triggered(){ 
     360  if(tabBar->count() > 1){ 
     361    if(QMessageBox::Yes != QMessageBox::question(this, tr("Verify Quit"), tr("You have multiple tabs open. Are you sure you want to quit?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::Yes ) ){ 
     362      return; 
     363    } 
     364  } 
     365  qDebug() << "Closing Down..."; 
     366  this->close(); 
     367} 
     368 
    339369void MainUI::goToBookmark(QAction *act){ 
    340370  if(act==ui->actionManage_Bookmarks){ 
     
    401431 
    402432//Browser Functions 
     433void MainUI::startEditDir(QWidget *old, QWidget *now){ 
     434  if(now==currentDir){ 
     435    //The dir edit just got focus 
     436    QString dir = currentDir->text(); 
     437      dir.replace("~/", QDir::homePath()+"/"); 
     438      currentDir->setText(dir); 
     439      //Try to move to the end 
     440      currentDir->selectAll(); 
     441  }else if(old==currentDir){ 
     442    QString dir = currentDir->text(); 
     443      dir.replace(QDir::homePath()+"/", "~/"); 
     444      currentDir->setText(dir); 
     445  } 
     446} 
     447 
     448void MainUI::goToDirectory(){ 
     449  QString dir = currentDir->text(); 
     450  dir.replace("~/",QDir::homePath()+"/"); 
     451  setCurrentDir(dir); 
     452} 
     453 
     454void MainUI::directoryLoaded(){ 
     455  ui->tree_dir_view->resizeColumnToContents(0); 
     456} 
     457 
    403458void MainUI::on_tool_addToDir_clicked(){ 
    404459  bool ok = false; 
     
    426481  QString dir = tabBar->tabWhatsThis(tab); //get the full directory 
    427482  setCurrentDir(dir); //display this as the current dir 
    428   //ui->tree_dir_view->setRootIndex( fsmod->setRootPath(dir) ); //Now update the browser 
    429483} 
    430484 
    431485void MainUI::tabClosed(int tab){ 
     486  if(tabBar->count()==1){ return; } //Can't close the only tab 
     487  if(tab < 0){ tab = tabBar->currentIndex(); } 
    432488  //Remove the tab (will automatically move to a different one); 
    433489  qDebug() << "Closing tab:" << tab << tabBar->tabText(tab); 
    434490  tabBar->removeTab(tab); 
    435491  tabBar->setVisible( tabBar->count() > 1 ); 
     492} 
     493 
     494void MainUI::prevTab(){ 
     495  int cur = tabBar->currentIndex(); 
     496  if(cur == 0){ tabBar->setCurrentIndex( tabBar->count()-1 ); } 
     497  else{ tabBar->setCurrentIndex( cur-1 ); } 
     498} 
     499 
     500void MainUI::nextTab(){ 
     501  int cur = tabBar->currentIndex(); 
     502  if(cur == (tabBar->count()-1) ){ tabBar->setCurrentIndex(0); } 
     503  else{ tabBar->setCurrentIndex( cur+1 ); }      
    436504} 
    437505 
     
    504572 
    505573//ZFS Restore Functions 
     574void MainUI::snapshotLoaded(){ 
     575  ui->tree_zfs_dir->resizeColumnToContents(0); 
     576} 
     577 
    506578void MainUI::showSnapshot(){ 
    507579  ui->tool_zfs_prevSnap->setEnabled(ui->slider_zfs_snapshot->value()!=1); 
     
    583655 
    584656void MainUI::RemoveItem(){ 
     657   if(!isUserWritable){ 
     658     QMessageBox::warning(this, tr("Invalid Permissions"), tr("You do not have permission to edit the files in this directory!") ); 
     659     return; 
     660   } 
    585661   //Get the selected items 
    586662   QStringList sel, names; 
  • lumina/lumina-fm/MainUI.h

    rb3b08221 r603a75a  
    2424#include <QTimer> 
    2525#include <QDateTime> 
     26#include <QShortcut> 
     27#include <QCompleter> 
    2628 
    2729// libLumina includes 
     
    5557        QModelIndex CItem; //the item that was right-clicked (for the context menu) 
    5658        QSettings *settings; 
     59        QShortcut *nextTabLShort, *nextTabRShort, *closeTabShort; 
     60        QCompleter *dirCompleter; 
     61        bool isUserWritable; 
    5762 
    5863        //Simplification Functions 
     
    8994        //Menu Actions 
    9095        void on_actionNew_Tab_triggered(); 
     96        void on_actionClose_triggered(); 
    9197        void goToBookmark(QAction*); 
    9298         
     
    98104 
    99105        //Browser Functions 
     106        void startEditDir(QWidget *old, QWidget *now); 
     107        void goToDirectory(); //go to a manually typed in directory 
     108        void directoryLoaded(); 
    100109        void on_tool_addToDir_clicked(); 
    101110        void tabChanged(int tab); 
    102         void tabClosed(int tab); 
     111        void tabClosed(int tab = -1); 
     112        void prevTab(); 
     113        void nextTab(); 
    103114        void ItemRun( const QModelIndex&); 
    104115        void OpenContextMenu(const QPoint&); 
     
    112123         
    113124        //ZFS Restore Functions 
     125        void snapshotLoaded(); 
    114126        void showSnapshot(); 
    115127        void nextSnapshot(); 
  • lumina/lumina-fm/MainUI.ui

    rad7e6ca r603a75a  
    1919     <widget class="QStackedWidget" name="stackedWidget"> 
    2020      <property name="currentIndex"> 
    21        <number>2</number> 
     21       <number>0</number> 
    2222      </property> 
    2323      <widget class="QWidget" name="page_browser"> 
     
    9191              </property> 
    9292              <property name="text"> 
    93                <string>Slideshow</string> 
     93               <string>&amp;Slideshow</string> 
     94              </property> 
     95              <property name="shortcut"> 
     96               <string>Ctrl+K</string> 
    9497              </property> 
    9598              <property name="toolButtonStyle"> 
     
    107110              </property> 
    108111              <property name="text"> 
    109                <string>Backups</string> 
     112               <string>&amp;Backups</string> 
     113              </property> 
     114              <property name="shortcut"> 
     115               <string>Ctrl+B</string> 
    110116              </property> 
    111117              <property name="toolButtonStyle"> 
     
    197203          </property> 
    198204          <property name="frameShape"> 
    199            <enum>QFrame::Panel</enum> 
     205           <enum>QFrame::StyledPanel</enum> 
    200206          </property> 
    201207          <property name="frameShadow"> 
     
    230236          <item> 
    231237           <widget class="QToolButton" name="tool_image_goBegin"> 
     238            <property name="focusPolicy"> 
     239             <enum>Qt::NoFocus</enum> 
     240            </property> 
    232241            <property name="toolTip"> 
    233242             <string>Go to Beginning</string> 
     
    236245             <string>...</string> 
    237246            </property> 
     247            <property name="shortcut"> 
     248             <string>Shift+Left</string> 
     249            </property> 
    238250           </widget> 
    239251          </item> 
    240252          <item> 
    241253           <widget class="QToolButton" name="tool_image_goPrev"> 
     254            <property name="focusPolicy"> 
     255             <enum>Qt::NoFocus</enum> 
     256            </property> 
    242257            <property name="toolTip"> 
    243258             <string>Go to Previous</string> 
     
    245260            <property name="text"> 
    246261             <string>...</string> 
     262            </property> 
     263            <property name="shortcut"> 
     264             <string>Left</string> 
    247265            </property> 
    248266           </widget> 
     
    269287             </font> 
    270288            </property> 
     289            <property name="focusPolicy"> 
     290             <enum>Qt::StrongFocus</enum> 
     291            </property> 
    271292            <property name="frame"> 
    272293             <bool>true</bool> 
     
    304325          <item> 
    305326           <widget class="QToolButton" name="tool_image_goNext"> 
     327            <property name="focusPolicy"> 
     328             <enum>Qt::NoFocus</enum> 
     329            </property> 
    306330            <property name="toolTip"> 
    307331             <string>Go to Next</string> 
     
    310334             <string>...</string> 
    311335            </property> 
     336            <property name="shortcut"> 
     337             <string>Right</string> 
     338            </property> 
    312339           </widget> 
    313340          </item> 
    314341          <item> 
    315342           <widget class="QToolButton" name="tool_image_goEnd"> 
     343            <property name="focusPolicy"> 
     344             <enum>Qt::NoFocus</enum> 
     345            </property> 
    316346            <property name="toolTip"> 
    317347             <string>Go to End</string> 
     
    319349            <property name="text"> 
    320350             <string>...</string> 
     351            </property> 
     352            <property name="shortcut"> 
     353             <string>Shift+Right</string> 
    321354            </property> 
    322355           </widget> 
     
    345378          <item> 
    346379           <widget class="QToolButton" name="tool_zfs_prevSnap"> 
    347             <property name="text"> 
    348              <string>...</string> 
     380            <property name="focusPolicy"> 
     381             <enum>Qt::NoFocus</enum> 
     382            </property> 
     383            <property name="text"> 
     384             <string>Older</string> 
     385            </property> 
     386            <property name="shortcut"> 
     387             <string>Left</string> 
     388            </property> 
     389            <property name="toolButtonStyle"> 
     390             <enum>Qt::ToolButtonTextUnderIcon</enum> 
    349391            </property> 
    350392           </widget> 
     
    354396            <item> 
    355397             <widget class="QSlider" name="slider_zfs_snapshot"> 
     398              <property name="focusPolicy"> 
     399               <enum>Qt::NoFocus</enum> 
     400              </property> 
    356401              <property name="maximum"> 
    357402               <number>20</number> 
     
    382427          <item> 
    383428           <widget class="QToolButton" name="tool_zfs_nextSnap"> 
    384             <property name="text"> 
    385              <string>...</string> 
     429            <property name="focusPolicy"> 
     430             <enum>Qt::NoFocus</enum> 
     431            </property> 
     432            <property name="text"> 
     433             <string>Newer</string> 
     434            </property> 
     435            <property name="shortcut"> 
     436             <string>Right</string> 
     437            </property> 
     438            <property name="toolButtonStyle"> 
     439             <enum>Qt::ToolButtonTextUnderIcon</enum> 
    386440            </property> 
    387441           </widget> 
     
    391445        <item> 
    392446         <widget class="QTreeView" name="tree_zfs_dir"> 
     447          <property name="focusPolicy"> 
     448           <enum>Qt::StrongFocus</enum> 
     449          </property> 
    393450          <property name="selectionMode"> 
    394451           <enum>QAbstractItemView::ExtendedSelection</enum> 
     
    419476            </property> 
    420477            <property name="text"> 
    421              <string>Restore Selection</string> 
     478             <string>&amp;Restore Selection</string> 
     479            </property> 
     480            <property name="shortcut"> 
     481             <string>Ctrl+R</string> 
    422482            </property> 
    423483            <property name="toolButtonStyle"> 
     
    442502           <widget class="QCheckBox" name="check_zfs_overwrite"> 
    443503            <property name="text"> 
    444              <string>Overwrite Existing Files</string> 
     504             <string>&amp;Overwrite Existing Files</string> 
     505            </property> 
     506            <property name="shortcut"> 
     507             <string>Ctrl+O</string> 
    445508            </property> 
    446509           </widget> 
     
    531594    <string>New &amp;Tab</string> 
    532595   </property> 
     596   <property name="shortcut"> 
     597    <string>Ctrl+T</string> 
     598   </property> 
    533599  </action> 
    534600  <action name="actionClose"> 
    535601   <property name="text"> 
    536602    <string>E&amp;xit</string> 
     603   </property> 
     604   <property name="shortcut"> 
     605    <string>Ctrl+Q</string> 
    537606   </property> 
    538607  </action> 
     
    549618    <string>Go up one directory</string> 
    550619   </property> 
     620   <property name="shortcut"> 
     621    <string>Alt+Up</string> 
     622   </property> 
    551623  </action> 
    552624  <action name="actionHome"> 
    553625   <property name="text"> 
    554     <string>Home</string> 
     626    <string>&amp;Home</string> 
    555627   </property> 
    556628   <property name="toolTip"> 
    557629    <string>Go to your home directory</string> 
     630   </property> 
     631   <property name="shortcut"> 
     632    <string>Alt+H</string> 
    558633   </property> 
    559634  </action> 
     
    576651    <string>Back to directory</string> 
    577652   </property> 
     653   <property name="shortcut"> 
     654    <string>Alt+Left</string> 
     655   </property> 
    578656  </action> 
    579657  <action name="actionRefresh"> 
     
    595673    <string>Bookmark this directory</string> 
    596674   </property> 
     675   <property name="shortcut"> 
     676    <string>Ctrl+D</string> 
     677   </property> 
    597678  </action> 
    598679  <action name="actionScan"> 
     
    610691   <property name="toolTip"> 
    611692    <string>Back to the system</string> 
     693   </property> 
     694   <property name="shortcut"> 
     695    <string>Alt+Left</string> 
    612696   </property> 
    613697  </action> 
Note: See TracChangeset for help on using the changeset viewer.