precords.cpp

来自「磁盘管理工具,主要管理光盘信息和内容希望大家喜欢」· C++ 代码 · 共 1,018 行 · 第 1/3 页

CPP
1,018
字号
//$Id: PRecords.cpp,v 1.19 2007/02/09 12:54:41 markus Rel $//PROJECT     : CDManager//SUBSYSTEM   : Records//REFERENCES  ://TODO        ://BUGS        ://REVISION    : $Revision: 1.19 $//AUTHOR      : Markus Schwab//CREATED     : 24.01.2006//COPYRIGHT   : Copyright (C) 2006, 2007// This program 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.// This program 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 this program; if not, write to the Free Software// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.#include <cdmgr-cfg.h>#include <unistd.h>#include <sstream>#include <gtkmm/paned.h>#include <gtkmm/stock.h>#include <gtkmm/uimanager.h>#include <gtkmm/statusbar.h>#include <gtkmm/scrolledwindow.h>#include <YGP/Check.h>#include <YGP/Trace.h>#include <YGP/ANumeric.h>#include <YGP/StatusObj.h>#include <XGP/MessageDlg.h>#include "SaveCeleb.h"#include "StorageRecord.h"#include "PRecords.h"//-----------------------------------------------------------------------------/// Constructor: Creates a widget handling records/songs/// \param status: Statusbar to display status-messages/// \param menuSave: Menu-entry to save the database/// \param genres: Genres to use in actor-list//-----------------------------------------------------------------------------PRecords::PRecords (Gtk::Statusbar& status, Glib::RefPtr<Gtk::Action> menuSave, const Genres& genres)   : NBPage (status, menuSave), records (genres), songs (genres),     relRecords ("records"), relSongs ("songs") {   TRACE9 ("PRecords::PRecords (Gtk::Statusbar&, Glib::RefPtr<Gtk::Action>, const Genres&)");   Gtk::HPaned* cds (new Gtk::HPaned);   Gtk::ScrolledWindow* scrlRecords (new Gtk::ScrolledWindow);   Gtk::ScrolledWindow* scrlSongs (new Gtk::ScrolledWindow);   scrlRecords->set_shadow_type (Gtk::SHADOW_ETCHED_IN);   scrlSongs->set_shadow_type (Gtk::SHADOW_ETCHED_IN);   scrlRecords->add (records);   scrlSongs->add (songs);   scrlRecords->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);   scrlSongs->set_policy (Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC);   Glib::RefPtr<Gtk::TreeSelection> sel (songs.get_selection ());   sel->set_mode (Gtk::SELECTION_EXTENDED);   sel->signal_changed ().connect (mem_fun (*this, &PRecords::songSelected));   songs.signalChanged.connect (mem_fun (*this, &PRecords::songChanged));   records.signalOwnerChanged.connect (mem_fun (*this, &PRecords::interpretChanged));   records.signalObjectChanged.connect (mem_fun (*this, &PRecords::recordChanged));   sel = records.get_selection ();   sel->set_mode (Gtk::SELECTION_EXTENDED);   sel->signal_changed ().connect (mem_fun (*this, &PRecords::recordSelected));   cds->add1 (*manage (scrlRecords));   cds->add2 (*manage (scrlSongs));   cds->set_position (400);   widget = cds;}//-----------------------------------------------------------------------------/// Destructor//-----------------------------------------------------------------------------PRecords::~PRecords () {   TRACE9 ("PRecords::~PRecords ()");}//-----------------------------------------------------------------------------/// Loads the records from the database////// According to the available information the pages of the notebook/// are created.//-----------------------------------------------------------------------------void PRecords::loadData () {   TRACE9 ("PRecords::loadData ()");   try {      YGP::StatusObject status;      StorageRecord::loadInterprets (interprets, status);      std::sort (interprets.begin (), interprets.end (), &Interpret::compByName);      std::map<unsigned int, std::vector<HRecord> > aRecords;      unsigned int cRecords (StorageRecord::loadRecords (aRecords, status));      TRACE8 ("PRecords::loadData () - Found " << aRecords.size () << " records");      for (std::vector<HInterpret>::const_iterator i (interprets.begin ());	   i != interprets.end (); ++i) {	 Gtk::TreeModel::Row interpret (records.append (*i));	 std::map<unsigned int, std::vector<HRecord> >::iterator iRec	    (aRecords.find ((*i)->getId ()));	 if (iRec != aRecords.end ()) {	    for (std::vector<HRecord>::iterator r (iRec->second.begin ());		 r != iRec->second.end (); ++r) {	       records.append (*r, interpret);	       relRecords.relate (*i, *r);	    }	    aRecords.erase (iRec);	 } // end-if artist has record      } // end-for all artists      records.expand_all ();      loaded = true;      Glib::ustring msg (Glib::locale_to_utf8 (ngettext ("Loaded %1 record", "Loaded %1 records", cRecords)));      msg.replace (msg.find ("%1"), 2, YGP::ANumeric::toString (cRecords));      Glib::ustring tmp (Glib::locale_to_utf8 (ngettext (" from %1 artist", " from %1 artists", interprets.size ())));      tmp.replace (tmp.find ("%1"), 2, YGP::ANumeric::toString (interprets.size ()));      msg += tmp;      showStatus (msg);      if (status.getType () > YGP::StatusObject::UNDEFINED) {	 status.generalize (_("Warnings loading records"));	 XGP::MessageDlg::create (status);      }   }   catch (std::exception& err) {      Glib::ustring msg (_("Can't query available records!\n\nReason: %1"));      msg.replace (msg.find ("%1"), 2, err.what ());      Gtk::MessageDialog dlg (msg, Gtk::MESSAGE_ERROR);      dlg.run ();   }}//-----------------------------------------------------------------------------/// Loads the songs for the passed record/// \param record: Handle to the record for which to load songs//-----------------------------------------------------------------------------void PRecords::loadSongs (const HRecord& record) {   TRACE9 ("PRecords::loadSongs (const HRecord& record) - "	   << (record.isDefined () ? record->getName ().c_str () : "Undefined"));   Check1 (record.isDefined ());   try {      std::vector<HSong> songs_;      StorageRecord::loadSongs (record->getId (), songs_);      TRACE5 ("PRecords::loadSongs (const HRecord& record) - Found songs: " << songs_.size ());      if (songs_.size ())	  relSongs.relate (record, songs_);      record->setSongsLoaded ();   }   catch (std::exception& err) {      Glib::ustring msg (_("Can't query the songs for record %1!\n\nReason: %2"));      msg.replace (msg.find ("%1"), 2, record->getName ());      msg.replace (msg.find ("%2"), 2, err.what ());      Gtk::MessageDialog dlg (msg, Gtk::MESSAGE_ERROR);      dlg.run ();   }}//-----------------------------------------------------------------------------/// Adds a new interpret to the list//-----------------------------------------------------------------------------void PRecords::newInterpret () {   HInterpret interpret;   interpret.define ();   addInterpret (interpret);}//-----------------------------------------------------------------------------/// Adds a new record to the first selected interpret//-----------------------------------------------------------------------------void PRecords::newRecord () {   Glib::RefPtr<Gtk::TreeSelection> recordSel (records.get_selection ());   Gtk::TreeSelection::ListHandle_Path list (recordSel->get_selected_rows ());   Check3 (list.size ());   Glib::RefPtr<Gtk::TreeStore> model (records.getModel ());   Gtk::TreeIter p (model->get_iter (*list.begin ())); Check3 (p);   if ((*p)->parent ())      p = ((*p)->parent ());   HRecord record;   record.define ();   record->setSongsLoaded ();   addRecord (p, record);}//-----------------------------------------------------------------------------/// Adds a new song to the first selected record//-----------------------------------------------------------------------------void PRecords::newSong () {   HSong song;   song.define ();   addSong (song);}//-----------------------------------------------------------------------------/// Callback after selecting a record/// \param row: Selected row//-----------------------------------------------------------------------------void PRecords::recordSelected () {   TRACE9 ("PRecords::recordSelected ()");   songs.clear ();   Check3 (records.get_selection ());   Gtk::TreeSelection::ListHandle_Path list      (records.get_selection ()->get_selected_rows ());   TRACE9 ("PRecords::recordSelected () - Size: " << list.size ());   if (list.size ()) {      Gtk::TreeIter i (records.get_model ()->get_iter (*list.begin ())); Check3 (i);      if ((*i)->parent ()) {	 HRecord hRecord (records.getRecordAt (i)); Check3 (hRecord.isDefined ());	 if (hRecord->needsLoading () && hRecord->getId ())	    loadSongs (hRecord);	 Check3 (!hRecord->needsLoading ());	 // Add related songs to the listbox	 if (relSongs.isRelated (hRecord)) {	    const std::vector<HSong>& as (relSongs.getObjects (hRecord));	    for (std::vector<HSong>::const_iterator s (as.begin ()); s != as.end (); ++s)	       songs.append ((HSong&)(*s));	 }	 enableEdit (OBJECT_SELECTED);      }      else	 enableEdit (OWNER_SELECTED);   }   else      enableEdit (NONE_SELECTED);}//-----------------------------------------------------------------------------/// Callback after selecting a song/// \param row: Selected row//-----------------------------------------------------------------------------void PRecords::songSelected () {   TRACE9 ("PRecords::songSelected ()");   Check3 (songs.get_selection ());   Gtk::TreeSelection::ListHandle_Path list      (songs.get_selection ()->get_selected_rows ());   TRACE9 ("PRecords::songSelected () - Size: " << list.size ());   apMenus[DELETE]->set_sensitive (list.size ());}//-----------------------------------------------------------------------------/// Callback when a song is being changed/// \param row: Changed line/// \param column: Changed column/// \param oldValue: Old value of the changed entry//-----------------------------------------------------------------------------void PRecords::songChanged (const Gtk::TreeIter& row, unsigned int column, Glib::ustring& oldValue) {   TRACE4 ("PRecords::songChanged (const Gtk::TreeIter&, unsigned int, Glib::ustring&) - " << column);   Gtk::TreeSelection::ListHandle_Path list      (records.get_selection ()->get_selected_rows ());   TRACE9 ("PRecords::songChanged (const Gtk::TreeIter&, unsigned int, Glib::ustring&) - Selected: " << list.size ());   Gtk::TreePath path (*list.begin ());   aUndo.push (Undo (Undo::CHANGED, SONG, column, songs.getEntryAt (row), path, oldValue));   apMenus[UNDO]->set_sensitive ();   enableSave ();}//-----------------------------------------------------------------------------/// Callback when changing an interpret/// \param row: Changed line/// \param column: Changed column/// \param oldValue: Old value of the changed entry//-----------------------------------------------------------------------------void PRecords::interpretChanged (const Gtk::TreeIter& row, unsigned int column, Glib::ustring& oldValue) {   TRACE9 ("PRecords::interpretChanged (const Gtk::TreeIter&, unsigned int, Glib::ustring&) - " << column);   Gtk::TreePath path (records.getModel ()->get_path (row));   aUndo.push (Undo (Undo::CHANGED, INTERPRET, column,		     YGP::HEntity::cast (records.getCelebrityAt (row)), path, oldValue));   apMenus[UNDO]->set_sensitive ();   enableSave ();}//-----------------------------------------------------------------------------/// Callback when changing a record/// \param row: Changed line/// \param column: Changed column/// \param oldValue: Old value of the changed entry//-----------------------------------------------------------------------------void PRecords::recordChanged (const Gtk::TreeIter& row, unsigned int column, Glib::ustring& oldValue) {   TRACE9 ("PRecords::recordChanged (const Gtk::TreeIter&, unsigned int, Glib::ustring&) - " << column);   Gtk::TreePath path (records.getModel ()->get_path (row));   aUndo.push (Undo (Undo::CHANGED, RECORD, column, records.getObjectAt (row), path, oldValue));   if (column == 2) {     // If the record-genre was changed, copy it for songs      HRecord rec (records.getRecordAt (row));      TRACE9 ("PRecords::recordChanged (const HEntity& record) - "	      << (rec.isDefined () ? rec->getId () : -1UL) << '/'	      << (rec.isDefined () ? rec->getName ().c_str () : "Undefined"));      Check3 (oldValue.size () == 1);      if (relSongs.isRelated (rec)) {	 unsigned int genre (rec->getGenre ());	 Glib::RefPtr<Gtk::TreeModel> model (songs.get_model ());	 Gtk::TreeSelection::ListHandle_Path list (songs.get_selection ()						->get_selected_rows ());	 if (list.size ()) {	    Gtk::TreeIter iter;	    for (Gtk::TreeSelection::ListHandle_Path::iterator i (list.begin ());		 i != list.end (); ++i) {	       iter = model->get_iter (*i);	       songs.setGenre (iter, genre);	    }	 }	 else {

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?