예제 #1
0
    /// <summary>
    /// Generates visualizations from several attributes.
    /// </summary>
    /// <param name="dataSetID">data set to use</param>
    /// <param name="variable">attribute to visualize</param>
    /// <param name="visType">visualization type to generate</param>
    /// <returns></returns>
    public GameObject GenerateVisFrom(int dataSetID, string[] variables, VisType visType, bool persist = true)
    {
        if (!initialized)
        {
            Initialize();
        }

        try
        {
            var vis = generators[visType].GenerateVisualization(dataSetID, variables);

            vis = Services.ETVFactory2D().PutETVOnAnchor(vis);

            AddNetworkAnchor(vis, dataSetID, variables, visType);


            Services.Persistence().PersistETV(vis, dataSetID, variables, visType);

            vis.transform.parent   = GameObject.FindGameObjectWithTag("RootWorldAnchor").transform;
            vis.transform.position = NewETVPlaceHolder.position;

            return(vis);
        } catch (Exception e)
        {
            Debug.Log("Creation of requested Visualization failed.");
            Debug.LogError(e.Message);
            Debug.LogError(e.StackTrace);
            return(new GameObject("Creation Failed"));
        }
    }
예제 #2
0
 /// <summary>
 /// Constructor.
 /// </summary>
 public VisDescr(string ident, string uiName, VisType type, VisParamDescr[] descrs)
 {
     Ident             = ident;
     UiName            = uiName;
     VisualizationType = type;
     VisParamDescrs    = descrs;
 }
예제 #3
0
 private void SwitchToWeek_Clicked(object sender, RoutedEventArgs e)
 {
     _currentVisType = VisType.Week;
     SwitchToWeekButton.Visibility = Visibility.Collapsed;
     SwitchToDayButton.Visibility  = Visibility.Visible;
     TodayButton.Content           = "This Week";
     WebBrowserNavigateTo(Handler.GetInstance().GetDashboardNavigateUriForType(DatePicker.SelectedDate.Value, _currentVisType));
 }
예제 #4
0
 public FeedbackBox(VisType type)
 {
     Title     = "Got feedback?";
     IsEnabled = Shared.Settings.IsFeedbackEnabled;
     Order     = 22; //todo: handle by user
     Size      = VisSize.Small;
     Type      = type;
 }
예제 #5
0
 public FeedbackBox(VisType type)
 {
     Title = "Got feedback?";
     IsEnabled = Settings.IsFeedbackEnabled;
     Order = 22; //todo: handle by user
     Size = VisSize.Small;
     Type = type;
 }
예제 #6
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VisProperties"/> class.
 /// </summary>
 /// <param name="visId">The <see cref="Guid"/> of the visualization.</param>
 /// <param name="visType">The type of the visualization, match a <see cref="VisType"/>.</param>
 /// <param name="anchorId">The id of the <see cref="ViewContainer"/> of the visualization.</param>
 /// <param name="objectids">A <see cref="List{int}"/> representing the <see cref="AnalysisObject"/> ids of the visualization.</param>
 /// <param name="conditions">A <see cref="List{int}"/> representing the study conditions of the visualization</param>
 /// <param name="sessions">A <see cref="List{int}"/> representing the study sessions of the visualization</param>
 public VisProperties(Guid visId, VisType visType, int anchorId, List <int> objectids, List <int> conditions, List <int> sessions)
 {
     VisId      = visId;
     VisType    = visType;
     AnchorId   = anchorId;
     ObjectIds  = objectids;
     Conditions = conditions;
     Sessions   = sessions;
 }
예제 #7
0
        private void OpenSettingsUI(VisType type)
        {
            var guidList = Services.VisManager().GetVisualizationsOfType(type);

            foreach (var guid in guidList)
            {
                Services.VisManager().OpenSettingsForVisualization(guid);
            }
        }
예제 #8
0
        public InfoBox(VisType type, string message, string title = "Information", bool showFeedbackButton = true)
        {
            Title     = title;
            IsEnabled = Shared.Settings.IsFeedbackEnabled;
            Order     = 22; //todo: handle by user
            Size      = VisSize.Small;
            Type      = type;

            _message            = message;
            _showFeedbackButton = showFeedbackButton;
        }
        public DayWeekProductivityProgramsTable(DateTimeOffset date, VisType type)
        {
            this._date = date;
            this._type = type;

            Title = "Top Programs Used during (Un-)Productive Times";
            IsEnabled = true; //todo: handle by user
            Order = (type == VisType.Day) ? 7 : 1; //todo: handle by user
            Size = VisSize.Square;
            Type = type;
        }
