Commit 6faef31d authored by Roman Zippel's avatar Roman Zippel Committed by Linus Torvalds

[PATCH] add menuconfig support to the front ends

This adds the support for the menuconfig to the front ends.
qconf also has now an ".." entry to make it more obvious
how to get to a parent menu.
parent bbc115e9
...@@ -302,11 +302,8 @@ static void build_conf(struct menu *menu) ...@@ -302,11 +302,8 @@ static void build_conf(struct menu *menu)
cprint1("%s%*c%s", cprint1("%s%*c%s",
menu->data ? "-->" : "++>", menu->data ? "-->" : "++>",
indent + 1, ' ', prompt); indent + 1, ' ', prompt);
} else { } else
if (menu->parent != &rootmenu) cprint1(" %*c%s --->", indent + 1, ' ', prompt);
cprint1(" %*c", indent + 1, ' ');
cprint1("%s --->", prompt);
}
cprint_done(); cprint_done();
if (single_menu_mode && menu->data) if (single_menu_mode && menu->data)
...@@ -373,6 +370,11 @@ static void build_conf(struct menu *menu) ...@@ -373,6 +370,11 @@ static void build_conf(struct menu *menu)
} }
cprint_done(); cprint_done();
} else { } else {
if (menu == current_menu) {
cprint(":%p", menu);
cprint("---%*c%s", indent + 1, ' ', menu_get_prompt(menu));
goto conf_childs;
}
child_count++; child_count++;
val = sym_get_tristate_value(sym); val = sym_get_tristate_value(sym);
if (sym_is_choice_value(sym) && val == yes) { if (sym_is_choice_value(sym) && val == yes) {
...@@ -407,6 +409,11 @@ static void build_conf(struct menu *menu) ...@@ -407,6 +409,11 @@ static void build_conf(struct menu *menu)
} }
cprint1("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu), cprint1("%*c%s%s", indent + 1, ' ', menu_get_prompt(menu),
sym_has_value(sym) ? "" : " (NEW)"); sym_has_value(sym) ? "" : " (NEW)");
if (menu->prompt->type == P_MENU) {
cprint1(" --->");
cprint_done();
return;
}
cprint_done(); cprint_done();
} }
...@@ -445,9 +452,9 @@ static void conf(struct menu *menu) ...@@ -445,9 +452,9 @@ static void conf(struct menu *menu)
cprint(":"); cprint(":");
cprint("--- "); cprint("--- ");
cprint("L"); cprint("L");
cprint("Load an Alternate Configuration File"); cprint(" Load an Alternate Configuration File");
cprint("S"); cprint("S");
cprint("Save Configuration to an Alternate File"); cprint(" Save Configuration to an Alternate File");
} }
stat = exec_conf(); stat = exec_conf();
if (stat < 0) if (stat < 0)
...@@ -484,6 +491,8 @@ static void conf(struct menu *menu) ...@@ -484,6 +491,8 @@ static void conf(struct menu *menu)
case 't': case 't':
if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes) if (sym_is_choice(sym) && sym_get_tristate_value(sym) == yes)
conf_choice(submenu); conf_choice(submenu);
else if (submenu->prompt->type == P_MENU)
conf(submenu);
break; break;
case 's': case 's':
conf_string(submenu); conf_string(submenu);
......
...@@ -42,15 +42,12 @@ static QSettings *configSettings; ...@@ -42,15 +42,12 @@ static QSettings *configSettings;
* menu: entry to be updated * menu: entry to be updated
*/ */
template <class P> template <class P>
static void updateMenuList(P* parent, struct menu* menu) void ConfigList::updateMenuList(P* parent, struct menu* menu)
{ {
struct menu* child; struct menu* child;
ConfigList* list = parent->listView();
ConfigItem* item; ConfigItem* item;
ConfigItem* last; ConfigItem* last;
bool visible; bool visible;
bool showAll = list->showAll;
enum listMode mode = list->mode;
enum prop_type type; enum prop_type type;
if (!menu) { if (!menu) {
...@@ -59,6 +56,8 @@ static void updateMenuList(P* parent, struct menu* menu) ...@@ -59,6 +56,8 @@ static void updateMenuList(P* parent, struct menu* menu)
return; return;
} }
last = parent->firstChild();
if (last && !last->goParent)
last = 0; last = 0;
for (child = menu->list; child; child = child->next) { for (child = menu->list; child; child = child->next) {
item = last ? last->nextSibling() : parent->firstChild(); item = last ? last->nextSibling() : parent->firstChild();
...@@ -81,16 +80,8 @@ static void updateMenuList(P* parent, struct menu* menu) ...@@ -81,16 +80,8 @@ static void updateMenuList(P* parent, struct menu* menu)
if (showAll || visible) { if (showAll || visible) {
if (!item || item->menu != child) if (!item || item->menu != child)
item = new ConfigItem(parent, last, child, visible); item = new ConfigItem(parent, last, child, visible);
else { else
item->visible = visible; item->testUpdateMenu(visible);
if (item->updateNeeded()) {
ConfigItem* i = (ConfigItem*)child->data;
for (; i; i = i->nextItem) {
i->updateMenu();
}
} else if (list->updateAll)
item->updateMenu();
}
if (mode == fullMode || mode == menuMode || if (mode == fullMode || mode == menuMode ||
(type != P_MENU && type != P_ROOTMENU)) (type != P_MENU && type != P_ROOTMENU))
...@@ -131,24 +122,46 @@ void ConfigItem::updateMenu(void) ...@@ -131,24 +122,46 @@ void ConfigItem::updateMenu(void)
{ {
ConfigList* list; ConfigList* list;
struct symbol* sym; struct symbol* sym;
struct property *prop;
QString prompt; QString prompt;
int type; int type;
enum prop_type ptype;
tristate expr; tristate expr;
list = listView(); list = listView();
if (goParent) {
setPixmap(promptColIdx, list->menuBackPix);
prompt = "..";
goto set_prompt;
}
sym = menu->sym; sym = menu->sym;
if (!sym) { prop = menu->prompt;
setText(promptColIdx, menu_get_prompt(menu)); prompt = menu_get_prompt(menu);
ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
if ((ptype == P_ROOTMENU || ptype == P_MENU) && if (prop) switch (prop->type) {
(list->mode == singleMode || list->mode == symbolMode)) case P_MENU:
case P_ROOTMENU:
if (list->mode == singleMode || list->mode == symbolMode) {
/* a menuconfig entry is displayed differently
* depending whether it's at the view root or a child.
*/
if (sym && list->rootEntry == menu)
break;
setPixmap(promptColIdx, list->menuPix); setPixmap(promptColIdx, list->menuPix);
else } else {
if (sym)
break;
setPixmap(promptColIdx, 0); setPixmap(promptColIdx, 0);
return;
} }
goto set_prompt;
case P_COMMENT:
setPixmap(promptColIdx, 0);
goto set_prompt;
default:
;
}
if (!sym)
goto set_prompt;
setText(nameColIdx, sym->name); setText(nameColIdx, sym->name);
...@@ -158,7 +171,6 @@ void ConfigItem::updateMenu(void) ...@@ -158,7 +171,6 @@ void ConfigItem::updateMenu(void)
case S_TRISTATE: case S_TRISTATE:
char ch; char ch;
prompt = menu_get_prompt(menu);
if (!sym_is_changable(sym) && !list->showAll) { if (!sym_is_changable(sym) && !list->showAll) {
setText(noColIdx, 0); setText(noColIdx, 0);
setText(modColIdx, 0); setText(modColIdx, 0);
...@@ -211,26 +223,33 @@ void ConfigItem::updateMenu(void) ...@@ -211,26 +223,33 @@ void ConfigItem::updateMenu(void)
#endif #endif
setText(dataColIdx, data); setText(dataColIdx, data);
if (type == S_STRING) if (type == S_STRING)
prompt.sprintf("%s: %s", menu_get_prompt(menu), data); prompt.sprintf("%s: %s", prompt.latin1(), data);
else else
prompt.sprintf("(%s) %s", data, menu_get_prompt(menu)); prompt.sprintf("(%s) %s", data, prompt.latin1());
break; break;
} }
if (!sym_has_value(sym) && visible) if (!sym_has_value(sym) && visible)
prompt += " (NEW)"; prompt += " (NEW)";
set_prompt:
setText(promptColIdx, prompt); setText(promptColIdx, prompt);
} }
bool ConfigItem::updateNeeded(void) void ConfigItem::testUpdateMenu(bool v)
{ {
struct symbol* sym = menu->sym; ConfigItem* i;
if (sym)
sym_calc_value(sym); visible = v;
if (!menu)
return;
sym_calc_value(menu->sym);
if (menu->flags & MENU_CHANGED) { if (menu->flags & MENU_CHANGED) {
/* the menu entry changed, so update all list items */
menu->flags &= ~MENU_CHANGED; menu->flags &= ~MENU_CHANGED;
return true; for (i = (ConfigItem*)menu->data; i; i = i->nextItem)
} i->updateMenu();
return false; } else if (listView()->updateAll)
updateMenu();
} }
void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align) void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int width, int align)
...@@ -251,14 +270,15 @@ void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int w ...@@ -251,14 +270,15 @@ void ConfigItem::paintCell(QPainter* p, const QColorGroup& cg, int column, int w
*/ */
void ConfigItem::init(void) void ConfigItem::init(void)
{ {
if (menu) {
ConfigList* list = listView(); ConfigList* list = listView();
nextItem = (ConfigItem*)menu->data; nextItem = (ConfigItem*)menu->data;
menu->data = this; menu->data = this;
if (list->mode != fullMode) if (list->mode != fullMode)
setOpen(TRUE); setOpen(TRUE);
if (menu->sym)
sym_calc_value(menu->sym); sym_calc_value(menu->sym);
}
updateMenu(); updateMenu();
} }
...@@ -267,6 +287,7 @@ void ConfigItem::init(void) ...@@ -267,6 +287,7 @@ void ConfigItem::init(void)
*/ */
ConfigItem::~ConfigItem(void) ConfigItem::~ConfigItem(void)
{ {
if (menu) {
ConfigItem** ip = &(ConfigItem*)menu->data; ConfigItem** ip = &(ConfigItem*)menu->data;
for (; *ip; ip = &(*ip)->nextItem) { for (; *ip; ip = &(*ip)->nextItem) {
if (*ip == this) { if (*ip == this) {
...@@ -274,6 +295,7 @@ ConfigItem::~ConfigItem(void) ...@@ -274,6 +295,7 @@ ConfigItem::~ConfigItem(void)
break; break;
} }
} }
}
} }
void ConfigLineEdit::show(ConfigItem* i) void ConfigLineEdit::show(ConfigItem* i)
...@@ -310,7 +332,8 @@ ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv) ...@@ -310,7 +332,8 @@ ConfigList::ConfigList(ConfigView* p, ConfigMainWindow* cv)
: Parent(p), cview(cv), : Parent(p), cview(cv),
updateAll(false), updateAll(false),
symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no), symbolYesPix(xpm_symbol_yes), symbolModPix(xpm_symbol_mod), symbolNoPix(xpm_symbol_no),
choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no), menuPix(xpm_menu), menuInvPix(xpm_menu_inv), choiceYesPix(xpm_choice_yes), choiceNoPix(xpm_choice_no),
menuPix(xpm_menu), menuInvPix(xpm_menu_inv), menuBackPix(xpm_menuback),
showAll(false), showName(false), showRange(false), showData(false), showAll(false), showName(false), showRange(false), showData(false),
rootEntry(0) rootEntry(0)
{ {
...@@ -366,6 +389,8 @@ void ConfigList::updateSelection(void) ...@@ -366,6 +389,8 @@ void ConfigList::updateSelection(void)
cview->setHelp(item); cview->setHelp(item);
menu = item->menu; menu = item->menu;
if (!menu)
return;
type = menu->prompt ? menu->prompt->type : P_UNKNOWN; type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
if (mode == menuMode && (type == P_MENU || type == P_ROOTMENU)) if (mode == menuMode && (type == P_MENU || type == P_ROOTMENU))
emit menuSelected(menu); emit menuSelected(menu);
...@@ -373,7 +398,27 @@ void ConfigList::updateSelection(void) ...@@ -373,7 +398,27 @@ void ConfigList::updateSelection(void)
void ConfigList::updateList(ConfigItem* item) void ConfigList::updateList(ConfigItem* item)
{ {
(void)item; // unused so far ConfigItem* last = 0;
if (!rootEntry)
goto update;
if ((mode == singleMode || mode == symbolMode) && rootEntry != &rootmenu) {
item = firstChild();
if (!item)
item = new ConfigItem(this, 0, true);
last = item;
}
if (mode == singleMode && rootEntry->sym && rootEntry->prompt) {
item = last ? last->nextSibling() : firstChild();
if (!item)
item = new ConfigItem(this, last, rootEntry, true);
updateMenuList(item, rootEntry);
triggerUpdate();
return;
}
update:
updateMenuList(this, rootEntry); updateMenuList(this, rootEntry);
triggerUpdate(); triggerUpdate();
} }
...@@ -392,7 +437,7 @@ void ConfigList::setValue(ConfigItem* item, tristate val) ...@@ -392,7 +437,7 @@ void ConfigList::setValue(ConfigItem* item, tristate val)
int type; int type;
tristate oldval; tristate oldval;
sym = item->menu->sym; sym = item->menu ? item->menu->sym : 0;
if (!sym) if (!sym)
return; return;
...@@ -418,6 +463,8 @@ void ConfigList::changeValue(ConfigItem* item) ...@@ -418,6 +463,8 @@ void ConfigList::changeValue(ConfigItem* item)
int type, oldexpr, newexpr; int type, oldexpr, newexpr;
menu = item->menu; menu = item->menu;
if (!menu)
return;
sym = menu->sym; sym = menu->sym;
if (!sym) { if (!sym) {
if (item->menu->list) if (item->menu->list)
...@@ -511,7 +558,13 @@ void ConfigList::keyPressEvent(QKeyEvent* ev) ...@@ -511,7 +558,13 @@ void ConfigList::keyPressEvent(QKeyEvent* ev)
switch (ev->key()) { switch (ev->key()) {
case Key_Return: case Key_Return:
case Key_Enter: case Key_Enter:
if (item->goParent) {
emit parentSelected();
break;
}
menu = item->menu; menu = item->menu;
if (!menu)
break;
type = menu->prompt ? menu->prompt->type : P_UNKNOWN; type = menu->prompt ? menu->prompt->type : P_UNKNOWN;
if ((type == P_MENU || type == P_ROOTMENU) && mode != fullMode) { if ((type == P_MENU || type == P_ROOTMENU) && mode != fullMode) {
emit menuSelected(menu); emit menuSelected(menu);
...@@ -564,7 +617,11 @@ void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e) ...@@ -564,7 +617,11 @@ void ConfigList::contentsMouseReleaseEvent(QMouseEvent* e)
int off = header()->sectionPos(0) + itemMargin() + int off = header()->sectionPos(0) + itemMargin() +
treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0)); treeStepSize() * (item->depth() + (rootIsDecorated() ? 1 : 0));
if (x >= off && x < off + pm->width()) { if (x >= off && x < off + pm->width()) {
if (menu->sym) if (item->goParent)
emit parentSelected();
else if (!menu)
break;
else if (menu->sym)
changeValue(item); changeValue(item);
else else
emit menuSelected(menu); emit menuSelected(menu);
...@@ -606,7 +663,13 @@ void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e) ...@@ -606,7 +663,13 @@ void ConfigList::contentsMouseDoubleClickEvent(QMouseEvent* e)
if (!item) if (!item)
goto skip; goto skip;
if (item->goParent) {
emit parentSelected();
goto skip;
}
menu = item->menu; menu = item->menu;
if (!menu)
goto skip;
ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN; ptype = menu->prompt ? menu->prompt->type : P_UNKNOWN;
if ((ptype == P_ROOTMENU || ptype == P_MENU) && if ((ptype == P_ROOTMENU || ptype == P_MENU) &&
(mode == singleMode || mode == symbolMode)) (mode == singleMode || mode == symbolMode))
...@@ -677,7 +740,6 @@ void ConfigView::updateListAll(void) ...@@ -677,7 +740,6 @@ void ConfigView::updateListAll(void)
*/ */
ConfigMainWindow::ConfigMainWindow(void) ConfigMainWindow::ConfigMainWindow(void)
{ {
ConfigView* view;
QMenuBar* menu; QMenuBar* menu;
QSplitter* split1; QSplitter* split1;
QSplitter* split2; QSplitter* split2;
...@@ -707,15 +769,15 @@ ConfigMainWindow::ConfigMainWindow(void) ...@@ -707,15 +769,15 @@ ConfigMainWindow::ConfigMainWindow(void)
split1->setOrientation(QSplitter::Horizontal); split1->setOrientation(QSplitter::Horizontal);
setCentralWidget(split1); setCentralWidget(split1);
view = new ConfigView(split1, this); menuView = new ConfigView(split1, this);
menuList = view->list; menuList = menuView->list;
split2 = new QSplitter(split1); split2 = new QSplitter(split1);
split2->setOrientation(QSplitter::Vertical); split2->setOrientation(QSplitter::Vertical);
// create config tree // create config tree
view = new ConfigView(split2, this); configView = new ConfigView(split2, this);
configList = view->list; configList = configView->list;
helpText = new QTextView(split2); helpText = new QTextView(split2);
helpText->setTextFormat(Qt::RichText); helpText->setTextFormat(Qt::RichText);
...@@ -864,10 +926,16 @@ static void expr_print_help(void *data, const char *str) ...@@ -864,10 +926,16 @@ static void expr_print_help(void *data, const char *str)
void ConfigMainWindow::setHelp(QListViewItem* item) void ConfigMainWindow::setHelp(QListViewItem* item)
{ {
struct symbol* sym; struct symbol* sym;
struct menu* menu; struct menu* menu = 0;
configList->parent()->lineEdit->hide(); configList->parent()->lineEdit->hide();
if (item) { if (item)
menu = ((ConfigItem*)item)->menu;
if (!menu) {
helpText->setText(NULL);
return;
}
QString head, debug, help; QString head, debug, help;
menu = ((ConfigItem*)item)->menu; menu = ((ConfigItem*)item)->menu;
sym = menu->sym; sym = menu->sym;
...@@ -906,12 +974,7 @@ void ConfigMainWindow::setHelp(QListViewItem* item) ...@@ -906,12 +974,7 @@ void ConfigMainWindow::setHelp(QListViewItem* item)
break; break;
case P_DEFAULT: case P_DEFAULT:
debug += "default: "; debug += "default: ";
if (sym_is_choice(sym))
debug += print_filter(prop->def->name); debug += print_filter(prop->def->name);
else {
sym_calc_value(prop->def);
debug += print_filter(sym_get_string_value(prop->def));
}
debug += "<br>"; debug += "<br>";
if (prop->visible.expr) { if (prop->visible.expr) {
debug += "&nbsp;&nbsp;dep: "; debug += "&nbsp;&nbsp;dep: ";
...@@ -944,9 +1007,6 @@ void ConfigMainWindow::setHelp(QListViewItem* item) ...@@ -944,9 +1007,6 @@ void ConfigMainWindow::setHelp(QListViewItem* item)
} }
} }
helpText->setText(head + debug + help); helpText->setText(head + debug + help);
return;
}
helpText->setText(NULL);
} }
void ConfigMainWindow::loadConfig(void) void ConfigMainWindow::loadConfig(void)
...@@ -1010,7 +1070,7 @@ void ConfigMainWindow::goBack(void) ...@@ -1010,7 +1070,7 @@ void ConfigMainWindow::goBack(void)
void ConfigMainWindow::showSingleView(void) void ConfigMainWindow::showSingleView(void)
{ {
menuList->hide(); menuView->hide();
menuList->setRootMenu(0); menuList->setRootMenu(0);
configList->mode = singleMode; configList->mode = singleMode;
if (configList->rootEntry == &rootmenu) if (configList->rootEntry == &rootmenu)
...@@ -1032,14 +1092,14 @@ void ConfigMainWindow::showSplitView(void) ...@@ -1032,14 +1092,14 @@ void ConfigMainWindow::showSplitView(void)
configApp->processEvents(); configApp->processEvents();
menuList->mode = menuMode; menuList->mode = menuMode;
menuList->setRootMenu(&rootmenu); menuList->setRootMenu(&rootmenu);
menuList->show();
menuList->setAllOpen(TRUE); menuList->setAllOpen(TRUE);
menuView->show();
menuList->setFocus(); menuList->setFocus();
} }
void ConfigMainWindow::showFullView(void) void ConfigMainWindow::showFullView(void)
{ {
menuList->hide(); menuView->hide();
menuList->setRootMenu(0); menuList->setRootMenu(0);
configList->mode = fullMode; configList->mode = fullMode;
if (configList->rootEntry == &rootmenu) if (configList->rootEntry == &rootmenu)
......
...@@ -101,10 +101,14 @@ public slots: ...@@ -101,10 +101,14 @@ public slots:
void setAllOpen(bool open); void setAllOpen(bool open);
void setParentMenu(void); void setParentMenu(void);
template <class P>
void ConfigList::updateMenuList(P*, struct menu*);
bool updateAll; bool updateAll;
QPixmap symbolYesPix, symbolModPix, symbolNoPix; QPixmap symbolYesPix, symbolModPix, symbolNoPix;
QPixmap choiceYesPix, choiceNoPix, menuPix, menuInvPix; QPixmap choiceYesPix, choiceNoPix;
QPixmap menuPix, menuInvPix, menuBackPix;
bool showAll, showName, showRange, showData; bool showAll, showName, showRange, showData;
enum listMode mode; enum listMode mode;
...@@ -121,12 +125,17 @@ class ConfigItem : public QListViewItem { ...@@ -121,12 +125,17 @@ class ConfigItem : public QListViewItem {
typedef class QListViewItem Parent; typedef class QListViewItem Parent;
public: public:
ConfigItem(QListView *parent, ConfigItem *after, struct menu *m, bool v) ConfigItem(QListView *parent, ConfigItem *after, struct menu *m, bool v)
: Parent(parent, after), menu(m), visible(v) : Parent(parent, after), menu(m), visible(v), goParent(false)
{ {
init(); init();
} }
ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v) ConfigItem(ConfigItem *parent, ConfigItem *after, struct menu *m, bool v)
: Parent(parent, after), menu(m), visible(v) : Parent(parent, after), menu(m), visible(v), goParent(false)
{
init();
}
ConfigItem(QListView *parent, ConfigItem *after, bool v)
: Parent(parent, after), menu(0), visible(v), goParent(true)
{ {
init(); init();
} }
...@@ -136,7 +145,7 @@ class ConfigItem : public QListViewItem { ...@@ -136,7 +145,7 @@ class ConfigItem : public QListViewItem {
void okRename(int col); void okRename(int col);
#endif #endif
void updateMenu(void); void updateMenu(void);
bool updateNeeded(void); void testUpdateMenu(bool v);
ConfigList* listView() const ConfigList* listView() const
{ {
return (ConfigList*)Parent::listView(); return (ConfigList*)Parent::listView();
...@@ -170,6 +179,7 @@ class ConfigItem : public QListViewItem { ...@@ -170,6 +179,7 @@ class ConfigItem : public QListViewItem {
ConfigItem* nextItem; ConfigItem* nextItem;
struct menu *menu; struct menu *menu;
bool visible; bool visible;
bool goParent;
}; };
class ConfigLineEdit : public QLineEdit { class ConfigLineEdit : public QLineEdit {
...@@ -216,7 +226,9 @@ public slots: ...@@ -216,7 +226,9 @@ public slots:
protected: protected:
void closeEvent(QCloseEvent *e); void closeEvent(QCloseEvent *e);
ConfigView *menuView;
ConfigList *menuList; ConfigList *menuList;
ConfigView *configView;
ConfigList *configList; ConfigList *configList;
QTextView *helpText; QTextView *helpText;
QToolBar *toolBar; QToolBar *toolBar;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment