Overview
Examples
Screenshots
Comparisons
Applications
Download
Documentation
Tutorials
UppHub
Status & Roadmap
FAQ
Authors & License
Forums
Funding U++
Search on this site











SourceForge.net Logo

SourceForge.net Logo

GitHub Logo

Discord Logo

EyeCare

 

Tray application that reminds user to take care about his eyes

 

 

 

EyeCare.h

 

#ifndef _EyeCare_EyeCare_h_

#define _EyeCare_EyeCare_h_

 

#include <CtrlLib/CtrlLib.h>

 

using namespace Upp;

 

#define LAYOUTFILE <EyeCare/EyeCare.lay>

#include <CtrlCore/lay.h>

 

class EyeCare : public WithEyeCareLayout<TopWindow> {

    enum { LAUNCH, RELAX, WASH };

    int          state;

    int          ignore;

    TimeCallback relax, wash, dismiss;

    TrayIcon     trayicon;

    WithConfigurationLayout<TopWindow> config;

 

 

    void Perform(int newstate);

    void Relax();

    void Wash();

    void Configure();

    void Dismiss();

 

    void MainMenu(Bar& menu);

    void SettingsMenu(Bar& bar);

    void HelpMenu(Bar& bar);

    void TrayMenu(Bar& bar);

 

    void Ignore();

    void Launch();

    void Restart();

    void Sync();

    void About();

    void StartLaunch();

    void Exit();

 

public:

    void Serialize(Stream& s);

    void Do();

 

    typedef EyeCare CLASSNAME;

 

    EyeCare();

};

 

#endif

 

 

 

EyeCare.cpp

 

#include "EyeCare.h"

 

#define IMAGECLASS EyeCareImg

#define  IMAGEFILE <EyeCare/EyeCare.iml>

#include <Draw/iml.h>

 

#define TOPICFILE <EyeCare/app.tpp/all.i>

#include <Core/topic_group.h>

 

#ifdef _DEBUG

#define MINUTE_M 1000 // to reduce waiting when debugging....

#else

#define MINUTE_M 60 * 1000

#endif

 

void EyeCare::About()

{

    dismiss.Kill();

    ignore++;

    WithAboutDialogLayout<TopWindow> dlg;

    dlg.text = GetTopic("topic://EyeCare/app/about$en-us").text;

    CtrlLayoutOK(dlg, "About");

    dlg.CenterScreen();

    dlg.Run();

    ignore--;

    Restart();

}

 

void EyeCare::Restart()

{

    relax.KillSet(-(int)~config.relax * MINUTE_M, THISBACK(Relax));

    wash.KillSet(-(int)~config.wash * MINUTE_M, THISBACK(Wash));

}

 

void EyeCare::Perform(int newstate)

{

    if(newstate < state)

        return;

    state = newstate;

    String txt1[] = {

        t_("Welcome to Eye Care!"),

        t_("Eye relaxing time..."),

        t_("Eye washing time...")

    };

    String txt2[] = {

       t_("This program will remind you at regular intervals\nto take care of your eyes and relax/wash them."),

       t_("Now move your eyes away, from the monitor\nand view some distant object for 15 seconds."),

       t_("Now move to the wash room, and gently wash \nyour eyes with water to prevent dryness.")

    };

    dismiss.KillSet(15000, THISBACK(Dismiss));

    text1 = txt1[state];

    text2 = txt2[state];

    if(!IsOpen())

        OpenMain();

    Show();

    SetForeground();

}

 

void EyeCare::Launch()

{

    Perform(LAUNCH);

}

 

void EyeCare::Dismiss()

{

    state = -1;

    Hide();

}

 

void EyeCare::Relax()

{

    if(ignore) return;

    Perform(RELAX);

}

 

void EyeCare::Wash()

{

    if(ignore) return;

    Perform(WASH);

}

 

void EyeCare::Sync()

{

    TopMost(config.topmost);

    trayicon.Icon(ignore ? EyeCareImg::off() : EyeCareImg::icon());

    if(config.hideicon)

        ignore = false;

    trayicon.Show(!config.hideicon);

    Restart();

}

 

void EyeCare::Configure()

{

    dismiss.Kill();

    relax.Kill();

    wash.Kill();

    config.Execute();

    Sync();

}

 

void EyeCare::Ignore()

{

    ignore = !ignore;

    Sync();

}

 

void EyeCare::SettingsMenu(Bar& bar)

{

    bar.Add(t_("Configuration"), THISBACK(Configure))

       .Help(t_("Change settings"));

    bar.Add(t_("Exit"), THISBACK(Exit))

       .Help(t_("Exit the application"));

}

 

void EyeCare::HelpMenu(Bar& bar)

{

    bar.Add(t_("About"), THISBACK(About))

       .Help(t_("About EyeCare"));

}

 

void EyeCare::MainMenu(Bar& bar)

{

    bar.Add(t_("Settings"), THISBACK(SettingsMenu));

    bar.Add(t_("Help"), THISBACK(HelpMenu));

}

 

void EyeCare::TrayMenu(Bar& bar)

{

    bar.Add(t_("Show EyeCare"), THISBACK(Launch));

    bar.Add(t_("Ignore eyes"), THISBACK(Ignore))

       .Check(ignore);

    bar.Add(t_("About.."), THISBACK(About));

    bar.Add(t_("Exit"), THISBACK(Exit));

}

 

void EyeCare::Serialize(Stream& s)

{

    int version = 1;

    s / version;

    s % config.relax % config.wash % config.hideicon % config.topmost;

    s % ignore;

    SerializePlacement(s);

}

 

const char regpath[] = "Software\\Microsoft\\Windows\\CurrentVersion\\Run";

const char regname[] = "EyeCareUpp";

 

void EyeCare::Exit()

{

    Break();

    trayicon.Break();

#ifdef PLATFORM_WIN32

    HKEY hkey;

    if(RegOpenKeyEx(HKEY_CURRENT_USER, regpath, 0, KEY_ALL_ACCESS, &hkey) == ERROR_SUCCESS) {

        RegDeleteValue(hkey, regname);

        RegCloseKey(hkey);

    }

#endif

}

 

void EyeCare::Do()

{

    LoadFromFile(*this);

    Sync();

    Launch();

    Restart();

#ifdef PLATFORM_WIN32

    HKEY key;

    if(RegCreateKey(HKEY_CURRENT_USER, regpath, &key) == ERROR_SUCCESS) {

        RegSetValueEx(key, regname, 0, REG_SZ, GetExeFilePath(), GetExeFilePath().GetLength() + 1);

        RegCloseKey(key);

    }

#endif

    trayicon.Run();

    StoreToFile(*this);

}

 

EyeCare::EyeCare()

{

    CtrlLayoutOKCancel(config, t_("Configuration"));

    CtrlLayout(*this, t_("EyeCare"));

    menu.Set(THISBACK(MainMenu));

    image.SetImage(EyeCareImg::eye());

    CenterScreen();

    hide <<= THISBACK(Hide);

    config.relax <<= 5;

    config.wash <<= 55;

    Icon(EyeCareImg::icon());

    state = -1;

 

    trayicon.WhenBar = THISBACK(TrayMenu);

    trayicon.WhenLeftDouble = THISBACK(Launch);

    trayicon.Icon(EyeCareImg::icon());

    trayicon.Tip(t_("EyeCare"));

}

 

GUI_APP_MAIN

{

#ifdef PLATFORM_WIN32

    static const char unique_name[] = "EyeCare_$_$_U++";

    if(::FindWindow(NULL, unique_name)) {

        Exclamation(t_("EyeCare is already running."));

        return;

    }

    TopWindow singlechk;

    singlechk.SetRect(-1, -1, 1, 1);

    singlechk.Hide();

    singlechk.Title(unique_name);

    singlechk.Open();

#endif

 

    EyeCare().Do();

}

 

 

 

EyeCare.lay

 

LAYOUT(EyeCareLayout, 270, 216)

    ITEM(MenuBar, menu, LeftPosZ(0, 256).TopPosZ(0, 24))

    ITEM(ImageCtrl, image, LeftPosZ(10, 253).TopPosZ(32, 40))

    ITEM(LabelBox, dv___2, LeftPosZ(8, 257).TopPosZ(24, 162))

    ITEM(Label, text1, SetLabel(t_("text1")).SetFont(SerifZ(16).Bold()).LeftPosZ(16, 241).TopPosZ(75, 25))

    ITEM(Label, text2, LeftPosZ(16, 241).TopPosZ(105, 35))

    ITEM(Button, hide, SetLabel(t_("HIDE")).SetFont(SansSerifZ(25).Bold()).LeftPosZ(15, 242).TopPosZ(143, 35))

    ITEM(StatusBar, status, LeftPosZ(0, 256).TopPosZ(192, 24))

END_LAYOUT

 

LAYOUT(ConfigurationLayout, 216, 144)

    ITEM(LabelBox, dv___0, SetLabel(t_("EyeCare")).LeftPosZ(8, 200).TopPosZ(4, 132))

    ITEM(Label, dv___1, SetLabel(t_("Relaxing time (minutes):")).LeftPosZ(16, 121).TopPosZ(24, 19))

    ITEM(EditInt, relax, LeftPosZ(148, 48).TopPosZ(24, 19))

    ITEM(Label, dv___3, SetLabel(t_("Washing time (Minutes):")).LeftPosZ(16, 125).TopPosZ(48, 19))

    ITEM(EditInt, wash, LeftPosZ(148, 48).TopPosZ(48, 19))

    ITEM(Option, topmost, SetLabel(t_("Stay on top")).LeftPosZ(16, 84).TopPosZ(76, 19))

    ITEM(Option, hideicon, SetLabel(t_("Hide try icon")).RightPosZ(16, 84).TopPosZ(76, 19))

    ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(28, 72).TopPosZ(104, 24))

    ITEM(Button, cancel, SetLabel(t_("Cancel")).LeftPosZ(112, 72).TopPosZ(104, 24))

END_LAYOUT

 

LAYOUT(AboutDialogLayout, 304, 196)

    ITEM(LabelBox, dv___0, SetLabel(t_("EyeCare")).LeftPosZ(4, 296).TopPosZ(0, 160))

    ITEM(RichTextCtrl, text, LeftPosZ(12, 280).TopPosZ(20, 132))

    ITEM(Button, ok, SetLabel(t_("OK")).LeftPosZ(228, 72).TopPosZ(168, 24))

END_LAYOUT

 

 

 

 

 

Do you want to contribute?