예제 #10
0
        public DayWeekProductivityProgramsTable(DateTimeOffset date, VisType type)
        {
            this._date = date;
            this._type = type;

            Title     = "Top Programs Used during (Un-)Productive Times";
            IsEnabled = true;                          //todo: handle by user
            Order     = (type == VisType.Day) ? 7 : 1; //todo: handle by user
            Size      = VisSize.Square;
            Type      = type;
        }
예제 #11
0
        private GameObject CreateObject(VisType type, Transform parent, Vector3 pos, Quaternion rot,
                                        Vector3 scale)
        {
            GameObject prefab;

            switch (type)
            {
            case VisType.Position:
                prefab = m_PositionPrefab;
                break;

            case VisType.Direction:
                prefab = m_DirectionPrefab;
                break;

            case VisType.Plane:
                prefab = m_PlanePrefab;
                break;

            case VisType.Text:
                prefab = m_TextPrefab;
                break;

            default:
                Debug.Assert(true, "Unsupported visualization!");
                return(null);
            }
            if (m_Reset)
            {
                ResetObjects();
            }
            GameObject visObject;

            if (m_UnusedVisObjects[type].Count == 0)
            {
                visObject = GameObject.Instantiate(prefab);
            }
            else
            {
                visObject = m_UnusedVisObjects[type].Pop();
                visObject.SetActive(true);
            }
            if (parent != null)
            {
                visObject.transform.parent = parent;
            }
            visObject.transform.localPosition = pos;
            visObject.transform.localRotation = rot;
            visObject.transform.localScale    = scale;
            visObject.transform.SetParent(null, true);
            m_VisObjects[type].Push(visObject);
            return(visObject);
        }
예제 #12
0
        /// <summary>
        /// Gets the week OR day visualizations from each tracker and prepares
        /// the HTML for showing on the website
        /// </summary>
        /// <param name="type"></param>
        /// <param name="date"></param>
        /// <returns></returns>
        internal async Task <string> GetVisualizationsHtml(VisType type, DateTimeOffset date)
        {
            // get updated visualizations (if enabled)
            var visualizations = new List <IVisualization>();

            foreach (var tracker in _trackers.Where(t => t.IsEnabled() == true && t.IsRunning))
            {
                switch (type)
                {
                case VisType.Day:
                    visualizations.AddRange(tracker.GetVisualizationsDay(date).Where(i => i.IsEnabled));
                    break;

                case VisType.Week:
                    visualizations.AddRange(tracker.GetVisualizationsWeek(date).Where(i => i.IsEnabled));
                    break;
                }
            }

            // case: no visualizations
            if (visualizations.Count == 0)
            {
                var infoBox = new InfoBox(type, "Please resume the trackers to enable the visualizations (hint: right-click the task-tray icon).");
                visualizations.Add(infoBox);
            }

            // add the feedback features (if enabled)
            var feedback = new FeedbackBox(type);

            if (feedback.IsEnabled)
            {
                visualizations.Add(feedback);
            }

            // add visualizations in right order
            var html = string.Empty;

            foreach (var vis in visualizations.OrderBy(v => v.Order))
            {
                //We want to avoid that a failing visualization stops the whole dashboard from working. Therefore we exclude failing visualizations and log the error.
                try
                {
                    html += await Task.Run(() => CreateDashboardItem(vis, date));
                }
                catch (Exception e)
                {
                    Logger.WriteToLogFile(e);
                }
            }

            return(html);
        }
예제 #13
0
    public void Init(int dataSetID, string[] attributes, VisType visType)
    {
        this.syncedHint      = "Sync works!";
        this.syncedDataSetID = dataSetID;

        for (int i = 0; i < attributes.Length; i++)
        {
            syncedAttributes.Add(attributes[i]);
            syncedAttributes.Dirty(i);
        }

        this.syncedVisType = (int)visType;
    }
