2009-04-04

Linus - Xcode 1 - 0

Xcode är svårjobbat av en anledning: det envisas med att öppna varje källkodsfil i ett eget fönster. (Det finns sätt att ha flera filer i ett fönster och växla mellan dem, men inte på något vettigt sätt.) Om man har ett projekt med ett par tusen källkodsfiler och en djup katalogstruktur så funkar det inte att växla mellan filer genom att klicka på dem i projektvyn, och Exposé hjälper inte när man har 30 öppna fönster med vit bakgrund och svart text.

Kommer man från Visual Studio så kanske man tror att tabbar för källkodsfiler är en bra idé. Det är det, om man inte har flera än 8-10 stycken öppna, i så fall duger inte det heller. Det jag vill ha är en vertikal lista, sorterad i bokstavsordning, eftersom det skalar bättre.

Så jag gav mig på att skriva ett program som listar Xcodes öppna fönster, visar dem i en lista som hålls uppdaterad när man öppnar och stänger fönster, och där man kan visa ett fönster överst genom att klicka på dess namn i listan. Det var lite knepigare än vad jag hade trott, inte minst för att jag inte kan varken Objective-C, Cocoa eller Interface Builder. Men det gick att få till i alla fall, även om det är ett antal grejer i implementationen som är rätt märkliga. Såhär kan det se ut:



Vill man testa så finns källkoden här: http://www.puterman.se/lister-0.1.zip

För att få det att funka så måste man slå på möjligheten att pilla på programs UI:n utifrån, vilket man gör genom att gå in i System Preferences, till Universal Access och där kryssa i Enable access for assistive devices. Jag har inte en aning om varför det inte är påslaget som default, men så är det.

Saker som återstår att fixa:

  • Inställningar, t.ex. kanske man vill använda det här med andra program än Xcode.
  • Pollnings-intervall, det är just nu hårdkodat till 5 sekunder, d.v.s. det är så ofta fönsterlistan uppdateras. Det bästa vore givetvis om man kunde sätta en observer på appen man vill bevaka, men det är jag osäker på om det går.
  • Sökning i listan via textfält, så att man kan börja skriva namnet på fönstret man är ute efter.
  • Hitta på lite mindre märkliga lösningar i koden. Det borde gå att göra utan att embedda AppleScript, plocka events från listan via shouldSelectRow etc.


Men för tillfället är jag hyfsat nöjd. Nu ska jag ut i solen.

14 kommentarer:

Olof sa...

Det här är allt jag får säga, men: det är inte påslaget av default pga säkerhetsskäl.

Annars är jag rätt imponerad av ditt första program. Nu ska jag fundera på andra sätt att göra det på.

puterman sa...

Det är inte ofta jag får tillfälle att säga något i den här stilen, men here goes: API:erna i Symbian för att göra liknande saker är bättre och faktiskt dokumenterade.

wv: bartmove

Johan sa...

ÄNTLIGEN, som jag har längtat efter det här programmet.

kör det hela tide nu. ligger i dockan.

finns det ngt ställe att committa updateringar mot? jag tänkter mig ett flytande fönster som ligger överst HELA TIDEN!

Johan sa...

i "- (void)updateView" lade jag till
[NSApp arrangeInFront:nil];

does da trick, ploppar upp härligt var femte sekund men stjäler inte fokus!

puterman sa...

Kanske borde lägga upp det på sourceforge eller något, eller lista ut hur jag kan exponera min bazaar-setup utåt.

Det där med flytande fönster var lite klurigt. Din lösning gillas inte riktigt av mitt estetiska sinne, det skulle kännas mycket bättre om man kunde säga åt fönstret en gång för alla att ligga överst. På the internets så ser det ut som om att ett anrop till setLevel på ett NSWindow ska få denna effekt, men jag får det inte att funka.

Olof sa...

Puterman: prova att sätta leveln SKIT HÖGT (skratt, applåder). Då fungerar det.

Olof sa...

Skämt åsido:

Gör om fönstret till ett "Utility Window" så ligger det överst. I Interface Builder, klicka på Lister-fönstrets panel så att IB fattar att det är fönsterklassen du vill åt. Klicka sedan på i:et i inspector-fönstret (längst upp till höger) och byt klass till NSPanel. Byt därefter till "Attributes" (längst till vänster), och sätt där Style till Utility.

Normalt ligger de här utility-fönstren på en högre fönsternivå än resten, så det behöver inte sättas manuellt. De fall där det skulle kunna behövas är exempelvis om du vill ligga högre än andra eventuella utility-fönster, eller Dashboard-widgets som ligger högst.

puterman sa...

Det är precis den typen av information man vill ha i dokumentationen för NSPanel, NSWindow och setLevel. Fick man det dessutom i API-form så vore ens dag tillverkad.

Johan sa...

BVC fungerar inte så bra, jag försöker få en update men det blir inget nytt?

Johan sa...

kom på att du är i deutschneyland så jag fixade det själv med manuell tjecking

Olof sa...

Vad är BVC?

puterman why u can't check email in deutschland? is this your so-called "democracy" and "human rights"? u really bring west to shame, china have the right to develop and we will any way without your opium wars and forced "democracy"!!!

hjon sa...

Olof: BarnaVårdsCentralen. Äntligen fick jag ett ord med i laget, jävla datanördar.

wv: neintig

puterman sa...

Jag ska försöka hitta en lösning på alla jävla skit som har med konfigurationshantering att göra. Anledningen till att jag inte svarade på mail, bloggade, fejade, kommenterade på bloggar eller googlade när jag var i Tyskland var att jag inte satt framför en enda dator under hela resan.

Olof sa...

hjon: Skärmsläckare, är det ett ord eller två ord? :===)