FileDetailsDialog

The Hildon::FileDetailsDialog is a simple dialog to show more information about a file. This information includes mime-type, modification date, location and size. You may append extra information to that dialog by adding an additional tab to contain your custom widgets. The file handling is done by Hildon::FileSystemModel which is a Gtk::TreeModel, and therefore uses Gtk::TreeIter to describe file locations on the device.

Reference

Example

Figure 5.5. FileDetails

FileDetails

Source Code

File: examplewindow.h

#ifndef _MAEMOMM_EXAMPLEDIALOG_H
#define _MAEMOMM_EXAMPLEDIALOG_H

#include <hildonmm/window.h>
#include <gtkmm/buttonbox.h>
#include <hildonmm/button.h>

class ExampleWindow : public Hildon::Window
{
public:
  ExampleWindow();
  virtual ~ExampleWindow();

private:
  // Signal handlers:
  void on_button_clicked();

  // Child widgets:
  Gtk::HButtonBox box_;
  Hildon::Button button_;
};

#endif /* _MAEMOMM_EXAMPLEWINDOW_H */

File: main.cc

#include <hildonmm.h>
#include <hildon-fmmm.h>
#include "examplewindow.h"

int main(int argc, char *argv[])
{
  Gtk::Main kit(argc, argv);
  Hildon::init();

  Hildon::fm_init();
  
  ExampleWindow window;
  kit.run(window); //Shows the window and returns when it is closed.

  return 0;
}

File: examplewindow.cc

#include "examplewindow.h"
#include <hildon-fmmm/file-chooser-dialog.h>
#include <hildon-fmmm/file-details-dialog.h>
#include <iostream>

ExampleWindow::ExampleWindow() :
  button_(Gtk::Hildon::SIZE_HALFSCREEN_WIDTH | Gtk::Hildon::SIZE_FINGER_HEIGHT,
    Hildon::BUTTON_ARRANGEMENT_VERTICAL,
    "Click Me",
    "to select a file")
{
  set_title("Hildon::FileDetailsDialog Example");

  add(box_);

  box_.pack_start(button_, Gtk::PACK_SHRINK);
  button_.signal_clicked().connect(
    sigc::mem_fun(*this, &ExampleWindow::on_button_clicked));

  show_all_children();
}

ExampleWindow::~ExampleWindow()
{
}

void ExampleWindow::on_button_clicked()
{
  Hildon::FileChooserDialog dialog(*this, Gtk::FILE_CHOOSER_ACTION_OPEN);

  Gtk::FileFilter filter_any;
  filter_any.set_name("Any Files");
  filter_any.add_pattern("*");
  dialog.add_filter(filter_any);

  //Show the dialog and wait for a user response:
  int response = dialog.run();

  //Handle the response:
  switch(response)
  {
    case(Gtk::RESPONSE_OK):
    {
      const std::string filename = dialog.get_filename();
      std::cout << "filename chosen: " << filename << std::endl;

      // Create a Hildon::FileSystemModel
      Glib::RefPtr<Hildon::FileSystemModel> fs_model = 
        Hildon::FileSystemModel::create(*this /* ref-widget */);


      // Create a Hildon::FileDetailsDialog
      Hildon::FileDetailsDialog fd_dialog(fs_model);


      // Tell the FileDetailsDialog to show this file:
      Gtk::TreeModel::iterator iter = fs_model->load_local_path(filename);
      //TODO (low priority): load_local_path() always seems to return a null iter.
      if(iter)
      {
        fd_dialog.set_file_iter(iter);
      }
      else
        std::cerr << "Hildon::FileSystemModel::load_local_path(" << filename <<
          ") failed" << std::endl;


      // Show the dialog:
      fd_dialog.set_transient_for(*this);
      fd_dialog.run();

      break;
    }
    case(Gtk::RESPONSE_CANCEL):
    {
      std::cout << "Cancel clicked." << std::endl;
      break;
    }
    default:
    {
      std::cerr << "Unexpected button clicked." << std::endl;
      break;
    }
  }
  
}