예제 #14
0
    // ........................................................................ internal creation methods



    public void AddNetworkAnchor(GameObject etv, int dataSetID, string[] attributes, VisType visType)
    {
        if (onServer)
        {
            var networkAnchor = Instantiate(NetworkAnchorPrefab);
            if (networkAnchor.GetComponent <NetworkAnchor>() != null)
            {
                NetworkServer.Spawn(networkAnchor);
                networkAnchor.GetComponent <NetworkAnchor>().Init(dataSetID, attributes, visType);
                networkAnchor.GetComponent <NetworkAnchor>().ETV = etv;
            }
        }
    }
예제 #15
0
 /// <summary>
 /// Save thumbs up or down for selected visualization (type & date)
 /// </summary>
 /// <param name="type"></param>
 /// <param name="date"></param>
 /// <param name="visName"></param>
 /// <param name="up"></param>
 /// <param name="down"></param>
 public void SetFeedback(VisType type, DateTimeOffset date, string visName, int up, int down)
 {
     try
     {
         var query = "INSERT INTO " + Settings.FeedbackDbTable + " (time, visName, visType, visDate, likes, dislikes) VALUES (strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime'), " +
                     Database.GetInstance().Q(visName) + ", " + Database.GetInstance().Q(type.ToString()) + ", " + Database.GetInstance().QTime(date.Date) + ", " +
                     Database.GetInstance().Q(up) + ", " + Database.GetInstance().Q(down) + ");";
         Database.GetInstance().ExecuteDefaultQuery(query);
     }
     catch (Exception e)
     {
         Logger.WriteToLogFile(e);
     }
 }
예제 #16
0
 /// <summary>
 /// Save thumbs up or down for selected visualization (type & date)
 /// </summary>
 /// <param name="type"></param>
 /// <param name="date"></param>
 /// <param name="visName"></param>
 /// <param name="up"></param>
 /// <param name="down"></param>
 public void SetFeedback(VisType type, DateTimeOffset date, string visName, int up, int down)
 {
     try
     {
             var query = "INSERT INTO " + Settings.FeedbackDbTable + " (time, visName, visType, visDate, likes, dislikes) VALUES (strftime('%Y-%m-%d %H:%M:%f', 'now', 'localtime'), " +
             Database.GetInstance().Q(visName) + ", " + Database.GetInstance().Q(type.ToString()) + ", " + Database.GetInstance().QTime(date.Date) + ", " +
             Database.GetInstance().Q(up)  + ", " + Database.GetInstance().Q(down) + ");";
         Database.GetInstance().ExecuteDefaultQuery(query);
     }
     catch (Exception e)
     {
         Logger.WriteToLogFile(e);
     }
 }
예제 #17
0
        /// <summary>
        /// Gets a list of visualizations of a specified type that are attached to this <see cref="ViewContainer"/>.
        /// </summary>
        /// <param name="type">The type of visualization to get.</param>
        /// <returns>The list of visualizations of the specified type.</returns>
        public List <AbstractView> GetVisualizationsOfType(VisType type)
        {
            List <AbstractView> results = new List <AbstractView>();

            foreach (var vis in visualizations)
            {
                if (vis.Settings.VisType == type)
                {
                    results.Add(vis);
                }
            }

            return(results);
        }
예제 #18
0
        /// <summary>
        /// Returns a <see cref="List{Guid}"/> of all visualizations of a specified type.
        /// </summary>
        /// <param name="type">The <see cref="VisType"/> to search for.</param>
        /// <returns>A <see cref="List{Guid}"/> of visualizations with the provided <see cref="VisType"/>.</returns>
        public List <Guid> GetVisualizationsOfType(VisType type)
        {
            List <Guid> visList = new List <Guid>();

            foreach (var vis in Visualizations)
            {
                if (vis.Value.Settings.VisType == type)
                {
                    visList.Add(vis.Key);
                }
            }

            return(visList);
        }
