I don't know if it's a known problem, but while playing around with
markers I noticed this small bug in the Marker Editor:
- open the Marker Editor (Ctrl-K or double-click on the marker ruler)
- add a marker ("Add" button)
- double-click on it (marker modify dialog opens)
- edit a name and a description
- close the dialog
- add another marker (at the *same position* -- don't move the cursor)
- double-click on the new marker and edit a new name and description
- close the dialog: the previous marker (not the new one) has been updated!

The problem is that markers are searched by position, so it doesn't
work properly when there are several markers at the same position.

I put together a patch to solve this, which I'm posting for your
review. Please note that this patch does not contain any of the
modifications I made for marker shortcuts (see my previous post "Patch
for quick marker").

Let me know if it's working correctly for you.


-- 
Best regards,
Philippe.
Index: /home/user/workspace/Rosegarden/src/base/Marker.cpp
===================================================================
--- /home/user/workspace/Rosegarden/src/base/Marker.cpp (revision 8656)
+++ /home/user/workspace/Rosegarden/src/base/Marker.cpp (working copy)
@@ -33,6 +33,8 @@
 namespace Rosegarden
 {
 
+int Marker::m_sequence = 0;
+
 std::string 
 Marker::toXmlString()
 {
Index: /home/user/workspace/Rosegarden/src/base/Marker.h
===================================================================
--- /home/user/workspace/Rosegarden/src/base/Marker.h   (revision 8656)
+++ /home/user/workspace/Rosegarden/src/base/Marker.h   (working copy)
@@ -43,12 +43,13 @@
 {
 public:
     Marker():m_time(0), m_name(std::string("<unnamed>")), 
-             m_description(std::string("<none>")) { }
+             m_description(std::string("<none>")) { m_id = nextSeqVal(); }
 
     Marker(timeT time, const std::string &name,
            const std::string &description):
-        m_time(time), m_name(name), m_description(description) { }
+        m_time(time), m_name(name), m_description(description) { m_id = 
nextSeqVal(); }
 
+    int getID() const { return m_id; }
     timeT getTime() const { return m_time; }
     std::string getName() const { return m_name; }
     std::string getDescription() const { return m_description; }
@@ -62,6 +63,7 @@
 
 protected:
 
+       int      m_id;
     timeT    m_time;
     std::string          m_name;
     std::string          m_description;
@@ -66,6 +68,9 @@
     std::string          m_name;
     std::string          m_description;
 
+private:
+       static int nextSeqVal() { return ++m_sequence; } // assume there won't 
be concurrency problem
+       static int m_sequence;
 };
 
 }
Index: /home/user/workspace/Rosegarden/src/commands/edit/ModifyMarkerCommand.cpp
===================================================================
--- /home/user/workspace/Rosegarden/src/commands/edit/ModifyMarkerCommand.cpp   
(revision 8656)
+++ /home/user/workspace/Rosegarden/src/commands/edit/ModifyMarkerCommand.cpp   
(working copy)
@@ -33,6 +33,7 @@
 {
 
 ModifyMarkerCommand::ModifyMarkerCommand(Composition *comp,
+        int id,
         timeT time,
         timeT newTime,
         const std::string &name,
@@ -39,6 +40,7 @@
         const std::string &des):
         KNamedCommand(getGlobalName()),
         m_composition(comp),
+        m_id(id),
         m_time(time),
         m_newTime(newTime),
         m_name(name),
@@ -59,7 +61,7 @@
     Composition::markerconstiterator it = markers.begin();
 
     for (; it != markers.end(); ++it) {
-        if ((*it)->getTime() == m_time) {
+        if ((*it)->getID() == m_id) {
             if (m_oldName.empty())
                 m_oldName = (*it)->getName();
             if (m_oldDescription.empty())
@@ -82,7 +84,7 @@
     Composition::markerconstiterator it = markers.begin();
 
     for (; it != markers.end(); ++it) {
-        if ((*it)->getTime() == m_newTime) {
+        if ((*it)->getID() == m_id) {
             (*it)->setName(m_oldName);
             (*it)->setDescription(m_oldDescription);
             (*it)->setTime(m_time);
Index: /home/user/workspace/Rosegarden/src/commands/edit/ModifyMarkerCommand.h
===================================================================
--- /home/user/workspace/Rosegarden/src/commands/edit/ModifyMarkerCommand.h     
(revision 8656)
+++ /home/user/workspace/Rosegarden/src/commands/edit/ModifyMarkerCommand.h     
(working copy)
@@ -45,6 +45,7 @@
 {
 public:
     ModifyMarkerCommand(Composition *comp,
+                        int id,
                         timeT time,
                         timeT newTime,
                         const std::string &name,
@@ -62,6 +63,7 @@
     timeT            m_time;
     timeT            m_newTime;
 
+    int                          m_id;
     std::string                  m_name;
     std::string                  m_description;
     std::string                  m_oldName;
Index: /home/user/workspace/Rosegarden/src/commands/edit/RemoveMarkerCommand.cpp
===================================================================
--- /home/user/workspace/Rosegarden/src/commands/edit/RemoveMarkerCommand.cpp   
(revision 8656)
+++ /home/user/workspace/Rosegarden/src/commands/edit/RemoveMarkerCommand.cpp   
(working copy)
@@ -34,6 +34,7 @@
 {
 
 RemoveMarkerCommand::RemoveMarkerCommand(Composition *comp,
+        int id,
         timeT time,
         const std::string &name,
         const std::string &description):
@@ -40,6 +41,7 @@
         KNamedCommand(getGlobalName()),
         m_composition(comp),
         m_marker(0),
+        m_id(id),
         m_time(time),
         m_name(name),
         m_descr(description),
@@ -61,9 +63,7 @@
     Composition::markerconstiterator it = markers.begin();
 
     for (; it != markers.end(); ++it) {
-        if ((*it)->getTime() == m_time &&
-                (*it)->getName() == m_name &&
-                (*it)->getDescription() == m_descr) {
+        if ((*it)->getID() == m_id) {
             m_marker = (*it);
             m_composition->detachMarker(m_marker);
             m_detached = true;
Index: /home/user/workspace/Rosegarden/src/commands/edit/RemoveMarkerCommand.h
===================================================================
--- /home/user/workspace/Rosegarden/src/commands/edit/RemoveMarkerCommand.h     
(revision 8656)
+++ /home/user/workspace/Rosegarden/src/commands/edit/RemoveMarkerCommand.h     
(working copy)
@@ -46,6 +46,7 @@
 {
 public:
     RemoveMarkerCommand(Composition *comp,
+                        int id,
                         timeT time,
                         const std::string &name,
                         const std::string &description);
@@ -60,6 +61,7 @@
 
     Composition     *m_composition;
     Marker          *m_marker;
+    int              m_id;
     timeT            m_time;
     std::string                  m_name;
     std::string                  m_descr;
Index: /home/user/workspace/Rosegarden/src/gui/application/RosegardenGUIApp.cpp
===================================================================
--- /home/user/workspace/Rosegarden/src/gui/application/RosegardenGUIApp.cpp    
(revision 8656)
+++ /home/user/workspace/Rosegarden/src/gui/application/RosegardenGUIApp.cpp    
(working copy)
@@ -5905,10 +5905,11 @@
 }
 
 void
-RosegardenGUIApp::slotDeleteMarker(timeT time, QString name, QString 
description)
+RosegardenGUIApp::slotDeleteMarker(int id, timeT time, QString name, QString 
description)
 {
     RemoveMarkerCommand *command =
         new RemoveMarkerCommand(&m_doc->getComposition(),
+                                id,
                                 time,
                                 qstrtostr(name),
                                 qstrtostr(description));
Index: /home/user/workspace/Rosegarden/src/gui/application/RosegardenGUIApp.h
===================================================================
--- /home/user/workspace/Rosegarden/src/gui/application/RosegardenGUIApp.h      
(revision 8656)
+++ /home/user/workspace/Rosegarden/src/gui/application/RosegardenGUIApp.h      
(working copy)
@@ -1288,7 +1288,8 @@
     /**
      * Remove a marker
      */
-    void slotDeleteMarker(timeT time,
+    void slotDeleteMarker(int id,
+                          timeT time,
                           QString name,
                           QString description);
 
Index: /home/user/workspace/Rosegarden/src/gui/editors/segment/MarkerEditor.cpp
===================================================================
--- /home/user/workspace/Rosegarden/src/gui/editors/segment/MarkerEditor.cpp    
(revision 8656)
+++ /home/user/workspace/Rosegarden/src/gui/editors/segment/MarkerEditor.cpp    
(working copy)
@@ -262,6 +262,7 @@
 
         item = new
                MarkerEditorViewItem(m_listView,
+                                    (*it)->getID(),
                                     timeString,
                                     strtoqstr((*it)->getName()),
                                     strtoqstr((*it)->getDescription()));
@@ -275,7 +276,7 @@
 
     if (m_listView->childCount() == 0) {
         QListViewItem *item =
-            new MarkerEditorViewItem(m_listView, i18n("<none>"));
+            new MarkerEditorViewItem(m_listView, 0, i18n("<none>"));
         ((MarkerEditorViewItem *)item)->setFake(true);
         m_listView->insertItem(item);
 
@@ -304,6 +305,7 @@
 
         RemoveMarkerCommand *rc =
             new RemoveMarkerCommand(&m_doc->getComposition(),
+                                    ei->getID(),
                                     ei->getRawTime(),
                                     qstrtostr(item->text(1)),
                                     qstrtostr(item->text(2)));
@@ -341,6 +343,7 @@
 
     RemoveMarkerCommand *command =
         new RemoveMarkerCommand(&m_doc->getComposition(),
+                                ei->getID(),
                                 ei->getRawTime(),
                                 qstrtostr(item->text(1)),
                                 qstrtostr(item->text(2)));
@@ -483,6 +486,7 @@
     if (dialog.exec() == QDialog::Accepted) {
         ModifyMarkerCommand *command =
             new ModifyMarkerCommand(&m_doc->getComposition(),
+                                    item->getID(),
                                     dialog.getOriginalTime(),
                                     dialog.getTime(),
                                     qstrtostr(dialog.getName()),
Index: 
/home/user/workspace/Rosegarden/src/gui/editors/segment/MarkerEditorViewItem.h
===================================================================
--- 
/home/user/workspace/Rosegarden/src/gui/editors/segment/MarkerEditorViewItem.h  
    (revision 8656)
+++ 
/home/user/workspace/Rosegarden/src/gui/editors/segment/MarkerEditorViewItem.h  
    (working copy)
@@ -35,7 +35,8 @@
 class MarkerEditorViewItem : public KListViewItem
 {
 public:
-    MarkerEditorViewItem(QListView * parent, QString label1, 
+    MarkerEditorViewItem(QListView * parent, int id,
+                         QString label1, 
                          QString label2 = QString::null, 
                          QString label3 = QString::null,
                          QString label4 = QString::null, 
@@ -45,7 +46,7 @@
                          QString label8 = QString::null):
         KListViewItem(parent, label1, label2, label3, label4,
                       label5, label6, label7, label8),
-       m_rawTime(0), m_fake(false) { ; }
+       m_rawTime(0), m_fake(false), m_id(id) { ; }
 
     virtual int compare(QListViewItem * i, int col, bool ascending) const;
 
@@ -55,9 +56,12 @@
     void setFake(bool fake) { m_fake = true; }
     bool isFake() const { return m_fake; }
 
+    int getID() const { return m_id; }
+    
 protected:
     Rosegarden::timeT m_rawTime;
     bool m_fake;
+    int m_id;
 };
 
 
Index: /home/user/workspace/Rosegarden/src/gui/rulers/MarkerRuler.cpp
===================================================================
--- /home/user/workspace/Rosegarden/src/gui/rulers/MarkerRuler.cpp      
(revision 8656)
+++ /home/user/workspace/Rosegarden/src/gui/rulers/MarkerRuler.cpp      
(working copy)
@@ -199,7 +199,8 @@
     Rosegarden::Marker* marker = getMarkerAtClickPosition();
     
     if (marker)
-        emit deleteMarker(marker->getTime(),
+        emit deleteMarker(marker->getID(),
+                          marker->getTime(),
                           marker->getName(),
                           marker->getDescription());                          
 }
@@ -222,6 +223,7 @@
     if (dialog.exec() == QDialog::Accepted) {
         ModifyMarkerCommand *command =
             new ModifyMarkerCommand(&m_doc->getComposition(),
+                                    marker->getID(),
                                     dialog.getOriginalTime(),
                                     dialog.getTime(),
                                     qstrtostr(dialog.getName()),
Index: /home/user/workspace/Rosegarden/src/gui/rulers/MarkerRuler.h
===================================================================
--- /home/user/workspace/Rosegarden/src/gui/rulers/MarkerRuler.h        
(revision 8656)
+++ /home/user/workspace/Rosegarden/src/gui/rulers/MarkerRuler.h        
(working copy)
@@ -79,7 +79,7 @@
     /// add a marker
     void addMarker(timeT);
     
-    void deleteMarker(timeT, QString name, QString description);
+    void deleteMarker(int, timeT, QString name, QString description);
 
     /// Set a loop range
     void setLoop(timeT, timeT);
Index: /home/user/workspace/Rosegarden/src/gui/rulers/StandardRuler.cpp
===================================================================
--- /home/user/workspace/Rosegarden/src/gui/rulers/StandardRuler.cpp    
(revision 8656)
+++ /home/user/workspace/Rosegarden/src/gui/rulers/StandardRuler.cpp    
(working copy)
@@ -113,8 +113,8 @@
      RosegardenGUIApp::self(), SLOT(slotAddMarker(timeT)));
 
     QObject::connect
-    (m_hButtonBar, SIGNAL(deleteMarker(timeT, QString, QString)),
-     RosegardenGUIApp::self(), SLOT(slotDeleteMarker(timeT, QString, 
QString)));
+    (m_hButtonBar, SIGNAL(deleteMarker(int, timeT, QString, QString)),
+     RosegardenGUIApp::self(), SLOT(slotDeleteMarker(int, timeT, QString, 
QString)));
 
     QObject::connect
     (m_loopRuler, SIGNAL(dragPointerToPosition(timeT)),
-------------------------------------------------------------------------
This SF.net email is sponsored by: Microsoft
Defy all challenges. Microsoft(R) Visual Studio 2008.
http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/
_______________________________________________
Rosegarden-devel mailing list
[email protected] - use the link below to unsubscribe
https://lists.sourceforge.net/lists/listinfo/rosegarden-devel

Reply via email to