// when the current selection in the folder view is changed
void TabPage::onSelChanged(int numSel) {
  QString msg;
  if(numSel > 0) {
    /* FIXME: display total size of all selected files. */
    if(numSel == 1) { /* only one file is selected */
      FmFileInfoList* files = folderView_->selectedFiles();
      FmFileInfo* fi = fm_file_info_list_peek_head(files);
      const char* size_str = fm_file_info_get_disp_size(fi);
      if(size_str) {
        msg = QString("\"%1\" (%2) %3")
                        .arg(QString::fromUtf8(fm_file_info_get_disp_name(fi)))
                        .arg(QString::fromUtf8(size_str ? size_str : ""))
                        .arg(QString::fromUtf8(fm_file_info_get_desc(fi)));
      }
      else {
        msg = QString("\"%1\" %2")
                        .arg(QString::fromUtf8(fm_file_info_get_disp_name(fi)))
                        .arg(QString::fromUtf8(fm_file_info_get_desc(fi)));
      }
      /* FIXME: should we support statusbar plugins as in the gtk+ version? */
      fm_file_info_list_unref(files);
    }
    else {
      goffset sum;
      GList* l;
      msg = tr("%1 item(s) selected", NULL, numSel).arg(numSel);
      /* don't count if too many files are selected, that isn't lightweight */
      if(numSel < 1000) {
        sum = 0;
        FmFileInfoList* files = folderView_->selectedFiles();
        for(l = fm_file_info_list_peek_head_link(files); l; l = l->next) {
          if(fm_file_info_is_dir(FM_FILE_INFO(l->data))) {
            /* if we got a directory then we cannot tell it's size
            unless we do deep count but we cannot afford it */
            sum = -1;
            break;
          }
          sum += fm_file_info_get_size(FM_FILE_INFO(l->data));
        }
        if(sum >= 0) {
          char size_str[128];
          fm_file_size_to_str(size_str, sizeof(size_str), sum,
                              fm_config->si_unit);
	  msg += QString(" (%1)").arg(QString::fromUtf8(size_str));
        }
      /* FIXME: should we support statusbar plugins as in the gtk+ version? */
        fm_file_info_list_unref(files);
      }
      /* FIXME: can we show some more info on selection?
          that isn't lightweight if a lot of files are selected */
    }
  }
  statusText_[StatusTextSelectedFiles] = msg;
  Q_EMIT statusChanged(StatusTextSelectedFiles, msg);
}
Example #2
0
static void on_folder_view_sel_changed(FmFolderView* fv, FmFileInfoList* files, FmTabPage* page)
{
    char* msg = page->status_text[FM_STATUS_TEXT_SELECTED_FILES];
    g_free(msg);
    msg = NULL;

    // use SI metric by default
    static gboolean use_si_prefix = TRUE ;

    unsigned items_num = 0;

    if (files)
        items_num = fm_list_get_length(files) ;

    if (items_num > 1) // multiple items are selected
    {
        goffset items_totalsize = 0 ;

        // whether selected items contain dir
        gboolean items_contain_dir  = FALSE ;

        GList* l;
        for (l=fm_list_peek_head_link(files);l;l=l->next)
        {
            FmFileInfo* fi = (FmFileInfo*)l->data;

            // ignore dir when calculating total size. because that
            // may take a long long time, not suitable for updating
            // statusbar in real time.
            if (fm_file_info_is_dir(fi) )
            {
                items_contain_dir = TRUE;
            }
            else
            {
                // Non-dir items are regard as files
                // Should extra logic be added for different kinds of files?
                // hardlink, symlink, pipe, socket ?
                items_totalsize += fm_file_info_get_size(fi) ;
            }
        }

        // when the selected items contain dir, do not show size info on the
        // statusbar, because the calculated total size counts for files only
        // and showing it would be misleading to the user.
        if (items_contain_dir)
        {
            msg = g_strdup_printf("%d items selected", items_num);
        }
        else
        {
            char items_totalsize_str[ 64 ];
            fm_file_size_to_str( items_totalsize_str, items_totalsize, use_si_prefix );

            msg = g_strdup_printf("%d items selected, total size: %s", \
                                  items_num, items_totalsize_str);
        }

    }
    else if (items_num == 1)
    {
        FmFileInfo* fi = fm_list_peek_head(files);
        const char* size_str = fm_file_info_get_disp_size(fi);
        gboolean is_link = fm_file_info_is_symlink(fi);
        if (is_link && size_str)
        {
            msg = g_strdup_printf("\"%s\" link to \"%s\" (%s)",
                                  fm_file_info_get_disp_name(fi),
                                  fm_file_info_get_target(fi),
                                  size_str);
        }
        else if (is_link)
        {
            msg = g_strdup_printf("\"%s\" link to \"%s\"",
                                  fm_file_info_get_disp_name(fi),
                                  fm_file_info_get_target(fi));
        }
        else if (size_str)
        {
            msg = g_strdup_printf("\"%s\" (%s) %s",
                                  fm_file_info_get_disp_name(fi),
                                  size_str,
                                  fm_file_info_get_desc(fi));
        }
        else
        {
            msg = g_strdup_printf("\"%s\" %s",
                                  fm_file_info_get_disp_name(fi),
                                  fm_file_info_get_desc(fi));
        }
    }

    page->status_text[FM_STATUS_TEXT_SELECTED_FILES] = msg;
    g_signal_emit(page, signals[STATUS], 0,
                  (guint)FM_STATUS_TEXT_SELECTED_FILES, msg);
}