예제 #19
0
        /// <summary>
        /// Creates a nice title depending on the setting
        /// </summary>
        /// <param name="visType"></param>
        /// <param name="date"></param>
        /// <returns></returns>
        private static string GetRetrospectionTitle(VisType visType, DateTimeOffset date)
        {
            switch (visType)
            {
            case VisType.Day:
                return("Your Retrospection for the " + date.Date.ToShortDateString());

            case VisType.Week:
                return(string.Format(CultureInfo.InvariantCulture, "Your Retrospection for Week {0} ({1} - {2})",
                                     DateTimeHelper.GetWeekOfYear_Iso8601(date.Date),
                                     DateTimeHelper.GetFirstDayOfWeek_Iso8801(date.Date).Date.ToShortDateString(),
                                     DateTimeHelper.GetLastDayOfWeek_Iso8801(date.Date).Date.ToShortDateString()));
            }

            return(VisHelper.Error("Retrospection not supported!"));
        }
        public string GetDateFilteringStringForQuery(VisType type, DateTimeOffset date, string datePropertyName = "time")
        {
            var filter = string.Empty;

            if (type == VisType.Day)
            {
                filter = "STRFTIME('%s', DATE(" + datePropertyName + ")) == STRFTIME('%s', DATE('" + date.Date.ToString("u") + "')) ";
            }
            else if (type == VisType.Week)
            {
                filter = "( "
                         + " STRFTIME('%s', DATE(" + datePropertyName + ")) between STRFTIME('%s', DATE('" + Helpers.DateTimeHelper.GetFirstDayOfWeek_Iso8801(date).Date.ToString("u")
                         + "')) and STRFTIME('%s', DATE('" + Helpers.DateTimeHelper.GetLastDayOfWeek_Iso8801(date).Date.ToString("u") + "')) "
                         + " ) ";
            }
            return(filter);
        }
예제 #21
0
        /// <summary>
        /// Disables and removes visualizations of a specified type from this view container.
        /// </summary>
        /// <param name="type">The type of visualization to remove from this view container.</param>
        public void DisableVis(VisType type)
        {
            var visList = GetVisualizationsOfType(type);

            foreach (var vis in visList)
            {
                visualizations.Remove(vis);
                Services.VisManager().DeleteVisualization(vis.VisId);
            }

            foreach (var visButton in visButtons)
            {
                if (visButton.VisType == type)
                {
                    visButton.SetActive(false);
                    return;
                }
            }
        }
예제 #22
0
        /// <summary>
        /// get a list of all programs, the user was active for at least 10 minutes.
        /// Only get maxNumberOfPrograms.
        /// </summary>
        /// <param name="date"></param>
        /// <param name="maxNumberOfPrograms"></param>
        /// <returns></returns>
        private static List <string> GetTopProgramsUsed(DateTimeOffset date, VisType type, int maxNumberOfPrograms)
        {
            var list = new List <string>();

            try
            {
                var query = "SELECT process "
                            + "FROM ( "
                            + "SELECT process, sum(difference) / 60.0  as 'durInMins' "
                            + "FROM (	"
                            + "SELECT t1.process, (strftime('%s', t2.time) - strftime('%s', t1.time)) as 'difference' "
                            + "FROM " + Shared.Settings.WindowsActivityTable + " t1 LEFT JOIN " + Shared.Settings.WindowsActivityTable + " t2 on t1.id + 1 = t2.id "
                            + "WHERE " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t1.time") + " and " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t2.time") + " "
                            + "GROUP BY t1.id, t1.time "
                            + ") "
                            + "WHERE difference > 0 and process <> '" + Dict.Idle + "' "
                            + "GROUP BY process "
                            + "ORDER BY durInMins DESC "
                            + ") "
                            + "WHERE durInMins > 2 " // hint; assumption!
                            + "LIMIT " + maxNumberOfPrograms + ";";

                var table = Database.GetInstance().ExecuteReadQuery(query);

                foreach (DataRow row in table.Rows)
                {
                    var process = (string)row["process"];
                    list.Add(process);
                }
                table.Dispose();
            }
            catch (Exception e)
            {
                Logger.WriteToLogFile(e);
            }

            return(list);
        }
 private void SwitchToWeek_Clicked(object sender, RoutedEventArgs e)
 {
     _currentVisType = VisType.Week;
     SwitchToWeekButton.Visibility = Visibility.Collapsed;
     SwitchToDayButton.Visibility = Visibility.Visible;
     TodayButton.Content = "This Week";
     WebBrowserNavigateTo(Handler.GetInstance().GetDashboardNavigateUriForType(DatePicker.SelectedDate.Value, _currentVisType));
 }
        public string GetDateFilteringStringForQuery(VisType type, DateTimeOffset date, string datePropertyName = "time")
        {
            var filter = string.Empty;

            if (type == VisType.Day)
            {
                filter = "STRFTIME('%s', DATE(" + datePropertyName + ")) == STRFTIME('%s', DATE('" + date.Date.ToString("u") + "')) ";
            }
            else if (type == VisType.Week)
            {
                filter = "( "
                    + " STRFTIME('%s', DATE(" + datePropertyName + ")) between STRFTIME('%s', DATE('" + Helpers.DateTimeHelper.GetFirstDayOfWeek_Iso8801(date).Date.ToString("u")
                    + "')) and STRFTIME('%s', DATE('" + Helpers.DateTimeHelper.GetLastDayOfWeek_Iso8801(date).Date.ToString("u") + "')) "
                    + " ) ";
            }
            return filter;
        }
