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 + -
显示快捷键?