precords.cpp

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

CPP
1,018
字号
	    Gtk::TreeModel::Children list (model->children ()); Check3 (list.size ());	    for (Gtk::TreeIter i (list.begin ()); i != list.end (); ++i)	       songs.setGenre (i, genre);	 }      }   }   apMenus[UNDO]->set_sensitive ();   enableSave ();}//-----------------------------------------------------------------------------/// Setting the page-specific menu/// \param ui: User-interface string holding menus/// \param grpActions: Added actions//-----------------------------------------------------------------------------void PRecords::addMenu (Glib::ustring& ui, Glib::RefPtr<Gtk::ActionGroup> grpAction) {   TRACE7 ("PRecords::addMenu");   ui += ("<menuitem action='RUndo'/>"	  "<separator/>"	  "<menuitem action='NInterpret'/>"	  "<menuitem action='NRecord'/>"	  "<menuitem action='NSong'/>"	  "<separator/>"	  "<menuitem action='RDelete'/>"	  "</placeholder></menu>");   grpAction->add (apMenus[UNDO] = Gtk::Action::create ("RUndo", Gtk::Stock::UNDO),		   Gtk::AccelKey (_("<ctl>Z")),		   mem_fun (*this, &PRecords::undo));   grpAction->add (apMenus[NEW1] = Gtk::Action::create ("NInterpret", Gtk::Stock::NEW,							_("New _interpret")),		   Gtk::AccelKey (_("<ctl>N")),		   mem_fun (*this, &PRecords::newInterpret));   grpAction->add (apMenus[NEW2] = Gtk::Action::create ("NRecord", _("_New record")),		   Gtk::AccelKey (_("<ctl><alt>N")),		   mem_fun (*this, &PRecords::newRecord));   grpAction->add (apMenus[NEW3] = Gtk::Action::create ("NSong", _("New _song")),		   Gtk::AccelKey (_("<ctl><shft>N")),		   mem_fun (*this, &PRecords::newSong));   grpAction->add (apMenus[DELETE] = Gtk::Action::create ("RDelete", Gtk::Stock::DELETE, _("_Delete")),		   Gtk::AccelKey (_("<ctl>Delete")),		   mem_fun (*this, &PRecords::deleteSelection));   apMenus[UNDO]->set_sensitive (false);   recordSelected ();}//-----------------------------------------------------------------------------/// Adds an interpret to the record listbox/// \param interpret: Handle to the new interpret/// \returns Gtk::TreeIter: Iterator to new added interpret//-----------------------------------------------------------------------------Gtk::TreeIter PRecords::addInterpret (const HInterpret& interpret) {   interprets.push_back (interpret);   Gtk::TreeModel::iterator i (records.append (interpret));   Gtk::TreePath path (records.getModel ()->get_path (i));   records.set_cursor (path);   aUndo.push (Undo (Undo::INSERT, INTERPRET, 0, YGP::HEntity::cast (interpret), path, ""));   apMenus[UNDO]->set_sensitive ();   enableSave ();   return i;}//-----------------------------------------------------------------------------/// Adds a record to the record listbox/// \param parent: Iterator to the interpret of the record/// \param record: Handle to the new record/// \returns Gtk::TreeIter: Iterator to new added record//-----------------------------------------------------------------------------Gtk::TreeIter PRecords::addRecord (Gtk::TreeIter& parent, HRecord& record) {   Gtk::TreeIter i (records.append (record, *parent));   Glib::RefPtr<Gtk::TreeStore> model (records.getModel ());   records.expand_row (model->get_path (parent), false);   Gtk::TreePath path (records.getModel ()->get_path (i));   records.set_cursor (path);   HInterpret interpret;   interpret = records.getInterpretAt (parent);   relRecords.relate (interpret, record);   aUndo.push (Undo (Undo::INSERT, RECORD, 0, YGP::HEntity::cast (record), path, ""));   apMenus[UNDO]->set_sensitive ();   enableSave ();   return i;}//-----------------------------------------------------------------------------/// Adds a song to the song listbox/// \param song: Handle to the new song/// \returns Gtk::TreeIter: Iterator to new added song//-----------------------------------------------------------------------------Gtk::TreeIter PRecords::addSong (HSong& song) {   Glib::RefPtr<Gtk::TreeSelection> recordSel (records.get_selection ());   Gtk::TreeSelection::ListHandle_Path list (recordSel->get_selected_rows ());   Check3 (list.size ());   Gtk::TreeIter p (records.getModel ()->get_iter (*list.begin ())); Check3 (p);   HRecord record (records.getRecordAt (p)); Check3 (record.isDefined ());   relSongs.relate (record, song);   Gtk::TreeIter iterSong (songs.append (song));   Gtk::TreePath pathSong (songs.getModel ()->get_path (iterSong));   songs.set_cursor (pathSong);   Gtk::TreePath path (*list.begin ());   aUndo.push (Undo (Undo::INSERT, SONG, 0, YGP::HEntity::cast (song), path, ""));   apMenus[UNDO]->set_sensitive ();   enableSave ();   return p;}//-----------------------------------------------------------------------------/// Saves the changed information/// \throw std::exception: In case of error//-----------------------------------------------------------------------------void PRecords::saveData () throw (std::exception) {   TRACE5 ("PRecords::saveData () - " << aUndo.size ());   std::vector<YGP::HEntity> aSaved;   std::vector<YGP::HEntity>::iterator posSaved (aSaved.end ());   while (aUndo.size ()) {      Undo last (aUndo.top ());      TRACE7 ("PRecords::saveData () - What: " << last.what () << '/' << last.how ());      posSaved = lower_bound (aSaved.begin (), aSaved.end (), last.getEntity ());      if ((posSaved == aSaved.end ()) || (*posSaved != last.getEntity ())) {	 switch (last.what ()) {	 case SONG: {	    Check3 (typeid (*last.getEntity ()) == typeid (Song));	    HSong song (HSong::cast (last.getEntity ()));	    if (last.how () == Undo::DELETE) {	       if (song->getId ()) {		  Check3 (song->getId () == last.column ());		  StorageRecord::deleteSong (song->getId ());	       }	       std::map<YGP::HEntity, YGP::HEntity>::iterator delRel		  (delRelation.find (last.getEntity ()));	       Check3 (delRel != delRelation.end ());	       Check3 (typeid (*delRel->second) == typeid (Record));	       delRelation.erase (delRel);	    }	    else {	       HRecord hRec (relSongs.getParent (song));	       if (!hRec->getId ()) {		  Check3 (std::find (aSaved.begin (), aSaved.end (), YGP::HEntity::cast (hRec)) == aSaved.end ());		  Check3 (delRelation.find (YGP::HEntity::cast (hRec)) == delRelation.end ());		  HInterpret interpret  (relRecords.getParent (hRec));		  if (!interpret->getId ()) {		     Check3 (std::find (aSaved.begin (), aSaved.end (), YGP::HEntity::cast (interpret)) == aSaved.end ());		     Check3 (delRelation.find (YGP::HEntity::cast (interpret)) == delRelation.end ());		     SaveCelebrity::store (interpret, "Interprets", *getWindow ());		     aSaved.insert (lower_bound (aSaved.begin (), aSaved.end (), YGP::HEntity::cast (interpret)),				    YGP::HEntity::cast (interpret));		  }		  StorageRecord::saveRecord (hRec, relRecords.getParent (hRec)->getId ());		  aSaved.insert (lower_bound (aSaved.begin (), aSaved.end (), YGP::HEntity::cast (hRec)),				 YGP::HEntity::cast (hRec));		  posSaved = lower_bound (aSaved.begin (), aSaved.end (), last.getEntity ());	       }	       StorageRecord::saveSong (song, hRec->getId ());	    }	    break; }	 case RECORD: {	    Check3 (typeid (*last.getEntity ()) == typeid (Record));	    HRecord rec (HRecord::cast (last.getEntity ()));	    if (last.how () == Undo::DELETE) {	       if (rec->getId ()) {		  Check3 (rec->getId () == last.column ());		  StorageRecord::deleteRecord (rec->getId ());	       }	       std::map<YGP::HEntity, YGP::HEntity>::iterator delRel		  (delRelation.find (last.getEntity ()));	       Check3 (delRel != delRelation.end ());	       Check3 (typeid (*delRel->second) == typeid (Interpret));	       delRelation.erase (delRel);	    }	    else {	       HInterpret interpret  (relRecords.getParent (rec));	       if (!interpret->getId ()) {		  Check3 (std::find (aSaved.begin (), aSaved.end (), YGP::HEntity::cast (interpret)) == aSaved.end ());		  Check3 (delRelation.find (YGP::HEntity::cast (interpret)) == delRelation.end ());		  SaveCelebrity::store (interpret, "Interprets", *getWindow ());		  aSaved.insert (lower_bound (aSaved.begin (), aSaved.end (), YGP::HEntity::cast (interpret)),				 YGP::HEntity::cast (interpret));		  posSaved = lower_bound (aSaved.begin (), aSaved.end (), last.getEntity ());	       }	       StorageRecord::saveRecord (rec, interpret->getId ());	    }	    break; }	 case INTERPRET: {	    Check3 (typeid (*last.getEntity ()) == typeid (Interpret));	    HInterpret interpret (HInterpret::cast (last.getEntity ()));	    if (last.how () == Undo::DELETE) {	       if (interpret->getId ()) {		  Check3 (interpret->getId () == last.column ());		  StorageRecord::deleteInterpret (interpret->getId ());	       }	    }	    else	       SaveCelebrity::store (interpret, "Interprets", *getWindow ());	    break; }	 default:	    Check1 (0);	 } // end-switch	 aSaved.insert (posSaved, last.getEntity ());      }      aUndo.pop ();   } // end-while   Check3 (apMenus[UNDO]);   apMenus[UNDO]->set_sensitive (false);   Check3 (delRelation.empty ());}//-----------------------------------------------------------------------------/// Removes the selected movies or directors from the listbox. Depending movies/// are deleted too.//-----------------------------------------------------------------------------void PRecords::deleteSelection () {   if (records.has_focus ())      deleteSelectedRecords ();   else if (songs.has_focus ())      deleteSelectedSongs ();   apMenus[UNDO]->set_sensitive ();   enableSave ();}//-----------------------------------------------------------------------------/// Removes the selected records or artists from the listbox. Depending objects/// (records or songs) are deleted too.//-----------------------------------------------------------------------------void PRecords::deleteSelectedRecords () {   TRACE9 ("PRecords::deleteSelectedRecords ()");   Glib::RefPtr<Gtk::TreeSelection> selection (records.get_selection ());   while (selection->get_selected_rows ().size ()) {      Gtk::TreeSelection::ListHandle_Path list (selection->get_selected_rows ());      Check3 (list.size ());      Gtk::TreeSelection::ListHandle_Path::iterator i (list.begin ());      Gtk::TreeIter iter (records.get_model ()->get_iter (*i)); Check3 (iter);      if ((*iter)->parent ())                // A record is going to be deleted	 deleteRecord (iter);      else {                             // An interpret is going to be deleted	 TRACE9 ("PRecords::deleteSelectedRecords () - Deleting " <<		 iter->children ().size () << " children");	 HInterpret interpret (records.getInterpretAt (iter)); Check3 (interpret.isDefined ());	 while (iter->children ().size ()) {	    Gtk::TreeIter child (iter->children ().begin ());	    HRecord hRecord (records.getRecordAt (child));	    if (hRecord->needsLoading () && hRecord->getId ())	       loadSongs (hRecord);	    deleteRecord (child);	 }	 Gtk::TreePath path (records.getModel ()->get_path (iter));	 aUndo.push (Undo (Undo::DELETE, INTERPRET, interpret->getId (), YGP::HEntity::cast (interpret), path, ""));	 records.getModel ()->erase (iter);      }   }}//-----------------------------------------------------------------------------/// Deletes the passed record/// \param record: Iterator to record to delete//-----------------------------------------------------------------------------void PRecords::deleteRecord (const Gtk::TreeIter& record) {   Check2 (record->children ().empty ());   HRecord hRec (records.getRecordAt (record));   TRACE9 ("PRecords::deleteRecord (const Gtk::TreeIter&) - Deleting record "	   << hRec->getName ());   Check3 (relRecords.isRelated (hRec));   HInterpret hInterpret (relRecords.getParent (hRec)); Check3 (hInterpret.isDefined ());   // Remove related songs   TRACE3 ("PRecords::deleteRecord (const Gtk::TreeIter&) - Remove Songs");   if (relSongs.isRelated (hRec)) {      const std::vector<HSong>& as (relSongs.getObjects (hRec));      for (std::vector<HSong>::const_iterator s (as.begin ()); s != as.end (); ++s)	 deleteSong ((HSong&)(*s), hRec);      relSongs.unrelateAll (hRec);   }   Check3 (delRelation.find (YGP::HEntity::cast (hRec)) == delRelation.end ());   Gtk::TreePath path (records.getModel ()->get_path (records.getOwner (hInterpret)));   aUndo.push (Undo (Undo::DELETE, RECORD, hRec->getId (), YGP::HEntity::cast (hRec), path, ""));   delRelation[YGP::HEntity::cast (hRec)] = YGP::HEntity::cast (hInterpret);   relRecords.unrelate (hInterpret, hRec);   records.getModel ()->erase (record);}//-----------------------------------------------------------------------------/// Removes the passed songs from the model (but not from the relations)./// \param song: Song to delete/// \param record: Record of song//-----------------------------------------------------------------------------void PRecords::deleteSong (const HSong& song, const HRecord& record) {   TRACE9 ("PRecords::deleteSong (const HSong& song, const HRecord& record)");   Check1 (song.isDefined ()); Check1 (record.isDefined ());   Check3 (delRelation.find (YGP::HEntity::cast (song)) == delRelation.end ());   Gtk::TreePath path (records.getModel ()->get_path (records.getObject (HEntity::cast (record))));   aUndo.push (Undo (Undo::DELETE, SONG, song->getId (), YGP::HEntity::cast (song), path, ""));   delRelation[YGP::HEntity::cast (song)] = YGP::HEntity::cast (record);}//-----------------------------------------------------------------------------/// Removes the selected songs from the listbox.//-----------------------------------------------------------------------------void PRecords::deleteSelectedSongs () {   TRACE9 ("PRecords::deleteSelectedSongs ()");   Glib::RefPtr<Gtk::TreeSelection> selection (songs.get_selection ());   while (selection->get_selected_rows ().size ()) {      Gtk::TreeSelection::ListHandle_Path list (selection->get_selected_rows ());      Check3 (list.size ());      Gtk::TreeSelection::ListHandle_Path::iterator i (list.begin ());      Gtk::TreeIter iter (songs.get_model ()->get_iter (*i)); Check3 (iter);      HSong song (songs.getSongAt (iter)); Check3 (song.isDefined ());      Check3 (relSongs.isRelated (song));      HRecord record (relSongs.getParent (song));      Check3 (record.isDefined ());

⌨️ 快捷键说明

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