예제 #25
0
 /// <summary>
 /// Initializes a new instance of the <see cref="VisProperties"/> class.
 /// </summary>
 /// <param name="visId">The <see cref="Guid"/> of the visualization.</param>
 /// <param name="visType">The type of the visualization, match a <see cref="VisType"/>.</param>
 /// <param name="anchorId">The id of the <see cref="ViewContainer"/> of the visualization.</param>
 public VisProperties(Guid visId, VisType visType, int anchorId)
 {
     VisId    = visId;
     VisType  = visType;
     AnchorId = anchorId;
 }
예제 #26
0
    /// <summary>
    /// Enters the given ETV into a list of observed ETVs. All ETVs entered here,
    /// will be persisted, when the app is closed.
    /// </summary>
    /// <param name="etv">ETV to persist later</param>
    /// <param name="dataSetID">data set ID of it</param>
    /// <param name="variables">variables which it visualizes</param>
    /// <param name="visType">visualization type used</param>
    override public void PersistETV(GameObject etv, int dataSetID, string[] variables, VisType visType)
    {
        var persistableETV = new SerializedETV();

        persistableETV.dataSetID = dataSetID;
        persistableETV.variables = variables;
        persistableETV.visType   = visType;

        ETVs.Add(etv, persistableETV);
    }
예제 #27
0
    // ........................................................................ Visualization generation

    /// <summary>
    /// Generates visualizations from one attribute.
    /// </summary>
    /// <param name="dataSetID">data set to use</param>
    /// <param name="variable">attribute to visualize</param>
    /// <param name="visType">visualization type to generate</param>
    /// <returns></returns>
    public GameObject GenerateVisFrom(int dataSetID, string variable, VisType visType, bool persist = true)
    {
        return(GenerateVisFrom(dataSetID, new string[] { variable }, visType, persist));
    }
예제 #28
0
        /// <summary>
        /// For a given process and date, list all times a user was active
        /// </summary>
        /// <param name="date"></param>
        /// <param name="process"></param>
        /// <returns></returns>
        private static List<TopProgramTimeDto> GetTimesForProgram(DateTimeOffset date, VisType type, string process)
        {
            var list = new List<TopProgramTimeDto>();

            try
            {
                var dayFilter = (type == VisType.Day) ? "" : "(STRFTIME('%s', DATE(t1.time)) = STRFTIME('%s', DATE(t2.time))) and "; // needed for week view
                var query = "SELECT (strftime('%s', t2.time) - strftime('%s', t1.time)) as 'difference', t1.time as 'from', t2.time as 'to' "
                            + "FROM " + Shared.Settings.WindowsActivityTable + " t1 LEFT JOIN " + Shared.Settings.WindowsActivityTable + " t2 on t1.id + 1 = t2.id "
                            + "WHERE " + dayFilter
                            + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t1.time") + " and " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t2.time") + " "
                            + "AND lower(t1.process) ='" + process.ToLower(CultureInfo.InvariantCulture) + "' "
                            + "GROUP BY t1.id, t1.time; ";

                var table = Database.GetInstance().ExecuteReadQuery(query);

                foreach (DataRow row in table.Rows)
                {
                    var diff = Convert.ToInt32(row["difference"], CultureInfo.InvariantCulture);
                    var durInMins = (int)Math.Round(diff / 60.0, 0);
                    var to = DateTime.Parse((string)row["to"], CultureInfo.InvariantCulture);
                    var from = DateTime.Parse((string)row["from"], CultureInfo.InvariantCulture);

                    if (durInMins == 0) continue;
                    list.Add(new TopProgramTimeDto(from, to, durInMins));
                }
                table.Dispose();
            }
            catch (Exception e)
            {
                Logger.WriteToLogFile(e);
            }

            return list;
        }
