/*static*/ void TabPage::onFolderFsInfo(FmFolder* _folder, TabPage* pThis) { guint64 free, total; QString& msg = pThis->statusText_[StatusTextFSInfo]; if(fm_folder_get_filesystem_info(_folder, &total, &free)) { char total_str[64]; char free_str[64]; fm_file_size_to_str(free_str, sizeof(free_str), free, fm_config->si_unit); fm_file_size_to_str(total_str, sizeof(total_str), total, fm_config->si_unit); msg = tr("Free space: %1 (Total: %2)") .arg(QString::fromUtf8(free_str)) .arg(QString::fromUtf8(total_str)); } else msg.clear(); Q_EMIT pThis->statusChanged(StatusTextFSInfo, msg); }
// 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); }
static void on_folder_fs_info(FmFolder* folder, FmTabPage* page) { guint64 free, total; char* msg = page->status_text[FM_STATUS_TEXT_FS_INFO]; g_free(msg); /* g_debug("%p, fs-info: %d", folder, (int)folder->has_fs_info); */ if(fm_folder_get_filesystem_info(folder, &total, &free)) { char total_str[ 64 ]; char free_str[ 64 ]; fm_file_size_to_str(free_str, free, TRUE); fm_file_size_to_str(total_str, total, TRUE); msg = g_strdup_printf(_("Free space: %s (Total: %s)"), free_str, total_str ); } else msg = NULL; page->status_text[FM_STATUS_TEXT_FS_INFO] = msg; g_signal_emit(page, signals[STATUS], 0, (guint)FM_STATUS_TEXT_FS_INFO, msg); }
void FilePropsDialog::onFileSizeTimerTimeout() { if(deepCountJob && !fm_job_is_cancelled(FM_JOB(deepCountJob))) { char size_str[128]; fm_file_size_to_str(size_str, sizeof(size_str), deepCountJob->total_size, fm_config->si_unit); // FIXME: // OMG! It's really unbelievable that Qt developers only implement // QObject::tr(... int n). GNU gettext developers are smarter and // they use unsigned long instead of int. // We cannot use Qt here to handle plural forms. So sad. :-( QString str = QString::fromUtf8(size_str) % QString(" (%1 B)").arg(deepCountJob->total_size); // tr(" (%n) byte(s)", "", deepCountJob->total_size); ui->fileSize->setText(str); fm_file_size_to_str(size_str, sizeof(size_str), deepCountJob->total_ondisk_size, fm_config->si_unit); str = QString::fromUtf8(size_str) % QString(" (%1 B)").arg(deepCountJob->total_ondisk_size); // tr(" (%n) byte(s)", "", deepCountJob->total_ondisk_size); ui->onDiskSize->setText(str); } }
static gboolean on_timeout (FmFilePropData *data) { char size_str[128]; FmDeepCountJob *dc = (FmDeepCountJob*) data->dc_job; //gdk_threads_enter (); if (G_LIKELY (dc && !fm_job_is_cancelled (FM_JOB (dc)))) { char *str; fm_file_size_to_str (size_str, dc->total_size, TRUE); str = g_strdup_printf ("%s (%'llu %s)", size_str, dc->total_size, ngettext ("byte", "bytes", dc->total_size)); gtk_label_set_text (GTK_LABEL (data->total_size), str); g_free (str); fm_file_size_to_str (size_str, dc->total_block_size, TRUE); str = g_strdup_printf ("%s (%'llu %s)", size_str, dc->total_block_size, ngettext ("byte", "bytes", dc->total_block_size)); gtk_label_set_text (GTK_LABEL (data->size_on_disk), str); g_free (str); } //gdk_threads_leave (); return TRUE; }
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); }
static gboolean on_update_dlg(gpointer user_data) { FmProgressDisplay* data = (FmProgressDisplay*)user_data; gdouble elapsed; char* data_transferred_str; char trans_size_str[128]; char total_size_str[128]; if (g_source_is_destroyed(g_main_current_source()) || data->dlg == NULL) return FALSE; data->update_timeout = 0; /* the g_strdup very probably returns the same pointer that was g_free'd so we cannot just compare data->old_cur_file with data->cur_file */ if(data->cur_file && data->current) { g_string_printf(data->str, "<i>%s %s</i>", data->op_text, data->cur_file); gtk_label_set_markup(data->current, data->str->str); gtk_widget_set_tooltip_text(GTK_WIDGET(data->current), data->cur_file); g_free(data->old_cur_file); data->old_cur_file = data->cur_file; data->cur_file = NULL; } g_string_printf(data->str, "%d %%", data->percent); gtk_progress_bar_set_fraction(data->progress, (gdouble)data->percent/100); gtk_progress_bar_set_text(data->progress, data->str->str); /* display the amount of data transferred */ fm_file_size_to_str(trans_size_str, sizeof(trans_size_str), data->data_transferred_size, fm_config->si_unit); fm_file_size_to_str(total_size_str, sizeof(total_size_str), data->data_total_size, fm_config->si_unit); data_transferred_str = g_strdup_printf("%s / %s", trans_size_str, total_size_str); gtk_label_set_text(data->data_transferred, data_transferred_str); g_free(data_transferred_str); elapsed = g_timer_elapsed(data->timer, NULL); if(elapsed >= 0.5 && data->percent > 0) { gdouble remaining = elapsed * (100 - data->percent) / data->percent; if(data->remaining_time) { char time_str[32]; guint secs = (guint)remaining; guint mins = 0; guint hrs = 0; if(secs >= 60) { mins = secs / 60; secs %= 60; if(mins >= 60) { hrs = mins / 60; mins %= 60; } } g_snprintf(time_str, 32, "%02d:%02d:%02d", hrs, mins, secs); gtk_label_set_text(data->remaining_time, time_str); } } return FALSE; }