void FolderMenu::createCreateNewMenu() { QMenu* createMenu = new QMenu(this); createNewMenu_ = createMenu; QAction* action = new QAction(tr("Folder"), this); connect(action, SIGNAL(triggered(bool)), SLOT(onCreateNewFolder())); createMenu->addAction(action); action = new QAction(tr("Blank File"), this); connect(action, SIGNAL(triggered(bool)), SLOT(onCreateNewFile())); createMenu->addAction(action); // add more items to "Create New" menu from templates GList* templates = fm_template_list_all(fm_config->only_user_templates); if(templates) { createMenu->addSeparator(); for(GList* l = templates; l; l = l->next) { FmTemplate* templ = (FmTemplate*)l->data; /* we support directories differently */ if(fm_template_is_directory(templ)) continue; FmMimeType* mime_type = fm_template_get_mime_type(templ); const char* label = fm_template_get_label(templ); QString text = QString("%1 (%2)").arg(QString::fromUtf8(label)).arg(QString::fromUtf8(fm_mime_type_get_desc(mime_type))); FmIcon* icon = fm_template_get_icon(templ); if(!icon) icon = fm_mime_type_get_icon(mime_type); QAction* action = createMenu->addAction(IconTheme::icon(icon), text); action->setObjectName(QString::fromUtf8(fm_template_get_name(templ, NULL))); connect(action, SIGNAL(triggered(bool)), SLOT(onCreateNew())); } } }
/** * fm_app_chooser_dlg_new * @mime_type: (allow-none): MIME type for list creation * @can_set_default: %TRUE if widget can set selected item as default for @mime_type * * Creates a widget for choosing an application either from tree of * existing ones or also allows to set up own command for it. * * Returns: (transfer full): a widget. * * Since: 0.1.0 */ GtkDialog *fm_app_chooser_dlg_new(FmMimeType* mime_type, gboolean can_set_default) { GtkContainer* scroll; GtkLabel *file_type, *file_type_header; GtkTreeSelection* tree_sel; GtkBuilder* builder = gtk_builder_new(); AppChooserData* data = g_slice_new0(AppChooserData); gtk_builder_set_translation_domain(builder, GETTEXT_PACKAGE); gtk_builder_add_from_file(builder, PACKAGE_UI_DIR "/app-chooser.ui", NULL); data->dlg = GTK_DIALOG(gtk_builder_get_object(builder, "dlg")); data->notebook = GTK_NOTEBOOK(gtk_builder_get_object(builder, "notebook")); scroll = GTK_CONTAINER(gtk_builder_get_object(builder, "apps_scroll")); file_type = GTK_LABEL(gtk_builder_get_object(builder, "file_type")); file_type_header = GTK_LABEL(gtk_builder_get_object(builder, "file_type_header")); data->cmdline = GTK_ENTRY(gtk_builder_get_object(builder, "cmdline")); data->set_default = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "set_default")); data->use_terminal = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "use_terminal")); data->keep_open = GTK_TOGGLE_BUTTON(gtk_builder_get_object(builder, "keep_open")); data->browse_btn = GTK_WIDGET(gtk_builder_get_object(builder, "browse_btn")); data->app_name = GTK_ENTRY(gtk_builder_get_object(builder, "app_name")); /* FIXME: shouldn't verify if app-chooser.ui was correct? */ if(mime_type) data->mime_type = fm_mime_type_ref(mime_type); gtk_dialog_set_alternative_button_order(data->dlg, GTK_RESPONSE_OK, GTK_RESPONSE_CANCEL, -1); if(!can_set_default) gtk_widget_hide(GTK_WIDGET(data->set_default)); if(mime_type && fm_mime_type_get_desc(mime_type)) { if (file_type_header) { char *text = g_strdup_printf(_("<b>Select an application to open \"%s\" files</b>"), fm_mime_type_get_desc(mime_type)); gtk_label_set_markup(file_type_header, text); g_free(text); } else gtk_label_set_text(file_type, fm_mime_type_get_desc(mime_type)); } else { GtkWidget* hbox = GTK_WIDGET(gtk_builder_get_object(builder, "file_type_hbox")); gtk_widget_destroy(hbox); gtk_widget_hide(GTK_WIDGET(data->set_default)); } data->apps_view = fm_app_menu_view_new(); gtk_tree_view_set_headers_visible(data->apps_view, FALSE); gtk_widget_show(GTK_WIDGET(data->apps_view)); gtk_container_add(scroll, GTK_WIDGET(data->apps_view)); gtk_widget_grab_focus(GTK_WIDGET(data->apps_view)); g_object_unref(builder); g_signal_connect(data->browse_btn, "clicked", G_CALLBACK(on_browse_btn_clicked), data); g_object_set_qdata_full(G_OBJECT(data->dlg), fm_qdata_id, data, (GDestroyNotify)on_dlg_destroy); g_signal_connect(data->notebook, "switch-page", G_CALLBACK(on_switch_page), data); on_switch_page(data->notebook, NULL, 0, data); tree_sel = gtk_tree_view_get_selection(data->apps_view); g_signal_connect(tree_sel, "changed", G_CALLBACK(on_apps_view_sel_changed), data); g_signal_connect(data->cmdline, "changed", G_CALLBACK(on_cmdline_changed), data); g_signal_connect(data->use_terminal, "toggled", G_CALLBACK(on_use_terminal_changed), data); gtk_dialog_set_response_sensitive(data->dlg, GTK_RESPONSE_OK, FALSE); return data->dlg; }
void FilePropsDialog::initGeneralPage() { // update UI if(singleType) { // all files are of the same mime-type FmIcon* icon = NULL; // FIXME: handle custom icons for some files // FIXME: display special property pages for special files or // some specified mime-types. if(singleFile) { // only one file is selected. icon = fm_file_info_get_icon(fileInfo); } if(mimeType) { if(!icon) // get an icon from mime type if needed icon = fm_mime_type_get_icon(mimeType); ui->fileType->setText(QString::fromUtf8(fm_mime_type_get_desc(mimeType))); ui->mimeType->setText(QString::fromUtf8(fm_mime_type_get_type(mimeType))); } if(icon) { ui->iconButton->setIcon(IconTheme::icon(icon)); } if(singleFile && fm_file_info_is_symlink(fileInfo)) { ui->target->setText(QString::fromUtf8(fm_file_info_get_target(fileInfo))); } else { ui->target->hide(); ui->targetLabel->hide(); } } // end if(singleType) else { // not singleType, multiple files are selected at the same time ui->fileType->setText(tr("Files of different types")); ui->target->hide(); ui->targetLabel->hide(); } // FIXME: check if all files has the same parent dir, mtime, or atime if(singleFile) { // only one file is selected FmPath* parent_path = fm_path_get_parent(fm_file_info_get_path(fileInfo)); char* parent_str = parent_path ? fm_path_display_name(parent_path, true) : NULL; ui->fileName->setText(QString::fromUtf8(fm_file_info_get_disp_name(fileInfo))); if(parent_str) { ui->location->setText(QString::fromUtf8(parent_str)); g_free(parent_str); } else ui->location->clear(); ui->lastModified->setText(QString::fromUtf8(fm_file_info_get_disp_mtime(fileInfo))); // FIXME: need to encapsulate this in an libfm API. time_t atime; struct tm tm; atime = fm_file_info_get_atime(fileInfo); localtime_r(&atime, &tm); char buf[128]; strftime(buf, sizeof(buf), "%x %R", &tm); ui->lastAccessed->setText(QString::fromUtf8(buf)); } else { ui->fileName->setText(tr("Multiple Files")); ui->fileName->setEnabled(false); } initApplications(); // init applications combo box // calculate total file sizes fileSizeTimer = new QTimer(this); connect(fileSizeTimer, &QTimer::timeout, this, &FilePropsDialog::onFileSizeTimerTimeout); fileSizeTimer->start(600); g_signal_connect(deepCountJob, "finished", G_CALLBACK(onDeepCountJobFinished), this); gboolean ret = fm_job_run_async(FM_JOB(deepCountJob)); }
// templateFile is a file path used as a template of the new file. void createFile(CreateFileType type, FmPath* parentDir, FmTemplate* templ, QWidget* parent) { QString defaultNewName; QString prompt; switch(type) { case CreateNewTextFile: prompt = QObject::tr("Please enter a new file name:"); defaultNewName = QObject::tr("New text file"); break; case CreateNewFolder: prompt = QObject::tr("Please enter a new folder name:"); defaultNewName = QObject::tr("New folder"); break; case CreateWithTemplate: { FmMimeType* mime = fm_template_get_mime_type(templ); prompt = QObject::tr("Enter a name for the new %1:").arg(QString::fromUtf8(fm_mime_type_get_desc(mime))); defaultNewName = QString::fromUtf8(fm_template_get_name(templ, NULL)); } break; } _retry: // ask the user to input a file name bool ok; QString new_name = QInputDialog::getText(parent, QObject::tr("Create File"), prompt, QLineEdit::Normal, defaultNewName, &ok); if(!ok) return; GFile* parent_gf = fm_path_to_gfile(parentDir); GFile* dest_gf = g_file_get_child(G_FILE(parent_gf), new_name.toLocal8Bit().data()); g_object_unref(parent_gf); GError* err = NULL; switch(type) { case CreateNewTextFile: { GFileOutputStream* f = g_file_create(dest_gf, G_FILE_CREATE_NONE, NULL, &err); if(f) { g_output_stream_close(G_OUTPUT_STREAM(f), NULL, NULL); g_object_unref(f); } break; } case CreateNewFolder: g_file_make_directory(dest_gf, NULL, &err); break; case CreateWithTemplate: fm_template_create_file(templ, dest_gf, &err, false); break; } g_object_unref(dest_gf); if(err) { if(err->domain == G_IO_ERROR && err->code == G_IO_ERROR_EXISTS) { g_error_free(err); err = NULL; goto _retry; } QMessageBox::critical(parent, QObject::tr("Error"), err->message); g_error_free(err); } }
CreateNewMenu::CreateNewMenu(QWidget* dialogParent, FmPath* dirPath, QWidget* parent): QMenu(parent), dialogParent_(dialogParent), dirPath_(dirPath) { QAction* action = new QAction(QIcon::fromTheme("folder-new"), tr("Folder"), this); connect(action, &QAction::triggered, this, &CreateNewMenu::onCreateNewFolder); addAction(action); action = new QAction(QIcon::fromTheme("document-new"), tr("Blank File"), this); connect(action, &QAction::triggered, this, &CreateNewMenu::onCreateNewFile); addAction(action); // add more items to "Create New" menu from templates GList* templates = fm_template_list_all(fm_config->only_user_templates); if(templates) { addSeparator(); for(GList* l = templates; l; l = l->next) { FmTemplate* templ = (FmTemplate*)l->data; /* we support directories differently */ if(fm_template_is_directory(templ)) continue; FmMimeType* mime_type = fm_template_get_mime_type(templ); const char* label = fm_template_get_label(templ); QString text = QString("%1 (%2)").arg(QString::fromUtf8(label)).arg(QString::fromUtf8(fm_mime_type_get_desc(mime_type))); FmIcon* icon = fm_template_get_icon(templ); if(!icon) icon = fm_mime_type_get_icon(mime_type); QAction* action = addAction(IconTheme::icon(icon), text); action->setObjectName(QString::fromUtf8(fm_template_get_name(templ, NULL))); connect(action, &QAction::triggered, this, &CreateNewMenu::onCreateNew); } } }
static void update_ui (FmFilePropData *data) { GtkImage *img = (GtkImage*) data->icon; if ( data->single_type ) // all files are of the same mime-type { GIcon *icon = NULL; // FIXME_pcm: handle custom icons for some files /* FIXME_pcm: display special property pages for special files or * some specified mime-types. */ if ( data->single_file ) // only one file is selected. { FmFileInfo *file_info = (FmFileInfo*)fm_list_peek_head (data->files); icon = fm_file_info_get_gicon (file_info); } if (data->mime_type) { if (!icon) { FmIcon *ficon = fm_mime_type_get_icon (data->mime_type); if (ficon) icon = ficon->gicon; } gtk_label_set_text (GTK_LABEL (data->type), fm_mime_type_get_desc (data->mime_type)); } if (icon) gtk_image_set_from_gicon (img, icon, GTK_ICON_SIZE_DIALOG); if ( data->single_file && fm_file_info_is_symlink (data->file_info) ) { gtk_widget_show (data->target_label); gtk_widget_show (data->target); gtk_label_set_text (GTK_LABEL (data->target), fm_file_info_get_target (data->file_info)); // gtk_label_set_text (data->type, fm_mime_type_get_desc (data->mime_type)); } else { gtk_widget_destroy (data->target_label); gtk_widget_destroy (data->target); } } else { gtk_image_set_from_stock (img, GTK_STOCK_DND_MULTIPLE, GTK_ICON_SIZE_DIALOG); gtk_widget_set_sensitive (data->name, FALSE); gtk_label_set_text (GTK_LABEL (data->type), _("Files of different types")); gtk_widget_destroy (data->target_label); gtk_widget_destroy (data->target); gtk_widget_destroy (data->open_with_label); gtk_widget_destroy (data->open_with); data->open_with = data->open_with_label = NULL; } // FIXME_pcm: check if all files has the same parent dir, mtime, or atime if ( data->single_file ) { char buf[128]; FmPath *parent = fm_path_get_parent (fm_file_info_get_path (data->file_info)); char *parent_str = parent ? fm_path_display_name (parent, TRUE) : NULL; gtk_entry_set_text (GTK_ENTRY (data->name), fm_file_info_get_disp_name (data->file_info)); if (parent_str) { gtk_label_set_text (GTK_LABEL (data->dir), parent_str); g_free (parent_str); } else gtk_label_set_text (GTK_LABEL (data->dir), ""); gtk_label_set_text (GTK_LABEL (data->mtime), fm_file_info_get_disp_mtime (data->file_info)); // FIXME_pcm: need to encapsulate this in an libfm API. strftime ( buf, sizeof ( buf ), "%x %R", localtime ( &data->file_info->atime ) ); gtk_label_set_text (GTK_LABEL (data->atime), buf); } else { gtk_entry_set_text (GTK_ENTRY (data->name), _("Multiple Files")); gtk_widget_set_sensitive (data->name, FALSE); } update_permissions (data); on_timeout (data); }