/* -*- Mode: C ; c-basic-offset: 2 -*- */ /* * LADI Session Handler (ladish) * * Copyright (C) 2008 Dave Robillard * Copyright (C) 2008 Nedko Arnaudov * ************************************************************************** * This file contains implementation of the load project dialog ************************************************************************** * * LADI Session Handler is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * LADI Session Handler is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with LADI Session Handler. If not, see * or write to the Free Software Foundation, Inc., * 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. */ #include "common.h" #include "lash_proxy.hpp" #include "load_projects_dialog.hpp" #include "Patchage.hpp" #include "globals.hpp" struct LoadProjectDialog { LoadProjectDialog(); void run(std::list& projects); void load_selected_project(); bool on_button_press_event(GdkEventButton* event_ptr); bool on_key_press_event(GdkEventKey* event_ptr); int mtime_sorter(Gtk::TreeModel::iterator a, Gtk::TreeModel::iterator b); struct Record : public Gtk::TreeModel::ColumnRecord { Gtk::TreeModelColumn name; Gtk::TreeModelColumn modified; Gtk::TreeModelColumn description; Gtk::TreeModelColumn mtime; }; Widget _dialog; Widget _widget; Record _columns; Glib::RefPtr _model; }; static void convert_timestamp_to_string( const time_t timestamp, std::string& timestamp_string) { GDate mtime, now; gint days_diff; struct tm tm_mtime; time_t time_now; const gchar *format; gchar buf[256]; if (timestamp == 0) { timestamp_string = "Unknown"; return; } localtime_r(×tamp, &tm_mtime); g_date_set_time_t(&mtime, timestamp); time_now = time(NULL); g_date_set_time_t(&now, time_now); days_diff = g_date_get_julian(&now) - g_date_get_julian(&mtime); if (days_diff == 0) { format = "Today at %H:%M"; } else if (days_diff == 1) { format = "Yesterday at %H:%M"; } else { if (days_diff > 1 && days_diff < 7) { format = "%A"; /* Days from last week */ } else { format = "%x"; /* Any other date */ } } if (strftime(buf, sizeof(buf), format, &tm_mtime) != 0) { timestamp_string = buf; } else { timestamp_string = "Unknown"; } } LoadProjectDialog::LoadProjectDialog() : _dialog(g_xml, "load_project_dialog") , _widget(g_xml, "loadable_projects_list") { _dialog.init(g_xml, "load_project_dialog"); _widget.init(g_xml, "loadable_projects_list"); _columns.add(_columns.name); _columns.add(_columns.modified); _columns.add(_columns.description); _columns.add(_columns.mtime); _model = Gtk::ListStore::create(_columns); _widget->set_model(_model); _widget->remove_all_columns(); _widget->append_column("Project Name", _columns.name); _widget->get_column(0)->set_sort_column(_columns.name); _widget->append_column("Modified", _columns.modified); _model->set_sort_func(_columns.modified, sigc::mem_fun(this, &LoadProjectDialog::mtime_sorter)); _widget->get_column(1)->set_sort_column(_columns.modified); _model->set_sort_column(_columns.modified, Gtk::SORT_ASCENDING); _widget->append_column("Description", _columns.description); _widget->get_column(2)->set_sort_column(_columns.description); } int LoadProjectDialog::mtime_sorter(Gtk::TreeModel::iterator a, Gtk::TreeModel::iterator b) { time_t ta = (*a)[_columns.mtime]; time_t tb = (*b)[_columns.mtime]; return ta > tb ? -1 : (ta == tb ? 0 : 1); } void LoadProjectDialog::run(std::list& projects) { Gtk::TreeModel::Row row; int result; for (std::list::iterator iter = projects.begin(); iter != projects.end(); iter++) { std::string str; row = *(_model->append()); row[_columns.name] = iter->name; convert_timestamp_to_string(iter->modification_time, str); row[_columns.modified] = str; row[_columns.description] = iter->description; row[_columns.mtime] = iter->modification_time; } _widget->signal_button_press_event().connect(sigc::mem_fun(*this, &LoadProjectDialog::on_button_press_event), false); _widget->signal_key_press_event().connect(sigc::mem_fun(*this, &LoadProjectDialog::on_key_press_event), false); loop: result = _dialog->run(); if (result == 2) { Glib::RefPtr selection = _widget->get_selection(); Gtk::TreeIter iter = selection->get_selected(); if (!iter) { goto loop; } Glib::ustring project_name = (*iter)[_columns.name]; g_app->load_project(project_name); } _dialog->hide(); } void LoadProjectDialog::load_selected_project() { Glib::RefPtr selection = _widget->get_selection(); Glib::ustring name = (*selection->get_selected())[_columns.name]; g_app->load_project(name); _dialog->hide(); } bool LoadProjectDialog::on_button_press_event(GdkEventButton * event_ptr) { if (event_ptr->type == GDK_2BUTTON_PRESS && event_ptr->button == 1) { load_selected_project(); return true; } return false; } bool LoadProjectDialog::on_key_press_event(GdkEventKey * event_ptr) { if (event_ptr->type == GDK_KEY_PRESS && (event_ptr->keyval == GDK_Return || event_ptr->keyval == GDK_KP_Enter)) { load_selected_project(); return true; } return false; } void run_load_project_dialog(std::list& projects) { LoadProjectDialog dialog; dialog.run(projects); }