pisdr windows drives support
git-svn-id: svn://db.shs.com.ru/pip@57 12ceb7fc-bf1f-11e4-8940-5bc7170c53b5
This commit is contained in:
@@ -41,6 +41,7 @@
|
||||
* */
|
||||
|
||||
bool PIKbdListener::exiting;
|
||||
PIKbdListener * PIKbdListener::_object = 0;
|
||||
|
||||
|
||||
#ifndef WINDOWS
|
||||
@@ -105,6 +106,7 @@ PRIVATE_DEFINITION_END(PIKbdListener)
|
||||
|
||||
PIKbdListener::PIKbdListener(KBFunc slot, void * _data): PIThread() {
|
||||
setName("keyboard_listener");
|
||||
_object = this;
|
||||
#ifdef WINDOWS
|
||||
PRIVATE->hIn = GetStdHandle(STD_INPUT_HANDLE);
|
||||
GetConsoleMode(PRIVATE->hIn, &PRIVATE->smode);
|
||||
@@ -140,7 +142,7 @@ void PIKbdListener::begin() {
|
||||
}
|
||||
|
||||
|
||||
void PIKbdListener::run() {
|
||||
void PIKbdListener::readKeyboard() {
|
||||
ke.key = 0;
|
||||
ke.modifiers = 0;
|
||||
memset(rc, 0, 8);
|
||||
|
||||
@@ -110,6 +110,7 @@ public:
|
||||
//! Returns exit key, default 'Q'
|
||||
char exitKey() const {return exit_key;}
|
||||
|
||||
void readKeyboard();
|
||||
|
||||
//! Returns if keyboard listening is active (not running!)
|
||||
bool isActive() {return is_active;}
|
||||
@@ -144,10 +145,11 @@ public:
|
||||
//! \}
|
||||
|
||||
static bool exiting;
|
||||
static PIKbdListener * instance() {return _object;}
|
||||
|
||||
private:
|
||||
void begin();
|
||||
void run();
|
||||
void run() {readKeyboard();}
|
||||
void end();
|
||||
|
||||
PRIVATE_DECLARATION
|
||||
@@ -163,6 +165,7 @@ private:
|
||||
void * data_;
|
||||
char rc[8];
|
||||
KeyEvent ke;
|
||||
static PIKbdListener * _object;
|
||||
|
||||
};
|
||||
|
||||
|
||||
@@ -77,9 +77,6 @@ public:
|
||||
//! \fn void waitForFinish()
|
||||
//! \brief block until finished (exit key will be pressed)
|
||||
|
||||
//! \fn void clearVariables(bool clearScreen = true)
|
||||
//! \brief Remove all columns at current tab and if "clearScreen" clear the screen
|
||||
|
||||
//! \fn void start(bool wait = false)
|
||||
//! \brief Start console output and if "wait" block until finished (exit key will be pressed)
|
||||
|
||||
@@ -93,6 +90,9 @@ public:
|
||||
//! \fn void keyPressed(PIKbdListener::KeyEvent key, void * data)
|
||||
//! \brief Raise on key "key" pressed, "data" is pointer to %PIConsole object
|
||||
|
||||
//! \fn void tileEvent(PIScreenTile * tile, PIScreenTypes::TileEvent e)
|
||||
//! \brief Raise on some event "e" from tile "tile"
|
||||
|
||||
//! \}
|
||||
|
||||
private:
|
||||
|
||||
@@ -53,6 +53,12 @@ TileSimple::TileSimple(const PIString & n): PIScreenTile(n) {
|
||||
}
|
||||
|
||||
|
||||
TileSimple::TileSimple(const TileSimple::Row & r): PIScreenTile() {
|
||||
alignment = Left;
|
||||
content << r;
|
||||
}
|
||||
|
||||
|
||||
void TileSimple::sizeHint(int & w, int & h) const {
|
||||
w = h = 0;
|
||||
piForeachC (Row & r, content)
|
||||
@@ -95,7 +101,7 @@ void TileList::sizeHint(int & w, int & h) const {
|
||||
|
||||
void TileList::drawEvent(PIScreenDrawer * d) {
|
||||
lhei = height - 2;
|
||||
int osp = piMini(3, lhei / 4);
|
||||
//int osp = piMini(3, lhei / 4);
|
||||
int is = piClampi(offset, 0, piMaxi(0, content.size_s() - 1)), ie = piClampi(offset + lhei, 0, content.size_s());
|
||||
if (is > 0) d->drawText(x, y, PIString(" /\\ ").repeat(width / 4), Green, Default, Bold);
|
||||
//piCout << is << ie << offset << lhei << content.size_s();
|
||||
@@ -428,3 +434,141 @@ bool TilePICout::keyEvent(PIKbdListener::KeyEvent key) {
|
||||
}
|
||||
return TileList::keyEvent(key);
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
TileInput::TileInput(const PIString & n): PIScreenTile(n) {
|
||||
focus_flags = CanHasFocus | NextByTab;
|
||||
back_format.color_back = White;
|
||||
format.color_char = Black;
|
||||
format.color_back = White;
|
||||
max_length = 1024;
|
||||
cur = offset = 0;
|
||||
inv = false;
|
||||
}
|
||||
|
||||
|
||||
void TileInput::sizeHint(int & w, int & h) const {
|
||||
w = 32;
|
||||
h = 1;
|
||||
}
|
||||
|
||||
|
||||
void TileInput::drawEvent(PIScreenDrawer * d) {
|
||||
PIString ps = text.mid(offset, width - 2);
|
||||
d->drawText(x + 1, y, ps, (Color)format.color_char, Transparent, (CharFlags)format.flags);
|
||||
if (offset > 0)
|
||||
d->drawText(x, y, "<", Green, Black, Bold);
|
||||
if (text.size_s() - offset >= width - 2)
|
||||
d->drawText(x + width - 1, y, ">", Green, Black, Bold);
|
||||
if (!has_focus) return;
|
||||
Color cb = (Color)format.color_char, cc = (Color)format.color_back;
|
||||
if (tm_blink.elapsed_m() >= 650) {
|
||||
tm_blink.reset();
|
||||
inv = !inv;
|
||||
}
|
||||
if (inv) piSwap(cb, cc);
|
||||
d->drawText(x + 1 + cur - offset, y, text.mid(cur, 1).expandLeftTo(1, ' '), cc, cb, (CharFlags)format.flags);
|
||||
}
|
||||
|
||||
|
||||
bool TileInput::keyEvent(PIKbdListener::KeyEvent key) {
|
||||
int lwid = piMaxi(0, width - 2);
|
||||
int oo(0), osp = piMini(3, lwid / 4);
|
||||
lwid--;
|
||||
switch (key.key) {
|
||||
case PIKbdListener::LeftArrow:
|
||||
cur--;
|
||||
oo--;
|
||||
if (key.modifiers[PIKbdListener::Ctrl]) {
|
||||
cur -= 4;
|
||||
oo -= 4;
|
||||
}
|
||||
if (cur < 0) cur = 0;
|
||||
if (cur - offset < osp) offset += oo;
|
||||
if (offset < 0) offset = 0;
|
||||
reserCursor();
|
||||
return true;
|
||||
case PIKbdListener::RightArrow:
|
||||
cur++;
|
||||
oo++;
|
||||
if (key.modifiers[PIKbdListener::Ctrl]) {
|
||||
cur += 4;
|
||||
oo += 4;
|
||||
}
|
||||
if (cur > text.size_s()) cur = text.size_s();
|
||||
if (cur - offset >= lwid - osp) offset += oo;
|
||||
if (offset >= text.size_s() - lwid) offset = text.size_s() - lwid;
|
||||
if (offset < 0) offset = 0;
|
||||
reserCursor();
|
||||
return true;
|
||||
case PIKbdListener::Home:
|
||||
cur = offset = 0;
|
||||
reserCursor();
|
||||
return true;
|
||||
case PIKbdListener::End:
|
||||
cur = text.size_s();
|
||||
offset = text.size_s() - lwid;
|
||||
if (offset < 0) offset = 0;
|
||||
reserCursor();
|
||||
return true;
|
||||
case PIKbdListener::Backspace:
|
||||
if (cur > text.size_s() || text.isEmpty())
|
||||
return true;
|
||||
text.remove(cur - 1, 1);
|
||||
cur--;
|
||||
if (cur > text.size_s()) cur = text.size_s();
|
||||
if (cur - offset >= lwid - osp) offset += oo;
|
||||
if (offset >= text.size_s() - lwid) offset = text.size_s() - lwid;
|
||||
if (offset < 0) offset = 0;
|
||||
reserCursor();
|
||||
return true;
|
||||
case PIKbdListener::Delete:
|
||||
if (cur >= text.size_s() || text.isEmpty())
|
||||
return true;
|
||||
text.remove(cur, 1);
|
||||
if (cur < 0) cur = 0;
|
||||
if (cur > text.size_s()) cur = text.size_s();
|
||||
if (cur - offset < osp) offset += oo;
|
||||
if (offset < 0) offset = 0;
|
||||
reserCursor();
|
||||
return true;
|
||||
case PIKbdListener::UpArrow:
|
||||
case PIKbdListener::DownArrow:
|
||||
case PIKbdListener::PageUp:
|
||||
case PIKbdListener::PageDown:
|
||||
case PIKbdListener::Insert:
|
||||
case PIKbdListener::Return:
|
||||
case PIKbdListener::Esc:
|
||||
case PIKbdListener::F1:
|
||||
case PIKbdListener::F2:
|
||||
case PIKbdListener::F3:
|
||||
case PIKbdListener::F4:
|
||||
case PIKbdListener::F5:
|
||||
case PIKbdListener::F6:
|
||||
case PIKbdListener::F7:
|
||||
case PIKbdListener::F8:
|
||||
case PIKbdListener::F9:
|
||||
case PIKbdListener::F10:
|
||||
case PIKbdListener::F11:
|
||||
case PIKbdListener::F12:
|
||||
break;
|
||||
default:
|
||||
text.insert(cur, PIChar(key.key));
|
||||
cur++;
|
||||
oo++;
|
||||
if (cur - offset >= lwid - osp) offset += oo;
|
||||
if (offset >= text.size_s() - lwid) offset = text.size_s() - lwid;
|
||||
if (offset < 0) offset = 0;
|
||||
reserCursor();
|
||||
return true;
|
||||
}
|
||||
return PIScreenTile::keyEvent(key);
|
||||
}
|
||||
|
||||
|
||||
void TileInput::reserCursor() {
|
||||
tm_blink.reset();
|
||||
inv = false;
|
||||
}
|
||||
|
||||
@@ -28,8 +28,9 @@
|
||||
|
||||
class PIP_EXPORT TileSimple: public PIScreenTile {
|
||||
public:
|
||||
TileSimple(const PIString & n = PIString());
|
||||
typedef PIPair<PIString, PIScreenTypes::CellFormat> Row;
|
||||
TileSimple(const PIString & n = PIString());
|
||||
TileSimple(const Row & r);
|
||||
PIVector<Row> content;
|
||||
PIScreenTypes::Alignment alignment;
|
||||
protected:
|
||||
@@ -148,4 +149,26 @@ protected:
|
||||
};
|
||||
|
||||
|
||||
|
||||
|
||||
class PIP_EXPORT TileInput: public PIScreenTile {
|
||||
public:
|
||||
TileInput(const PIString & n = PIString());
|
||||
/*enum EventType {
|
||||
EditFinished
|
||||
};*/
|
||||
PIScreenTypes::CellFormat format;
|
||||
PIString text;
|
||||
int max_length;
|
||||
protected:
|
||||
void sizeHint(int & w, int & h) const;
|
||||
void drawEvent(PIScreenDrawer * d);
|
||||
bool keyEvent(PIKbdListener::KeyEvent key);
|
||||
void reserCursor();
|
||||
int cur, offset;
|
||||
bool inv;
|
||||
PITimeMeasurer tm_blink;
|
||||
};
|
||||
|
||||
|
||||
#endif // PISCREENTILES_H
|
||||
|
||||
Reference in New Issue
Block a user