예제 #29
0
        /// <summary>
        /// get a list of all programs, the user was active for at least 10 minutes.
        /// Only get maxNumberOfPrograms.
        /// </summary>
        /// <param name="date"></param>
        /// <param name="maxNumberOfPrograms"></param>
        /// <returns></returns>
        private static List<string> GetTopProgramsUsed(DateTimeOffset date, VisType type, int maxNumberOfPrograms)
        {
            var list = new List<string>();

            try
            {
                var query = "SELECT process "
                            + "FROM ( "
                            + "SELECT process, sum(difference) / 60.0  as 'durInMins' "
                            + "FROM (	"
                            + "SELECT t1.process, (strftime('%s', t2.time) - strftime('%s', t1.time)) as 'difference' "
                            + "FROM " + Shared.Settings.WindowsActivityTable + " t1 LEFT JOIN " + Shared.Settings.WindowsActivityTable + " t2 on t1.id + 1 = t2.id "
                            + "WHERE " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t1.time") + " and " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t2.time") + " "
                            + "GROUP BY t1.id, t1.time "
                            + ") "
                            + "WHERE difference > 0 and process <> '" + Dict.Idle + "' "
                            + "GROUP BY process "
                            + "ORDER BY durInMins DESC "
                            + ") "
                            + "WHERE durInMins > 2 " // hint; assumption!
                            + "LIMIT " + maxNumberOfPrograms + ";";

                var table = Database.GetInstance().ExecuteReadQuery(query);

                foreach (DataRow row in table.Rows)
                {
                    var process = (string)row["process"];
                    list.Add(process);
                }
                table.Dispose();
            }
            catch (Exception e)
            {
                Logger.WriteToLogFile(e);
            }

            return list;
        }
예제 #30
0
        /// <summary>
        /// Get a list of the times a user spent in the top (maxNumberOfPrograms) often used programs.
        /// </summary>
        /// <param name="date"></param>
        /// <param name="maxNumberOfPrograms"></param>
        /// <returns></returns>
        internal static Dictionary<string, List<TopProgramTimeDto>> GetTopProgramsUsedWithTimes(DateTimeOffset date, VisType type, int maxNumberOfPrograms)
        {
            var dto = new Dictionary<string, List<TopProgramTimeDto>>();

            try
            {
                var topProgramsUsed = GetTopProgramsUsed(date, type, maxNumberOfPrograms);

                foreach (var process in topProgramsUsed)
                {
                    var times = GetTimesForProgram(date, type, process);
                    dto.Add(process, times);
                }
            }
            catch (Exception e)
            {
                Logger.WriteToLogFile(e);
            }

            return dto;
        }
