2012-08-20 14:59:41 +00:00
|
|
|
/*
|
|
|
|
* RetroShare External Interface.
|
|
|
|
*
|
|
|
|
* Copyright 2012-2012 by Robert Fernie.
|
|
|
|
*
|
|
|
|
* This library is free software; you can redistribute it and/or
|
|
|
|
* modify it under the terms of the GNU Library General Public
|
|
|
|
* License Version 2.1 as published by the Free Software Foundation.
|
|
|
|
*
|
|
|
|
* This library 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
|
|
|
|
* Library General Public License for more details.
|
|
|
|
*
|
|
|
|
* You should have received a copy of the GNU Library General Public
|
|
|
|
* License along with this library; if not, write to the Free Software
|
|
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307
|
|
|
|
* USA.
|
|
|
|
*
|
|
|
|
* Please report all bugs and problems to "retroshare@lunamutt.com".
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
|
2012-08-07 23:55:43 +00:00
|
|
|
#ifndef RSNOGUI_MENU_H
|
|
|
|
#define RSNOGUI_MENU_H
|
|
|
|
|
|
|
|
#include <inttypes.h>
|
|
|
|
|
|
|
|
#include <string>
|
|
|
|
#include <map>
|
|
|
|
#include <list>
|
|
|
|
|
2012-08-20 14:59:41 +00:00
|
|
|
#include "rpcsystem.h" // generic processing command.
|
2012-08-09 13:45:05 +00:00
|
|
|
|
|
|
|
#define MENU_PROCESS_MASK 0x0fff
|
|
|
|
|
|
|
|
#define MENU_PROCESS_NONE 0x0000
|
|
|
|
#define MENU_PROCESS_TOP 0x0001
|
|
|
|
#define MENU_PROCESS_MENU 0x0002
|
|
|
|
#define MENU_PROCESS_DONE 0x0004
|
|
|
|
#define MENU_PROCESS_QUIT 0x0008
|
|
|
|
#define MENU_PROCESS_SHUTDOWN 0x0010
|
|
|
|
#define MENU_PROCESS_HELP 0x0020
|
|
|
|
#define MENU_PROCESS_ERROR 0x0040
|
|
|
|
|
|
|
|
#define MENU_PROCESS_NEEDDATA 0x1000 // Able to be OR'd with ANOTHER CASE.
|
2012-08-07 23:55:43 +00:00
|
|
|
|
|
|
|
#define MENU_KEY_QUIT 'Q'
|
2012-08-09 13:45:05 +00:00
|
|
|
#define MENU_KEY_HELP 'h'
|
|
|
|
#define MENU_KEY_TOP 't'
|
|
|
|
#define MENU_KEY_REPEAT 'r'
|
|
|
|
#define MENU_KEY_UP 'u'
|
2012-08-07 23:55:43 +00:00
|
|
|
|
2012-08-09 13:45:05 +00:00
|
|
|
#define MENULIST_KEY_LIST 'l' // Don't need this.
|
|
|
|
#define MENULIST_KEY_NEXT 'n'
|
|
|
|
#define MENULIST_KEY_PREV 'p'
|
2012-08-07 23:55:43 +00:00
|
|
|
|
|
|
|
#define MENU_OP_ERROR 0
|
|
|
|
#define MENU_OP_INSTANT 1
|
|
|
|
#define MENU_OP_SUBMENU 2
|
|
|
|
#define MENU_OP_NEEDDATA 3
|
|
|
|
|
|
|
|
#define MENU_ENTRY_NONE 0
|
|
|
|
#define MENU_ENTRY_OKAY 1
|
|
|
|
|
2012-08-09 13:45:05 +00:00
|
|
|
#define MENU_DRAW_FLAGS_STD 0
|
|
|
|
#define MENU_DRAW_FLAGS_HTML 1
|
|
|
|
#define MENU_DRAW_FLAGS_ECHO 2
|
|
|
|
#define MENU_DRAW_FLAGS_NOQUIT 4
|
|
|
|
|
2012-08-07 23:55:43 +00:00
|
|
|
class Menu;
|
|
|
|
class Screen;
|
|
|
|
|
|
|
|
class Menu
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
Menu(std::string shortDesc): mParent(NULL), mShortDesc(shortDesc) { return; }
|
|
|
|
virtual ~Menu();
|
|
|
|
|
|
|
|
void setParent(Menu *p) { mParent = p; }
|
|
|
|
Menu *parent() { return mParent; }
|
|
|
|
Menu *selectedMenu() { return mSelectedMenu; }
|
|
|
|
int addMenuItem(char key, Menu *child);
|
|
|
|
|
2012-08-09 13:45:05 +00:00
|
|
|
virtual void reset();
|
2012-08-07 23:55:43 +00:00
|
|
|
virtual uint32_t op() { return MENU_OP_SUBMENU; } /* what type is it? returns SUBMENU, INSTANT, NEEDINPUT */
|
|
|
|
virtual uint32_t process(char key);
|
|
|
|
|
|
|
|
// THE BIT STILL TO BE DEFINED!
|
|
|
|
|
|
|
|
std::string ShortFnDesc() { return mShortDesc; }// Menu Text (for Help).
|
2012-08-09 13:45:05 +00:00
|
|
|
virtual uint32_t drawPage(uint32_t drawFlags, std::string &buffer);
|
|
|
|
virtual uint32_t drawHelpPage(uint32_t drawFlags, std::string &buffer);
|
2012-08-07 23:55:43 +00:00
|
|
|
|
|
|
|
//virtual std::string menuText() = 0;
|
|
|
|
//virtual std::string menuHelp() = 0;
|
|
|
|
virtual void setOpMessage(std::string msg) { return; }
|
|
|
|
virtual void setErrorMessage(std::string msg) { return; }
|
|
|
|
virtual uint32_t showError() { return 1; } //= 0;
|
|
|
|
virtual uint32_t showHelp() { return 1; } //= 0;
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual uint32_t std_process(char key); /* for H/T/R/Q */
|
|
|
|
virtual uint32_t process_children(char key); /* check for children ops */
|
|
|
|
|
|
|
|
void setSelectedMenu(Menu *m) { mSelectedMenu = m; }
|
|
|
|
|
|
|
|
private:
|
|
|
|
Menu *mParent;
|
|
|
|
Menu *mSelectedMenu;
|
|
|
|
std::string mShortDesc;
|
|
|
|
std::map<uint8_t, Menu *> mChildren;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
/**********************************************************
|
|
|
|
* Generic MenuList... provides a list of KEYS, which
|
|
|
|
* can be iterated through.
|
|
|
|
*
|
|
|
|
* Maintains: List + Current + Next / Previous.
|
|
|
|
* Single Child, which is called for all.
|
|
|
|
*/
|
|
|
|
|
|
|
|
class MenuList: public Menu
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
MenuList(std::string shortDesc): Menu(shortDesc) { return; }
|
|
|
|
|
2012-08-09 13:45:05 +00:00
|
|
|
virtual void reset();
|
2012-08-07 23:55:43 +00:00
|
|
|
virtual uint32_t op();
|
|
|
|
virtual uint32_t process(char key);
|
|
|
|
|
|
|
|
// List Info.
|
|
|
|
uint32_t getListCount();
|
|
|
|
int getCurrentIdx(int &idx);
|
|
|
|
int getCurrentKey(std::string &key);
|
|
|
|
int getListEntry(int idx, std::string &key);
|
|
|
|
virtual int getEntryDesc(int idx, std::string &desc);
|
|
|
|
|
|
|
|
// Output.
|
2012-08-09 13:45:05 +00:00
|
|
|
virtual uint32_t drawPage(uint32_t drawFlags, std::string &buffer);
|
|
|
|
virtual uint32_t drawHelpPage(uint32_t drawFlags, std::string &buffer);
|
2012-08-07 23:55:43 +00:00
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual uint32_t list_process(char key);
|
|
|
|
|
|
|
|
int32_t mSelectIdx; /* -1 => none */
|
|
|
|
uint32_t mCursor; /* offset for list display */
|
|
|
|
std::list<std::string> mList;
|
|
|
|
|
|
|
|
private:
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MenuOpBasicKey: public Menu
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
MenuOpBasicKey(std::string shortDesc): Menu(shortDesc) { return; }
|
|
|
|
virtual uint32_t op();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual uint32_t op_basic(std::string key);
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class MenuOpTwoKeys: public Menu
|
|
|
|
{
|
|
|
|
|
|
|
|
public:
|
|
|
|
MenuOpTwoKeys(std::string shortDesc): Menu(shortDesc) { return; }
|
|
|
|
virtual uint32_t op();
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual uint32_t op_twokeys(std::string parentkey, std::string key);
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
/* Read input, line by line...
|
|
|
|
*/
|
|
|
|
|
|
|
|
class MenuOpLineInput: public Menu
|
|
|
|
{
|
|
|
|
|
|
|
|
public:
|
|
|
|
MenuOpLineInput(std::string shortDesc): Menu(shortDesc) { return; }
|
|
|
|
virtual uint32_t op();
|
|
|
|
virtual uint32_t process(char key);
|
|
|
|
|
|
|
|
protected:
|
|
|
|
virtual uint32_t process_lines(std::string input);
|
|
|
|
|
|
|
|
std::string mInput;
|
|
|
|
};
|
|
|
|
|
|
|
|
|
2012-08-20 14:59:41 +00:00
|
|
|
#if 0
|
2012-08-09 13:45:05 +00:00
|
|
|
class MenuInterface: public RsTermServer
|
2012-08-07 23:55:43 +00:00
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
2012-08-09 13:45:05 +00:00
|
|
|
MenuInterface(Menu *b, uint32_t drawFlags) :mCurrentMenu(b), mBase(b), mDrawFlags(drawFlags), mInputRequired(false) { return; }
|
|
|
|
uint32_t process(char key, uint32_t drawFlags, std::string &buffer);
|
|
|
|
uint32_t drawHeader(uint32_t drawFlags, std::string &buffer);
|
|
|
|
|
|
|
|
// RsTermServer Interface.
|
|
|
|
virtual void reset();
|
|
|
|
virtual int tick(bool haveInput, char keypress, std::string &output);
|
|
|
|
|
2012-08-07 23:55:43 +00:00
|
|
|
|
|
|
|
private:
|
|
|
|
Menu *mCurrentMenu;
|
|
|
|
Menu *mBase;
|
2012-08-09 13:45:05 +00:00
|
|
|
uint32_t mDrawFlags;
|
|
|
|
bool mInputRequired;
|
2012-08-07 23:55:43 +00:00
|
|
|
};
|
|
|
|
|
2012-08-20 14:59:41 +00:00
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
|
|
class MenuInterface: public RpcSystem
|
|
|
|
{
|
|
|
|
public:
|
|
|
|
|
|
|
|
MenuInterface(RpcComms *c, Menu *b, uint32_t drawFlags)
|
|
|
|
:mComms(c), mCurrentMenu(b), mBase(b), mDrawFlags(drawFlags), mInputRequired(false) { return; }
|
|
|
|
|
|
|
|
uint32_t process(char key, uint32_t drawFlags, std::string &buffer);
|
|
|
|
uint32_t drawHeader(uint32_t drawFlags, std::string &buffer);
|
|
|
|
|
|
|
|
// RsSystem Interface.
|
2012-09-01 19:35:23 +00:00
|
|
|
virtual void reset(uint32_t chan_id);
|
2012-08-20 14:59:41 +00:00
|
|
|
virtual int tick();
|
|
|
|
|
|
|
|
|
|
|
|
private:
|
|
|
|
RpcComms *mComms;
|
|
|
|
Menu *mCurrentMenu;
|
|
|
|
Menu *mBase;
|
|
|
|
uint32_t mDrawFlags;
|
|
|
|
bool mInputRequired;
|
|
|
|
time_t mUpdateTime;
|
|
|
|
};
|
|
|
|
|
2012-08-07 23:55:43 +00:00
|
|
|
|
|
|
|
#endif
|