/*

Greeter widget for kdm

Copyright (C) 1997, 1998 Steffen Hansen <hansen@kde.org>
Copyright (C) 2000-2004 Oswald Buddenhagen <ossi@kde.org>


This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

*/


#ifndef KGREETER_H
#define KGREETER_H

#include "kgverify.h"
#include "kgdialog.h"

class UserListView;
class KdmClock;
class KdmItem;

class QSettings/*KConfigGroup*/;
class QListWidgetItem;
class QActionGroup;

struct SessType {
    QString name, type, iconName;
    QAction *action;
    bool hid;
    int prio;

    SessType() {}
    SessType(const QString &n, const QString &t, bool h, int p, const QString& ico) :
        name(n), type(t), iconName(ico), action(nullptr), hid(h), prio(p)  {}
    bool operator<(const SessType &st) const {
        return hid != st.hid ? hid < st.hid :
               prio != st.prio ? prio < st.prio :
               name < st.name;
    }
};

class KGreeter : public KGDialog, public KGVerifyHandler {
    Q_OBJECT
    typedef KGDialog inherited;

  public:
    KGreeter(bool themed = false);
    virtual ~KGreeter();

  public Q_SLOTS:
    void accept() override;
    void reject() override;
    void slotUserClicked(QListWidgetItem *);
    void slotSessionSelected();
    void slotUserEntered();

  protected:
    void insertUser(const QImage &, const QString &, struct passwd *);
    void insertUsers();
    void putSession(const QString &, const QString &, bool, const char *, const QString &);
    void insertSessions();
    virtual void pluginSetup();
    void setPrevWM(QAction *);

    QString curUser, dName;
	/*KConfigGroup*/QSettings *stsGroup;
    UserListView *userView;
    QStringList *userList;
    QMenu *sessMenu;
    QActionGroup *sessGroup;
    QVector<SessType> sessionTypes;
    int nNormals, nSpecials;
    QAction *curPrev;
    bool prevValid;
    bool needLoad;

    static int curPlugin;
    static PluginList pluginList;

  private Q_SLOTS:
    void slotLoadPrevWM();

  public: // from KGVerifyHandler
    void verifyPluginChanged(int id) override;
    void verifyClear() override;
    void verifyOk() override;
    void verifyFailed() override;
    void verifyRetry() override;
    void verifySetUser(const QString &user) override;
};

class KStdGreeter : public KGreeter {
    Q_OBJECT
    typedef KGreeter inherited;

  public:
    KStdGreeter();

  protected:
    void pluginSetup() override;

  private:
    KdmClock *clock;
    QLabel *pixLabel;
    QPushButton *goButton;

  public: // from KGVerifyHandler
    void verifyFailed() override;
    void verifyRetry() override;
};

class KThemedGreeter : public KGreeter {
    Q_OBJECT
    typedef KGreeter inherited;

  public:
    KThemedGreeter(KdmThemer *_themer);
    virtual ~KThemedGreeter();

  public Q_SLOTS:
    void slotThemeActivated(const QString &id);
    void slotSessMenu();
    void slotActionMenu();
    void slotDebugToggled();
#ifdef HAVE_XKB  /*alex*/
    void slotSwitchXkb();
#endif

  protected:
    void updateStatus(bool fail, bool caps, int timedleft) override;
    void pluginSetup() override;
    void keyPressEvent(QKeyEvent *) override;
    bool event(QEvent *e) override;
#ifdef HAVE_XKB
    void updateXkbStatus(); //alex
#endif

  private:
//    KdmClock *clock;
    KdmThemer *themer;
    KdmItem *caps_warning, *xauth_warning, *pam_error, *timed_label,
            *userlist_node, *userlist_rect,
            *session_button, *system_button;
	KdmItem  *xkb_layout_item, *xkb_layout_rect, *vkb_rect, *zamok_warning;  //alex

//  public: // from KGVerifyHandler
//    virtual void verifyFailed();
//    virtual void verifyRetry();
};

#endif /* KGREETER_H */