예제 #31
0
        /// <summary>
        /// Returns a dictionary with the productivity on a timeline
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        internal static List<Tuple<DateTime, int>> GetUserProductivityTimelineData(DateTimeOffset date, VisType type, bool withNonWork = false)
        {
            var prodList = new List<Tuple<DateTime, int>>();

            try
            {
                var filterNonWork = (withNonWork) ? "" :" AND userProductivity <> -1 ";

                var query = "SELECT userProductivity, surveyEndTime FROM " + Settings.DbTableIntervalPopup + " " + // end time is the time the participant answered
                                      "WHERE " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "surveyNotifyTime") + " " + // only show perceived productivity values for the day
                                      filterNonWork +
                                      " ORDER BY surveyEndTime;";
                var table = Database.GetInstance().ExecuteReadQuery(query);

                foreach (DataRow row in table.Rows)
                {
                    var time = DateTime.Parse((string)row["surveyEndTime"], CultureInfo.InvariantCulture);
                    var prod = Convert.ToInt32(row["userProductivity"], CultureInfo.InvariantCulture);

                    // first element
                    if (prodList.Count == 0)
                    {
                        var workDayStartTime = Database.GetInstance().GetUserWorkStart(date);
                        prodList.Add(new Tuple<DateTime, int>(workDayStartTime, prod));
                    }

                    // only show if it's from today
                    if (time.Date == date.Date)
                    {
                        prodList.Add(new Tuple<DateTime, int>(time, prod));
                    }
                }
                table.Dispose();
            }
            catch (Exception e)
            {
                Logger.WriteToLogFile(e);
            }

            return prodList;
        }
        /// <summary>
        /// Creates a nice title depending on the setting
        /// </summary>
        /// <param name="visType"></param>
        /// <param name="date"></param>
        /// <returns></returns>
        private string GetRetrospectionTitle(VisType visType, DateTimeOffset date)
        {
            switch (visType)
            {
                case VisType.Day:
                    return "Your retrospection for the " + date.Date.ToShortDateString();
                case VisType.Week:
                    return string.Format(CultureInfo.InvariantCulture, "Your retrospection for Week {0} ({1} - {2})",
                        DateTimeHelper.GetWeekOfYear_Iso8601(date.Date),
                        DateTimeHelper.GetFirstDayOfWeek_Iso8801(date.Date).Date.ToShortDateString(),
                        DateTimeHelper.GetLastDayOfWeek_Iso8801(date.Date).Date.ToShortDateString());
            }

            return VisHelper.Error("Retrospection not supported!");
        }
 public abstract void PersistETV(GameObject etv, int dataSetID, string[] variables, VisType visType);
예제 #34
0
 public VisTypeViewModel(VisType t)
 {
     Id   = t.VisTypeId;
     Name = t.VisTypeName;
 }
예제 #35
0
 private VisProperties(Guid visId, VisType visType, int anchorId, List <int> objectids, List <int> conditions, List <int> sessions, Dictionary <string, object> properties) : this(visId, visType, anchorId, objectids, conditions, sessions)
 {
     Properties = properties;
 }
예제 #36
0
 internal string GetDashboardNavigateUriForType(DateTime date, VisType type)
 {
     var uri = string.Format(CultureInfo.InvariantCulture, "stats?type={0}&date={1}", type, date.ToString("yyyy-MM-dd"));
     return CreateNavigateUri(uri);
 }
예제 #37
0
        internal string GetDashboardNavigateUriForType(DateTime date, VisType type)
        {
            var uri = string.Format(CultureInfo.InvariantCulture, "stats?type={0}&date={1}", type, date.ToString("yyyy-MM-dd"));

            return(CreateNavigateUri(uri));
        }
예제 #38
0
        /// <summary>
        /// Get a list of the times a user spent in the top (maxNumberOfPrograms) often used programs.
        /// </summary>
        /// <param name="date"></param>
        /// <param name="maxNumberOfPrograms"></param>
        /// <returns></returns>
        internal static Dictionary <string, List <TopProgramTimeDto> > GetTopProgramsUsedWithTimes(DateTimeOffset date, VisType type, int maxNumberOfPrograms)
        {
            var dto = new Dictionary <string, List <TopProgramTimeDto> >();

            try
            {
                var topProgramsUsed = GetTopProgramsUsed(date, type, maxNumberOfPrograms);

                foreach (var process in topProgramsUsed)
                {
                    var times = GetTimesForProgram(date, type, process);
                    dto.Add(process, times);
                }
            }
            catch (Exception e)
            {
                Logger.WriteToLogFile(e);
            }

            return(dto);
        }
예제 #39
0
        /// <summary>
        /// For a given process and date, list all times a user was active
        /// </summary>
        /// <param name="date"></param>
        /// <param name="process"></param>
        /// <returns></returns>
        private static List <TopProgramTimeDto> GetTimesForProgram(DateTimeOffset date, VisType type, string process)
        {
            var list = new List <TopProgramTimeDto>();

            try
            {
                var dayFilter = (type == VisType.Day) ? "" : "(STRFTIME('%s', DATE(t1.time)) = STRFTIME('%s', DATE(t2.time))) and "; // needed for week view
                var query     = "SELECT (strftime('%s', t2.time) - strftime('%s', t1.time)) as 'difference', t1.time as 'from', t2.time as 'to' "
                                + "FROM " + Shared.Settings.WindowsActivityTable + " t1 LEFT JOIN " + Shared.Settings.WindowsActivityTable + " t2 on t1.id + 1 = t2.id "
                                + "WHERE " + dayFilter
                                + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t1.time") + " and " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "t2.time") + " "
                                + "AND lower(t1.process) ='" + process.ToLower(CultureInfo.InvariantCulture) + "' "
                                + "GROUP BY t1.id, t1.time; ";

                var table = Database.GetInstance().ExecuteReadQuery(query);

                foreach (DataRow row in table.Rows)
                {
                    var diff      = Convert.ToInt32(row["difference"], CultureInfo.InvariantCulture);
                    var durInMins = (int)Math.Round(diff / 60.0, 0);
                    var to        = DateTime.Parse((string)row["to"], CultureInfo.InvariantCulture);
                    var from      = DateTime.Parse((string)row["from"], CultureInfo.InvariantCulture);

                    if (durInMins == 0)
                    {
                        continue;
                    }
                    list.Add(new TopProgramTimeDto(from, to, durInMins));
                }
                table.Dispose();
            }
            catch (Exception e)
            {
                Logger.WriteToLogFile(e);
            }

            return(list);
        }
예제 #40
0
 public override void PersistETV(GameObject etv, int dataSetID, string[] variables, VisType visType)
 {
     Debug.Log(TAG + ": Dummy. Doing nothing.");
 }
예제 #41
0
        /// <summary>
        /// Returns a dictionary with the productivity on a timeline
        /// </summary>
        /// <param name="date"></param>
        /// <returns></returns>
        internal static List <Tuple <DateTime, int> > GetUserProductivityTimelineData(DateTimeOffset date, VisType type, bool withNonWork = false)
        {
            var prodList = new List <Tuple <DateTime, int> >();

            try
            {
                var filterNonWork = (withNonWork) ? "" :" AND userProductivity <> -1 ";

                var query = "SELECT userProductivity, surveyEndTime FROM " + Settings.DbTableIntervalPopup + " " +                   // end time is the time the participant answered
                            "WHERE " + Database.GetInstance().GetDateFilteringStringForQuery(type, date, "surveyNotifyTime") + " " + // only show perceived productivity values for the day
                            filterNonWork +
                            " ORDER BY surveyEndTime;";
                var table = Database.GetInstance().ExecuteReadQuery(query);

                foreach (DataRow row in table.Rows)
                {
                    var time = DateTime.Parse((string)row["surveyEndTime"], CultureInfo.InvariantCulture);
                    var prod = Convert.ToInt32(row["userProductivity"], CultureInfo.InvariantCulture);

                    // first element
                    if (prodList.Count == 0)
                    {
                        var workDayStartTime = Database.GetInstance().GetUserWorkStart(date);
                        prodList.Add(new Tuple <DateTime, int>(workDayStartTime, prod));
                    }

                    // only show if it's from today
                    if (time.Date == date.Date)
                    {
                        prodList.Add(new Tuple <DateTime, int>(time, prod));
                    }
                }
                table.Dispose();
            }
            catch (Exception e)
            {
                Logger.WriteToLogFile(e);
            }

            return(prodList);
        }
        /// <summary>
        /// Gets the week OR day visualizations from each tracker and prepares
        /// the HTML for showing on the website
        /// </summary>
        /// <param name="type"></param>
        /// <param name="date"></param>
        /// <returns></returns>
        internal async Task<string> GetVisualizationsHtml(VisType type, DateTimeOffset date)
        {
            // get updated visualizations (if enabled)
            var visualizations = new List<IVisualization>();
            foreach (var tracker in _trackers.Where(t => t.IsEnabled() == true))
            {
                switch (type)
                {
                    case VisType.Day:
                        visualizations.AddRange(tracker.GetVisualizationsDay(date).Where(i => i.IsEnabled));
                        break;
                    case VisType.Week:
                        visualizations.AddRange(tracker.GetVisualizationsWeek(date).Where(i => i.IsEnabled));
                        break;
                }
            }

            // add the feedback features (if enabled)
            var feedback = new FeedbackBox(type);
            if (feedback.IsEnabled == true) visualizations.Add(feedback);

            // add visualizations in right order
            var html = string.Empty;
            foreach (var vis in visualizations.OrderBy(v => v.Order))
            {
                html += await Task.Run(() => CreateDashboardItem(vis, date));
            }

            return html;
        }