Kevin Kofler (./39) :
GoldenCrystal (./38) :
(Je saute d'un switch à un autre. )
Ça c'est carrément dégueu.
Bah, ça évite soit 2 énormes copiers-collers de blocs entiers, soit si je distribue le if à l'intérieur du switch, un copier-coller du if 9 fois.
C'est pas l'impression que j'en ai… Change l'architecture de ton code et il y aura moins de code:
BOOL newFlagThatICreated;
if ((newFlagThatICreated = CURRENT_VIEW && CURRENT_VIEW->hasFocus()) || index >= 6) {
switch (index) {
case 0: editUndo(); break;
case 1: editRedo(); break;
case 2: editCut(); break;
case 3: editCopy(); break;
case 4: editPaste(); break;
case 5: // F1 context help
{
int line,col,i;
CURRENT_VIEW->cursorPosition().position(line,col);
QString textLine=CURRENT_VIEW->document()->line(line);
QString wordUnderCursor;
for (i=col-1;i>=0;i--) {
QChar c=textLine[i];
if ((c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='0' && c<='9')
|| c=='_' || c=='$' || c=='#')
wordUnderCursor.prepend(c);
}
int len=textLine.length();
for (i=col;i<len;i++) {
QChar c=textLine[i];
if ((c>='A' && c<='Z') || (c>='a' && c<='z') || (c>='0' && c<='9')
|| c=='_' || c=='$' || c=='#')
wordUnderCursor.append(c);
}
// always open at least the index
force_qt_assistant_page(1);
assistant->openAssistant();
if (wordUnderCursor.isEmpty()) return;
QString docFile=lookup_doc_keyword(wordUnderCursor);
if (docFile.isEmpty()) return;
// wait for Qt Assistant to actually open
while (!assistant->isOpen())
QCoreApplication::processEvents(QEventLoop::ExcludeUserInput,1000);
assistant->showPage(QString(tigcc_base)+QString("/doc/html/")+docFile);
break;
}
case 6:
case 7:
if (newFlagThatICreated) {
// keyReturn is not in any interface, but it's a public slot...
CURRENT_VIEW->qt_metacall(QMetaObject::InvokeMetaMethod,
CURRENT_VIEW->metaObject()->indexOfMethod("keyReturn()"),NULL);
current_view_newLineHook();
} else {
QKeyEvent *keyEvent=new QKeyEvent(QEvent::KeyPress,Qt::Key_Return,'\n',0,"\n");
QApplication::postEvent(focusWidget(),keyEvent);
}
break;
case 8:
if (newFlagThatICreated) { new TemplatePopup(CURRENT_VIEW); }
break;
case 9:
case 10:
if (newFlagThatICreated && IS_FILE(currentListItem)
&& CURRENT_VIEW==static_cast<ListViewFile *>(currentListItem)->kateView) {
QString fileText=CURRENT_VIEW->document()->text();
CATEGORY_OF(category,currentListItem);
// Completion only operates on C files.
if (category==cFilesListItem || category==qllFilesListItem
|| (category==hFilesListItem && !fileText.isEmpty()
&& fileText[0]!='|' && fileText[0]!=';')) {
// Disable newLineHook.
shortcuts[6]->setEnabled(FALSE);
shortcuts[7]->setEnabled(FALSE);
new CompletionPopup(CURRENT_VIEW,pathInProject(currentListItem),this,this);
}
}
break;
case 11: // next file
case 12:
{
Q3ListViewItem *item=currentListItem;
if (!item) item=rootListItem;
Q3ListViewItem *origItem=item;
do {
item=item->itemBelow();
if (!item) item=rootListItem;
if (item==origItem) return; // no suitable items to select
} while (item==rootListItem || IS_CATEGORY(item));
fileTreeClicked(item);
if (CURRENT_VIEW) CURRENT_VIEW->setFocus();
break;
}
case 13: // switch transfer target
case 14:
{
preferences.linkTarget=(preferences.linkTarget==LT_TIEMU)?LT_REALCALC:LT_TIEMU;
savePreferences();
// Apply the preferences to the debug menu.
debugPauseAction->setEnabled(!compiling&&preferences.linkTarget==LT_TIEMU);
debugResetAction->setEnabled(!compiling&&preferences.linkTarget==LT_TIEMU);
bool runnable=!settings.archive&&!settings.flash_os&&preferences.linkTarget!=LT_NONE;
menuBar()->setItemVisible(5,runnable); //debugMenu
debugRunAction->setVisible(runnable);
debugPauseAction->setVisible(runnable);
break;
}
case 15: projectCompile(); break;
case 16: projectMake(); break;
default: break;
}
}
À moins que j'aie zappé un truc, ça doit fonctionner…
(C'est juste un refactoring léger parce que j'ai pas que ça à foutre, mais y'a moyen de faire carrément mieux… Par exemple une fonction pour chaque cas réellement différent, ça peut être pas mal
)