[chronojump] session tags can be active/inactive at session add/edit



commit 9b840d12320bb488ef482732ac082a7153bf7b59
Author: Xavier de Blas <xaviblas gmail com>
Date:   Mon Nov 23 15:44:41 2020 +0100

    session tags can be active/inactive at session add/edit

 src/gui/app1/session/addEdit.cs          |   9 ++-
 src/gui/app1/session/tagSessionSelect.cs | 104 +++++++++++++++++++++++-----
 src/gui/genericWindow.cs                 |   2 +-
 src/sqlite/tagSession.cs                 | 115 +++++++++++++++++++++++++++++++
 src/tagSession.cs                        |   5 ++
 5 files changed, 215 insertions(+), 20 deletions(-)
---
diff --git a/src/gui/app1/session/addEdit.cs b/src/gui/app1/session/addEdit.cs
index b16e0690..da736961 100644
--- a/src/gui/app1/session/addEdit.cs
+++ b/src/gui/app1/session/addEdit.cs
@@ -535,7 +535,14 @@ public partial class ChronoJumpWindow
 
        private void on_app1sae_button_select_tags_clicked (object o, EventArgs args)
        {
-               new TagSessionSelect();
+               //just be cautious
+               if(currentSession == null)
+                       return;
+
+               TagSessionSelect tagSessionSelect = new TagSessionSelect();
+               tagSessionSelect.PassVariables(currentSession.UniqueID);
+               tagSessionSelect.Do();
+               tagSessionSelect.Show();
        }
 
        void app1sae_on_button_change_date_clicked (object o, EventArgs args)
diff --git a/src/gui/app1/session/tagSessionSelect.cs b/src/gui/app1/session/tagSessionSelect.cs
index 42d181a2..51e67122 100644
--- a/src/gui/app1/session/tagSessionSelect.cs
+++ b/src/gui/app1/session/tagSessionSelect.cs
@@ -30,14 +30,24 @@ using Mono.Unix;
 //adapted from src/gui/encoderSelectRepetitions.cs
 public class TagSessionSelect
 {
-       private ArrayList data;
-       private ArrayList dataPrint;
+       //passed variables
+       private int currentSessionID;
+
+       private ArrayList allTags_list; //all available tags
+       private ArrayList allTags_listPrint;
+       private List<TagSession> tagsActiveThisSession_list;
        private static GenericWindow genericWin;
        private string [] columnsString;
         private ArrayList bigArray;
        private string [] checkboxes;
 
-        //passed variables
+       public Gtk.Button FakeButtonDone;
+
+       public void PassVariables(int currentSessionID)
+       {
+               this.currentSessionID = currentSessionID;
+               FakeButtonDone = new Gtk.Button();
+       }
 
        public void Do() {
                 getData();
@@ -46,23 +56,53 @@ public class TagSessionSelect
                 createGenericWindow();
         }
 
+       private void nullifyGenericWindow()
+       {
+               if(genericWin != null && ! genericWin.GenericWindowBoxIsNull())
+                       genericWin.HideAndNull();
+       }
+
+       //used when click on "Select" button
+       public void Show()
+       {
+               //if user destroyed window (on_delete_event), recreate it again
+               if(genericWin.GenericWindowBoxIsNull() || ! createdGenericWinIsOfThisType())
+                       Do();
+
+               activateCallbacks();
+               genericWin.ShowNow();
+               genericWin.SetButtonAcceptSensitive(true);
+       }
+
+
        private void getData()
         {
-               data = SqliteTagSession.Select(false, -1);
+               allTags_list = SqliteTagSession.Select(false, -1);
+               tagsActiveThisSession_list = SqliteSessionTagSession.Select(false, currentSessionID);
         }
 
        private void createBigArray()
        {
-               dataPrint = new ArrayList();
-               checkboxes = new string[data.Count]; //to store active or inactive status of tags
+               allTags_listPrint = new ArrayList();
+               checkboxes = new string[allTags_list.Count]; //to store active or inactive status of tags
                int count = 0;
-               foreach(TagSession tagS in data) {
-                       checkboxes[count++] = "inactive";
-                       dataPrint.Add(tagS.ToStringArray());
+               foreach(TagSession tagS in allTags_list)
+               {
+                       string str = "inactive";
+                       foreach(TagSession tagActiveThisSession in tagsActiveThisSession_list)
+                               if(tagActiveThisSession.UniqueID == tagS.UniqueID)
+                               {
+                                       str = "active";
+                                       break;
+                               }
+
+                       checkboxes[count++] = str;
+                       allTags_listPrint.Add(tagS.ToStringArray());
                }
 
                columnsString = new string[] {
                        "ID",
+                       Catalog.GetString("Active"),
                        Catalog.GetString("Name"),
                        Catalog.GetString("Color"),
                        Catalog.GetString("Comments")
@@ -76,22 +116,50 @@ public class TagSessionSelect
                bigArray.Add(a1);
        }
 
-       private void nullifyGenericWindow()
-       {
-               if(genericWin != null && ! genericWin.GenericWindowBoxIsNull())
-                       genericWin.HideAndNull();
-       }
-
        private void createGenericWindow()
        {
                 genericWin = GenericWindow.Show(Catalog.GetString("Tags"), false,       //don't show now
                                 "", bigArray);
 
-               genericWin.SetTreeview(columnsString, true, dataPrint, new ArrayList(), 
GenericWindow.EditActions.NONE, false);
+               genericWin.SetTreeview(columnsString, true, allTags_listPrint, new ArrayList(), 
GenericWindow.EditActions.NONE, false);
+
+               genericWin.ResetComboCheckBoxesOptions();
+               genericWin.CreateComboCheckBoxes();
+               genericWin.MarkActiveCurves(checkboxes);
 
-               //TODO: continue...
+               genericWin.Type = GenericWindow.Types.TAGSESSION;
        }
 
+       private bool createdGenericWinIsOfThisType() {
+               if(genericWin.Type == GenericWindow.Types.TAGSESSION)
+                       return true;
+
+               return false;
+       }
+
+       private void activateCallbacks() {
+               //manage selected, unselected curves
+               genericWin.Button_accept.Clicked -= new EventHandler(on_tag_session_win_done);
+               genericWin.Button_accept.Clicked += new EventHandler(on_tag_session_win_done);
+       }
+
+       private void removeCallbacks() {
+               genericWin.Button_accept.Clicked -= new EventHandler(on_tag_session_win_done);
+       }
+
+       private void on_tag_session_win_done (object o, EventArgs args)
+       {
+               removeCallbacks();
+
+               //get selected/deselected rows
+               checkboxes = genericWin.GetColumn(1, false);
+
+               //update on database the what has been selected/deselected
+               //doing it as a transaction: FAST
+               SqliteSessionTagSession.UpdateTransaction(currentSessionID, allTags_list,
+                               tagsActiveThisSession_list, checkboxes);
+
+               FakeButtonDone.Click();
+       }
 
-       
 }
diff --git a/src/gui/genericWindow.cs b/src/gui/genericWindow.cs
index e2d0e45f..b39aacf8 100644
--- a/src/gui/genericWindow.cs
+++ b/src/gui/genericWindow.cs
@@ -120,7 +120,7 @@ public class GenericWindow
        public int uniqueID;                    //used on encoder & forceSensor edit exercise
 
        public enum Types { UNDEFINED, ENCODER_SESSION_LOAD, 
-               ENCODER_SEL_REPS_IND_CURRENT_SESS, ENCODER_SEL_REPS_IND_ALL_SESS, 
ENCODER_SEL_REPS_GROUP_CURRENT_SESS };
+               ENCODER_SEL_REPS_IND_CURRENT_SESS, ENCODER_SEL_REPS_IND_ALL_SESS, 
ENCODER_SEL_REPS_GROUP_CURRENT_SESS, TAGSESSION };
        //used to decide if a genericWin has to be recreated
        public Types Type;
 
diff --git a/src/sqlite/tagSession.cs b/src/sqlite/tagSession.cs
index ce5ba73c..bbe6cf8b 100644
--- a/src/sqlite/tagSession.cs
+++ b/src/sqlite/tagSession.cs
@@ -130,4 +130,119 @@ class SqliteSessionTagSession : Sqlite
                        "tagSessionID INT )";
                dbcmd.ExecuteNonQuery();
        }
+
+       //default insertion
+       public static void Insert (bool dbconOpened, int sessionID, int tagSessionID)
+       {
+               Insert (dbconOpened, sessionID, tagSessionID, dbcmd);
+       }
+       //the method, can be called passing an special SqliteCommand to perform transactions
+       public static void Insert (bool dbconOpened, int sessionID, int tagSessionID, SqliteCommand mycmd)
+       {
+               openIfNeeded(dbconOpened);
+
+               mycmd.CommandText = "INSERT INTO " + table +
+                               " (uniqueID, sessionID, tagSessionID)" +
+                               " VALUES (NULL, " +
+                               sessionID.ToString() + ", " +
+                               tagSessionID.ToString() + ")";
+
+               LogB.SQL(mycmd.CommandText.ToString());
+               mycmd.ExecuteNonQuery();
+
+               closeIfNeeded(dbconOpened);
+       }
+
+       public static void Delete (bool dbconOpened, int sessionID, int tagSessionID)
+       {
+               Delete (dbconOpened, sessionID, tagSessionID, dbcmd);
+       }
+       //the method, can be called passing an special SqliteCommand to perform transactions
+       public static void Delete (bool dbconOpened, int sessionID, int tagSessionID, SqliteCommand mycmd)
+       {
+               openIfNeeded(dbconOpened);
+
+               mycmd.CommandText = "DELETE FROM " + table +
+                               " WHERE sessionID = " + sessionID +
+                               " AND tagSessionID = " + tagSessionID;
+
+               LogB.SQL(mycmd.CommandText.ToString());
+               mycmd.ExecuteNonQuery();
+
+               closeIfNeeded(dbconOpened);
+       }
+
+       //gets the active tagSessions in session
+       public static List<TagSession> Select (bool dbconOpened, int sessionID)
+       {
+               openIfNeeded(dbconOpened);
+
+               dbcmd.CommandText = "SELECT tagSession.* FROM tagSession, sessionTagSession " +
+                       "WHERE tagSession.uniqueID = sessionTagSession.tagSessionID AND " +
+                       "sessionTagSession.sessionID = " + sessionID + " ORDER BY NAME";
+
+               LogB.SQL(dbcmd.CommandText.ToString());
+               dbcmd.ExecuteNonQuery();
+
+               SqliteDataReader reader;
+               reader = dbcmd.ExecuteReader();
+
+               List<TagSession> list = new List<TagSession>();
+
+               while(reader.Read()) {
+                       TagSession tagS = new TagSession (
+                                       Convert.ToInt32(reader[0].ToString()),  //uniqueID
+                                       reader[1].ToString(),                   //name
+                                       reader[2].ToString(),                   //color
+                                       reader[3].ToString()                    //comments
+                                       );
+                       list.Add(tagS);
+               }
+
+               reader.Close();
+               closeIfNeeded(dbconOpened);
+
+               return list;
+       }
+
+       public static void UpdateTransaction(int sessionID, ArrayList allTags_list,
+                       List<TagSession> tagsActiveThisSession_list, string [] checkboxes)
+       {
+               LogB.SQL("Starting sessionTagSession transaction");
+               Sqlite.Open();
+
+               int count = 0;
+               using(SqliteTransaction tr = dbcon.BeginTransaction())
+               {
+                       using (SqliteCommand dbcmdTr = dbcon.CreateCommand())
+                       {
+                               dbcmdTr.Transaction = tr;
+
+                               foreach(TagSession tagSession in allTags_list)
+                               {
+                                       string statusOld = "inactive";
+                                       foreach(TagSession tagSearchIfActive in tagsActiveThisSession_list)
+                                               if(tagSearchIfActive.UniqueID == tagSession.UniqueID)
+                                               {
+                                                       statusOld = "active";
+                                                       break;
+                                               }
+
+                                       if(statusOld != checkboxes[count]) {
+                                               if(checkboxes[count] == "active")
+                                                       Insert(true, sessionID, tagSession.UniqueID, dbcmdTr);
+                                               else
+                                                       Delete(true, sessionID, tagSession.UniqueID, dbcmdTr);
+                                       }
+
+                                       count ++;
+                               }
+                       }
+                       tr.Commit();
+               }
+
+               Sqlite.Close();
+               LogB.SQL("Ended transaction");
+       }
+
 }
diff --git a/src/tagSession.cs b/src/tagSession.cs
index faf431db..18248334 100644
--- a/src/tagSession.cs
+++ b/src/tagSession.cs
@@ -73,5 +73,10 @@ public class TagSession
 
                return str;
        }
+
+       public int UniqueID
+       {
+               get { return uniqueID; }
+       }
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]