[chronojump] session tags can be active/inactive at session add/edit
- From: Xavier de Blas <xaviblas src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [chronojump] session tags can be active/inactive at session add/edit
- Date: Mon, 23 Nov 2020 14:45:47 +0000 (UTC)
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]